segmented.scss 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. @use 'sass:map';
  2. @use 'mixins/mixins' as *;
  3. @use 'mixins/utils' as *;
  4. @use 'mixins/var' as *;
  5. @use 'common/var' as *;
  6. $segmented-border-radius: () !default;
  7. $segmented-border-radius: map.merge(
  8. (
  9. 'large': map.get($button-border-radius, 'large'),
  10. 'default': map.get($button-border-radius, 'default'),
  11. 'small': map.get($button-border-radius, 'small'),
  12. ),
  13. $segmented-border-radius
  14. );
  15. $segmented-font-size: () !default;
  16. $segmented-font-size: map.merge(
  17. (
  18. 'large': 16px,
  19. 'default': 14px,
  20. 'small': 14px,
  21. ),
  22. $segmented-font-size
  23. );
  24. $segmented-item-padding: () !default;
  25. $segmented-item-padding: map.merge(
  26. (
  27. 'large': 0 11px,
  28. 'default': 0 11px,
  29. 'small': 0 7px,
  30. ),
  31. $segmented-item-padding
  32. );
  33. @include b(segmented) {
  34. @include set-component-css-var('segmented', $segmented);
  35. }
  36. @include b(segmented) {
  37. display: inline-flex;
  38. align-items: stretch;
  39. min-height: map.get($input-height, 'default');
  40. background: getCssVar('segmented-bg-color');
  41. padding: getCssVar('segmented-padding');
  42. border-radius: map.get($segmented-border-radius, 'default');
  43. font-size: map.get($segmented-font-size, 'default');
  44. color: getCssVar('segmented-color');
  45. box-sizing: border-box;
  46. @include e(group) {
  47. display: flex;
  48. align-items: stretch;
  49. position: relative;
  50. width: 100%;
  51. }
  52. @include e(item-selected) {
  53. position: absolute;
  54. top: 0;
  55. left: 0;
  56. background: getCssVar('segmented-item-selected-bg-color');
  57. height: 100%;
  58. width: 10px;
  59. border-radius: calc(#{map.get($segmented-border-radius, 'default')} - 2px);
  60. transition: all 0.3s;
  61. pointer-events: none;
  62. @include when(disabled) {
  63. background: getCssVar('segmented-item-selected-disabled-bg-color');
  64. }
  65. @include when(focus-visible) {
  66. &:before {
  67. position: absolute;
  68. content: '';
  69. inset: 0;
  70. border-radius: inherit;
  71. outline: 2px solid getCssVar('segmented-item-selected-bg-color');
  72. outline-offset: 1px;
  73. }
  74. }
  75. }
  76. @include e(item) {
  77. display: flex;
  78. align-items: center;
  79. flex: 1;
  80. cursor: pointer;
  81. border-radius: calc(#{map.get($segmented-border-radius, 'default')} - 2px);
  82. padding: map.get($segmented-item-padding, 'default');
  83. &:not(.is-disabled):not(.is-selected):hover {
  84. color: getCssVar('segmented-item-hover-color');
  85. background: getCssVar('segmented-item-hover-bg-color');
  86. }
  87. &:not(.is-disabled):not(.is-selected):active {
  88. background: getCssVar('segmented-item-active-bg-color');
  89. }
  90. @include when(selected) {
  91. color: getCssVar('segmented-item-selected-color');
  92. &.is-disabled {
  93. color: getCssVar('segmented-item-selected-color');
  94. }
  95. }
  96. @include when(disabled) {
  97. cursor: not-allowed;
  98. color: getCssVar('segmented-item-disabled-color');
  99. }
  100. }
  101. @include e(item-input) {
  102. position: absolute;
  103. margin: 0;
  104. width: 0;
  105. height: 0;
  106. opacity: 0;
  107. pointer-events: none;
  108. }
  109. @include e(item-label) {
  110. flex: 1;
  111. text-align: center;
  112. line-height: normal;
  113. @include utils-ellipsis;
  114. transition: color 0.3s;
  115. z-index: 1;
  116. }
  117. @include when(block) {
  118. display: flex;
  119. .#{$namespace}-segmented__item {
  120. min-width: 0;
  121. }
  122. }
  123. @each $size in (large, small) {
  124. @include m($size) {
  125. min-height: map.get($input-height, $size);
  126. border-radius: map.get($segmented-border-radius, $size);
  127. font-size: map.get($segmented-font-size, $size);
  128. @include e(item-selected) {
  129. border-radius: calc(#{map.get($segmented-border-radius, $size)} - 2px);
  130. }
  131. @include e(item) {
  132. border-radius: calc(#{map.get($segmented-border-radius, $size)} - 2px);
  133. padding: map.get($segmented-item-padding, $size);
  134. }
  135. }
  136. }
  137. }