@happyvertical/smrt-ui 0.55.20 → 0.55.22

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 (67) hide show
  1. package/dist/components/calendar/DayView.svelte +1 -1
  2. package/dist/components/data/CollectionList.svelte +1 -1
  3. package/dist/components/data/DataTable.svelte +5 -0
  4. package/dist/components/data/ListSortSelect.svelte +1 -1
  5. package/dist/components/feedback/Alert.svelte +86 -20
  6. package/dist/components/feedback/LoadingOverlay.svelte +2 -2
  7. package/dist/components/feedback/PhoneSheet.svelte +1 -1
  8. package/dist/components/feedback/Progress.svelte +7 -0
  9. package/dist/components/feedback/ToastViewport.svelte +1 -1
  10. package/dist/components/feedback/WorkingStrip.svelte +4 -4
  11. package/dist/components/forms/CameraCapture.svelte +1 -1
  12. package/dist/components/forms/Checkbox.svelte +133 -30
  13. package/dist/components/forms/Combobox.svelte +2 -2
  14. package/dist/components/forms/Fieldset.svelte +1 -1
  15. package/dist/components/forms/FilePicker.svelte +1 -1
  16. package/dist/components/forms/FormActionBar.svelte +2 -2
  17. package/dist/components/forms/Input.svelte +66 -61
  18. package/dist/components/forms/InputGroup.svelte +1 -1
  19. package/dist/components/forms/Listbox.svelte +1 -1
  20. package/dist/components/forms/MultiSelect.svelte +2 -2
  21. package/dist/components/forms/Radio.svelte +9 -0
  22. package/dist/components/forms/RangeSlider.svelte +1 -1
  23. package/dist/components/forms/SegmentedControl.svelte +7 -2
  24. package/dist/components/forms/Select.svelte +67 -61
  25. package/dist/components/forms/SignaturePad.svelte +1 -1
  26. package/dist/components/forms/Slider.svelte +1 -1
  27. package/dist/components/forms/StagedControlReview.svelte +4 -4
  28. package/dist/components/forms/Switch.svelte +130 -28
  29. package/dist/components/forms/TagsInput.svelte +1 -1
  30. package/dist/components/forms/Toggle.svelte +12 -0
  31. package/dist/components/forms/ToggleButton.svelte +6 -1
  32. package/dist/components/layout/Footer.svelte +1 -1
  33. package/dist/components/layout/Masthead.svelte +1 -1
  34. package/dist/components/memberships/MembershipCard.svelte +3 -3
  35. package/dist/components/nav/FilterChips.svelte +6 -1
  36. package/dist/components/nav/Tabs.svelte +192 -183
  37. package/dist/components/nav/Tabs.svelte.d.ts.map +1 -1
  38. package/dist/components/permissions/PermissionPicker.svelte +4 -4
  39. package/dist/components/roles/RoleSelector.svelte +2 -2
  40. package/dist/components/ui/Accordion.svelte +1 -1
  41. package/dist/components/ui/AccordionItem.svelte +1 -1
  42. package/dist/components/ui/Badge.svelte +26 -24
  43. package/dist/components/ui/Button.svelte +101 -115
  44. package/dist/components/ui/Button.svelte.d.ts +1 -1
  45. package/dist/components/ui/Card.svelte +44 -57
  46. package/dist/components/ui/Chip.svelte +68 -58
  47. package/dist/components/ui/Disclosure.svelte +1 -1
  48. package/dist/components/ui/IconToggle.svelte +8 -2
  49. package/dist/styles/unstyled.css +2 -2
  50. package/dist/svelte/playground/BaseControlsPreview.svelte +2 -2
  51. package/dist/svelte/playground/CollectionsPreview.svelte +1 -1
  52. package/dist/svelte/playground/DataTablePreview.svelte +5 -5
  53. package/dist/svelte/playground/FeedbackPreview.svelte +1 -1
  54. package/dist/svelte/playground/InteractiveControlsPreview.svelte +1 -1
  55. package/dist/svelte/playground/StylelessPreview.svelte +35 -2
  56. package/dist/svelte/playground/StylelessPreview.svelte.d.ts.map +1 -1
  57. package/dist/themes/README.md +58 -4
  58. package/dist/themes/ThemeProvider.svelte +9 -0
  59. package/dist/themes/ThemeProvider.svelte.d.ts.map +1 -1
  60. package/dist/themes/components/ColorSchemeToggle.svelte +3 -3
  61. package/dist/themes/components/ThemeSwitcher.svelte +3 -3
  62. package/dist/themes/forced-colors.d.ts +2 -0
  63. package/dist/themes/forced-colors.d.ts.map +1 -0
  64. package/dist/themes/forced-colors.js +49 -0
  65. package/dist/themes/styles/base.css +80 -1
  66. package/dist/themes/styles/forced-colors.css +42 -0
  67. package/package.json +2 -2
@@ -1,5 +1,8 @@
1
1
 
2
- @layer smrt.reset, smrt.structure, smrt.theme;/**
2
+ @layer smrt.reset, smrt.structure, smrt.theme;
3
+ @import url('./forced-colors.css') (forced-colors: active);
4
+
5
+ /**
3
6
  * Application baseline for SMRT interfaces.
4
7
  *
5
8
  * Import this once at an application entry point, alongside the selected
@@ -257,3 +260,79 @@ time,
257
260
  }
258
261
  }
259
262
  }
263
+
264
+ /*
265
+ * Forced colors (#3908). Token level: Windows High Contrast / `forced-colors:
266
+ * active` maps the theme onto the system palette. These two token blocks are
267
+ * deliberately UNLAYERED: preset stylesheets declare their tokens unlayered on
268
+ * `[data-theme][data-color-scheme]`, and an unlayered rule always beats a
269
+ * layered one, so a layered override would never apply. The selectors match
270
+ * whichever element carries the theme attributes (document root, ThemeProvider
271
+ * root or a consumer wrapper) with one more attribute selector than the preset
272
+ * block. The `forced-colors: active` media case is the conditional `@import`
273
+ * at the top of this file (forced-colors.css); the attribute case is the
274
+ * block below. The same values ship as
275
+ * `FORCED_COLORS_TOKENS` (src/themes/forced-colors.ts): ThemeProvider appends
276
+ * them inline so runtime themes cannot win; a unit test keeps both in step.
277
+ * `[data-forced-colors]` is stamped by ThemeProvider and `themeScript()`;
278
+ * tests can set it without media emulation. Components only consume tokens.
279
+ */
280
+
281
+ [data-forced-colors][data-theme][data-color-scheme] {
282
+ --smrt-hairline-color: CanvasText;
283
+ --smrt-hairline-strong-color: CanvasText;
284
+ --smrt-hairline: 1px solid CanvasText;
285
+ --smrt-hairline-strong: 1px solid CanvasText;
286
+ --smrt-inset-highlight: inset 0 0 0 0 transparent;
287
+ --smrt-elevation-0: 0 0 0 0 transparent;
288
+ --smrt-elevation-1: 0 0 0 0 transparent;
289
+ --smrt-elevation-2: 0 0 0 0 transparent;
290
+ --smrt-elevation-3: 0 0 0 0 transparent;
291
+ --smrt-elevation-4: 0 0 0 0 transparent;
292
+ --smrt-elevation-5: 0 0 0 0 transparent;
293
+ --smrt-focus-ring-color: Highlight;
294
+ --smrt-focus-ring-width: 3px;
295
+ --smrt-focus-ring-offset: 2px;
296
+ --smrt-glass-blur: 0px;
297
+ --smrt-glass-saturation: 100%;
298
+ --smrt-glass-surface: Canvas;
299
+ --smrt-glass-surface-strong: Canvas;
300
+ --smrt-glass-border: CanvasText;
301
+ --smrt-surface-overlay: Canvas;
302
+ --smrt-state-hover: 0;
303
+ --smrt-state-pressed: 0;
304
+ --smrt-state-selected: 0;
305
+ --smrt-state-focus: 0;
306
+ --smrt-state-dragged: 0;
307
+ --smrt-accent-color: Highlight;
308
+ --smrt-caret-color: CanvasText;
309
+ --smrt-selection-background: Highlight;
310
+ --smrt-selection-color: HighlightText;
311
+ --smrt-scrollbar-thumb: CanvasText;
312
+ --smrt-scrollbar-track: Canvas;
313
+ }
314
+
315
+ /*
316
+ * A translucent state-layer fill cannot be seen in forced colors, so hover is
317
+ * an outline instead. :where() keeps specificity at zero: every component's own
318
+ * focus, selected or outline rule still wins.
319
+ */
320
+ @layer smrt.theme {
321
+ @media (forced-colors: active) {
322
+ :where(button, [role="button"], [role="tab"], [role="menuitem"], [role="option"], a[href], summary, label):where(:hover):where(:not(:disabled, [aria-disabled="true"])) {
323
+ outline: 1px solid Highlight;
324
+ outline-offset: -1px;
325
+ }
326
+
327
+ :where(:disabled, [aria-disabled="true"]) {
328
+ color: GrayText;
329
+ }
330
+
331
+ /* Elements that rely on the UA focus ring get the token ring instead (a
332
+ solid Highlight ring of a stated width); component rules still win. */
333
+ :where(a[href], button, summary, input, select, textarea, [tabindex], [role="tab"], [role="menuitem"], [role="option"]):where(:focus-visible) {
334
+ outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color);
335
+ outline-offset: var(--smrt-focus-ring-offset);
336
+ }
337
+ }
338
+ }
@@ -0,0 +1,42 @@
1
+ /*
2
+ * Forced colors token layer (#3908), loaded by base.css as
3
+ * `@import url('./forced-colors.css') (forced-colors: active)`. Deliberately
4
+ * UNLAYERED (and a declaration-only block): preset stylesheets declare their
5
+ * tokens unlayered on `[data-theme][data-color-scheme]`, and an unlayered rule
6
+ * always beats a layered one. The repeated `[data-theme]` out-ranks that block
7
+ * by one attribute. Values mirror `FORCED_COLORS_TOKENS`
8
+ * (src/themes/forced-colors.ts); a unit test keeps the copies in step.
9
+ */
10
+ [data-theme][data-theme][data-color-scheme] {
11
+ --smrt-hairline-color: CanvasText;
12
+ --smrt-hairline-strong-color: CanvasText;
13
+ --smrt-hairline: 1px solid CanvasText;
14
+ --smrt-hairline-strong: 1px solid CanvasText;
15
+ --smrt-inset-highlight: inset 0 0 0 0 transparent;
16
+ --smrt-elevation-0: 0 0 0 0 transparent;
17
+ --smrt-elevation-1: 0 0 0 0 transparent;
18
+ --smrt-elevation-2: 0 0 0 0 transparent;
19
+ --smrt-elevation-3: 0 0 0 0 transparent;
20
+ --smrt-elevation-4: 0 0 0 0 transparent;
21
+ --smrt-elevation-5: 0 0 0 0 transparent;
22
+ --smrt-focus-ring-color: Highlight;
23
+ --smrt-focus-ring-width: 3px;
24
+ --smrt-focus-ring-offset: 2px;
25
+ --smrt-glass-blur: 0px;
26
+ --smrt-glass-saturation: 100%;
27
+ --smrt-glass-surface: Canvas;
28
+ --smrt-glass-surface-strong: Canvas;
29
+ --smrt-glass-border: CanvasText;
30
+ --smrt-surface-overlay: Canvas;
31
+ --smrt-state-hover: 0;
32
+ --smrt-state-pressed: 0;
33
+ --smrt-state-selected: 0;
34
+ --smrt-state-focus: 0;
35
+ --smrt-state-dragged: 0;
36
+ --smrt-accent-color: Highlight;
37
+ --smrt-caret-color: CanvasText;
38
+ --smrt-selection-background: Highlight;
39
+ --smrt-selection-color: HighlightText;
40
+ --smrt-scrollbar-thumb: CanvasText;
41
+ --smrt-scrollbar-track: Canvas;
42
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-ui",
3
- "version": "0.55.20",
3
+ "version": "0.55.22",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Domain-agnostic Svelte 5 UI runtime for SMRT: primitives, i18n client, theme system, and module UI registry",
6
6
  "type": "module",
@@ -155,7 +155,7 @@
155
155
  "access": "public"
156
156
  },
157
157
  "dependencies": {
158
- "@happyvertical/smrt-types": "0.55.20",
158
+ "@happyvertical/smrt-types": "0.55.22",
159
159
  "esm-env": "^1.2.2"
160
160
  },
161
161
  "peerDependencies": {