@happyvertical/smrt-svelte 0.51.39 → 0.52.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 (114) hide show
  1. package/AGENTS.md +3 -0
  2. package/README.md +167 -1
  3. package/agents/workspace.md +24 -0
  4. package/dist/browser-ai/adapters/stt/browser-speech.d.ts +11 -0
  5. package/dist/browser-ai/adapters/stt/browser-speech.d.ts.map +1 -1
  6. package/dist/browser-ai/adapters/stt/browser-speech.js +20 -4
  7. package/dist/browser-ai/adapters/stt/browser-speech.test.js +113 -0
  8. package/dist/browser-ai/adapters/stt/dictation-source.d.ts +3 -0
  9. package/dist/browser-ai/adapters/stt/dictation-source.d.ts.map +1 -0
  10. package/dist/browser-ai/adapters/stt/dictation-source.js +38 -0
  11. package/dist/browser-ai/adapters/stt/dictation-source.test.js +52 -0
  12. package/dist/browser-ai/adapters/stt/index.d.ts +2 -1
  13. package/dist/browser-ai/adapters/stt/index.d.ts.map +1 -1
  14. package/dist/browser-ai/adapters/stt/index.js +2 -1
  15. package/dist/components/forms/Form.svelte +118 -8
  16. package/dist/components/forms/Form.svelte.d.ts +18 -2
  17. package/dist/components/forms/Form.svelte.d.ts.map +1 -1
  18. package/dist/components/forms/FormScope.svelte +202 -0
  19. package/dist/components/forms/FormScope.svelte.d.ts +22 -0
  20. package/dist/components/forms/FormScope.svelte.d.ts.map +1 -0
  21. package/dist/components/forms/__tests__/Form.ui-controls.test.js +119 -0
  22. package/dist/components/forms/__tests__/Form.webmcp.test.js +5 -3
  23. package/dist/components/forms/__tests__/FormScope.test.js +39 -0
  24. package/dist/components/forms/__tests__/form-scope.fixture.svelte +30 -0
  25. package/dist/components/forms/__tests__/form-scope.fixture.svelte.d.ts +10 -0
  26. package/dist/components/forms/__tests__/form-scope.fixture.svelte.d.ts.map +1 -0
  27. package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte +84 -0
  28. package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte.d.ts +14 -0
  29. package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte.d.ts.map +1 -0
  30. package/dist/components/forms/index.d.ts +1 -0
  31. package/dist/components/forms/index.d.ts.map +1 -1
  32. package/dist/components/forms/index.js +1 -0
  33. package/dist/components/workspace/README.md +11 -0
  34. package/dist/components/workspace/__tests__/AdminShell.responsive.test.js +586 -0
  35. package/dist/components/workspace/__tests__/AdminShell.test.js +85 -0
  36. package/dist/components/workspace/__tests__/TenantNav.test.js +49 -0
  37. package/dist/components/workspace/__tests__/admin-shell-header-overflow.test.js +25 -0
  38. package/dist/components/workspace/__tests__/admin-shell-mobile.test.js +217 -0
  39. package/dist/components/workspace/__tests__/admin-shell-page-contracts.test.js +30 -0
  40. package/dist/components/workspace/__tests__/admin-shell-responsive-state.test.js +184 -0
  41. package/dist/components/workspace/__tests__/admin-shell-theme-hooks.test.js +36 -0
  42. package/dist/components/workspace/__tests__/shell-chrome-components.test.js +108 -0
  43. package/dist/components/workspace/admin-shell/AdminShell.svelte +998 -40
  44. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts +42 -1
  45. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts.map +1 -1
  46. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte +170 -0
  47. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte.d.ts +11 -0
  48. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte.d.ts.map +1 -0
  49. package/dist/components/workspace/admin-shell/PhoneTopBar.svelte +93 -0
  50. package/dist/components/workspace/admin-shell/PhoneTopBar.svelte.d.ts +11 -0
  51. package/dist/components/workspace/admin-shell/PhoneTopBar.svelte.d.ts.map +1 -0
  52. package/dist/components/workspace/admin-shell/ShellNavToggle.svelte +88 -0
  53. package/dist/components/workspace/admin-shell/ShellNavToggle.svelte.d.ts +14 -0
  54. package/dist/components/workspace/admin-shell/ShellNavToggle.svelte.d.ts.map +1 -0
  55. package/dist/components/workspace/admin-shell/ShellTitle.svelte +42 -0
  56. package/dist/components/workspace/admin-shell/ShellTitle.svelte.d.ts +11 -0
  57. package/dist/components/workspace/admin-shell/ShellTitle.svelte.d.ts.map +1 -0
  58. package/dist/components/workspace/admin-shell/TenantNav.svelte +46 -1
  59. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts.map +1 -1
  60. package/dist/components/workspace/admin-shell/mobile-shell-dom.d.ts +37 -0
  61. package/dist/components/workspace/admin-shell/mobile-shell-dom.d.ts.map +1 -0
  62. package/dist/components/workspace/admin-shell/mobile-shell-dom.js +150 -0
  63. package/dist/components/workspace/admin-shell/mobile-shell.d.ts +191 -0
  64. package/dist/components/workspace/admin-shell/mobile-shell.d.ts.map +1 -0
  65. package/dist/components/workspace/admin-shell/mobile-shell.js +165 -0
  66. package/dist/components/workspace/admin-shell/settings.d.ts +27 -2
  67. package/dist/components/workspace/admin-shell/settings.d.ts.map +1 -1
  68. package/dist/components/workspace/admin-shell/settings.js +84 -2
  69. package/dist/components/workspace/admin-shell/state.svelte.d.ts +55 -1
  70. package/dist/components/workspace/admin-shell/state.svelte.d.ts.map +1 -1
  71. package/dist/components/workspace/admin-shell/state.svelte.js +149 -6
  72. package/dist/components/workspace/admin-shell/types.d.ts +97 -0
  73. package/dist/components/workspace/admin-shell/types.d.ts.map +1 -1
  74. package/dist/components/workspace/admin-shell/types.js +13 -0
  75. package/dist/components/workspace/index.d.ts +11 -4
  76. package/dist/components/workspace/index.d.ts.map +1 -1
  77. package/dist/components/workspace/index.js +12 -3
  78. package/dist/i18n/strings.workspace.d.ts +10 -0
  79. package/dist/i18n/strings.workspace.d.ts.map +1 -1
  80. package/dist/i18n/strings.workspace.js +10 -0
  81. package/dist/index.d.ts +1 -1
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +1 -1
  84. package/dist/web/__tests__/assistant-dock.integration.svelte.test.js +2 -2
  85. package/dist/web/__tests__/list-sort-surface.fixture.svelte +41 -0
  86. package/dist/web/__tests__/list-sort-surface.fixture.svelte.d.ts +15 -0
  87. package/dist/web/__tests__/list-sort-surface.fixture.svelte.d.ts.map +1 -0
  88. package/dist/web/__tests__/list-sort-surface.svelte.test.js +59 -0
  89. package/dist/web/__tests__/surfaces.child.fixture.svelte +69 -0
  90. package/dist/web/__tests__/surfaces.child.fixture.svelte.d.ts +16 -0
  91. package/dist/web/__tests__/surfaces.child.fixture.svelte.d.ts.map +1 -0
  92. package/dist/web/__tests__/surfaces.fixture.svelte +26 -0
  93. package/dist/web/__tests__/surfaces.fixture.svelte.d.ts +18 -0
  94. package/dist/web/__tests__/surfaces.fixture.svelte.d.ts.map +1 -0
  95. package/dist/web/__tests__/surfaces.svelte.test.js +140 -0
  96. package/dist/web/__tests__/webmcp-ui.test.js +18 -0
  97. package/dist/web/index.d.ts +4 -1
  98. package/dist/web/index.d.ts.map +1 -1
  99. package/dist/web/index.js +4 -1
  100. package/dist/web/link-surface.svelte.d.ts +14 -0
  101. package/dist/web/link-surface.svelte.d.ts.map +1 -0
  102. package/dist/web/link-surface.svelte.js +49 -0
  103. package/dist/web/list-surface.svelte.d.ts +80 -0
  104. package/dist/web/list-surface.svelte.d.ts.map +1 -0
  105. package/dist/web/list-surface.svelte.js +309 -0
  106. package/dist/web/step-surface.svelte.d.ts +17 -0
  107. package/dist/web/step-surface.svelte.d.ts.map +1 -0
  108. package/dist/web/step-surface.svelte.js +56 -0
  109. package/dist/web/webmcp-ui-context.d.ts +7 -0
  110. package/dist/web/webmcp-ui-context.d.ts.map +1 -1
  111. package/dist/web/webmcp-ui-context.js +10 -0
  112. package/dist/web/webmcp-ui.d.ts.map +1 -1
  113. package/dist/web/webmcp-ui.js +16 -3
  114. package/package.json +16 -16
@@ -0,0 +1,39 @@
1
+ import { createControlInteractionRegistry } from '@happyvertical/smrt-ui/forms';
2
+ import { render, screen, waitFor } from '@testing-library/svelte';
3
+ import { tick } from 'svelte';
4
+ import { afterEach, describe, expect, it, vi } from 'vitest';
5
+ import Fixture from './form-scope.fixture.svelte';
6
+ afterEach(() => {
7
+ delete document.modelContext;
8
+ });
9
+ describe('FormScope', () => {
10
+ it('registers a stage-only tool for the smrt-ui controls inside a plain container', async () => {
11
+ const registered = [];
12
+ document.modelContext = {
13
+ async registerTool(tool) {
14
+ registered.push(tool);
15
+ },
16
+ };
17
+ const registry = createControlInteractionRegistry();
18
+ const { container, rerender } = render(Fixture, {
19
+ props: { interactionRegistry: registry },
20
+ });
21
+ expect(container.querySelector('form')).toBeNull();
22
+ await tick();
23
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(0));
24
+ const tool = registered.at(-1);
25
+ expect(tool.name).toBe('new_site_stage_changes');
26
+ expect(Object.keys(tool.inputSchema.properties).sort()).toEqual([
27
+ 'name',
28
+ 'town',
29
+ ]);
30
+ const result = JSON.parse(await tool.execute({ name: 'Lacombe News', key: 'x' }));
31
+ expect(result).toMatchObject({ ok: true, staged: 1, skipped: ['key'] });
32
+ expect(screen.getByRole('textbox', { name: 'Site name' })).toHaveValue('');
33
+ await waitFor(() => expect(screen.getByRole('region', { name: 'Review proposed changes' })).toBeInTheDocument());
34
+ const before = registered.length;
35
+ await rerender({ interactionRegistry: registry, showTown: false });
36
+ await vi.waitFor(() => expect(registered.length).toBeGreaterThan(before));
37
+ expect(Object.keys(registered.at(-1).inputSchema.properties)).toEqual(['name']);
38
+ });
39
+ });
@@ -0,0 +1,30 @@
1
+ <script lang="ts">
2
+ import {
3
+ type ControlInteractionRegistry,
4
+ FormGroup,
5
+ Input,
6
+ } from '@happyvertical/smrt-ui/forms';
7
+ import FormScope from '../FormScope.svelte';
8
+
9
+ let {
10
+ interactionRegistry = undefined,
11
+ showTown = true,
12
+ }: {
13
+ interactionRegistry?: ControlInteractionRegistry;
14
+ showTown?: boolean;
15
+ } = $props();
16
+ let name = $state('');
17
+ let town = $state('');
18
+ let secret = $state('');
19
+ </script>
20
+
21
+ <FormScope formId="new-site" purpose="Start a new town site" {interactionRegistry}>
22
+ <div class="wizard">
23
+ <FormGroup label="Site name" id="site-name"><Input name="name" bind:value={name} /></FormGroup>
24
+ {#if showTown}
25
+ <FormGroup label="Town" id="site-town"><Input name="town" bind:value={town} /></FormGroup>
26
+ {/if}
27
+ <FormGroup label="Access key" id="site-key"><Input name="key" type="password" bind:value={secret} /></FormGroup>
28
+ <button type="button">Continue</button>
29
+ </div>
30
+ </FormScope>
@@ -0,0 +1,10 @@
1
+ import { type ControlInteractionRegistry } from '@happyvertical/smrt-ui/forms';
2
+ import FormScope from '../FormScope.svelte';
3
+ type $$ComponentProps = {
4
+ interactionRegistry?: ControlInteractionRegistry;
5
+ showTown?: boolean;
6
+ };
7
+ declare const FormScope: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type FormScope = ReturnType<typeof FormScope>;
9
+ export default FormScope;
10
+ //# sourceMappingURL=form-scope.fixture.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-scope.fixture.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/__tests__/form-scope.fixture.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,8BAA8B,CAAC;AACtC,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAE3C,KAAK,gBAAgB,GAAI;IACxB,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AA2BF,QAAA,MAAM,SAAS,sDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -0,0 +1,84 @@
1
+ <script lang="ts">
2
+ /** Rich Form hosting smrt-ui primitives, native attributes, and `enhance`. */
3
+ import {
4
+ Combobox,
5
+ type ControlInteractionRegistry,
6
+ FormGroup,
7
+ Input,
8
+ Select,
9
+ } from '@happyvertical/smrt-ui/forms';
10
+ import type { Attachment } from 'svelte/attachments';
11
+ import Form, { type FormEnhance } from '../Form.svelte';
12
+ import TextInput from '../TextInput.svelte';
13
+
14
+ let {
15
+ enhance = undefined,
16
+ attach = undefined,
17
+ interactionRegistry = undefined,
18
+ nameValue = $bindable(''),
19
+ }: {
20
+ enhance?: FormEnhance;
21
+ attach?: Attachment<HTMLFormElement>;
22
+ interactionRegistry?: ControlInteractionRegistry;
23
+ nameValue?: string;
24
+ } = $props();
25
+ let kind = $state('news');
26
+ let town = $state('lacombe');
27
+ let tagline = $state('');
28
+ </script>
29
+
30
+ {#if attach}
31
+ <Form
32
+ formId="setup-network"
33
+ webmcp
34
+ method="POST"
35
+ action="?/create"
36
+ enctype="multipart/form-data"
37
+ novalidate
38
+ aria-label="Set up your network"
39
+ data-testid="network-form"
40
+ {enhance}
41
+ {interactionRegistry}
42
+ {@attach attach}
43
+ >
44
+ {@render fields()}
45
+ </Form>
46
+ {:else}
47
+ <Form
48
+ formId="setup-network"
49
+ webmcp
50
+ method="POST"
51
+ action="?/create"
52
+ enctype="multipart/form-data"
53
+ novalidate
54
+ aria-label="Set up your network"
55
+ data-testid="network-form"
56
+ {enhance}
57
+ {interactionRegistry}
58
+ >
59
+ {@render fields()}
60
+ </Form>
61
+ {/if}
62
+
63
+ {#snippet fields()}
64
+ <FormGroup label="Network name" id="name">
65
+ <Input name="name" bind:value={nameValue} />
66
+ </FormGroup>
67
+ <FormGroup label="Kind of network" id="kind">
68
+ <Select name="kind" bind:value={kind}>
69
+ <option value="news">News</option>
70
+ <option value="aggregator">Roundup</option>
71
+ </Select>
72
+ </FormGroup>
73
+ <Combobox
74
+ name="town"
75
+ label="Home town"
76
+ options={[
77
+ { value: 'lacombe', label: 'Lacombe' },
78
+ { value: 'blackfalds', label: 'Blackfalds' },
79
+ ]}
80
+ bind:value={town}
81
+ />
82
+ <TextInput name="tagline" label="Tagline" bind:value={tagline} />
83
+ <button type="submit">Create</button>
84
+ {/snippet}
@@ -0,0 +1,14 @@
1
+ /** Rich Form hosting smrt-ui primitives, native attributes, and `enhance`. */
2
+ import { type ControlInteractionRegistry } from '@happyvertical/smrt-ui/forms';
3
+ import type { Attachment } from 'svelte/attachments';
4
+ import { type FormEnhance } from '../Form.svelte';
5
+ type $$ComponentProps = {
6
+ enhance?: FormEnhance;
7
+ attach?: Attachment<HTMLFormElement>;
8
+ interactionRegistry?: ControlInteractionRegistry;
9
+ nameValue?: string;
10
+ };
11
+ declare const FormWithUiControls: import("svelte").Component<$$ComponentProps, {}, "nameValue">;
12
+ type FormWithUiControls = ReturnType<typeof FormWithUiControls>;
13
+ export default FormWithUiControls;
14
+ //# sourceMappingURL=form-with-ui-controls.fixture.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-with-ui-controls.fixture.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/__tests__/form-with-ui-controls.fixture.svelte.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,OAAO,EAEL,KAAK,0BAA0B,EAIhC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAa,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGvD,KAAK,gBAAgB,GAAI;IACxB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;IACrC,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAiDF,QAAA,MAAM,kBAAkB,+DAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -16,6 +16,7 @@ export { default as DateTimeInput } from './DateTimeInput.svelte';
16
16
  export { default as FileUpload } from './FileUpload.svelte';
17
17
  export { default as Form } from './Form.svelte';
18
18
  export { default as FormMicButton } from './FormMicButton.svelte';
19
+ export { default as FormScope } from './FormScope.svelte';
19
20
  export { default as MeasurementInput } from './MeasurementInput.svelte';
20
21
  export { default as MoneyInput } from './MoneyInput.svelte';
21
22
  export { default as NumberInput } from './NumberInput.svelte';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,MAAM,GACP,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1D,YAAY,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,MAAM,GACP,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1D,YAAY,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -18,6 +18,7 @@ export { default as DateTimeInput } from './DateTimeInput.svelte';
18
18
  export { default as FileUpload } from './FileUpload.svelte';
19
19
  export { default as Form } from './Form.svelte';
20
20
  export { default as FormMicButton } from './FormMicButton.svelte';
21
+ export { default as FormScope } from './FormScope.svelte';
21
22
  export { default as MeasurementInput } from './MeasurementInput.svelte';
22
23
  export { default as MoneyInput } from './MoneyInput.svelte';
23
24
  export { default as NumberInput } from './NumberInput.svelte';
@@ -31,6 +31,17 @@ restoration at mobile and desktop widths.
31
31
  - `ActivityBadge`, `ActivityList`, `ActivityItem`, `ActivityToasts`
32
32
  - `AppScopePanel`, `SystemStatusChips`, `SystemScopePanel`
33
33
  - `tenantNavFromManifest`
34
+ - Responsive chrome: `ShellNavToggle`, `ShellTitle`, `PhoneTopBar`,
35
+ `PhoneBottomBar`, the pure `mobile-shell` helpers (`ScrollChrome`,
36
+ `shellPageTrailFor`, `phoneTopBarFor`, `bottomBarMode`, `keyboardLikelyOpen`, …) and their DOM
37
+ installers (`installShellViewport`, `installScrollChrome`,
38
+ `installKeyboardWatcher`, `watchFormActionBar`)
39
+
40
+ `AdminShell` takes `header`, `phoneTopBar`, `phoneBottomBar` and `overlays`
41
+ snippets plus `phone`, `pinChrome` and `path` props; edges take
42
+ `viewportDefaults`, `phone`, `resizable`, `persist` and `keepMounted`; nav
43
+ items take `attention`. See the package README
44
+ ("Responsive chrome and resizable edges") for the contract.
34
45
 
35
46
  Use `AdminShell`'s `tenantFooter` snippet with `WorkspaceAccountMenu` to keep a
36
47
  single-line tenant/account control pinned below scrolling tenant navigation.