@happyvertical/smrt-svelte 0.55.6 → 0.55.8

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 (318) hide show
  1. package/AGENTS.md +9 -31
  2. package/README.md +195 -5
  3. package/agents/browser-ai.md +47 -0
  4. package/agents/command-palette.md +85 -0
  5. package/agents/import-export.md +62 -0
  6. package/agents/overview-surfaces.md +255 -0
  7. package/agents/screens.md +57 -0
  8. package/agents/workspace.md +202 -5
  9. package/dist/browser-ai/adapters/stt/dictation-source.d.ts.map +1 -1
  10. package/dist/browser-ai/adapters/stt/dictation-source.js +8 -2
  11. package/dist/browser-ai/adapters/stt/factory.d.ts +6 -3
  12. package/dist/browser-ai/adapters/stt/factory.d.ts.map +1 -1
  13. package/dist/browser-ai/adapters/stt/factory.js +19 -9
  14. package/dist/browser-ai/adapters/stt/index.d.ts +3 -1
  15. package/dist/browser-ai/adapters/stt/index.d.ts.map +1 -1
  16. package/dist/browser-ai/adapters/stt/index.js +3 -1
  17. package/dist/browser-ai/adapters/stt/local-speech-model.d.ts +111 -0
  18. package/dist/browser-ai/adapters/stt/local-speech-model.d.ts.map +1 -0
  19. package/dist/browser-ai/adapters/stt/local-speech-model.js +377 -0
  20. package/dist/browser-ai/adapters/stt/local-speech.d.ts +82 -0
  21. package/dist/browser-ai/adapters/stt/local-speech.d.ts.map +1 -0
  22. package/dist/browser-ai/adapters/stt/local-speech.js +317 -0
  23. package/dist/browser-ai/adapters/stt/local-speech.worker.d.ts +2 -0
  24. package/dist/browser-ai/adapters/stt/local-speech.worker.d.ts.map +1 -0
  25. package/dist/browser-ai/adapters/stt/local-speech.worker.js +32 -0
  26. package/dist/browser-ai/adapters/stt/transformers-env.d.ts +8 -0
  27. package/dist/browser-ai/adapters/stt/transformers-env.d.ts.map +1 -0
  28. package/dist/browser-ai/adapters/stt/transformers-env.js +17 -0
  29. package/dist/browser-ai/adapters/stt/types.d.ts +54 -9
  30. package/dist/browser-ai/adapters/stt/types.d.ts.map +1 -1
  31. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts +5 -0
  32. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts.map +1 -1
  33. package/dist/browser-ai/adapters/tts/browser-synthesis.js +83 -55
  34. package/dist/browser-ai/capabilities/speech-probe.d.ts +29 -0
  35. package/dist/browser-ai/capabilities/speech-probe.d.ts.map +1 -0
  36. package/dist/browser-ai/capabilities/speech-probe.js +19 -0
  37. package/dist/browser-ai/core/errors.d.ts +9 -0
  38. package/dist/browser-ai/core/errors.d.ts.map +1 -1
  39. package/dist/browser-ai/core/errors.js +12 -0
  40. package/dist/browser-ai/index.d.ts +1 -0
  41. package/dist/browser-ai/index.d.ts.map +1 -1
  42. package/dist/browser-ai/index.js +1 -0
  43. package/dist/components/app/AppShell.svelte +587 -33
  44. package/dist/components/app/AppShell.svelte.d.ts +75 -4
  45. package/dist/components/app/AppShell.svelte.d.ts.map +1 -1
  46. package/dist/components/app/DockToggles.svelte +0 -1
  47. package/dist/components/app/dock-toggle.d.ts +7 -1
  48. package/dist/components/app/dock-toggle.d.ts.map +1 -1
  49. package/dist/components/app/index.d.ts +2 -1
  50. package/dist/components/app/index.d.ts.map +1 -1
  51. package/dist/components/app/slot-item.d.ts +21 -0
  52. package/dist/components/app/slot-item.d.ts.map +1 -0
  53. package/dist/components/app/slot-item.js +1 -0
  54. package/dist/components/command-palette/CommandPalette.svelte +75 -0
  55. package/dist/components/command-palette/CommandPalette.svelte.d.ts +22 -0
  56. package/dist/components/command-palette/CommandPalette.svelte.d.ts.map +1 -0
  57. package/dist/components/command-palette/CommandPaletteDialog.svelte +406 -0
  58. package/dist/components/command-palette/CommandPaletteDialog.svelte.d.ts +18 -0
  59. package/dist/components/command-palette/CommandPaletteDialog.svelte.d.ts.map +1 -0
  60. package/dist/components/command-palette/CommandPaletteTrigger.svelte +91 -0
  61. package/dist/components/command-palette/CommandPaletteTrigger.svelte.d.ts +17 -0
  62. package/dist/components/command-palette/CommandPaletteTrigger.svelte.d.ts.map +1 -0
  63. package/dist/components/command-palette/context.d.ts +18 -0
  64. package/dist/components/command-palette/context.d.ts.map +1 -0
  65. package/dist/components/command-palette/context.js +38 -0
  66. package/dist/components/command-palette/controller.svelte.d.ts +70 -0
  67. package/dist/components/command-palette/controller.svelte.d.ts.map +1 -0
  68. package/dist/components/command-palette/controller.svelte.js +379 -0
  69. package/dist/components/command-palette/hotkeys.d.ts +30 -0
  70. package/dist/components/command-palette/hotkeys.d.ts.map +1 -0
  71. package/dist/components/command-palette/hotkeys.js +161 -0
  72. package/dist/components/command-palette/index.d.ts +19 -0
  73. package/dist/components/command-palette/index.d.ts.map +1 -0
  74. package/dist/components/command-palette/index.js +17 -0
  75. package/dist/components/command-palette/match.d.ts +38 -0
  76. package/dist/components/command-palette/match.d.ts.map +1 -0
  77. package/dist/components/command-palette/match.js +172 -0
  78. package/dist/components/command-palette/providers.d.ts +159 -0
  79. package/dist/components/command-palette/providers.d.ts.map +1 -0
  80. package/dist/components/command-palette/providers.js +345 -0
  81. package/dist/components/command-palette/rank.d.ts +20 -0
  82. package/dist/components/command-palette/rank.d.ts.map +1 -0
  83. package/dist/components/command-palette/rank.js +74 -0
  84. package/dist/components/command-palette/types.d.ts +119 -0
  85. package/dist/components/command-palette/types.d.ts.map +1 -0
  86. package/dist/components/command-palette/types.js +10 -0
  87. package/dist/components/command-palette/use-provider.svelte.d.ts +14 -0
  88. package/dist/components/command-palette/use-provider.svelte.d.ts.map +1 -0
  89. package/dist/components/command-palette/use-provider.svelte.js +23 -0
  90. package/dist/components/forms/AddressInput.svelte +2 -15
  91. package/dist/components/forms/AddressInput.svelte.d.ts.map +1 -1
  92. package/dist/components/forms/DateRangeInput.svelte +2 -15
  93. package/dist/components/forms/DateRangeInput.svelte.d.ts.map +1 -1
  94. package/dist/components/forms/DateTimeInput.svelte +8 -15
  95. package/dist/components/forms/DateTimeInput.svelte.d.ts.map +1 -1
  96. package/dist/components/forms/MeasurementInput.svelte +2 -15
  97. package/dist/components/forms/MeasurementInput.svelte.d.ts.map +1 -1
  98. package/dist/components/forms/MoneyInput.svelte +8 -25
  99. package/dist/components/forms/MoneyInput.svelte.d.ts.map +1 -1
  100. package/dist/components/forms/NumberInput.svelte +7 -15
  101. package/dist/components/forms/NumberInput.svelte.d.ts.map +1 -1
  102. package/dist/components/forms/PhoneInput.svelte +7 -15
  103. package/dist/components/forms/PhoneInput.svelte.d.ts.map +1 -1
  104. package/dist/components/forms/SelectInput.svelte +34 -40
  105. package/dist/components/forms/SelectInput.svelte.d.ts.map +1 -1
  106. package/dist/components/forms/TextInput.svelte +20 -37
  107. package/dist/components/forms/TextInput.svelte.d.ts.map +1 -1
  108. package/dist/components/forms/TextareaInput.svelte +19 -35
  109. package/dist/components/forms/TextareaInput.svelte.d.ts.map +1 -1
  110. package/dist/components/import-export/ImportExport.svelte +678 -0
  111. package/dist/components/import-export/ImportExport.svelte.d.ts +5 -0
  112. package/dist/components/import-export/ImportExport.svelte.d.ts.map +1 -0
  113. package/dist/components/import-export/collection-adapter.d.ts +35 -0
  114. package/dist/components/import-export/collection-adapter.d.ts.map +1 -0
  115. package/dist/components/import-export/collection-adapter.js +42 -0
  116. package/dist/components/import-export/csv.d.ts +60 -0
  117. package/dist/components/import-export/csv.d.ts.map +1 -0
  118. package/dist/components/import-export/csv.js +192 -0
  119. package/dist/components/import-export/download.d.ts +4 -0
  120. package/dist/components/import-export/download.d.ts.map +1 -0
  121. package/dist/components/import-export/download.js +17 -0
  122. package/dist/components/import-export/export.d.ts +25 -0
  123. package/dist/components/import-export/export.d.ts.map +1 -0
  124. package/dist/components/import-export/export.js +68 -0
  125. package/dist/components/import-export/fields.d.ts +48 -0
  126. package/dist/components/import-export/fields.d.ts.map +1 -0
  127. package/dist/components/import-export/fields.js +103 -0
  128. package/dist/components/import-export/index.d.ts +12 -0
  129. package/dist/components/import-export/index.d.ts.map +1 -0
  130. package/dist/components/import-export/index.js +9 -0
  131. package/dist/components/import-export/mapping.d.ts +12 -0
  132. package/dist/components/import-export/mapping.d.ts.map +1 -0
  133. package/dist/components/import-export/mapping.js +38 -0
  134. package/dist/components/import-export/props.d.ts +34 -0
  135. package/dist/components/import-export/props.d.ts.map +1 -0
  136. package/dist/components/import-export/props.js +1 -0
  137. package/dist/components/import-export/report.d.ts +13 -0
  138. package/dist/components/import-export/report.d.ts.map +1 -0
  139. package/dist/components/import-export/report.js +50 -0
  140. package/dist/components/import-export/runner.d.ts +17 -0
  141. package/dist/components/import-export/runner.d.ts.map +1 -0
  142. package/dist/components/import-export/runner.js +39 -0
  143. package/dist/components/import-export/types.d.ts +100 -0
  144. package/dist/components/import-export/types.d.ts.map +1 -0
  145. package/dist/components/import-export/types.js +6 -0
  146. package/dist/components/import-export/validate.d.ts +39 -0
  147. package/dist/components/import-export/validate.d.ts.map +1 -0
  148. package/dist/components/import-export/validate.js +268 -0
  149. package/dist/components/overview/OverviewGrid.svelte +579 -0
  150. package/dist/components/overview/OverviewGrid.svelte.d.ts +5 -0
  151. package/dist/components/overview/OverviewGrid.svelte.d.ts.map +1 -0
  152. package/dist/components/overview/WidgetOptionsForm.svelte +193 -0
  153. package/dist/components/overview/WidgetOptionsForm.svelte.d.ts +5 -0
  154. package/dist/components/overview/WidgetOptionsForm.svelte.d.ts.map +1 -0
  155. package/dist/components/overview/controller.svelte.d.ts +92 -0
  156. package/dist/components/overview/controller.svelte.d.ts.map +1 -0
  157. package/dist/components/overview/controller.svelte.js +336 -0
  158. package/dist/components/overview/format.d.ts +13 -0
  159. package/dist/components/overview/format.d.ts.map +1 -0
  160. package/dist/components/overview/format.js +45 -0
  161. package/dist/components/overview/grid-types.d.ts +52 -0
  162. package/dist/components/overview/grid-types.d.ts.map +1 -0
  163. package/dist/components/overview/grid-types.js +1 -0
  164. package/dist/components/overview/index.d.ts +24 -0
  165. package/dist/components/overview/index.d.ts.map +1 -0
  166. package/dist/components/overview/index.js +22 -0
  167. package/dist/components/overview/load.d.ts +30 -0
  168. package/dist/components/overview/load.d.ts.map +1 -0
  169. package/dist/components/overview/load.js +92 -0
  170. package/dist/components/overview/markdown.d.ts +53 -0
  171. package/dist/components/overview/markdown.d.ts.map +1 -0
  172. package/dist/components/overview/markdown.js +203 -0
  173. package/dist/components/overview/model.d.ts +100 -0
  174. package/dist/components/overview/model.d.ts.map +1 -0
  175. package/dist/components/overview/model.js +460 -0
  176. package/dist/components/overview/recipe-widgets.d.ts +77 -0
  177. package/dist/components/overview/recipe-widgets.d.ts.map +1 -0
  178. package/dist/components/overview/recipe-widgets.js +151 -0
  179. package/dist/components/overview/registry.d.ts +45 -0
  180. package/dist/components/overview/registry.d.ts.map +1 -0
  181. package/dist/components/overview/registry.js +112 -0
  182. package/dist/components/overview/resize.d.ts +25 -0
  183. package/dist/components/overview/resize.d.ts.map +1 -0
  184. package/dist/components/overview/resize.js +41 -0
  185. package/dist/components/overview/schema.d.ts +34 -0
  186. package/dist/components/overview/schema.d.ts.map +1 -0
  187. package/dist/components/overview/schema.js +180 -0
  188. package/dist/components/overview/server.d.ts +14 -0
  189. package/dist/components/overview/server.d.ts.map +1 -0
  190. package/dist/components/overview/server.js +13 -0
  191. package/dist/components/overview/types.d.ts +235 -0
  192. package/dist/components/overview/types.d.ts.map +1 -0
  193. package/dist/components/overview/types.js +17 -0
  194. package/dist/components/overview/widgets/ChartWidget.svelte +111 -0
  195. package/dist/components/overview/widgets/ChartWidget.svelte.d.ts +6 -0
  196. package/dist/components/overview/widgets/ChartWidget.svelte.d.ts.map +1 -0
  197. package/dist/components/overview/widgets/MetricWidget.svelte +86 -0
  198. package/dist/components/overview/widgets/MetricWidget.svelte.d.ts +6 -0
  199. package/dist/components/overview/widgets/MetricWidget.svelte.d.ts.map +1 -0
  200. package/dist/components/overview/widgets/NoteWidget.svelte +61 -0
  201. package/dist/components/overview/widgets/NoteWidget.svelte.d.ts +5 -0
  202. package/dist/components/overview/widgets/NoteWidget.svelte.d.ts.map +1 -0
  203. package/dist/components/overview/widgets/RecordListWidget.svelte +91 -0
  204. package/dist/components/overview/widgets/RecordListWidget.svelte.d.ts +6 -0
  205. package/dist/components/overview/widgets/RecordListWidget.svelte.d.ts.map +1 -0
  206. package/dist/components/overview/widgets/ShortcutsWidget.svelte +80 -0
  207. package/dist/components/overview/widgets/ShortcutsWidget.svelte.d.ts +6 -0
  208. package/dist/components/overview/widgets/ShortcutsWidget.svelte.d.ts.map +1 -0
  209. package/dist/components/overview/widgets/core.d.ts +44 -0
  210. package/dist/components/overview/widgets/core.d.ts.map +1 -0
  211. package/dist/components/overview/widgets/core.js +222 -0
  212. package/dist/components/overview/widgets/data.d.ts +76 -0
  213. package/dist/components/overview/widgets/data.d.ts.map +1 -0
  214. package/dist/components/overview/widgets/data.js +40 -0
  215. package/dist/components/screens/DetailScreen.svelte +220 -0
  216. package/dist/components/screens/DetailScreen.svelte.d.ts +5 -0
  217. package/dist/components/screens/DetailScreen.svelte.d.ts.map +1 -0
  218. package/dist/components/screens/EditForm.svelte +313 -0
  219. package/dist/components/screens/EditForm.svelte.d.ts +5 -0
  220. package/dist/components/screens/EditForm.svelte.d.ts.map +1 -0
  221. package/dist/components/screens/ListScreen.svelte +191 -0
  222. package/dist/components/screens/ListScreen.svelte.d.ts +5 -0
  223. package/dist/components/screens/ListScreen.svelte.d.ts.map +1 -0
  224. package/dist/components/screens/RecipeScreens.svelte +237 -0
  225. package/dist/components/screens/RecipeScreens.svelte.d.ts +5 -0
  226. package/dist/components/screens/RecipeScreens.svelte.d.ts.map +1 -0
  227. package/dist/components/screens/fields.d.ts +54 -0
  228. package/dist/components/screens/fields.d.ts.map +1 -0
  229. package/dist/components/screens/fields.js +229 -0
  230. package/dist/components/screens/index.d.ts +8 -0
  231. package/dist/components/screens/index.d.ts.map +1 -0
  232. package/dist/components/screens/index.js +6 -0
  233. package/dist/components/screens/types.d.ts +215 -0
  234. package/dist/components/screens/types.d.ts.map +1 -0
  235. package/dist/components/screens/types.js +1 -0
  236. package/dist/components/screens/values.d.ts +62 -0
  237. package/dist/components/screens/values.d.ts.map +1 -0
  238. package/dist/components/screens/values.js +289 -0
  239. package/dist/components/sortable/Sortable.svelte +6 -33
  240. package/dist/components/sortable/Sortable.svelte.d.ts.map +1 -1
  241. package/dist/components/sortable/announce.d.ts +5 -0
  242. package/dist/components/sortable/announce.d.ts.map +1 -0
  243. package/dist/components/sortable/announce.js +33 -0
  244. package/dist/components/sortable/controller.svelte.d.ts +10 -0
  245. package/dist/components/sortable/controller.svelte.d.ts.map +1 -1
  246. package/dist/components/sortable/controller.svelte.js +29 -7
  247. package/dist/components/workspace/admin-shell/AdminShell.svelte +424 -58
  248. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts +27 -2
  249. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts.map +1 -1
  250. package/dist/components/workspace/admin-shell/ShellBrand.svelte +86 -0
  251. package/dist/components/workspace/admin-shell/ShellBrand.svelte.d.ts +18 -0
  252. package/dist/components/workspace/admin-shell/ShellBrand.svelte.d.ts.map +1 -0
  253. package/dist/components/workspace/admin-shell/ShellIconButton.svelte +77 -0
  254. package/dist/components/workspace/admin-shell/ShellIconButton.svelte.d.ts +26 -0
  255. package/dist/components/workspace/admin-shell/ShellIconButton.svelte.d.ts.map +1 -0
  256. package/dist/components/workspace/admin-shell/ShellLayoutEditor.svelte +88 -16
  257. package/dist/components/workspace/admin-shell/ShellLayoutEditor.svelte.d.ts.map +1 -1
  258. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte +531 -0
  259. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte.d.ts +26 -0
  260. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte.d.ts.map +1 -0
  261. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte +57 -0
  262. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte.d.ts +22 -0
  263. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte.d.ts.map +1 -0
  264. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte +290 -0
  265. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte.d.ts +32 -0
  266. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte.d.ts.map +1 -0
  267. package/dist/components/workspace/admin-shell/TenantNav.svelte +67 -2
  268. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts +8 -0
  269. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts.map +1 -1
  270. package/dist/components/workspace/admin-shell/layout-controller.svelte.d.ts +67 -0
  271. package/dist/components/workspace/admin-shell/layout-controller.svelte.d.ts.map +1 -1
  272. package/dist/components/workspace/admin-shell/layout-controller.svelte.js +129 -1
  273. package/dist/components/workspace/admin-shell/layout.d.ts +122 -0
  274. package/dist/components/workspace/admin-shell/layout.d.ts.map +1 -1
  275. package/dist/components/workspace/admin-shell/layout.js +410 -10
  276. package/dist/components/workspace/admin-shell/settings.js +4 -4
  277. package/dist/components/workspace/admin-shell/shell-icons.d.ts +45 -0
  278. package/dist/components/workspace/admin-shell/shell-icons.d.ts.map +1 -0
  279. package/dist/components/workspace/admin-shell/shell-icons.js +66 -0
  280. package/dist/components/workspace/admin-shell/slot-labels.d.ts +33 -0
  281. package/dist/components/workspace/admin-shell/slot-labels.d.ts.map +1 -0
  282. package/dist/components/workspace/admin-shell/slot-labels.js +33 -0
  283. package/dist/components/workspace/admin-shell/slots.d.ts +50 -0
  284. package/dist/components/workspace/admin-shell/slots.d.ts.map +1 -0
  285. package/dist/components/workspace/admin-shell/slots.js +77 -0
  286. package/dist/components/workspace/admin-shell/state.svelte.d.ts +35 -0
  287. package/dist/components/workspace/admin-shell/state.svelte.d.ts.map +1 -1
  288. package/dist/components/workspace/admin-shell/state.svelte.js +111 -0
  289. package/dist/components/workspace/admin-shell/types.d.ts +101 -1
  290. package/dist/components/workspace/admin-shell/types.d.ts.map +1 -1
  291. package/dist/components/workspace/index.d.ts +9 -2
  292. package/dist/components/workspace/index.d.ts.map +1 -1
  293. package/dist/components/workspace/index.js +6 -0
  294. package/dist/components/workspace/manifest-nav.d.ts +20 -0
  295. package/dist/components/workspace/manifest-nav.d.ts.map +1 -1
  296. package/dist/components/workspace/manifest-nav.js +42 -13
  297. package/dist/i18n/server.d.ts +6 -0
  298. package/dist/i18n/server.d.ts.map +1 -1
  299. package/dist/i18n/server.js +6 -0
  300. package/dist/i18n/strings.import-export.d.ts +88 -0
  301. package/dist/i18n/strings.import-export.d.ts.map +1 -0
  302. package/dist/i18n/strings.import-export.js +88 -0
  303. package/dist/i18n/strings.overview.d.ts +100 -0
  304. package/dist/i18n/strings.overview.d.ts.map +1 -0
  305. package/dist/i18n/strings.overview.js +107 -0
  306. package/dist/i18n/strings.palette.d.ts +18 -0
  307. package/dist/i18n/strings.palette.d.ts.map +1 -0
  308. package/dist/i18n/strings.palette.js +18 -0
  309. package/dist/i18n/strings.screens.d.ts +31 -0
  310. package/dist/i18n/strings.screens.d.ts.map +1 -0
  311. package/dist/i18n/strings.screens.js +31 -0
  312. package/dist/i18n/strings.workspace.d.ts +49 -0
  313. package/dist/i18n/strings.workspace.d.ts.map +1 -1
  314. package/dist/i18n/strings.workspace.js +49 -0
  315. package/package.json +59 -19
  316. package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts +0 -51
  317. package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts.map +0 -1
  318. package/dist/browser-ai/adapters/stt/whisper-wasm.js +0 -380
@@ -1,7 +1,8 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import { type BottomBarMode } from './mobile-shell.js';
3
3
  import { type ShellState } from './state.svelte.js';
4
- import type { AdminShellPhoneOptions, AdminShellProps, ShellFocusTool, ShellViewport } from './types.js';
4
+ import { type ShellSlot } from './slots.js';
5
+ import type { AdminShellPhoneOptions, AdminShellProps, ShellLayoutEditSurface, ShellFocusTool, ShellViewport } from './types.js';
5
6
  interface Props extends AdminShellProps {
6
7
  /** Pre-configured shell state. Creates one from config if omitted. */
7
8
  state?: ShellState;
@@ -17,6 +18,30 @@ interface Props extends AdminShellProps {
17
18
  tenantRailFooter?: Snippet;
18
19
  /** Content for the left tenant panel. */
19
20
  tenantPanel?: Snippet;
21
+ /**
22
+ * Host content for the region slots (`header.start|center|end`,
23
+ * `footer.start|center|end`, `leftSidebar.header|footer`,
24
+ * `rightSidebar.header|footer`). A slot whose region is not visible moves
25
+ * along its documented fallback chain (see `slotFallbackChain`).
26
+ */
27
+ slots?: Partial<Record<ShellSlot, Snippet>>;
28
+ /**
29
+ * In-place layout editing (`AppShell` supplies it): while `active`,
30
+ * slots render as drop zones and hidden regions as strips.
31
+ */
32
+ layoutEdit?: ShellLayoutEditSurface;
33
+ /** The shell's root element (bindable), e.g. to confine drag hit-testing. */
34
+ rootElement?: HTMLElement;
35
+ /**
36
+ * Room kept clear for a floating control (AppShell's floating layout
37
+ * toggle): CSS lengths for the header's end, the right sidebar's top and
38
+ * main's top. Part of the root's style so re-renders never drop it.
39
+ */
40
+ floatingReserve?: {
41
+ inline?: string;
42
+ block?: string;
43
+ main?: string;
44
+ };
20
45
  /** Content for the tenant panel footer. */
21
46
  tenantFooter?: Snippet;
22
47
  /** Content for the right focus rail. */
@@ -89,7 +114,7 @@ interface Props extends AdminShellProps {
89
114
  path?: string;
90
115
  children: Snippet;
91
116
  }
92
- declare const AdminShell: import("svelte").Component<Props, {}, "">;
117
+ declare const AdminShell: import("svelte").Component<Props, {}, "rootElement">;
93
118
  type AdminShell = ReturnType<typeof AdminShell>;
94
119
  export default AdminShell;
95
120
  //# sourceMappingURL=AdminShell.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminShell.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/AdminShell.svelte.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAQtC,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,mBAAmB,CAAC;AAStE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EACR,sBAAsB,EACtB,eAAe,EAEf,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAGpB,UAAU,KAAM,SAAQ,eAAe;IACrC,sEAAsE;IACtE,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IACxD;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,QAAQ,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC,CAAC;IAChD;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IAC7C;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,QAAQ,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5E,uEAAuE;IACvE,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAs5BH,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"AdminShell.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/AdminShell.svelte.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ <script lang="ts">
2
+ /**
3
+ * The shell brand: logo, title, subtitle and an optional home link. Rendered
4
+ * by `AdminShell` in its top band, or by `AppShell` as the movable
5
+ * `item:brand` slot item (default slot `header.start`).
6
+ */
7
+ import { useI18n } from '@happyvertical/smrt-ui/i18n';
8
+ import type { Snippet } from 'svelte';
9
+ import { M } from '../../../i18n/strings.workspace.js';
10
+
11
+ interface Props {
12
+ title?: string;
13
+ subtitle?: string;
14
+ homeHref?: string;
15
+ logoSrc?: string;
16
+ logoAlt?: string;
17
+ /** Custom brand content, receiving whether it is in the compact rail. */
18
+ brand?: Snippet<[{ compact: boolean }]>;
19
+ /** Compact (rail) form: logo or the title's first letter. */
20
+ compact?: boolean;
21
+ }
22
+
23
+ let {
24
+ title = 'SMRT',
25
+ subtitle = '',
26
+ homeHref,
27
+ logoSrc,
28
+ logoAlt = '',
29
+ brand,
30
+ compact = false,
31
+ }: Props = $props();
32
+ const { t } = useI18n();
33
+ </script>
34
+
35
+ {#snippet content()}
36
+ {#if brand}
37
+ {@render brand({ compact })}
38
+ {:else}
39
+ {#if logoSrc}<img class="smrt-admin-shell__logo" src={logoSrc} alt={logoAlt} />{/if}
40
+ {#if compact}
41
+ {#if !logoSrc}<span aria-hidden="true">{title.charAt(0)}</span>{/if}
42
+ {:else}
43
+ <div class="smrt-admin-shell__brand-text" class:wordmark={Boolean(logoSrc) && !subtitle}><strong>{title}</strong>{#if subtitle}<span>{subtitle}</span>{/if}</div>
44
+ {/if}
45
+ {/if}
46
+ {/snippet}
47
+
48
+ {#if homeHref}
49
+ <a class="smrt-admin-shell__brand smrt-admin-shell__brand-link" class:compact href={homeHref} aria-label={title || t(M['ui.admin_shell.home'])}>
50
+ {@render content()}
51
+ </a>
52
+ {:else}
53
+ <div class="smrt-admin-shell__brand" class:compact>{@render content()}</div>
54
+ {/if}
55
+
56
+ <style>
57
+ .smrt-admin-shell__brand {
58
+ display: flex;
59
+ align-items: center;
60
+ gap: var(--smrt-spacing-2);
61
+ min-width: 0;
62
+ color: inherit;
63
+ text-decoration: none;
64
+ }
65
+ .smrt-admin-shell__brand-text { display: grid; min-width: 0; }
66
+ .smrt-admin-shell__brand.compact { justify-content: center; margin-block-end: var(--smrt-spacing-2); }
67
+ .smrt-admin-shell__brand-link:focus-visible { outline: 2px solid var(--smrt-color-primary); outline-offset: 2px; }
68
+ .smrt-admin-shell__logo { inline-size: 2rem; block-size: 2rem; object-fit: contain; flex-shrink: 0; }
69
+
70
+ .smrt-admin-shell__brand strong,
71
+ .smrt-admin-shell__brand span {
72
+ overflow: hidden;
73
+ text-overflow: ellipsis;
74
+ white-space: nowrap;
75
+ }
76
+
77
+ .smrt-admin-shell__brand span {
78
+ color: var(--smrt-color-on-surface-variant);
79
+ }
80
+
81
+ /* Logo and title alone ([logo] Planner): the title reads as a wordmark,
82
+ its line as tall as the 2rem logo. */
83
+ .smrt-admin-shell__brand-text.wordmark strong {
84
+ font: var(--smrt-typography-headline-small-font, 500 1.5rem/2rem sans-serif);
85
+ }
86
+ </style>
@@ -0,0 +1,18 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ title?: string;
4
+ subtitle?: string;
5
+ homeHref?: string;
6
+ logoSrc?: string;
7
+ logoAlt?: string;
8
+ /** Custom brand content, receiving whether it is in the compact rail. */
9
+ brand?: Snippet<[{
10
+ compact: boolean;
11
+ }]>;
12
+ /** Compact (rail) form: logo or the title's first letter. */
13
+ compact?: boolean;
14
+ }
15
+ declare const ShellBrand: import("svelte").Component<Props, {}, "">;
16
+ type ShellBrand = ReturnType<typeof ShellBrand>;
17
+ export default ShellBrand;
18
+ //# sourceMappingURL=ShellBrand.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellBrand.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ShellBrand.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAItC,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IACxC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA6CD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,77 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Icon-only button used by the layout-editing chrome: a labelled `<button>`
4
+ * with the label as tooltip, `aria-pressed` for toggles, and a 2rem hit area
5
+ * (the same visual language as a nav row's `action`).
6
+ */
7
+ import type { Snippet } from 'svelte';
8
+ import type { HTMLButtonAttributes } from 'svelte/elements';
9
+ import { SHELL_ICON_PATHS, type ShellIconName } from './shell-icons.js';
10
+
11
+ interface Props
12
+ extends Omit<HTMLButtonAttributes, 'aria-label' | 'title' | 'children'> {
13
+ /** Accessible name and tooltip. */
14
+ label: string;
15
+ /** Which filled icon to draw (omit when passing `children`). */
16
+ icon?: ShellIconName;
17
+ /** Custom icon content, drawn instead of `icon` (decorative). */
18
+ children?: Snippet;
19
+ /** Toggle state; omit for a plain action button. */
20
+ pressed?: boolean;
21
+ /** Tooltip text when it should differ from the label (default: the label). */
22
+ tooltip?: string;
23
+ /** Icon edge length in pixels (default 18). */
24
+ size?: number;
25
+ }
26
+
27
+ let {
28
+ label,
29
+ icon,
30
+ children,
31
+ pressed,
32
+ tooltip,
33
+ size = 18,
34
+ type = 'button',
35
+ class: className = '',
36
+ ...rest
37
+ }: Props = $props();
38
+ </script>
39
+
40
+ <!-- raw-primitive-allow: icon-only shell chrome control (tooltip + aria-pressed) -->
41
+ <button
42
+ {...rest}
43
+ {type}
44
+ class="smrt-shell-icon-button {className}"
45
+ aria-label={label}
46
+ title={tooltip ?? label}
47
+ aria-pressed={pressed}
48
+ >
49
+ {#if children}
50
+ {@render children()}
51
+ {:else if icon}
52
+ <svg viewBox="0 0 24 24" width={size} height={size} fill="currentColor" aria-hidden="true" focusable="false">
53
+ <path d={SHELL_ICON_PATHS[icon]} />
54
+ </svg>
55
+ {/if}
56
+ </button>
57
+
58
+ <style>
59
+ .smrt-shell-icon-button {
60
+ flex: 0 0 auto;
61
+ display: inline-grid;
62
+ place-items: center;
63
+ box-sizing: border-box;
64
+ inline-size: max(2rem, var(--smrt-control-target-min, 0px));
65
+ block-size: max(2rem, var(--smrt-control-target-min, 0px));
66
+ padding: 0;
67
+ border: 0;
68
+ border-radius: var(--smrt-radius-medium, 0.5rem);
69
+ background: transparent;
70
+ color: var(--smrt-color-on-surface-variant);
71
+ cursor: pointer;
72
+ }
73
+ .smrt-shell-icon-button:hover { background: var(--smrt-color-surface-container-high); color: var(--smrt-color-on-surface); }
74
+ .smrt-shell-icon-button[aria-pressed='true'] { color: var(--smrt-color-on-surface); }
75
+ .smrt-shell-icon-button:focus-visible { outline: 2px solid var(--smrt-color-primary); outline-offset: 2px; }
76
+ .smrt-shell-icon-button:disabled { opacity: 0.5; cursor: not-allowed; }
77
+ </style>
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Icon-only button used by the layout-editing chrome: a labelled `<button>`
3
+ * with the label as tooltip, `aria-pressed` for toggles, and a 2rem hit area
4
+ * (the same visual language as a nav row's `action`).
5
+ */
6
+ import type { Snippet } from 'svelte';
7
+ import type { HTMLButtonAttributes } from 'svelte/elements';
8
+ import { type ShellIconName } from './shell-icons.js';
9
+ interface Props extends Omit<HTMLButtonAttributes, 'aria-label' | 'title' | 'children'> {
10
+ /** Accessible name and tooltip. */
11
+ label: string;
12
+ /** Which filled icon to draw (omit when passing `children`). */
13
+ icon?: ShellIconName;
14
+ /** Custom icon content, drawn instead of `icon` (decorative). */
15
+ children?: Snippet;
16
+ /** Toggle state; omit for a plain action button. */
17
+ pressed?: boolean;
18
+ /** Tooltip text when it should differ from the label (default: the label). */
19
+ tooltip?: string;
20
+ /** Icon edge length in pixels (default 18). */
21
+ size?: number;
22
+ }
23
+ declare const ShellIconButton: import("svelte").Component<Props, {}, "">;
24
+ type ShellIconButton = ReturnType<typeof ShellIconButton>;
25
+ export default ShellIconButton;
26
+ //# sourceMappingURL=ShellIconButton.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellIconButton.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ShellIconButton.svelte.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGxE,UAAU,KACR,SAAQ,IAAI,CAAC,oBAAoB,EAAE,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;IACvE,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoCD,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
- import { Switch } from '@happyvertical/smrt-ui/forms';
2
+ import { Input, Switch } from '@happyvertical/smrt-ui/forms';
3
3
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
4
4
  import { Button } from '@happyvertical/smrt-ui/ui';
5
- import { type Component, untrack } from 'svelte';
5
+ import { type Component, tick, untrack } from 'svelte';
6
6
  import { M } from '../../../i18n/strings.workspace.js';
7
7
  import Sortable from '../../sortable/Sortable.svelte';
8
8
  import type {
@@ -13,6 +13,7 @@ import type {
13
13
  } from '../../sortable/types.js';
14
14
  import { useShellLayout } from './layout-context.js';
15
15
  import type { ShellLayoutController } from './layout-controller.svelte.js';
16
+ import ShellIconButton from './ShellIconButton.svelte';
16
17
  import TenantNav from './TenantNav.svelte';
17
18
 
18
19
  interface Props {
@@ -38,6 +39,9 @@ const applied = $derived(layout.applied);
38
39
  interface NavContainer extends SortableContainer {
39
40
  hidden: boolean;
40
41
  root: boolean;
42
+ custom: boolean;
43
+ titleVisible: boolean;
44
+ count: number;
41
45
  }
42
46
 
43
47
  const containers = $derived<NavContainer[]>(
@@ -47,6 +51,9 @@ const containers = $derived<NavContainer[]>(
47
51
  fixed: section.group === null,
48
52
  root: section.group === null,
49
53
  hidden: section.hidden,
54
+ custom: section.custom,
55
+ titleVisible: section.titleVisible,
56
+ count: section.items.length,
50
57
  })),
51
58
  );
52
59
  const items = $derived<SortableItem[]>(
@@ -54,7 +61,7 @@ const items = $derived<SortableItem[]>(
54
61
  section.items.map((entry) => ({
55
62
  id: entry.id,
56
63
  containerId: section.id,
57
- label: entry.item.label,
64
+ label: entry.label,
58
65
  })),
59
66
  ),
60
67
  );
@@ -64,6 +71,40 @@ function setShown(id: string, shown: boolean): void {
64
71
  else layout.hide(id);
65
72
  }
66
73
 
74
+ let rootEl: HTMLElement | undefined = $state();
75
+
76
+ function rename(id: string, event: Event): void {
77
+ const input = event.currentTarget as HTMLInputElement;
78
+ layout.renameSection(id, input.value);
79
+ // Blank or rejected input snaps back to the section's real name.
80
+ input.value = containers.find((entry) => entry.id === id)?.label ?? '';
81
+ }
82
+
83
+ async function createSection(): Promise<void> {
84
+ const id = layout.createSection(
85
+ t(M['ui.shell_layout_editor.new_section_label']),
86
+ );
87
+ if (!id) return;
88
+ await tick();
89
+ const input = rootEl?.querySelector<HTMLInputElement>(
90
+ `input[data-section-name="${CSS.escape(id)}"]`,
91
+ );
92
+ input?.focus();
93
+ input?.select();
94
+ }
95
+
96
+ function deleteSection(id: string, label: string, count: number): void {
97
+ if (
98
+ count > 0 &&
99
+ !globalThis.confirm?.(
100
+ t(M['ui.shell_layout_editor.delete_confirm'], { label }),
101
+ )
102
+ ) {
103
+ return;
104
+ }
105
+ layout.deleteSection(id);
106
+ }
107
+
67
108
  function onmove(move: SortableItemMove<SortableItem, NavContainer>): void {
68
109
  layout.moveItem(move.item.id, move.target.containerId, move.target.index);
69
110
  }
@@ -73,7 +114,7 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
73
114
  }
74
115
  </script>
75
116
 
76
- <section class="smrt-shell-layout-editor" aria-labelledby={headingId}>
117
+ <section class="smrt-shell-layout-editor" aria-labelledby={headingId} bind:this={rootEl}>
77
118
  <header>
78
119
  <div>
79
120
  <h2 id={headingId}>{t(M['ui.shell_layout_editor.heading'])}</h2>
@@ -122,7 +163,12 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
122
163
 
123
164
  <div class="smrt-shell-layout-editor__body">
124
165
  <div class="smrt-shell-layout-editor__nav">
125
- <h3>{t(M['ui.shell_layout_editor.navigation'])}</h3>
166
+ <div class="smrt-shell-layout-editor__nav-head">
167
+ <h3>{t(M['ui.shell_layout_editor.navigation'])}</h3>
168
+ <Button variant="secondary" size="sm" onclick={createSection}>
169
+ {t(M['ui.shell_layout_editor.new_section'])}
170
+ </Button>
171
+ </div>
126
172
  <Sortable
127
173
  {containers}
128
174
  {items}
@@ -133,24 +179,46 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
133
179
  >
134
180
  {#snippet containerHeader({ container })}
135
181
  {@const entry = containers.find((candidate) => candidate.id === container.id)}
136
- <strong class:smrt-shell-layout-editor__muted={entry?.hidden}>{container.label}</strong>
137
- {#if !entry?.root}
138
- <Switch
182
+ {#if entry?.root}
183
+ <strong>{container.label}</strong>
184
+ {:else}
185
+ <Input
186
+ class="smrt-shell-layout-editor__name"
139
187
  interaction={false}
140
- checked={!entry?.hidden}
141
- aria-label={t(M['ui.shell_layout_editor.show_entry'], { label: container.label })}
142
- onchange={(event) => setShown(container.id, event.currentTarget.checked)}
188
+ data-section-name={container.id}
189
+ aria-label={t(M['ui.shell_layout_editor.section_name'], { label: container.label })}
190
+ value={container.label}
191
+ onchange={(event) => rename(container.id, event)}
192
+ />
193
+ <ShellIconButton
194
+ icon={entry?.hidden ? 'eyeOff' : 'eye'}
195
+ pressed={!entry?.hidden}
196
+ label={t(M['ui.shell_layout_editor.show_entry'], { label: container.label })}
197
+ onclick={() => setShown(container.id, !!entry?.hidden)}
143
198
  />
199
+ <ShellIconButton
200
+ icon={entry?.titleVisible === false ? 'headingOff' : 'heading'}
201
+ pressed={entry?.titleVisible ?? true}
202
+ label={t(M['ui.shell_layout_editor.show_title_for'], { label: container.label })}
203
+ onclick={() => layout.setSectionTitleVisible(container.id, !(entry?.titleVisible ?? true))}
204
+ />
205
+ {#if entry?.custom}
206
+ <ShellIconButton
207
+ icon="trash"
208
+ label={t(M['ui.shell_layout_editor.delete_section'], { label: container.label })}
209
+ onclick={() => deleteSection(container.id, container.label, entry.count)}
210
+ />
211
+ {/if}
144
212
  {/if}
145
213
  {/snippet}
146
214
  {#snippet item({ item: entry, container })}
147
215
  {@const hidden = layout.isHidden(entry.id)}
148
216
  <span class="smrt-shell-layout-editor__label" class:smrt-shell-layout-editor__muted={hidden || layout.isHidden(container.id)}>{entry.label}</span>
149
- <Switch
150
- interaction={false}
151
- checked={!hidden}
152
- aria-label={t(M['ui.shell_layout_editor.show_entry'], { label: entry.label })}
153
- onchange={(event) => setShown(entry.id, event.currentTarget.checked)}
217
+ <ShellIconButton
218
+ icon={hidden ? 'eyeOff' : 'eye'}
219
+ pressed={!hidden}
220
+ label={t(M['ui.shell_layout_editor.show_entry'], { label: entry.label })}
221
+ onclick={() => setShown(entry.id, hidden)}
154
222
  />
155
223
  {/snippet}
156
224
  </Sortable>
@@ -187,8 +255,12 @@ function oncontainermove(move: SortableContainerMove<NavContainer>): void {
187
255
  .smrt-shell-layout-editor__panels legend { padding-inline: var(--smrt-spacing-1); font: var(--smrt-typography-title-small-font); }
188
256
  .smrt-shell-layout-editor__row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--smrt-spacing-4); }
189
257
  .smrt-shell-layout-editor__body { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: var(--smrt-spacing-4); align-items: start; }
258
+ .smrt-shell-layout-editor__nav-head { display: flex; align-items: center; justify-content: space-between; gap: var(--smrt-spacing-3); }
259
+ .smrt-shell-layout-editor__nav-head h3 { margin-block-end: 0; }
260
+ :global(.smrt-shell-layout-editor__name) { flex: 1 1 8rem; min-inline-size: 0; }
190
261
  .smrt-shell-layout-editor__label { flex: 1 1 auto; min-inline-size: 0; }
191
262
  .smrt-shell-layout-editor__preview-frame { padding: var(--smrt-spacing-3); border: 1px dashed var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-md); background: var(--smrt-color-surface-container-low, var(--smrt-color-surface)); }
263
+ /* Label on its own line (never broken mid-word); the select and Reset share the next line. */
192
264
  @media (max-width: 48rem) {
193
265
  .smrt-shell-layout-editor header { flex-direction: column; }
194
266
  .smrt-shell-layout-editor__body { grid-template-columns: minmax(0, 1fr); }
@@ -1 +1 @@
1
- {"version":3,"file":"ShellLayoutEditor.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ShellLayoutEditor.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,QAAQ,CAAC;AAUjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAI3E,UAAU,KAAK;IACb,oEAAoE;IACpE,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,aAAa,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAiID,QAAA,MAAM,iBAAiB,0BAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"ShellLayoutEditor.svelte.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/ShellLayoutEditor.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,QAAQ,CAAC;AAUvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAK3E,UAAU,KAAK;IACb,oEAAoE;IACpE,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,aAAa,CAAC,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAqLD,QAAA,MAAM,iBAAiB,0BAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}