@cdevhub/ngx-tw 0.2.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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
  4. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
  6. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
  7. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
  9. package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
  11. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
  13. package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
  15. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
  17. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
  18. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
  20. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
  22. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
  24. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
  26. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
  28. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
  30. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
  32. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
  34. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
  36. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
  38. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
  40. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
  42. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
  44. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
  45. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
  47. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
  49. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
  51. package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
  53. package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
  55. package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
  57. package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
  59. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
  60. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
  61. package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
  62. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
  63. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
  64. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
  65. package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
  66. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
  67. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
  68. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
  69. package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
  70. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
  71. package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
  72. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
  73. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
  74. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
  75. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
  76. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
  77. package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
  78. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
  79. package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
  80. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
  81. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
  82. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
  83. package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
  84. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
  85. package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
  86. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
  87. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
  88. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
  89. package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
  90. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
  91. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
  92. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
  93. package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
  94. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
  95. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
  96. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
  97. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
  98. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
  99. package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
  100. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
  101. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
  102. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
  103. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
  104. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
  105. package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
  106. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
  107. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
  108. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
  109. package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
  110. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
  111. package/package.json +265 -0
  112. package/theme/_base.css +394 -0
  113. package/theme/_dark.css +510 -0
  114. package/theme/_high-contrast.css +290 -0
  115. package/theme/_semantic.css +317 -0
  116. package/theme/_typography.css +9 -0
  117. package/theme/index.css +54 -0
  118. package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
  119. package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
  120. package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
  121. package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
  122. package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
  123. package/types/cdevhub-ngx-tw-button.d.ts +74 -0
  124. package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
  125. package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
  126. package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
  127. package/types/cdevhub-ngx-tw-card.d.ts +48 -0
  128. package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
  129. package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
  130. package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
  131. package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
  132. package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
  133. package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
  134. package/types/cdevhub-ngx-tw-core.d.ts +719 -0
  135. package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
  136. package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
  137. package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
  138. package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
  139. package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
  140. package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
  141. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
  142. package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
  143. package/types/cdevhub-ngx-tw-input.d.ts +110 -0
  144. package/types/cdevhub-ngx-tw-item.d.ts +70 -0
  145. package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
  146. package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
  147. package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
  148. package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
  149. package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
  150. package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
  151. package/types/cdevhub-ngx-tw-select.d.ts +384 -0
  152. package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
  153. package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
  154. package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
  155. package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
  156. package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
  157. package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
  158. package/types/cdevhub-ngx-tw-split.d.ts +265 -0
  159. package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
  160. package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
  161. package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
  162. package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
  163. package/types/cdevhub-ngx-tw-table.d.ts +479 -0
  164. package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
  165. package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
  166. package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
  167. package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
  168. package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
  169. package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
  170. package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
  171. package/types/cdevhub-ngx-tw.d.ts +49 -0
@@ -0,0 +1,290 @@
1
+ [data-theme="high-contrast"] {
2
+ /* ===== Surface ===== */
3
+ --color-surface: var(--color-white);
4
+ --color-surface-raised: var(--color-white);
5
+ --color-surface-overlay: var(--color-white);
6
+ --color-surface-sunken: var(--color-gray-100);
7
+ --color-surface-muted: var(--color-gray-50);
8
+
9
+ /* ===== Foreground ===== */
10
+ --color-fg: var(--color-black);
11
+ --color-fg-muted: var(--color-gray-800);
12
+ --color-fg-subtle: var(--color-gray-700);
13
+
14
+ /* ===== Border ===== */
15
+ --color-border: var(--color-gray-700);
16
+ --color-border-muted: var(--color-gray-500);
17
+ --color-border-strong: var(--color-black);
18
+
19
+ /* ===== Primary ===== */
20
+ --color-primary-50: var(--color-blue-100);
21
+ --color-primary-100: var(--color-blue-200);
22
+ --color-primary-200: var(--color-blue-300);
23
+ --color-primary-300: var(--color-blue-400);
24
+ --color-primary-400: var(--color-blue-500);
25
+ --color-primary-500: var(--color-blue-600);
26
+ --color-primary-600: var(--color-blue-700);
27
+ --color-primary-700: var(--color-blue-800);
28
+ --color-primary-800: var(--color-blue-900);
29
+ --color-primary-900: var(--color-blue-950);
30
+ --color-primary-950: var(--color-blue-950);
31
+
32
+ /* ===== Secondary ===== */
33
+ --color-secondary-50: var(--color-slate-100);
34
+ --color-secondary-100: var(--color-slate-200);
35
+ --color-secondary-200: var(--color-slate-300);
36
+ --color-secondary-300: var(--color-slate-400);
37
+ --color-secondary-400: var(--color-slate-500);
38
+ --color-secondary-500: var(--color-slate-600);
39
+ --color-secondary-600: var(--color-slate-700);
40
+ --color-secondary-700: var(--color-slate-800);
41
+ --color-secondary-800: var(--color-slate-900);
42
+ --color-secondary-900: var(--color-slate-950);
43
+ --color-secondary-950: var(--color-slate-950);
44
+
45
+ /* ===== Accent ===== */
46
+ --color-accent-50: var(--color-violet-100);
47
+ --color-accent-100: var(--color-violet-200);
48
+ --color-accent-200: var(--color-violet-300);
49
+ --color-accent-300: var(--color-violet-400);
50
+ --color-accent-400: var(--color-violet-500);
51
+ --color-accent-500: var(--color-violet-600);
52
+ --color-accent-600: var(--color-violet-700);
53
+ --color-accent-700: var(--color-violet-800);
54
+ --color-accent-800: var(--color-violet-900);
55
+ --color-accent-900: var(--color-violet-950);
56
+ --color-accent-950: var(--color-violet-950);
57
+
58
+ /* ===== Neutral ===== */
59
+ --color-neutral-50: var(--color-gray-100);
60
+ --color-neutral-100: var(--color-gray-200);
61
+ --color-neutral-200: var(--color-gray-300);
62
+ --color-neutral-300: var(--color-gray-400);
63
+ --color-neutral-400: var(--color-gray-500);
64
+ --color-neutral-500: var(--color-gray-600);
65
+ --color-neutral-600: var(--color-gray-700);
66
+ --color-neutral-700: var(--color-gray-800);
67
+ --color-neutral-800: var(--color-gray-900);
68
+ --color-neutral-900: var(--color-gray-950);
69
+ --color-neutral-950: var(--color-gray-950);
70
+
71
+ /* ===== Info ===== */
72
+ --color-info-50: var(--color-sky-100);
73
+ --color-info-100: var(--color-sky-200);
74
+ --color-info-200: var(--color-sky-300);
75
+ --color-info-300: var(--color-sky-400);
76
+ --color-info-400: var(--color-sky-500);
77
+ --color-info-500: var(--color-sky-600);
78
+ --color-info-600: var(--color-sky-700);
79
+ --color-info-700: var(--color-sky-800);
80
+ --color-info-800: var(--color-sky-900);
81
+ --color-info-900: var(--color-sky-950);
82
+ --color-info-950: var(--color-sky-950);
83
+
84
+ /* ===== Success ===== */
85
+ --color-success-50: var(--color-green-100);
86
+ --color-success-100: var(--color-green-200);
87
+ --color-success-200: var(--color-green-300);
88
+ --color-success-300: var(--color-green-400);
89
+ --color-success-400: var(--color-green-500);
90
+ --color-success-500: var(--color-green-600);
91
+ --color-success-600: var(--color-green-700);
92
+ --color-success-700: var(--color-green-800);
93
+ --color-success-800: var(--color-green-900);
94
+ --color-success-900: var(--color-green-950);
95
+ --color-success-950: var(--color-green-950);
96
+
97
+ /* ===== Warning ===== */
98
+ --color-warning-50: var(--color-amber-100);
99
+ --color-warning-100: var(--color-amber-200);
100
+ --color-warning-200: var(--color-amber-300);
101
+ --color-warning-300: var(--color-amber-400);
102
+ --color-warning-400: var(--color-amber-500);
103
+ --color-warning-500: var(--color-amber-600);
104
+ --color-warning-600: var(--color-amber-700);
105
+ --color-warning-700: var(--color-amber-800);
106
+ --color-warning-800: var(--color-amber-900);
107
+ --color-warning-900: var(--color-amber-950);
108
+ --color-warning-950: var(--color-amber-950);
109
+
110
+ /* ===== Error ===== */
111
+ --color-error-50: var(--color-red-100);
112
+ --color-error-100: var(--color-red-200);
113
+ --color-error-200: var(--color-red-300);
114
+ --color-error-300: var(--color-red-400);
115
+ --color-error-400: var(--color-red-500);
116
+ --color-error-500: var(--color-red-600);
117
+ --color-error-600: var(--color-red-700);
118
+ --color-error-700: var(--color-red-800);
119
+ --color-error-800: var(--color-red-900);
120
+ --color-error-900: var(--color-red-950);
121
+ --color-error-950: var(--color-red-950);
122
+
123
+ /* ===== Role slot tokens (high-contrast) =====
124
+ Every slot is redefined explicitly. -soft pairings target ≥ 7:1 (AAA),
125
+ -solid pairings target ≥ 7:1 with black-or-white foregrounds, and
126
+ -border-strong sticks to -700/-800 shades so 1px outlines remain visible
127
+ against -soft backgrounds. */
128
+
129
+ /* Primary */
130
+ --color-primary-soft: var(--color-blue-100);
131
+ --color-primary-soft-hover: var(--color-blue-200);
132
+ --color-primary-soft-fg: var(--color-blue-950);
133
+ --color-primary-soft-fg-muted: var(--color-blue-900);
134
+ --color-primary-solid: var(--color-blue-800);
135
+ --color-primary-solid-hover: var(--color-blue-900);
136
+ --color-primary-solid-fg: var(--color-white);
137
+ --color-primary-border: var(--color-blue-700);
138
+ --color-primary-border-strong: var(--color-blue-900);
139
+ --color-primary-fg: var(--color-blue-900);
140
+ --color-primary-icon: var(--color-blue-800);
141
+
142
+ /* Secondary */
143
+ --color-secondary-soft: var(--color-slate-100);
144
+ --color-secondary-soft-hover: var(--color-slate-200);
145
+ --color-secondary-soft-fg: var(--color-slate-950);
146
+ --color-secondary-soft-fg-muted: var(--color-slate-900);
147
+ --color-secondary-solid: var(--color-slate-900);
148
+ --color-secondary-solid-hover: var(--color-black);
149
+ --color-secondary-solid-fg: var(--color-white);
150
+ --color-secondary-border: var(--color-slate-700);
151
+ --color-secondary-border-strong: var(--color-slate-900);
152
+ --color-secondary-fg: var(--color-slate-900);
153
+ --color-secondary-icon: var(--color-slate-800);
154
+
155
+ /* Accent */
156
+ --color-accent-soft: var(--color-violet-100);
157
+ --color-accent-soft-hover: var(--color-violet-200);
158
+ --color-accent-soft-fg: var(--color-violet-950);
159
+ --color-accent-soft-fg-muted: var(--color-violet-900);
160
+ --color-accent-solid: var(--color-violet-800);
161
+ --color-accent-solid-hover: var(--color-violet-900);
162
+ --color-accent-solid-fg: var(--color-white);
163
+ --color-accent-border: var(--color-violet-700);
164
+ --color-accent-border-strong: var(--color-violet-900);
165
+ --color-accent-fg: var(--color-violet-900);
166
+ --color-accent-icon: var(--color-violet-800);
167
+
168
+ /* Neutral */
169
+ --color-neutral-soft: var(--color-surface-muted);
170
+ --color-neutral-soft-hover: var(--color-surface-sunken);
171
+ --color-neutral-soft-fg: var(--color-black);
172
+ --color-neutral-soft-fg-muted: var(--color-gray-800);
173
+ --color-neutral-solid: var(--color-black);
174
+ --color-neutral-solid-hover: var(--color-gray-800);
175
+ --color-neutral-solid-fg: var(--color-white);
176
+ --color-neutral-border: var(--color-gray-700);
177
+ --color-neutral-border-strong: var(--color-black);
178
+ --color-neutral-fg: var(--color-black);
179
+ --color-neutral-icon: var(--color-gray-800);
180
+
181
+ /* Info — high-contrast pushes sky toward black text on a deeper bg */
182
+ --color-info-soft: var(--color-sky-100);
183
+ --color-info-soft-hover: var(--color-sky-200);
184
+ --color-info-soft-fg: var(--color-sky-950);
185
+ --color-info-soft-fg-muted: var(--color-sky-900);
186
+ --color-info-solid: var(--color-sky-800);
187
+ --color-info-solid-hover: var(--color-sky-900);
188
+ --color-info-solid-fg: var(--color-white);
189
+ --color-info-border: var(--color-sky-700);
190
+ --color-info-border-strong: var(--color-sky-900);
191
+ --color-info-fg: var(--color-sky-900);
192
+ --color-info-icon: var(--color-sky-800);
193
+
194
+ /* Success */
195
+ --color-success-soft: var(--color-green-100);
196
+ --color-success-soft-hover: var(--color-green-200);
197
+ --color-success-soft-fg: var(--color-green-950);
198
+ --color-success-soft-fg-muted: var(--color-green-900);
199
+ --color-success-solid: var(--color-green-800);
200
+ --color-success-solid-hover: var(--color-green-900);
201
+ --color-success-solid-fg: var(--color-white);
202
+ --color-success-border: var(--color-green-700);
203
+ --color-success-border-strong: var(--color-green-900);
204
+ --color-success-fg: var(--color-green-900);
205
+ --color-success-icon: var(--color-green-800);
206
+
207
+ /* Warning — amber stays dark-text-on-yellow */
208
+ --color-warning-soft: var(--color-amber-100);
209
+ --color-warning-soft-hover: var(--color-amber-200);
210
+ --color-warning-soft-fg: var(--color-amber-950);
211
+ --color-warning-soft-fg-muted: var(--color-amber-900);
212
+ --color-warning-solid: var(--color-amber-400);
213
+ --color-warning-solid-hover: var(--color-amber-500);
214
+ --color-warning-solid-fg: var(--color-amber-950);
215
+ --color-warning-border: var(--color-amber-700);
216
+ --color-warning-border-strong: var(--color-amber-900);
217
+ --color-warning-fg: var(--color-amber-900);
218
+ --color-warning-icon: var(--color-amber-800);
219
+
220
+ /* Error */
221
+ --color-error-soft: var(--color-red-100);
222
+ --color-error-soft-hover: var(--color-red-200);
223
+ --color-error-soft-fg: var(--color-red-950);
224
+ --color-error-soft-fg-muted: var(--color-red-900);
225
+ --color-error-solid: var(--color-red-800);
226
+ --color-error-solid-hover: var(--color-red-900);
227
+ --color-error-solid-fg: var(--color-white);
228
+ --color-error-border: var(--color-red-700);
229
+ --color-error-border-strong: var(--color-red-900);
230
+ --color-error-fg: var(--color-red-900);
231
+ --color-error-icon: var(--color-red-800);
232
+
233
+ /* ===== Legacy on-role aliases (high-contrast) ===== */
234
+ --color-on-info: var(--color-info-solid-fg);
235
+ --color-on-success: var(--color-success-solid-fg);
236
+ --color-on-warning: var(--color-warning-solid-fg);
237
+ --color-on-error: var(--color-error-solid-fg);
238
+ --color-on-primary: var(--color-primary-solid-fg);
239
+ --color-on-secondary: var(--color-secondary-solid-fg);
240
+ --color-on-accent: var(--color-accent-solid-fg);
241
+ --color-on-neutral: var(--color-neutral-solid-fg);
242
+ }
243
+
244
+ /* ===== Windows / forced-colors mode =====
245
+ When the OS enables forced-colors (Windows High Contrast, some Linux a11y
246
+ profiles), the user agent replaces all author colors with system keywords
247
+ (`Canvas`, `CanvasText`, `Highlight`, `GrayText`, etc.). We remap the
248
+ library's structural tokens to the matching system colors so components
249
+ keep their semantic shape, and disable `forced-color-adjust` on interactive
250
+ affordances so the browser applies system colors uniformly. */
251
+ @media (forced-colors: active) {
252
+ :root,
253
+ [data-theme="light"],
254
+ [data-theme="dark"],
255
+ [data-theme="high-contrast"] {
256
+ /* Surfaces collapse to the system canvas. */
257
+ --color-surface: Canvas;
258
+ --color-surface-raised: Canvas;
259
+ --color-surface-overlay: Canvas;
260
+ --color-surface-sunken: Canvas;
261
+ --color-surface-muted: Canvas;
262
+
263
+ /* Foregrounds and borders take system text colors. */
264
+ --color-fg: CanvasText;
265
+ --color-fg-muted: CanvasText;
266
+ --color-fg-subtle: GrayText;
267
+ --color-border: CanvasText;
268
+ --color-border-muted: GrayText;
269
+ --color-border-strong: CanvasText;
270
+
271
+ /* Focus / selection accents take the system Highlight color so focus
272
+ rings remain visible in Windows High Contrast. */
273
+ --color-primary-500: Highlight;
274
+ }
275
+
276
+ /* Interactive affordances opt out of the forced palette so the system
277
+ colors apply uniformly across roles, borders, and backgrounds. */
278
+ button,
279
+ [role="button"],
280
+ input,
281
+ select,
282
+ textarea,
283
+ [role="menuitem"],
284
+ [role="menuitemcheckbox"],
285
+ [role="menuitemradio"],
286
+ [role="option"],
287
+ [role="tab"] {
288
+ forced-color-adjust: none;
289
+ }
290
+ }
@@ -0,0 +1,317 @@
1
+ @theme {
2
+ /* ===== Surface (backgrounds) ===== */
3
+ --color-surface: var(--color-white);
4
+ --color-surface-raised: var(--color-white);
5
+ --color-surface-overlay: var(--color-white);
6
+ --color-surface-sunken: var(--color-gray-50);
7
+ --color-surface-muted: var(--color-gray-100);
8
+
9
+ /* ===== Overlay controls =====
10
+ Translucent dark backgrounds for floating chrome that sits over arbitrary
11
+ consumer content (carousel pause control, indicator capsule). The token
12
+ ships as a fixed `oklch(0 0 0 / 0.4)` rather than a `var(--color-gray-*)`
13
+ because the contrast contract is against the *content underneath*, not
14
+ against `--color-surface` — flipping to white on dark would defeat the
15
+ purpose. Tailwind v4 auto-generates the matching `bg-overlay-control{,-hover}`
16
+ utilities from these `--color-{name}` pairs. */
17
+ --color-overlay-control: oklch(0 0 0 / 0.4);
18
+ --color-overlay-control-hover: oklch(0 0 0 / 0.6);
19
+
20
+ /* ===== Foreground (text/icons) ===== */
21
+ --color-fg: var(--color-gray-900);
22
+ --color-fg-muted: var(--color-gray-600);
23
+ --color-fg-subtle: var(--color-gray-500);
24
+
25
+ /* ===== Border ===== */
26
+ --color-border: var(--color-gray-300);
27
+ --color-border-muted: var(--color-gray-200);
28
+ --color-border-strong: var(--color-gray-400);
29
+
30
+ /* ===== Table sticky shadows =====
31
+ Hairline 1px shadows used to separate sticky table chrome from scrolled
32
+ content. Each value resolves through `--color-border` so the same token
33
+ auto-adapts to dark mode. Tailwind v4 auto-generates the matching
34
+ `shadow-table-sticky*` utilities from these `--shadow-{name}` pairs. */
35
+ --shadow-table-sticky: 0 1px 0 0 var(--color-border);
36
+ --shadow-table-sticky-cell-start: 1px 0 0 0 var(--color-border);
37
+ --shadow-table-sticky-cell-end: -1px 0 0 0 var(--color-border);
38
+
39
+ /* ===== Calendar widths =====
40
+ Pinned per size so month / year / multi-year views share the same footprint
41
+ across view transitions. Each value is roughly `cell-size × 7 + gutters`. */
42
+ --width-calendar-xs: 210px;
43
+ --width-calendar-sm: 240px;
44
+ --width-calendar-md: 292px;
45
+ --width-calendar-lg: 320px;
46
+ --width-calendar-xl: 376px;
47
+
48
+ /* ===== Extra-small typography =====
49
+ Used for xs-density secondary text (xs descriptions, calendar cell labels,
50
+ keyboard hints). Sits one step below Tailwind's `text-xs` (0.75rem).
51
+ Tailwind v4 auto-generates the `text-2xs` utility from this `--text-{name}`
52
+ pair (font-size + line-height) per its theme-token convention. */
53
+ --text-2xs: 0.6875rem;
54
+ --text-2xs--line-height: 1rem;
55
+
56
+ /* ===== Primary ===== */
57
+ --color-primary-50: var(--color-blue-50);
58
+ --color-primary-100: var(--color-blue-100);
59
+ --color-primary-200: var(--color-blue-200);
60
+ --color-primary-300: var(--color-blue-300);
61
+ --color-primary-400: var(--color-blue-400);
62
+ --color-primary-500: var(--color-blue-500);
63
+ --color-primary-600: var(--color-blue-600);
64
+ --color-primary-700: var(--color-blue-700);
65
+ --color-primary-800: var(--color-blue-800);
66
+ --color-primary-900: var(--color-blue-900);
67
+ --color-primary-950: var(--color-blue-950);
68
+
69
+ /* ===== Secondary ===== */
70
+ --color-secondary-50: var(--color-slate-50);
71
+ --color-secondary-100: var(--color-slate-100);
72
+ --color-secondary-200: var(--color-slate-200);
73
+ --color-secondary-300: var(--color-slate-300);
74
+ --color-secondary-400: var(--color-slate-400);
75
+ --color-secondary-500: var(--color-slate-500);
76
+ --color-secondary-600: var(--color-slate-600);
77
+ --color-secondary-700: var(--color-slate-700);
78
+ --color-secondary-800: var(--color-slate-800);
79
+ --color-secondary-900: var(--color-slate-900);
80
+ --color-secondary-950: var(--color-slate-950);
81
+
82
+ /* ===== Accent ===== */
83
+ --color-accent-50: var(--color-violet-50);
84
+ --color-accent-100: var(--color-violet-100);
85
+ --color-accent-200: var(--color-violet-200);
86
+ --color-accent-300: var(--color-violet-300);
87
+ --color-accent-400: var(--color-violet-400);
88
+ --color-accent-500: var(--color-violet-500);
89
+ --color-accent-600: var(--color-violet-600);
90
+ --color-accent-700: var(--color-violet-700);
91
+ --color-accent-800: var(--color-violet-800);
92
+ --color-accent-900: var(--color-violet-900);
93
+ --color-accent-950: var(--color-violet-950);
94
+
95
+ /* ===== Neutral ===== */
96
+ --color-neutral-50: var(--color-gray-50);
97
+ --color-neutral-100: var(--color-gray-100);
98
+ --color-neutral-200: var(--color-gray-200);
99
+ --color-neutral-300: var(--color-gray-300);
100
+ --color-neutral-400: var(--color-gray-400);
101
+ --color-neutral-500: var(--color-gray-500);
102
+ --color-neutral-600: var(--color-gray-600);
103
+ --color-neutral-700: var(--color-gray-700);
104
+ --color-neutral-800: var(--color-gray-800);
105
+ --color-neutral-900: var(--color-gray-900);
106
+ --color-neutral-950: var(--color-gray-950);
107
+
108
+ /* ===== Info ===== */
109
+ --color-info-50: var(--color-sky-50);
110
+ --color-info-100: var(--color-sky-100);
111
+ --color-info-200: var(--color-sky-200);
112
+ --color-info-300: var(--color-sky-300);
113
+ --color-info-400: var(--color-sky-400);
114
+ --color-info-500: var(--color-sky-500);
115
+ --color-info-600: var(--color-sky-600);
116
+ --color-info-700: var(--color-sky-700);
117
+ --color-info-800: var(--color-sky-800);
118
+ --color-info-900: var(--color-sky-900);
119
+ --color-info-950: var(--color-sky-950);
120
+
121
+ /* ===== Success ===== */
122
+ --color-success-50: var(--color-green-50);
123
+ --color-success-100: var(--color-green-100);
124
+ --color-success-200: var(--color-green-200);
125
+ --color-success-300: var(--color-green-300);
126
+ --color-success-400: var(--color-green-400);
127
+ --color-success-500: var(--color-green-500);
128
+ --color-success-600: var(--color-green-600);
129
+ --color-success-700: var(--color-green-700);
130
+ --color-success-800: var(--color-green-800);
131
+ --color-success-900: var(--color-green-900);
132
+ --color-success-950: var(--color-green-950);
133
+
134
+ /* ===== Warning ===== */
135
+ --color-warning-50: var(--color-amber-50);
136
+ --color-warning-100: var(--color-amber-100);
137
+ --color-warning-200: var(--color-amber-200);
138
+ --color-warning-300: var(--color-amber-300);
139
+ --color-warning-400: var(--color-amber-400);
140
+ --color-warning-500: var(--color-amber-500);
141
+ --color-warning-600: var(--color-amber-600);
142
+ --color-warning-700: var(--color-amber-700);
143
+ --color-warning-800: var(--color-amber-800);
144
+ --color-warning-900: var(--color-amber-900);
145
+ --color-warning-950: var(--color-amber-950);
146
+
147
+ /* ===== Error ===== */
148
+ --color-error-50: var(--color-red-50);
149
+ --color-error-100: var(--color-red-100);
150
+ --color-error-200: var(--color-red-200);
151
+ --color-error-300: var(--color-red-300);
152
+ --color-error-400: var(--color-red-400);
153
+ --color-error-500: var(--color-red-500);
154
+ --color-error-600: var(--color-red-600);
155
+ --color-error-700: var(--color-red-700);
156
+ --color-error-800: var(--color-red-800);
157
+ --color-error-900: var(--color-red-900);
158
+ --color-error-950: var(--color-red-950);
159
+
160
+ /* ===== Role slot tokens =====
161
+ Per-role semantic slots picked to meet WCAG AA at each pairing. Components
162
+ consume these slots directly (`bg-info-soft text-info-soft-fg`) and never
163
+ pick `{role}-{shade}` values themselves — that keeps contrast deliberate
164
+ and removes the need for `dark:` overrides on a per-component basis. Dark
165
+ and high-contrast themes redefine the same slots in their respective
166
+ files; the `{role}-{shade}` scale below is preserved for consumer escape
167
+ hatches but is no longer the recommended surface.
168
+
169
+ Slot semantics:
170
+ -soft soft variant background (low chroma)
171
+ -soft-hover soft variant background on hover/focus
172
+ -soft-fg title-strength text on -soft
173
+ -soft-fg-muted body text on -soft (AA body)
174
+ -solid solid variant background (high chroma)
175
+ -solid-hover solid variant background on hover/focus
176
+ -solid-fg text on -solid (AA body)
177
+ -border subtle border (outline variant, dividers)
178
+ -border-strong accent border (indicators, rings)
179
+ -fg colored text on neutral surface (tab labels, links)
180
+ -icon icon tint on -soft / surface contexts
181
+
182
+ Light-mode contrast notes (sRGB, against the slot it pairs with):
183
+ sky-50 ↔ sky-900 ≈ 13.7:1 ✓ AA
184
+ sky-50 ↔ sky-800 ≈ 9.4:1 ✓ AA
185
+ sky-600 ↔ white ≈ 4.7:1 ✓ AA body
186
+ sky-700 ↔ white ≈ 5.9:1 ✓ AA body (info-fg on surface)
187
+ green-700 ↔ white ≈ 4.7:1 ✓ AA body (success-solid; -600 fails at 3.3:1)
188
+ amber-500 ↔ amber-950 ≈ 8.5:1 ✓ AA (warning keeps dark-on-yellow signage)
189
+ amber-800 ↔ white ≈ 6.5:1 ✓ AA body (warning-fg; -700 fails at 3.4:1)
190
+ red-600 ↔ white ≈ 5.0:1 ✓ AA body
191
+ blue-600 ↔ white ≈ 6.0:1 ✓ AA body
192
+ violet-600 ↔ white ≈ 6.7:1 ✓ AA body
193
+ slate-700 ↔ white ≈ 9.1:1 ✓ AA body
194
+ */
195
+
196
+ /* ----- Primary (blue) ----- */
197
+ --color-primary-soft: var(--color-primary-50);
198
+ --color-primary-soft-hover: var(--color-primary-100);
199
+ --color-primary-soft-fg: var(--color-primary-900);
200
+ --color-primary-soft-fg-muted: var(--color-primary-800);
201
+ --color-primary-solid: var(--color-primary-600);
202
+ --color-primary-solid-hover: var(--color-primary-700);
203
+ --color-primary-solid-fg: var(--color-white);
204
+ --color-primary-border: var(--color-primary-300);
205
+ --color-primary-border-strong: var(--color-primary-500);
206
+ --color-primary-fg: var(--color-primary-700);
207
+ --color-primary-icon: var(--color-primary-600);
208
+
209
+ /* ----- Secondary (slate) ----- */
210
+ --color-secondary-soft: var(--color-secondary-50);
211
+ --color-secondary-soft-hover: var(--color-secondary-100);
212
+ --color-secondary-soft-fg: var(--color-secondary-900);
213
+ --color-secondary-soft-fg-muted: var(--color-secondary-800);
214
+ --color-secondary-solid: var(--color-secondary-700);
215
+ --color-secondary-solid-hover: var(--color-secondary-800);
216
+ --color-secondary-solid-fg: var(--color-white);
217
+ --color-secondary-border: var(--color-secondary-300);
218
+ --color-secondary-border-strong: var(--color-secondary-500);
219
+ --color-secondary-fg: var(--color-secondary-700);
220
+ --color-secondary-icon: var(--color-secondary-600);
221
+
222
+ /* ----- Accent (violet) ----- */
223
+ --color-accent-soft: var(--color-accent-50);
224
+ --color-accent-soft-hover: var(--color-accent-100);
225
+ --color-accent-soft-fg: var(--color-accent-900);
226
+ --color-accent-soft-fg-muted: var(--color-accent-800);
227
+ --color-accent-solid: var(--color-accent-600);
228
+ --color-accent-solid-hover: var(--color-accent-700);
229
+ --color-accent-solid-fg: var(--color-white);
230
+ --color-accent-border: var(--color-accent-300);
231
+ --color-accent-border-strong: var(--color-accent-500);
232
+ --color-accent-fg: var(--color-accent-700);
233
+ --color-accent-icon: var(--color-accent-600);
234
+
235
+ /* ----- Neutral ----- (uses surface/fg tokens so dark mode is automatic) */
236
+ --color-neutral-soft: var(--color-surface-muted);
237
+ --color-neutral-soft-hover: var(--color-surface-sunken);
238
+ --color-neutral-soft-fg: var(--color-fg);
239
+ --color-neutral-soft-fg-muted: var(--color-fg-muted);
240
+ --color-neutral-solid: var(--color-fg);
241
+ --color-neutral-solid-hover: var(--color-gray-700);
242
+ --color-neutral-solid-fg: var(--color-surface);
243
+ --color-neutral-border: var(--color-border);
244
+ --color-neutral-border-strong: var(--color-border-strong);
245
+ --color-neutral-fg: var(--color-fg);
246
+ --color-neutral-icon: var(--color-fg-muted);
247
+
248
+ /* ----- Info (sky) ----- */
249
+ --color-info-soft: var(--color-info-50);
250
+ --color-info-soft-hover: var(--color-info-100);
251
+ --color-info-soft-fg: var(--color-info-900);
252
+ --color-info-soft-fg-muted: var(--color-info-800);
253
+ --color-info-solid: var(--color-info-600);
254
+ --color-info-solid-hover: var(--color-info-700);
255
+ --color-info-solid-fg: var(--color-white);
256
+ --color-info-border: var(--color-info-300);
257
+ --color-info-border-strong: var(--color-info-500);
258
+ --color-info-fg: var(--color-info-700);
259
+ --color-info-icon: var(--color-info-600);
260
+
261
+ /* ----- Success (green) ----- */
262
+ --color-success-soft: var(--color-success-50);
263
+ --color-success-soft-hover: var(--color-success-100);
264
+ --color-success-soft-fg: var(--color-success-900);
265
+ --color-success-soft-fg-muted: var(--color-success-800);
266
+ /* Solid uses -700 not -600: green-600/white is 3.3:1 (AA fail). -700/white is 4.7:1. */
267
+ --color-success-solid: var(--color-success-700);
268
+ --color-success-solid-hover: var(--color-success-800);
269
+ --color-success-solid-fg: var(--color-white);
270
+ --color-success-border: var(--color-success-300);
271
+ --color-success-border-strong: var(--color-success-500);
272
+ --color-success-fg: var(--color-success-700);
273
+ --color-success-icon: var(--color-success-600);
274
+
275
+ /* ----- Warning (amber) ----- */
276
+ /* Warning is the only role that keeps dark text on a saturated yellow fill —
277
+ yellow signage convention. amber-500 + amber-950 = 8.5:1 ✓. */
278
+ --color-warning-soft: var(--color-warning-50);
279
+ --color-warning-soft-hover: var(--color-warning-100);
280
+ --color-warning-soft-fg: var(--color-warning-900);
281
+ --color-warning-soft-fg-muted: var(--color-warning-800);
282
+ --color-warning-solid: var(--color-warning-500);
283
+ --color-warning-solid-hover: var(--color-warning-600);
284
+ --color-warning-solid-fg: var(--color-warning-950);
285
+ --color-warning-border: var(--color-warning-300);
286
+ --color-warning-border-strong: var(--color-warning-500);
287
+ /* -fg uses -800: amber-700/white is 3.4:1 (AA fail). amber-800/white is 6.5:1. */
288
+ --color-warning-fg: var(--color-warning-800);
289
+ --color-warning-icon: var(--color-warning-600);
290
+
291
+ /* ----- Error (red) ----- */
292
+ --color-error-soft: var(--color-error-50);
293
+ --color-error-soft-hover: var(--color-error-100);
294
+ --color-error-soft-fg: var(--color-error-900);
295
+ --color-error-soft-fg-muted: var(--color-error-800);
296
+ --color-error-solid: var(--color-error-600);
297
+ --color-error-solid-hover: var(--color-error-700);
298
+ --color-error-solid-fg: var(--color-white);
299
+ --color-error-border: var(--color-error-300);
300
+ --color-error-border-strong: var(--color-error-500);
301
+ --color-error-fg: var(--color-error-700);
302
+ --color-error-icon: var(--color-error-600);
303
+
304
+ /* ===== Legacy on-role aliases =====
305
+ `--color-on-{role}` is preserved as an alias of `--color-{role}-solid-fg`
306
+ for components still on the pre-slot API (calendar-cell, stepper, etc.).
307
+ New code MUST use the slot tokens. Remove this block once every consumer
308
+ in the library has migrated. */
309
+ --color-on-info: var(--color-info-solid-fg);
310
+ --color-on-success: var(--color-success-solid-fg);
311
+ --color-on-warning: var(--color-warning-solid-fg);
312
+ --color-on-error: var(--color-error-solid-fg);
313
+ --color-on-primary: var(--color-primary-solid-fg);
314
+ --color-on-secondary: var(--color-secondary-solid-fg);
315
+ --color-on-accent: var(--color-accent-solid-fg);
316
+ --color-on-neutral: var(--color-neutral-solid-fg);
317
+ }
@@ -0,0 +1,9 @@
1
+ @theme {
2
+ /* ===== Typography ===== */
3
+ --font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
4
+ --font-mono: 'JetBrains Mono', ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace;
5
+
6
+ /* ===== Animation durations ===== */
7
+ --duration-fast: 150ms;
8
+ --duration-normal: 200ms;
9
+ }
@@ -0,0 +1,54 @@
1
+ @import "tailwindcss";
2
+
3
+ /* ===== Dark variant binding =====
4
+ Re-binds Tailwind's `dark:` variant so it activates on the same condition
5
+ that flips the semantic tokens in `_dark.css`:
6
+ 1. an explicit `[data-theme="dark"]` ancestor, OR
7
+ 2. `prefers-color-scheme: dark` AND no explicit `data-theme` opt-out.
8
+
9
+ Without this binding `dark:` defaults to `@media (prefers-color-scheme: dark)`,
10
+ which drifts from the `[data-theme="dark"]` selector — producing inverted
11
+ token state but un-inverted dark utilities (or vice versa) whenever OS
12
+ preference disagrees with the consumer's chosen theme. Keep this rule in
13
+ lock-step with the activation predicates in `_dark.css`. */
14
+ @custom-variant dark {
15
+ &:where([data-theme="dark"], [data-theme="dark"] *) {
16
+ @slot;
17
+ }
18
+ @media (prefers-color-scheme: dark) {
19
+ &:where(
20
+ :root:not([data-theme="light"]):not([data-theme="high-contrast"]),
21
+ :root:not([data-theme="light"]):not([data-theme="high-contrast"]) *
22
+ ) {
23
+ @slot;
24
+ }
25
+ }
26
+ }
27
+
28
+ /* Scan library source for Tailwind class usage */
29
+ @source "../src/**/*.ts";
30
+
31
+ /* ===== Slot-token utility safelist =====
32
+ Components consume role slot utilities (`bg-info-soft`, `text-info-fg`, …)
33
+ that are often assembled from template literals (`bg-${role}-soft`).
34
+ Tailwind v4's heuristic scanner only picks up literal class names, so we
35
+ enumerate every role × slot combination here. Touch this list when a new
36
+ role is introduced or a new slot is added to `_semantic.css`. */
37
+ @source inline("{,hover:}bg-{primary,secondary,accent,neutral,info,success,warning,error}-{soft,soft-hover,solid,solid-hover}");
38
+ @source inline("text-{primary,secondary,accent,neutral,info,success,warning,error}-{soft-fg,soft-fg-muted,solid-fg,fg,icon}");
39
+ @source inline("text-{primary,secondary,accent,neutral,info,success,warning,error}-solid-fg/80");
40
+ @source inline("border-{primary,secondary,accent,neutral,info,success,warning,error}-{border,border-strong}");
41
+ @source inline("ring-{primary,secondary,accent,neutral,info,success,warning,error}-{border,border-strong}");
42
+
43
+ /* Font stacks + animation duration tokens (Tailwind v4 `@theme` extensions) */
44
+ @import "./_typography.css";
45
+
46
+ /* Semantic token definitions */
47
+ @import "./_semantic.css";
48
+
49
+ /* Theme overrides */
50
+ @import "./_dark.css";
51
+ @import "./_high-contrast.css";
52
+
53
+ /* Base/reset */
54
+ @import "./_base.css";