@auronui/styles 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/DATA_ATTRIBUTES.md +163 -0
  2. package/LICENSE +21 -0
  3. package/README.md +54 -0
  4. package/base/base.css +40 -0
  5. package/components/accordion.css +201 -0
  6. package/components/alert-dialog.css +307 -0
  7. package/components/alert.css +143 -0
  8. package/components/aspect-ratio.css +8 -0
  9. package/components/autocomplete.css +685 -0
  10. package/components/avatar.css +78 -0
  11. package/components/badge.css +186 -0
  12. package/components/breadcrumbs.css +76 -0
  13. package/components/button-group.css +126 -0
  14. package/components/button.css +282 -0
  15. package/components/calendar-year-picker.css +193 -0
  16. package/components/calendar.css +332 -0
  17. package/components/card.css +225 -0
  18. package/components/checkbox-group.css +7 -0
  19. package/components/checkbox.css +268 -0
  20. package/components/chip.css +227 -0
  21. package/components/close-button.css +65 -0
  22. package/components/collapsible-group.css +7 -0
  23. package/components/collapsible.css +74 -0
  24. package/components/color-area.css +81 -0
  25. package/components/color-field.css +99 -0
  26. package/components/color-input-group.css +153 -0
  27. package/components/color-picker.css +121 -0
  28. package/components/color-slider.css +266 -0
  29. package/components/color-swatch-picker.css +247 -0
  30. package/components/color-swatch.css +42 -0
  31. package/components/combo-box.css +203 -0
  32. package/components/date-input-group.css +125 -0
  33. package/components/date-input.css +529 -0
  34. package/components/date-picker.css +86 -0
  35. package/components/date-range-field.css +538 -0
  36. package/components/date-range-picker.css +93 -0
  37. package/components/description.css +4 -0
  38. package/components/drawer.css +222 -0
  39. package/components/dropdown.css +67 -0
  40. package/components/empty-state.css +4 -0
  41. package/components/error-message.css +13 -0
  42. package/components/field-error.css +19 -0
  43. package/components/fieldset.css +39 -0
  44. package/components/header.css +7 -0
  45. package/components/index.css +164 -0
  46. package/components/input-otp.css +124 -0
  47. package/components/input.css +603 -0
  48. package/components/kbd.css +27 -0
  49. package/components/label.css +28 -0
  50. package/components/link.css +144 -0
  51. package/components/list-box-item.css +29 -0
  52. package/components/list-box-section.css +13 -0
  53. package/components/list-box.css +11 -0
  54. package/components/menu-item.css +68 -0
  55. package/components/menu-section.css +18 -0
  56. package/components/menu.css +7 -0
  57. package/components/meter.css +104 -0
  58. package/components/modal.css +335 -0
  59. package/components/number-field.css +395 -0
  60. package/components/pagination.css +157 -0
  61. package/components/popover.css +96 -0
  62. package/components/progress-bar.css +126 -0
  63. package/components/progress-circle.css +82 -0
  64. package/components/radio-group.css +47 -0
  65. package/components/radio.css +157 -0
  66. package/components/range-calendar.css +402 -0
  67. package/components/scroll-area.css +70 -0
  68. package/components/scroll-shadow.css +77 -0
  69. package/components/select.css +649 -0
  70. package/components/separator.css +59 -0
  71. package/components/skeleton.css +48 -0
  72. package/components/slider.css +155 -0
  73. package/components/spinner.css +42 -0
  74. package/components/splitter.css +74 -0
  75. package/components/stepper.css +160 -0
  76. package/components/surface.css +23 -0
  77. package/components/switch-group.css +17 -0
  78. package/components/switch.css +194 -0
  79. package/components/table.css +341 -0
  80. package/components/tabs.css +262 -0
  81. package/components/tag-group.css +66 -0
  82. package/components/tag.css +99 -0
  83. package/components/textarea.css +536 -0
  84. package/components/time-field.css +530 -0
  85. package/components/toast.css +267 -0
  86. package/components/toggle-button-group.css +174 -0
  87. package/components/toggle-button.css +149 -0
  88. package/components/toolbar.css +32 -0
  89. package/components/tooltip.css +47 -0
  90. package/components/tree.css +81 -0
  91. package/index.css +29 -0
  92. package/package.json +415 -0
  93. package/src/components/accordion/accordion.styles.ts +46 -0
  94. package/src/components/accordion/index.ts +1 -0
  95. package/src/components/alert/alert.styles.ts +37 -0
  96. package/src/components/alert/index.ts +1 -0
  97. package/src/components/alert-dialog/alert-dialog.styles.ts +72 -0
  98. package/src/components/alert-dialog/index.ts +1 -0
  99. package/src/components/aspect-ratio/aspect-ratio.styles.ts +10 -0
  100. package/src/components/aspect-ratio/index.ts +1 -0
  101. package/src/components/autocomplete/autocomplete.styles.ts +86 -0
  102. package/src/components/autocomplete/index.ts +1 -0
  103. package/src/components/avatar/avatar.styles.ts +53 -0
  104. package/src/components/avatar/index.ts +1 -0
  105. package/src/components/badge/badge.styles.ts +77 -0
  106. package/src/components/badge/index.ts +1 -0
  107. package/src/components/breadcrumbs/breadcrumbs.styles.ts +14 -0
  108. package/src/components/breadcrumbs/index.ts +1 -0
  109. package/src/components/button/__tests__/button.styles.test.ts +79 -0
  110. package/src/components/button/button.styles.ts +65 -0
  111. package/src/components/button/index.ts +1 -0
  112. package/src/components/button-group/button-group.styles.ts +32 -0
  113. package/src/components/button-group/index.ts +1 -0
  114. package/src/components/calendar/calendar.styles.ts +60 -0
  115. package/src/components/calendar/index.ts +1 -0
  116. package/src/components/calendar-year-picker/calendar-year-picker.styles.ts +15 -0
  117. package/src/components/calendar-year-picker/index.ts +1 -0
  118. package/src/components/card/card.styles.ts +65 -0
  119. package/src/components/card/index.ts +1 -0
  120. package/src/components/checkbox/checkbox.styles.ts +27 -0
  121. package/src/components/checkbox/index.ts +1 -0
  122. package/src/components/checkbox-group/checkbox-group.styles.ts +18 -0
  123. package/src/components/checkbox-group/index.ts +1 -0
  124. package/src/components/chip/chip.styles.ts +65 -0
  125. package/src/components/chip/index.ts +1 -0
  126. package/src/components/close-button/close-button.styles.ts +17 -0
  127. package/src/components/close-button/index.ts +1 -0
  128. package/src/components/collapsible/collapsible.styles.ts +25 -0
  129. package/src/components/collapsible/index.ts +1 -0
  130. package/src/components/collapsible-group/collapsible-group.styles.ts +13 -0
  131. package/src/components/collapsible-group/index.ts +1 -0
  132. package/src/components/color-area/color-area.styles.ts +23 -0
  133. package/src/components/color-area/index.ts +1 -0
  134. package/src/components/color-field/color-field.styles.ts +18 -0
  135. package/src/components/color-field/index.ts +1 -0
  136. package/src/components/color-input-group/color-input-group.styles.ts +34 -0
  137. package/src/components/color-input-group/index.ts +1 -0
  138. package/src/components/color-picker/color-picker.styles.ts +13 -0
  139. package/src/components/color-picker/index.ts +1 -0
  140. package/src/components/color-slider/color-slider.styles.ts +14 -0
  141. package/src/components/color-slider/index.ts +1 -0
  142. package/src/components/color-swatch/color-swatch.styles.ts +26 -0
  143. package/src/components/color-swatch/index.ts +1 -0
  144. package/src/components/color-swatch-picker/color-swatch-picker.styles.ts +54 -0
  145. package/src/components/color-swatch-picker/index.ts +1 -0
  146. package/src/components/combo-box/combo-box.styles.ts +26 -0
  147. package/src/components/combo-box/index.ts +1 -0
  148. package/src/components/date-input/date-input.styles.ts +86 -0
  149. package/src/components/date-input/index.ts +1 -0
  150. package/src/components/date-picker/date-picker.styles.ts +14 -0
  151. package/src/components/date-picker/index.ts +1 -0
  152. package/src/components/date-range-field/date-range-field.styles.ts +87 -0
  153. package/src/components/date-range-field/index.ts +1 -0
  154. package/src/components/date-range-picker/date-range-picker.styles.ts +14 -0
  155. package/src/components/date-range-picker/index.ts +1 -0
  156. package/src/components/description/description.styles.ts +9 -0
  157. package/src/components/description/index.ts +1 -0
  158. package/src/components/drawer/drawer.styles.ts +55 -0
  159. package/src/components/drawer/index.ts +1 -0
  160. package/src/components/dropdown/dropdown.styles.ts +14 -0
  161. package/src/components/dropdown/index.ts +1 -0
  162. package/src/components/empty-state/empty-state.styles.ts +9 -0
  163. package/src/components/empty-state/index.ts +1 -0
  164. package/src/components/error-message/error-message.styles.ts +9 -0
  165. package/src/components/error-message/index.ts +1 -0
  166. package/src/components/fieldset/fieldset.styles.ts +29 -0
  167. package/src/components/fieldset/index.ts +1 -0
  168. package/src/components/header/header.styles.ts +5 -0
  169. package/src/components/header/index.ts +1 -0
  170. package/src/components/index.ts +84 -0
  171. package/src/components/input/index.ts +1 -0
  172. package/src/components/input/input.styles.ts +87 -0
  173. package/src/components/input-otp/index.ts +1 -0
  174. package/src/components/input-otp/input-otp.styles.ts +30 -0
  175. package/src/components/kbd/index.ts +1 -0
  176. package/src/components/kbd/kbd.styles.ts +20 -0
  177. package/src/components/label/index.ts +1 -0
  178. package/src/components/label/label.styles.ts +25 -0
  179. package/src/components/link/index.ts +1 -0
  180. package/src/components/link/link.styles.ts +38 -0
  181. package/src/components/list-box/index.ts +1 -0
  182. package/src/components/list-box/list-box.styles.ts +18 -0
  183. package/src/components/list-box-item/index.ts +1 -0
  184. package/src/components/list-box-item/list-box-item.styles.ts +25 -0
  185. package/src/components/list-box-section/index.ts +1 -0
  186. package/src/components/list-box-section/list-box-section.styles.ts +13 -0
  187. package/src/components/menu/index.ts +1 -0
  188. package/src/components/menu/menu.styles.ts +9 -0
  189. package/src/components/menu-item/index.ts +1 -0
  190. package/src/components/menu-item/menu-item.styles.ts +26 -0
  191. package/src/components/menu-section/index.ts +1 -0
  192. package/src/components/menu-section/menu-section.styles.ts +14 -0
  193. package/src/components/meter/index.ts +1 -0
  194. package/src/components/meter/meter.styles.ts +48 -0
  195. package/src/components/modal/index.ts +1 -0
  196. package/src/components/modal/modal.styles.ts +70 -0
  197. package/src/components/number-field/index.ts +1 -0
  198. package/src/components/number-field/number-field.styles.ts +80 -0
  199. package/src/components/pagination/index.ts +1 -0
  200. package/src/components/pagination/pagination.styles.ts +32 -0
  201. package/src/components/popover/index.ts +1 -0
  202. package/src/components/popover/popover.styles.ts +14 -0
  203. package/src/components/progress-bar/index.ts +1 -0
  204. package/src/components/progress-bar/progress-bar.styles.ts +97 -0
  205. package/src/components/progress-circle/index.ts +1 -0
  206. package/src/components/progress-circle/progress-circle.styles.ts +74 -0
  207. package/src/components/radio/index.ts +1 -0
  208. package/src/components/radio/radio.styles.ts +14 -0
  209. package/src/components/radio-group/index.ts +1 -0
  210. package/src/components/radio-group/radio-group.styles.ts +18 -0
  211. package/src/components/range-calendar/index.ts +1 -0
  212. package/src/components/range-calendar/range-calendar.styles.ts +60 -0
  213. package/src/components/scroll-shadow/index.ts +1 -0
  214. package/src/components/scroll-shadow/scroll-shadow.styles.ts +37 -0
  215. package/src/components/select/index.ts +1 -0
  216. package/src/components/select/select.styles.ts +86 -0
  217. package/src/components/separator/index.ts +1 -0
  218. package/src/components/separator/separator.styles.ts +25 -0
  219. package/src/components/skeleton/index.ts +1 -0
  220. package/src/components/skeleton/skeleton.styles.ts +21 -0
  221. package/src/components/slider/index.ts +1 -0
  222. package/src/components/slider/slider.styles.ts +40 -0
  223. package/src/components/spinner/index.ts +1 -0
  224. package/src/components/spinner/spinner.styles.ts +28 -0
  225. package/src/components/splitter/index.ts +1 -0
  226. package/src/components/splitter/splitter.styles.ts +28 -0
  227. package/src/components/stepper/index.ts +1 -0
  228. package/src/components/stepper/stepper.styles.ts +57 -0
  229. package/src/components/surface/index.ts +1 -0
  230. package/src/components/surface/surface.styles.ts +20 -0
  231. package/src/components/switch/index.ts +1 -0
  232. package/src/components/switch/switch.styles.ts +31 -0
  233. package/src/components/switch-group/index.ts +1 -0
  234. package/src/components/switch-group/switch-group.styles.ts +25 -0
  235. package/src/components/table/index.ts +1 -0
  236. package/src/components/table/table.styles.ts +47 -0
  237. package/src/components/tabs/index.ts +1 -0
  238. package/src/components/tabs/tabs.styles.ts +31 -0
  239. package/src/components/tag/index.ts +1 -0
  240. package/src/components/tag/tag.styles.ts +37 -0
  241. package/src/components/tag-group/index.ts +1 -0
  242. package/src/components/tag-group/tag-group.styles.ts +12 -0
  243. package/src/components/text/index.ts +1 -0
  244. package/src/components/text/text.styles.ts +29 -0
  245. package/src/components/textarea/index.ts +1 -0
  246. package/src/components/textarea/textarea.styles.ts +86 -0
  247. package/src/components/time-field/index.ts +1 -0
  248. package/src/components/time-field/time-field.styles.ts +86 -0
  249. package/src/components/toast/index.ts +1 -0
  250. package/src/components/toast/toast.styles.ts +67 -0
  251. package/src/components/toggle-button/index.ts +1 -0
  252. package/src/components/toggle-button/toggle-button.styles.ts +28 -0
  253. package/src/components/toggle-button-group/index.ts +1 -0
  254. package/src/components/toggle-button-group/toggle-button-group.styles.ts +39 -0
  255. package/src/components/toolbar/index.ts +1 -0
  256. package/src/components/toolbar/toolbar.styles.ts +23 -0
  257. package/src/components/tooltip/index.ts +1 -0
  258. package/src/components/tooltip/tooltip.styles.ts +12 -0
  259. package/src/components/tree/index.ts +1 -0
  260. package/src/components/tree/tree.styles.ts +33 -0
  261. package/src/index.ts +5 -0
  262. package/src/utils/index.ts +15 -0
  263. package/themes/default/components/index.css +6 -0
  264. package/themes/default/index.css +8 -0
  265. package/themes/default/variables.css +168 -0
  266. package/themes/shared/theme.css +196 -0
  267. package/utilities/index.css +244 -0
  268. package/variants/index.css +106 -0
@@ -0,0 +1,78 @@
1
+ /* Base avatar styles */
2
+ .avatar {
3
+ @apply relative flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-default;
4
+ }
5
+
6
+ /* Avatar fallback element */
7
+ .avatar__fallback {
8
+ @apply flex size-full items-center justify-center bg-default text-sm font-medium;
9
+ }
10
+
11
+ /* Avatar image element */
12
+ .avatar__image {
13
+ @apply absolute inset-0 aspect-square size-full;
14
+
15
+ /**
16
+ * Transitions
17
+ */
18
+ @apply transition-opacity duration-300 motion-reduce:transition-none;
19
+ }
20
+
21
+ /* Size modifiers */
22
+ .avatar--sm {
23
+ @apply size-8;
24
+ }
25
+
26
+ .avatar--md {
27
+ /* No styles as this is the default size */
28
+ }
29
+
30
+ .avatar--lg {
31
+ @apply size-12;
32
+
33
+ .avatar__fallback {
34
+ @apply text-base;
35
+ }
36
+ }
37
+
38
+ /* Color modifiers for fallback */
39
+ .avatar__fallback--accent {
40
+ @apply text-accent;
41
+ }
42
+
43
+ .avatar__fallback--default {
44
+ @apply text-default-foreground;
45
+ }
46
+
47
+ .avatar__fallback--success {
48
+ @apply text-success;
49
+ }
50
+
51
+ .avatar__fallback--warning {
52
+ @apply text-warning;
53
+ }
54
+
55
+ .avatar__fallback--danger {
56
+ @apply text-danger;
57
+ }
58
+
59
+ /* Variant modifiers */
60
+ .avatar--soft {
61
+ @apply bg-transparent;
62
+ }
63
+
64
+ .avatar--soft .avatar__fallback--accent {
65
+ @apply bg-accent-soft text-accent-soft-foreground;
66
+ }
67
+
68
+ .avatar--soft .avatar__fallback--success {
69
+ @apply bg-success-soft text-success-soft-foreground;
70
+ }
71
+
72
+ .avatar--soft .avatar__fallback--warning {
73
+ @apply bg-warning-soft text-warning-soft-foreground;
74
+ }
75
+
76
+ .avatar--soft .avatar__fallback--danger {
77
+ @apply bg-danger-soft text-danger-soft-foreground;
78
+ }
@@ -0,0 +1,186 @@
1
+ /* ==========================================================================
2
+ Badge - Small informational badges for displaying labels, statuses, and categories.
3
+ ========================================================================== */
4
+
5
+ /* Base styles */
6
+ .badge {
7
+ @apply inline-flex shrink-0 items-center justify-center font-semibold whitespace-nowrap leading-none;
8
+
9
+ /* Default size (matches --md) */
10
+ @apply h-5 min-w-5 px-1 text-xs rounded-full;
11
+
12
+ /* Default tokens */
13
+ --badge-bg: var(--color-default);
14
+ --badge-fg: var(--color-default-foreground);
15
+ --badge-border: var(--color-background);
16
+
17
+ box-sizing: border-box;
18
+ background-color: var(--badge-bg);
19
+ color: var(--badge-fg);
20
+ border: 2px solid var(--badge-border);
21
+ }
22
+
23
+ .badge__label {
24
+ @apply inline-flex items-center justify-center;
25
+ }
26
+
27
+ .badge-anchor {
28
+ @apply relative inline-flex shrink-0;
29
+ }
30
+
31
+ /* ==========================================================================
32
+ Size variants
33
+ ========================================================================== */
34
+
35
+ .badge--lg {
36
+ @apply h-6 min-w-6 px-1.5 text-sm;
37
+ }
38
+
39
+ .badge--md {
40
+ /* No styles as this is the default size */
41
+ }
42
+
43
+ .badge--sm {
44
+ @apply h-4 min-w-4 px-1 text-[10px];
45
+ border-width: 1px;
46
+ }
47
+
48
+ .badge--xs {
49
+ @apply h-2.5 min-w-2.5 p-0 text-[0px];
50
+ border-width: 1px;
51
+ }
52
+
53
+ .badge--xs .badge__label {
54
+ display: none;
55
+ }
56
+
57
+ /* ==========================================================================
58
+ Color variants - set foreground color
59
+ ========================================================================== */
60
+
61
+ .badge--accent {
62
+ --badge-fg: var(--color-accent);
63
+ }
64
+
65
+ .badge--default {
66
+ --badge-fg: var(--color-default-foreground);
67
+ }
68
+
69
+ .badge--success {
70
+ --badge-fg: var(--color-success);
71
+ }
72
+
73
+ .badge--warning {
74
+ --badge-fg: var(--color-warning);
75
+ }
76
+
77
+ .badge--danger {
78
+ --badge-fg: var(--color-danger);
79
+ }
80
+
81
+ /* ==========================================================================
82
+ Variant styles
83
+ ========================================================================== */
84
+
85
+ .badge--primary {
86
+ /* Solid background - compound variants below handle bg/fg per color */
87
+ }
88
+
89
+ .badge--secondary {
90
+ /* Default background with colored text - base behavior */
91
+ }
92
+
93
+ .badge--soft {
94
+ /* Soft/muted background - compound variants below handle bg/fg per color */
95
+ }
96
+
97
+ /* ==========================================================================
98
+ Placement variants
99
+ ========================================================================== */
100
+
101
+ .badge--top-right {
102
+ @apply absolute top-0 right-0 z-10;
103
+ transform: translate(35%, -35%);
104
+ }
105
+
106
+ .badge--top-left {
107
+ @apply absolute top-0 left-0 z-10;
108
+ transform: translate(-35%, -35%);
109
+ }
110
+
111
+ .badge--bottom-right {
112
+ @apply absolute right-0 bottom-0 z-10;
113
+ transform: translate(35%, 35%);
114
+ }
115
+
116
+ .badge--bottom-left {
117
+ @apply absolute bottom-0 left-0 z-10;
118
+ transform: translate(-35%, 35%);
119
+ }
120
+
121
+ /* xs dots sit at the bounding-box corner with no outward translate,
122
+ landing right on a circular anchor's edge rather than floating beside it. */
123
+ .badge--xs.badge--top-right,
124
+ .badge--xs.badge--top-left,
125
+ .badge--xs.badge--bottom-right,
126
+ .badge--xs.badge--bottom-left {
127
+ transform: none;
128
+ }
129
+
130
+ /* ==========================================================================
131
+ Compound variants - Primary (solid background)
132
+ ========================================================================== */
133
+
134
+ .badge--primary.badge--accent {
135
+ --badge-bg: var(--color-accent);
136
+ --badge-fg: var(--color-accent-foreground);
137
+ }
138
+
139
+ .badge--primary.badge--default {
140
+ --badge-bg: var(--color-default);
141
+ --badge-fg: var(--color-default-foreground);
142
+ }
143
+
144
+ .badge--primary.badge--success {
145
+ --badge-bg: var(--color-success);
146
+ --badge-fg: var(--color-success-foreground);
147
+ }
148
+
149
+ .badge--primary.badge--warning {
150
+ --badge-bg: var(--color-warning);
151
+ --badge-fg: var(--color-warning-foreground);
152
+ }
153
+
154
+ .badge--primary.badge--danger {
155
+ --badge-bg: var(--color-danger);
156
+ --badge-fg: var(--color-danger-foreground);
157
+ }
158
+
159
+ /* ==========================================================================
160
+ Compound variants - Soft (muted background)
161
+ ========================================================================== */
162
+
163
+ .badge--soft.badge--accent {
164
+ --badge-bg: var(--color-accent-soft);
165
+ --badge-fg: var(--color-accent-soft-foreground);
166
+ }
167
+
168
+ .badge--soft.badge--default {
169
+ --badge-bg: var(--color-default);
170
+ --badge-fg: var(--color-default-foreground);
171
+ }
172
+
173
+ .badge--soft.badge--success {
174
+ --badge-bg: var(--color-success-soft);
175
+ --badge-fg: var(--color-success-soft-foreground);
176
+ }
177
+
178
+ .badge--soft.badge--warning {
179
+ --badge-bg: var(--color-warning-soft);
180
+ --badge-fg: var(--color-warning-soft-foreground);
181
+ }
182
+
183
+ .badge--soft.badge--danger {
184
+ --badge-bg: var(--color-danger-soft);
185
+ --badge-fg: var(--color-danger-soft-foreground);
186
+ }
@@ -0,0 +1,76 @@
1
+ /* Base breadcrumbs container */
2
+ .breadcrumbs {
3
+ @apply flex flex-wrap items-center gap-0;
4
+
5
+ /* Breadcrumb item wrapper */
6
+ .breadcrumbs__item {
7
+ @apply flex shrink-0 items-center justify-center;
8
+ }
9
+
10
+ /* Breadcrumb link */
11
+ .breadcrumbs__link {
12
+ @apply relative inline-flex items-center rounded-md px-2 py-1 text-sm leading-5 font-medium text-muted no-underline outline-none;
13
+
14
+ /**
15
+ * Transitions
16
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
17
+ */
18
+ transition:
19
+ color 200ms var(--ease-smooth),
20
+ background-color 200ms var(--ease-smooth),
21
+ opacity 200ms var(--ease-out);
22
+ @apply motion-reduce:transition-none;
23
+
24
+ /* Cursor */
25
+ cursor: var(--cursor-interactive);
26
+
27
+ /* Hover: brighten to foreground and show a subtle background */
28
+ @media (hover: hover) {
29
+ &:hover,
30
+ &[data-hovered="true"] {
31
+ @apply bg-surface-hover text-foreground;
32
+ }
33
+ }
34
+
35
+ /* Active / pressed */
36
+ &:active,
37
+ &[data-pressed="true"] {
38
+ @apply opacity-80;
39
+ }
40
+
41
+ /* Focus ring */
42
+ &:focus-visible:not(:focus),
43
+ &[data-focus-visible="true"] {
44
+ @apply status-focused;
45
+ }
46
+
47
+ /* Disabled */
48
+ &[aria-disabled="true"],
49
+ &:disabled {
50
+ @apply status-disabled;
51
+ }
52
+ }
53
+
54
+ /* Current page — applied to the <li> carrying aria-current="page" */
55
+ .breadcrumbs__item[aria-current="page"] .breadcrumbs__link {
56
+ @apply text-foreground font-semibold;
57
+ cursor: default;
58
+
59
+ @media (hover: hover) {
60
+ &:hover,
61
+ &[data-hovered="true"] {
62
+ @apply bg-transparent;
63
+ }
64
+ }
65
+ }
66
+
67
+ /* Separator icon */
68
+ .breadcrumbs__separator {
69
+ @apply inline-flex shrink-0 items-center justify-center text-muted/60 rtl:rotate-180 select-none;
70
+
71
+ /* Default chevron SVG sizing */
72
+ & > svg {
73
+ @apply size-3.5;
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,126 @@
1
+ /* ==========================================================================
2
+ ButtonGroup - Groups related buttons together
3
+
4
+ Design model: the GROUP container owns the rounded silhouette and (for
5
+ outline variants) the single continuous outer border. Children buttons
6
+ drop their own border + radius and fill their slice. `overflow-hidden`
7
+ clips each button's hover/active background to the group's rounded
8
+ corners, so the long edges (left/right vertical, top/bottom horizontal)
9
+ render as one uninterrupted line on every button.
10
+ ========================================================================== */
11
+
12
+ /* Base group: rounded container that clips children to its silhouette */
13
+ .button-group {
14
+ @apply inline-flex h-auto w-fit items-center justify-center gap-0 overflow-hidden rounded-3xl;
15
+ }
16
+
17
+ /* ==========================================================================
18
+ Orientation variants
19
+ ========================================================================== */
20
+
21
+ .button-group--horizontal {
22
+ @apply flex-row items-stretch;
23
+ }
24
+
25
+ .button-group--vertical {
26
+ @apply flex-col items-stretch rounded-xl;
27
+ }
28
+
29
+ /* Stretch each child across the group's cross axis so every button shares
30
+ the same width (vertical) or height (horizontal) as the widest/tallest one. */
31
+ .button-group--vertical .button {
32
+ @apply w-full;
33
+ }
34
+
35
+ /* Children fill their slice with no individual radius — the group clips them.
36
+ Override the base button's 300ms transitions so press/hover feedback feels
37
+ snappy in both directions and doesn't leave the button looking "stuck"
38
+ selected for a third of a second after release. */
39
+ .button-group .button {
40
+ @apply rounded-none;
41
+ transition:
42
+ background-color 100ms var(--ease-out),
43
+ box-shadow 100ms var(--ease-out);
44
+ }
45
+
46
+ /* ==========================================================================
47
+ Outline variant — group owns the single outer border
48
+ ========================================================================== */
49
+
50
+ .button-group:has(.button--outline) {
51
+ @apply border border-border;
52
+ }
53
+
54
+ .button-group .button--outline {
55
+ @apply border-0;
56
+ }
57
+
58
+ /* ==========================================================================
59
+ Press feedback
60
+
61
+ Scale would leave a visible gap inside the clipped group, so use an
62
+ immediate inset darken overlay instead. The button base's bg-color
63
+ transition is 300ms (too slow to register on a quick click), so we
64
+ short-circuit it here for a snappy press.
65
+ ========================================================================== */
66
+
67
+
68
+ .button-group .button:active,
69
+ .button-group .button[data-pressed="true"],
70
+ .button-group .button[data-selected="true"],
71
+ .button-group .button[aria-pressed="true"] {
72
+ transform: none;
73
+ box-shadow: inset 0 0 0 999px rgb(0 0 0 / 0.08);
74
+ transition: box-shadow 80ms var(--ease-out);
75
+ }
76
+
77
+ /* Override focus ring to use inset style so it stays within button bounds
78
+ and isn't clipped by the group's overflow-hidden */
79
+ .button-group .button:focus-visible:not(:focus),
80
+ .button-group .button:focus-visible {
81
+ --tw-ring-offset-width: 0px;
82
+ @apply ring-inset;
83
+ }
84
+
85
+ /* ==========================================================================
86
+ Separator (compound component)
87
+ ========================================================================== */
88
+
89
+ .button-group__separator {
90
+ @apply bg-current opacity-15;
91
+
92
+ border-radius: 4px;
93
+ position: absolute;
94
+ pointer-events: none;
95
+
96
+ /**
97
+ * Transitions
98
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
99
+ */
100
+ transition: opacity 300ms var(--ease-smooth);
101
+ @apply motion-reduce:transition-none;
102
+
103
+ /* Horizontal orientation - vertical divider */
104
+ .button-group--horizontal & {
105
+ left: -1px;
106
+ top: 25%;
107
+ width: 1px;
108
+ height: 50%;
109
+ }
110
+
111
+ /* Vertical orientation - horizontal divider */
112
+ .button-group--vertical & {
113
+ left: 25%;
114
+ top: -1px;
115
+ width: 50%;
116
+ height: 1px;
117
+ }
118
+ }
119
+
120
+ /* ==========================================================================
121
+ Full width modifier
122
+ ========================================================================== */
123
+
124
+ .button-group--full-width {
125
+ @apply w-full;
126
+ }