@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,282 @@
1
+ /* Button component styles */
2
+
3
+ /* Base button styles */
4
+ .button {
5
+ @apply relative isolate inline-flex h-8 w-fit origin-center items-center justify-center gap-1.5 rounded-full px-3 text-sm font-medium whitespace-nowrap outline-none select-none no-highlight;
6
+
7
+ /**
8
+ * Transitions
9
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
10
+ */
11
+ transition:
12
+ transform 300ms var(--ease-smooth),
13
+ background-color 300ms var(--ease-out),
14
+ box-shadow 300ms var(--ease-out);
15
+ @apply transform-gpu motion-reduce:transition-none;
16
+
17
+ /* Cursor */
18
+ cursor: var(--cursor-interactive);
19
+
20
+ /* Default tokens (fallback behavior) */
21
+ --button-bg: transparent;
22
+ --button-bg-hover: var(--button-bg);
23
+ --button-bg-pressed: var(--button-bg-hover);
24
+ --button-fg: currentColor;
25
+
26
+ background-color: var(--button-bg);
27
+ color: var(--button-fg);
28
+
29
+ /* Focus state */
30
+ &:focus-visible:not(:focus),
31
+ &[data-focus-visible="true"] {
32
+ @apply status-focused;
33
+ }
34
+
35
+ /* Disabled state */
36
+ &:disabled,
37
+ &[aria-disabled="true"] {
38
+ @apply status-disabled;
39
+ }
40
+
41
+ /* Pending state */
42
+ &[data-pending="true"] {
43
+ @apply status-pending;
44
+ }
45
+
46
+ /* Active / pressed */
47
+ &:active,
48
+ &[data-pressed="true"] {
49
+ background-color: var(--button-bg-pressed);
50
+ transform: scale(0.97);
51
+ }
52
+
53
+ /* Selected / toggle-on state */
54
+ &[aria-pressed="true"],
55
+ &[data-selected="true"] {
56
+ background-color: var(--button-bg-pressed);
57
+ box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--button-fg) 20%, transparent);
58
+ }
59
+
60
+ /* Hover */
61
+ @media (hover: hover) {
62
+ &:hover,
63
+ &[data-hovered="true"] {
64
+ background-color: var(--button-bg-hover);
65
+ }
66
+ }
67
+
68
+ /* SVG icon styling - exclude spinner and link-icon svgs */
69
+ & svg:not([data-slot="spinner"] svg, [data-slot="link-icon"] svg) {
70
+ @apply pointer-events-none size-4 shrink-0 self-center;
71
+ }
72
+ }
73
+
74
+ /* Size variants */
75
+ .button--xs {
76
+ @apply h-6 gap-1 rounded-md px-2 text-xs;
77
+
78
+ & svg:not([data-slot="spinner"] svg, [data-slot="link-icon"] svg) {
79
+ @apply size-3.5;
80
+ }
81
+
82
+ &:active,
83
+ &[data-pressed="true"] {
84
+ transform: scale(0.98);
85
+ }
86
+ }
87
+
88
+ .button--sm {
89
+ @apply h-7 gap-1 rounded-lg px-2.5 text-xs;
90
+
91
+ & svg:not([data-slot="spinner"] svg, [data-slot="link-icon"] svg) {
92
+ @apply size-3.5;
93
+ }
94
+
95
+ &:active,
96
+ &[data-pressed="true"] {
97
+ transform: scale(0.98);
98
+ }
99
+ }
100
+
101
+ .button--md {
102
+ /* No styles as this is the default size */
103
+ }
104
+
105
+ .button--lg {
106
+ @apply h-9 px-4 text-sm;
107
+ }
108
+
109
+ .button--xl {
110
+ @apply h-10 gap-2 px-5 text-base;
111
+
112
+ & svg:not([data-slot="spinner"] svg, [data-slot="link-icon"] svg) {
113
+ @apply size-5;
114
+ }
115
+
116
+ &:active,
117
+ &[data-pressed="true"] {
118
+ transform: scale(0.96);
119
+ }
120
+ }
121
+
122
+ /* Color variants - only set custom property values */
123
+ .button--primary {
124
+ --button-bg: var(--color-accent);
125
+ --button-bg-hover: var(--color-accent-hover);
126
+ --button-bg-pressed: var(--color-accent-hover);
127
+ --button-fg: var(--color-accent-foreground);
128
+ }
129
+
130
+ .button--secondary {
131
+ --button-bg: var(--color-default);
132
+ --button-bg-hover: var(--color-default-hover);
133
+ --button-bg-pressed: var(--color-default-hover);
134
+ --button-fg: var(--color-accent-soft-foreground);
135
+ }
136
+
137
+ .button--tertiary {
138
+ --button-bg: var(--color-default);
139
+ --button-bg-hover: var(--color-default-hover);
140
+ --button-bg-pressed: var(--color-default-hover);
141
+ }
142
+
143
+ .button--ghost,
144
+ .button--outline {
145
+ --button-bg: transparent;
146
+ --button-bg-hover: var(--color-default);
147
+ --button-bg-pressed: var(--color-default);
148
+ --button-fg: var(--color-default-foreground);
149
+ }
150
+
151
+ .button--outline {
152
+ @apply border border-border;
153
+ --button-bg-hover: color-mix(in srgb, var(--color-default) 60%, transparent);
154
+ }
155
+
156
+ .button--danger {
157
+ --button-bg: var(--color-danger);
158
+ --button-bg-hover: var(--color-danger-hover);
159
+ --button-bg-pressed: var(--color-danger-hover);
160
+ --button-fg: var(--color-danger-foreground);
161
+ }
162
+
163
+ .button--danger-soft {
164
+ --button-bg: var(--color-danger-soft);
165
+ --button-bg-hover: var(--color-danger-soft-hover);
166
+ --button-bg-pressed: var(--color-danger-soft-hover);
167
+ --button-fg: var(--color-danger-soft-foreground);
168
+ }
169
+
170
+ /* Radius modifiers - compound selector wins over base/size rounding */
171
+ .button.button--radius-none {
172
+ @apply rounded-none;
173
+ }
174
+
175
+ .button.button--radius-sm {
176
+ @apply rounded-sm;
177
+ }
178
+
179
+ .button.button--radius-md {
180
+ @apply rounded-md;
181
+ }
182
+
183
+ .button.button--radius-lg {
184
+ @apply rounded-lg;
185
+ }
186
+
187
+ .button.button--radius-full {
188
+ @apply rounded-full;
189
+ }
190
+
191
+ /* Icon-only modifier - square aspect at every size */
192
+ .button--icon-only {
193
+ @apply w-8 p-0;
194
+ }
195
+
196
+ .button--icon-only.button--xs {
197
+ @apply w-6;
198
+ }
199
+
200
+ .button--icon-only.button--sm {
201
+ @apply w-7;
202
+ }
203
+
204
+ .button--icon-only.button--lg {
205
+ @apply w-9;
206
+ }
207
+
208
+ .button--icon-only.button--xl {
209
+ @apply w-10;
210
+ }
211
+
212
+ /* Full width modifier */
213
+ .button--full-width {
214
+ @apply w-full;
215
+ }
216
+
217
+ /* ============================================================
218
+ Button — Phase 2 extensions (02-01-STYLES)
219
+ ============================================================ */
220
+
221
+ /* --- New color variants --- */
222
+
223
+ .button--success {
224
+ --button-bg: var(--color-success);
225
+ --button-bg-hover: var(--color-success-hover);
226
+ --button-bg-pressed: var(--color-success-hover);
227
+ --button-fg: var(--color-success-foreground);
228
+ }
229
+
230
+ .button--success-soft {
231
+ --button-bg: var(--color-success-soft);
232
+ --button-bg-hover: var(--color-success-soft-hover);
233
+ --button-bg-pressed: var(--color-success-soft-hover);
234
+ --button-fg: var(--color-success-soft-foreground);
235
+ }
236
+
237
+ .button--warning {
238
+ --button-bg: var(--color-warning);
239
+ --button-bg-hover: var(--color-warning-hover);
240
+ --button-bg-pressed: var(--color-warning-hover);
241
+ --button-fg: var(--color-warning-foreground);
242
+ }
243
+
244
+ .button--warning-soft {
245
+ --button-bg: var(--color-warning-soft);
246
+ --button-bg-hover: var(--color-warning-soft-hover);
247
+ --button-bg-pressed: var(--color-warning-soft-hover);
248
+ --button-fg: var(--color-warning-soft-foreground);
249
+ }
250
+
251
+ /* --- Loading state --- */
252
+
253
+ /* Root button in loading state: pointer-events off, cursor change */
254
+ .button--loading,
255
+ .button[data-loading="true"] {
256
+ @apply pointer-events-none cursor-not-allowed;
257
+ }
258
+
259
+ /* Dimmed label when loading */
260
+ .button__label--loading,
261
+ .button[data-loading="true"] .button__label {
262
+ @apply opacity-0;
263
+ }
264
+
265
+ /* Spinner overlay: centered absolutely over the button */
266
+ .button__spinner {
267
+ @apply absolute inset-0 flex items-center justify-center;
268
+ }
269
+
270
+ /* --- Content slots --- */
271
+
272
+ .button__start-content {
273
+ @apply inline-flex items-center justify-center shrink-0;
274
+ }
275
+
276
+ .button__end-content {
277
+ @apply inline-flex items-center justify-center shrink-0;
278
+ }
279
+
280
+ .button__label {
281
+ @apply inline-flex flex-1 items-center justify-center truncate;
282
+ }
@@ -0,0 +1,193 @@
1
+ /* =============================================================================
2
+ * Calendar Year Picker Component Styles
3
+ *
4
+ * Internal component used inside Calendar / RangeCalendar to provide a
5
+ * toggleable year selector. Uses CSS :has() on the parent .calendar to
6
+ * drive crossfade transitions.
7
+ *
8
+ * The year grid is absolutely positioned and sized via JS to match the
9
+ * day grid's exact area. This keeps the calendar's original block layout
10
+ * completely untouched.
11
+ *
12
+ * BEM naming: calendar-year-picker__element, calendar-year-picker--modifier
13
+ * ============================================================================= */
14
+
15
+ /* -----------------------------------------------------------------------------
16
+ * Positioning Context
17
+ * -------------------------------------------------------------------------- */
18
+ .calendar:has(.calendar-year-picker__year-grid),
19
+ .range-calendar:has(.calendar-year-picker__year-grid) {
20
+ position: relative;
21
+ }
22
+
23
+ /* -----------------------------------------------------------------------------
24
+ * Crossfade + Blur Transitions
25
+ *
26
+ * The crossfade is staggered to avoid both grids being semi-transparent at
27
+ * the same time (ghosting). When opening, the day grid fades out first,
28
+ * then the year grid fades in. When closing, the year grid fades out first,
29
+ * then the day grid fades in (via transition-delay).
30
+ *
31
+ * -------------------------------------------------------------------------- */
32
+
33
+ /* Day grid – default visible */
34
+ .calendar:has(.calendar-year-picker__year-grid) > [data-slot="calendar-grid"],
35
+ .range-calendar:has(.calendar-year-picker__year-grid) > [data-slot="range-calendar-grid"] {
36
+ will-change: opacity;
37
+ transition:
38
+ opacity 300ms var(--ease-out),
39
+ visibility 0ms linear;
40
+ @apply motion-reduce:transition-none;
41
+ }
42
+
43
+ /* Day grid – hidden when year picker is open (fade + blur out) */
44
+ .calendar:has(.calendar-year-picker__year-grid[data-state="open"]) > [data-slot="calendar-grid"],
45
+ .range-calendar:has(.calendar-year-picker__year-grid[data-state="open"])
46
+ > [data-slot="range-calendar-grid"] {
47
+ @apply pointer-events-none opacity-0;
48
+ visibility: hidden;
49
+ transition:
50
+ opacity 300ms var(--ease-out),
51
+ visibility 0ms linear 300ms;
52
+ @apply motion-reduce:transition-none;
53
+ }
54
+
55
+ /* -----------------------------------------------------------------------------
56
+ * Trigger Button
57
+ * -------------------------------------------------------------------------- */
58
+ .calendar-year-picker__trigger {
59
+ @apply flex flex-1 items-center justify-start gap-1 rounded-lg outline-none;
60
+
61
+ cursor: var(--cursor-interactive);
62
+ touch-action: manipulation;
63
+
64
+ /* Focus state */
65
+ &:focus-visible {
66
+ @apply status-focused;
67
+ }
68
+ }
69
+
70
+ .calendar-year-picker__trigger-heading {
71
+ @apply text-sm font-medium;
72
+
73
+ transition: color 300ms var(--ease-out);
74
+ @apply motion-reduce:transition-none;
75
+ }
76
+
77
+ .calendar-year-picker__trigger-indicator {
78
+ @apply text-xs text-accent;
79
+
80
+ transition: transform 300ms var(--ease-out);
81
+ @apply motion-reduce:transition-none;
82
+ }
83
+
84
+ /* Rotate chevron when open */
85
+ .calendar-year-picker__trigger[data-state="open"] .calendar-year-picker__trigger-indicator {
86
+ transform: rotate(90deg);
87
+ }
88
+
89
+ .calendar-year-picker__trigger[data-state="open"] .calendar-year-picker__trigger-heading {
90
+ @apply text-accent;
91
+ }
92
+
93
+ /* -----------------------------------------------------------------------------
94
+ * Year Grid Container
95
+ *
96
+ * Absolutely positioned over the day grid area. The exact `top` and `height`
97
+ * are set via JS to match the sibling day grid element.
98
+ * -------------------------------------------------------------------------- */
99
+ .calendar-year-picker__year-grid {
100
+ @apply pointer-events-none absolute right-0 left-0 grid content-start gap-1 overflow-y-auto p-1 opacity-0;
101
+ grid-template-columns: repeat(3, 1fr);
102
+
103
+ /* When closing: instant (no transition) */
104
+ will-change: opacity;
105
+
106
+ /* Custom scrollbar – small contained element, per Emil's guidelines */
107
+ scrollbar-width: thin;
108
+ scrollbar-color: oklch(0% 0 0 / 0.15) transparent;
109
+
110
+ &::-webkit-scrollbar {
111
+ width: 6px;
112
+ }
113
+
114
+ &::-webkit-scrollbar-track {
115
+ background: transparent;
116
+ }
117
+
118
+ &::-webkit-scrollbar-thumb {
119
+ background: oklch(0% 0 0 / 0.15);
120
+ border-radius: 3px;
121
+ }
122
+
123
+ &::-webkit-scrollbar-thumb:hover {
124
+ background: oklch(0% 0 0 / 0.25);
125
+ }
126
+
127
+ /* Dark mode scrollbar */
128
+ :is([data-theme="dark"], .dark) & {
129
+ scrollbar-color: oklch(100% 0 0 / 0.15) transparent;
130
+
131
+ &::-webkit-scrollbar-thumb {
132
+ background: oklch(100% 0 0 / 0.15);
133
+ }
134
+
135
+ &::-webkit-scrollbar-thumb:hover {
136
+ background: oklch(100% 0 0 / 0.25);
137
+ }
138
+ }
139
+ }
140
+
141
+ .calendar-year-picker__year-grid[data-state="open"] {
142
+ @apply pointer-events-auto opacity-100;
143
+
144
+ /* When opening: slight delay so the day grid starts fading out first */
145
+ transition: opacity 300ms var(--ease-out) 300ms;
146
+ @apply motion-reduce:transition-none;
147
+ }
148
+
149
+ /* -----------------------------------------------------------------------------
150
+ * Year Cell
151
+ * -------------------------------------------------------------------------- */
152
+ .calendar-year-picker__year-cell {
153
+ @apply relative inline-flex items-center justify-center rounded-full px-2.5 py-1.5 text-sm font-medium outline-none select-none no-highlight;
154
+ touch-action: manipulation;
155
+
156
+ /**
157
+ * Transitions – same as .tag
158
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
159
+ */
160
+ transition:
161
+ color 300ms var(--ease-smooth),
162
+ scale 300ms var(--ease-smooth),
163
+ opacity 300ms var(--ease-smooth),
164
+ background-color 300ms var(--ease-smooth),
165
+ box-shadow 300ms var(--ease-out);
166
+ @apply origin-center transform-gpu motion-reduce:transition-none;
167
+
168
+ cursor: var(--cursor-interactive);
169
+
170
+ /* Hover state (when not selected) – only on devices that support hover */
171
+ @media (hover: hover) and (pointer: fine) {
172
+ &:hover:not([data-state="checked"]) {
173
+ @apply bg-default text-default-foreground;
174
+ }
175
+ }
176
+
177
+ /* Selected state (current year) – same as .tag[data-selected] */
178
+ &[data-state="checked"],
179
+ &[aria-selected="true"] {
180
+ @apply bg-accent text-accent-foreground;
181
+
182
+ @media (hover: hover) and (pointer: fine) {
183
+ &:hover {
184
+ @apply bg-accent-hover;
185
+ }
186
+ }
187
+ }
188
+
189
+ /* Focus state */
190
+ &:focus-visible {
191
+ @apply status-focused;
192
+ }
193
+ }