@happyvertical/smrt-svelte 0.30.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.
- package/AGENTS.md +317 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +185 -0
- package/dist/Provider.svelte +204 -0
- package/dist/Provider.svelte.d.ts +73 -0
- package/dist/Provider.svelte.d.ts.map +1 -0
- package/dist/__tests__/app-state.test.js +156 -0
- package/dist/__tests__/warm-clients.test.js +186 -0
- package/dist/browser-ai/adapters/llm/factory.d.ts +38 -0
- package/dist/browser-ai/adapters/llm/factory.d.ts.map +1 -0
- package/dist/browser-ai/adapters/llm/factory.js +91 -0
- package/dist/browser-ai/adapters/llm/index.d.ts +7 -0
- package/dist/browser-ai/adapters/llm/index.d.ts.map +1 -0
- package/dist/browser-ai/adapters/llm/index.js +6 -0
- package/dist/browser-ai/adapters/llm/types.d.ts +182 -0
- package/dist/browser-ai/adapters/llm/types.d.ts.map +1 -0
- package/dist/browser-ai/adapters/llm/types.js +43 -0
- package/dist/browser-ai/adapters/llm/webllm.d.ts +33 -0
- package/dist/browser-ai/adapters/llm/webllm.d.ts.map +1 -0
- package/dist/browser-ai/adapters/llm/webllm.js +225 -0
- package/dist/browser-ai/adapters/stt/browser-speech.d.ts +31 -0
- package/dist/browser-ai/adapters/stt/browser-speech.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/browser-speech.js +217 -0
- package/dist/browser-ai/adapters/stt/factory.d.ts +49 -0
- package/dist/browser-ai/adapters/stt/factory.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/factory.js +110 -0
- package/dist/browser-ai/adapters/stt/index.d.ts +9 -0
- package/dist/browser-ai/adapters/stt/index.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/index.js +8 -0
- package/dist/browser-ai/adapters/stt/types.d.ts +154 -0
- package/dist/browser-ai/adapters/stt/types.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/types.js +4 -0
- package/dist/browser-ai/adapters/stt/whisper-cpp.d.ts +46 -0
- package/dist/browser-ai/adapters/stt/whisper-cpp.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/whisper-cpp.js +348 -0
- package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts +51 -0
- package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts.map +1 -0
- package/dist/browser-ai/adapters/stt/whisper-wasm.js +380 -0
- package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts +42 -0
- package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts.map +1 -0
- package/dist/browser-ai/adapters/tts/browser-synthesis.js +235 -0
- package/dist/browser-ai/adapters/tts/factory.d.ts +53 -0
- package/dist/browser-ai/adapters/tts/factory.d.ts.map +1 -0
- package/dist/browser-ai/adapters/tts/factory.js +92 -0
- package/dist/browser-ai/adapters/tts/index.d.ts +7 -0
- package/dist/browser-ai/adapters/tts/index.d.ts.map +1 -0
- package/dist/browser-ai/adapters/tts/index.js +6 -0
- package/dist/browser-ai/adapters/tts/types.d.ts +140 -0
- package/dist/browser-ai/adapters/tts/types.d.ts.map +1 -0
- package/dist/browser-ai/adapters/tts/types.js +4 -0
- package/dist/browser-ai/capabilities/detector.d.ts +38 -0
- package/dist/browser-ai/capabilities/detector.d.ts.map +1 -0
- package/dist/browser-ai/capabilities/detector.js +211 -0
- package/dist/browser-ai/core/errors.d.ts +62 -0
- package/dist/browser-ai/core/errors.d.ts.map +1 -0
- package/dist/browser-ai/core/errors.js +92 -0
- package/dist/browser-ai/core/index.d.ts +6 -0
- package/dist/browser-ai/core/index.d.ts.map +1 -0
- package/dist/browser-ai/core/index.js +5 -0
- package/dist/browser-ai/core/types.d.ts +115 -0
- package/dist/browser-ai/core/types.d.ts.map +1 -0
- package/dist/browser-ai/core/types.js +34 -0
- package/dist/browser-ai/index.d.ts +12 -0
- package/dist/browser-ai/index.d.ts.map +1 -0
- package/dist/browser-ai/index.js +16 -0
- package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte +77 -0
- package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte.d.ts +16 -0
- package/dist/browser-ai/svelte/components/AILoadingOverlay.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/components/CapabilityGate.svelte +57 -0
- package/dist/browser-ai/svelte/components/CapabilityGate.svelte.d.ts +15 -0
- package/dist/browser-ai/svelte/components/CapabilityGate.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/components/DownloadProgress.svelte +141 -0
- package/dist/browser-ai/svelte/components/DownloadProgress.svelte.d.ts +15 -0
- package/dist/browser-ai/svelte/components/DownloadProgress.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/components/STTTest.svelte +379 -0
- package/dist/browser-ai/svelte/components/STTTest.svelte.d.ts +9 -0
- package/dist/browser-ai/svelte/components/STTTest.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/components/VoiceInput.svelte +200 -0
- package/dist/browser-ai/svelte/components/VoiceInput.svelte.d.ts +16 -0
- package/dist/browser-ai/svelte/components/VoiceInput.svelte.d.ts.map +1 -0
- package/dist/browser-ai/svelte/index.d.ts +15 -0
- package/dist/browser-ai/svelte/index.d.ts.map +1 -0
- package/dist/browser-ai/svelte/index.js +28 -0
- package/dist/browser-ai/ui.d.ts +16 -0
- package/dist/browser-ai/ui.d.ts.map +1 -0
- package/dist/browser-ai/ui.js +67 -0
- package/dist/components/admin/AgentAdminPanel.svelte +111 -0
- package/dist/components/admin/AgentAdminPanel.svelte.d.ts +25 -0
- package/dist/components/admin/AgentAdminPanel.svelte.d.ts.map +1 -0
- package/dist/components/admin/AgentAdminTabs.svelte +280 -0
- package/dist/components/admin/AgentAdminTabs.svelte.d.ts +23 -0
- package/dist/components/admin/AgentAdminTabs.svelte.d.ts.map +1 -0
- package/dist/components/admin/AgentSettingsShell.svelte +257 -0
- package/dist/components/admin/AgentSettingsShell.svelte.d.ts +33 -0
- package/dist/components/admin/AgentSettingsShell.svelte.d.ts.map +1 -0
- package/dist/components/admin/index.d.ts +5 -0
- package/dist/components/admin/index.d.ts.map +1 -0
- package/dist/components/admin/index.js +6 -0
- package/dist/components/forms/AddressInput.svelte +500 -0
- package/dist/components/forms/AddressInput.svelte.d.ts +36 -0
- package/dist/components/forms/AddressInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/CheckboxInput.svelte +208 -0
- package/dist/components/forms/CheckboxInput.svelte.d.ts +20 -0
- package/dist/components/forms/CheckboxInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/DateRangeInput.svelte +628 -0
- package/dist/components/forms/DateRangeInput.svelte.d.ts +33 -0
- package/dist/components/forms/DateRangeInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/DateTimeInput.svelte +521 -0
- package/dist/components/forms/DateTimeInput.svelte.d.ts +24 -0
- package/dist/components/forms/DateTimeInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/FileUpload.svelte +358 -0
- package/dist/components/forms/FileUpload.svelte.d.ts +22 -0
- package/dist/components/forms/FileUpload.svelte.d.ts.map +1 -0
- package/dist/components/forms/Form.svelte +771 -0
- package/dist/components/forms/Form.svelte.d.ts +26 -0
- package/dist/components/forms/Form.svelte.d.ts.map +1 -0
- package/dist/components/forms/FormGroup.svelte +86 -0
- package/dist/components/forms/FormGroup.svelte.d.ts +13 -0
- package/dist/components/forms/FormGroup.svelte.d.ts.map +1 -0
- package/dist/components/forms/FormMicButton.svelte +179 -0
- package/dist/components/forms/FormMicButton.svelte.d.ts +10 -0
- package/dist/components/forms/FormMicButton.svelte.d.ts.map +1 -0
- package/dist/components/forms/Input.svelte +83 -0
- package/dist/components/forms/Input.svelte.d.ts +9 -0
- package/dist/components/forms/Input.svelte.d.ts.map +1 -0
- package/dist/components/forms/MeasurementInput.svelte +505 -0
- package/dist/components/forms/MeasurementInput.svelte.d.ts +35 -0
- package/dist/components/forms/MeasurementInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/MoneyInput.svelte +412 -0
- package/dist/components/forms/MoneyInput.svelte.d.ts +30 -0
- package/dist/components/forms/MoneyInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/NumberInput.svelte +310 -0
- package/dist/components/forms/NumberInput.svelte.d.ts +28 -0
- package/dist/components/forms/NumberInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/PhoneInput.svelte +530 -0
- package/dist/components/forms/PhoneInput.svelte.d.ts +22 -0
- package/dist/components/forms/PhoneInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/SearchInput.svelte +358 -0
- package/dist/components/forms/SearchInput.svelte.d.ts +33 -0
- package/dist/components/forms/SearchInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/Select.svelte +83 -0
- package/dist/components/forms/Select.svelte.d.ts +11 -0
- package/dist/components/forms/Select.svelte.d.ts.map +1 -0
- package/dist/components/forms/SelectInput.svelte +254 -0
- package/dist/components/forms/SelectInput.svelte.d.ts +25 -0
- package/dist/components/forms/SelectInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/TextInput.svelte +415 -0
- package/dist/components/forms/TextInput.svelte.d.ts +26 -0
- package/dist/components/forms/TextInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/Textarea.svelte +85 -0
- package/dist/components/forms/Textarea.svelte.d.ts +10 -0
- package/dist/components/forms/Textarea.svelte.d.ts.map +1 -0
- package/dist/components/forms/TextareaInput.svelte +386 -0
- package/dist/components/forms/TextareaInput.svelte.d.ts +26 -0
- package/dist/components/forms/TextareaInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/Toggle.svelte +217 -0
- package/dist/components/forms/Toggle.svelte.d.ts +37 -0
- package/dist/components/forms/Toggle.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/AddressInput.behavior.test.js +122 -0
- package/dist/components/forms/__tests__/CheckboxInput.test.js +92 -0
- package/dist/components/forms/__tests__/DateRangeInput.behavior.test.js +135 -0
- package/dist/components/forms/__tests__/DateTimeInput.behavior.test.js +103 -0
- package/dist/components/forms/__tests__/FileUpload.test.js +90 -0
- package/dist/components/forms/__tests__/Form.behavior.test.js +137 -0
- package/dist/components/forms/__tests__/Form.test.js +58 -0
- package/dist/components/forms/__tests__/FormGroup.test.js +48 -0
- package/dist/components/forms/__tests__/FormMicButton.test.js +86 -0
- package/dist/components/forms/__tests__/Input.test.js +49 -0
- package/dist/components/forms/__tests__/MeasurementInput.behavior.test.js +129 -0
- package/dist/components/forms/__tests__/MoneyInput.behavior.test.js +124 -0
- package/dist/components/forms/__tests__/NumberInput.behavior.test.js +141 -0
- package/dist/components/forms/__tests__/PhoneInput.behavior.test.js +96 -0
- package/dist/components/forms/__tests__/SearchInput.test.js +79 -0
- package/dist/components/forms/__tests__/Select.test.js +37 -0
- package/dist/components/forms/__tests__/SelectInput.behavior.test.js +132 -0
- package/dist/components/forms/__tests__/TextInput.behavior.test.js +131 -0
- package/dist/components/forms/__tests__/Textarea.test.js +39 -0
- package/dist/components/forms/__tests__/TextareaInput.behavior.test.js +96 -0
- package/dist/components/forms/__tests__/Toggle.test.js +87 -0
- package/dist/components/forms/__tests__/composite-inputs-a11y.test.js +69 -0
- package/dist/components/forms/__tests__/form-group-input.fixture.svelte +16 -0
- package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts +9 -0
- package/dist/components/forms/__tests__/form-group-input.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte +33 -0
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts +12 -0
- package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/rich-inputs-a11y.test.js +87 -0
- package/dist/components/forms/index.d.ts +25 -0
- package/dist/components/forms/index.d.ts.map +1 -0
- package/dist/components/forms/index.js +25 -0
- package/dist/components/forms/types.d.ts +33 -0
- package/dist/components/forms/types.d.ts.map +1 -0
- package/dist/components/forms/types.js +4 -0
- package/dist/components/module/ModulePanel.svelte +134 -0
- package/dist/components/module/ModulePanel.svelte.d.ts +22 -0
- package/dist/components/module/ModulePanel.svelte.d.ts.map +1 -0
- package/dist/components/module/index.d.ts +5 -0
- package/dist/components/module/index.d.ts.map +1 -0
- package/dist/components/module/index.js +4 -0
- package/dist/components/workspace/Breadcrumbs.svelte +141 -0
- package/dist/components/workspace/Breadcrumbs.svelte.d.ts +21 -0
- package/dist/components/workspace/Breadcrumbs.svelte.d.ts.map +1 -0
- package/dist/components/workspace/NavTree.svelte +354 -0
- package/dist/components/workspace/NavTree.svelte.d.ts +45 -0
- package/dist/components/workspace/NavTree.svelte.d.ts.map +1 -0
- package/dist/components/workspace/README.md +34 -0
- package/dist/components/workspace/RoleShell.svelte +309 -0
- package/dist/components/workspace/RoleShell.svelte.d.ts +91 -0
- package/dist/components/workspace/RoleShell.svelte.d.ts.map +1 -0
- package/dist/components/workspace/WorkspaceShell.svelte +951 -0
- package/dist/components/workspace/WorkspaceShell.svelte.d.ts +112 -0
- package/dist/components/workspace/WorkspaceShell.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/RoleShell.test.js +772 -0
- package/dist/components/workspace/__tests__/WorkspaceShell.test.js +630 -0
- package/dist/components/workspace/__tests__/breadcrumbs-helpers.test.js +141 -0
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte +45 -0
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts +21 -0
- package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/define-tools-dock.test.js +1010 -0
- package/dist/components/workspace/__tests__/harness.svelte +25 -0
- package/dist/components/workspace/__tests__/harness.svelte.d.ts +14 -0
- package/dist/components/workspace/__tests__/harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/index.test.js +37 -0
- package/dist/components/workspace/__tests__/manifest-nav-helpers.test.js +24 -0
- package/dist/components/workspace/__tests__/manifest-nav.test.js +599 -0
- package/dist/components/workspace/__tests__/nav-helpers.test.js +95 -0
- package/dist/components/workspace/__tests__/render-harness.svelte +66 -0
- package/dist/components/workspace/__tests__/render-harness.svelte.d.ts +32 -0
- package/dist/components/workspace/__tests__/render-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/render-tools-dock.test.js +243 -0
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte +58 -0
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts +16 -0
- package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte +41 -0
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts +13 -0
- package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/test-icon.svelte +17 -0
- package/dist/components/workspace/__tests__/test-icon.svelte.d.ts +19 -0
- package/dist/components/workspace/__tests__/test-icon.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte +38 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts +22 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts +65 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.js +115 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts +15 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.js +7 -0
- package/dist/components/workspace/__tests__/typed-tool-fixture.test.js +115 -0
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte +9 -0
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts +19 -0
- package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/use-harness.svelte +23 -0
- package/dist/components/workspace/__tests__/use-harness.svelte.d.ts +8 -0
- package/dist/components/workspace/__tests__/use-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/__tests__/use-tools-dock.test.js +33 -0
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte +43 -0
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts +11 -0
- package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts.map +1 -0
- package/dist/components/workspace/breadcrumbs-helpers.d.ts +44 -0
- package/dist/components/workspace/breadcrumbs-helpers.d.ts.map +1 -0
- package/dist/components/workspace/breadcrumbs-helpers.js +88 -0
- package/dist/components/workspace/index.d.ts +16 -0
- package/dist/components/workspace/index.d.ts.map +1 -0
- package/dist/components/workspace/index.js +14 -0
- package/dist/components/workspace/manifest-nav.d.ts +200 -0
- package/dist/components/workspace/manifest-nav.d.ts.map +1 -0
- package/dist/components/workspace/manifest-nav.js +408 -0
- package/dist/components/workspace/nav-helpers.d.ts +36 -0
- package/dist/components/workspace/nav-helpers.d.ts.map +1 -0
- package/dist/components/workspace/nav-helpers.js +60 -0
- package/dist/components/workspace/server/__tests__/compose-availability.test.js +383 -0
- package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts +78 -0
- package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts.map +1 -0
- package/dist/components/workspace/server/__tests__/typed-context-fixture.js +104 -0
- package/dist/components/workspace/server/compose-availability.d.ts +73 -0
- package/dist/components/workspace/server/compose-availability.d.ts.map +1 -0
- package/dist/components/workspace/server/compose-availability.js +114 -0
- package/dist/components/workspace/server/index.d.ts +13 -0
- package/dist/components/workspace/server/index.d.ts.map +1 -0
- package/dist/components/workspace/server/index.js +11 -0
- package/dist/components/workspace/server/types.d.ts +108 -0
- package/dist/components/workspace/server/types.d.ts.map +1 -0
- package/dist/components/workspace/server/types.js +11 -0
- package/dist/components/workspace/tools-dock/ToolsDock.svelte +565 -0
- package/dist/components/workspace/tools-dock/ToolsDock.svelte.d.ts +14 -0
- package/dist/components/workspace/tools-dock/ToolsDock.svelte.d.ts.map +1 -0
- package/dist/components/workspace/tools-dock/define-tools-dock.svelte.d.ts +143 -0
- package/dist/components/workspace/tools-dock/define-tools-dock.svelte.d.ts.map +1 -0
- package/dist/components/workspace/tools-dock/define-tools-dock.svelte.js +487 -0
- package/dist/components/workspace/tools-dock/use-tools-dock.d.ts +41 -0
- package/dist/components/workspace/tools-dock/use-tools-dock.d.ts.map +1 -0
- package/dist/components/workspace/tools-dock/use-tools-dock.js +50 -0
- package/dist/components/workspace/types.d.ts +372 -0
- package/dist/components/workspace/types.d.ts.map +1 -0
- package/dist/components/workspace/types.js +6 -0
- package/dist/hooks/index.d.ts +11 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/useAppState.svelte.d.ts +46 -0
- package/dist/hooks/useAppState.svelte.d.ts.map +1 -0
- package/dist/hooks/useAppState.svelte.js +59 -0
- package/dist/hooks/useAuth.svelte.d.ts +41 -0
- package/dist/hooks/useAuth.svelte.d.ts.map +1 -0
- package/dist/hooks/useAuth.svelte.js +43 -0
- package/dist/hooks/useLLM.svelte.d.ts +69 -0
- package/dist/hooks/useLLM.svelte.d.ts.map +1 -0
- package/dist/hooks/useLLM.svelte.js +85 -0
- package/dist/hooks/useSTT.svelte.d.ts +68 -0
- package/dist/hooks/useSTT.svelte.d.ts.map +1 -0
- package/dist/hooks/useSTT.svelte.js +97 -0
- package/dist/hooks/useSocket.svelte.d.ts +45 -0
- package/dist/hooks/useSocket.svelte.d.ts.map +1 -0
- package/dist/hooks/useSocket.svelte.js +54 -0
- package/dist/hooks/useTTS.svelte.d.ts +65 -0
- package/dist/hooks/useTTS.svelte.d.ts.map +1 -0
- package/dist/hooks/useTTS.svelte.js +93 -0
- package/dist/hooks/useTheme.d.ts +13 -0
- package/dist/hooks/useTheme.d.ts.map +1 -0
- package/dist/hooks/useTheme.js +16 -0
- package/dist/i18n/__tests__/server.spec.js +50 -0
- package/dist/i18n/server.d.ts +47 -0
- package/dist/i18n/server.d.ts.map +1 -0
- package/dist/i18n/server.js +58 -0
- package/dist/i18n/strings.forms.d.ts +33 -0
- package/dist/i18n/strings.forms.d.ts.map +1 -0
- package/dist/i18n/strings.forms.js +54 -0
- package/dist/i18n/strings.workspace.d.ts +34 -0
- package/dist/i18n/strings.workspace.d.ts.map +1 -0
- package/dist/i18n/strings.workspace.js +40 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/state/__tests__/warm-clients.test.js +40 -0
- package/dist/state/app-state.d.ts +308 -0
- package/dist/state/app-state.d.ts.map +1 -0
- package/dist/state/app-state.js +64 -0
- package/dist/state/app-state.svelte.d.ts +196 -0
- package/dist/state/app-state.svelte.d.ts.map +1 -0
- package/dist/state/app-state.svelte.js +774 -0
- package/dist/state/context.d.ts +23 -0
- package/dist/state/context.d.ts.map +1 -0
- package/dist/state/context.js +32 -0
- package/dist/state/form-context.d.ts +59 -0
- package/dist/state/form-context.d.ts.map +1 -0
- package/dist/state/form-context.js +31 -0
- package/dist/state/form-group-context.d.ts +13 -0
- package/dist/state/form-group-context.d.ts.map +1 -0
- package/dist/state/form-group-context.js +28 -0
- package/dist/state/index.d.ts +9 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +8 -0
- package/dist/state/warm-clients.d.ts +136 -0
- package/dist/state/warm-clients.d.ts.map +1 -0
- package/dist/state/warm-clients.js +231 -0
- package/package.json +137 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility golden tests for the standalone rich form inputs (Sweep L1,
|
|
3
|
+
* #1420). These inputs carry their own <label> + supporting/error text (they do
|
|
4
|
+
* NOT compose the base primitives), so each was given aria-describedby →
|
|
5
|
+
* supporting text and aria-invalid on its error state.
|
|
6
|
+
*
|
|
7
|
+
* They depend on the Provider-backed useAppState/useSTT hooks (which throw
|
|
8
|
+
* outside a <Provider>), so both are mocked once here to non-listening stubs.
|
|
9
|
+
*/
|
|
10
|
+
import { expectNoA11yViolations } from '@happyvertical/smrt-ui/test-support/a11y';
|
|
11
|
+
import { render, screen } from '@testing-library/svelte';
|
|
12
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
13
|
+
vi.mock('../../../hooks/useAppState.svelte.js', () => ({
|
|
14
|
+
useAppState: () => ({ state: { mode: 'default' }, setMode: vi.fn() }),
|
|
15
|
+
}));
|
|
16
|
+
vi.mock('../../../hooks/useSTT.svelte.js', () => ({
|
|
17
|
+
useSTT: () => ({
|
|
18
|
+
isListening: false,
|
|
19
|
+
isInitializing: false,
|
|
20
|
+
isReady: false,
|
|
21
|
+
adapterType: null,
|
|
22
|
+
downloadProgress: 0,
|
|
23
|
+
lastResult: '',
|
|
24
|
+
initialize: vi.fn(),
|
|
25
|
+
start: vi.fn(),
|
|
26
|
+
stop: vi.fn(),
|
|
27
|
+
}),
|
|
28
|
+
}));
|
|
29
|
+
import NumberInput from '../NumberInput.svelte';
|
|
30
|
+
import PhoneInput from '../PhoneInput.svelte';
|
|
31
|
+
import SelectInput from '../SelectInput.svelte';
|
|
32
|
+
import TextareaInput from '../TextareaInput.svelte';
|
|
33
|
+
import TextInput from '../TextInput.svelte';
|
|
34
|
+
describe('rich form inputs — accessibility', () => {
|
|
35
|
+
it('TextInput: labelled + describedby + axe-clean', async () => {
|
|
36
|
+
const { container } = render(TextInput, {
|
|
37
|
+
props: { name: 'fullname', label: 'Full name' },
|
|
38
|
+
});
|
|
39
|
+
const input = screen.getByLabelText('Full name');
|
|
40
|
+
expect(input).toHaveAttribute('aria-describedby', 'fullname-supporting');
|
|
41
|
+
await expectNoA11yViolations(container);
|
|
42
|
+
});
|
|
43
|
+
it('TextareaInput: labelled + describedby + axe-clean', async () => {
|
|
44
|
+
const { container } = render(TextareaInput, {
|
|
45
|
+
props: { name: 'bio', label: 'Bio' },
|
|
46
|
+
});
|
|
47
|
+
const input = screen.getByLabelText('Bio');
|
|
48
|
+
expect(input).toHaveAttribute('aria-describedby', 'bio-supporting');
|
|
49
|
+
await expectNoA11yViolations(container);
|
|
50
|
+
});
|
|
51
|
+
it('SelectInput: labelled + describedby + axe-clean', async () => {
|
|
52
|
+
const { container } = render(SelectInput, {
|
|
53
|
+
props: {
|
|
54
|
+
name: 'country',
|
|
55
|
+
label: 'Country',
|
|
56
|
+
placeholder: 'Choose…',
|
|
57
|
+
options: [{ value: 'us', label: 'United States' }],
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
const select = screen.getByLabelText('Country');
|
|
61
|
+
expect(select).toHaveAttribute('aria-describedby', 'country-supporting');
|
|
62
|
+
await expectNoA11yViolations(container);
|
|
63
|
+
});
|
|
64
|
+
it('PhoneInput: labelled + axe-clean', async () => {
|
|
65
|
+
const { container } = render(PhoneInput, {
|
|
66
|
+
props: { name: 'phone', label: 'Phone' },
|
|
67
|
+
});
|
|
68
|
+
expect(screen.getByLabelText('Phone')).toBeInTheDocument();
|
|
69
|
+
await expectNoA11yViolations(container);
|
|
70
|
+
});
|
|
71
|
+
it('NumberInput: labelled + axe-clean', async () => {
|
|
72
|
+
const { container } = render(NumberInput, {
|
|
73
|
+
props: { name: 'age', label: 'Age' },
|
|
74
|
+
});
|
|
75
|
+
expect(screen.getByLabelText('Age')).toBeInTheDocument();
|
|
76
|
+
await expectNoA11yViolations(container);
|
|
77
|
+
});
|
|
78
|
+
it('NumberInput: sets aria-invalid + links the error when out of range', () => {
|
|
79
|
+
render(NumberInput, {
|
|
80
|
+
props: { name: 'age', label: 'Age', max: 10, value: 99 },
|
|
81
|
+
});
|
|
82
|
+
const input = screen.getByLabelText('Age');
|
|
83
|
+
expect(input).toHaveAttribute('aria-invalid', 'true');
|
|
84
|
+
expect(input).toHaveAttribute('aria-describedby', 'age-error');
|
|
85
|
+
expect(document.getElementById('age-error')).toHaveAttribute('role', 'alert');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMRT Form components with voice input capabilities
|
|
3
|
+
*/
|
|
4
|
+
export { default as AddressInput } from './AddressInput.svelte';
|
|
5
|
+
export { default as CheckboxInput } from './CheckboxInput.svelte';
|
|
6
|
+
export { default as DateRangeInput } from './DateRangeInput.svelte';
|
|
7
|
+
export { default as DateTimeInput } from './DateTimeInput.svelte';
|
|
8
|
+
export { default as FileUpload } from './FileUpload.svelte';
|
|
9
|
+
export { default as Form } from './Form.svelte';
|
|
10
|
+
export { default as FormGroup } from './FormGroup.svelte';
|
|
11
|
+
export { default as FormMicButton } from './FormMicButton.svelte';
|
|
12
|
+
export { default as Input } from './Input.svelte';
|
|
13
|
+
export { default as MeasurementInput } from './MeasurementInput.svelte';
|
|
14
|
+
export { default as MoneyInput } from './MoneyInput.svelte';
|
|
15
|
+
export { default as NumberInput } from './NumberInput.svelte';
|
|
16
|
+
export { default as PhoneInput } from './PhoneInput.svelte';
|
|
17
|
+
export { default as SearchInput } from './SearchInput.svelte';
|
|
18
|
+
export { default as Select } from './Select.svelte';
|
|
19
|
+
export { default as SelectInput } from './SelectInput.svelte';
|
|
20
|
+
export { default as Textarea } from './Textarea.svelte';
|
|
21
|
+
export { default as TextareaInput } from './TextareaInput.svelte';
|
|
22
|
+
export { default as TextInput } from './TextInput.svelte';
|
|
23
|
+
export { default as Toggle } from './Toggle.svelte';
|
|
24
|
+
export type { AddressValue, DateRangeValue, LLMModelId, MeasurementUnit, MeasurementValue, SelectOption, STTAdapterType, } from './types.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/forms/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,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;AAEhD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,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,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGpD,YAAY,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMRT Form components with voice input capabilities
|
|
3
|
+
*/
|
|
4
|
+
// SMRT-enhanced form components with voice support (v2.0 naming)
|
|
5
|
+
export { default as AddressInput } from './AddressInput.svelte';
|
|
6
|
+
export { default as CheckboxInput } from './CheckboxInput.svelte';
|
|
7
|
+
export { default as DateRangeInput } from './DateRangeInput.svelte';
|
|
8
|
+
export { default as DateTimeInput } from './DateTimeInput.svelte';
|
|
9
|
+
export { default as FileUpload } from './FileUpload.svelte';
|
|
10
|
+
export { default as Form } from './Form.svelte';
|
|
11
|
+
// Generic form components (migrated from @happyvertical/svelte)
|
|
12
|
+
export { default as FormGroup } from './FormGroup.svelte';
|
|
13
|
+
export { default as FormMicButton } from './FormMicButton.svelte';
|
|
14
|
+
export { default as Input } from './Input.svelte';
|
|
15
|
+
export { default as MeasurementInput } from './MeasurementInput.svelte';
|
|
16
|
+
export { default as MoneyInput } from './MoneyInput.svelte';
|
|
17
|
+
export { default as NumberInput } from './NumberInput.svelte';
|
|
18
|
+
export { default as PhoneInput } from './PhoneInput.svelte';
|
|
19
|
+
export { default as SearchInput } from './SearchInput.svelte';
|
|
20
|
+
export { default as Select } from './Select.svelte';
|
|
21
|
+
export { default as SelectInput } from './SelectInput.svelte';
|
|
22
|
+
export { default as Textarea } from './Textarea.svelte';
|
|
23
|
+
export { default as TextareaInput } from './TextareaInput.svelte';
|
|
24
|
+
export { default as TextInput } from './TextInput.svelte';
|
|
25
|
+
export { default as Toggle } from './Toggle.svelte';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for SMRT Form components
|
|
3
|
+
*/
|
|
4
|
+
/** Speech-to-text adapter type */
|
|
5
|
+
export type STTAdapterType = 'browser-speech' | 'whisper-wasm' | 'whisper-cpp';
|
|
6
|
+
/** LLM model ID for field extraction */
|
|
7
|
+
export type LLMModelId = 'none' | 'smollm2-360m' | 'smollm2-1.7b' | 'qwen2.5-1.5b' | 'llama-3.2-1b';
|
|
8
|
+
/** Option for SMRTSelect component */
|
|
9
|
+
export interface SelectOption {
|
|
10
|
+
value: string;
|
|
11
|
+
label: string;
|
|
12
|
+
}
|
|
13
|
+
/** Address value for SMRTAddress component */
|
|
14
|
+
export interface AddressValue {
|
|
15
|
+
street: string;
|
|
16
|
+
city: string;
|
|
17
|
+
province: string;
|
|
18
|
+
postalCode: string;
|
|
19
|
+
country: string;
|
|
20
|
+
}
|
|
21
|
+
/** Date range value for SMRTDateRange component */
|
|
22
|
+
export interface DateRangeValue {
|
|
23
|
+
startDate: string;
|
|
24
|
+
endDate: string;
|
|
25
|
+
}
|
|
26
|
+
/** Measurement unit types */
|
|
27
|
+
export type MeasurementUnit = 'ft' | 'in' | 'm' | 'cm' | 'mm' | 'yd';
|
|
28
|
+
/** Measurement value for SMRTMeasurement component */
|
|
29
|
+
export interface MeasurementValue {
|
|
30
|
+
value: number;
|
|
31
|
+
unit: MeasurementUnit;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/forms/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,kCAAkC;AAClC,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,cAAc,GAAG,aAAa,CAAC;AAE/E,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,CAAC;AAEnB,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6BAA6B;AAC7B,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAErE,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,eAAe,CAAC;CACvB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* ModulePanel - Shell component for rendering module UI slots
|
|
4
|
+
*
|
|
5
|
+
* Dynamically renders a module's registered UI component by looking up
|
|
6
|
+
* the component in the ModuleUIRegistry.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* 1. Import ModulePanel from '@happyvertical/smrt-svelte'
|
|
10
|
+
* 2. Import the module's svelte package to register components
|
|
11
|
+
* 3. Use ModulePanel with moduleName and slotId props
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type {
|
|
15
|
+
ModuleUIBaseProps,
|
|
16
|
+
SmrtModuleMeta,
|
|
17
|
+
} from '@happyvertical/smrt-types';
|
|
18
|
+
import { M, useI18n } from '@happyvertical/smrt-ui/i18n';
|
|
19
|
+
import { ModuleUIRegistry } from '@happyvertical/smrt-ui/registry';
|
|
20
|
+
|
|
21
|
+
const { t } = useI18n();
|
|
22
|
+
|
|
23
|
+
interface Props extends ModuleUIBaseProps {
|
|
24
|
+
/** Module name (e.g., '@happyvertical/smrt-commerce') */
|
|
25
|
+
moduleName: string;
|
|
26
|
+
/** Slot ID to render */
|
|
27
|
+
slotId: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const {
|
|
31
|
+
moduleName,
|
|
32
|
+
slotId,
|
|
33
|
+
data,
|
|
34
|
+
config,
|
|
35
|
+
onChange,
|
|
36
|
+
onSave,
|
|
37
|
+
readonly = false,
|
|
38
|
+
loading = false,
|
|
39
|
+
class: className = '',
|
|
40
|
+
}: Props = $props();
|
|
41
|
+
|
|
42
|
+
// Get the component and slot metadata from registry
|
|
43
|
+
const Component = $derived(ModuleUIRegistry.get(moduleName, slotId));
|
|
44
|
+
const moduleMeta = $derived(ModuleUIRegistry.getModuleMeta(moduleName));
|
|
45
|
+
const slotMeta = $derived(moduleMeta?.uiSlots?.[slotId]);
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
{#if Component}
|
|
49
|
+
<Component
|
|
50
|
+
{data}
|
|
51
|
+
{config}
|
|
52
|
+
{onChange}
|
|
53
|
+
{onSave}
|
|
54
|
+
{readonly}
|
|
55
|
+
{loading}
|
|
56
|
+
class={className}
|
|
57
|
+
/>
|
|
58
|
+
{:else}
|
|
59
|
+
<div class="module-panel-placeholder {className}">
|
|
60
|
+
<div class="module-panel-placeholder__icon">
|
|
61
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
|
62
|
+
<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/>
|
|
63
|
+
<polyline points="3.29 7 12 12 20.71 7"/>
|
|
64
|
+
<line x1="12" y1="22" x2="12" y2="12"/>
|
|
65
|
+
</svg>
|
|
66
|
+
</div>
|
|
67
|
+
<p class="module-panel-placeholder__title">
|
|
68
|
+
{t(M['ui.module_panel.component_not_registered'])}
|
|
69
|
+
</p>
|
|
70
|
+
<code class="module-panel-placeholder__code">
|
|
71
|
+
{moduleName}/{slotId}
|
|
72
|
+
</code>
|
|
73
|
+
<p class="module-panel-placeholder__hint">
|
|
74
|
+
{t(M['ui.module_panel.register_hint'])}
|
|
75
|
+
</p>
|
|
76
|
+
{#if slotMeta}
|
|
77
|
+
<p class="module-panel-placeholder__meta">
|
|
78
|
+
Expected: <strong>{slotMeta.label}</strong>
|
|
79
|
+
{#if slotMeta.description}
|
|
80
|
+
— {slotMeta.description}
|
|
81
|
+
{/if}
|
|
82
|
+
</p>
|
|
83
|
+
{/if}
|
|
84
|
+
</div>
|
|
85
|
+
{/if}
|
|
86
|
+
|
|
87
|
+
<style>
|
|
88
|
+
.module-panel-placeholder {
|
|
89
|
+
display: flex;
|
|
90
|
+
flex-direction: column;
|
|
91
|
+
align-items: center;
|
|
92
|
+
justify-content: center;
|
|
93
|
+
padding: 2rem;
|
|
94
|
+
text-align: center;
|
|
95
|
+
background: var(--smrt-color-surface-container-low, #f8fafc);
|
|
96
|
+
border: 1px dashed var(--smrt-color-outline-variant, #e2e8f0);
|
|
97
|
+
border-radius: var(--smrt-radius-medium, 8px);
|
|
98
|
+
min-height: 150px;
|
|
99
|
+
gap: 0.75rem;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.module-panel-placeholder__icon {
|
|
103
|
+
color: var(--smrt-color-on-surface-variant, #94a3b8);
|
|
104
|
+
opacity: 0.6;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.module-panel-placeholder__title {
|
|
108
|
+
margin: 0;
|
|
109
|
+
font-size: var(--smrt-typography-title-medium-size, 1rem);
|
|
110
|
+
font-weight: var(--smrt-typography-weight-semibold, 600);
|
|
111
|
+
color: var(--smrt-color-on-surface, #1e293b);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.module-panel-placeholder__code {
|
|
115
|
+
font-family: var(--smrt-font-family-mono, 'SF Mono', 'Monaco', 'Consolas', monospace);
|
|
116
|
+
font-size: var(--smrt-typography-body-medium-size, 0.875rem);
|
|
117
|
+
padding: var(--smrt-spacing-1, 0.25rem) var(--smrt-spacing-2, 0.5rem);
|
|
118
|
+
background: var(--smrt-color-surface-container-high, #e2e8f0);
|
|
119
|
+
border-radius: var(--smrt-radius-small, 4px);
|
|
120
|
+
color: var(--smrt-color-on-surface-variant, #64748b);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.module-panel-placeholder__hint {
|
|
124
|
+
margin: 0;
|
|
125
|
+
font-size: var(--smrt-typography-body-medium-size, 0.875rem);
|
|
126
|
+
color: var(--smrt-color-on-surface-variant, #64748b);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.module-panel-placeholder__meta {
|
|
130
|
+
margin: 0;
|
|
131
|
+
font-size: var(--smrt-typography-body-small-size, 0.75rem);
|
|
132
|
+
color: var(--smrt-color-on-surface-variant, #94a3b8);
|
|
133
|
+
}
|
|
134
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModulePanel - Shell component for rendering module UI slots
|
|
3
|
+
*
|
|
4
|
+
* Dynamically renders a module's registered UI component by looking up
|
|
5
|
+
* the component in the ModuleUIRegistry.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* 1. Import ModulePanel from '@happyvertical/smrt-svelte'
|
|
9
|
+
* 2. Import the module's svelte package to register components
|
|
10
|
+
* 3. Use ModulePanel with moduleName and slotId props
|
|
11
|
+
*/
|
|
12
|
+
import type { ModuleUIBaseProps } from '@happyvertical/smrt-types';
|
|
13
|
+
interface Props extends ModuleUIBaseProps {
|
|
14
|
+
/** Module name (e.g., '@happyvertical/smrt-commerce') */
|
|
15
|
+
moduleName: string;
|
|
16
|
+
/** Slot ID to render */
|
|
17
|
+
slotId: string;
|
|
18
|
+
}
|
|
19
|
+
declare const ModulePanel: import("svelte").Component<Props, {}, "">;
|
|
20
|
+
type ModulePanel = ReturnType<typeof ModulePanel>;
|
|
21
|
+
export default ModulePanel;
|
|
22
|
+
//# sourceMappingURL=ModulePanel.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModulePanel.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/module/ModulePanel.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,2BAA2B,CAAC;AAKnC,UAAU,KAAM,SAAQ,iBAAiB;IACvC,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AA+DD,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/module/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Breadcrumbs — generic breadcrumb trail primitive.
|
|
4
|
+
*
|
|
5
|
+
* Two modes:
|
|
6
|
+
*
|
|
7
|
+
* - **Explicit**: pass `items` directly.
|
|
8
|
+
* - **Auto**: pass `nav` + `pathname` and the component will walk the
|
|
9
|
+
* pathname segments, matching against the nav tree for labels and
|
|
10
|
+
* falling back to capitalized segments otherwise. Use `rootCrumb`
|
|
11
|
+
* to prepend a site/section identity and `startAfter` to skip a
|
|
12
|
+
* pathname prefix (e.g. `'sites/foo'` to ignore the
|
|
13
|
+
* `/sites/foo` portion of a per-site path).
|
|
14
|
+
*
|
|
15
|
+
* SvelteKit-agnostic: no `$app/*` imports. Consumers supply the
|
|
16
|
+
* pathname externally.
|
|
17
|
+
*/
|
|
18
|
+
import { deriveCrumbsFromNav } from './breadcrumbs-helpers.js';
|
|
19
|
+
import type { BreadcrumbItem, NavItem } from './types.js';
|
|
20
|
+
|
|
21
|
+
interface Props {
|
|
22
|
+
/** Explicit crumbs. When provided, `nav` and `pathname` are ignored. */
|
|
23
|
+
items?: BreadcrumbItem[];
|
|
24
|
+
/** Nav tree to derive labels from in auto mode. */
|
|
25
|
+
nav?: NavItem[];
|
|
26
|
+
/** Pathname to walk in auto mode. */
|
|
27
|
+
pathname?: string;
|
|
28
|
+
/** Optional leading crumb (e.g. site name). Auto mode only. */
|
|
29
|
+
rootCrumb?: BreadcrumbItem;
|
|
30
|
+
/** Capitalize fallback labels for unknown segments. Default: true. */
|
|
31
|
+
capitalize?: boolean;
|
|
32
|
+
/** Skip pathname segments through this path (e.g. `'sites/foo'`). */
|
|
33
|
+
startAfter?: string;
|
|
34
|
+
/** Accessible label for the breadcrumb nav. */
|
|
35
|
+
'aria-label'?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const {
|
|
39
|
+
items,
|
|
40
|
+
nav,
|
|
41
|
+
pathname,
|
|
42
|
+
rootCrumb,
|
|
43
|
+
capitalize = true,
|
|
44
|
+
startAfter,
|
|
45
|
+
'aria-label': ariaLabel = 'Breadcrumb',
|
|
46
|
+
}: Props = $props();
|
|
47
|
+
|
|
48
|
+
const crumbs = $derived.by((): BreadcrumbItem[] => {
|
|
49
|
+
if (items) return items;
|
|
50
|
+
if (!nav || pathname == null) {
|
|
51
|
+
return rootCrumb ? [rootCrumb] : [];
|
|
52
|
+
}
|
|
53
|
+
return deriveCrumbsFromNav(pathname, nav, {
|
|
54
|
+
rootCrumb,
|
|
55
|
+
startAfter,
|
|
56
|
+
capitalize,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const lastIndex = $derived(crumbs.length - 1);
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<nav class="smrt-breadcrumbs" aria-label={ariaLabel}>
|
|
64
|
+
<ol class="crumb-list">
|
|
65
|
+
{#each crumbs as crumb, i (`${i}:${crumb.href ?? crumb.label}`)}
|
|
66
|
+
<li class="crumb-item">
|
|
67
|
+
{#if i > 0}
|
|
68
|
+
<span class="separator" aria-hidden="true">/</span>
|
|
69
|
+
{/if}
|
|
70
|
+
{#if i === lastIndex || !crumb.href}
|
|
71
|
+
<span
|
|
72
|
+
class="current"
|
|
73
|
+
aria-current={i === lastIndex ? 'page' : undefined}
|
|
74
|
+
>{crumb.label}</span
|
|
75
|
+
>
|
|
76
|
+
{:else}
|
|
77
|
+
<a href={crumb.href} class="crumb-link">{crumb.label}</a>
|
|
78
|
+
{/if}
|
|
79
|
+
</li>
|
|
80
|
+
{/each}
|
|
81
|
+
</ol>
|
|
82
|
+
</nav>
|
|
83
|
+
|
|
84
|
+
<style>
|
|
85
|
+
.smrt-breadcrumbs {
|
|
86
|
+
width: 100%;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.crumb-list {
|
|
90
|
+
display: flex;
|
|
91
|
+
flex-wrap: wrap;
|
|
92
|
+
align-items: center;
|
|
93
|
+
list-style: none;
|
|
94
|
+
padding: 0;
|
|
95
|
+
margin: 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.crumb-item {
|
|
99
|
+
display: inline-flex;
|
|
100
|
+
align-items: center;
|
|
101
|
+
font-size: var(--smrt-typography-body-medium-size, 0.875rem);
|
|
102
|
+
color: var(--smrt-color-on-surface-variant);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.separator {
|
|
106
|
+
margin: 0 0.5rem;
|
|
107
|
+
color: var(--smrt-color-outline-variant);
|
|
108
|
+
font-size: var(--smrt-typography-label-medium-size, 0.75rem);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.current {
|
|
112
|
+
font-weight: var(--smrt-typography-weight-medium, 500);
|
|
113
|
+
color: var(--smrt-color-on-surface);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.crumb-link {
|
|
117
|
+
color: var(--smrt-color-on-surface-variant);
|
|
118
|
+
text-decoration: none;
|
|
119
|
+
transition: color 0.15s ease;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.crumb-link:hover {
|
|
123
|
+
color: var(--smrt-color-on-surface);
|
|
124
|
+
text-decoration: underline;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.crumb-link:focus-visible {
|
|
128
|
+
outline: 2px solid var(--smrt-color-primary);
|
|
129
|
+
outline-offset: 2px;
|
|
130
|
+
border-radius: var(--smrt-radius-sm, 4px);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@media (max-width: 640px) {
|
|
134
|
+
.crumb-item {
|
|
135
|
+
font-size: var(--smrt-typography-body-medium-size, 0.8125rem);
|
|
136
|
+
}
|
|
137
|
+
.separator {
|
|
138
|
+
margin: 0 0.35rem;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BreadcrumbItem, NavItem } from './types.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Explicit crumbs. When provided, `nav` and `pathname` are ignored. */
|
|
4
|
+
items?: BreadcrumbItem[];
|
|
5
|
+
/** Nav tree to derive labels from in auto mode. */
|
|
6
|
+
nav?: NavItem[];
|
|
7
|
+
/** Pathname to walk in auto mode. */
|
|
8
|
+
pathname?: string;
|
|
9
|
+
/** Optional leading crumb (e.g. site name). Auto mode only. */
|
|
10
|
+
rootCrumb?: BreadcrumbItem;
|
|
11
|
+
/** Capitalize fallback labels for unknown segments. Default: true. */
|
|
12
|
+
capitalize?: boolean;
|
|
13
|
+
/** Skip pathname segments through this path (e.g. `'sites/foo'`). */
|
|
14
|
+
startAfter?: string;
|
|
15
|
+
/** Accessible label for the breadcrumb nav. */
|
|
16
|
+
'aria-label'?: string;
|
|
17
|
+
}
|
|
18
|
+
declare const Breadcrumbs: import("svelte").Component<Props, {}, "">;
|
|
19
|
+
type Breadcrumbs = ReturnType<typeof Breadcrumbs>;
|
|
20
|
+
export default Breadcrumbs;
|
|
21
|
+
//# sourceMappingURL=Breadcrumbs.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/Breadcrumbs.svelte.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1D,UAAU,KAAK;IACb,wEAAwE;IACxE,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;IAChB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,sEAAsE;IACtE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAqDD,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|