@nqmcreative/ui 0.3.0 → 0.4.1

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 (164) hide show
  1. package/README.md +220 -28
  2. package/cli/index.mjs +247 -70
  3. package/dist/core/calendar.d.ts +1 -1
  4. package/dist/core/calendar.js +1 -1
  5. package/dist/core/color.d.ts +24 -0
  6. package/dist/core/color.js +39 -0
  7. package/dist/core/date.d.ts +3 -3
  8. package/dist/core/date.js +1 -1
  9. package/dist/core/files.d.ts +2 -3
  10. package/dist/core/files.js +2 -3
  11. package/dist/core/index.d.ts +9 -4
  12. package/dist/core/index.js +6 -4
  13. package/dist/core/number.d.ts +22 -0
  14. package/dist/core/number.js +33 -0
  15. package/dist/core/password.d.ts +1 -1
  16. package/dist/core/password.js +1 -1
  17. package/dist/core/pin.d.ts +23 -0
  18. package/dist/core/pin.js +38 -0
  19. package/dist/core/tags.d.ts +37 -0
  20. package/dist/core/tags.js +51 -0
  21. package/dist/core/time.d.ts +30 -0
  22. package/dist/core/time.js +78 -0
  23. package/dist/styles/matte/Alert.svelte +1 -3
  24. package/dist/styles/matte/Breadcrumb.svelte +1 -4
  25. package/dist/styles/matte/Calendar.svelte +6 -9
  26. package/dist/styles/matte/ColorInput.svelte +107 -0
  27. package/dist/styles/matte/ColorInput.svelte.d.ts +16 -0
  28. package/dist/styles/matte/Combobox.svelte +3 -6
  29. package/dist/styles/matte/CommandPalette.svelte +3 -6
  30. package/dist/styles/matte/ConfirmDialog.svelte +2 -5
  31. package/dist/styles/matte/ContextMenu.svelte +1 -4
  32. package/dist/styles/matte/CurrencyInput.svelte +108 -0
  33. package/dist/styles/matte/CurrencyInput.svelte.d.ts +26 -0
  34. package/dist/styles/matte/DatePicker.svelte +9 -9
  35. package/dist/styles/matte/DatePicker.svelte.d.ts +3 -0
  36. package/dist/styles/matte/Drawer.svelte +1 -3
  37. package/dist/styles/matte/Dropdown.svelte +2 -5
  38. package/dist/styles/matte/Dropdown.svelte.d.ts +1 -1
  39. package/dist/styles/matte/Dropzone.svelte +9 -12
  40. package/dist/styles/matte/Dropzone.svelte.d.ts +1 -1
  41. package/dist/styles/matte/FileInput.svelte +191 -0
  42. package/dist/styles/matte/FileInput.svelte.d.ts +32 -0
  43. package/dist/styles/matte/Footer.svelte +1 -1
  44. package/dist/styles/matte/Footer.svelte.d.ts +1 -1
  45. package/dist/styles/matte/InputAddon.svelte +36 -0
  46. package/dist/styles/matte/InputAddon.svelte.d.ts +13 -0
  47. package/dist/styles/matte/Modal.svelte +1 -3
  48. package/dist/styles/matte/MultiSelect.svelte +5 -8
  49. package/dist/styles/matte/Navbar.svelte +3 -9
  50. package/dist/styles/matte/Pagination.svelte +3 -6
  51. package/dist/styles/matte/PinInput.svelte +134 -0
  52. package/dist/styles/matte/PinInput.svelte.d.ts +25 -0
  53. package/dist/styles/matte/SearchInput.svelte +84 -0
  54. package/dist/styles/matte/SearchInput.svelte.d.ts +24 -0
  55. package/dist/styles/matte/Sidebar.svelte +3 -6
  56. package/dist/styles/matte/Spinner.svelte +2 -5
  57. package/dist/styles/matte/Spinner.svelte.d.ts +1 -1
  58. package/dist/styles/matte/Table.svelte +5 -8
  59. package/dist/styles/matte/TagsInput.svelte +170 -0
  60. package/dist/styles/matte/TagsInput.svelte.d.ts +29 -0
  61. package/dist/styles/matte/ThemeToggle.svelte +5 -8
  62. package/dist/styles/matte/TimeInput.svelte +126 -0
  63. package/dist/styles/matte/TimeInput.svelte.d.ts +21 -0
  64. package/dist/styles/matte/Toaster.svelte +2 -5
  65. package/dist/styles/matte/index.d.ts +10 -3
  66. package/dist/styles/matte/index.js +9 -3
  67. package/dist/styles/paper/Alert.svelte +1 -3
  68. package/dist/styles/paper/Breadcrumb.svelte +1 -4
  69. package/dist/styles/paper/Calendar.svelte +6 -9
  70. package/dist/styles/paper/ColorInput.svelte +109 -0
  71. package/dist/styles/paper/ColorInput.svelte.d.ts +16 -0
  72. package/dist/styles/paper/Combobox.svelte +3 -6
  73. package/dist/styles/paper/CommandPalette.svelte +3 -6
  74. package/dist/styles/paper/ConfirmDialog.svelte +2 -5
  75. package/dist/styles/paper/ContextMenu.svelte +1 -4
  76. package/dist/styles/paper/CurrencyInput.svelte +108 -0
  77. package/dist/styles/paper/CurrencyInput.svelte.d.ts +26 -0
  78. package/dist/styles/paper/DatePicker.svelte +9 -9
  79. package/dist/styles/paper/DatePicker.svelte.d.ts +3 -0
  80. package/dist/styles/paper/Drawer.svelte +1 -3
  81. package/dist/styles/paper/Dropdown.svelte +2 -5
  82. package/dist/styles/paper/Dropdown.svelte.d.ts +1 -1
  83. package/dist/styles/paper/Dropzone.svelte +9 -12
  84. package/dist/styles/paper/Dropzone.svelte.d.ts +1 -1
  85. package/dist/styles/paper/FileInput.svelte +201 -0
  86. package/dist/styles/paper/FileInput.svelte.d.ts +32 -0
  87. package/dist/styles/paper/Footer.svelte +1 -1
  88. package/dist/styles/paper/Footer.svelte.d.ts +1 -1
  89. package/dist/styles/paper/InputAddon.svelte +36 -0
  90. package/dist/styles/paper/InputAddon.svelte.d.ts +13 -0
  91. package/dist/styles/paper/Modal.svelte +1 -3
  92. package/dist/styles/paper/MultiSelect.svelte +5 -8
  93. package/dist/styles/paper/Navbar.svelte +3 -9
  94. package/dist/styles/paper/Pagination.svelte +3 -6
  95. package/dist/styles/paper/PinInput.svelte +134 -0
  96. package/dist/styles/paper/PinInput.svelte.d.ts +25 -0
  97. package/dist/styles/paper/SearchInput.svelte +89 -0
  98. package/dist/styles/paper/SearchInput.svelte.d.ts +24 -0
  99. package/dist/styles/paper/Sidebar.svelte +3 -6
  100. package/dist/styles/paper/Spinner.svelte +2 -5
  101. package/dist/styles/paper/Spinner.svelte.d.ts +1 -1
  102. package/dist/styles/paper/Table.svelte +5 -8
  103. package/dist/styles/paper/TagsInput.svelte +175 -0
  104. package/dist/styles/paper/TagsInput.svelte.d.ts +29 -0
  105. package/dist/styles/paper/ThemeToggle.svelte +5 -8
  106. package/dist/styles/paper/TimeInput.svelte +152 -0
  107. package/dist/styles/paper/TimeInput.svelte.d.ts +21 -0
  108. package/dist/styles/paper/Toaster.svelte +3 -6
  109. package/dist/styles/paper/index.d.ts +10 -3
  110. package/dist/styles/paper/index.js +9 -3
  111. package/dist/styles/sprout/Alert.svelte +1 -3
  112. package/dist/styles/sprout/Breadcrumb.svelte +1 -4
  113. package/dist/styles/sprout/Calendar.svelte +6 -9
  114. package/dist/styles/sprout/ColorInput.svelte +109 -0
  115. package/dist/styles/sprout/ColorInput.svelte.d.ts +16 -0
  116. package/dist/styles/sprout/Combobox.svelte +3 -6
  117. package/dist/styles/sprout/CommandPalette.svelte +3 -6
  118. package/dist/styles/sprout/ConfirmDialog.svelte +2 -5
  119. package/dist/styles/sprout/ContextMenu.svelte +1 -4
  120. package/dist/styles/sprout/CurrencyInput.svelte +108 -0
  121. package/dist/styles/sprout/CurrencyInput.svelte.d.ts +26 -0
  122. package/dist/styles/sprout/DatePicker.svelte +9 -9
  123. package/dist/styles/sprout/DatePicker.svelte.d.ts +3 -0
  124. package/dist/styles/sprout/Drawer.svelte +1 -3
  125. package/dist/styles/sprout/Dropdown.svelte +2 -5
  126. package/dist/styles/sprout/Dropdown.svelte.d.ts +1 -1
  127. package/dist/styles/sprout/Dropzone.svelte +9 -12
  128. package/dist/styles/sprout/Dropzone.svelte.d.ts +1 -1
  129. package/dist/styles/sprout/FileInput.svelte +202 -0
  130. package/dist/styles/sprout/FileInput.svelte.d.ts +32 -0
  131. package/dist/styles/sprout/Footer.svelte +1 -1
  132. package/dist/styles/sprout/Footer.svelte.d.ts +1 -1
  133. package/dist/styles/sprout/InputAddon.svelte +37 -0
  134. package/dist/styles/sprout/InputAddon.svelte.d.ts +13 -0
  135. package/dist/styles/sprout/Modal.svelte +1 -3
  136. package/dist/styles/sprout/MultiSelect.svelte +5 -8
  137. package/dist/styles/sprout/Navbar.svelte +3 -9
  138. package/dist/styles/sprout/Pagination.svelte +3 -6
  139. package/dist/styles/sprout/PinInput.svelte +135 -0
  140. package/dist/styles/sprout/PinInput.svelte.d.ts +25 -0
  141. package/dist/styles/sprout/SearchInput.svelte +89 -0
  142. package/dist/styles/sprout/SearchInput.svelte.d.ts +24 -0
  143. package/dist/styles/sprout/Sidebar.svelte +3 -6
  144. package/dist/styles/sprout/Spinner.svelte +2 -5
  145. package/dist/styles/sprout/Spinner.svelte.d.ts +1 -1
  146. package/dist/styles/sprout/Table.svelte +5 -8
  147. package/dist/styles/sprout/TagsInput.svelte +176 -0
  148. package/dist/styles/sprout/TagsInput.svelte.d.ts +29 -0
  149. package/dist/styles/sprout/ThemeToggle.svelte +5 -8
  150. package/dist/styles/sprout/TimeInput.svelte +152 -0
  151. package/dist/styles/sprout/TimeInput.svelte.d.ts +21 -0
  152. package/dist/styles/sprout/Toaster.svelte +3 -6
  153. package/dist/styles/sprout/index.d.ts +10 -3
  154. package/dist/styles/sprout/index.js +9 -3
  155. package/package.json +98 -19
  156. package/registry.json +139 -38
  157. package/dist/core/locale.svelte.d.ts +0 -93
  158. package/dist/core/locale.svelte.js +0 -153
  159. package/dist/styles/matte/LocaleProvider.svelte +0 -24
  160. package/dist/styles/matte/LocaleProvider.svelte.d.ts +0 -10
  161. package/dist/styles/paper/LocaleProvider.svelte +0 -24
  162. package/dist/styles/paper/LocaleProvider.svelte.d.ts +0 -10
  163. package/dist/styles/sprout/LocaleProvider.svelte +0 -24
  164. package/dist/styles/sprout/LocaleProvider.svelte.d.ts +0 -10
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @nqmcreative/ui
2
2
 
3
3
  Svelte 5 (runes) + Tailwind CSS v4 component library. One package, **three
4
- styles**, 63 components each — the same props, the same behaviour, a different
4
+ styles**, 70 components each — the same props, the same behaviour, a different
5
5
  look. Eight tones, light and dark, no runtime dependencies.
6
6
 
7
7
  | style | import | character |
@@ -11,7 +11,7 @@ look. Eight tones, light and dark, no runtime dependencies.
11
11
  | `sprout` | `@nqmcreative/ui/sprout` | Warm and fully rounded — leaf green on cream, pill buttons, and a round display face. For school, community and family sites. |
12
12
 
13
13
  The docs site lives in this repo — every component with a live demo, plus
14
- theming, locale and contributing guides. `bun run dev` to read it.
14
+ theming and contributing guides. `bun run dev` to read it.
15
15
 
16
16
  ## Install
17
17
 
@@ -65,6 +65,131 @@ preconnect plus the no-flash theme script in `src/app.html`, above
65
65
 
66
66
  </details>
67
67
 
68
+ ## Without SvelteKit
69
+
70
+ Nothing in the library imports `$app/*`, `$env/*` or `@sveltejs/kit`. The only
71
+ peer dependency is `svelte` ^5, and every DOM call sits inside an action or an
72
+ effect — so anything that compiles Svelte components runs these: a plain Vite
73
+ app, or a Laravel app with Vite as its front end.
74
+
75
+ The components ship as `.svelte` source, published under a `svelte` export
76
+ condition. `@sveltejs/vite-plugin-svelte` is what resolves that condition and
77
+ compiles them, so it is required outside SvelteKit. `nqm-ui init` detects which
78
+ of the three project shapes it is in and wires the files that shape uses.
79
+
80
+ ### Svelte + Vite
81
+
82
+ ```bash
83
+ npm create vite@latest myapp -- --template svelte-ts
84
+ cd myapp
85
+ npm i @nqmcreative/ui
86
+ npm i -D tailwindcss @tailwindcss/vite
87
+ npx nqm-ui init --style matte
88
+ ```
89
+
90
+ `init` writes `src/app.css`, patches the `<head>` in `index.html`, and adds the
91
+ CSS import to `src/main.ts`. The Vite config is the one thing it prints rather
92
+ than rewrites:
93
+
94
+ ```ts
95
+ // vite.config.ts
96
+ import { defineConfig } from 'vite';
97
+ import { svelte } from '@sveltejs/vite-plugin-svelte';
98
+ import tailwindcss from '@tailwindcss/vite';
99
+
100
+ export default defineConfig({
101
+ plugins: [tailwindcss(), svelte()]
102
+ });
103
+ ```
104
+
105
+ ### Laravel
106
+
107
+ Vite is already how Laravel builds its front end, so Svelte and this package are
108
+ the only additions.
109
+
110
+ ```bash
111
+ npm i @nqmcreative/ui
112
+ npm i -D svelte @sveltejs/vite-plugin-svelte tailwindcss @tailwindcss/vite
113
+ npx nqm-ui init --style matte
114
+ ```
115
+
116
+ ```js
117
+ // vite.config.js
118
+ import { defineConfig } from 'vite';
119
+ import laravel from 'laravel-vite-plugin';
120
+ import { svelte } from '@sveltejs/vite-plugin-svelte';
121
+ import tailwindcss from '@tailwindcss/vite';
122
+
123
+ export default defineConfig({
124
+ plugins: [
125
+ laravel({ input: ['resources/css/app.css', 'resources/js/app.js'], refresh: true }),
126
+ tailwindcss(),
127
+ svelte()
128
+ ]
129
+ });
130
+ ```
131
+
132
+ The entry CSS is `resources/css/app.css`, two levels below the project root, so
133
+ `@source` walks two up. Laravel keeps its markup outside that folder, so point
134
+ Tailwind at your own files too — otherwise the classes you write in Blade and in
135
+ your Svelte islands go missing the same way the package's would:
136
+
137
+ ```css
138
+ /* resources/css/app.css */
139
+ @import 'tailwindcss';
140
+ @import '@nqmcreative/ui/matte/theme.css';
141
+ @import '@nqmcreative/ui/matte/fonts.css';
142
+
143
+ @source '../../node_modules/@nqmcreative/ui/dist/styles/matte';
144
+ @source '../js';
145
+ @source '../views';
146
+ ```
147
+
148
+ Nothing imports that CSS from JavaScript — Blade hands the path to Vite. The
149
+ preconnect and the no-flash theme script go in the same `<head>`, which is what
150
+ `init` patches:
151
+
152
+ ```blade
153
+ {{-- resources/views/app.blade.php --}}
154
+ <head>
155
+ @vite(['resources/css/app.css', 'resources/js/app.js'])
156
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
157
+ <script>
158
+ const saved = localStorage.getItem('nqm-theme');
159
+ if (saved === 'dark' || saved === 'light') document.documentElement.classList.add(saved);
160
+ </script>
161
+ </head>
162
+ ```
163
+
164
+ Then mount Svelte wherever the page needs it — one root component, or an island
165
+ per view:
166
+
167
+ ```js
168
+ // resources/js/app.js
169
+ import { mount } from 'svelte';
170
+ import App from './App.svelte';
171
+
172
+ const target = document.getElementById('app');
173
+ if (target) mount(App, { target });
174
+ ```
175
+
176
+ ```svelte
177
+ <!-- resources/js/App.svelte -->
178
+ <script>
179
+ import { Button, Field, Input } from '@nqmcreative/ui/matte';
180
+
181
+ let email = $state('');
182
+ </script>
183
+
184
+ <Field label="Work email">
185
+ <Input bind:value={email} placeholder="you@example.com" />
186
+ </Field>
187
+ <Button tone="accent">Get started</Button>
188
+ ```
189
+
190
+ Blade renders the shell, Svelte renders the component — the two never fight over
191
+ the same node, because the mount target is the only thing they share.
192
+
68
193
  ## Use
69
194
 
70
195
  The import names the style:
@@ -91,6 +216,75 @@ to nothing, on purpose: a style is a choice, and picking one by accident is the
91
216
  mistake this layout exists to prevent. Switching later is a find-and-replace of
92
217
  the word after `@nqmcreative/ui/`.
93
218
 
219
+ ### Form inputs
220
+
221
+ `Input` takes any `type`, so an email or a URL field is a prop away, not a
222
+ component:
223
+
224
+ ```svelte
225
+ <Input type="email" inputmode="email" autocomplete="email" />
226
+ ```
227
+
228
+ The eight below exist because each adds behaviour a `type` cannot — a second
229
+ value, a keyboard rule, or a format that has to survive a round trip. All of
230
+ them take `size`, `tone`, `invalid` and `disabled`, and mean the same by them as
231
+ `Input` does.
232
+
233
+ | component | binds | what it adds |
234
+ | --------------- | ---------------- | ------------------------------------------------------------------ |
235
+ | `SearchInput` | `string` | Clear button, plus `onsearch` debounced separately from the value. |
236
+ | `InputAddon` | — | Fixed label welded to an `InputGroup`: `https://`, `.com`, `kg`. |
237
+ | `PinInput` | `string` | One box per character, paste spreading, arrow keys, `oncomplete`. |
238
+ | `TagsInput` | `string[]` | Free-text tokens on Enter, deduplicated, capped, split on paste. |
239
+ | `CurrencyInput` | `number \| null` | Grouping applied on blur, so the bound value stays a number. |
240
+ | `TimeInput` | `string` | Steppers and bounds over an `HH:MM` string. |
241
+ | `ColorInput` | `string` | Native swatch and hex field kept in step, normalised to `#rrggbb`. |
242
+ | `FileInput` | `File[]` | One-line picker with `Dropzone`'s type, size and count validation. |
243
+
244
+ Four of them wrap `Input` and fill its prefix or suffix slot — `SearchInput`,
245
+ `CurrencyInput`, `TimeInput`, `ColorInput` — so a change to the field's border
246
+ or focus ring reaches them for free. The other four draw their own box.
247
+
248
+ ```svelte
249
+ <script lang="ts">
250
+ import { CurrencyInput, PinInput, TagsInput, TimeInput } from '@nqmcreative/ui/matte';
251
+
252
+ let price = $state<number | null>(1250000); // a number, not a formatted string
253
+ let code = $state(''); // shorter than `length` means incomplete
254
+ let tags = $state(['svelte']);
255
+ let start = $state('09:00'); // what <input type="time"> would post
256
+ </script>
257
+
258
+ <CurrencyInput bind:value={price} currency="Rp" group="." decimal="," precision={0} />
259
+ <PinInput bind:value={code} length={6} groupAfter={3} oncomplete={verify} />
260
+ <TagsInput bind:tags max={6} onreject={(reason) => toast.error(reason)} />
261
+ <TimeInput bind:value={start} min="08:00" max="17:00" step={15} />
262
+ ```
263
+
264
+ Two details worth knowing before you wire them up. `CurrencyInput` groups on
265
+ blur and not under the caret, because formatting as you type is what pushes the
266
+ caret around mid-word. And `TagsInput` reports every refusal — duplicate, too
267
+ short, list full — through `onreject`, because a field that silently ignores
268
+ Enter reads as broken.
269
+
270
+ The rules are all in `@nqmcreative/ui/core`, not in any style:
271
+
272
+ ```ts
273
+ import {
274
+ addTag,
275
+ splitTags, // tokens
276
+ fillFrom,
277
+ sanitisePin, // codes
278
+ parseTime,
279
+ clampTime, // clock
280
+ formatGrouped,
281
+ parseGrouped, // money
282
+ normaliseHex, // colour
283
+ sortFiles,
284
+ formatSize // files
285
+ } from '@nqmcreative/ui/core';
286
+ ```
287
+
94
288
  ### Tones
95
289
 
96
290
  Eight of them — `brand`, `accent`, `violet`, `info`, `success`, `warning`,
@@ -113,33 +307,31 @@ Each style's `theme.css` ships both palettes; nothing in a component says
113
307
  `dark:`. `<html class="dark">` or `class="light"` forces one, bare `<html>`
114
308
  follows the OS. `ThemeToggle` handles all three.
115
309
 
116
- ### Locale
310
+ ### Built-in strings
117
311
 
118
- Every built-in string — ARIA names, `No data`, the calendar's month names —
119
- comes from one object, shared by every style:
120
-
121
- ```js
122
- import { setLocale, idID } from '@nqmcreative/ui/core';
123
-
124
- setLocale(idID);
125
- ```
312
+ Components render English text of their own — ARIA names, `No data`, `Choose
313
+ file` written inline at the call site. Where a caller would plausibly want to
314
+ change one, it is a prop: `<Table empty="…">`, `<Dropzone label="…">`,
315
+ `<FileInput placeholder="…">`.
126
316
 
127
- `enUS` and `idID` ship with the package; pass a partial to change a few keys.
128
- Under SSR use `<LocaleProvider>` instead, so the locale is scoped to a request.
317
+ Dates are the one place the browser decides: `Calendar` and `DatePicker` take
318
+ month and weekday names from `Intl` with no locale argument, so they follow the
319
+ reader's own system. The order of the parts the field parses and prints is
320
+ explicit instead — `<DatePicker format="dmy">`, defaulting to `dmy`.
129
321
 
130
322
  ## Layout
131
323
 
132
324
  ```
133
325
  src/lib/core/ behaviour, a11y, types — no markup, no classes
134
- src/lib/styles/matte/ 63 components
135
- src/lib/styles/paper/ 63 components
136
- src/lib/styles/sprout/ 63 components
326
+ src/lib/styles/matte/ 70 components
327
+ src/lib/styles/paper/ 70 components
328
+ src/lib/styles/sprout/ 70 components
137
329
  scripts/catalogue.mjs the list every style must implement
138
330
  ```
139
331
 
140
332
  `core` holds what has no opinion about looks: focus traps, roving keyboard
141
333
  navigation, viewport-aware anchoring, date maths, file validation, table
142
- sorting, the toast queue, the locale strings. There is no `matte` version of a
334
+ sorting, the toast queue. There is no `matte` version of a
143
335
  focus trap, so no style writes one.
144
336
 
145
337
  A style holds only markup and classes. It may differ from another completely —
@@ -150,17 +342,17 @@ same.
150
342
 
151
343
  ## Components
152
344
 
153
- | group | components |
154
- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
155
- | Actions | `Button`, `Link` |
156
- | Forms | `Input`, `Textarea`, `Select`, `Combobox`, `MultiSelect`, `DatePicker`, `Calendar`, `Checkbox`, `CheckboxGroup`, `Radio`, `RadioGroup`, `SegmentedControl`, `Switch`, `Slider`, `InputGroup`, `Dropzone`, `Field`, `Label` |
157
- | Data display | `Badge`, `Avatar`, `AvatarGroup`, `Card`, `Stat`, `Table`, `Kbd` |
158
- | Feedback | `Alert`, `Toaster` + `toast`, `Progress`, `Spinner`, `Skeleton`, `EmptyState` |
159
- | Layout & nav | `Divider`, `Tabs`, `Accordion`, `AccordionItem`, `Breadcrumb`, `Pagination`, `Steps` |
160
- | App shell | `Navbar`, `Sidebar`, `Footer` |
161
- | Overlay | `Modal`, `ConfirmDialog`, `Drawer`, `Dropdown` + `MenuItem` + `MenuSeparator`, `ContextMenu`, `CommandPalette`, `Popover`, `Tooltip` |
162
- | Marketing | `HeroSection`, `FeatureGrid`, `FeatureCard`, `PricingCard`, `Testimonial`, `LogoCloud`, `CTASection`, `StatsBand` |
163
- | System | `ThemeToggle`, `LocaleProvider` |
345
+ | group | components |
346
+ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
347
+ | Actions | `Button`, `Link` |
348
+ | Forms | `Input`, `Textarea`, `Select`, `Combobox`, `MultiSelect`, `DatePicker`, `Calendar`, `Checkbox`, `CheckboxGroup`, `Radio`, `RadioGroup`, `SegmentedControl`, `Switch`, `Slider`, `InputGroup`, `InputAddon`, `SearchInput`, `PinInput`, `TagsInput`, `CurrencyInput`, `TimeInput`, `ColorInput`, `FileInput`, `Dropzone`, `Field`, `Label` |
349
+ | Data display | `Badge`, `Avatar`, `AvatarGroup`, `Card`, `Stat`, `Table`, `Kbd` |
350
+ | Feedback | `Alert`, `Toaster` + `toast`, `Progress`, `Spinner`, `Skeleton`, `EmptyState` |
351
+ | Layout & nav | `Divider`, `Tabs`, `Accordion`, `AccordionItem`, `Breadcrumb`, `Pagination`, `Steps` |
352
+ | App shell | `Navbar`, `Sidebar`, `Footer` |
353
+ | Overlay | `Modal`, `ConfirmDialog`, `Drawer`, `Dropdown` + `MenuItem` + `MenuSeparator`, `ContextMenu`, `CommandPalette`, `Popover`, `Tooltip` |
354
+ | Marketing | `HeroSection`, `FeatureGrid`, `FeatureCard`, `PricingCard`, `Testimonial`, `LogoCloud`, `CTASection`, `StatsBand` |
355
+ | System | `ThemeToggle` |
164
356
 
165
357
  Overlays are built on the native top layer and three in-house actions
166
358
  (`portal`, `focusTrap`, `anchored`) rather than a positioning dependency.