@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,157 @@
1
+ /* ==========================================================================
2
+ Pagination - Page navigation component
3
+ ==========================================================================
4
+
5
+ Reka UI data-attribute mapping (Phase 8 audit):
6
+ - PaginationListItem[data-selected="true"] ← was React Aria [data-active="true"]/[data-pressed="true"]
7
+ Dual selectors kept so styles work with both React Aria and Reka UI attributes.
8
+ - :hover paired with [data-hovered="true"] (pointer-device fallback for React Aria compat)
9
+ - :focus-visible paired with [data-focus-visible="true"] (Reka does not emit data-focus-visible)
10
+ - :active paired with [data-pressed="true"] (Reka does not emit data-pressed on list items)
11
+ ========================================================================== */
12
+
13
+ /* Base styles */
14
+ .pagination {
15
+ @apply flex w-full flex-col items-center justify-between gap-4 sm:flex-row;
16
+ }
17
+
18
+ /* Summary - left side info container */
19
+ .pagination__summary {
20
+ @apply flex items-center gap-2 self-start text-sm text-muted sm:self-center;
21
+ }
22
+
23
+ /* Content - container for pagination items */
24
+ .pagination__content {
25
+ @apply flex items-center gap-1 self-start sm:self-center;
26
+ }
27
+
28
+ /* Item - list item wrapper */
29
+ .pagination__item {
30
+ @apply inline-flex;
31
+ }
32
+
33
+ /* Link - page number button (ghost button style) */
34
+ .pagination__link {
35
+ @apply relative isolate inline-flex size-9 origin-center items-center justify-center rounded-3xl text-sm font-medium whitespace-nowrap outline-none select-none no-highlight md:size-8;
36
+
37
+ cursor: var(--cursor-interactive);
38
+
39
+ /**
40
+ * Transitions
41
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
42
+ */
43
+ transition:
44
+ transform 300ms var(--ease-smooth),
45
+ background-color 300ms var(--ease-out),
46
+ box-shadow 300ms var(--ease-out);
47
+ @apply transform-gpu motion-reduce:transition-none;
48
+
49
+ /* Ghost button tokens */
50
+ --pagination-link-bg: transparent;
51
+ --pagination-link-bg-hover: var(--color-default-hover);
52
+ --pagination-link-bg-pressed: var(--color-default-hover);
53
+ --pagination-link-fg: var(--color-default-foreground);
54
+
55
+ background-color: var(--pagination-link-bg);
56
+ color: var(--pagination-link-fg);
57
+
58
+ /* Focus state */
59
+ &:focus-visible,
60
+ &[data-focus-visible="true"] {
61
+ @apply status-focused;
62
+ }
63
+
64
+ /* Disabled state */
65
+ &:disabled,
66
+ &[aria-disabled="true"] {
67
+ @apply status-disabled;
68
+ }
69
+
70
+ /* Hover state */
71
+ @media (hover: hover) {
72
+ &:hover,
73
+ &[data-hovered="true"] {
74
+ background-color: var(--pagination-link-bg-hover);
75
+ }
76
+ }
77
+
78
+ /* Active / pressed */
79
+ &:active,
80
+ &[data-pressed="true"] {
81
+ background-color: var(--pagination-link-bg-pressed);
82
+ transform: scale(0.97);
83
+ }
84
+
85
+ /* Active page - tertiary button style */
86
+ /* data-active="true" = React Aria; data-selected="true" = Reka UI PaginationListItem */
87
+ &[data-active="true"],
88
+ &[data-selected="true"] {
89
+ --pagination-link-bg: var(--color-default);
90
+ --pagination-link-bg-hover: var(--color-default-hover);
91
+ --pagination-link-bg-pressed: var(--color-default-hover);
92
+ }
93
+ }
94
+
95
+ /* Ellipsis */
96
+ .pagination__ellipsis {
97
+ @apply inline-flex size-9 items-center justify-center text-sm text-muted select-none md:size-8;
98
+ }
99
+
100
+ /* Navigation buttons (Previous / Next) */
101
+ .pagination__link--nav {
102
+ @apply w-auto gap-1.5 px-2.5;
103
+ }
104
+
105
+ /* ==========================================================================
106
+ Size variants
107
+ ========================================================================== */
108
+
109
+ .pagination--sm {
110
+ .pagination__link {
111
+ @apply size-8 text-xs md:size-7;
112
+
113
+ &:active,
114
+ &[data-pressed="true"] {
115
+ transform: scale(0.98);
116
+ }
117
+ }
118
+
119
+ .pagination__link--nav {
120
+ @apply w-auto px-2;
121
+ }
122
+
123
+ .pagination__ellipsis {
124
+ @apply size-8 text-xs md:size-7;
125
+ }
126
+
127
+ .pagination__summary {
128
+ @apply text-xs;
129
+ }
130
+ }
131
+
132
+ .pagination--md {
133
+ /* No styles as this is the default size */
134
+ }
135
+
136
+ .pagination--lg {
137
+ .pagination__link {
138
+ @apply size-10 text-base md:size-9;
139
+
140
+ &:active,
141
+ &[data-pressed="true"] {
142
+ transform: scale(0.96);
143
+ }
144
+ }
145
+
146
+ .pagination__link--nav {
147
+ @apply w-auto px-3;
148
+ }
149
+
150
+ .pagination__ellipsis {
151
+ @apply size-10 text-base md:size-9;
152
+ }
153
+
154
+ .pagination__summary {
155
+ @apply text-base;
156
+ }
157
+ }
@@ -0,0 +1,96 @@
1
+ /* Popover component styles */
2
+
3
+ /* Base popover styles */
4
+ .popover {
5
+ @apply origin-(--trigger-anchor-point) rounded-3xl bg-overlay p-0 text-sm;
6
+ box-shadow: var(--shadow-overlay);
7
+
8
+ /* Entering animations */
9
+ &[data-state="open"] {
10
+ @apply animate-in duration-300 ease-smooth fade-in-0 zoom-in-90;
11
+
12
+ /* Placement-specific translations */
13
+ &[data-placement="top"] {
14
+ @apply slide-in-from-bottom-1;
15
+ }
16
+
17
+ &[data-placement="bottom"] {
18
+ @apply slide-in-from-top-1;
19
+ }
20
+
21
+ &[data-placement="left"] {
22
+ @apply slide-in-from-right-1;
23
+ }
24
+
25
+ &[data-placement="right"] {
26
+ @apply slide-in-from-left-1;
27
+ }
28
+ }
29
+
30
+ /* Exiting animations */
31
+ &[data-state="closed"] {
32
+ @apply animate-out duration-300 ease-smooth zoom-out-95 fade-out;
33
+ }
34
+
35
+ &,
36
+ & {
37
+ @apply will-change-[opacity,transform];
38
+ }
39
+
40
+ /* Arrow styling */
41
+ & [data-slot="popover-overlay-arrow"] {
42
+ fill: var(--overlay);
43
+ }
44
+
45
+ /* Arrow rotation based on placement */
46
+ &[data-placement="bottom"] [data-slot="popover-overlay-arrow"] {
47
+ rotate: 180deg;
48
+ }
49
+
50
+ &[data-placement="left"] [data-slot="popover-overlay-arrow"] {
51
+ rotate: -90deg;
52
+ }
53
+
54
+ &[data-placement="right"] [data-slot="popover-overlay-arrow"] {
55
+ rotate: 90deg;
56
+ }
57
+ }
58
+
59
+ /* Popover dialog */
60
+ .popover__dialog {
61
+ @apply p-4 outline-none;
62
+ }
63
+
64
+ /* Popover heading */
65
+ .popover__heading {
66
+ @apply font-medium;
67
+ }
68
+
69
+ /* Popover trigger */
70
+ .popover__trigger {
71
+ @apply inline-block;
72
+
73
+ /**
74
+ * Transitions
75
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
76
+ */
77
+ transition:
78
+ color 300ms var(--ease-smooth),
79
+ background-color 300ms var(--ease-smooth),
80
+ box-shadow 300ms var(--ease-out);
81
+ @apply motion-reduce:transition-none;
82
+
83
+ cursor: var(--cursor-interactive);
84
+
85
+ /* Focus state */
86
+ &:focus-visible:not(:focus),
87
+ &[data-focus-visible="true"] {
88
+ @apply status-focused;
89
+ }
90
+
91
+ /* Disabled state */
92
+ &:disabled,
93
+ &[aria-disabled="true"] {
94
+ @apply status-disabled;
95
+ }
96
+ }
@@ -0,0 +1,126 @@
1
+ /* ==========================================================================
2
+ ProgressBar - Shows determinate or indeterminate progress
3
+ ========================================================================== */
4
+
5
+ /* Base styles */
6
+ .progress-bar {
7
+ @apply grid w-full gap-1;
8
+ grid-template-areas:
9
+ "label output"
10
+ "track track";
11
+ grid-template-columns: 1fr auto;
12
+
13
+ /* Default color token (accent) */
14
+ --progress-bar-fill: var(--color-accent);
15
+
16
+ [data-slot="label"] {
17
+ @apply w-fit text-sm font-medium;
18
+
19
+ grid-area: label;
20
+ }
21
+
22
+ .progress-bar__output {
23
+ @apply text-sm font-medium tabular-nums;
24
+
25
+ grid-area: output;
26
+ }
27
+
28
+ .progress-bar__track {
29
+ @apply relative overflow-hidden rounded-full bg-default;
30
+
31
+ grid-area: track;
32
+
33
+ /* Default height (matches --md) */
34
+ @apply h-2;
35
+ }
36
+
37
+ .progress-bar__fill {
38
+ @apply absolute top-0 left-0 h-full rounded-full w-full;
39
+
40
+ background-color: var(--progress-bar-fill);
41
+
42
+ /**
43
+ * Transitions
44
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
45
+ */
46
+ transition: width 300ms var(--ease-out);
47
+ @apply motion-reduce:transition-none;
48
+ }
49
+
50
+ /* Indeterminate state - when no aria-valuenow is set */
51
+ .progress-bar__fill[data-state="indeterminate"] {
52
+ @apply w-2/5;
53
+
54
+ animation: progress-bar-indeterminate 1.5s cubic-bezier(0.65, 0, 0.35, 1) infinite;
55
+
56
+ @apply motion-reduce:animate-none;
57
+ }
58
+
59
+ /* Disabled state */
60
+ &:disabled,
61
+ &[data-disabled],
62
+ &[aria-disabled="true"] {
63
+ @apply status-disabled;
64
+
65
+ [data-slot="label"] {
66
+ @apply opacity-100;
67
+ }
68
+ }
69
+ }
70
+
71
+ /* ==========================================================================
72
+ Indeterminate animation
73
+ ========================================================================== */
74
+
75
+ @keyframes progress-bar-indeterminate {
76
+ 0% {
77
+ transform: translateX(-100%);
78
+ }
79
+ 100% {
80
+ transform: translateX(350%);
81
+ }
82
+ }
83
+
84
+ /* ==========================================================================
85
+ Size variants
86
+ ========================================================================== */
87
+
88
+ .progress-bar--sm {
89
+ .progress-bar__track {
90
+ @apply h-1;
91
+ }
92
+ }
93
+
94
+ .progress-bar--md {
95
+ /* No styles as this is the default size */
96
+ }
97
+
98
+ .progress-bar--lg {
99
+ .progress-bar__track {
100
+ @apply h-3;
101
+ }
102
+ }
103
+
104
+ /* ==========================================================================
105
+ Color variants
106
+ ========================================================================== */
107
+
108
+ .progress-bar--default {
109
+ --progress-bar-fill: var(--color-default-foreground);
110
+ }
111
+
112
+ .progress-bar--accent {
113
+ --progress-bar-fill: var(--color-accent);
114
+ }
115
+
116
+ .progress-bar--success {
117
+ --progress-bar-fill: var(--color-success);
118
+ }
119
+
120
+ .progress-bar--warning {
121
+ --progress-bar-fill: var(--color-warning);
122
+ }
123
+
124
+ .progress-bar--danger {
125
+ --progress-bar-fill: var(--color-danger);
126
+ }
@@ -0,0 +1,82 @@
1
+ /* ==========================================================================
2
+ ProgressCircle - Circular progress indicator
3
+ ========================================================================== */
4
+
5
+ /* Base styles */
6
+ .progress-circle {
7
+ @apply inline-flex items-center justify-center;
8
+
9
+ --progress-circle-stroke: var(--color-accent);
10
+ --progress-circle-track-stroke: var(--color-default);
11
+
12
+ .progress-circle__track {
13
+ stroke: var(--progress-circle-track-stroke);
14
+ }
15
+
16
+ .progress-circle__indicator {
17
+ stroke: var(--progress-circle-stroke);
18
+ transition: stroke-dashoffset 300ms var(--ease-out);
19
+ @apply motion-reduce:transition-none;
20
+ }
21
+
22
+ /* Disabled state */
23
+ &:disabled,
24
+ &[data-disabled],
25
+ &[aria-disabled="true"] {
26
+ @apply status-disabled;
27
+ }
28
+ }
29
+
30
+ /* ==========================================================================
31
+ Size variants
32
+ ========================================================================== */
33
+
34
+ .progress-circle--sm {
35
+ .progress-circle__svg {
36
+ @apply size-12;
37
+ }
38
+ }
39
+
40
+ .progress-circle--md {
41
+ .progress-circle__svg {
42
+ @apply size-16;
43
+ }
44
+ }
45
+
46
+ .progress-circle--lg {
47
+ .progress-circle__svg {
48
+ @apply size-24;
49
+ }
50
+ }
51
+
52
+ /* ==========================================================================
53
+ Color variants
54
+ ========================================================================== */
55
+
56
+ .progress-circle--default {
57
+ --progress-circle-stroke: var(--color-default-foreground);
58
+ }
59
+
60
+ .progress-circle--primary {
61
+ --progress-circle-stroke: var(--color-accent);
62
+ }
63
+
64
+ .progress-circle--secondary {
65
+ --progress-circle-stroke: var(--color-default-foreground);
66
+ }
67
+
68
+ .progress-circle--accent {
69
+ --progress-circle-stroke: var(--color-accent);
70
+ }
71
+
72
+ .progress-circle--success {
73
+ --progress-circle-stroke: var(--color-success);
74
+ }
75
+
76
+ .progress-circle--warning {
77
+ --progress-circle-stroke: var(--color-warning);
78
+ }
79
+
80
+ .progress-circle--danger {
81
+ --progress-circle-stroke: var(--color-danger);
82
+ }
@@ -0,0 +1,47 @@
1
+ /* Radio Group base styles */
2
+ .radio-group {
3
+ @apply flex flex-col;
4
+
5
+ /* Default orientation */
6
+ &[data-orientation="vertical"] {
7
+ [data-slot="radio"] {
8
+ @apply mt-4;
9
+ }
10
+ }
11
+
12
+ &[data-orientation="horizontal"] {
13
+ @apply flex-row flex-wrap gap-4;
14
+ }
15
+ }
16
+
17
+ /* Variant property definitions */
18
+ .radio-group--primary {
19
+ /* Default styles */
20
+ }
21
+
22
+ .radio-group--secondary .radio__control {
23
+ @apply shadow-none;
24
+ background-color: var(--radio-control-bg);
25
+
26
+ --radio-control-bg: var(--color-default);
27
+ --radio-control-bg-hover: var(--color-default-hover);
28
+
29
+ /* Hover state */
30
+ .radio:hover &,
31
+ .radio:hover & {
32
+ @apply border-field-border-hover;
33
+ }
34
+
35
+ /* Default indicator color (unselected) */
36
+ .radio:not([aria-checked="true"]):not([data-state="checked"]) & .radio__indicator:empty::before {
37
+ background-color: var(--radio-control-bg);
38
+ }
39
+
40
+ /* Hover indicator color (unselected) */
41
+ .radio:hover:not([aria-checked="true"]):not([data-state="checked"]) &,
42
+ .radio:hover:not([aria-checked="true"]):not([data-state="checked"]) & {
43
+ .radio__indicator:empty::before {
44
+ background-color: var(--radio-control-bg-hover);
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,157 @@
1
+ /* ==========================================================================
2
+ Base radio styles
3
+ ========================================================================== */
4
+
5
+ .radio {
6
+ @apply relative flex items-start gap-3 outline-none no-highlight;
7
+
8
+ cursor: var(--cursor-interactive);
9
+
10
+ [data-slot="label"] {
11
+ @apply select-none;
12
+ }
13
+
14
+ [data-slot="description"] {
15
+ @apply text-wrap select-none;
16
+ }
17
+
18
+ /* Disabled state */
19
+ &:disabled,
20
+ &[data-disabled],
21
+ &[aria-disabled="true"] {
22
+ @apply status-disabled;
23
+ }
24
+ }
25
+
26
+ /* ==========================================================================
27
+ Radio control (the circular button)
28
+ ========================================================================== */
29
+
30
+ .radio__control {
31
+ @apply relative mt-[3px] inline-flex size-4 shrink-0 items-center justify-center rounded-full border border-border-secondary bg-field shadow-field outline-none no-highlight;
32
+
33
+ /**
34
+ * Transitions
35
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
36
+ */
37
+ transition:
38
+ background-color 300ms var(--ease-out),
39
+ border-color 300ms var(--ease-out),
40
+ transform 300ms var(--ease-out);
41
+ @apply motion-reduce:transition-none;
42
+
43
+ cursor: var(--cursor-interactive);
44
+
45
+ /* Interactive states */
46
+ /* Focus */
47
+ .radio:focus-visible &,
48
+ .radio:focus-visible & {
49
+ @apply status-focused;
50
+ }
51
+
52
+ /* Hover */
53
+ .radio:hover &,
54
+ .radio:hover & {
55
+ @apply border-field-border-hover;
56
+ }
57
+
58
+ /* Hover - only when not selected */
59
+ .radio:hover:not([aria-checked="true"]):not([data-state="checked"]) &,
60
+ .radio:hover:not([aria-checked="true"]):not([data-state="checked"]) & {
61
+ .radio__indicator:empty::before {
62
+ @apply bg-field-hover;
63
+ }
64
+ }
65
+
66
+ /* Pressed */
67
+ .radio:active &,
68
+ .radio:active & {
69
+ @apply scale-95;
70
+ }
71
+
72
+ /* Selection states */
73
+ /* Selected */
74
+ .radio[aria-checked="true"] &,
75
+ .radio[data-state="checked"] & {
76
+ @apply border-transparent bg-accent;
77
+ }
78
+
79
+ /* Selected + Pressed */
80
+ .radio:active[data-state="checked"] &,
81
+ .radio:active[data-state="checked"] & {
82
+ @apply bg-accent-hover;
83
+ }
84
+
85
+ /* Validation states */
86
+ /* Invalid */
87
+ .radio[aria-invalid="true"] &,
88
+ .radio[aria-invalid="true"] & {
89
+ @apply status-invalid-field;
90
+ }
91
+
92
+ /* Invalid + Selected */
93
+ .radio[aria-invalid="true"][aria-checked="true"] &,
94
+ .radio[aria-invalid="true"][data-state="checked"] &,
95
+ .radio[aria-invalid="true"][aria-checked="true"] &,
96
+ .radio[aria-invalid="true"][data-state="checked"] & {
97
+ @apply status-invalid-field;
98
+ }
99
+ }
100
+
101
+ /* ==========================================================================
102
+ Radio indicator (the inner dot)
103
+ ========================================================================== */
104
+
105
+ .radio__indicator {
106
+ @apply absolute inset-0 flex items-center justify-center;
107
+
108
+ pointer-events: none;
109
+ }
110
+
111
+ /* :empty pseudo-class ensures these styles only apply when the indicator has no custom children
112
+ (e.g., custom icon). When custom content is present, these default dot styles are not applied. */
113
+ .radio__indicator:empty::before {
114
+ content: "";
115
+ @apply rounded-full bg-field;
116
+
117
+ width: 100%;
118
+ height: 100%;
119
+ scale: 1;
120
+
121
+ /**
122
+ * Transitions
123
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
124
+ */
125
+ transition:
126
+ scale 300ms var(--ease-out),
127
+ background-color 300ms var(--ease-out);
128
+ @apply motion-reduce:transition-none;
129
+ }
130
+
131
+ /* Selected state */
132
+ .radio[aria-checked="true"] .radio__indicator:empty::before,
133
+ .radio[data-state="checked"] .radio__indicator:empty::before {
134
+ @apply bg-accent-foreground;
135
+ scale: 0.4286; /* 6px */
136
+ }
137
+
138
+ /* Selected + Pressed state */
139
+ .radio[data-state="checked"]:active .radio__indicator:empty::before {
140
+ scale: 0.5714; /* 8px */
141
+ }
142
+
143
+ /* ==========================================================================
144
+ Radio content wrapper
145
+ ========================================================================== */
146
+
147
+ .radio__content {
148
+ @apply flex flex-col gap-0;
149
+ }
150
+
151
+ /* ==========================================================================
152
+ Disabled modifier
153
+ ========================================================================== */
154
+
155
+ .radio--disabled {
156
+ @apply status-disabled;
157
+ }