@selvajs/ui 6.5.1-beta.0 → 6.6.0-beta.11

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 (444) hide show
  1. package/dist/components/ConfirmDialog.svelte +2 -10
  2. package/dist/components/ErrorScreen.svelte +21 -27
  3. package/dist/components/compute/AppLayout.svelte +286 -116
  4. package/dist/components/compute/AppLayout.svelte.d.ts +22 -0
  5. package/dist/components/compute/ComputeApp.svelte +45 -24
  6. package/dist/components/compute/ComputeApp.svelte.d.ts +19 -2
  7. package/dist/components/compute/ComputeMessagesDialog.svelte +47 -83
  8. package/dist/components/compute/ParameterPresetManager.svelte +37 -130
  9. package/dist/components/compute/ParameterPresetManager.svelte.d.ts +4 -5
  10. package/dist/components/compute/SolveMessages.svelte +131 -77
  11. package/dist/components/compute/SolveMessages.svelte.d.ts +7 -12
  12. package/dist/components/layout/AppShell.svelte +10 -6
  13. package/dist/components/layout/PageFooter.svelte +23 -11
  14. package/dist/components/layout/PageHeader.svelte +11 -7
  15. package/dist/components/layout/Pagination.svelte +2 -4
  16. package/dist/components/layout/SectionHeader.svelte +4 -2
  17. package/dist/components/layout/SideNav.svelte +56 -7
  18. package/dist/components/preview/ChartOutput.svelte +35 -25
  19. package/dist/components/preview/Group.svelte +92 -103
  20. package/dist/components/preview/Group.svelte.d.ts +1 -1
  21. package/dist/components/preview/HelpButton.svelte +36 -0
  22. package/dist/components/preview/HelpButton.svelte.d.ts +8 -0
  23. package/dist/components/preview/ImageOutput.svelte +430 -71
  24. package/dist/components/preview/InputControl.svelte +163 -90
  25. package/dist/components/preview/InputControl.svelte.d.ts +5 -1
  26. package/dist/components/preview/OutputDisplay.svelte +28 -33
  27. package/dist/components/preview/TabBar.svelte +106 -22
  28. package/dist/components/preview/TabBar.svelte.d.ts +1 -0
  29. package/dist/components/preview/TabContent.svelte +63 -57
  30. package/dist/components/preview/TabContent.svelte.d.ts +5 -1
  31. package/dist/components/preview/TabLayout.svelte +27 -5
  32. package/dist/components/preview/TabLayout.svelte.d.ts +5 -0
  33. package/dist/components/preview/inputs/CheckboxInput.svelte +7 -7
  34. package/dist/components/preview/inputs/CheckboxInput.svelte.d.ts +3 -0
  35. package/dist/components/preview/inputs/ChecklistInput.svelte +7 -2
  36. package/dist/components/preview/inputs/ChecklistInput.svelte.d.ts +2 -1
  37. package/dist/components/preview/inputs/ColorInput.svelte +4 -2
  38. package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
  39. package/dist/components/preview/inputs/DropdownInput.svelte +19 -4
  40. package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +2 -1
  41. package/dist/components/preview/inputs/FileInput.svelte +112 -108
  42. package/dist/components/preview/inputs/GeometryInput.svelte +128 -0
  43. package/dist/components/preview/inputs/GeometryInput.svelte.d.ts +21 -0
  44. package/dist/components/preview/inputs/NumberInput.svelte +123 -61
  45. package/dist/components/preview/inputs/NumberInput.svelte.d.ts +2 -0
  46. package/dist/components/preview/inputs/OptionGlyph.svelte +29 -0
  47. package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +8 -0
  48. package/dist/components/preview/inputs/SegmentedInput.svelte +44 -0
  49. package/dist/components/preview/inputs/SegmentedInput.svelte.d.ts +12 -0
  50. package/dist/components/preview/inputs/TextInput.svelte +8 -4
  51. package/dist/components/preview/inputs/TileInput.svelte +80 -0
  52. package/dist/components/preview/inputs/TileInput.svelte.d.ts +12 -0
  53. package/dist/components/preview/inputs/index.d.ts +3 -0
  54. package/dist/components/preview/inputs/index.js +3 -0
  55. package/dist/components/primitives/CalculateButton.svelte +56 -24
  56. package/dist/components/primitives/CalculateButton.svelte.d.ts +3 -0
  57. package/dist/components/primitives/Callout.svelte +11 -18
  58. package/dist/components/primitives/DataTable.svelte +38 -5
  59. package/dist/components/primitives/DataTable.svelte.d.ts +2 -0
  60. package/dist/components/primitives/FilterableDropdown.svelte +42 -129
  61. package/dist/components/primitives/FilterableDropdown.svelte.d.ts +1 -1
  62. package/dist/components/primitives/IssueList.svelte +56 -0
  63. package/dist/components/primitives/IssueList.svelte.d.ts +20 -0
  64. package/dist/components/primitives/SeverityIcon.svelte +15 -0
  65. package/dist/components/primitives/SeverityIcon.svelte.d.ts +8 -0
  66. package/dist/components/primitives/SolvingIndicator.svelte +43 -42
  67. package/dist/components/primitives/SolvingIndicator.svelte.d.ts +6 -0
  68. package/dist/components/primitives/StateDisplay.svelte +19 -79
  69. package/dist/components/primitives/ViewToggle.svelte +18 -33
  70. package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte +9 -3
  71. package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte.d.ts +6 -1
  72. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  73. package/dist/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
  74. package/dist/components/primitives/badge/badge.svelte +2 -2
  75. package/dist/components/primitives/badge/badge.svelte.d.ts +4 -4
  76. package/dist/components/primitives/button/button.svelte +6 -2
  77. package/dist/components/primitives/button/button.svelte.d.ts +10 -4
  78. package/dist/components/primitives/card/card-header.svelte +1 -1
  79. package/dist/components/primitives/card/card.svelte +21 -5
  80. package/dist/components/primitives/card/card.svelte.d.ts +25 -1
  81. package/dist/components/primitives/card/index.d.ts +1 -2
  82. package/dist/components/primitives/card/index.js +2 -3
  83. package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
  84. package/dist/components/primitives/command/command-dialog.svelte +42 -0
  85. package/dist/components/primitives/command/command-dialog.svelte.d.ts +14 -0
  86. package/dist/components/primitives/command/command-empty.svelte +17 -0
  87. package/dist/components/primitives/command/command-empty.svelte.d.ts +4 -0
  88. package/dist/components/primitives/command/command-group.svelte +33 -0
  89. package/dist/components/primitives/command/command-group.svelte.d.ts +7 -0
  90. package/dist/components/primitives/command/command-input.svelte +36 -0
  91. package/dist/components/primitives/command/command-input.svelte.d.ts +4 -0
  92. package/dist/components/primitives/command/command-item.svelte +28 -0
  93. package/dist/components/primitives/command/command-item.svelte.d.ts +4 -0
  94. package/dist/components/primitives/command/command-link-item.svelte +21 -0
  95. package/dist/components/primitives/command/command-link-item.svelte.d.ts +4 -0
  96. package/dist/components/primitives/command/command-list.svelte +20 -0
  97. package/dist/components/primitives/command/command-list.svelte.d.ts +4 -0
  98. package/dist/components/primitives/command/command-loading.svelte +7 -0
  99. package/dist/components/primitives/command/command-loading.svelte.d.ts +4 -0
  100. package/dist/components/primitives/command/command-separator.svelte +17 -0
  101. package/dist/components/primitives/command/command-separator.svelte.d.ts +4 -0
  102. package/dist/components/primitives/command/command-shortcut.svelte +23 -0
  103. package/dist/components/primitives/command/command-shortcut.svelte.d.ts +5 -0
  104. package/dist/components/primitives/command/command.svelte +28 -0
  105. package/dist/components/primitives/command/command.svelte.d.ts +8 -0
  106. package/dist/components/primitives/command/index.d.ts +12 -0
  107. package/dist/components/primitives/command/index.js +14 -0
  108. package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
  109. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  110. package/dist/components/primitives/dialog/dialog-content.svelte +11 -3
  111. package/dist/components/primitives/dialog/dialog-content.svelte.d.ts +2 -0
  112. package/dist/components/primitives/dialog/dialog-overlay.svelte +1 -1
  113. package/dist/components/primitives/dialog/dialog-title.svelte +6 -2
  114. package/dist/components/primitives/dialog/dialog-title.svelte.d.ts +5 -1
  115. package/dist/components/primitives/drawer/Drawer.svelte +2 -2
  116. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  117. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +4 -0
  118. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  119. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
  120. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +31 -0
  121. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +10 -0
  122. package/dist/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  123. package/dist/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +8 -0
  124. package/dist/components/primitives/dropdown-menu/dropdown-menu-group.svelte +7 -0
  125. package/dist/components/primitives/dropdown-menu/dropdown-menu-group.svelte.d.ts +4 -0
  126. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +27 -0
  127. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +8 -0
  128. package/dist/components/primitives/dropdown-menu/dropdown-menu-label.svelte +24 -0
  129. package/dist/components/primitives/dropdown-menu/dropdown-menu-label.svelte.d.ts +8 -0
  130. package/dist/components/primitives/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  131. package/dist/components/primitives/dropdown-menu/dropdown-menu-portal.svelte.d.ts +3 -0
  132. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  133. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +4 -0
  134. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  135. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +4 -0
  136. package/dist/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  137. package/dist/components/primitives/dropdown-menu/dropdown-menu-separator.svelte.d.ts +4 -0
  138. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
  139. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +5 -0
  140. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  141. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +10 -0
  142. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  143. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +7 -0
  144. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  145. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub.svelte.d.ts +3 -0
  146. package/dist/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  147. package/dist/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +4 -0
  148. package/dist/components/primitives/dropdown-menu/dropdown-menu.svelte +7 -0
  149. package/dist/components/primitives/dropdown-menu/dropdown-menu.svelte.d.ts +3 -0
  150. package/dist/components/primitives/dropdown-menu/index.d.ts +18 -0
  151. package/dist/components/primitives/dropdown-menu/index.js +18 -0
  152. package/dist/components/primitives/{alert/alert-description.svelte → empty/empty-content.svelte} +3 -3
  153. package/dist/components/primitives/empty/empty-content.svelte.d.ts +5 -0
  154. package/dist/components/primitives/empty/empty-description.svelte +23 -0
  155. package/dist/components/primitives/{alert/alert-description.svelte.d.ts → empty/empty-description.svelte.d.ts} +4 -4
  156. package/dist/components/primitives/{alert/alert-title.svelte → empty/empty-header.svelte} +3 -3
  157. package/dist/components/primitives/empty/empty-header.svelte.d.ts +5 -0
  158. package/dist/components/primitives/empty/empty-media.svelte +41 -0
  159. package/dist/components/primitives/empty/empty-media.svelte.d.ts +26 -0
  160. package/dist/components/primitives/{card/card-action.svelte → empty/empty-title.svelte} +2 -2
  161. package/dist/components/primitives/{card/card-action.svelte.d.ts → empty/empty-title.svelte.d.ts} +3 -3
  162. package/dist/components/primitives/empty/empty.svelte +23 -0
  163. package/dist/components/primitives/empty/empty.svelte.d.ts +5 -0
  164. package/dist/components/primitives/empty/index.d.ts +7 -0
  165. package/dist/components/primitives/empty/index.js +9 -0
  166. package/dist/components/primitives/index.d.ts +10 -1
  167. package/dist/components/primitives/index.js +10 -1
  168. package/dist/components/primitives/input/input.svelte +4 -4
  169. package/dist/components/primitives/input-group/index.d.ts +7 -0
  170. package/dist/components/primitives/input-group/index.js +9 -0
  171. package/dist/components/primitives/input-group/input-group-addon.svelte +53 -0
  172. package/dist/components/primitives/input-group/input-group-addon.svelte.d.ts +32 -0
  173. package/dist/components/primitives/input-group/input-group-button.svelte +49 -0
  174. package/dist/components/primitives/input-group/input-group-button.svelte.d.ts +32 -0
  175. package/dist/components/primitives/input-group/input-group-input.svelte +25 -0
  176. package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +11 -0
  177. package/dist/components/primitives/input-group/input-group-text.svelte +22 -0
  178. package/dist/components/primitives/input-group/input-group-text.svelte.d.ts +5 -0
  179. package/dist/components/primitives/input-group/input-group-textarea.svelte +23 -0
  180. package/dist/components/primitives/input-group/input-group-textarea.svelte.d.ts +3 -0
  181. package/dist/components/primitives/input-group/input-group.svelte +24 -0
  182. package/dist/components/primitives/{alert/alert-title.svelte.d.ts → input-group/input-group.svelte.d.ts} +4 -4
  183. package/dist/components/primitives/mode-toggle/mode-toggle.svelte +6 -7
  184. package/dist/components/primitives/popover/index.d.ts +9 -0
  185. package/dist/components/primitives/popover/index.js +11 -0
  186. package/dist/components/primitives/popover/popover-close.svelte +7 -0
  187. package/dist/components/primitives/popover/popover-close.svelte.d.ts +4 -0
  188. package/dist/components/primitives/popover/popover-content.svelte +31 -0
  189. package/dist/components/primitives/popover/popover-content.svelte.d.ts +10 -0
  190. package/dist/components/primitives/popover/popover-description.svelte +20 -0
  191. package/dist/components/primitives/popover/popover-description.svelte.d.ts +5 -0
  192. package/dist/components/primitives/popover/popover-header.svelte +20 -0
  193. package/dist/components/primitives/popover/popover-header.svelte.d.ts +5 -0
  194. package/dist/components/primitives/popover/popover-portal.svelte +7 -0
  195. package/dist/components/primitives/popover/popover-portal.svelte.d.ts +3 -0
  196. package/dist/components/primitives/popover/popover-title.svelte +15 -0
  197. package/dist/components/primitives/popover/popover-title.svelte.d.ts +5 -0
  198. package/dist/components/primitives/popover/popover-trigger.svelte +17 -0
  199. package/dist/components/primitives/popover/popover-trigger.svelte.d.ts +4 -0
  200. package/dist/components/primitives/popover/popover.svelte +7 -0
  201. package/dist/components/primitives/popover/popover.svelte.d.ts +3 -0
  202. package/dist/components/primitives/resizable/resizable-handle.svelte +6 -2
  203. package/dist/components/primitives/resizable/resizable-handle.svelte.d.ts +2 -0
  204. package/dist/components/primitives/resizable/resizable-pane-group.svelte +1 -4
  205. package/dist/components/primitives/scroll-area/scroll-area.svelte +1 -1
  206. package/dist/components/primitives/search/search.svelte +3 -3
  207. package/dist/components/primitives/select/select-content.svelte +1 -1
  208. package/dist/components/primitives/select/select-trigger.svelte +1 -1
  209. package/dist/components/primitives/severity.d.ts +7 -0
  210. package/dist/components/primitives/severity.js +19 -0
  211. package/dist/components/primitives/slider/slider.svelte +8 -3
  212. package/dist/components/primitives/slider/slider.svelte.d.ts +5 -1
  213. package/dist/components/primitives/sonner/sonner.svelte +1 -1
  214. package/dist/components/primitives/spinner/index.d.ts +1 -0
  215. package/dist/components/primitives/spinner/index.js +1 -0
  216. package/dist/components/primitives/spinner/spinner.svelte +29 -0
  217. package/dist/components/primitives/spinner/spinner.svelte.d.ts +4 -0
  218. package/dist/components/primitives/switch/switch.svelte +2 -2
  219. package/dist/components/primitives/tabs/tabs-list.svelte +27 -5
  220. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +22 -1
  221. package/dist/components/primitives/tabs/tabs-trigger.svelte +23 -5
  222. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +22 -1
  223. package/dist/components/primitives/tabs/tabs.svelte +6 -2
  224. package/dist/components/primitives/tabs/tabs.svelte.d.ts +5 -1
  225. package/dist/components/primitives/textarea/textarea.svelte +1 -1
  226. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +1 -1
  227. package/dist/components/primitives/toggle/index.d.ts +3 -0
  228. package/dist/components/primitives/toggle/index.js +5 -0
  229. package/dist/components/primitives/toggle/toggle.svelte +54 -0
  230. package/dist/components/primitives/toggle/toggle.svelte.d.ts +46 -0
  231. package/dist/components/primitives/toggle-group/index.d.ts +3 -0
  232. package/dist/components/primitives/toggle-group/index.js +5 -0
  233. package/dist/components/primitives/toggle-group/toggle-group-item.svelte +35 -0
  234. package/dist/components/primitives/toggle-group/toggle-group-item.svelte.d.ts +6 -0
  235. package/dist/components/primitives/toggle-group/toggle-group.svelte +75 -0
  236. package/dist/components/primitives/toggle-group/toggle-group.svelte.d.ts +17 -0
  237. package/dist/components/viewer/MeshMetadataPanel.svelte +119 -0
  238. package/dist/components/viewer/MeshMetadataPanel.svelte.d.ts +9 -0
  239. package/dist/components/viewer/SceneManager.svelte +14 -5
  240. package/dist/components/viewer/Viewer.svelte +243 -221
  241. package/dist/components/viewer/Viewer.svelte.d.ts +3 -0
  242. package/dist/compute/run-panel-action.d.ts +8 -0
  243. package/dist/compute/run-panel-action.js +12 -0
  244. package/dist/compute/solving.svelte.d.ts +11 -7
  245. package/dist/compute/solving.svelte.js +64 -45
  246. package/dist/compute/useSolveSession.svelte.js +3 -0
  247. package/dist/constants.d.ts +6 -8
  248. package/dist/constants.js +7 -9
  249. package/dist/contexts/hostContext.svelte.d.ts +39 -0
  250. package/dist/contexts/hostContext.svelte.js +9 -0
  251. package/dist/i18n/localeContext.svelte.d.ts +10 -3
  252. package/dist/i18n/localeContext.svelte.js +27 -5
  253. package/dist/i18n/messages.d.ts +150 -2
  254. package/dist/i18n/messages.js +261 -11
  255. package/dist/index.d.ts +4 -1
  256. package/dist/index.js +3 -0
  257. package/dist/public.d.ts +1 -1
  258. package/dist/schema/host-support.d.ts +29 -0
  259. package/dist/schema/host-support.js +97 -0
  260. package/dist/schema/option-display.d.ts +12 -0
  261. package/dist/schema/option-display.js +29 -0
  262. package/dist/schema/param-exporter.d.ts +4 -1
  263. package/dist/schema/param-exporter.js +10 -6
  264. package/dist/schema/visibility-rules.js +21 -0
  265. package/dist/styles/base.css +80 -10
  266. package/dist/types/actionButton.d.ts +17 -3
  267. package/dist/types/presetLabels.d.ts +3 -2
  268. package/dist/types/presetLabels.js +9 -8
  269. package/dist/utils/file-download.js +10 -22
  270. package/dist/utils/host-files.d.ts +12 -0
  271. package/dist/utils/host-files.js +46 -0
  272. package/dist/utils/loadScript.d.ts +2 -0
  273. package/dist/utils/loadScript.js +2 -0
  274. package/dist/utils/webp-to-png.d.ts +10 -0
  275. package/dist/utils/webp-to-png.js +41 -0
  276. package/package.json +15 -15
  277. package/src/lib/components/ConfirmDialog.svelte +2 -10
  278. package/src/lib/components/ErrorScreen.svelte +21 -27
  279. package/src/lib/components/compute/AppLayout.svelte +286 -116
  280. package/src/lib/components/compute/ComputeApp.svelte +45 -24
  281. package/src/lib/components/compute/ComputeMessagesDialog.svelte +47 -83
  282. package/src/lib/components/compute/ParameterPresetManager.svelte +37 -130
  283. package/src/lib/components/compute/SolveMessages.svelte +131 -77
  284. package/src/lib/components/layout/AppShell.svelte +10 -6
  285. package/src/lib/components/layout/PageFooter.svelte +23 -11
  286. package/src/lib/components/layout/PageHeader.svelte +11 -7
  287. package/src/lib/components/layout/Pagination.svelte +2 -4
  288. package/src/lib/components/layout/SectionHeader.svelte +4 -2
  289. package/src/lib/components/layout/SideNav.svelte +56 -7
  290. package/src/lib/components/preview/ChartOutput.svelte +35 -25
  291. package/src/lib/components/preview/Group.svelte +92 -103
  292. package/src/lib/components/preview/HelpButton.svelte +36 -0
  293. package/src/lib/components/preview/ImageOutput.svelte +430 -71
  294. package/src/lib/components/preview/InputControl.svelte +163 -90
  295. package/src/lib/components/preview/OutputDisplay.svelte +28 -33
  296. package/src/lib/components/preview/TabBar.svelte +106 -22
  297. package/src/lib/components/preview/TabContent.svelte +63 -57
  298. package/src/lib/components/preview/TabLayout.svelte +27 -5
  299. package/src/lib/components/preview/inputs/CheckboxInput.svelte +7 -7
  300. package/src/lib/components/preview/inputs/ChecklistInput.svelte +7 -2
  301. package/src/lib/components/preview/inputs/ColorInput.svelte +4 -2
  302. package/src/lib/components/preview/inputs/DropdownInput.svelte +19 -4
  303. package/src/lib/components/preview/inputs/FileInput.svelte +112 -108
  304. package/src/lib/components/preview/inputs/GeometryInput.svelte +128 -0
  305. package/src/lib/components/preview/inputs/NumberInput.svelte +123 -61
  306. package/src/lib/components/preview/inputs/OptionGlyph.svelte +29 -0
  307. package/src/lib/components/preview/inputs/SegmentedInput.svelte +44 -0
  308. package/src/lib/components/preview/inputs/TextInput.svelte +8 -4
  309. package/src/lib/components/preview/inputs/TileInput.svelte +80 -0
  310. package/src/lib/components/preview/inputs/index.ts +3 -0
  311. package/src/lib/components/primitives/CalculateButton.svelte +56 -24
  312. package/src/lib/components/primitives/Callout.svelte +11 -18
  313. package/src/lib/components/primitives/DataTable.svelte +38 -5
  314. package/src/lib/components/primitives/FilterableDropdown.svelte +42 -129
  315. package/src/lib/components/primitives/IssueList.svelte +56 -0
  316. package/src/lib/components/primitives/SeverityIcon.svelte +15 -0
  317. package/src/lib/components/primitives/SolvingIndicator.svelte +43 -42
  318. package/src/lib/components/primitives/StateDisplay.svelte +19 -79
  319. package/src/lib/components/primitives/ViewToggle.svelte +18 -33
  320. package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +9 -3
  321. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  322. package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
  323. package/src/lib/components/primitives/badge/badge.svelte +2 -2
  324. package/src/lib/components/primitives/button/button.svelte +6 -2
  325. package/src/lib/components/primitives/card/card-header.svelte +1 -1
  326. package/src/lib/components/primitives/card/card.svelte +21 -5
  327. package/src/lib/components/primitives/card/index.ts +1 -4
  328. package/src/lib/components/primitives/checkbox/checkbox.svelte +1 -1
  329. package/src/lib/components/primitives/command/command-dialog.svelte +42 -0
  330. package/src/lib/components/primitives/command/command-empty.svelte +17 -0
  331. package/src/lib/components/primitives/command/command-group.svelte +33 -0
  332. package/src/lib/components/primitives/command/command-input.svelte +36 -0
  333. package/src/lib/components/primitives/command/command-item.svelte +28 -0
  334. package/src/lib/components/primitives/command/command-link-item.svelte +21 -0
  335. package/src/lib/components/primitives/command/command-list.svelte +20 -0
  336. package/src/lib/components/primitives/command/command-loading.svelte +7 -0
  337. package/src/lib/components/primitives/command/command-separator.svelte +17 -0
  338. package/src/lib/components/primitives/command/command-shortcut.svelte +23 -0
  339. package/src/lib/components/primitives/command/command.svelte +28 -0
  340. package/src/lib/components/primitives/command/index.ts +37 -0
  341. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +1 -1
  342. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  343. package/src/lib/components/primitives/dialog/dialog-content.svelte +11 -3
  344. package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
  345. package/src/lib/components/primitives/dialog/dialog-title.svelte +6 -2
  346. package/src/lib/components/primitives/drawer/Drawer.svelte +2 -2
  347. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  348. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  349. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +31 -0
  350. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  351. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group.svelte +7 -0
  352. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +27 -0
  353. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +24 -0
  354. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  355. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  356. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  357. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  358. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
  359. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  360. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  361. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  362. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  363. package/src/lib/components/primitives/dropdown-menu/dropdown-menu.svelte +7 -0
  364. package/src/lib/components/primitives/dropdown-menu/index.ts +54 -0
  365. package/src/lib/components/primitives/{alert/alert-description.svelte → empty/empty-content.svelte} +3 -3
  366. package/src/lib/components/primitives/empty/empty-description.svelte +23 -0
  367. package/src/lib/components/primitives/{alert/alert-title.svelte → empty/empty-header.svelte} +3 -3
  368. package/src/lib/components/primitives/empty/empty-media.svelte +41 -0
  369. package/src/lib/components/primitives/{card/card-action.svelte → empty/empty-title.svelte} +2 -2
  370. package/src/lib/components/primitives/empty/empty.svelte +23 -0
  371. package/src/lib/components/primitives/empty/index.ts +22 -0
  372. package/src/lib/components/primitives/index.ts +10 -1
  373. package/src/lib/components/primitives/input/input.svelte +4 -4
  374. package/src/lib/components/primitives/input-group/index.ts +22 -0
  375. package/src/lib/components/primitives/input-group/input-group-addon.svelte +53 -0
  376. package/src/lib/components/primitives/input-group/input-group-button.svelte +49 -0
  377. package/src/lib/components/primitives/input-group/input-group-input.svelte +25 -0
  378. package/src/lib/components/primitives/input-group/input-group-text.svelte +22 -0
  379. package/src/lib/components/primitives/input-group/input-group-textarea.svelte +23 -0
  380. package/src/lib/components/primitives/input-group/input-group.svelte +24 -0
  381. package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +6 -7
  382. package/src/lib/components/primitives/popover/index.ts +28 -0
  383. package/src/lib/components/primitives/popover/popover-close.svelte +7 -0
  384. package/src/lib/components/primitives/popover/popover-content.svelte +31 -0
  385. package/src/lib/components/primitives/popover/popover-description.svelte +20 -0
  386. package/src/lib/components/primitives/popover/popover-header.svelte +20 -0
  387. package/src/lib/components/primitives/popover/popover-portal.svelte +7 -0
  388. package/src/lib/components/primitives/popover/popover-title.svelte +15 -0
  389. package/src/lib/components/primitives/popover/popover-trigger.svelte +17 -0
  390. package/src/lib/components/primitives/popover/popover.svelte +7 -0
  391. package/src/lib/components/primitives/resizable/resizable-handle.svelte +6 -2
  392. package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -4
  393. package/src/lib/components/primitives/scroll-area/scroll-area.svelte +1 -1
  394. package/src/lib/components/primitives/search/search.svelte +3 -3
  395. package/src/lib/components/primitives/select/select-content.svelte +1 -1
  396. package/src/lib/components/primitives/select/select-trigger.svelte +1 -1
  397. package/src/lib/components/primitives/severity.ts +26 -0
  398. package/src/lib/components/primitives/slider/slider.svelte +8 -3
  399. package/src/lib/components/primitives/sonner/sonner.svelte +1 -1
  400. package/src/lib/components/primitives/spinner/index.ts +1 -0
  401. package/src/lib/components/primitives/spinner/spinner.svelte +29 -0
  402. package/src/lib/components/primitives/switch/switch.svelte +2 -2
  403. package/src/lib/components/primitives/tabs/tabs-list.svelte +27 -5
  404. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +23 -5
  405. package/src/lib/components/primitives/tabs/tabs.svelte +6 -2
  406. package/src/lib/components/primitives/textarea/textarea.svelte +1 -1
  407. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +1 -1
  408. package/src/lib/components/primitives/toggle/index.ts +13 -0
  409. package/src/lib/components/primitives/toggle/toggle.svelte +54 -0
  410. package/src/lib/components/primitives/toggle-group/index.ts +10 -0
  411. package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +35 -0
  412. package/src/lib/components/primitives/toggle-group/toggle-group.svelte +75 -0
  413. package/src/lib/components/viewer/MeshMetadataPanel.svelte +119 -0
  414. package/src/lib/components/viewer/SceneManager.svelte +14 -5
  415. package/src/lib/components/viewer/Viewer.svelte +243 -221
  416. package/src/lib/compute/run-panel-action.ts +16 -0
  417. package/src/lib/compute/solving.svelte.ts +66 -50
  418. package/src/lib/compute/useSolveSession.svelte.ts +3 -0
  419. package/src/lib/constants.ts +7 -9
  420. package/src/lib/contexts/hostContext.svelte.ts +51 -0
  421. package/src/lib/i18n/localeContext.svelte.ts +40 -5
  422. package/src/lib/i18n/messages.ts +453 -13
  423. package/src/lib/index.ts +21 -0
  424. package/src/lib/public.ts +1 -0
  425. package/src/lib/schema/host-support.ts +129 -0
  426. package/src/lib/schema/option-display.ts +44 -0
  427. package/src/lib/schema/param-exporter.ts +10 -7
  428. package/src/lib/schema/visibility-rules.ts +23 -0
  429. package/src/lib/styles/base.css +80 -10
  430. package/src/lib/types/actionButton.ts +16 -3
  431. package/src/lib/types/presetLabels.ts +13 -11
  432. package/src/lib/utils/file-download.ts +11 -21
  433. package/src/lib/utils/host-files.ts +61 -0
  434. package/src/lib/utils/loadScript.ts +3 -0
  435. package/src/lib/utils/webp-to-png.ts +48 -0
  436. package/dist/components/primitives/alert/alert.svelte +0 -44
  437. package/dist/components/primitives/alert/alert.svelte.d.ts +0 -26
  438. package/dist/components/primitives/alert/index.d.ts +0 -5
  439. package/dist/components/primitives/alert/index.js +0 -7
  440. package/dist/components/viewer/MeshMetadataDialog.svelte +0 -126
  441. package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +0 -10
  442. package/src/lib/components/primitives/alert/alert.svelte +0 -44
  443. package/src/lib/components/primitives/alert/index.ts +0 -14
  444. package/src/lib/components/viewer/MeshMetadataDialog.svelte +0 -126
@@ -13,6 +13,9 @@
13
13
  <script lang="ts">
14
14
  import type { Snippet } from 'svelte';
15
15
  import { page } from '$app/state';
16
+ import ChevronsUpDown from '@lucide/svelte/icons/chevrons-up-down';
17
+ import Check from '@lucide/svelte/icons/check';
18
+ import * as DropdownMenu from '../primitives/dropdown-menu/index.js';
16
19
 
17
20
  interface SideNavProps {
18
21
  items: SideNavItem[];
@@ -41,15 +44,19 @@
41
44
  if (item.match === 'prefix') return path.startsWith(item.href);
42
45
  return path === item.href;
43
46
  }
47
+
48
+ const activeItem = $derived(items.find(isActive));
44
49
  </script>
45
50
 
51
+ <!-- On a phone a 240px column would leave the page ~150px, so the nav collapses to one switcher
52
+ naming the current section; the header and footer drop out. -->
46
53
  <aside
47
- class={`w-60 flex h-full shrink-0 flex-col overflow-y-auto bg-background ${
48
- border ? 'border-r border-border' : ''
54
+ class={`sm:h-full sm:w-60 sm:overflow-y-auto sm:border-b-0 flex w-full shrink-0 flex-col border-b border-border bg-background ${
55
+ border ? 'sm:border-r' : ''
49
56
  } ${className}`}
50
57
  >
51
58
  {#if eyebrow}
52
- <div class="px-4 pt-5 pb-3">
59
+ <div class="px-4 pt-5 pb-3 sm:block hidden">
53
60
  <span class="text-xs font-medium tracking-wider text-muted-foreground uppercase">
54
61
  {eyebrow}
55
62
  </span>
@@ -57,17 +64,59 @@
57
64
  {/if}
58
65
 
59
66
  {#if header}
60
- <div class="px-3 pb-3">
67
+ <div class="px-3 pb-3 sm:block hidden">
61
68
  {@render header()}
62
69
  </div>
63
70
  {/if}
64
71
 
65
- <nav class="pb-4 pr-2 flex-1 space-y-px">
72
+ <div class="py-2 sm:hidden px-(--page-px)">
73
+ <DropdownMenu.Root>
74
+ <DropdownMenu.Trigger>
75
+ {#snippet child({ props })}
76
+ <button
77
+ {...props}
78
+ class="min-h-11 gap-3 px-3 text-sm font-medium flex w-full items-center rounded-md border border-border bg-card text-left"
79
+ >
80
+ {#if activeItem?.icon}
81
+ {@const Icon = activeItem.icon}
82
+ <Icon class="size-4 shrink-0 opacity-70" />
83
+ {/if}
84
+ <span class="min-w-0 flex-1 truncate">
85
+ {#if eyebrow}<span class="text-muted-foreground">{eyebrow} /</span>{/if}
86
+ {activeItem?.label ?? ''}
87
+ </span>
88
+ <ChevronsUpDown class="size-4 shrink-0 opacity-60" />
89
+ </button>
90
+ {/snippet}
91
+ </DropdownMenu.Trigger>
92
+ <DropdownMenu.Content sideOffset={4}>
93
+ {#each items as item (item.href)}
94
+ {@const active = isActive(item)}
95
+ {@const Icon = item.icon}
96
+ <DropdownMenu.Item class="min-h-11">
97
+ {#snippet child({ props })}
98
+ <a href={item.href} aria-current={active ? 'page' : undefined} {...props}>
99
+ {#if Icon}<Icon class="size-4 opacity-70" />{/if}
100
+ <span class="flex-1">{item.label}</span>
101
+ {#if item.badge !== undefined}
102
+ <span class="font-mono text-2xs tabular-nums opacity-60">{item.badge}</span>
103
+ {/if}
104
+ {#if active}<Check class="size-4" aria-hidden="true" />{/if}
105
+ </a>
106
+ {/snippet}
107
+ </DropdownMenu.Item>
108
+ {/each}
109
+ </DropdownMenu.Content>
110
+ </DropdownMenu.Root>
111
+ </div>
112
+
113
+ <nav class="pb-4 pr-2 sm:block hidden flex-1 space-y-px">
66
114
  {#each items as item (item.href)}
67
115
  {@const active = isActive(item)}
68
116
  {@const Icon = item.icon}
69
117
  <a
70
118
  href={item.href}
119
+ aria-current={active ? 'page' : undefined}
71
120
  class={`group gap-2 py-1.5 pr-2.5 relative flex w-full items-center text-left transition-colors ${
72
121
  active
73
122
  ? 'pl-4 rounded-r-md bg-accent text-accent-foreground'
@@ -82,14 +131,14 @@
82
131
  {/if}
83
132
  <span class="text-sm font-medium flex-1 truncate">{item.label}</span>
84
133
  {#if item.badge !== undefined}
85
- <span class="font-mono shrink-0 text-[11px] tabular-nums opacity-60">{item.badge}</span>
134
+ <span class="font-mono shrink-0 text-2xs tabular-nums opacity-60">{item.badge}</span>
86
135
  {/if}
87
136
  </a>
88
137
  {/each}
89
138
  </nav>
90
139
 
91
140
  {#if footer}
92
- <div class="px-3 py-3 border-t border-border/60">
141
+ <div class="px-3 py-3 sm:block hidden border-t border-border/60">
93
142
  {@render footer()}
94
143
  </div>
95
144
  {/if}
@@ -3,6 +3,8 @@
3
3
  import { onMount } from 'svelte';
4
4
  import { Loader, Maximize, Minimize } from '@lucide/svelte';
5
5
  import { loadScript } from '../../utils/loadScript';
6
+ import { getLocaleContext } from '../../i18n/localeContext.svelte';
7
+ import { formatMessage } from '../../i18n/messages';
6
8
 
7
9
  interface Props {
8
10
  item: OutputChartLayoutItem;
@@ -11,6 +13,9 @@
11
13
 
12
14
  let { item: _item, value }: Props = $props();
13
15
 
16
+ const locale = getLocaleContext();
17
+ const t = $derived(locale.messages);
18
+
14
19
  const MAP_TYPE_SET = new Set(['scattermap', 'scattermapbox', 'choropleth', 'scattergeo']);
15
20
 
16
21
  type PlotlyTrace = Record<string, unknown>;
@@ -40,20 +45,27 @@
40
45
  // @ts-expect-error — Plotly is loaded dynamically onto window
41
46
  if (window.Plotly) return window.Plotly;
42
47
 
43
- await loadScript('https://cdn.plot.ly/plotly-3.4.0.min.js', { crossOrigin: 'anonymous' });
48
+ // Pinned by hash: the plugin's web UI runs this on the origin that holds its bridge secret.
49
+ await loadScript('https://cdn.plot.ly/plotly-3.4.0.min.js', {
50
+ crossOrigin: 'anonymous',
51
+ integrity: 'sha384-pFOQ7loGBChmUyS4Tszy+he8OWeYkwTFjc2xii4aJUWWiGwf2u2OEc04T5iDRpMp'
52
+ });
44
53
  // @ts-expect-error — Plotly is loaded dynamically onto window
45
54
  return window.Plotly;
46
55
  }
47
56
 
57
+ // Some embedded WebViews (WKWebView in the Rhino panel) ship without the Fullscreen API at all.
58
+ const fullscreenSupported = typeof document !== 'undefined' && !!document.fullscreenEnabled;
59
+
48
60
  function toggleFullscreen() {
49
61
  if (!wrapperEl) return;
50
62
  if (!document.fullscreenElement) {
51
63
  wrapperEl.requestFullscreen().catch((err) => {
52
- error = `Fullscreen unavailable: ${err.message}`;
64
+ error = formatMessage(t.fullscreenUnavailable, { error: err.message });
53
65
  });
54
66
  } else {
55
67
  document.exitFullscreen().catch((err) => {
56
- error = `Exit fullscreen failed: ${err.message}`;
68
+ error = formatMessage(t.exitFullscreenFailed, { error: err.message });
57
69
  });
58
70
  }
59
71
  }
@@ -129,7 +141,7 @@
129
141
  ...figData.config
130
142
  });
131
143
  } catch (e) {
132
- error = e instanceof Error ? e.message : 'Failed to render chart';
144
+ error = e instanceof Error ? e.message : t.chartRenderFailed;
133
145
  } finally {
134
146
  loading = false;
135
147
  }
@@ -183,19 +195,14 @@
183
195
  >
184
196
  {#if error}
185
197
  <div class="px-4 py-3 text-sm text-destructive">{error}</div>
186
- {:else if !figData && value}
187
- <div class="px-4 py-8 text-sm text-center text-muted-foreground">Receiving chart data...</div>
188
198
  {:else if !figData}
189
- <div class="px-4 py-8 text-sm text-center text-muted-foreground">Waiting for chart data...</div>
199
+ <!-- The layout hides this output while it has no data, so this is data that doesn't parse yet. -->
200
+ <div class="px-4 py-8 text-sm text-center text-muted-foreground">{t.chartReceiving}</div>
190
201
  {:else}
191
- <div
192
- bind:this={containerEl}
193
- class="w-full"
194
- style="height: {isFullscreen ? '100vh' : '380px'};"
195
- ></div>
202
+ <div bind:this={containerEl} class="w-full {isFullscreen ? 'h-dvh' : 'h-95'}"></div>
196
203
 
197
204
  <div
198
- class="gap-1 left-2 top-2 absolute z-10 flex items-center opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 {isFullscreen
205
+ class="gap-1 left-2 top-2 absolute z-10 flex items-center opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 pointer-coarse:opacity-100 {isFullscreen
199
206
  ? 'opacity-100'
200
207
  : ''}"
201
208
  >
@@ -207,18 +214,21 @@
207
214
  </div>
208
215
  {/if}
209
216
 
210
- <button
211
- onclick={toggleFullscreen}
212
- disabled={loading}
213
- title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}
214
- class="rounded p-1.5 backdrop-blur-sm flex items-center border border-border bg-background/80 text-foreground transition-colors hover:bg-background disabled:cursor-not-allowed disabled:opacity-50"
215
- >
216
- {#if isFullscreen}
217
- <Minimize size={14} />
218
- {:else}
219
- <Maximize size={14} />
220
- {/if}
221
- </button>
217
+ {#if fullscreenSupported}
218
+ <button
219
+ onclick={toggleFullscreen}
220
+ disabled={loading}
221
+ title={isFullscreen ? t.exitFullscreen : t.fullscreen}
222
+ aria-label={isFullscreen ? t.exitFullscreen : t.fullscreen}
223
+ class="rounded p-1.5 backdrop-blur-sm flex items-center border border-border bg-background/80 text-foreground transition-colors hover:bg-background disabled:cursor-not-allowed disabled:opacity-50"
224
+ >
225
+ {#if isFullscreen}
226
+ <Minimize size={14} />
227
+ {:else}
228
+ <Maximize size={14} />
229
+ {/if}
230
+ </button>
231
+ {/if}
222
232
  </div>
223
233
  {/if}
224
234
  </div>
@@ -1,7 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { LayoutItem, InputLayoutItem, OutputLayoutItem } from '@selvajs/schemas';
3
3
  import type { Snippet } from 'svelte';
4
- import * as Card from '../primitives/card';
5
4
  import { ChevronDown } from '@lucide/svelte';
6
5
  import { buildVisibilityMap, itemKey } from '../../schema/visibility-rules';
7
6
 
@@ -20,7 +19,7 @@
20
19
  ]
21
20
  >;
22
21
  outputSnippet: Snippet<[layoutItem: OutputLayoutItem]>;
23
- /** When true, renders items flat without the Card wrapper, header, or collapse toggle. */
22
+ /** When true, renders items without the header or collapse toggle. */
24
23
  flat?: boolean;
25
24
  }
26
25
 
@@ -37,110 +36,99 @@
37
36
  flat = false
38
37
  }: Props = $props();
39
38
 
40
- function handleKeydown(e: KeyboardEvent) {
41
- if (e.key === 'Enter' || e.key === ' ') {
42
- e.preventDefault();
43
- onToggle();
44
- }
45
- }
46
-
47
- // One visibility evaluation per item per render; columnStarts and gridItem both read it.
48
39
  const visibilityMap = $derived(buildVisibilityMap(items, values));
49
40
 
50
- // Hidden items must not consume a slot here, because gridItem skips them entirely —
51
- // counting them would offset every following item's column.
52
- const columnStarts = $derived.by(() => {
53
- const positions: number[] = [];
54
- let col = 0;
55
- for (const item of items) {
56
- if (item.type === 'linebreak') {
57
- positions.push(0);
58
- col = 0;
59
- continue;
60
- }
61
- const visibility = visibilityMap[itemKey(item)];
62
- if (!visibility.visible) {
63
- positions.push(0);
64
- continue;
65
- }
66
- const span = Math.min(Math.max(1, item.span ?? 1), columns);
67
- if (col + span > columns) col = 0;
68
- positions.push(col);
69
- col = (col + span) % columns;
70
- }
71
- return positions;
72
- });
41
+ const uid = $props.id();
42
+ const descriptionId = `${uid}-description`;
43
+
44
+ // Below this a label and its control stop fitting side by side, so a wide group
45
+ // sheds columns as its panel narrows instead of squeezing every input.
46
+ const MIN_COLUMN_WIDTH = 160;
47
+ const COLUMN_GAP = 16;
48
+
49
+ let gridWidth = $state(0);
50
+ const effectiveColumns = $derived(
51
+ gridWidth === 0
52
+ ? columns
53
+ : Math.max(
54
+ 1,
55
+ Math.min(columns, Math.floor((gridWidth + COLUMN_GAP) / (MIN_COLUMN_WIDTH + COLUMN_GAP)))
56
+ )
57
+ );
73
58
  </script>
74
59
 
75
- {#if flat}
76
- <div class="p-6">
77
- <div class="schema-grid gap-6 grid" style="--schema-cols: {columns};">
78
- {#each items as layoutItem, i (layoutItem.type === 'linebreak' ? layoutItem.id : layoutItem.paramId)}
79
- {@render gridItem(layoutItem, columns, columnStarts[i] === 0)}
80
- {/each}
81
- </div>
60
+ {#snippet grid()}
61
+ <div
62
+ class="schema-grid"
63
+ style="--schema-cols: {effectiveColumns}; --column-gap: {COLUMN_GAP}px;"
64
+ bind:clientWidth={gridWidth}
65
+ >
66
+ {#each items as layoutItem (layoutItem.type === 'linebreak' ? layoutItem.id : layoutItem.paramId)}
67
+ {@render gridItem(layoutItem)}
68
+ {/each}
82
69
  </div>
83
- {:else}
84
- <Card.Root class="gap-0 py-0 pt-0 overflow-hidden">
85
- <Card.Header
86
- class="pt-4 pb-4! cursor-pointer border-b border-border bg-muted transition-colors select-none hover:bg-muted/50 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:outline-none"
87
- role="button"
88
- tabindex={0}
89
- aria-expanded={!collapsed}
90
- onclick={onToggle}
91
- onkeydown={handleKeydown}
92
- >
93
- <Card.Title>{label}</Card.Title>
94
- {#if description}
95
- <Card.Description>{description}</Card.Description>
96
- {/if}
97
- <Card.Action>
70
+ {/snippet}
71
+
72
+ <section class="shadow-xs rounded-xl border bg-card">
73
+ {#if flat}
74
+ <div class="p-4">
75
+ {@render grid()}
76
+ </div>
77
+ {:else}
78
+ <!-- The host's page owns the h1 and the panel holds the h2. The description sits outside the
79
+ heading's button, so the heading and the button are named by the label alone. -->
80
+ <h3>
81
+ <button
82
+ type="button"
83
+ class="gap-3 px-4 pt-3.5 flex w-full items-start text-left outline-none select-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset {description
84
+ ? 'pb-0'
85
+ : 'pb-3.5'}"
86
+ aria-expanded={!collapsed}
87
+ aria-describedby={description ? descriptionId : undefined}
88
+ onclick={onToggle}
89
+ >
90
+ <span class="min-w-0 text-base font-semibold leading-snug flex-1 text-foreground"
91
+ >{label}</span
92
+ >
98
93
  <ChevronDown
99
- class="h-4 w-4 text-muted-foreground transition-transform duration-200 {collapsed
100
- ? ''
101
- : 'rotate-180'}"
94
+ class="mt-1 h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200 {collapsed
95
+ ? '-rotate-90'
96
+ : ''}"
102
97
  />
103
- </Card.Action>
104
- </Card.Header>
105
- <div class="content-wrapper" class:collapsed>
98
+ </button>
99
+ </h3>
100
+ {#if description}
101
+ <p
102
+ id={descriptionId}
103
+ class="pl-4 pr-11 pt-0.5 pb-3.5 text-xs leading-snug text-muted-foreground"
104
+ >
105
+ {description}
106
+ </p>
107
+ {/if}
108
+ <div class="content-wrapper" class:collapsed inert={collapsed}>
106
109
  <div class="content-inner">
107
- <Card.Content class="p-6">
108
- <div class="schema-grid gap-6 grid" style="--schema-cols: {columns};">
109
- {#each items as layoutItem, i (layoutItem.type === 'linebreak' ? layoutItem.id : layoutItem.paramId)}
110
- {@render gridItem(layoutItem, columns, columnStarts[i] === 0)}
111
- {/each}
112
- </div>
113
- </Card.Content>
110
+ <div class="px-4 pt-1 pb-5">
111
+ {@render grid()}
112
+ </div>
114
113
  </div>
115
114
  </div>
116
- </Card.Root>
117
- {/if}
115
+ {/if}
116
+ </section>
118
117
 
119
- {#snippet gridItem(layoutItem: LayoutItem, cols: number, isFirstInRow: boolean)}
118
+ {#snippet gridItem(layoutItem: LayoutItem)}
120
119
  {#if layoutItem.type === 'linebreak'}
121
- <div style="grid-column: 1 / -1" class="h-px bg-border" aria-hidden="true"></div>
120
+ <div class="grid-break" aria-hidden="true"></div>
122
121
  {:else}
123
122
  {@const visibility = visibilityMap[itemKey(layoutItem)]}
124
- {@const span = Math.min(Math.max(1, layoutItem.span ?? 1), cols)}
123
+ {@const span = Math.min(Math.max(1, layoutItem.span ?? 1), effectiveColumns)}
125
124
  {#if visibility.visible}
126
- {#if layoutItem.type === 'input'}
127
- <div
128
- class="grid-cell min-w-0 flex items-center"
129
- class:opacity-50={visibility.disabled}
130
- class:col-divider={!isFirstInRow && cols > 1}
131
- style="grid-column: span {span} / span {span}"
132
- >
125
+ <div class="grid-cell min-w-0" class:opacity-50={visibility.disabled} style="--span: {span}">
126
+ {#if layoutItem.type === 'input'}
133
127
  {@render inputSnippet(layoutItem, visibility)}
134
- </div>
135
- {:else if layoutItem.type === 'output'}
136
- <div
137
- class="grid-cell"
138
- class:col-divider={!isFirstInRow && cols > 1}
139
- style="grid-column: span {span} / span {span}"
140
- >
128
+ {:else if layoutItem.type === 'output'}
141
129
  {@render outputSnippet(layoutItem)}
142
- </div>
143
- {/if}
130
+ {/if}
131
+ </div>
144
132
  {/if}
145
133
  {/if}
146
134
  {/snippet}
@@ -158,27 +146,28 @@
158
146
 
159
147
  .content-inner {
160
148
  min-height: 0;
149
+ overflow: hidden;
161
150
  }
162
151
 
163
152
  .schema-grid {
153
+ display: grid;
164
154
  grid-template-columns: repeat(var(--schema-cols), minmax(0, 1fr));
155
+ gap: 1rem var(--column-gap);
156
+ align-items: start;
157
+ }
158
+
159
+ .grid-cell {
160
+ grid-column: span var(--span) / span var(--span);
165
161
  }
166
162
 
167
- /* Vertical divider painted in the column gap. `gap-6` is 24px, so a 12px
168
- negative margin + 12px padding centres the 1px line in the gutter. */
169
- .col-divider {
170
- border-left: 1px solid var(--border);
171
- padding-left: 12px;
172
- margin-left: -12px;
163
+ /* A control with no label above it lines up with the controls beside it, not their labels. */
164
+ .grid-cell:has(:global([data-control-line])) {
165
+ align-self: end;
173
166
  }
174
167
 
175
- /* When the container collapses the grid to 1 visual column, the items are
176
- stacked and the divider would float on the left of every row. Hide it. */
177
- @container (max-width: 320px) {
178
- .col-divider {
179
- border-left: 0;
180
- padding-left: 0;
181
- margin-left: 0;
182
- }
168
+ /* An empty full-width row: the two row gaps around it already read as a break. */
169
+ .grid-break {
170
+ grid-column: 1 / -1;
171
+ margin-block: -0.25rem;
183
172
  }
184
173
  </style>
@@ -17,7 +17,7 @@ interface Props {
17
17
  }
18
18
  ]>;
19
19
  outputSnippet: Snippet<[layoutItem: OutputLayoutItem]>;
20
- /** When true, renders items flat without the Card wrapper, header, or collapse toggle. */
20
+ /** When true, renders items without the header or collapse toggle. */
21
21
  flat?: boolean;
22
22
  }
23
23
  declare const Group: import("svelte").Component<Props, {}, "">;
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ import { HelpCircle } from '@lucide/svelte';
3
+ import * as Dialog from '../primitives/dialog';
4
+
5
+ interface Props {
6
+ /** The field's label: the dialog title and the button's accessible name. */
7
+ label: string;
8
+ description: string;
9
+ }
10
+
11
+ let { label, description }: Props = $props();
12
+ </script>
13
+
14
+ <!-- Every field has one, so a column of them is noise. Where a fine pointer can hover, it shows
15
+ only while the pointer or focus is inside the enclosing `group/field`; touch keeps it visible.
16
+ The box is 24px, touch gets a 44px hit area, and the negative margin keeps the label row from
17
+ growing. -->
18
+ <Dialog.Root>
19
+ <Dialog.Trigger>
20
+ {#snippet child({ props })}
21
+ <button
22
+ {...props}
23
+ class="-m-1 size-6 pointer-coarse:after:-inset-2.5 relative flex shrink-0 cursor-help items-center justify-center rounded-sm text-muted-foreground transition hover:text-foreground pointer-coarse:after:absolute pointer-fine:opacity-0 pointer-fine:group-focus-within/field:opacity-100 pointer-fine:group-hover/field:opacity-100 pointer-fine:focus-visible:opacity-100"
24
+ aria-label={label}
25
+ >
26
+ <HelpCircle class="size-3.5" />
27
+ </button>
28
+ {/snippet}
29
+ </Dialog.Trigger>
30
+ <Dialog.Content class="sm:max-w-md">
31
+ <Dialog.Header>
32
+ <Dialog.Title>{label}</Dialog.Title>
33
+ <Dialog.Description>{description}</Dialog.Description>
34
+ </Dialog.Header>
35
+ </Dialog.Content>
36
+ </Dialog.Root>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ /** The field's label: the dialog title and the button's accessible name. */
3
+ label: string;
4
+ description: string;
5
+ }
6
+ declare const HelpButton: import("svelte").Component<Props, {}, "">;
7
+ type HelpButton = ReturnType<typeof HelpButton>;
8
+ export default HelpButton;