@happyvertical/smrt-svelte 0.53.0 → 0.53.2

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 (254) hide show
  1. package/package.json +15 -15
  2. package/dist/__tests__/app-state.test.js +0 -156
  3. package/dist/__tests__/data-surface-bridge.test.js +0 -351
  4. package/dist/__tests__/provider-mode-harness.svelte +0 -14
  5. package/dist/__tests__/provider-mode-harness.svelte.d.ts +0 -11
  6. package/dist/__tests__/provider-mode-harness.svelte.d.ts.map +0 -1
  7. package/dist/__tests__/provider-mode-probe.svelte +0 -13
  8. package/dist/__tests__/provider-mode-probe.svelte.d.ts +0 -8
  9. package/dist/__tests__/provider-mode-probe.svelte.d.ts.map +0 -1
  10. package/dist/__tests__/provider-webmcp-harness.svelte +0 -14
  11. package/dist/__tests__/provider-webmcp-harness.svelte.d.ts +0 -8
  12. package/dist/__tests__/provider-webmcp-harness.svelte.d.ts.map +0 -1
  13. package/dist/__tests__/success-never-text.test.js +0 -100
  14. package/dist/__tests__/warm-clients.test.js +0 -186
  15. package/dist/browser-ai/adapters/llm/bitgpu-inference-backend.test.js +0 -464
  16. package/dist/browser-ai/adapters/llm/webllm-inference-backend.test.js +0 -646
  17. package/dist/browser-ai/adapters/stt/browser-speech.test.js +0 -113
  18. package/dist/browser-ai/adapters/stt/dictation-source.test.js +0 -52
  19. package/dist/browser-ai/svelte/components/__tests__/ModelStatusControl.test.js +0 -172
  20. package/dist/components/board/__tests__/Board.test.js +0 -498
  21. package/dist/components/board/__tests__/BoardSsrHarness.svelte +0 -30
  22. package/dist/components/board/__tests__/BoardSsrHarness.svelte.d.ts +0 -19
  23. package/dist/components/board/__tests__/BoardSsrHarness.svelte.d.ts.map +0 -1
  24. package/dist/components/forms/__tests__/AddressInput.behavior.test.js +0 -216
  25. package/dist/components/forms/__tests__/CheckboxInput.test.js +0 -92
  26. package/dist/components/forms/__tests__/DateRangeInput.behavior.test.js +0 -135
  27. package/dist/components/forms/__tests__/DateTimeInput.behavior.test.js +0 -113
  28. package/dist/components/forms/__tests__/FileUpload.error-alert.test.js +0 -37
  29. package/dist/components/forms/__tests__/FileUpload.native-form.test.js +0 -249
  30. package/dist/components/forms/__tests__/FileUpload.test.js +0 -90
  31. package/dist/components/forms/__tests__/FileUploadReset.fixture.svelte +0 -24
  32. package/dist/components/forms/__tests__/FileUploadReset.fixture.svelte.d.ts +0 -10
  33. package/dist/components/forms/__tests__/FileUploadReset.fixture.svelte.d.ts.map +0 -1
  34. package/dist/components/forms/__tests__/Form.behavior.test.js +0 -137
  35. package/dist/components/forms/__tests__/Form.extraction.test.js +0 -68
  36. package/dist/components/forms/__tests__/Form.stt-error.test.js +0 -57
  37. package/dist/components/forms/__tests__/Form.test.js +0 -86
  38. package/dist/components/forms/__tests__/Form.ui-controls.test.js +0 -119
  39. package/dist/components/forms/__tests__/Form.webmcp.test.js +0 -2336
  40. package/dist/components/forms/__tests__/FormMicButton.test.js +0 -92
  41. package/dist/components/forms/__tests__/FormScope.test.js +0 -39
  42. package/dist/components/forms/__tests__/MeasurementInput.behavior.test.js +0 -129
  43. package/dist/components/forms/__tests__/MoneyInput.behavior.test.js +0 -124
  44. package/dist/components/forms/__tests__/NumberInput.behavior.test.js +0 -151
  45. package/dist/components/forms/__tests__/PhoneInput.behavior.test.js +0 -96
  46. package/dist/components/forms/__tests__/SearchInput.test.js +0 -79
  47. package/dist/components/forms/__tests__/SelectInput.behavior.test.js +0 -132
  48. package/dist/components/forms/__tests__/TextInput.behavior.test.js +0 -131
  49. package/dist/components/forms/__tests__/TextareaInput.behavior.test.js +0 -96
  50. package/dist/components/forms/__tests__/async-invalid-field.fixture.svelte +0 -30
  51. package/dist/components/forms/__tests__/async-invalid-field.fixture.svelte.d.ts +0 -7
  52. package/dist/components/forms/__tests__/async-invalid-field.fixture.svelte.d.ts.map +0 -1
  53. package/dist/components/forms/__tests__/async-validation-form.fixture.svelte +0 -19
  54. package/dist/components/forms/__tests__/async-validation-form.fixture.svelte.d.ts +0 -9
  55. package/dist/components/forms/__tests__/async-validation-form.fixture.svelte.d.ts.map +0 -1
  56. package/dist/components/forms/__tests__/async-validation-snapshot-form.fixture.svelte +0 -21
  57. package/dist/components/forms/__tests__/async-validation-snapshot-form.fixture.svelte.d.ts +0 -8
  58. package/dist/components/forms/__tests__/async-validation-snapshot-form.fixture.svelte.d.ts.map +0 -1
  59. package/dist/components/forms/__tests__/composite-inputs-a11y.test.js +0 -69
  60. package/dist/components/forms/__tests__/compound-registration-wrapper.fixture.svelte +0 -27
  61. package/dist/components/forms/__tests__/compound-registration-wrapper.fixture.svelte.d.ts +0 -9
  62. package/dist/components/forms/__tests__/compound-registration-wrapper.fixture.svelte.d.ts.map +0 -1
  63. package/dist/components/forms/__tests__/custom-registration-field.fixture.svelte +0 -48
  64. package/dist/components/forms/__tests__/custom-registration-field.fixture.svelte.d.ts +0 -10
  65. package/dist/components/forms/__tests__/custom-registration-field.fixture.svelte.d.ts.map +0 -1
  66. package/dist/components/forms/__tests__/form-extraction-values.fixture.svelte +0 -26
  67. package/dist/components/forms/__tests__/form-extraction-values.fixture.svelte.d.ts +0 -13
  68. package/dist/components/forms/__tests__/form-extraction-values.fixture.svelte.d.ts.map +0 -1
  69. package/dist/components/forms/__tests__/form-registration-lifecycle.fixture.svelte +0 -52
  70. package/dist/components/forms/__tests__/form-registration-lifecycle.fixture.svelte.d.ts +0 -16
  71. package/dist/components/forms/__tests__/form-registration-lifecycle.fixture.svelte.d.ts.map +0 -1
  72. package/dist/components/forms/__tests__/form-scope.fixture.svelte +0 -30
  73. package/dist/components/forms/__tests__/form-scope.fixture.svelte.d.ts +0 -10
  74. package/dist/components/forms/__tests__/form-scope.fixture.svelte.d.ts.map +0 -1
  75. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte +0 -158
  76. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts +0 -51
  77. package/dist/components/forms/__tests__/form-with-fields.fixture.svelte.d.ts.map +0 -1
  78. package/dist/components/forms/__tests__/form-with-policy-field.fixture.svelte +0 -24
  79. package/dist/components/forms/__tests__/form-with-policy-field.fixture.svelte.d.ts +0 -11
  80. package/dist/components/forms/__tests__/form-with-policy-field.fixture.svelte.d.ts.map +0 -1
  81. package/dist/components/forms/__tests__/form-with-structured-fields.fixture.svelte +0 -105
  82. package/dist/components/forms/__tests__/form-with-structured-fields.fixture.svelte.d.ts +0 -42
  83. package/dist/components/forms/__tests__/form-with-structured-fields.fixture.svelte.d.ts.map +0 -1
  84. package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte +0 -84
  85. package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte.d.ts +0 -14
  86. package/dist/components/forms/__tests__/form-with-ui-controls.fixture.svelte.d.ts.map +0 -1
  87. package/dist/components/forms/__tests__/legacy-form-context.fixture.svelte +0 -44
  88. package/dist/components/forms/__tests__/legacy-form-context.fixture.svelte.d.ts +0 -9
  89. package/dist/components/forms/__tests__/legacy-form-context.fixture.svelte.d.ts.map +0 -1
  90. package/dist/components/forms/__tests__/mic-keyboard-a11y.test.js +0 -74
  91. package/dist/components/forms/__tests__/policy-field.fixture.svelte +0 -35
  92. package/dist/components/forms/__tests__/policy-field.fixture.svelte.d.ts +0 -8
  93. package/dist/components/forms/__tests__/policy-field.fixture.svelte.d.ts.map +0 -1
  94. package/dist/components/forms/__tests__/rich-inputs-a11y.test.js +0 -87
  95. package/dist/components/settings/__tests__/SettingsCatalog.test.js +0 -69
  96. package/dist/components/settings/__tests__/catalog.test.js +0 -46
  97. package/dist/components/workspace/__tests__/AdminShell.responsive.test.js +0 -597
  98. package/dist/components/workspace/__tests__/AdminShell.test.js +0 -572
  99. package/dist/components/workspace/__tests__/RoleShell.test.js +0 -772
  100. package/dist/components/workspace/__tests__/TenantNav.test.js +0 -208
  101. package/dist/components/workspace/__tests__/WorkspaceAccountMenu.test.js +0 -79
  102. package/dist/components/workspace/__tests__/WorkspaceShell.test.js +0 -630
  103. package/dist/components/workspace/__tests__/admin-shell-header-overflow.test.js +0 -25
  104. package/dist/components/workspace/__tests__/admin-shell-hotkeys.test.js +0 -34
  105. package/dist/components/workspace/__tests__/admin-shell-mobile.test.js +0 -217
  106. package/dist/components/workspace/__tests__/admin-shell-mutation-effect-harness.svelte +0 -52
  107. package/dist/components/workspace/__tests__/admin-shell-mutation-effect-harness.svelte.d.ts +0 -23
  108. package/dist/components/workspace/__tests__/admin-shell-mutation-effect-harness.svelte.d.ts.map +0 -1
  109. package/dist/components/workspace/__tests__/admin-shell-page-contracts.test.js +0 -30
  110. package/dist/components/workspace/__tests__/admin-shell-responsive-state.test.js +0 -184
  111. package/dist/components/workspace/__tests__/admin-shell-settings.test.js +0 -25
  112. package/dist/components/workspace/__tests__/admin-shell-state.test.js +0 -286
  113. package/dist/components/workspace/__tests__/admin-shell-theme-hooks.test.js +0 -36
  114. package/dist/components/workspace/__tests__/breadcrumbs-helpers.test.js +0 -141
  115. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte +0 -45
  116. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts +0 -21
  117. package/dist/components/workspace/__tests__/context-forwarding-harness.svelte.d.ts.map +0 -1
  118. package/dist/components/workspace/__tests__/define-tools-dock.test.js +0 -1188
  119. package/dist/components/workspace/__tests__/harness.svelte +0 -25
  120. package/dist/components/workspace/__tests__/harness.svelte.d.ts +0 -14
  121. package/dist/components/workspace/__tests__/harness.svelte.d.ts.map +0 -1
  122. package/dist/components/workspace/__tests__/index.test.js +0 -28
  123. package/dist/components/workspace/__tests__/legacy-index.test.js +0 -9
  124. package/dist/components/workspace/__tests__/manifest-nav-helpers.test.js +0 -24
  125. package/dist/components/workspace/__tests__/manifest-nav.test.js +0 -599
  126. package/dist/components/workspace/__tests__/nav-helpers.test.js +0 -95
  127. package/dist/components/workspace/__tests__/render-harness.svelte +0 -66
  128. package/dist/components/workspace/__tests__/render-harness.svelte.d.ts +0 -32
  129. package/dist/components/workspace/__tests__/render-harness.svelte.d.ts.map +0 -1
  130. package/dist/components/workspace/__tests__/render-tools-dock.test.js +0 -260
  131. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte +0 -58
  132. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts +0 -16
  133. package/dist/components/workspace/__tests__/role-shell-bind-harness.svelte.d.ts.map +0 -1
  134. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte +0 -41
  135. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts +0 -13
  136. package/dist/components/workspace/__tests__/role-shell-switch-harness.svelte.d.ts.map +0 -1
  137. package/dist/components/workspace/__tests__/shell-chrome-components.test.js +0 -108
  138. package/dist/components/workspace/__tests__/system-feed.test.js +0 -327
  139. package/dist/components/workspace/__tests__/test-icon.svelte +0 -17
  140. package/dist/components/workspace/__tests__/test-icon.svelte.d.ts +0 -19
  141. package/dist/components/workspace/__tests__/test-icon.svelte.d.ts.map +0 -1
  142. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte +0 -38
  143. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts +0 -22
  144. package/dist/components/workspace/__tests__/typed-tool-fixture/TypedTool.svelte.d.ts.map +0 -1
  145. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts +0 -66
  146. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts.map +0 -1
  147. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.js +0 -115
  148. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts +0 -15
  149. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.d.ts.map +0 -1
  150. package/dist/components/workspace/__tests__/typed-tool-fixture/typed-tool-types.js +0 -7
  151. package/dist/components/workspace/__tests__/typed-tool-fixture.test.js +0 -115
  152. package/dist/components/workspace/__tests__/use-harness-orphan.svelte +0 -9
  153. package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts +0 -19
  154. package/dist/components/workspace/__tests__/use-harness-orphan.svelte.d.ts.map +0 -1
  155. package/dist/components/workspace/__tests__/use-harness.svelte +0 -23
  156. package/dist/components/workspace/__tests__/use-harness.svelte.d.ts +0 -8
  157. package/dist/components/workspace/__tests__/use-harness.svelte.d.ts.map +0 -1
  158. package/dist/components/workspace/__tests__/use-tools-dock.test.js +0 -33
  159. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte +0 -43
  160. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts +0 -11
  161. package/dist/components/workspace/__tests__/workspace-shell-bind-harness.svelte.d.ts.map +0 -1
  162. package/dist/components/workspace/server/__tests__/compose-availability.test.js +0 -383
  163. package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts +0 -78
  164. package/dist/components/workspace/server/__tests__/typed-context-fixture.d.ts.map +0 -1
  165. package/dist/components/workspace/server/__tests__/typed-context-fixture.js +0 -104
  166. package/dist/hooks/__tests__/stt-consumer.fixture.svelte +0 -25
  167. package/dist/hooks/__tests__/stt-consumer.fixture.svelte.d.ts +0 -15
  168. package/dist/hooks/__tests__/stt-consumer.fixture.svelte.d.ts.map +0 -1
  169. package/dist/hooks/__tests__/stt-ownership-harness.svelte +0 -42
  170. package/dist/hooks/__tests__/stt-ownership-harness.svelte.d.ts +0 -20
  171. package/dist/hooks/__tests__/stt-ownership-harness.svelte.d.ts.map +0 -1
  172. package/dist/hooks/__tests__/useSTT-ownership.test.js +0 -102
  173. package/dist/i18n/__tests__/server.spec.js +0 -57
  174. package/dist/internal/logger.test.js +0 -54
  175. package/dist/provider-mode.test.js +0 -86
  176. package/dist/provider-webmcp.test.js +0 -244
  177. package/dist/state/__tests__/app-state-ai-lifecycle.test.js +0 -240
  178. package/dist/state/__tests__/warm-clients.test.js +0 -40
  179. package/dist/web/__tests__/activity-feed-harness.svelte +0 -32
  180. package/dist/web/__tests__/activity-feed-harness.svelte.d.ts +0 -18
  181. package/dist/web/__tests__/activity-feed-harness.svelte.d.ts.map +0 -1
  182. package/dist/web/__tests__/activity-feed.integration.svelte.test.js +0 -190
  183. package/dist/web/__tests__/activity-feed.svelte.test.js +0 -235
  184. package/dist/web/__tests__/assistant-dock.integration.svelte.test.js +0 -204
  185. package/dist/web/__tests__/data-surface-conformance.integration.svelte.test.js +0 -1392
  186. package/dist/web/__tests__/harness.svelte +0 -25
  187. package/dist/web/__tests__/harness.svelte.d.ts +0 -15
  188. package/dist/web/__tests__/harness.svelte.d.ts.map +0 -1
  189. package/dist/web/__tests__/list-data-surface.fixture.svelte +0 -59
  190. package/dist/web/__tests__/list-data-surface.fixture.svelte.d.ts +0 -14
  191. package/dist/web/__tests__/list-data-surface.fixture.svelte.d.ts.map +0 -1
  192. package/dist/web/__tests__/list-data-surface.svelte.test.js +0 -106
  193. package/dist/web/__tests__/list-data-surface.test.js +0 -651
  194. package/dist/web/__tests__/list-sort-surface.fixture.svelte +0 -41
  195. package/dist/web/__tests__/list-sort-surface.fixture.svelte.d.ts +0 -15
  196. package/dist/web/__tests__/list-sort-surface.fixture.svelte.d.ts.map +0 -1
  197. package/dist/web/__tests__/list-sort-surface.svelte.test.js +0 -59
  198. package/dist/web/__tests__/live-collection.svelte.test.js +0 -185
  199. package/dist/web/__tests__/provider-ui-registry.fixture.svelte +0 -43
  200. package/dist/web/__tests__/provider-ui-registry.fixture.svelte.d.ts +0 -13
  201. package/dist/web/__tests__/provider-ui-registry.fixture.svelte.d.ts.map +0 -1
  202. package/dist/web/__tests__/provider-ui-registry.test.js +0 -235
  203. package/dist/web/__tests__/remote-query-harness.svelte +0 -27
  204. package/dist/web/__tests__/remote-query-harness.svelte.d.ts +0 -11
  205. package/dist/web/__tests__/remote-query-harness.svelte.d.ts.map +0 -1
  206. package/dist/web/__tests__/remote-query.svelte.test.js +0 -101
  207. package/dist/web/__tests__/surfaces.child.fixture.svelte +0 -69
  208. package/dist/web/__tests__/surfaces.child.fixture.svelte.d.ts +0 -16
  209. package/dist/web/__tests__/surfaces.child.fixture.svelte.d.ts.map +0 -1
  210. package/dist/web/__tests__/surfaces.fixture.svelte +0 -26
  211. package/dist/web/__tests__/surfaces.fixture.svelte.d.ts +0 -18
  212. package/dist/web/__tests__/surfaces.fixture.svelte.d.ts.map +0 -1
  213. package/dist/web/__tests__/surfaces.svelte.test.js +0 -140
  214. package/dist/web/__tests__/update-available-harness.svelte +0 -46
  215. package/dist/web/__tests__/update-available-harness.svelte.d.ts +0 -22
  216. package/dist/web/__tests__/update-available-harness.svelte.d.ts.map +0 -1
  217. package/dist/web/__tests__/update-available.svelte.test.js +0 -137
  218. package/dist/web/__tests__/view-intent-provider.fixture.svelte +0 -28
  219. package/dist/web/__tests__/view-intent-provider.fixture.svelte.d.ts +0 -13
  220. package/dist/web/__tests__/view-intent-provider.fixture.svelte.d.ts.map +0 -1
  221. package/dist/web/__tests__/view-intent.fixture.svelte +0 -33
  222. package/dist/web/__tests__/view-intent.fixture.svelte.d.ts +0 -15
  223. package/dist/web/__tests__/view-intent.fixture.svelte.d.ts.map +0 -1
  224. package/dist/web/__tests__/view-intent.intents.d.ts +0 -14
  225. package/dist/web/__tests__/view-intent.intents.d.ts.map +0 -1
  226. package/dist/web/__tests__/view-intent.intents.js +0 -38
  227. package/dist/web/__tests__/view-intent.svelte.test.js +0 -244
  228. package/dist/web/__tests__/webmcp-composed.child.fixture.svelte +0 -73
  229. package/dist/web/__tests__/webmcp-composed.child.fixture.svelte.d.ts +0 -8
  230. package/dist/web/__tests__/webmcp-composed.child.fixture.svelte.d.ts.map +0 -1
  231. package/dist/web/__tests__/webmcp-composed.fixture.svelte +0 -52
  232. package/dist/web/__tests__/webmcp-composed.fixture.svelte.d.ts +0 -12
  233. package/dist/web/__tests__/webmcp-composed.fixture.svelte.d.ts.map +0 -1
  234. package/dist/web/__tests__/webmcp-composed.integration.svelte.test.js +0 -251
  235. package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte +0 -16
  236. package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte.d.ts +0 -19
  237. package/dist/web/__tests__/webmcp-effects-reactivity.child.fixture.svelte.d.ts.map +0 -1
  238. package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte +0 -11
  239. package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte.d.ts +0 -8
  240. package/dist/web/__tests__/webmcp-effects-reactivity.fixture.svelte.d.ts.map +0 -1
  241. package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte +0 -20
  242. package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte.d.ts +0 -7
  243. package/dist/web/__tests__/webmcp-harness-reactive-samename.svelte.d.ts.map +0 -1
  244. package/dist/web/__tests__/webmcp-harness-unannotated.svelte +0 -14
  245. package/dist/web/__tests__/webmcp-harness-unannotated.svelte.d.ts +0 -19
  246. package/dist/web/__tests__/webmcp-harness-unannotated.svelte.d.ts.map +0 -1
  247. package/dist/web/__tests__/webmcp-harness.svelte +0 -18
  248. package/dist/web/__tests__/webmcp-harness.svelte.d.ts +0 -7
  249. package/dist/web/__tests__/webmcp-harness.svelte.d.ts.map +0 -1
  250. package/dist/web/__tests__/webmcp-ssr.fixture.svelte +0 -13
  251. package/dist/web/__tests__/webmcp-ssr.fixture.svelte.d.ts +0 -19
  252. package/dist/web/__tests__/webmcp-ssr.fixture.svelte.d.ts.map +0 -1
  253. package/dist/web/__tests__/webmcp-ui.test.js +0 -723
  254. package/dist/web/__tests__/webmcp.test.js +0 -234
@@ -1,572 +0,0 @@
1
- import { createRawSnippet, flushSync, mount, tick, unmount } from 'svelte';
2
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
- import AdminShell from '../admin-shell/AdminShell.svelte';
4
- import adminShellSource from '../admin-shell/AdminShell.svelte?raw';
5
- import { createShellState } from '../admin-shell/state.svelte.js';
6
- function textSnippet(text) {
7
- return createRawSnippet(() => ({
8
- render: () => `<span>${text}</span>`,
9
- }));
10
- }
11
- function activeToolSnippet() {
12
- return createRawSnippet((context) => ({
13
- render: () => `<span>${context().tool?.id ?? 'none'} panel</span>`,
14
- }));
15
- }
16
- let container;
17
- beforeEach(() => {
18
- vi.stubGlobal('matchMedia', () => ({
19
- matches: false,
20
- addEventListener() { },
21
- removeEventListener() { },
22
- }));
23
- container = document.createElement('div');
24
- document.body.appendChild(container);
25
- });
26
- afterEach(() => {
27
- vi.unstubAllGlobals();
28
- container.remove();
29
- });
30
- describe('AdminShell', () => {
31
- it('keeps a single tenant footer reachable when the left edge collapses or hides', async () => {
32
- const state = createShellState({
33
- config: { left: { initial: 'collapsed' } },
34
- });
35
- const component = mount(AdminShell, {
36
- target: container,
37
- props: {
38
- state,
39
- tenantFooter: textSnippet('Dana account'),
40
- children: textSnippet('main'),
41
- },
42
- });
43
- try {
44
- await tick();
45
- expect(container.querySelector('header')?.textContent).toContain('Dana account');
46
- state.setPanelState('left', 'expanded');
47
- flushSync();
48
- expect(container.querySelector('header')?.textContent).not.toContain('Dana account');
49
- expect(container.querySelector('.smrt-admin-shell__tenant-footer')
50
- ?.textContent).toContain('Dana account');
51
- state.setPanelState('left', 'hidden');
52
- flushSync();
53
- expect(container.querySelector('header')?.textContent).toContain('Dana account');
54
- expect(container.textContent?.match(/Dana account/g)).toHaveLength(1);
55
- }
56
- finally {
57
- await unmount(component);
58
- }
59
- });
60
- it('keeps an explicit account slot in a custom app bar regardless of left state', async () => {
61
- const state = createShellState({
62
- config: { left: { initial: 'expanded' } },
63
- });
64
- const component = mount(AdminShell, {
65
- target: container,
66
- props: {
67
- state,
68
- account: textSnippet('Dana account'),
69
- appBar: textSnippet('Custom title'),
70
- children: textSnippet('main'),
71
- },
72
- });
73
- try {
74
- await tick();
75
- expect(container.querySelector('header')?.textContent).toContain('Dana account');
76
- }
77
- finally {
78
- await unmount(component);
79
- }
80
- });
81
- it('keeps the left collapse control with supplied navigation and permits opt-out', async () => {
82
- for (const showTenantToggle of [true, false]) {
83
- const state = createShellState({
84
- config: { left: { initial: 'expanded' } },
85
- });
86
- const component = mount(AdminShell, {
87
- target: container,
88
- props: {
89
- state,
90
- showTenantToggle,
91
- tenantPanel: textSnippet('supplied nav'),
92
- children: textSnippet('main'),
93
- },
94
- });
95
- try {
96
- await tick();
97
- const toggle = container.querySelector('.smrt-admin-shell__edge--left .smrt-admin-shell__edge-toggle');
98
- expect(!!toggle).toBe(showTenantToggle);
99
- if (toggle) {
100
- toggle.click();
101
- flushSync();
102
- expect(state.panels.left).toBe('collapsed');
103
- }
104
- }
105
- finally {
106
- await unmount(component);
107
- }
108
- }
109
- });
110
- it('preserves the system toggle when a custom system bar is supplied', async () => {
111
- const component = mount(AdminShell, {
112
- target: container,
113
- props: {
114
- systemBar: textSnippet('custom status'),
115
- children: textSnippet('main'),
116
- },
117
- });
118
- try {
119
- await tick();
120
- expect(container.querySelector('footer .smrt-admin-shell__edge-toggle')).not.toBeNull();
121
- }
122
- finally {
123
- unmount(component);
124
- }
125
- });
126
- it('links full and compact branding home with an accessible title', async () => {
127
- const state = createShellState({
128
- config: { left: { initial: 'collapsed' } },
129
- });
130
- const component = mount(AdminShell, {
131
- target: container,
132
- props: {
133
- state,
134
- title: 'Shop',
135
- homeHref: '/home',
136
- children: textSnippet('main'),
137
- },
138
- });
139
- try {
140
- await tick();
141
- const links = container.querySelectorAll('.smrt-admin-shell__brand-link');
142
- expect(links).toHaveLength(2);
143
- expect([...links].map((link) => link.getAttribute('href'))).toEqual([
144
- '/home',
145
- '/home',
146
- ]);
147
- expect([...links].map((link) => link.getAttribute('aria-label'))).toEqual(['Shop', 'Shop']);
148
- expect(links[1].textContent?.trim()).toBe('S');
149
- }
150
- finally {
151
- unmount(component);
152
- }
153
- });
154
- it('renders a logo and keeps default branding unlinked without homeHref', async () => {
155
- const component = mount(AdminShell, {
156
- target: container,
157
- props: {
158
- title: 'Shop',
159
- logoSrc: '/shop.svg',
160
- logoAlt: 'Shop mark',
161
- children: textSnippet('main'),
162
- },
163
- });
164
- try {
165
- await tick();
166
- expect(container.querySelector('img')?.getAttribute('src')).toBe('/shop.svg');
167
- expect(container.querySelector('img')?.getAttribute('alt')).toBe('Shop mark');
168
- expect(container.querySelector('.smrt-admin-shell__brand-link')).toBeNull();
169
- }
170
- finally {
171
- unmount(component);
172
- }
173
- });
174
- it('passes full and compact context to custom brand snippets', async () => {
175
- const brand = createRawSnippet((context) => ({
176
- render: () => `<span>${context().compact ? 'Compact mark' : 'Full mark'}</span>`,
177
- }));
178
- const component = mount(AdminShell, {
179
- target: container,
180
- props: {
181
- title: 'Shop',
182
- homeHref: '/',
183
- brand,
184
- children: textSnippet('main'),
185
- },
186
- });
187
- try {
188
- await tick();
189
- expect(container.textContent).toContain('Full mark');
190
- expect(container.textContent).toContain('Compact mark');
191
- }
192
- finally {
193
- unmount(component);
194
- }
195
- });
196
- it('renders the four edge shell and body content', () => {
197
- const component = mount(AdminShell, {
198
- target: container,
199
- props: {
200
- title: 'Ops',
201
- children: textSnippet('main work'),
202
- },
203
- });
204
- try {
205
- expect(container.querySelector('.smrt-admin-shell')).not.toBeNull();
206
- expect(container.querySelector('header')?.textContent).toContain('Ops');
207
- expect(container.querySelector('main')?.textContent).toContain('main work');
208
- expect(container.querySelector('[role="navigation"]')).not.toBeNull();
209
- }
210
- finally {
211
- unmount(component);
212
- }
213
- });
214
- it('pins the shell to the viewport so long workspace content scrolls inside main', () => {
215
- expect(adminShellSource).toMatch(/\.smrt-admin-shell\s*\{[^}]*\bblock-size:\s*100svh\s*;/);
216
- });
217
- it('toggles a physical-code panel hotkey', async () => {
218
- const component = mount(AdminShell, {
219
- target: container,
220
- props: {
221
- children: textSnippet('main work'),
222
- },
223
- });
224
- try {
225
- const shell = container.querySelector('.smrt-admin-shell');
226
- expect(shell?.getAttribute('data-top-state')).toBe('collapsed');
227
- await tick();
228
- window.dispatchEvent(new KeyboardEvent('keydown', { code: 'KeyW' }));
229
- flushSync();
230
- expect(shell?.getAttribute('data-top-state')).toBe('expanded');
231
- }
232
- finally {
233
- unmount(component);
234
- }
235
- });
236
- it('hides hotkey badges when shell hotkeys are disabled', () => {
237
- const state = createShellState({
238
- settings: { hotkeysEnabled: false },
239
- });
240
- const component = mount(AdminShell, {
241
- target: container,
242
- props: {
243
- state,
244
- children: textSnippet('main work'),
245
- },
246
- });
247
- try {
248
- expect(container.querySelector('.smrt-admin-shell__edge-toggle-kbd')).toBeNull();
249
- }
250
- finally {
251
- unmount(component);
252
- }
253
- });
254
- it('keeps the focus rail visible when the right panel is expanded', () => {
255
- const state = createShellState({
256
- config: {
257
- right: {
258
- initial: 'expanded',
259
- },
260
- },
261
- });
262
- const component = mount(AdminShell, {
263
- target: container,
264
- props: {
265
- state,
266
- children: textSnippet('main work'),
267
- focusRail: textSnippet('focus rail'),
268
- focusPanel: textSnippet('focus panel'),
269
- },
270
- });
271
- try {
272
- const right = container.querySelector('.smrt-admin-shell__edge--right');
273
- const rail = right?.querySelector('.smrt-admin-shell__rail');
274
- const panel = right?.querySelector('.smrt-admin-shell__panel--right');
275
- expect(right?.getAttribute('data-state')).toBe('expanded');
276
- expect(rail?.textContent).toContain('focus rail');
277
- expect(panel?.textContent).toContain('focus panel');
278
- }
279
- finally {
280
- unmount(component);
281
- }
282
- });
283
- it('renders the active registered focus tool after switching tools', async () => {
284
- const state = createShellState({
285
- config: { right: { initial: 'expanded' } },
286
- });
287
- state.registerFocusTool({
288
- id: 'usage',
289
- label: 'Usage',
290
- });
291
- state.registerFocusTool({
292
- id: 'tasks',
293
- label: 'Tasks',
294
- });
295
- const component = mount(AdminShell, {
296
- target: container,
297
- props: {
298
- state,
299
- children: textSnippet('main work'),
300
- focusPanel: activeToolSnippet(),
301
- },
302
- });
303
- try {
304
- const panel = container.querySelector('.smrt-admin-shell__panel--right');
305
- expect(panel?.textContent).toContain('usage panel');
306
- state.openFocusTool('tasks');
307
- await tick();
308
- expect(panel?.textContent).toContain('tasks panel');
309
- expect(panel?.textContent).not.toContain('usage panel');
310
- }
311
- finally {
312
- unmount(component);
313
- }
314
- });
315
- it('keeps a keepMounted focus panel (and its draft) mounted while collapsed', async () => {
316
- const state = createShellState({
317
- config: { right: { initial: 'expanded', keepMounted: true } },
318
- });
319
- const component = mount(AdminShell, {
320
- target: container,
321
- props: {
322
- state,
323
- children: textSnippet('main work'),
324
- focusPanel: createRawSnippet(() => ({
325
- render: () => '<textarea aria-label="Message"></textarea>',
326
- })),
327
- },
328
- });
329
- try {
330
- const draft = container.querySelector('textarea');
331
- if (!draft)
332
- throw new Error('focus panel did not render');
333
- draft.value = 'half-typed question';
334
- state.collapsePanel('right');
335
- await tick();
336
- const panel = container.querySelector('.smrt-admin-shell__panel--right');
337
- expect(panel?.hidden).toBe(true);
338
- expect(container.querySelector('textarea')).toBe(draft);
339
- state.expandPanel('right');
340
- await tick();
341
- expect(panel?.hidden).toBe(false);
342
- expect(container.querySelector('textarea')).toBe(draft);
343
- expect(draft.value).toBe('half-typed question');
344
- }
345
- finally {
346
- unmount(component);
347
- }
348
- });
349
- it('unmounts a collapsed panel without keepMounted', async () => {
350
- const state = createShellState({
351
- config: { right: { initial: 'expanded' } },
352
- });
353
- const component = mount(AdminShell, {
354
- target: container,
355
- props: {
356
- state,
357
- children: textSnippet('main work'),
358
- focusPanel: textSnippet('focus panel'),
359
- },
360
- });
361
- try {
362
- expect(container.querySelector('.smrt-admin-shell__panel--right')).not.toBeNull();
363
- state.collapsePanel('right');
364
- await tick();
365
- expect(container.querySelector('.smrt-admin-shell__panel--right')).toBeNull();
366
- }
367
- finally {
368
- unmount(component);
369
- }
370
- });
371
- it('keeps a keepMounted tenant panel beside the collapsed rail', async () => {
372
- const state = createShellState({
373
- config: { left: { initial: 'collapsed', keepMounted: true } },
374
- });
375
- const component = mount(AdminShell, {
376
- target: container,
377
- props: {
378
- state,
379
- children: textSnippet('main work'),
380
- tenantRail: textSnippet('tenant rail'),
381
- tenantPanel: textSnippet('tenant navigation'),
382
- },
383
- });
384
- try {
385
- const stack = container.querySelector('.smrt-admin-shell__tenant-stack');
386
- expect(stack?.hidden).toBe(true);
387
- expect(stack?.textContent).toContain('tenant navigation');
388
- const rail = container.querySelector('.smrt-admin-shell__rail');
389
- expect(rail?.textContent).toContain('tenant rail');
390
- state.expandPanel('left');
391
- await tick();
392
- expect(container.querySelector('.smrt-admin-shell__tenant-stack')).toBe(stack);
393
- expect(stack?.hidden).toBe(false);
394
- expect(rail?.textContent).not.toContain('tenant rail');
395
- }
396
- finally {
397
- unmount(component);
398
- }
399
- });
400
- it('pins a tenant footer below the scrolling tenant panel', () => {
401
- const state = createShellState({
402
- config: { left: { initial: 'expanded' } },
403
- });
404
- const component = mount(AdminShell, {
405
- target: container,
406
- props: {
407
- state,
408
- children: textSnippet('main work'),
409
- tenantPanel: textSnippet('tenant navigation'),
410
- tenantFooter: textSnippet('account menu'),
411
- },
412
- });
413
- try {
414
- expect(container.querySelector('.smrt-admin-shell__tenant-content')
415
- ?.textContent).toContain('tenant navigation');
416
- expect(container.querySelector('.smrt-admin-shell__tenant-footer')
417
- ?.textContent).toContain('account menu');
418
- }
419
- finally {
420
- unmount(component);
421
- }
422
- });
423
- it('publishes collapsed side sizes for stable top and bottom chrome', () => {
424
- const state = createShellState({
425
- config: {
426
- left: {
427
- collapsedSize: '5rem',
428
- expandedSize: '20rem',
429
- initial: 'expanded',
430
- },
431
- right: {
432
- collapsedSize: '6rem',
433
- expandedSize: '24rem',
434
- initial: 'expanded',
435
- },
436
- },
437
- });
438
- const component = mount(AdminShell, {
439
- target: container,
440
- props: {
441
- state,
442
- children: textSnippet('main work'),
443
- },
444
- });
445
- try {
446
- const shell = container.querySelector('.smrt-admin-shell');
447
- const style = shell?.getAttribute('style');
448
- expect(style).toContain('--smrt-admin-shell-left-track: 20rem');
449
- expect(style).toContain('--smrt-admin-shell-right-track: 24rem');
450
- expect(style).toContain('--smrt-admin-shell-left-collapsed: 5rem');
451
- expect(style).toContain('--smrt-admin-shell-right-collapsed: 6rem');
452
- }
453
- finally {
454
- unmount(component);
455
- }
456
- });
457
- it('does not reserve chrome corner space for hidden side edges', () => {
458
- const state = createShellState({
459
- config: {
460
- left: false,
461
- right: false,
462
- },
463
- });
464
- const component = mount(AdminShell, {
465
- target: container,
466
- props: {
467
- state,
468
- children: textSnippet('main work'),
469
- },
470
- });
471
- try {
472
- const shell = container.querySelector('.smrt-admin-shell');
473
- const style = shell?.getAttribute('style');
474
- expect(style).toContain('--smrt-admin-shell-left-track: 0rem');
475
- expect(style).toContain('--smrt-admin-shell-right-track: 0rem');
476
- expect(style).toContain('--smrt-admin-shell-left-collapsed: 0rem');
477
- expect(style).toContain('--smrt-admin-shell-right-collapsed: 0rem');
478
- }
479
- finally {
480
- unmount(component);
481
- }
482
- });
483
- it('collapses corner tracks when no corner snippets are mounted', () => {
484
- const component = mount(AdminShell, {
485
- target: container,
486
- props: {
487
- title: 'Ops',
488
- children: textSnippet('main work'),
489
- },
490
- });
491
- try {
492
- const topEdge = container.querySelector('.smrt-admin-shell__edge--top');
493
- const band = container.querySelector('.smrt-admin-shell__band--top');
494
- expect(topEdge.style.getPropertyValue('--edge-columns').trim()).toBe('0px minmax(0, 1fr) 0px');
495
- expect(band.style.getPropertyValue('--band-column').trim()).toBe('2');
496
- }
497
- finally {
498
- unmount(component);
499
- }
500
- });
501
- it('renders a default focus rail from registered tools when no focusRail snippet is given', async () => {
502
- const state = createShellState();
503
- state.registerFocusTool({ id: 'chat', label: 'Chat' });
504
- state.registerFocusTool({ id: 'files', label: 'Files' });
505
- const component = mount(AdminShell, {
506
- target: container,
507
- props: { state, children: textSnippet('main work') },
508
- });
509
- try {
510
- const buttons = container.querySelectorAll('.smrt-admin-shell__focus-tool');
511
- expect(buttons.length).toBe(2);
512
- expect(buttons[0].getAttribute('aria-label')).toBe('Chat');
513
- // Clicking a tool opens the panel; clicking the active one closes it.
514
- buttons[0].click();
515
- const { tick } = await import('svelte');
516
- await tick();
517
- expect(container
518
- .querySelector('.smrt-admin-shell__edge--right')
519
- ?.getAttribute('data-state')).toBe('expanded');
520
- buttons[0].click();
521
- await tick();
522
- expect(container
523
- .querySelector('.smrt-admin-shell__edge--right')
524
- ?.getAttribute('data-state')).toBe('collapsed');
525
- }
526
- finally {
527
- unmount(component);
528
- }
529
- });
530
- it('reserves corner tracks only for mounted corner snippets', () => {
531
- const component = mount(AdminShell, {
532
- target: container,
533
- props: {
534
- title: 'Ops',
535
- topLeftCorner: textSnippet('corner'),
536
- children: textSnippet('main work'),
537
- },
538
- });
539
- try {
540
- const topEdge = container.querySelector('.smrt-admin-shell__edge--top');
541
- const band = container.querySelector('.smrt-admin-shell__band--top');
542
- const columns = topEdge.style.getPropertyValue('--edge-columns');
543
- expect(columns).toContain('--smrt-admin-shell-left-collapsed');
544
- expect(columns).not.toContain('--smrt-admin-shell-right-collapsed');
545
- expect(band.style.getPropertyValue('--band-column').trim()).toBe('2');
546
- }
547
- finally {
548
- unmount(component);
549
- }
550
- });
551
- it('keeps a right-only corner in the explicit third grid track', () => {
552
- const component = mount(AdminShell, {
553
- target: container,
554
- props: {
555
- title: 'Ops',
556
- topRightCorner: textSnippet('right corner'),
557
- children: textSnippet('main work'),
558
- },
559
- });
560
- try {
561
- const topEdge = container.querySelector('.smrt-admin-shell__edge--top');
562
- const band = container.querySelector('.smrt-admin-shell__band--top');
563
- const columns = topEdge.style.getPropertyValue('--edge-columns').trim();
564
- expect(columns).toBe('0px minmax(0, 1fr) var(--smrt-admin-shell-right-collapsed)');
565
- expect(band.style.getPropertyValue('--band-column').trim()).toBe('2');
566
- expect(container.querySelector('.smrt-admin-shell__corner--top-right')).not.toBeNull();
567
- }
568
- finally {
569
- unmount(component);
570
- }
571
- });
572
- });