@clicktap/ui 0.41.0 → 0.42.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 (238) hide show
  1. package/components/Accordion/Accordion.js +1 -1
  2. package/components/Accordion.d.ts +1 -0
  3. package/components/Accordion.js +1 -0
  4. package/components/AssetRenderer/renderers/DownloadLink.d.ts +1 -1
  5. package/components/AssetRenderer/renderers.d.ts +1 -0
  6. package/components/AssetRenderer/renderers.js +1 -0
  7. package/components/AssetRenderer.d.ts +1 -0
  8. package/components/AssetRenderer.js +1 -0
  9. package/components/Avatar/Avatar.js +1 -1
  10. package/components/Avatar.d.ts +1 -0
  11. package/components/Avatar.js +1 -0
  12. package/components/Badge/Badge.js +1 -1
  13. package/components/Badge.d.ts +1 -0
  14. package/components/Badge.js +1 -0
  15. package/components/Breadcrumbs/BreadcrumbLink.js +1 -1
  16. package/components/Breadcrumbs.d.ts +1 -0
  17. package/components/Breadcrumbs.js +1 -0
  18. package/components/Button/Button.js +1 -1
  19. package/components/Button/ButtonLoadingContent.js +1 -1
  20. package/components/Button/index.js +1 -1
  21. package/components/Button.d.ts +1 -0
  22. package/components/Button.js +1 -0
  23. package/components/Card.d.ts +1 -0
  24. package/components/Card.js +1 -0
  25. package/components/Checkbox/Checkbox.js +1 -1
  26. package/components/Checkbox.d.ts +1 -0
  27. package/components/Checkbox.js +1 -0
  28. package/components/Collapsible.d.ts +1 -0
  29. package/components/Collapsible.js +1 -0
  30. package/components/Collection/AttributeDataProvider.d.ts +1 -0
  31. package/components/Collection/AttributeDataProvider.js +1 -0
  32. package/components/Collection/CollectionFilterChips/CollectionFilterChips.js +1 -1
  33. package/components/Collection/CollectionFilterChips/index.js +1 -1
  34. package/components/Collection/CollectionFilterChips.d.ts +1 -0
  35. package/components/Collection/CollectionFilterChips.js +1 -0
  36. package/components/Collection/CollectionFilters/CollectionFilters.js +1 -1
  37. package/components/Collection/CollectionFilters/index.js +1 -1
  38. package/components/Collection/CollectionFilters.d.ts +1 -0
  39. package/components/Collection/CollectionFilters.js +1 -0
  40. package/components/Collection/CollectionToolbar/CollectionToolbar.js +1 -1
  41. package/components/Collection/CollectionToolbar/index.js +1 -1
  42. package/components/Collection/CollectionToolbar.d.ts +1 -0
  43. package/components/Collection/CollectionToolbar.js +1 -0
  44. package/components/Collection/EmptyResults/EmptyResults.js +1 -1
  45. package/components/Collection/EmptyResults.d.ts +1 -0
  46. package/components/Collection/EmptyResults.js +1 -0
  47. package/components/Collection/FilterAccordionTitle/FilterAccordionTitle.js +1 -1
  48. package/components/Collection/FilterAccordionTitle.d.ts +1 -0
  49. package/components/Collection/FilterAccordionTitle.js +1 -0
  50. package/components/Collection/FilterRenderer/Renderer/Boolean.js +1 -1
  51. package/components/Collection/FilterRenderer/Renderer/Option.js +1 -1
  52. package/components/Collection/FilterRenderer/Renderer/Range.js +1 -1
  53. package/components/Collection/FilterRenderer/Renderer/Swatch/SwatchColor.js +1 -1
  54. package/components/Collection/FilterRenderer/Renderer/Swatch/SwatchImage.js +1 -1
  55. package/components/Collection/FilterRenderer/Renderer/Swatch/SwatchText.js +1 -1
  56. package/components/Collection/FilterRenderer/Renderer.d.ts +1 -0
  57. package/components/Collection/FilterRenderer/Renderer.js +1 -0
  58. package/components/Collection/FilterRenderer.d.ts +1 -0
  59. package/components/Collection/FilterRenderer.js +1 -0
  60. package/components/Collection/ProductCardSwatches/ProductCardSwatches.js +1 -1
  61. package/components/Collection/ProductCardSwatches.d.ts +1 -0
  62. package/components/Collection/ProductCardSwatches.js +1 -0
  63. package/components/Collection/ProductPrice.d.ts +1 -0
  64. package/components/Collection/ProductPrice.js +1 -0
  65. package/components/Collection/index.js +1 -1
  66. package/components/Collection.d.ts +1 -0
  67. package/components/Collection.js +1 -0
  68. package/components/Container.d.ts +1 -0
  69. package/components/Container.js +1 -0
  70. package/components/ContextMenu/ContextMenu.js +1 -1
  71. package/components/ContextMenu.d.ts +1 -0
  72. package/components/ContextMenu.js +1 -0
  73. package/components/CreditCardExpirationInput/CreditCardExpirationInput.js +1 -1
  74. package/components/CreditCardExpirationInput.d.ts +1 -0
  75. package/components/CreditCardExpirationInput.js +1 -0
  76. package/components/CreditCardInput/CreditCardInput.js +1 -1
  77. package/components/CreditCardInput.d.ts +1 -0
  78. package/components/CreditCardInput.js +1 -0
  79. package/components/DateInput/DateInput.js +1 -1
  80. package/components/DateInput.d.ts +1 -0
  81. package/components/DateInput.js +1 -0
  82. package/components/DateTimeFormat/DateTimeFormat.d.ts +1 -1
  83. package/components/DateTimeFormat.d.ts +1 -0
  84. package/components/DateTimeFormat.js +1 -0
  85. package/components/Dialog/Dialog.js +1 -1
  86. package/components/Dialog.d.ts +1 -0
  87. package/components/Dialog.js +1 -0
  88. package/components/DialogTrigger.d.ts +1 -0
  89. package/components/DialogTrigger.js +1 -0
  90. package/components/Divider.d.ts +1 -0
  91. package/components/Divider.js +1 -0
  92. package/components/DobInput/DobInput.js +1 -1
  93. package/components/DobInput.d.ts +1 -0
  94. package/components/DobInput.js +1 -0
  95. package/components/Drawer/Drawer.js +1 -1
  96. package/components/Drawer.d.ts +1 -0
  97. package/components/Drawer.js +1 -0
  98. package/components/FeatureGate/AccessDenied.d.ts +2 -2
  99. package/components/FeatureGate/AccessDenied.js +1 -1
  100. package/components/FeatureGate/FeatureGate.d.ts +1 -1
  101. package/components/FeatureGate/FeatureGate.js +1 -1
  102. package/components/FeatureGate/PermissionRequired.d.ts +1 -1
  103. package/components/FeatureGate/PermissionRequired.js +1 -1
  104. package/components/FeatureGate/UpgradePrompt.d.ts +1 -1
  105. package/components/FeatureGate/UpgradePrompt.js +1 -1
  106. package/components/Icon/NoEntryIcon.js +1 -1
  107. package/components/Icon/StarIcon.js +1 -1
  108. package/components/Icon.d.ts +1 -0
  109. package/components/Icon.js +1 -0
  110. package/components/Image/Image.d.ts +44 -3
  111. package/components/Image/Image.js +1 -1
  112. package/components/Image/ImageContext.d.ts +30 -0
  113. package/components/Image/ImageContext.js +1 -0
  114. package/components/Image/imageShared.d.ts +74 -0
  115. package/components/Image/imageShared.js +1 -0
  116. package/components/Image/index.d.ts +3 -1
  117. package/components/Image/index.js +1 -1
  118. package/components/Image.d.ts +1 -0
  119. package/components/Image.js +1 -0
  120. package/components/Input/Input.js +1 -1
  121. package/components/Input.d.ts +1 -0
  122. package/components/Input.js +1 -0
  123. package/components/Link/Link.js +1 -1
  124. package/components/Link.d.ts +1 -0
  125. package/components/Link.js +1 -0
  126. package/components/LinkAsButton/LinkAsButton.js +1 -1
  127. package/components/LinkAsButton/index.js +1 -1
  128. package/components/LinkAsButton.d.ts +1 -0
  129. package/components/LinkAsButton.js +1 -0
  130. package/components/Loader/CircularEasing.js +1 -1
  131. package/components/Loader/Pulse.js +1 -1
  132. package/components/Loader/index.js +1 -1
  133. package/components/Loader.d.ts +1 -0
  134. package/components/Loader.js +1 -0
  135. package/components/Menu.d.ts +1 -0
  136. package/components/Menu.js +1 -0
  137. package/components/Meter/Meter.js +1 -1
  138. package/components/Meter.d.ts +1 -0
  139. package/components/Meter.js +1 -0
  140. package/components/Modal.d.ts +1 -0
  141. package/components/Modal.js +1 -0
  142. package/components/ModalOverlay.d.ts +1 -0
  143. package/components/ModalOverlay.js +1 -0
  144. package/components/NumberFormat/NumberFormat.d.ts +1 -1
  145. package/components/NumberFormat.d.ts +1 -0
  146. package/components/NumberFormat.js +1 -0
  147. package/components/NumberInput/NumberInput.js +1 -1
  148. package/components/NumberInput.d.ts +1 -0
  149. package/components/NumberInput.js +1 -0
  150. package/components/NumberTicker.d.ts +1 -0
  151. package/components/NumberTicker.js +1 -0
  152. package/components/Pagination/Pagination.js +1 -1
  153. package/components/Pagination.d.ts +1 -0
  154. package/components/Pagination.js +1 -0
  155. package/components/PasswordCheck/PasswordCheck.js +1 -1
  156. package/components/PasswordCheck.d.ts +1 -0
  157. package/components/PasswordCheck.js +1 -0
  158. package/components/PhoneInput/PhoneInput.js +1 -1
  159. package/components/PhoneInput.d.ts +1 -0
  160. package/components/PhoneInput.js +1 -0
  161. package/components/PinInput/PinInput.js +1 -1
  162. package/components/PinInput.d.ts +1 -0
  163. package/components/PinInput.js +1 -0
  164. package/components/Progressbar/LinearProgressbar.js +1 -1
  165. package/components/Progressbar.d.ts +1 -0
  166. package/components/Progressbar.js +1 -0
  167. package/components/Radio/Radio.js +1 -1
  168. package/components/Radio.d.ts +1 -0
  169. package/components/Radio.js +1 -0
  170. package/components/RadioGroup/RadioGroup.js +1 -1
  171. package/components/RadioGroup.d.ts +1 -0
  172. package/components/RadioGroup.js +1 -0
  173. package/components/ResendCode.d.ts +1 -0
  174. package/components/ResendCode.js +1 -0
  175. package/components/Select/ButtonSelect.js +1 -1
  176. package/components/Select/ComboBoxSelect.js +1 -1
  177. package/components/Select/MultiButtonSelect.js +1 -1
  178. package/components/Select/Select.js +1 -1
  179. package/components/Select/index.js +1 -1
  180. package/components/Select/parts.js +1 -1
  181. package/components/Select.d.ts +1 -0
  182. package/components/Select.js +1 -0
  183. package/components/Skeleton.d.ts +1 -0
  184. package/components/Skeleton.js +1 -0
  185. package/components/Slider/Slider.js +1 -1
  186. package/components/Slider.d.ts +1 -0
  187. package/components/Slider.js +1 -0
  188. package/components/Switch/Switch.js +1 -1
  189. package/components/Switch.d.ts +1 -0
  190. package/components/Switch.js +1 -0
  191. package/components/Table.d.ts +1 -0
  192. package/components/Table.js +1 -0
  193. package/components/Tabs/Tab.js +1 -1
  194. package/components/Tabs/TabList.js +1 -1
  195. package/components/Tabs.d.ts +1 -0
  196. package/components/Tabs.js +1 -0
  197. package/components/Time.d.ts +1 -0
  198. package/components/Time.js +1 -0
  199. package/components/TimeInput/TimeInput.js +1 -1
  200. package/components/TimeInput.d.ts +1 -0
  201. package/components/TimeInput.js +1 -0
  202. package/components/Timezone.d.ts +1 -0
  203. package/components/Timezone.js +1 -0
  204. package/components/ToggleButton/ToggleButton.js +1 -1
  205. package/components/ToggleButton.d.ts +1 -0
  206. package/components/ToggleButton.js +1 -0
  207. package/components/Tooltip.d.ts +1 -0
  208. package/components/Tooltip.js +1 -0
  209. package/components/UploadImage/UploadImage.js +1 -1
  210. package/components/UploadImage/index.js +1 -1
  211. package/components/UploadImage.d.ts +1 -0
  212. package/components/UploadImage.js +1 -0
  213. package/docs/migrations/2026/04/2026-04-24-image-placeholder-frontend-fallback.md +3 -3
  214. package/docs/migrations/2026/04/2026-04-30-prune-invalid-pdp-selections.md +2 -2
  215. package/docs/migrations/2026/04/2026-04-30-top-down-pdp-option-dependency.md +2 -2
  216. package/docs/migrations/2026/08/2026-08-04-password-reveal-press-and-hold.md +48 -0
  217. package/docs/migrations/2026/08/2026-08-06-clicktap-ui-image-next-subpath.md +101 -0
  218. package/docs/migrations/2026/08/2026-08-06-clicktap-ui-loaders-drop-framer-motion.md +77 -0
  219. package/docs/migrations/2026/08/2026-08-06-clicktap-ui-semantic-tokens.md +106 -0
  220. package/docs/migrations/README.md +2 -0
  221. package/hooks/useCollectionState.d.ts +1 -0
  222. package/hooks/useCollectionState.js +1 -0
  223. package/hooks/useRoute/RouteContext.d.ts +8 -0
  224. package/hooks/useRoute/index.js +1 -1
  225. package/hooks/useRoute/useRoute.js +1 -1
  226. package/hooks/useRoute.d.ts +1 -0
  227. package/hooks/useRoute.js +1 -0
  228. package/next/Image.d.ts +11 -0
  229. package/next/Image.js +1 -0
  230. package/next/index.d.ts +8 -0
  231. package/next/index.js +1 -0
  232. package/package.json +62 -6
  233. package/theme.css +162 -0
  234. package/utils/collection.d.ts +1 -0
  235. package/utils/collection.js +1 -0
  236. package/utils/variantOptions.d.ts +1 -0
  237. package/utils/variantOptions.js +1 -0
  238. package/tailwind.config.js +0 -6
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Next-specific entry point (CTAP-1125).
3
+ *
4
+ * Everything in here imports from `next/*`. It is the ONLY part of the package
5
+ * that does, which is what lets `next` be an optional peer: a consumer that
6
+ * never imports `@clicktap/ui/next` gets zero `next` in its dependency tree.
7
+ */
8
+ export { Image, type ExtendedImageProps } from './Image';
package/next/index.js ADDED
@@ -0,0 +1 @@
1
+ import{Image as a}from"./Image.js";import"react/jsx-runtime";import"next/image";import"react";import"../utils/cn.js";import"../components/Image/imageShared.js";export{a as Image};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clicktap/ui",
3
- "version": "0.41.0",
3
+ "version": "0.42.0",
4
4
  "private": false,
5
5
  "author": "Clicktap",
6
6
  "description": "A library of React UI components and low-level hooks.",
@@ -16,6 +16,7 @@
16
16
  "sideEffects": false,
17
17
  "type": "module",
18
18
  "exports": {
19
+ "./theme.css": "./theme.css",
19
20
  "./components/*": {
20
21
  "types": [
21
22
  "./components/*.d.ts",
@@ -26,6 +27,24 @@
26
27
  "./components/*/index.js"
27
28
  ]
28
29
  },
30
+ "./next": {
31
+ "types": [
32
+ "./next/index.d.ts"
33
+ ],
34
+ "import": [
35
+ "./next/index.js"
36
+ ]
37
+ },
38
+ "./next/*": {
39
+ "types": [
40
+ "./next/*.d.ts",
41
+ "./next/*/index.d.ts"
42
+ ],
43
+ "import": [
44
+ "./next/*.js",
45
+ "./next/*/index.js"
46
+ ]
47
+ },
29
48
  "./hooks/*": {
30
49
  "types": [
31
50
  "./hooks/*.d.ts",
@@ -60,7 +79,6 @@
60
79
  "@react-stately/utils": "^3.9.1",
61
80
  "clsx": "2.1.1",
62
81
  "jwt-decode": "^4.0.0",
63
- "next": "^14.2.3",
64
82
  "react-number-format": "^5.4.0",
65
83
  "tailwind-merge": "2.5.2"
66
84
  },
@@ -72,7 +90,7 @@
72
90
  "react-aria": "^3.46.0",
73
91
  "react-aria-components": "^1.15.0",
74
92
  "react-stately": "^3.46.0",
75
- "tailwindcss": "^4.0.15"
93
+ "tailwindcss": "^4.3.3"
76
94
  },
77
95
  "peerDependencies": {
78
96
  "@floating-ui/react": "^0.27.0",
@@ -84,14 +102,52 @@
84
102
  "@heroui/tooltip": "^2.2.0",
85
103
  "@types/react": "^18.0.0",
86
104
  "framer-motion": "^11.18.0",
105
+ "next": ">=14",
87
106
  "react": "^18.0.0",
88
107
  "react-aria": "^3.46.0",
89
108
  "react-aria-components": "^1.15.0",
90
- "react-stately": "^3.36.0",
91
109
  "react-dom": "^18.0.0",
92
- "react-international-phone": "^4.3.0"
110
+ "react-international-phone": "^4.3.0",
111
+ "react-stately": "^3.36.0"
112
+ },
113
+ "peerDependenciesMeta": {
114
+ "@floating-ui/react": {
115
+ "optional": true
116
+ },
117
+ "@heroui/accordion": {
118
+ "optional": true
119
+ },
120
+ "@heroui/badge": {
121
+ "optional": true
122
+ },
123
+ "@heroui/pagination": {
124
+ "optional": true
125
+ },
126
+ "@heroui/system": {
127
+ "optional": true
128
+ },
129
+ "@heroui/theme": {
130
+ "optional": true
131
+ },
132
+ "@heroui/tooltip": {
133
+ "optional": true
134
+ },
135
+ "framer-motion": {
136
+ "optional": true
137
+ },
138
+ "next": {
139
+ "optional": true
140
+ },
141
+ "react-aria": {
142
+ "optional": true
143
+ },
144
+ "react-international-phone": {
145
+ "optional": true
146
+ },
147
+ "react-stately": {
148
+ "optional": true
149
+ }
93
150
  },
94
- "tailwind": "./tailwind.config.js",
95
151
  "scripts": {
96
152
  "preinstall": "case \"$INIT_CWD/\" in \"$PWD\"/*) echo 'ERROR: Run pnpm install from the monorepo root, not inside this lib or a subdirectory. A nested install creates a rogue node_modules and drifts dependency versions (CTAP-717).' && exit 1 ;; esac"
97
153
  }
package/theme.css ADDED
@@ -0,0 +1,162 @@
1
+ /**
2
+ * @clicktap/ui semantic design tokens (CTAP-1123).
3
+ *
4
+ * One line in your CSS entry, after `@import 'tailwindcss'`:
5
+ *
6
+ * @import '@clicktap/ui/theme.css';
7
+ *
8
+ * That is the whole contract. There is no preset to add and no Tailwind config
9
+ * to edit: `@theme` both defines the variables AND registers the utilities that
10
+ * read them, so `text-fg` and `border-border-subtle` exist as soon as this file
11
+ * is imported. It composes with a JS config too — if your app still uses
12
+ * `@config`, the two merge, so this import works before, during, or after a
13
+ * CSS-first migration.
14
+ *
15
+ * ── Why custom properties ────────────────────────────────────────────────────
16
+ * Components used to hardcode literal palette classes (`text-slate-900`,
17
+ * `border-slate-300`). That worked for consumers only because slate and red are
18
+ * Tailwind DEFAULTS — every config has them — and it meant a dark-themed app got
19
+ * a white box with dark text and could only fix it by overriding every state.
20
+ *
21
+ * Re-theming is now a runtime override of the token, no rebuild and no config
22
+ * surgery, under a class, an attribute, or a media query:
23
+ *
24
+ * :root[data-theme='dark'] {
25
+ * --color-fg: oklch(98% 0 0);
26
+ * --color-surface-subtle: oklch(25% 0.02 260);
27
+ * }
28
+ *
29
+ * ── Why `@theme static` ─────────────────────────────────────────────────────
30
+ * Plain `@theme` PRUNES any token no utility happens to reference, which is the
31
+ * wrong default for a published token set: a consumer writing
32
+ * `color: var(--color-fg)` in hand-authored CSS, or overriding a token this app
33
+ * does not itself use, would silently get nothing. `static` emits all of them.
34
+ *
35
+ * ── On `border-border-subtle` ───────────────────────────────────────────────
36
+ * v4 has a single `--color-*` namespace feeding every colour utility, so a token
37
+ * named `border-subtle` necessarily yields `border-border-subtle` — Tailwind
38
+ * prefixes the utility itself. The doubling is real and it is the ecosystem
39
+ * convention (shadcn/ui ships `border-border`, `bg-background`). Taking it keeps
40
+ * one mechanism and a vocabulary a new developer already recognises; the same
41
+ * token also reads correctly as `outline-border-subtle` and `ring-border-subtle`,
42
+ * which is where these values are used just as often.
43
+ *
44
+ * ── Defaults are today's exact values ───────────────────────────────────────
45
+ * Each value below is the literal Tailwind v4 palette entry the components used
46
+ * before the sweep, copied from `tailwindcss/theme.css`. That is deliberate: a
47
+ * 550-occurrence rewrite is only reviewable if the rendering is unchanged, so any
48
+ * visual difference is a bug rather than a judgement call. Re-theming is the
49
+ * consumer's decision, not a side effect of adopting tokens.
50
+ */
51
+
52
+ /* Scan the published package for token classes. These are the DIST paths, which
53
+ * do not exist in this repo — a glob that matches nothing is a no-op, verified,
54
+ * so this is safe in both layouts. In-repo the consuming app already scans
55
+ * ../../libs/ui/**. */
56
+ @source './components/**/*.js';
57
+ @source './next/**/*.js';
58
+
59
+ /*
60
+ * Loader animations (CTAP-1156). These live here rather than in framer-motion so
61
+ * that `Button` — the most likely first import — installs from the core tier: it
62
+ * reached framer-motion only through `ButtonLoadingContent` → `Loader`, for two
63
+ * decorative infinite animations a stylesheet does perfectly well.
64
+ *
65
+ * A side benefit: framer-motion 11.x's complex-value parser could crash in
66
+ * `mixObject` when an ancestor `AnimatePresence` remeasured mid-flow, which is
67
+ * why the old components carefully used numeric primitives instead of transform
68
+ * strings. CSS keyframes have no such failure mode.
69
+ *
70
+ * Top-level rather than inside `@theme` so they are emitted unconditionally; the
71
+ * `--animate-*` entries below name the utilities that reference them.
72
+ */
73
+ @keyframes ct-loader-spin {
74
+ to {
75
+ transform: rotate(360deg);
76
+ }
77
+ }
78
+
79
+ @keyframes ct-loader-dash {
80
+ 0% {
81
+ stroke-dasharray: 1, 200;
82
+ stroke-dashoffset: 0;
83
+ }
84
+ 50% {
85
+ stroke-dasharray: 89, 200;
86
+ stroke-dashoffset: -35;
87
+ }
88
+ 100% {
89
+ stroke-dasharray: 89, 200;
90
+ stroke-dashoffset: -124;
91
+ }
92
+ }
93
+
94
+ @keyframes ct-loader-pulse {
95
+ 0%,
96
+ 25%,
97
+ 75%,
98
+ 100% {
99
+ opacity: 1;
100
+ transform: scale(1);
101
+ }
102
+ 50% {
103
+ opacity: 0.7;
104
+ transform: scale(0.1);
105
+ }
106
+ }
107
+
108
+ @theme static {
109
+ /* Loader animations — see the keyframes above. Durations and easings match the
110
+ * framer-motion transitions they replace exactly, so nothing changes visually.
111
+ * `ease-in-out` is the same curve framer calls `easeInOut`
112
+ * (cubic-bezier(0.42, 0, 0.58, 1)), including as framer's keyframe default. */
113
+ --animate-ct-loader-spin: ct-loader-spin 2s linear infinite;
114
+ --animate-ct-loader-dash: ct-loader-dash 1.5s ease-in-out infinite;
115
+ --animate-ct-loader-pulse: ct-loader-pulse 0.75s ease-in-out infinite;
116
+
117
+ /* Foreground — three emphases, from the measured usage. */
118
+ --color-fg: oklch(20.8% 0.042 265.755); /* was slate-900 (50 uses) */
119
+ --color-fg-muted: oklch(55.4% 0.046 257.417); /* was slate-500 (48) */
120
+ --color-fg-subtle: oklch(70.4% 0.04 256.788); /* was slate-400 (27) */
121
+ --color-fg-inverse: #fff;
122
+
123
+ /*
124
+ * Border — a real three-step interaction ladder, not inconsistency. The
125
+ * components use these consistently: 200 for disabled and low-emphasis
126
+ * containers, 300 at rest on inputs and controls, 400 on hover/focus.
127
+ */
128
+ --color-border-subtle: oklch(92.9% 0.013 255.508); /* was slate-200 (40) */
129
+ --color-border: oklch(86.9% 0.022 252.894); /* was slate-300 (36) */
130
+ --color-border-emphasis: oklch(70.4% 0.04 256.788); /* was slate-400 (43) */
131
+
132
+ /* Surface. */
133
+ --color-surface: #fff;
134
+ --color-surface-subtle: oklch(96.8% 0.007 247.896); /* was slate-100 (29) */
135
+ --color-surface-inverse: oklch(20.8% 0.042 265.755); /* was slate-900 (13) */
136
+
137
+ /* Danger — the second-largest cluster after the neutrals (107 uses). */
138
+ --color-danger: oklch(57.7% 0.245 27.325); /* was red-600 */
139
+ --color-danger-soft: oklch(63.7% 0.237 25.331); /* was red-500 */
140
+ /* 'soft', not 'border': red-500 is used as text 20 times and as a border 15,
141
+ * so a border-specific name would read wrong at most of its call sites. The
142
+ * neutral ladder can afford `border-*` names because it really is border-only;
143
+ * this one cannot. */
144
+ --color-danger-surface: oklch(93.6% 0.032 17.717); /* was red-100 */
145
+
146
+ /*
147
+ * Three roles the first pass missed. Each is one distinct job with a value the
148
+ * ladders above do not already carry — the bar for a new token, deliberately.
149
+ * Roles that only needed an existing VALUE under a nicer name did NOT get one:
150
+ * an alias defined as `var(--color-border-subtle)` resolves at `:root`, so a
151
+ * consumer's `.dark` override of the source would not propagate to it, and
152
+ * duplicating the literal instead just invites the two copies to drift.
153
+ */
154
+ --color-fg-strong: oklch(12.9% 0.042 264.695); /* was slate-950 (7) */
155
+ --color-surface-inverse-hover: oklch(27.9% 0.041 260.031); /* was slate-800 (16) */
156
+ --color-danger-ring: oklch(88.5% 0.062 18.334); /* was red-200 (11), invalid focus ring */
157
+
158
+ /* Status — small but present (22 uses between them). */
159
+ --color-success: oklch(62.7% 0.194 149.214); /* was green-600 */
160
+ --color-warning: oklch(68.1% 0.162 75.834); /* was yellow-600 */
161
+ --color-info: oklch(54.6% 0.245 262.881); /* was blue-600 */
162
+ }
@@ -0,0 +1 @@
1
+ export * from './collection/index';
@@ -0,0 +1 @@
1
+ export * from './collection/index.js';
@@ -0,0 +1 @@
1
+ export * from './variantOptions/index';
@@ -0,0 +1 @@
1
+ export * from './variantOptions/index.js';
@@ -1,6 +0,0 @@
1
- const path = require('path');
2
-
3
- /** @type {import('tailwindcss').Config} */
4
- module.exports = {
5
- content: [path.resolve(__dirname, './components/**/*.{js,jsx,ts,tsx}')],
6
- };