@selvajs/ui 6.5.1-beta.1 → 6.6.0-beta.12

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 (446) 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 +298 -128
  4. package/dist/components/compute/AppLayout.svelte.d.ts +22 -0
  5. package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
  6. package/dist/components/compute/ComputeApp.svelte +45 -24
  7. package/dist/components/compute/ComputeApp.svelte.d.ts +19 -2
  8. package/dist/components/compute/ComputeMessagesDialog.svelte +47 -83
  9. package/dist/components/compute/ParameterPresetManager.svelte +37 -130
  10. package/dist/components/compute/ParameterPresetManager.svelte.d.ts +4 -5
  11. package/dist/components/compute/SolveMessages.svelte +131 -77
  12. package/dist/components/compute/SolveMessages.svelte.d.ts +7 -12
  13. package/dist/components/layout/AppShell.svelte +10 -6
  14. package/dist/components/layout/PageFooter.svelte +23 -11
  15. package/dist/components/layout/PageHeader.svelte +11 -7
  16. package/dist/components/layout/Pagination.svelte +2 -4
  17. package/dist/components/layout/SectionHeader.svelte +4 -2
  18. package/dist/components/layout/SideNav.svelte +56 -7
  19. package/dist/components/preview/ChartOutput.svelte +91 -48
  20. package/dist/components/preview/Group.svelte +92 -103
  21. package/dist/components/preview/Group.svelte.d.ts +1 -1
  22. package/dist/components/preview/HelpButton.svelte +36 -0
  23. package/dist/components/preview/HelpButton.svelte.d.ts +8 -0
  24. package/dist/components/preview/ImageOutput.svelte +434 -72
  25. package/dist/components/preview/InputControl.svelte +163 -90
  26. package/dist/components/preview/InputControl.svelte.d.ts +5 -1
  27. package/dist/components/preview/OutputDisplay.svelte +44 -42
  28. package/dist/components/preview/TabBar.svelte +106 -22
  29. package/dist/components/preview/TabBar.svelte.d.ts +1 -0
  30. package/dist/components/preview/TabContent.svelte +63 -57
  31. package/dist/components/preview/TabContent.svelte.d.ts +5 -1
  32. package/dist/components/preview/TabLayout.svelte +27 -5
  33. package/dist/components/preview/TabLayout.svelte.d.ts +5 -0
  34. package/dist/components/preview/inputs/CheckboxInput.svelte +7 -7
  35. package/dist/components/preview/inputs/CheckboxInput.svelte.d.ts +3 -0
  36. package/dist/components/preview/inputs/ChecklistInput.svelte +7 -2
  37. package/dist/components/preview/inputs/ChecklistInput.svelte.d.ts +2 -1
  38. package/dist/components/preview/inputs/ColorInput.svelte +4 -2
  39. package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
  40. package/dist/components/preview/inputs/DropdownInput.svelte +19 -4
  41. package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +2 -1
  42. package/dist/components/preview/inputs/FileInput.svelte +112 -108
  43. package/dist/components/preview/inputs/GeometryInput.svelte +128 -0
  44. package/dist/components/preview/inputs/GeometryInput.svelte.d.ts +21 -0
  45. package/dist/components/preview/inputs/NumberInput.svelte +123 -61
  46. package/dist/components/preview/inputs/NumberInput.svelte.d.ts +2 -0
  47. package/dist/components/preview/inputs/OptionGlyph.svelte +29 -0
  48. package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +8 -0
  49. package/dist/components/preview/inputs/SegmentedInput.svelte +44 -0
  50. package/dist/components/preview/inputs/SegmentedInput.svelte.d.ts +12 -0
  51. package/dist/components/preview/inputs/TextInput.svelte +8 -4
  52. package/dist/components/preview/inputs/TileInput.svelte +80 -0
  53. package/dist/components/preview/inputs/TileInput.svelte.d.ts +12 -0
  54. package/dist/components/preview/inputs/index.d.ts +3 -0
  55. package/dist/components/preview/inputs/index.js +3 -0
  56. package/dist/components/primitives/CalculateButton.svelte +56 -24
  57. package/dist/components/primitives/CalculateButton.svelte.d.ts +3 -0
  58. package/dist/components/primitives/Callout.svelte +11 -18
  59. package/dist/components/primitives/DataTable.svelte +38 -5
  60. package/dist/components/primitives/DataTable.svelte.d.ts +2 -0
  61. package/dist/components/primitives/FilterableDropdown.svelte +42 -129
  62. package/dist/components/primitives/FilterableDropdown.svelte.d.ts +1 -1
  63. package/dist/components/primitives/IssueList.svelte +56 -0
  64. package/dist/components/primitives/IssueList.svelte.d.ts +20 -0
  65. package/dist/components/primitives/SeverityIcon.svelte +15 -0
  66. package/dist/components/primitives/SeverityIcon.svelte.d.ts +8 -0
  67. package/dist/components/primitives/SolvingIndicator.svelte +43 -42
  68. package/dist/components/primitives/SolvingIndicator.svelte.d.ts +6 -0
  69. package/dist/components/primitives/StateDisplay.svelte +19 -79
  70. package/dist/components/primitives/ViewToggle.svelte +18 -33
  71. package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte +9 -3
  72. package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte.d.ts +6 -1
  73. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  74. package/dist/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
  75. package/dist/components/primitives/badge/badge.svelte +2 -2
  76. package/dist/components/primitives/badge/badge.svelte.d.ts +4 -4
  77. package/dist/components/primitives/button/button.svelte +6 -2
  78. package/dist/components/primitives/button/button.svelte.d.ts +10 -4
  79. package/dist/components/primitives/card/card-header.svelte +1 -1
  80. package/dist/components/primitives/card/card.svelte +21 -5
  81. package/dist/components/primitives/card/card.svelte.d.ts +25 -1
  82. package/dist/components/primitives/card/index.d.ts +1 -2
  83. package/dist/components/primitives/card/index.js +2 -3
  84. package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
  85. package/dist/components/primitives/command/command-dialog.svelte +42 -0
  86. package/dist/components/primitives/command/command-dialog.svelte.d.ts +14 -0
  87. package/dist/components/primitives/command/command-empty.svelte +17 -0
  88. package/dist/components/primitives/command/command-empty.svelte.d.ts +4 -0
  89. package/dist/components/primitives/command/command-group.svelte +33 -0
  90. package/dist/components/primitives/command/command-group.svelte.d.ts +7 -0
  91. package/dist/components/primitives/command/command-input.svelte +36 -0
  92. package/dist/components/primitives/command/command-input.svelte.d.ts +4 -0
  93. package/dist/components/primitives/command/command-item.svelte +28 -0
  94. package/dist/components/primitives/command/command-item.svelte.d.ts +4 -0
  95. package/dist/components/primitives/command/command-link-item.svelte +21 -0
  96. package/dist/components/primitives/command/command-link-item.svelte.d.ts +4 -0
  97. package/dist/components/primitives/command/command-list.svelte +20 -0
  98. package/dist/components/primitives/command/command-list.svelte.d.ts +4 -0
  99. package/dist/components/primitives/command/command-loading.svelte +7 -0
  100. package/dist/components/primitives/command/command-loading.svelte.d.ts +4 -0
  101. package/dist/components/primitives/command/command-separator.svelte +17 -0
  102. package/dist/components/primitives/command/command-separator.svelte.d.ts +4 -0
  103. package/dist/components/primitives/command/command-shortcut.svelte +23 -0
  104. package/dist/components/primitives/command/command-shortcut.svelte.d.ts +5 -0
  105. package/dist/components/primitives/command/command.svelte +28 -0
  106. package/dist/components/primitives/command/command.svelte.d.ts +8 -0
  107. package/dist/components/primitives/command/index.d.ts +12 -0
  108. package/dist/components/primitives/command/index.js +14 -0
  109. package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
  110. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  111. package/dist/components/primitives/dialog/dialog-content.svelte +11 -3
  112. package/dist/components/primitives/dialog/dialog-content.svelte.d.ts +2 -0
  113. package/dist/components/primitives/dialog/dialog-overlay.svelte +1 -1
  114. package/dist/components/primitives/dialog/dialog-title.svelte +6 -2
  115. package/dist/components/primitives/dialog/dialog-title.svelte.d.ts +5 -1
  116. package/dist/components/primitives/drawer/Drawer.svelte +2 -2
  117. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  118. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +4 -0
  119. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  120. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
  121. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +31 -0
  122. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +10 -0
  123. package/dist/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  124. package/dist/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +8 -0
  125. package/dist/components/primitives/dropdown-menu/dropdown-menu-group.svelte +7 -0
  126. package/dist/components/primitives/dropdown-menu/dropdown-menu-group.svelte.d.ts +4 -0
  127. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +27 -0
  128. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +8 -0
  129. package/dist/components/primitives/dropdown-menu/dropdown-menu-label.svelte +24 -0
  130. package/dist/components/primitives/dropdown-menu/dropdown-menu-label.svelte.d.ts +8 -0
  131. package/dist/components/primitives/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  132. package/dist/components/primitives/dropdown-menu/dropdown-menu-portal.svelte.d.ts +3 -0
  133. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  134. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +4 -0
  135. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  136. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +4 -0
  137. package/dist/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  138. package/dist/components/primitives/dropdown-menu/dropdown-menu-separator.svelte.d.ts +4 -0
  139. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
  140. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +5 -0
  141. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  142. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +10 -0
  143. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  144. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +7 -0
  145. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  146. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub.svelte.d.ts +3 -0
  147. package/dist/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  148. package/dist/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +4 -0
  149. package/dist/components/primitives/dropdown-menu/dropdown-menu.svelte +7 -0
  150. package/dist/components/primitives/dropdown-menu/dropdown-menu.svelte.d.ts +3 -0
  151. package/dist/components/primitives/dropdown-menu/index.d.ts +18 -0
  152. package/dist/components/primitives/dropdown-menu/index.js +18 -0
  153. package/dist/components/primitives/{alert/alert-description.svelte → empty/empty-content.svelte} +3 -3
  154. package/dist/components/primitives/empty/empty-content.svelte.d.ts +5 -0
  155. package/dist/components/primitives/empty/empty-description.svelte +23 -0
  156. package/dist/components/primitives/{alert/alert-description.svelte.d.ts → empty/empty-description.svelte.d.ts} +4 -4
  157. package/dist/components/primitives/{alert/alert-title.svelte → empty/empty-header.svelte} +3 -3
  158. package/dist/components/primitives/empty/empty-header.svelte.d.ts +5 -0
  159. package/dist/components/primitives/empty/empty-media.svelte +41 -0
  160. package/dist/components/primitives/empty/empty-media.svelte.d.ts +26 -0
  161. package/dist/components/primitives/{card/card-action.svelte → empty/empty-title.svelte} +2 -2
  162. package/dist/components/primitives/{card/card-action.svelte.d.ts → empty/empty-title.svelte.d.ts} +3 -3
  163. package/dist/components/primitives/empty/empty.svelte +23 -0
  164. package/dist/components/primitives/empty/empty.svelte.d.ts +5 -0
  165. package/dist/components/primitives/empty/index.d.ts +7 -0
  166. package/dist/components/primitives/empty/index.js +9 -0
  167. package/dist/components/primitives/index.d.ts +10 -1
  168. package/dist/components/primitives/index.js +10 -1
  169. package/dist/components/primitives/input/input.svelte +4 -4
  170. package/dist/components/primitives/input-group/index.d.ts +7 -0
  171. package/dist/components/primitives/input-group/index.js +9 -0
  172. package/dist/components/primitives/input-group/input-group-addon.svelte +53 -0
  173. package/dist/components/primitives/input-group/input-group-addon.svelte.d.ts +32 -0
  174. package/dist/components/primitives/input-group/input-group-button.svelte +49 -0
  175. package/dist/components/primitives/input-group/input-group-button.svelte.d.ts +32 -0
  176. package/dist/components/primitives/input-group/input-group-input.svelte +25 -0
  177. package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +11 -0
  178. package/dist/components/primitives/input-group/input-group-text.svelte +22 -0
  179. package/dist/components/primitives/input-group/input-group-text.svelte.d.ts +5 -0
  180. package/dist/components/primitives/input-group/input-group-textarea.svelte +23 -0
  181. package/dist/components/primitives/input-group/input-group-textarea.svelte.d.ts +3 -0
  182. package/dist/components/primitives/input-group/input-group.svelte +24 -0
  183. package/dist/components/primitives/{alert/alert-title.svelte.d.ts → input-group/input-group.svelte.d.ts} +4 -4
  184. package/dist/components/primitives/mode-toggle/mode-toggle.svelte +6 -7
  185. package/dist/components/primitives/popover/index.d.ts +9 -0
  186. package/dist/components/primitives/popover/index.js +11 -0
  187. package/dist/components/primitives/popover/popover-close.svelte +7 -0
  188. package/dist/components/primitives/popover/popover-close.svelte.d.ts +4 -0
  189. package/dist/components/primitives/popover/popover-content.svelte +31 -0
  190. package/dist/components/primitives/popover/popover-content.svelte.d.ts +10 -0
  191. package/dist/components/primitives/popover/popover-description.svelte +20 -0
  192. package/dist/components/primitives/popover/popover-description.svelte.d.ts +5 -0
  193. package/dist/components/primitives/popover/popover-header.svelte +20 -0
  194. package/dist/components/primitives/popover/popover-header.svelte.d.ts +5 -0
  195. package/dist/components/primitives/popover/popover-portal.svelte +7 -0
  196. package/dist/components/primitives/popover/popover-portal.svelte.d.ts +3 -0
  197. package/dist/components/primitives/popover/popover-title.svelte +15 -0
  198. package/dist/components/primitives/popover/popover-title.svelte.d.ts +5 -0
  199. package/dist/components/primitives/popover/popover-trigger.svelte +17 -0
  200. package/dist/components/primitives/popover/popover-trigger.svelte.d.ts +4 -0
  201. package/dist/components/primitives/popover/popover.svelte +7 -0
  202. package/dist/components/primitives/popover/popover.svelte.d.ts +3 -0
  203. package/dist/components/primitives/resizable/resizable-handle.svelte +6 -2
  204. package/dist/components/primitives/resizable/resizable-handle.svelte.d.ts +2 -0
  205. package/dist/components/primitives/resizable/resizable-pane-group.svelte +1 -4
  206. package/dist/components/primitives/scroll-area/scroll-area.svelte +1 -1
  207. package/dist/components/primitives/search/search.svelte +3 -3
  208. package/dist/components/primitives/select/select-content.svelte +1 -1
  209. package/dist/components/primitives/select/select-trigger.svelte +1 -1
  210. package/dist/components/primitives/severity.d.ts +7 -0
  211. package/dist/components/primitives/severity.js +19 -0
  212. package/dist/components/primitives/slider/slider.svelte +8 -3
  213. package/dist/components/primitives/slider/slider.svelte.d.ts +5 -1
  214. package/dist/components/primitives/sonner/sonner.svelte +1 -1
  215. package/dist/components/primitives/spinner/index.d.ts +1 -0
  216. package/dist/components/primitives/spinner/index.js +1 -0
  217. package/dist/components/primitives/spinner/spinner.svelte +29 -0
  218. package/dist/components/primitives/spinner/spinner.svelte.d.ts +4 -0
  219. package/dist/components/primitives/switch/switch.svelte +2 -2
  220. package/dist/components/primitives/tabs/tabs-list.svelte +27 -5
  221. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +22 -1
  222. package/dist/components/primitives/tabs/tabs-trigger.svelte +23 -5
  223. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +22 -1
  224. package/dist/components/primitives/tabs/tabs.svelte +6 -2
  225. package/dist/components/primitives/tabs/tabs.svelte.d.ts +5 -1
  226. package/dist/components/primitives/textarea/textarea.svelte +1 -1
  227. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +1 -1
  228. package/dist/components/primitives/toggle/index.d.ts +3 -0
  229. package/dist/components/primitives/toggle/index.js +5 -0
  230. package/dist/components/primitives/toggle/toggle.svelte +54 -0
  231. package/dist/components/primitives/toggle/toggle.svelte.d.ts +46 -0
  232. package/dist/components/primitives/toggle-group/index.d.ts +3 -0
  233. package/dist/components/primitives/toggle-group/index.js +5 -0
  234. package/dist/components/primitives/toggle-group/toggle-group-item.svelte +35 -0
  235. package/dist/components/primitives/toggle-group/toggle-group-item.svelte.d.ts +6 -0
  236. package/dist/components/primitives/toggle-group/toggle-group.svelte +75 -0
  237. package/dist/components/primitives/toggle-group/toggle-group.svelte.d.ts +17 -0
  238. package/dist/components/viewer/MeshMetadataPanel.svelte +119 -0
  239. package/dist/components/viewer/MeshMetadataPanel.svelte.d.ts +9 -0
  240. package/dist/components/viewer/SceneManager.svelte +14 -5
  241. package/dist/components/viewer/Viewer.svelte +243 -221
  242. package/dist/components/viewer/Viewer.svelte.d.ts +3 -0
  243. package/dist/compute/run-panel-action.d.ts +8 -0
  244. package/dist/compute/run-panel-action.js +12 -0
  245. package/dist/compute/solving.svelte.d.ts +11 -7
  246. package/dist/compute/solving.svelte.js +64 -45
  247. package/dist/compute/useSolveSession.svelte.js +3 -0
  248. package/dist/constants.d.ts +6 -8
  249. package/dist/constants.js +7 -9
  250. package/dist/contexts/hostContext.svelte.d.ts +39 -0
  251. package/dist/contexts/hostContext.svelte.js +9 -0
  252. package/dist/i18n/localeContext.svelte.d.ts +10 -3
  253. package/dist/i18n/localeContext.svelte.js +27 -5
  254. package/dist/i18n/messages.d.ts +150 -2
  255. package/dist/i18n/messages.js +261 -11
  256. package/dist/index.d.ts +4 -1
  257. package/dist/index.js +3 -0
  258. package/dist/public.d.ts +1 -1
  259. package/dist/schema/host-support.d.ts +29 -0
  260. package/dist/schema/host-support.js +97 -0
  261. package/dist/schema/option-display.d.ts +12 -0
  262. package/dist/schema/option-display.js +29 -0
  263. package/dist/schema/param-exporter.d.ts +4 -1
  264. package/dist/schema/param-exporter.js +10 -6
  265. package/dist/schema/visibility-rules.js +21 -0
  266. package/dist/styles/base.css +80 -10
  267. package/dist/types/actionButton.d.ts +17 -3
  268. package/dist/types/presetLabels.d.ts +3 -2
  269. package/dist/types/presetLabels.js +9 -8
  270. package/dist/utils/file-download.js +10 -22
  271. package/dist/utils/host-files.d.ts +12 -0
  272. package/dist/utils/host-files.js +46 -0
  273. package/dist/utils/loadScript.d.ts +2 -0
  274. package/dist/utils/loadScript.js +2 -0
  275. package/dist/utils/webp-to-png.d.ts +10 -0
  276. package/dist/utils/webp-to-png.js +41 -0
  277. package/package.json +19 -15
  278. package/src/lib/components/ConfirmDialog.svelte +2 -10
  279. package/src/lib/components/ErrorScreen.svelte +21 -27
  280. package/src/lib/components/compute/AppLayout.svelte +298 -128
  281. package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
  282. package/src/lib/components/compute/ComputeApp.svelte +45 -24
  283. package/src/lib/components/compute/ComputeMessagesDialog.svelte +47 -83
  284. package/src/lib/components/compute/ParameterPresetManager.svelte +37 -130
  285. package/src/lib/components/compute/SolveMessages.svelte +131 -77
  286. package/src/lib/components/layout/AppShell.svelte +10 -6
  287. package/src/lib/components/layout/PageFooter.svelte +23 -11
  288. package/src/lib/components/layout/PageHeader.svelte +11 -7
  289. package/src/lib/components/layout/Pagination.svelte +2 -4
  290. package/src/lib/components/layout/SectionHeader.svelte +4 -2
  291. package/src/lib/components/layout/SideNav.svelte +56 -7
  292. package/src/lib/components/preview/ChartOutput.svelte +91 -48
  293. package/src/lib/components/preview/Group.svelte +92 -103
  294. package/src/lib/components/preview/HelpButton.svelte +36 -0
  295. package/src/lib/components/preview/ImageOutput.svelte +434 -72
  296. package/src/lib/components/preview/InputControl.svelte +163 -90
  297. package/src/lib/components/preview/OutputDisplay.svelte +44 -42
  298. package/src/lib/components/preview/TabBar.svelte +106 -22
  299. package/src/lib/components/preview/TabContent.svelte +63 -57
  300. package/src/lib/components/preview/TabLayout.svelte +27 -5
  301. package/src/lib/components/preview/inputs/CheckboxInput.svelte +7 -7
  302. package/src/lib/components/preview/inputs/ChecklistInput.svelte +7 -2
  303. package/src/lib/components/preview/inputs/ColorInput.svelte +4 -2
  304. package/src/lib/components/preview/inputs/DropdownInput.svelte +19 -4
  305. package/src/lib/components/preview/inputs/FileInput.svelte +112 -108
  306. package/src/lib/components/preview/inputs/GeometryInput.svelte +128 -0
  307. package/src/lib/components/preview/inputs/NumberInput.svelte +123 -61
  308. package/src/lib/components/preview/inputs/OptionGlyph.svelte +29 -0
  309. package/src/lib/components/preview/inputs/SegmentedInput.svelte +44 -0
  310. package/src/lib/components/preview/inputs/TextInput.svelte +8 -4
  311. package/src/lib/components/preview/inputs/TileInput.svelte +80 -0
  312. package/src/lib/components/preview/inputs/index.ts +3 -0
  313. package/src/lib/components/primitives/CalculateButton.svelte +56 -24
  314. package/src/lib/components/primitives/Callout.svelte +11 -18
  315. package/src/lib/components/primitives/DataTable.svelte +38 -5
  316. package/src/lib/components/primitives/FilterableDropdown.svelte +42 -129
  317. package/src/lib/components/primitives/IssueList.svelte +56 -0
  318. package/src/lib/components/primitives/SeverityIcon.svelte +15 -0
  319. package/src/lib/components/primitives/SolvingIndicator.svelte +43 -42
  320. package/src/lib/components/primitives/StateDisplay.svelte +19 -79
  321. package/src/lib/components/primitives/ViewToggle.svelte +18 -33
  322. package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +9 -3
  323. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  324. package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
  325. package/src/lib/components/primitives/badge/badge.svelte +2 -2
  326. package/src/lib/components/primitives/button/button.svelte +6 -2
  327. package/src/lib/components/primitives/card/card-header.svelte +1 -1
  328. package/src/lib/components/primitives/card/card.svelte +21 -5
  329. package/src/lib/components/primitives/card/index.ts +1 -4
  330. package/src/lib/components/primitives/checkbox/checkbox.svelte +1 -1
  331. package/src/lib/components/primitives/command/command-dialog.svelte +42 -0
  332. package/src/lib/components/primitives/command/command-empty.svelte +17 -0
  333. package/src/lib/components/primitives/command/command-group.svelte +33 -0
  334. package/src/lib/components/primitives/command/command-input.svelte +36 -0
  335. package/src/lib/components/primitives/command/command-item.svelte +28 -0
  336. package/src/lib/components/primitives/command/command-link-item.svelte +21 -0
  337. package/src/lib/components/primitives/command/command-list.svelte +20 -0
  338. package/src/lib/components/primitives/command/command-loading.svelte +7 -0
  339. package/src/lib/components/primitives/command/command-separator.svelte +17 -0
  340. package/src/lib/components/primitives/command/command-shortcut.svelte +23 -0
  341. package/src/lib/components/primitives/command/command.svelte +28 -0
  342. package/src/lib/components/primitives/command/index.ts +37 -0
  343. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +1 -1
  344. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  345. package/src/lib/components/primitives/dialog/dialog-content.svelte +11 -3
  346. package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
  347. package/src/lib/components/primitives/dialog/dialog-title.svelte +6 -2
  348. package/src/lib/components/primitives/drawer/Drawer.svelte +2 -2
  349. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  350. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  351. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +31 -0
  352. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  353. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group.svelte +7 -0
  354. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +27 -0
  355. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +24 -0
  356. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  357. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  358. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  359. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  360. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
  361. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  362. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  363. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  364. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  365. package/src/lib/components/primitives/dropdown-menu/dropdown-menu.svelte +7 -0
  366. package/src/lib/components/primitives/dropdown-menu/index.ts +54 -0
  367. package/src/lib/components/primitives/{alert/alert-description.svelte → empty/empty-content.svelte} +3 -3
  368. package/src/lib/components/primitives/empty/empty-description.svelte +23 -0
  369. package/src/lib/components/primitives/{alert/alert-title.svelte → empty/empty-header.svelte} +3 -3
  370. package/src/lib/components/primitives/empty/empty-media.svelte +41 -0
  371. package/src/lib/components/primitives/{card/card-action.svelte → empty/empty-title.svelte} +2 -2
  372. package/src/lib/components/primitives/empty/empty.svelte +23 -0
  373. package/src/lib/components/primitives/empty/index.ts +22 -0
  374. package/src/lib/components/primitives/index.ts +10 -1
  375. package/src/lib/components/primitives/input/input.svelte +4 -4
  376. package/src/lib/components/primitives/input-group/index.ts +22 -0
  377. package/src/lib/components/primitives/input-group/input-group-addon.svelte +53 -0
  378. package/src/lib/components/primitives/input-group/input-group-button.svelte +49 -0
  379. package/src/lib/components/primitives/input-group/input-group-input.svelte +25 -0
  380. package/src/lib/components/primitives/input-group/input-group-text.svelte +22 -0
  381. package/src/lib/components/primitives/input-group/input-group-textarea.svelte +23 -0
  382. package/src/lib/components/primitives/input-group/input-group.svelte +24 -0
  383. package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +6 -7
  384. package/src/lib/components/primitives/popover/index.ts +28 -0
  385. package/src/lib/components/primitives/popover/popover-close.svelte +7 -0
  386. package/src/lib/components/primitives/popover/popover-content.svelte +31 -0
  387. package/src/lib/components/primitives/popover/popover-description.svelte +20 -0
  388. package/src/lib/components/primitives/popover/popover-header.svelte +20 -0
  389. package/src/lib/components/primitives/popover/popover-portal.svelte +7 -0
  390. package/src/lib/components/primitives/popover/popover-title.svelte +15 -0
  391. package/src/lib/components/primitives/popover/popover-trigger.svelte +17 -0
  392. package/src/lib/components/primitives/popover/popover.svelte +7 -0
  393. package/src/lib/components/primitives/resizable/resizable-handle.svelte +6 -2
  394. package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -4
  395. package/src/lib/components/primitives/scroll-area/scroll-area.svelte +1 -1
  396. package/src/lib/components/primitives/search/search.svelte +3 -3
  397. package/src/lib/components/primitives/select/select-content.svelte +1 -1
  398. package/src/lib/components/primitives/select/select-trigger.svelte +1 -1
  399. package/src/lib/components/primitives/severity.ts +26 -0
  400. package/src/lib/components/primitives/slider/slider.svelte +8 -3
  401. package/src/lib/components/primitives/sonner/sonner.svelte +1 -1
  402. package/src/lib/components/primitives/spinner/index.ts +1 -0
  403. package/src/lib/components/primitives/spinner/spinner.svelte +29 -0
  404. package/src/lib/components/primitives/switch/switch.svelte +2 -2
  405. package/src/lib/components/primitives/tabs/tabs-list.svelte +27 -5
  406. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +23 -5
  407. package/src/lib/components/primitives/tabs/tabs.svelte +6 -2
  408. package/src/lib/components/primitives/textarea/textarea.svelte +1 -1
  409. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +1 -1
  410. package/src/lib/components/primitives/toggle/index.ts +13 -0
  411. package/src/lib/components/primitives/toggle/toggle.svelte +54 -0
  412. package/src/lib/components/primitives/toggle-group/index.ts +10 -0
  413. package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +35 -0
  414. package/src/lib/components/primitives/toggle-group/toggle-group.svelte +75 -0
  415. package/src/lib/components/viewer/MeshMetadataPanel.svelte +119 -0
  416. package/src/lib/components/viewer/SceneManager.svelte +14 -5
  417. package/src/lib/components/viewer/Viewer.svelte +243 -221
  418. package/src/lib/compute/run-panel-action.ts +16 -0
  419. package/src/lib/compute/solving.svelte.ts +66 -50
  420. package/src/lib/compute/useSolveSession.svelte.ts +3 -0
  421. package/src/lib/constants.ts +7 -9
  422. package/src/lib/contexts/hostContext.svelte.ts +51 -0
  423. package/src/lib/i18n/localeContext.svelte.ts +40 -5
  424. package/src/lib/i18n/messages.ts +453 -13
  425. package/src/lib/index.ts +21 -0
  426. package/src/lib/public.ts +1 -0
  427. package/src/lib/schema/host-support.ts +129 -0
  428. package/src/lib/schema/option-display.ts +44 -0
  429. package/src/lib/schema/param-exporter.ts +10 -7
  430. package/src/lib/schema/visibility-rules.ts +23 -0
  431. package/src/lib/styles/base.css +80 -10
  432. package/src/lib/types/actionButton.ts +16 -3
  433. package/src/lib/types/presetLabels.ts +13 -11
  434. package/src/lib/utils/file-download.ts +11 -21
  435. package/src/lib/utils/host-files.ts +61 -0
  436. package/src/lib/utils/loadScript.ts +3 -0
  437. package/src/lib/utils/webp-to-png.ts +48 -0
  438. package/dist/components/primitives/alert/alert.svelte +0 -44
  439. package/dist/components/primitives/alert/alert.svelte.d.ts +0 -26
  440. package/dist/components/primitives/alert/index.d.ts +0 -5
  441. package/dist/components/primitives/alert/index.js +0 -7
  442. package/dist/components/viewer/MeshMetadataDialog.svelte +0 -126
  443. package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +0 -10
  444. package/src/lib/components/primitives/alert/alert.svelte +0 -44
  445. package/src/lib/components/primitives/alert/index.ts +0 -14
  446. package/src/lib/components/viewer/MeshMetadataDialog.svelte +0 -126
@@ -1,44 +1,73 @@
1
1
  <script lang="ts">
2
2
  import type { TabConfig } from '@selvajs/schemas';
3
3
  import * as Tabs from '../primitives/tabs';
4
- import { ScrollArea } from '../primitives/scroll-area';
4
+ import { ChevronLeft, ChevronRight } from '@lucide/svelte';
5
5
  import Icon from '@iconify/svelte';
6
+ import { getLocaleContext } from '../../i18n/localeContext.svelte';
7
+
8
+ const locale = getLocaleContext();
9
+ const t = $derived(locale.messages);
6
10
 
7
11
  interface Props {
8
12
  tabs: TabConfig[];
13
+ activeTabId: string;
9
14
  onTabChange: (tabId: string) => void;
10
15
  }
11
16
 
12
- let { tabs, onTabChange }: Props = $props();
17
+ let { tabs, activeTabId, onTabChange }: Props = $props();
18
+
19
+ const SCROLL_BUTTON_WIDTH = 32;
20
+
21
+ let listRef = $state<HTMLElement | null>(null);
22
+ let canScrollBack = $state(false);
23
+ let canScrollForward = $state(false);
24
+
25
+ function updateOverflow() {
26
+ if (!listRef) return;
27
+ const { scrollLeft, scrollWidth, clientWidth } = listRef;
28
+ canScrollBack = scrollLeft > 1;
29
+ canScrollForward = scrollLeft + clientWidth < scrollWidth - 1;
30
+ }
13
31
 
14
- let viewportRef = $state<HTMLElement | null>(null);
32
+ $effect(() => {
33
+ if (!listRef) return;
34
+ const observer = new ResizeObserver(updateOverflow);
35
+ observer.observe(listRef);
36
+ updateOverflow();
37
+ return () => observer.disconnect();
38
+ });
39
+
40
+ // A tab picked from the collapsed strip may sit outside the visible strip. Not
41
+ // scrollIntoView: that also scrolls every scrollable ancestor, e.g. the mobile drawer.
42
+ $effect(() => {
43
+ if (!listRef) return;
44
+ const active = listRef.querySelector<HTMLElement>(`[data-value="${CSS.escape(activeTabId)}"]`);
45
+ if (!active) return;
46
+ // Keep the tab clear of the scroll buttons, which overlay the strip's edges.
47
+ const start = active.offsetLeft - SCROLL_BUTTON_WIDTH;
48
+ const end = active.offsetLeft + active.offsetWidth + SCROLL_BUTTON_WIDTH;
49
+ if (start < listRef.scrollLeft) listRef.scrollLeft = start;
50
+ else if (end > listRef.scrollLeft + listRef.clientWidth)
51
+ listRef.scrollLeft = end - listRef.clientWidth;
52
+ });
53
+
54
+ function scrollByPage(direction: -1 | 1) {
55
+ listRef?.scrollBy({ left: direction * listRef.clientWidth * 0.7, behavior: 'smooth' });
56
+ }
15
57
 
16
58
  function handleWheel(e: WheelEvent) {
17
- if (!viewportRef) return;
59
+ if (!listRef || (!canScrollBack && !canScrollForward)) return;
18
60
  // Trackpad horizontal swipes already produce deltaX — let those pass through.
19
61
  if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;
20
- const canScroll = viewportRef.scrollWidth > viewportRef.clientWidth;
21
- if (!canScroll) return;
22
62
  e.preventDefault();
23
- viewportRef.scrollLeft += e.deltaY;
63
+ listRef.scrollLeft += e.deltaY;
24
64
  }
25
65
  </script>
26
66
 
27
- <ScrollArea
28
- bind:viewportRef
29
- class="w-full shrink-0 border-b border-border"
30
- orientation="horizontal"
31
- onwheel={handleWheel}
32
- >
33
- <Tabs.List
34
- class="px-2 py-2 gap-0 inline-flex h-auto w-max justify-start rounded-none bg-transparent"
35
- >
67
+ <div class="tab-bar relative shrink-0 border-b border-border">
68
+ <Tabs.List bind:ref={listRef} variant="line" onscroll={updateOverflow} onwheel={handleWheel}>
36
69
  {#each tabs as tab (tab.id)}
37
- <Tabs.Trigger
38
- value={tab.id}
39
- onclick={() => onTabChange(tab.id)}
40
- class="group/tab gap-1.5 px-3 py-1 text-sm font-medium relative h-auto flex-none shrink-0 rounded-none border-0 transition-colors not-last:border-r not-last:border-border hover:bg-accent data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none data-[state=inactive]:text-muted-foreground dark:data-[state=active]:border-transparent dark:data-[state=active]:bg-transparent"
41
- >
70
+ <Tabs.Trigger value={tab.id} onclick={() => onTabChange(tab.id)} variant="line">
42
71
  {#if tab.icon}
43
72
  {#if tab.icon.includes(':')}
44
73
  <Icon icon={tab.icon} class="h-4 w-4" />
@@ -50,4 +79,59 @@
50
79
  </Tabs.Trigger>
51
80
  {/each}
52
81
  </Tabs.List>
53
- </ScrollArea>
82
+
83
+ {#if canScrollBack}
84
+ <button
85
+ type="button"
86
+ class="scroll-button back"
87
+ aria-label={t.scrollTabsBack}
88
+ onclick={() => scrollByPage(-1)}
89
+ >
90
+ <ChevronLeft class="h-4 w-4" />
91
+ </button>
92
+ {/if}
93
+ {#if canScrollForward}
94
+ <button
95
+ type="button"
96
+ class="scroll-button forward"
97
+ aria-label={t.scrollTabsForward}
98
+ onclick={() => scrollByPage(1)}
99
+ >
100
+ <ChevronRight class="h-4 w-4" />
101
+ </button>
102
+ {/if}
103
+ </div>
104
+
105
+ <style>
106
+ .tab-bar :global([data-slot='tabs-list']) {
107
+ position: relative;
108
+ overflow-x: auto;
109
+ scrollbar-width: none;
110
+ }
111
+ .tab-bar :global([data-slot='tabs-list']::-webkit-scrollbar) {
112
+ display: none;
113
+ }
114
+
115
+ .scroll-button {
116
+ position: absolute;
117
+ top: 0;
118
+ bottom: 1px;
119
+ display: flex;
120
+ align-items: center;
121
+ color: var(--muted-foreground);
122
+ cursor: pointer;
123
+ }
124
+ .scroll-button:hover {
125
+ color: var(--foreground);
126
+ }
127
+ .scroll-button.back {
128
+ left: 0;
129
+ padding: 0 1.25rem 0 0.375rem;
130
+ background: linear-gradient(to right, var(--card) 55%, transparent);
131
+ }
132
+ .scroll-button.forward {
133
+ right: 0;
134
+ padding: 0 0.375rem 0 1.25rem;
135
+ background: linear-gradient(to left, var(--card) 55%, transparent);
136
+ }
137
+ </style>
@@ -1,6 +1,7 @@
1
1
  import type { TabConfig } from '@selvajs/schemas';
2
2
  interface Props {
3
3
  tabs: TabConfig[];
4
+ activeTabId: string;
4
5
  onTabChange: (tabId: string) => void;
5
6
  }
6
7
  declare const TabBar: import("svelte").Component<Props, {}, "">;
@@ -3,6 +3,7 @@
3
3
  TabConfig,
4
4
  SchemaInput,
5
5
  DiscoveredOutput,
6
+ UISchema,
6
7
  SupportedTypes,
7
8
  InputLayoutItem,
8
9
  OutputLayoutItem
@@ -14,6 +15,8 @@
14
15
  import InputControl from './InputControl.svelte';
15
16
  import OutputDisplay from './OutputDisplay.svelte';
16
17
  import { evaluateGroupVisibility } from '../../schema/visibility-rules';
18
+ import { isSupportedOn, layoutItemKind } from '../../schema/host-support';
19
+ import { getHostContext } from '../../contexts/hostContext.svelte';
17
20
  import { getLocaleContext } from '../../i18n/localeContext.svelte';
18
21
 
19
22
  const locale = getLocaleContext();
@@ -29,6 +32,10 @@
29
32
  outputs: DiscoveredOutput[];
30
33
  /** Computed value list options keyed by the target dynamic-value-list input id. */
31
34
  dynamicOptions?: Record<string, Record<string, string>>;
35
+ /** The schema's icons and thumbnails, which value-list options point into. */
36
+ assets?: UISchema['assets'];
37
+ /** No tinted backdrop and no scroll area of its own: the container scrolls. */
38
+ bare?: boolean;
32
39
  }
33
40
 
34
41
  let {
@@ -39,11 +46,24 @@
39
46
  onValueChange,
40
47
  inputs,
41
48
  outputs,
42
- dynamicOptions = {}
49
+ dynamicOptions = {},
50
+ assets,
51
+ bare = false
43
52
  }: Props = $props();
44
53
 
54
+ const { host } = getHostContext();
55
+
56
+ // An element this host can't render is left out, not shown broken: its input still solves with
57
+ // the definition's own default. A group left with nothing to show goes too.
45
58
  const visibleGroups = $derived(
46
- tab.groups.filter((group) => evaluateGroupVisibility(group, values))
59
+ tab.groups
60
+ .filter((group) => evaluateGroupVisibility(group, values))
61
+ .flatMap((group) => {
62
+ const items = group.items.filter((item) =>
63
+ isSupportedOn(host, layoutItemKind(item, inputs))
64
+ );
65
+ return items.length > 0 || group.items.length === 0 ? [{ ...group, items }] : [];
66
+ })
47
67
  );
48
68
 
49
69
  function getInputById(paramId: string): SchemaInput | undefined {
@@ -68,6 +88,8 @@
68
88
  onChange={onValueChange}
69
89
  disabled={visibility.disabled}
70
90
  dynamicOptions={dynamicOptions[input.id]}
91
+ paramType={input.paramType}
92
+ {assets}
71
93
  />
72
94
  {/if}
73
95
  {/snippet}
@@ -83,60 +105,44 @@
83
105
  {/if}
84
106
  {/snippet}
85
107
 
86
- <Tabs.Content value={tab.id} class="min-h-0 p-0 flex-1">
87
- <ScrollArea class="h-full" orientation="vertical">
88
- <div class="p-4 tab-content-container">
89
- {#if visibleGroups.length === 0}
90
- <StateDisplay type="empty" size="medium" message={t.tabNoGroups} />
91
- {:else}
92
- <div class="gap-8 flex flex-col">
93
- {#each visibleGroups as group (group.id)}
94
- <Group
95
- label={group.label}
96
- description={group.description}
97
- items={group.items}
98
- columns={group.columns ?? 1}
99
- collapsed={collapsedGroups[group.id] ?? false}
100
- {values}
101
- onToggle={() => onToggleGroup(group.id)}
102
- inputSnippet={renderInput}
103
- outputSnippet={renderOutput}
104
- flat={visibleGroups.length === 1}
105
- />
106
- {/each}
107
- </div>
108
- {/if}
108
+ {#snippet body()}
109
+ <div class={bare ? 'px-1' : 'px-3'}>
110
+ <!-- A heading per panel lets a screen reader jump between them; the tab, when shown,
111
+ already names it on screen. -->
112
+ <h2 class="sr-only">{tab.label}</h2>
113
+ {#if visibleGroups.length === 0}
114
+ <StateDisplay type="empty" size="medium" message={t.tabNoGroups} />
115
+ {:else}
116
+ <div class="gap-3 py-3 flex flex-col">
117
+ {#each visibleGroups as group (group.id)}
118
+ <Group
119
+ label={group.label}
120
+ description={group.description}
121
+ items={group.items}
122
+ columns={group.columns ?? 1}
123
+ collapsed={collapsedGroups[group.id] ?? false}
124
+ {values}
125
+ onToggle={() => onToggleGroup(group.id)}
126
+ inputSnippet={renderInput}
127
+ outputSnippet={renderOutput}
128
+ flat={visibleGroups.length === 1}
129
+ />
130
+ {/each}
131
+ </div>
132
+ {/if}
133
+ </div>
134
+ {/snippet}
135
+
136
+ <Tabs.Content value={tab.id} class="min-h-0">
137
+ {#if bare}
138
+ {@render body()}
139
+ {:else}
140
+ <div class="h-full bg-muted dark:bg-background">
141
+ <!-- `auto`, not the default `hover`: a hover-only bar comes and goes with the pointer,
142
+ and a host that freezes mid-solve drops the pointer state with it. -->
143
+ <ScrollArea class="h-full" orientation="vertical" type="auto">
144
+ {@render body()}
145
+ </ScrollArea>
109
146
  </div>
110
- </ScrollArea>
147
+ {/if}
111
148
  </Tabs.Content>
112
-
113
- <style>
114
- .tab-content-container {
115
- container-type: inline-size;
116
- }
117
-
118
- @container (max-width: 320px) {
119
- :global(.schema-grid) {
120
- grid-template-columns: 1fr;
121
- }
122
- }
123
- @container (min-width: 321px) and (max-width: 560px) {
124
- :global(.schema-grid) {
125
- grid-template-columns: repeat(min(2, var(--schema-cols)), minmax(0, 1fr));
126
- }
127
- }
128
-
129
- /* Fallback for browsers without container query support */
130
- @supports not (container-type: inline-size) {
131
- @media (max-width: 639px) {
132
- :global(.schema-grid) {
133
- grid-template-columns: 1fr;
134
- }
135
- }
136
- @media (min-width: 640px) and (max-width: 1023px) {
137
- :global(.schema-grid) {
138
- grid-template-columns: repeat(min(2, var(--schema-cols)), minmax(0, 1fr));
139
- }
140
- }
141
- }
142
- </style>
@@ -1,4 +1,4 @@
1
- import type { TabConfig, SchemaInput, DiscoveredOutput, SupportedTypes } from '@selvajs/schemas';
1
+ import type { TabConfig, SchemaInput, DiscoveredOutput, UISchema, SupportedTypes } from '@selvajs/schemas';
2
2
  interface Props {
3
3
  tab: TabConfig;
4
4
  values: Record<string, unknown>;
@@ -9,6 +9,10 @@ interface Props {
9
9
  outputs: DiscoveredOutput[];
10
10
  /** Computed value list options keyed by the target dynamic-value-list input id. */
11
11
  dynamicOptions?: Record<string, Record<string, string>>;
12
+ /** The schema's icons and thumbnails, which value-list options point into. */
13
+ assets?: UISchema['assets'];
14
+ /** No tinted backdrop and no scroll area of its own: the container scrolls. */
15
+ bare?: boolean;
12
16
  }
13
17
  declare const TabContent: import("svelte").Component<Props, {}, "">;
14
18
  type TabContent = ReturnType<typeof TabContent>;
@@ -15,9 +15,21 @@
15
15
  panelFilter?: 'left' | 'right';
16
16
  /** Externally request a specific tab to be active (e.g. from collapsed strip click) */
17
17
  requestedTabId?: string | null;
18
+ /**
19
+ * Drops the card frame and the tab's own scroll area, for a container that already frames
20
+ * and scrolls it (the phone drawer). Nested, the inner scroll gets only a sliver of height.
21
+ */
22
+ bare?: boolean;
18
23
  }
19
24
 
20
- let { schema, values, onValueChange, panelFilter, requestedTabId = null }: Props = $props();
25
+ let {
26
+ schema,
27
+ values,
28
+ onValueChange,
29
+ panelFilter,
30
+ requestedTabId = null,
31
+ bare = false
32
+ }: Props = $props();
21
33
 
22
34
  let activeTabId = $state('');
23
35
  let collapsedGroups = $state<Record<string, boolean>>({});
@@ -66,10 +78,10 @@
66
78
  }
67
79
  </script>
68
80
 
69
- <Card.Root class="pt-1 min-h-0 mx-1 flex flex-1 flex-col overflow-hidden">
70
- <Tabs.Root value={activeTabId} class="gap-0 min-h-0 flex flex-1 flex-col">
81
+ {#snippet tabs()}
82
+ <Tabs.Root value={activeTabId} variant="line" class="min-h-0 flex-1">
71
83
  {#if showTabBar}
72
- <TabBar tabs={visibleTabs} onTabChange={handleTabChange} />
84
+ <TabBar tabs={visibleTabs} {activeTabId} onTabChange={handleTabChange} />
73
85
  {/if}
74
86
 
75
87
  {#each visibleTabs as tab (tab.id)}
@@ -82,7 +94,17 @@
82
94
  inputs={schema.inputs}
83
95
  outputs={schema.outputs}
84
96
  {dynamicOptions}
97
+ assets={schema.assets}
98
+ {bare}
85
99
  />
86
100
  {/each}
87
101
  </Tabs.Root>
88
- </Card.Root>
102
+ {/snippet}
103
+
104
+ {#if bare}
105
+ {@render tabs()}
106
+ {:else}
107
+ <Card.Root variant="flush" class="min-h-0 flex-1">
108
+ {@render tabs()}
109
+ </Card.Root>
110
+ {/if}
@@ -7,6 +7,11 @@ interface Props {
7
7
  panelFilter?: 'left' | 'right';
8
8
  /** Externally request a specific tab to be active (e.g. from collapsed strip click) */
9
9
  requestedTabId?: string | null;
10
+ /**
11
+ * Drops the card frame and the tab's own scroll area, for a container that already frames
12
+ * and scrolls it (the phone drawer). Nested, the inner scroll gets only a sliver of height.
13
+ */
14
+ bare?: boolean;
10
15
  }
11
16
  declare const TabLayout: import("svelte").Component<Props, {}, "">;
12
17
  type TabLayout = ReturnType<typeof TabLayout>;
@@ -1,19 +1,21 @@
1
1
  <script lang="ts">
2
+ import type { Snippet } from 'svelte';
2
3
  import type { SupportedTypes } from '@selvajs/schemas';
3
4
  import { Checkbox } from '../../primitives/checkbox';
4
- import * as Field from '../../primitives/field';
5
5
 
6
6
  interface Props {
7
7
  inputId: string;
8
8
  value?: boolean;
9
9
  onChange: (value: SupportedTypes) => void;
10
10
  disabled?: boolean;
11
+ /** Rendered beside the box; must contain a label pointing at `inputId`. */
12
+ children?: Snippet;
11
13
  }
12
14
 
13
- let { inputId, value = $bindable(), onChange, disabled = false }: Props = $props();
15
+ let { inputId, value = $bindable(), onChange, disabled = false, children }: Props = $props();
14
16
  </script>
15
17
 
16
- <Field.Field orientation="horizontal">
18
+ <div class="gap-2.5 min-h-6 min-w-0 flex items-center">
17
19
  <Checkbox
18
20
  id={inputId}
19
21
  checked={typeof value === 'boolean' ? value : false}
@@ -23,7 +25,5 @@
23
25
  }}
24
26
  {disabled}
25
27
  />
26
- <Field.Label for={inputId} class="font-normal cursor-pointer text-muted-foreground">
27
- Enabled
28
- </Field.Label>
29
- </Field.Field>
28
+ {@render children?.()}
29
+ </div>
@@ -1,9 +1,12 @@
1
+ import type { Snippet } from 'svelte';
1
2
  import type { SupportedTypes } from '@selvajs/schemas';
2
3
  interface Props {
3
4
  inputId: string;
4
5
  value?: boolean;
5
6
  onChange: (value: SupportedTypes) => void;
6
7
  disabled?: boolean;
8
+ /** Rendered beside the box; must contain a label pointing at `inputId`. */
9
+ children?: Snippet;
7
10
  }
8
11
  declare const CheckboxInput: import("svelte").Component<Props, {}, "value">;
9
12
  type CheckboxInput = ReturnType<typeof CheckboxInput>;
@@ -1,17 +1,20 @@
1
1
  <script lang="ts">
2
- import type { DropdownWidgetConfig, SupportedTypes } from '@selvajs/schemas';
2
+ import type { DropdownWidgetConfig, SupportedTypes, UISchema } from '@selvajs/schemas';
3
3
  import { Checkbox } from '../../primitives/checkbox';
4
+ import { optionGlyph } from '../../../schema/option-display';
5
+ import OptionGlyph from './OptionGlyph.svelte';
4
6
  import { SvelteSet } from 'svelte/reactivity';
5
7
 
6
8
  interface Props {
7
9
  inputId: string;
8
10
  value?: string[];
9
11
  config?: DropdownWidgetConfig;
12
+ assets?: UISchema['assets'];
10
13
  onChange: (value: SupportedTypes) => void;
11
14
  disabled?: boolean;
12
15
  }
13
16
 
14
- let { inputId, value, config, onChange, disabled = false }: Props = $props();
17
+ let { inputId, value, config, assets, onChange, disabled = false }: Props = $props();
15
18
 
16
19
  const options = $derived(config?.options ?? {});
17
20
  const selected = $derived(new Set(value ?? []));
@@ -32,6 +35,7 @@
32
35
  {@const optionValue = expr ?? name}
33
36
  {@const optionId = `${inputId}-${optionValue}`}
34
37
  {@const isSelected = selected.has(optionValue)}
38
+ {@const glyph = optionGlyph(config?.optionMedia?.[name], assets)}
35
39
  <label
36
40
  for={optionId}
37
41
  class="gap-3 px-3 py-2 text-sm flex items-center transition-colors select-none hover:bg-accent/50 {isSelected
@@ -44,6 +48,7 @@
44
48
  onCheckedChange={(state) => toggle(optionValue, state === true)}
45
49
  {disabled}
46
50
  />
51
+ {#if glyph}<OptionGlyph {glyph} class="text-muted-foreground" />{/if}
47
52
  <span class="flex-1" class:font-medium={isSelected}>{name}</span>
48
53
  </label>
49
54
  {/each}
@@ -1,8 +1,9 @@
1
- import type { DropdownWidgetConfig, SupportedTypes } from '@selvajs/schemas';
1
+ import type { DropdownWidgetConfig, SupportedTypes, UISchema } from '@selvajs/schemas';
2
2
  interface Props {
3
3
  inputId: string;
4
4
  value?: string[];
5
5
  config?: DropdownWidgetConfig;
6
+ assets?: UISchema['assets'];
6
7
  onChange: (value: SupportedTypes) => void;
7
8
  disabled?: boolean;
8
9
  }
@@ -1,17 +1,19 @@
1
1
  <script lang="ts">
2
2
  interface Props {
3
+ inputId: string;
3
4
  value?: string;
4
5
  onChange: (value: string) => void;
5
6
  }
6
7
 
7
- let { value = '#000000', onChange }: Props = $props();
8
+ let { inputId, value = '#000000', onChange }: Props = $props();
8
9
  </script>
9
10
 
10
11
  <div class="gap-2 flex items-center">
11
12
  <input
13
+ id={inputId}
12
14
  type="color"
13
15
  value={value || '#000000'}
14
- class="h-9 w-12 rounded p-1 cursor-pointer border border-input bg-background"
16
+ class="h-9 w-12 rounded p-1 cursor-pointer border border-input bg-background dark:bg-input/30"
15
17
  onchange={(e) => {
16
18
  const newValue = (e.currentTarget as HTMLInputElement).value;
17
19
  onChange(newValue);
@@ -1,4 +1,5 @@
1
1
  interface Props {
2
+ inputId: string;
2
3
  value?: string;
3
4
  onChange: (value: string) => void;
4
5
  }
@@ -1,21 +1,29 @@
1
1
  <script lang="ts">
2
- import type { DropdownWidgetConfig, SupportedTypes } from '@selvajs/schemas';
2
+ import type { DropdownWidgetConfig, SupportedTypes, UISchema } from '@selvajs/schemas';
3
3
  import * as Select from '../../primitives/select';
4
+ import { optionGlyph } from '../../../schema/option-display';
5
+ import OptionGlyph from './OptionGlyph.svelte';
6
+ import { getLocaleContext } from '../../../i18n/localeContext.svelte';
4
7
 
5
8
  interface Props {
6
9
  value?: string;
7
10
  config?: DropdownWidgetConfig;
11
+ assets?: UISchema['assets'];
8
12
  onChange: (value: SupportedTypes) => void;
9
13
  disabled?: boolean;
10
14
  }
11
15
 
12
- let { value, config, onChange, disabled = false }: Props = $props();
16
+ let { value, config, assets, onChange, disabled = false }: Props = $props();
17
+
18
+ const locale = getLocaleContext();
13
19
 
14
20
  const options = $derived(config?.options || {});
15
21
  const currentValue = $derived(value || '');
16
22
  const currentLabel = $derived(
17
23
  Object.entries(options).find(([_, expr]) => expr === currentValue)?.[0] ?? currentValue
18
24
  );
25
+ const glyphOf = (name: string) => optionGlyph(config?.optionMedia?.[name], assets);
26
+ const currentGlyph = $derived(glyphOf(currentLabel));
19
27
  </script>
20
28
 
21
29
  <Select.Root
@@ -30,11 +38,18 @@
30
38
  {disabled}
31
39
  >
32
40
  <Select.Trigger class="w-full" {disabled}>
33
- {currentLabel || 'Select an option...'}
41
+ <span class="gap-2 min-w-0 flex items-center">
42
+ {#if currentGlyph}<OptionGlyph glyph={currentGlyph} />{/if}
43
+ <span class="truncate">{currentLabel || locale.messages.selectOption}</span>
44
+ </span>
34
45
  </Select.Trigger>
35
46
  <Select.Content>
36
47
  {#each Object.entries(options) as [name, expr] (name)}
37
- <Select.Item value={expr ?? name} label={name} />
48
+ {@const glyph = glyphOf(name)}
49
+ <Select.Item value={expr ?? name} label={name}>
50
+ {#if glyph}<OptionGlyph {glyph} />{/if}
51
+ {name}
52
+ </Select.Item>
38
53
  {/each}
39
54
  </Select.Content>
40
55
  </Select.Root>
@@ -1,7 +1,8 @@
1
- import type { DropdownWidgetConfig, SupportedTypes } from '@selvajs/schemas';
1
+ import type { DropdownWidgetConfig, SupportedTypes, UISchema } from '@selvajs/schemas';
2
2
  interface Props {
3
3
  value?: string;
4
4
  config?: DropdownWidgetConfig;
5
+ assets?: UISchema['assets'];
5
6
  onChange: (value: SupportedTypes) => void;
6
7
  disabled?: boolean;
7
8
  }