@spaethtech/svelte-ui 0.18.1-dev.90.ca4ea8f → 0.18.1-dev.92.355f4cd

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.
@@ -7,7 +7,8 @@ description: How to build UIs with the @spaethtech/svelte-ui component library i
7
7
 
8
8
  A **Svelte 5 (runes)** component library styled with **Tailwind CSS v4** and **MDI icons**. Every
9
9
  component is theme-aware via CSS variables and most consume the shared `variant` + `size` axes.
10
- Import from the package name — **`@spaethtech/svelte-ui`** — never a deep `dist/` path.
10
+ Import from the package name — the **`@spaethtech/svelte-ui`** barrel, or a **per-component subpath**
11
+ (`@spaethtech/svelte-ui/button`) — never a raw `dist/` path.
11
12
 
12
13
  > Depth lives in the package's shipped docs (`node_modules/@spaethtech/svelte-ui/docs/*.md`) and this
13
14
  > repo's `CLAUDE.md`. Theming (tokens, dark mode, inverse surfaces, brand bridging) → the **`themes`**
@@ -55,6 +56,36 @@ the components use:
55
56
  <Button text="Save" variant="primary" onclick={() => save(name)} />
56
57
  ```
57
58
 
59
+ ### Barrel vs. per-component subpaths (dev cold-start / memory)
60
+
61
+ Two import styles, both resolving to the same source (identical output, identical HMR-into-lib):
62
+
63
+ - **Barrel** — `import { Button, Input } from "@spaethtech/svelte-ui"`. Convenient, but importing
64
+ *anything* from the barrel pulls *all* 71 component `.svelte` files into the dev compile graph (Vite
65
+ doesn't tree-shake a barrel in `dev`), so the dev server compiles the whole library on cold start.
66
+ Prod builds tree-shake normally, so this is a dev-time cost only.
67
+ - **Per-component subpath** — `import Button from "@spaethtech/svelte-ui/button"`. Kebab-case of the
68
+ component name (`DataTable` → `/data-table`, `SideBarMenu` → `/side-bar-menu`, `DatePicker` →
69
+ `/date-picker`; multi-export folders keep their group, e.g. `Avatar`/`AvatarGroup` at `/avatar`).
70
+ Only the components you actually import get compiled. **On a memory-constrained dev host, prefer
71
+ subpaths exclusively** — it's the single biggest lever on svelte-ui's cold-start footprint.
72
+
73
+ Non-component runtime **values** have their own component-free entries so they don't drag the barrel
74
+ in either: **`@spaethtech/svelte-ui/utils`** (`toast`, `anchored`/`tooltip`, `setUiI18n`/`uiI18n`,
75
+ `responsiveClasses`, …) and **`@spaethtech/svelte-ui/data`** (`createGrid`, query AST). **Types** are
76
+ free from anywhere — `import type { Variant } from "@spaethtech/svelte-ui"` is erased at compile time
77
+ and pulls no components, so type-only imports may stay on the barrel.
78
+
79
+ ```svelte
80
+ <script>
81
+ import Button from "@spaethtech/svelte-ui/button";
82
+ import DataTable from "@spaethtech/svelte-ui/data-table";
83
+ import { toast } from "@spaethtech/svelte-ui/utils";
84
+ import { createGrid } from "@spaethtech/svelte-ui/data";
85
+ import type { Variant } from "@spaethtech/svelte-ui"; // type-only ⇒ free, no compile
86
+ </script>
87
+ ```
88
+
58
89
  ## Localization (i18n) — opt-in
59
90
 
60
91
  Components render their own microcopy (aria-labels, titles, "per page", "No results", month names…)
@@ -42,6 +42,7 @@
42
42
  bind:touched
43
43
  bind:element
44
44
  type={showPassword ? "text" : "password"}
45
+ autocomplete="new-password"
45
46
  iconClickable={true}
46
47
  onIconClick={toggleVisibility}
47
48
  {...restProps}
@@ -0,0 +1,14 @@
1
+ export { toast, getToasts, dismissToast, type ToastVariant, type ToastItem, } from "./components/Toast/toast.svelte.js";
2
+ export { anchored, computePlacement, resolveBoundary } from "./positioning/anchored.js";
3
+ export type { Side, Align, Boundary, PlaceOptions, Placement, AnchoredParams, } from "./positioning/anchored.js";
4
+ export { tooltip } from "./positioning/tooltip.js";
5
+ export type { TooltipOptions } from "./positioning/tooltip.js";
6
+ export { setUiI18n, uiI18n, defaultUiMessages } from "./i18n.js";
7
+ export type { UiMessages, UiI18n } from "./i18n.js";
8
+ export type { Variant } from "./types/variants.js";
9
+ export type { Size } from "./types/sizes.js";
10
+ export type { StepSpec } from "./types/time.js";
11
+ export type { Breakpoint } from "./types/breakpoints.js";
12
+ export { BREAKPOINT_PX } from "./types/breakpoints.js";
13
+ export type { Responsive } from "./types/responsive.js";
14
+ export { responsiveClasses, resolveScalar } from "./types/responsive.js";
package/dist/utils.js ADDED
@@ -0,0 +1,15 @@
1
+ // Component-free value + type re-exports for consumers using the per-component subpaths EXCLUSIVELY.
2
+ // Importing a VALUE (toast, tooltip, setUiI18n…) from the main barrel ("@spaethtech/svelte-ui") pulls
3
+ // every component `.svelte` into the dev compile graph; this module imports only `.ts`/`.svelte.ts`
4
+ // (no components), so `import { toast } from "@spaethtech/svelte-ui/utils"` stays cheap. Data-grid
5
+ // helpers live at `@spaethtech/svelte-ui/data`; component types can still be `import type`-d from the
6
+ // root (type-only imports are erased and pull no `.svelte`).
7
+ // Toast
8
+ export { toast, getToasts, dismissToast, } from "./components/Toast/toast.svelte.js";
9
+ // Positioning engine + tooltip action
10
+ export { anchored, computePlacement, resolveBoundary } from "./positioning/anchored.js";
11
+ export { tooltip } from "./positioning/tooltip.js";
12
+ // Internal localization (opt-in)
13
+ export { setUiI18n, uiI18n, defaultUiMessages } from "./i18n.js";
14
+ export { BREAKPOINT_PX } from "./types/breakpoints.js";
15
+ export { responsiveClasses, resolveScalar } from "./types/responsive.js";
@@ -295,6 +295,9 @@ Thin wrappers over `Input`, each preconfigured with an MDI icon (rendered into I
295
295
 
296
296
  - **Location**: `src/lib/components/PasswordInput.svelte`
297
297
  - **Features**: built-in visibility toggle (eye / eye-off MDI icons)
298
+ - **`autocomplete`**: defaults to `"new-password"` (clears Chrome's "should have autocomplete"
299
+ advisory and stops unrelated saved-credential autofill). Overridable per usage — a login field
300
+ passes `autocomplete="current-password"` and it wins (spread after the default).
298
301
 
299
302
  ### EmailInput
300
303
 
package/docs/usage.md CHANGED
@@ -56,6 +56,27 @@ export default defineConfig({
56
56
  </script>
57
57
  ```
58
58
 
59
+ ### Per-component subpaths (faster dev cold-start)
60
+
61
+ Every component also has a **kebab-case subpath** — `@spaethtech/svelte-ui/button`,
62
+ `@spaethtech/svelte-ui/data-table`, `@spaethtech/svelte-ui/side-bar-menu`,
63
+ `@spaethtech/svelte-ui/date-picker` (multi-export folders keep their group, e.g. `Avatar`/`AvatarGroup`
64
+ at `/avatar`). Importing from the **barrel** pulls all 71 components into the dev compile graph (Vite
65
+ doesn't tree-shake a barrel in `dev`); importing from **subpaths** compiles only what you use. Both
66
+ resolve to the same source, so output and HMR-into-lib are identical — subpaths are purely a dev
67
+ cold-start / memory optimization (prefer them exclusively on constrained hosts). No `@source` change
68
+ (Tailwind still scans `dist`).
69
+
70
+ ```svelte
71
+ <script>
72
+ import Button from "@spaethtech/svelte-ui/button";
73
+ import DataTable from "@spaethtech/svelte-ui/data-table";
74
+ import { toast } from "@spaethtech/svelte-ui/utils"; // non-component values, barrel-free
75
+ import { createGrid } from "@spaethtech/svelte-ui/data"; // grid/query helpers
76
+ import type { Variant } from "@spaethtech/svelte-ui"; // type-only ⇒ erased, pulls nothing
77
+ </script>
78
+ ```
79
+
59
80
  ## Icons
60
81
 
61
82
  There is **no `Icon` component**. Import an MDI icon component from `~icons/mdi/*` and render it
@@ -1038,7 +1059,9 @@ A likeness with a fallback chain (image → initials → icon → glyph). `Avata
1038
1059
  let quantity = $state(1);
1039
1060
  </script>
1040
1061
 
1062
+ <!-- autocomplete defaults to "new-password"; override for a login field: -->
1041
1063
  <PasswordInput bind:value={password} placeholder="Enter password" />
1064
+ <PasswordInput bind:value={password} autocomplete="current-password" placeholder="Password" />
1042
1065
  <EmailInput bind:value={email} required placeholder="user@example.com" />
1043
1066
  <SearchInput bind:value={search} placeholder="Search..." />
1044
1067
  <NumberInput bind:value={quantity} min={1} max={100} />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spaethtech/svelte-ui",
3
- "version": "0.18.1-dev.90.ca4ea8f",
3
+ "version": "0.18.1-dev.92.355f4cd",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/spaethtech/svelte-ui.git"
@@ -50,11 +50,288 @@
50
50
  "types": "./dist/index.d.ts",
51
51
  "svelte": "./dist/index.js"
52
52
  },
53
+ "./alert": {
54
+ "types": "./dist/components/Alert.svelte.d.ts",
55
+ "svelte": "./dist/components/Alert.svelte"
56
+ },
57
+ "./banner": {
58
+ "types": "./dist/components/Banner.svelte.d.ts",
59
+ "svelte": "./dist/components/Banner.svelte"
60
+ },
61
+ "./badge": {
62
+ "types": "./dist/components/Badge/Badge.svelte.d.ts",
63
+ "svelte": "./dist/components/Badge/Badge.svelte"
64
+ },
65
+ "./chip": {
66
+ "types": "./dist/components/Chip/index.d.ts",
67
+ "svelte": "./dist/components/Chip/index.js"
68
+ },
69
+ "./kbd": {
70
+ "types": "./dist/components/Kbd/index.d.ts",
71
+ "svelte": "./dist/components/Kbd/index.js"
72
+ },
73
+ "./empty-state": {
74
+ "types": "./dist/components/EmptyState/index.d.ts",
75
+ "svelte": "./dist/components/EmptyState/index.js"
76
+ },
77
+ "./avatar": {
78
+ "types": "./dist/components/Avatar/index.d.ts",
79
+ "svelte": "./dist/components/Avatar/index.js"
80
+ },
81
+ "./button": {
82
+ "types": "./dist/components/Button.svelte.d.ts",
83
+ "svelte": "./dist/components/Button.svelte"
84
+ },
85
+ "./card": {
86
+ "types": "./dist/components/Card.svelte.d.ts",
87
+ "svelte": "./dist/components/Card.svelte"
88
+ },
89
+ "./card-header": {
90
+ "types": "./dist/components/CardHeader.svelte.d.ts",
91
+ "svelte": "./dist/components/CardHeader.svelte"
92
+ },
93
+ "./card-body": {
94
+ "types": "./dist/components/CardBody.svelte.d.ts",
95
+ "svelte": "./dist/components/CardBody.svelte"
96
+ },
97
+ "./card-footer": {
98
+ "types": "./dist/components/CardFooter.svelte.d.ts",
99
+ "svelte": "./dist/components/CardFooter.svelte"
100
+ },
101
+ "./stat": {
102
+ "types": "./dist/components/Stat/index.d.ts",
103
+ "svelte": "./dist/components/Stat/index.js"
104
+ },
105
+ "./timeline": {
106
+ "types": "./dist/components/Timeline/index.d.ts",
107
+ "svelte": "./dist/components/Timeline/index.js"
108
+ },
109
+ "./toaster": {
110
+ "types": "./dist/components/Toast/Toaster.svelte.d.ts",
111
+ "svelte": "./dist/components/Toast/Toaster.svelte"
112
+ },
113
+ "./dialog": {
114
+ "types": "./dist/components/Dialog.svelte.d.ts",
115
+ "svelte": "./dist/components/Dialog.svelte"
116
+ },
117
+ "./drawer": {
118
+ "types": "./dist/components/Drawer/index.d.ts",
119
+ "svelte": "./dist/components/Drawer/index.js"
120
+ },
121
+ "./confirm-dialog": {
122
+ "types": "./dist/components/ConfirmDialog.svelte.d.ts",
123
+ "svelte": "./dist/components/ConfirmDialog.svelte"
124
+ },
125
+ "./input": {
126
+ "types": "./dist/components/Input.svelte.d.ts",
127
+ "svelte": "./dist/components/Input.svelte"
128
+ },
129
+ "./notes-editor": {
130
+ "types": "./dist/components/NotesEditor.svelte.d.ts",
131
+ "svelte": "./dist/components/NotesEditor.svelte"
132
+ },
133
+ "./rating": {
134
+ "types": "./dist/components/Rating.svelte.d.ts",
135
+ "svelte": "./dist/components/Rating.svelte"
136
+ },
137
+ "./select": {
138
+ "types": "./dist/components/Select.svelte.d.ts",
139
+ "svelte": "./dist/components/Select.svelte"
140
+ },
141
+ "./combobox": {
142
+ "types": "./dist/components/Combobox/index.d.ts",
143
+ "svelte": "./dist/components/Combobox/index.js"
144
+ },
145
+ "./token-input": {
146
+ "types": "./dist/components/TokenInput/index.d.ts",
147
+ "svelte": "./dist/components/TokenInput/index.js"
148
+ },
149
+ "./slider": {
150
+ "types": "./dist/components/Slider/index.d.ts",
151
+ "svelte": "./dist/components/Slider/index.js"
152
+ },
153
+ "./list": {
154
+ "types": "./dist/components/List.svelte.d.ts",
155
+ "svelte": "./dist/components/List.svelte"
156
+ },
157
+ "./text-area": {
158
+ "types": "./dist/components/TextArea.svelte.d.ts",
159
+ "svelte": "./dist/components/TextArea.svelte"
160
+ },
161
+ "./spinner": {
162
+ "types": "./dist/components/Spinner/index.d.ts",
163
+ "svelte": "./dist/components/Spinner/index.js"
164
+ },
165
+ "./progress": {
166
+ "types": "./dist/components/Progress/index.d.ts",
167
+ "svelte": "./dist/components/Progress/index.js"
168
+ },
169
+ "./skeleton": {
170
+ "types": "./dist/components/Skeleton/index.d.ts",
171
+ "svelte": "./dist/components/Skeleton/index.js"
172
+ },
173
+ "./password-input": {
174
+ "types": "./dist/components/PasswordInput.svelte.d.ts",
175
+ "svelte": "./dist/components/PasswordInput.svelte"
176
+ },
177
+ "./email-input": {
178
+ "types": "./dist/components/EmailInput.svelte.d.ts",
179
+ "svelte": "./dist/components/EmailInput.svelte"
180
+ },
181
+ "./search-input": {
182
+ "types": "./dist/components/SearchInput.svelte.d.ts",
183
+ "svelte": "./dist/components/SearchInput.svelte"
184
+ },
185
+ "./number-input": {
186
+ "types": "./dist/components/NumberInput.svelte.d.ts",
187
+ "svelte": "./dist/components/NumberInput.svelte"
188
+ },
189
+ "./phone-input": {
190
+ "types": "./dist/components/PhoneInput.svelte.d.ts",
191
+ "svelte": "./dist/components/PhoneInput.svelte"
192
+ },
193
+ "./date-time-input": {
194
+ "types": "./dist/components/DateTimeInput.svelte.d.ts",
195
+ "svelte": "./dist/components/DateTimeInput.svelte"
196
+ },
197
+ "./calendar": {
198
+ "types": "./dist/components/Calendar.svelte.d.ts",
199
+ "svelte": "./dist/components/Calendar.svelte"
200
+ },
201
+ "./date-picker": {
202
+ "types": "./dist/components/DatePicker.svelte.d.ts",
203
+ "svelte": "./dist/components/DatePicker.svelte"
204
+ },
205
+ "./time-spinner": {
206
+ "types": "./dist/components/TimeSpinner.svelte.d.ts",
207
+ "svelte": "./dist/components/TimeSpinner.svelte"
208
+ },
209
+ "./time-picker": {
210
+ "types": "./dist/components/TimePicker.svelte.d.ts",
211
+ "svelte": "./dist/components/TimePicker.svelte"
212
+ },
213
+ "./time-range-input": {
214
+ "types": "./dist/components/TimeRangeInput.svelte.d.ts",
215
+ "svelte": "./dist/components/TimeRangeInput.svelte"
216
+ },
217
+ "./file-upload": {
218
+ "types": "./dist/components/FileUpload/index.d.ts",
219
+ "svelte": "./dist/components/FileUpload/index.js"
220
+ },
221
+ "./theme-selector": {
222
+ "types": "./dist/components/ThemeSelector.svelte.d.ts",
223
+ "svelte": "./dist/components/ThemeSelector.svelte"
224
+ },
225
+ "./theme-toggle": {
226
+ "types": "./dist/components/ThemeToggle.svelte.d.ts",
227
+ "svelte": "./dist/components/ThemeToggle.svelte"
228
+ },
229
+ "./popup": {
230
+ "types": "./dist/components/Popup.svelte.d.ts",
231
+ "svelte": "./dist/components/Popup.svelte"
232
+ },
233
+ "./menu": {
234
+ "types": "./dist/components/Menu.svelte.d.ts",
235
+ "svelte": "./dist/components/Menu.svelte"
236
+ },
237
+ "./context-menu": {
238
+ "types": "./dist/components/ContextMenu/index.d.ts",
239
+ "svelte": "./dist/components/ContextMenu/index.js"
240
+ },
241
+ "./command-palette": {
242
+ "types": "./dist/components/CommandPalette/index.d.ts",
243
+ "svelte": "./dist/components/CommandPalette/index.js"
244
+ },
245
+ "./tree": {
246
+ "types": "./dist/components/Tree/index.d.ts",
247
+ "svelte": "./dist/components/Tree/index.js"
248
+ },
249
+ "./button-group": {
250
+ "types": "./dist/components/ButtonGroup/index.d.ts",
251
+ "svelte": "./dist/components/ButtonGroup/index.js"
252
+ },
253
+ "./checkbox": {
254
+ "types": "./dist/components/Checkbox.svelte.d.ts",
255
+ "svelte": "./dist/components/Checkbox.svelte"
256
+ },
257
+ "./toggle": {
258
+ "types": "./dist/components/Toggle.svelte.d.ts",
259
+ "svelte": "./dist/components/Toggle.svelte"
260
+ },
261
+ "./radio": {
262
+ "types": "./dist/components/Radio.svelte.d.ts",
263
+ "svelte": "./dist/components/Radio.svelte"
264
+ },
265
+ "./field-group": {
266
+ "types": "./dist/components/FieldGroup.svelte.d.ts",
267
+ "svelte": "./dist/components/FieldGroup.svelte"
268
+ },
269
+ "./grid": {
270
+ "types": "./dist/components/Grid.svelte.d.ts",
271
+ "svelte": "./dist/components/Grid.svelte"
272
+ },
273
+ "./divider": {
274
+ "types": "./dist/components/Divider/index.d.ts",
275
+ "svelte": "./dist/components/Divider/index.js"
276
+ },
277
+ "./scroll-area": {
278
+ "types": "./dist/components/ScrollArea/index.d.ts",
279
+ "svelte": "./dist/components/ScrollArea/index.js"
280
+ },
281
+ "./splitter": {
282
+ "types": "./dist/components/Splitter/index.d.ts",
283
+ "svelte": "./dist/components/Splitter/index.js"
284
+ },
285
+ "./carousel": {
286
+ "types": "./dist/components/Carousel/index.d.ts",
287
+ "svelte": "./dist/components/Carousel/index.js"
288
+ },
289
+ "./stepper": {
290
+ "types": "./dist/components/Stepper/index.d.ts",
291
+ "svelte": "./dist/components/Stepper/index.js"
292
+ },
293
+ "./disclosure": {
294
+ "types": "./dist/components/Disclosure.svelte.d.ts",
295
+ "svelte": "./dist/components/Disclosure.svelte"
296
+ },
297
+ "./accordion": {
298
+ "types": "./dist/components/Accordion.svelte.d.ts",
299
+ "svelte": "./dist/components/Accordion.svelte"
300
+ },
301
+ "./side-bar-menu": {
302
+ "types": "./dist/components/SideBarMenu/SideBarMenu.svelte.d.ts",
303
+ "svelte": "./dist/components/SideBarMenu/SideBarMenu.svelte"
304
+ },
305
+ "./breadcrumbs": {
306
+ "types": "./dist/components/Breadcrumbs/index.d.ts",
307
+ "svelte": "./dist/components/Breadcrumbs/index.js"
308
+ },
309
+ "./tab-strip": {
310
+ "types": "./dist/components/TabStrip/TabStrip.svelte.d.ts",
311
+ "svelte": "./dist/components/TabStrip/TabStrip.svelte"
312
+ },
313
+ "./data-table": {
314
+ "types": "./dist/components/DataTable.svelte.d.ts",
315
+ "svelte": "./dist/components/DataTable.svelte"
316
+ },
317
+ "./pagination": {
318
+ "types": "./dist/components/Pagination/index.d.ts",
319
+ "svelte": "./dist/components/Pagination/index.js"
320
+ },
321
+ "./query": {
322
+ "types": "./dist/components/Query.svelte.d.ts",
323
+ "svelte": "./dist/components/Query.svelte"
324
+ },
53
325
  "./data": {
54
326
  "types": "./dist/data/index.d.ts",
55
327
  "svelte": "./dist/data/index.js",
56
328
  "default": "./dist/data/index.js"
57
329
  },
330
+ "./utils": {
331
+ "types": "./dist/utils.d.ts",
332
+ "svelte": "./dist/utils.js",
333
+ "default": "./dist/utils.js"
334
+ },
58
335
  "./theme.css": "./dist/theme.css"
59
336
  },
60
337
  "peerDependencies": {