@happyvertical/smrt-svelte 0.55.19 → 0.55.21

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.
@@ -69,6 +69,12 @@ sample data source are not part of it.
69
69
  `validateCookbook` is where it is rejected). A brand colour becomes the preset
70
70
  id `cookbook-brand-<hex>[-<font>]`; the colour/font pair is encoded in the id
71
71
  because `ThemeProvider` looks a registered theme up once per id.
72
+ `borderRadius`, `density` and `contrast` pass through (also leniently: an
73
+ unknown value is dropped) to `AppShell`'s props of the same names, which hand
74
+ them to `ThemeProvider`. As with `preset` and `colorScheme`, a user's persisted
75
+ `ThemeProvider` preference wins after mount. The brand colour is
76
+ `createThemeFromColor` and replaces the preset; it is not `ThemeProvider`'s
77
+ `primaryColor`, which tints the current preset and which the cookbook never sets.
72
78
  A top-level `fontFamily` keeps the built-in preset's palette, spacing and
73
79
  shape while replacing its typography. It takes precedence over the legacy
74
80
  `custom.fontFamily` when both are present.
@@ -678,3 +678,7 @@ The shell only consumes theme tokens; CSS and tokens changed, DOM and behaviour
678
678
  - Glass: the header, phone top bar, phone tab bar, dock, drawers, sheet and popovers set `backdrop-filter: blur(var(--smrt-glass-blur)) saturate(var(--smrt-glass-saturation))` over `--smrt-glass-surface` (`-strong` for raised regions). Outside the Glass preset the tokens are opaque with blur 0. `backdrop-filter` makes the element a containing block for fixed descendants; the e2e suite covers the account menu and the floating layout toggle.
679
679
  - State layers: rows, tabs, rail buttons, toggles and the account trigger use one `::after` veil (`background: currentColor`, opacity from `--smrt-state-hover` / `-pressed` / `-selected`); transparent icon buttons use the equivalent `color-mix`. The selected nav row keeps its container fill and start indicator under the veil. Disabled uses `--smrt-state-disabled`. Focus rings come from `--smrt-focus-ring-*`; control radius and heights from `--smrt-control-*`.
680
680
  - E2E fixture: `ShellFixture` accepts `?theme=glass|material|studio|smrt` and `?scheme=dark` (all presets are imported) for per-preset screenshots.
681
+
682
+ ## Forced colors
683
+
684
+ Under `forced-colors: active` the shell follows the smrt-ui token layer (CanvasText hairlines, no shadows or blur, Highlight focus ring; see `packages/smrt-ui/src/themes/README.md#forced-colors`). Style blocks add `@media (forced-colors: active)` rules only where selection carried meaning by colour alone: the tenant nav start bar (Highlight) and bold row, phone tab bar current tab, dock toggles, focus tools, pressed shell icon buttons and the open account trigger. Chart series cycle system colours. Verified by `e2e/forced-colors.spec.ts`; the fixture (`forced-colors.html`) imports `base.css`, which carries the token layer.
@@ -2,6 +2,8 @@
2
2
  import {
3
3
  type ColorScheme,
4
4
  ColorSchemeToggle,
5
+ type ContrastPreference,
6
+ type ThemeConfig,
5
7
  type ThemePreset,
6
8
  ThemeProvider,
7
9
  } from '@happyvertical/smrt-ui/themes';
@@ -168,6 +170,12 @@ interface Props {
168
170
  preset?: ThemePreset;
169
171
  /** Light, dark or system color scheme; the user's persisted choice wins. */
170
172
  colorScheme?: ColorScheme;
173
+ /** Corner radius scale passed to the ThemeProvider; the user's persisted choice wins. */
174
+ borderRadius?: ThemeConfig['borderRadius'];
175
+ /** Control target density passed to the ThemeProvider; the user's persisted choice wins. */
176
+ density?: ThemeConfig['density'];
177
+ /** Contrast preference passed to the ThemeProvider (`auto` follows the OS); the user's persisted choice wins. */
178
+ contrast?: ContrastPreference;
171
179
  /** Extra app-panel content (e.g. selected-tenant notes). */
172
180
  appPanelDocs?: Snippet;
173
181
  /**
@@ -301,6 +309,9 @@ let {
301
309
  onlayoutchange,
302
310
  preset = 'smrt',
303
311
  colorScheme = 'system',
312
+ borderRadius,
313
+ density,
314
+ contrast,
304
315
  appPanelDocs,
305
316
  dock,
306
317
  dockToggles = [],
@@ -973,7 +984,14 @@ const EDGE_OF_REGION: Record<ShellRegion, PanelEdge> = {
973
984
 
974
985
  <Provider {webmcp} user={providerUser} {permissions}>
975
986
  <RuntimeDiagnosticsWebMcp enabled={runtimeDiagnostics} />
976
- <ThemeProvider {preset} {colorScheme} persist={true}>
987
+ <ThemeProvider
988
+ {preset}
989
+ {colorScheme}
990
+ {borderRadius}
991
+ {density}
992
+ {contrast}
993
+ persist={true}
994
+ >
977
995
  {#if !chrome}
978
996
  {@render children()}
979
997
  {:else}
@@ -1092,5 +1110,10 @@ const EDGE_OF_REGION: Record<ShellRegion, PanelEdge> = {
1092
1110
  .smrt-edit-item__grip:hover { background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent); }
1093
1111
  .smrt-edit-item__grip:focus-visible { outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color); outline-offset: var(--smrt-focus-ring-offset); }
1094
1112
  .smrt-edit-item__grip[aria-pressed='true'] { background: var(--smrt-color-primary-container); color: var(--smrt-color-on-primary-container); }
1113
+ /* Forced colors (#3908): selected and open states keep a non-colour indicator. */
1114
+ @media (forced-colors: active) {
1115
+ .smrt-layout-toggle :global(.smrt-shell-icon-button[aria-pressed='true']) { background: Highlight; color: HighlightText; }
1116
+ .smrt-edit-item__grip[aria-pressed='true'] { background: Highlight; color: HighlightText; }
1117
+ }
1095
1118
  }
1096
1119
  </style>
@@ -1,4 +1,4 @@
1
- import { type ColorScheme, type ThemePreset } from '@happyvertical/smrt-ui/themes';
1
+ import { type ColorScheme, type ContrastPreference, type ThemeConfig, type ThemePreset } from '@happyvertical/smrt-ui/themes';
2
2
  import '@happyvertical/smrt-ui/themes/styles/all.css';
3
3
  import '@happyvertical/smrt-ui/themes/styles/base.css';
4
4
  import '@happyvertical/smrt-ui/themes/styles/fonts.css';
@@ -104,6 +104,12 @@ interface Props {
104
104
  preset?: ThemePreset;
105
105
  /** Light, dark or system color scheme; the user's persisted choice wins. */
106
106
  colorScheme?: ColorScheme;
107
+ /** Corner radius scale passed to the ThemeProvider; the user's persisted choice wins. */
108
+ borderRadius?: ThemeConfig['borderRadius'];
109
+ /** Control target density passed to the ThemeProvider; the user's persisted choice wins. */
110
+ density?: ThemeConfig['density'];
111
+ /** Contrast preference passed to the ThemeProvider (`auto` follows the OS); the user's persisted choice wins. */
112
+ contrast?: ContrastPreference;
107
113
  /** Extra app-panel content (e.g. selected-tenant notes). */
108
114
  appPanelDocs?: Snippet;
109
115
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/app/AppShell.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AppShell.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/app/AppShell.svelte.ts"],"names":[],"mappings":"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"}
@@ -182,5 +182,10 @@ function press(event: MouseEvent, toggle: DockToggle): void {
182
182
  opacity: var(--smrt-state-disabled);
183
183
  cursor: default;
184
184
  }
185
+ /* Forced colors (#3908): selected and open states keep a non-colour indicator. */
186
+ @media (forced-colors: active) {
187
+ .smrt-dock-toggles__button.active { background: Highlight; color: HighlightText; border-color: Highlight; }
188
+ .smrt-dock-toggles__button[aria-disabled='true'] { opacity: 1; color: GrayText; }
189
+ }
185
190
  }
186
191
  </style>
@@ -230,6 +230,9 @@ setCookbookContext({
230
230
  }}
231
231
  {preset}
232
232
  colorScheme={shell.theme.colorScheme}
233
+ borderRadius={shell.theme.borderRadius}
234
+ density={shell.theme.density}
235
+ contrast={shell.theme.contrast}
233
236
  sectionHref={(id) => shell.sectionPath(id)}
234
237
  slotItems={[...slotItems, ...recipeSlotItems]}
235
238
  >
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/components/cookbook/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,oBAAoB,SAAS,CAAC;AAC3C,eAAO,MAAM,oBAAoB,EAAG,QAAiB,CAAC;AAEtD,gGAAgG;AAChG,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxD,CAAC;AAIF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAO1D;AAED,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,GAAG,SAAS,GAC/B,qBAAqB,CAuBvB"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/components/cookbook/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,oBAAoB,SAAS,CAAC;AAC3C,eAAO,MAAM,oBAAoB,EAAG,QAAiB,CAAC;AAEtD,gGAAgG;AAChG,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxD,CAAC;AAiBF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAO1D;AAED,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,GAAG,SAAS,GAC/B,qBAAqB,CAkCvB"}
@@ -8,6 +8,12 @@ export const THEME_FONTS = {
8
8
  'ui-rounded': 'ui-rounded, "SF Pro Rounded", system-ui, sans-serif',
9
9
  'ui-monospace': 'ui-monospace, "SF Mono", Menlo, monospace',
10
10
  };
11
+ const RADII = ['none', 'sm', 'md', 'lg', 'xl', 'full'];
12
+ const DENSITIES = ['comfortable', 'touch'];
13
+ const CONTRASTS = ['auto', 'standard', 'more'];
14
+ function isOneOf(allowed, value) {
15
+ return (typeof value === 'string' && allowed.includes(value));
16
+ }
11
17
  const HEX = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;
12
18
  /** `#rgb` or `#rrggbb` (with or without `#`) as lowercase `#rrggbb`; else null. */
13
19
  export function normalizeHex(value) {
@@ -37,6 +43,15 @@ export function resolveCookbookTheme(theme) {
37
43
  const colorScheme = theme?.colorScheme === 'light' || theme?.colorScheme === 'dark'
38
44
  ? theme.colorScheme
39
45
  : DEFAULT_COLOR_SCHEME;
46
+ const shape = {
47
+ ...(isOneOf(RADII, theme?.borderRadius)
48
+ ? { borderRadius: theme.borderRadius }
49
+ : {}),
50
+ ...(isOneOf(DENSITIES, theme?.density) ? { density: theme.density } : {}),
51
+ ...(isOneOf(CONTRASTS, theme?.contrast)
52
+ ? { contrast: theme.contrast }
53
+ : {}),
54
+ };
40
55
  const primary = theme?.custom ? normalizeHex(theme.custom.primary) : null;
41
56
  const font = theme?.fontFamily ?? theme?.custom?.fontFamily;
42
57
  const fontFamily = typeof font === 'string' && Object.hasOwn(THEME_FONTS, font)
@@ -46,12 +61,14 @@ export function resolveCookbookTheme(theme) {
46
61
  return {
47
62
  preset: brandThemeId(primary, fontFamily),
48
63
  colorScheme,
64
+ ...shape,
49
65
  brand: { primary, ...(fontFamily ? { fontFamily } : {}) },
50
66
  };
51
67
  }
52
68
  return {
53
69
  preset: theme?.preset || DEFAULT_THEME_PRESET,
54
70
  colorScheme,
71
+ ...shape,
55
72
  ...(fontFamily ? { fontFamily } : {}),
56
73
  };
57
74
  }
@@ -97,6 +97,12 @@ export interface ResolvedCookbookTheme {
97
97
  /** Preset id: a built-in smrt-ui preset, or the brand theme's id. */
98
98
  preset: string;
99
99
  colorScheme: 'light' | 'dark' | 'system';
100
+ /** Corner radius scale; absent keeps the preset's own. */
101
+ borderRadius?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
102
+ /** Control target density; absent keeps the preset's own. */
103
+ density?: 'comfortable' | 'touch';
104
+ /** Contrast preference; absent means `auto`. */
105
+ contrast?: 'auto' | 'standard' | 'more';
100
106
  /** Known font key applied without changing a built-in preset's palette. */
101
107
  fontFamily?: string;
102
108
  /** Present when the cookbook names a brand colour (it wins over `preset`). */
@@ -206,7 +212,7 @@ export interface CookbookSectionPageProps extends CookbookSectionPresentationPro
206
212
  children?: import('svelte').Snippet;
207
213
  }
208
214
  /** Props of `CookbookApp`; anything else is passed to `AppShell` unchanged. */
209
- export interface CookbookAppProps extends Omit<ComponentProps<typeof AppShell>, 'navGroups' | 'nav' | 'navMode' | 'layout' | 'onlayoutchange' | 'preset' | 'colorScheme' | 'sectionHref' | 'title' | 'children'>, Pick<BuildCookbookShellOptions, 'recipeOrder' | 'entryPath' | 'sectionPath' | 'href' | 'title'> {
215
+ export interface CookbookAppProps extends Omit<ComponentProps<typeof AppShell>, 'navGroups' | 'nav' | 'navMode' | 'layout' | 'onlayoutchange' | 'preset' | 'colorScheme' | 'borderRadius' | 'density' | 'contrast' | 'sectionHref' | 'title' | 'children'>, Pick<BuildCookbookShellOptions, 'recipeOrder' | 'entryPath' | 'sectionPath' | 'href' | 'title'> {
210
216
  cookbook: Cookbook;
211
217
  catalog: CookbookCatalog;
212
218
  /** Expanded section entries are the default; use `sections` for headings only. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/cookbook/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/cookbook/types.ts"],"names":[],"mappings":"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"}
@@ -250,5 +250,23 @@ const summary = $derived(
250
250
  .smrt-chart__bar { transition: inline-size var(--smrt-duration-normal) var(--smrt-easing-standard); }
251
251
  }
252
252
  .smrt-chart__table { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
253
+ /* Forced colors (#3908): selected and open states keep a non-colour indicator. */
254
+ @media (forced-colors: active) {
255
+ /* Series keys: system colours cycle by slot (the user's own palette), so
256
+ slices and legend swatches stay distinguishable without author colours.
257
+ The legend always carries label, value and share as text. */
258
+ .smrt-chart__slice[data-slot='0'], .smrt-chart__swatch[data-slot='0'] { stroke: CanvasText; background: CanvasText; }
259
+ .smrt-chart__slice[data-slot='1'], .smrt-chart__swatch[data-slot='1'] { stroke: Highlight; background: Highlight; }
260
+ .smrt-chart__slice[data-slot='2'], .smrt-chart__swatch[data-slot='2'] { stroke: LinkText; background: LinkText; }
261
+ .smrt-chart__slice[data-slot='3'], .smrt-chart__swatch[data-slot='3'] { stroke: VisitedText; background: VisitedText; }
262
+ .smrt-chart__slice[data-slot='4'], .smrt-chart__swatch[data-slot='4'] { stroke: ActiveText; background: ActiveText; }
263
+ .smrt-chart__slice[data-slot='5'], .smrt-chart__swatch[data-slot='5'] { stroke: GrayText; background: GrayText; }
264
+ .smrt-chart__slice[data-slot='6'], .smrt-chart__swatch[data-slot='6'] { stroke: ButtonText; background: ButtonText; }
265
+ .smrt-chart__slice[data-slot='7'], .smrt-chart__swatch[data-slot='7'] { stroke: MarkText; background: MarkText; }
266
+ .smrt-chart__swatch { border: var(--smrt-hairline-strong); }
267
+ .smrt-chart__slice { stroke-linecap: butt; }
268
+ .smrt-chart__track { background: Canvas; border: var(--smrt-hairline-strong); }
269
+ .smrt-chart__bar { background: Highlight; }
270
+ }
253
271
  }
254
272
  </style>
@@ -3003,5 +3003,10 @@ function buildLayoutStyle(shell: ModuleShellState): string {
3003
3003
  animation: none;
3004
3004
  }
3005
3005
  }
3006
+ /* Forced colors (#3908): selected and open states keep a non-colour indicator. */
3007
+ @media (forced-colors: active) {
3008
+ .smrt-admin-shell__focus-tool.active { background: Highlight; color: HighlightText; border-color: Highlight; }
3009
+ .smrt-admin-shell__focus-tool:disabled, .smrt-admin-shell__focus-tool.active:disabled { opacity: 1; background: Canvas; color: GrayText; border-color: GrayText; }
3010
+ }
3006
3011
  }
3007
3012
  </style>
@@ -210,5 +210,14 @@ function accessibleName(item: PhoneBottomBarEntry): string {
210
210
  border-radius: var(--smrt-radius-full);
211
211
  background: var(--smrt-color-primary);
212
212
  }
213
+ /* Forced colors (#3908): selected and open states keep a non-colour indicator. */
214
+ @media (forced-colors: active) {
215
+ .smrt-phone-bottom-bar__item.active { color: CanvasText; font-weight: var(--smrt-typography-weight-bold); }
216
+ .smrt-phone-bottom-bar__item.active .smrt-phone-bottom-bar__icon { background: Highlight; color: HighlightText; }
217
+ .smrt-phone-bottom-bar__badge { background: CanvasText; color: Canvas; }
218
+ .smrt-phone-bottom-bar__dot { background: Highlight; border-color: Canvas; }
219
+ .smrt-phone-bottom-bar__item:disabled, .smrt-phone-bottom-bar__item.active:disabled { opacity: 1; color: GrayText; font-weight: inherit; }
220
+ .smrt-phone-bottom-bar__item.active:disabled .smrt-phone-bottom-bar__icon { background: Canvas; color: GrayText; }
221
+ }
213
222
  }
214
223
  </style>
@@ -77,5 +77,10 @@ let {
77
77
  .smrt-shell-icon-button[aria-pressed='true'] { color: var(--smrt-color-on-surface); }
78
78
  .smrt-shell-icon-button:focus-visible { outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color); outline-offset: var(--smrt-focus-ring-offset); }
79
79
  .smrt-shell-icon-button:disabled { opacity: var(--smrt-state-disabled); cursor: not-allowed; }
80
+ /* Forced colors (#3908): selected and open states keep a non-colour indicator. */
81
+ @media (forced-colors: active) {
82
+ .smrt-shell-icon-button[aria-pressed='true'] { background: Highlight; color: HighlightText; }
83
+ .smrt-shell-icon-button:disabled, .smrt-shell-icon-button[aria-pressed='true']:disabled { opacity: 1; background: Canvas; color: GrayText; }
84
+ }
80
85
  }
81
86
  </style>
@@ -491,5 +491,13 @@ function fallbackIcon(label: string): string {
491
491
  white-space: nowrap;
492
492
  border: 0;
493
493
  }
494
+ /* Forced colors (#3908): selected and open states keep a non-colour indicator. */
495
+ @media (forced-colors: active) {
496
+ .smrt-tenant-nav a[aria-current='page'],
497
+ .smrt-tenant-nav a.smrt-tenant-nav__link--visible-active { background: Canvas; color: CanvasText; font-weight: var(--smrt-typography-weight-bold); }
498
+ .smrt-tenant-nav a[aria-current='page']::before,
499
+ .smrt-tenant-nav a.smrt-tenant-nav__link--visible-active::before { background: Highlight; }
500
+ .smrt-tenant-nav a[aria-disabled='true'] { opacity: 1; color: GrayText; }
501
+ }
494
502
  }
495
503
  </style>
@@ -542,5 +542,10 @@ $effect(() => {
542
542
  white-space: nowrap;
543
543
  border: 0;
544
544
  }
545
+ /* Forced colors (#3908): selected and open states keep a non-colour indicator. */
546
+ @media (forced-colors: active) {
547
+ .smrt-workspace-account-menu__trigger[aria-expanded='true']:not(:focus-visible) { outline: var(--smrt-focus-ring-width) solid Highlight; outline-offset: calc(-1 * var(--smrt-focus-ring-width)); }
548
+ .smrt-workspace-account-menu__trigger:disabled { opacity: 1; color: GrayText; }
549
+ }
545
550
  }
546
551
  </style>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-svelte",
3
- "version": "0.55.19",
3
+ "version": "0.55.21",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Svelte 5 components for SMRT user management - auth, users, tenants, roles, permissions, groups",
6
6
  "type": "module",
@@ -205,11 +205,11 @@
205
205
  },
206
206
  "dependencies": {
207
207
  "@happyvertical/logger": "^0.103.5",
208
- "@happyvertical/smrt-languages": "0.55.19",
209
- "@happyvertical/smrt-mcp-apps": "0.55.19",
210
- "@happyvertical/smrt-types": "0.55.19",
211
- "@happyvertical/smrt-ui": "0.55.19",
212
- "@happyvertical/smrt-web": "0.55.19",
208
+ "@happyvertical/smrt-languages": "0.55.21",
209
+ "@happyvertical/smrt-mcp-apps": "0.55.21",
210
+ "@happyvertical/smrt-types": "0.55.21",
211
+ "@happyvertical/smrt-ui": "0.55.21",
212
+ "@happyvertical/smrt-web": "0.55.21",
213
213
  "@tanstack/db": "^0.6.14",
214
214
  "@tanstack/svelte-db": "^0.1.91",
215
215
  "esm-env": "^1.2.2"
@@ -244,14 +244,14 @@
244
244
  }
245
245
  },
246
246
  "devDependencies": {
247
- "@happyvertical/smrt-agents": "0.55.19",
248
- "@happyvertical/smrt-chat": "0.55.19",
249
- "@happyvertical/smrt-content": "0.55.19",
250
- "@happyvertical/smrt-core": "0.55.19",
251
- "@happyvertical/smrt-reports": "0.55.19",
252
- "@happyvertical/smrt-scanner": "0.55.19",
253
- "@happyvertical/smrt-tenancy": "0.55.19",
254
- "@happyvertical/smrt-users": "0.55.19",
247
+ "@happyvertical/smrt-agents": "0.55.21",
248
+ "@happyvertical/smrt-chat": "0.55.21",
249
+ "@happyvertical/smrt-content": "0.55.21",
250
+ "@happyvertical/smrt-core": "0.55.21",
251
+ "@happyvertical/smrt-reports": "0.55.21",
252
+ "@happyvertical/smrt-scanner": "0.55.21",
253
+ "@happyvertical/smrt-tenancy": "0.55.21",
254
+ "@happyvertical/smrt-users": "0.55.21",
255
255
  "@happyvertical/speech": "^0.103.5",
256
256
  "@sveltejs/package": "^2.5.8",
257
257
  "@sveltejs/vite-plugin-svelte": "^7.3.0",