@selvajs/ui 6.6.0-beta.9 → 7.0.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/README.md +0 -3
  2. package/dist/components/ErrorScreen.svelte +1 -1
  3. package/dist/components/compute/AppLayout.svelte +230 -85
  4. package/dist/components/compute/AppLayout.svelte.d.ts +14 -2
  5. package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
  6. package/dist/components/compute/ComputeApp.svelte +6 -2
  7. package/dist/components/compute/ComputeApp.svelte.d.ts +1 -1
  8. package/dist/components/compute/ComputeMessagesDialog.svelte +3 -3
  9. package/dist/components/compute/ParameterPresetManager.svelte +1 -1
  10. package/dist/components/compute/SolveMessages.svelte +79 -88
  11. package/dist/components/compute/SolveMessages.svelte.d.ts +5 -0
  12. package/dist/components/layout/AppShell.svelte +2 -2
  13. package/dist/components/layout/FooterItemRenderer.svelte +2 -2
  14. package/dist/components/layout/FooterItemRenderer.svelte.d.ts +1 -1
  15. package/dist/components/layout/PageContent.svelte +3 -2
  16. package/dist/components/layout/PageFooter.svelte +9 -6
  17. package/dist/components/layout/PageHeader.svelte +3 -3
  18. package/dist/components/layout/SideNav.svelte +3 -3
  19. package/dist/components/layout/SubNav.svelte +2 -2
  20. package/dist/components/preview/ChartOutput.svelte +141 -50
  21. package/dist/components/preview/Group.svelte +9 -9
  22. package/dist/components/preview/HelpButton.svelte +1 -1
  23. package/dist/components/preview/ImageOutput.svelte +13 -10
  24. package/dist/components/preview/InputControl.svelte +13 -12
  25. package/dist/components/preview/OutputDisplay.svelte +26 -17
  26. package/dist/components/preview/TabBar.svelte +8 -6
  27. package/dist/components/preview/TabBar.svelte.d.ts +2 -0
  28. package/dist/components/preview/TabContent.svelte +8 -8
  29. package/dist/components/preview/TabLayout.svelte +6 -7
  30. package/dist/components/preview/inputs/CheckboxInput.svelte +1 -1
  31. package/dist/components/preview/inputs/ChecklistInput.svelte +5 -5
  32. package/dist/components/preview/inputs/ColorInput.svelte +356 -14
  33. package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
  34. package/dist/components/preview/inputs/DropdownInput.svelte +3 -3
  35. package/dist/components/preview/inputs/FileInput.svelte +17 -12
  36. package/dist/components/preview/inputs/GeometryInput.svelte +4 -4
  37. package/dist/components/preview/inputs/GeometryInput.svelte.d.ts +1 -1
  38. package/dist/components/preview/inputs/NumberInput.svelte +8 -8
  39. package/dist/components/preview/inputs/OptionGlyph.svelte +1 -1
  40. package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +1 -1
  41. package/dist/components/preview/inputs/SegmentedInput.svelte +3 -2
  42. package/dist/components/preview/inputs/TextInput.svelte +5 -5
  43. package/dist/components/preview/inputs/TileInput.svelte +8 -5
  44. package/dist/components/primitives/CalculateButton.svelte +10 -4
  45. package/dist/components/primitives/Callout.svelte +8 -6
  46. package/dist/components/primitives/Callout.svelte.d.ts +4 -4
  47. package/dist/components/primitives/DataTable.svelte +1 -1
  48. package/dist/components/primitives/FilterableDropdown.svelte +13 -1
  49. package/dist/components/primitives/FilterableDropdown.svelte.d.ts +5 -0
  50. package/dist/components/primitives/ImageUploadField.svelte +1 -1
  51. package/dist/components/primitives/SolvingIndicator.svelte +242 -41
  52. package/dist/components/primitives/SolvingIndicator.svelte.d.ts +13 -5
  53. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  54. package/dist/components/primitives/badge/badge.svelte +2 -2
  55. package/dist/components/primitives/badge/badge.svelte.d.ts +6 -6
  56. package/dist/components/primitives/button/button.svelte +7 -8
  57. package/dist/components/primitives/button/button.svelte.d.ts +19 -19
  58. package/dist/components/primitives/card/card.svelte +1 -1
  59. package/dist/components/primitives/card/card.svelte.d.ts +1 -1
  60. package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
  61. package/dist/components/primitives/command/command-input.svelte +1 -1
  62. package/dist/components/primitives/command/command-item.svelte +1 -1
  63. package/dist/components/primitives/command/command-link-item.svelte +1 -1
  64. package/dist/components/primitives/command/command.svelte +1 -1
  65. package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
  66. package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
  67. package/dist/components/primitives/context-menu/context-menu-item.svelte +1 -1
  68. package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
  69. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  70. package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
  71. package/dist/components/primitives/dialog/dialog-content.svelte +3 -3
  72. package/dist/components/primitives/drawer/Drawer.svelte +1 -1
  73. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
  74. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +2 -0
  75. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
  76. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +2 -0
  77. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
  78. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +2 -1
  79. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  80. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  81. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  82. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  83. package/dist/components/primitives/index.d.ts +1 -1
  84. package/dist/components/primitives/index.js +1 -1
  85. package/dist/components/primitives/input/input.svelte +2 -2
  86. package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +1 -1
  87. package/dist/components/primitives/input-group/input-group.svelte +1 -1
  88. package/dist/components/primitives/mode-toggle/mode-toggle.svelte +2 -2
  89. package/dist/components/primitives/popover/popover-content.svelte +1 -1
  90. package/dist/components/primitives/resizable/resizable-handle.svelte +2 -2
  91. package/dist/components/primitives/search/search.svelte +1 -1
  92. package/dist/components/primitives/select/select-content.svelte +1 -1
  93. package/dist/components/primitives/select/select-item.svelte +1 -1
  94. package/dist/components/primitives/select/select-trigger.svelte +1 -1
  95. package/dist/components/primitives/slider/slider.svelte +1 -1
  96. package/dist/components/primitives/switch/switch.svelte +1 -1
  97. package/dist/components/primitives/tabs/tabs-list.svelte +2 -2
  98. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +6 -6
  99. package/dist/components/primitives/tabs/tabs-trigger.svelte +2 -2
  100. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +6 -6
  101. package/dist/components/primitives/textarea/textarea.svelte +1 -1
  102. package/dist/components/primitives/toggle/toggle.svelte +8 -2
  103. package/dist/components/primitives/toggle/toggle.svelte.d.ts +10 -4
  104. package/dist/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
  105. package/dist/components/primitives/toggle-group/toggle-group.svelte +1 -1
  106. package/dist/components/primitives/tooltip/index.d.ts +6 -0
  107. package/dist/components/primitives/tooltip/index.js +8 -0
  108. package/dist/components/primitives/tooltip/tooltip-content.svelte +34 -0
  109. package/dist/components/primitives/tooltip/tooltip-content.svelte.d.ts +10 -0
  110. package/dist/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  111. package/dist/components/primitives/tooltip/tooltip-portal.svelte.d.ts +4 -0
  112. package/dist/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  113. package/dist/components/primitives/tooltip/tooltip-provider.svelte.d.ts +4 -0
  114. package/dist/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  115. package/dist/components/primitives/tooltip/tooltip-trigger.svelte.d.ts +4 -0
  116. package/dist/components/primitives/tooltip/tooltip.svelte +7 -0
  117. package/dist/components/primitives/tooltip/tooltip.svelte.d.ts +4 -0
  118. package/dist/components/viewer/MeshMetadataPanel.svelte +2 -2
  119. package/dist/components/viewer/SceneManager.svelte +32 -21
  120. package/dist/components/viewer/SceneManager.svelte.d.ts +3 -1
  121. package/dist/components/viewer/Viewer.svelte +128 -178
  122. package/dist/components/viewer/Viewer.svelte.d.ts +7 -2
  123. package/dist/components/viewer/ViewerDock.svelte +452 -0
  124. package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
  125. package/dist/composables/useFooterItem.svelte.d.ts +1 -1
  126. package/dist/composables/useFooterItem.svelte.js +1 -1
  127. package/dist/compute/liveProgress.svelte.d.ts +16 -0
  128. package/dist/compute/liveProgress.svelte.js +90 -0
  129. package/dist/compute/solving.svelte.d.ts +7 -9
  130. package/dist/compute/solving.svelte.js +56 -48
  131. package/dist/constants.d.ts +6 -8
  132. package/dist/constants.js +8 -11
  133. package/dist/contexts/hostContext.svelte.d.ts +1 -1
  134. package/dist/features/chart/plotly-compat.d.ts +15 -0
  135. package/dist/features/chart/plotly-compat.js +124 -0
  136. package/dist/i18n/messages.d.ts +17 -0
  137. package/dist/i18n/messages.js +26 -0
  138. package/dist/index.d.ts +2 -0
  139. package/dist/index.js +2 -0
  140. package/dist/public.d.ts +1 -0
  141. package/dist/public.js +1 -0
  142. package/dist/schema/visibility-rules.d.ts +7 -1
  143. package/dist/schema/visibility-rules.js +17 -0
  144. package/dist/styles/base.css +100 -86
  145. package/dist/utils/color-space.d.ts +21 -0
  146. package/dist/utils/color-space.js +90 -0
  147. package/package.json +31 -23
  148. package/src/lib/components/ErrorScreen.svelte +1 -1
  149. package/src/lib/components/compute/AppLayout.svelte +231 -86
  150. package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
  151. package/src/lib/components/compute/ComputeApp.svelte +6 -2
  152. package/src/lib/components/compute/ComputeMessagesDialog.svelte +4 -4
  153. package/src/lib/components/compute/ParameterPresetManager.svelte +1 -1
  154. package/src/lib/components/compute/SolveMessages.svelte +81 -90
  155. package/src/lib/components/layout/AppShell.svelte +2 -2
  156. package/src/lib/components/layout/FooterItemRenderer.svelte +2 -2
  157. package/src/lib/components/layout/PageContent.svelte +3 -2
  158. package/src/lib/components/layout/PageFooter.svelte +9 -6
  159. package/src/lib/components/layout/PageHeader.svelte +3 -3
  160. package/src/lib/components/layout/SideNav.svelte +4 -4
  161. package/src/lib/components/layout/SubNav.svelte +2 -2
  162. package/src/lib/components/preview/ChartOutput.svelte +141 -50
  163. package/src/lib/components/preview/Group.svelte +9 -9
  164. package/src/lib/components/preview/HelpButton.svelte +1 -1
  165. package/src/lib/components/preview/ImageOutput.svelte +13 -10
  166. package/src/lib/components/preview/InputControl.svelte +13 -12
  167. package/src/lib/components/preview/OutputDisplay.svelte +26 -17
  168. package/src/lib/components/preview/TabBar.svelte +8 -6
  169. package/src/lib/components/preview/TabContent.svelte +8 -8
  170. package/src/lib/components/preview/TabLayout.svelte +6 -7
  171. package/src/lib/components/preview/inputs/CheckboxInput.svelte +1 -1
  172. package/src/lib/components/preview/inputs/ChecklistInput.svelte +5 -5
  173. package/src/lib/components/preview/inputs/ColorInput.svelte +356 -14
  174. package/src/lib/components/preview/inputs/DropdownInput.svelte +3 -3
  175. package/src/lib/components/preview/inputs/FileInput.svelte +17 -12
  176. package/src/lib/components/preview/inputs/GeometryInput.svelte +4 -4
  177. package/src/lib/components/preview/inputs/NumberInput.svelte +8 -8
  178. package/src/lib/components/preview/inputs/OptionGlyph.svelte +2 -2
  179. package/src/lib/components/preview/inputs/SegmentedInput.svelte +3 -2
  180. package/src/lib/components/preview/inputs/TextInput.svelte +5 -5
  181. package/src/lib/components/preview/inputs/TileInput.svelte +8 -5
  182. package/src/lib/components/primitives/CalculateButton.svelte +10 -4
  183. package/src/lib/components/primitives/Callout.svelte +9 -7
  184. package/src/lib/components/primitives/DataTable.svelte +1 -1
  185. package/src/lib/components/primitives/FilterableDropdown.svelte +14 -2
  186. package/src/lib/components/primitives/ImageUploadField.svelte +1 -1
  187. package/src/lib/components/primitives/IssueList.svelte +1 -1
  188. package/src/lib/components/primitives/SeverityIcon.svelte +1 -1
  189. package/src/lib/components/primitives/SolvingIndicator.svelte +242 -41
  190. package/src/lib/components/primitives/StateDisplay.svelte +1 -1
  191. package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +2 -2
  192. package/src/lib/components/primitives/alert-dialog/alert-dialog-cancel.svelte +2 -2
  193. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +2 -2
  194. package/src/lib/components/primitives/alert-dialog/alert-dialog-description.svelte +1 -1
  195. package/src/lib/components/primitives/alert-dialog/alert-dialog-footer.svelte +1 -1
  196. package/src/lib/components/primitives/alert-dialog/alert-dialog-header.svelte +1 -1
  197. package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
  198. package/src/lib/components/primitives/alert-dialog/alert-dialog-title.svelte +1 -1
  199. package/src/lib/components/primitives/badge/badge.svelte +3 -3
  200. package/src/lib/components/primitives/button/button.svelte +7 -8
  201. package/src/lib/components/primitives/button-group/button-group-separator.svelte +2 -2
  202. package/src/lib/components/primitives/button-group/button-group-text.svelte +1 -1
  203. package/src/lib/components/primitives/button-group/button-group.svelte +1 -1
  204. package/src/lib/components/primitives/card/card-content.svelte +1 -1
  205. package/src/lib/components/primitives/card/card-description.svelte +1 -1
  206. package/src/lib/components/primitives/card/card-footer.svelte +1 -1
  207. package/src/lib/components/primitives/card/card-header.svelte +1 -1
  208. package/src/lib/components/primitives/card/card-title.svelte +1 -1
  209. package/src/lib/components/primitives/card/card.svelte +2 -2
  210. package/src/lib/components/primitives/checkbox/checkbox.svelte +2 -2
  211. package/src/lib/components/primitives/command/command-dialog.svelte +2 -2
  212. package/src/lib/components/primitives/command/command-empty.svelte +1 -1
  213. package/src/lib/components/primitives/command/command-group.svelte +1 -1
  214. package/src/lib/components/primitives/command/command-input.svelte +3 -3
  215. package/src/lib/components/primitives/command/command-item.svelte +2 -2
  216. package/src/lib/components/primitives/command/command-link-item.svelte +2 -2
  217. package/src/lib/components/primitives/command/command-list.svelte +1 -1
  218. package/src/lib/components/primitives/command/command-separator.svelte +1 -1
  219. package/src/lib/components/primitives/command/command-shortcut.svelte +1 -1
  220. package/src/lib/components/primitives/command/command.svelte +2 -2
  221. package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +2 -2
  222. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +2 -2
  223. package/src/lib/components/primitives/context-menu/context-menu-group-heading.svelte +1 -1
  224. package/src/lib/components/primitives/context-menu/context-menu-item.svelte +2 -2
  225. package/src/lib/components/primitives/context-menu/context-menu-label.svelte +1 -1
  226. package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +2 -2
  227. package/src/lib/components/primitives/context-menu/context-menu-separator.svelte +1 -1
  228. package/src/lib/components/primitives/context-menu/context-menu-shortcut.svelte +1 -1
  229. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +2 -2
  230. package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +2 -2
  231. package/src/lib/components/primitives/dialog/dialog-content.svelte +4 -4
  232. package/src/lib/components/primitives/dialog/dialog-description.svelte +1 -1
  233. package/src/lib/components/primitives/dialog/dialog-footer.svelte +1 -1
  234. package/src/lib/components/primitives/dialog/dialog-header.svelte +1 -1
  235. package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
  236. package/src/lib/components/primitives/dialog/dialog-title.svelte +1 -1
  237. package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
  238. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +32 -12
  239. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +6 -2
  240. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
  241. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +5 -3
  242. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +1 -1
  243. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +2 -2
  244. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +1 -1
  245. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +2 -2
  246. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +2 -2
  247. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
  248. package/src/lib/components/primitives/empty/empty-content.svelte +1 -1
  249. package/src/lib/components/primitives/empty/empty-description.svelte +1 -1
  250. package/src/lib/components/primitives/empty/empty-header.svelte +1 -1
  251. package/src/lib/components/primitives/empty/empty-media.svelte +1 -1
  252. package/src/lib/components/primitives/empty/empty-title.svelte +1 -1
  253. package/src/lib/components/primitives/empty/empty.svelte +1 -1
  254. package/src/lib/components/primitives/field/field-content.svelte +1 -1
  255. package/src/lib/components/primitives/field/field-description.svelte +1 -1
  256. package/src/lib/components/primitives/field/field-error.svelte +1 -1
  257. package/src/lib/components/primitives/field/field-group.svelte +1 -1
  258. package/src/lib/components/primitives/field/field-label.svelte +2 -2
  259. package/src/lib/components/primitives/field/field-legend.svelte +1 -1
  260. package/src/lib/components/primitives/field/field-separator.svelte +2 -2
  261. package/src/lib/components/primitives/field/field-set.svelte +1 -1
  262. package/src/lib/components/primitives/field/field-title.svelte +1 -1
  263. package/src/lib/components/primitives/field/field.svelte +1 -1
  264. package/src/lib/components/primitives/index.ts +1 -1
  265. package/src/lib/components/primitives/input/input.svelte +3 -3
  266. package/src/lib/components/primitives/input-group/input-group-addon.svelte +1 -1
  267. package/src/lib/components/primitives/input-group/input-group-button.svelte +2 -2
  268. package/src/lib/components/primitives/input-group/input-group-input.svelte +2 -2
  269. package/src/lib/components/primitives/input-group/input-group-text.svelte +1 -1
  270. package/src/lib/components/primitives/input-group/input-group-textarea.svelte +2 -2
  271. package/src/lib/components/primitives/input-group/input-group.svelte +2 -2
  272. package/src/lib/components/primitives/label/label.svelte +1 -1
  273. package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +2 -2
  274. package/src/lib/components/primitives/popover/popover-content.svelte +2 -2
  275. package/src/lib/components/primitives/popover/popover-description.svelte +1 -1
  276. package/src/lib/components/primitives/popover/popover-header.svelte +1 -1
  277. package/src/lib/components/primitives/popover/popover-title.svelte +1 -1
  278. package/src/lib/components/primitives/popover/popover-trigger.svelte +1 -1
  279. package/src/lib/components/primitives/resizable/resizable-handle.svelte +3 -3
  280. package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -1
  281. package/src/lib/components/primitives/scroll-area/scroll-area-scrollbar.svelte +1 -1
  282. package/src/lib/components/primitives/scroll-area/scroll-area.svelte +1 -1
  283. package/src/lib/components/primitives/search/search.svelte +2 -2
  284. package/src/lib/components/primitives/select/select-content.svelte +2 -2
  285. package/src/lib/components/primitives/select/select-group-heading.svelte +1 -1
  286. package/src/lib/components/primitives/select/select-item.svelte +2 -2
  287. package/src/lib/components/primitives/select/select-label.svelte +1 -1
  288. package/src/lib/components/primitives/select/select-scroll-down-button.svelte +1 -1
  289. package/src/lib/components/primitives/select/select-scroll-up-button.svelte +1 -1
  290. package/src/lib/components/primitives/select/select-separator.svelte +2 -2
  291. package/src/lib/components/primitives/select/select-trigger.svelte +2 -2
  292. package/src/lib/components/primitives/separator/separator.svelte +1 -1
  293. package/src/lib/components/primitives/slider/slider.svelte +2 -2
  294. package/src/lib/components/primitives/spinner/spinner.svelte +1 -1
  295. package/src/lib/components/primitives/switch/switch.svelte +2 -2
  296. package/src/lib/components/primitives/tabs/tabs-content.svelte +1 -1
  297. package/src/lib/components/primitives/tabs/tabs-list.svelte +3 -3
  298. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +3 -3
  299. package/src/lib/components/primitives/tabs/tabs.svelte +1 -1
  300. package/src/lib/components/primitives/textarea/textarea.svelte +2 -2
  301. package/src/lib/components/primitives/toggle/toggle.svelte +9 -3
  302. package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +3 -3
  303. package/src/lib/components/primitives/toggle-group/toggle-group.svelte +3 -3
  304. package/src/lib/components/primitives/tooltip/index.ts +19 -0
  305. package/src/lib/components/primitives/tooltip/tooltip-content.svelte +34 -0
  306. package/src/lib/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  307. package/src/lib/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  308. package/src/lib/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  309. package/src/lib/components/primitives/tooltip/tooltip.svelte +7 -0
  310. package/src/lib/components/viewer/MeshMetadataPanel.svelte +2 -2
  311. package/src/lib/components/viewer/SceneManager.svelte +32 -21
  312. package/src/lib/components/viewer/Viewer.svelte +129 -179
  313. package/src/lib/components/viewer/ViewerDock.svelte +452 -0
  314. package/src/lib/composables/useFooterItem.svelte.ts +1 -1
  315. package/src/lib/compute/liveProgress.svelte.ts +103 -0
  316. package/src/lib/compute/solving.svelte.ts +56 -55
  317. package/src/lib/constants.ts +8 -11
  318. package/src/lib/contexts/hostContext.svelte.ts +1 -1
  319. package/src/lib/features/chart/plotly-compat.ts +141 -0
  320. package/src/lib/i18n/messages.ts +43 -0
  321. package/src/lib/index.ts +2 -0
  322. package/src/lib/public.ts +1 -0
  323. package/src/lib/schema/visibility-rules.ts +27 -1
  324. package/src/lib/styles/base.css +100 -86
  325. package/src/lib/utils/color-space.ts +107 -0
  326. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  327. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +0 -3
  328. package/dist/components/primitives/theme-switcher/index.d.ts +0 -1
  329. package/dist/components/primitives/theme-switcher/index.js +0 -1
  330. package/dist/styles/themes/cyberpunk.css +0 -98
  331. package/dist/styles/themes/neutral.css +0 -72
  332. package/dist/styles/themes/ocean.css +0 -75
  333. package/dist/styles/themes/selva.css +0 -105
  334. package/dist/theme/themeStore.svelte.d.ts +0 -12
  335. package/dist/theme/themeStore.svelte.js +0 -40
  336. package/dist/theme/themes.d.ts +0 -5
  337. package/dist/theme/themes.js +0 -13
  338. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  339. package/src/lib/components/primitives/theme-switcher/index.ts +0 -1
  340. package/src/lib/styles/themes/cyberpunk.css +0 -98
  341. package/src/lib/styles/themes/neutral.css +0 -72
  342. package/src/lib/styles/themes/ocean.css +0 -75
  343. package/src/lib/styles/themes/selva.css +0 -105
  344. package/src/lib/theme/themeStore.svelte.ts +0 -50
  345. package/src/lib/theme/themes.ts +0 -18
@@ -2,91 +2,92 @@ import { untrack } from 'svelte';
2
2
  import { APP_DEFAULTS } from '../constants';
3
3
 
4
4
  /**
5
- * Adaptive solving indicator: measures solve durations and adjusts its
6
- * visibility delay from the running average.
7
- *
8
- * - Average under FAST_THRESHOLD_MS: never shown, so quick solves don't flicker
9
- * - Average over SLOW_THRESHOLD_MS: shown immediately
10
- * - Between the two: shown after a proportional slice of ANIMATION_DELAY
11
- * - First solve: shown immediately, there is no history yet
5
+ * When to show that a solve is running. A solve that ends within `SHOW_AFTER_MS` shows nothing:
6
+ * the result updating is feedback enough, and a spinner that flashes for a frame reads as jank.
7
+ * Once shown, the indicator stays `MIN_VISIBLE_MS` for the same reason. `slow` turns on past
8
+ * `SLOW_AFTER_MS`, the case of a Rhino.Compute round trip or a heavy definition.
12
9
  *
13
10
  * `freezesDuringSolve` is for a host that can't paint while it solves (an embedded WebView on
14
- * the solver's thread). There the indicator has to be on screen before the solve starts, when its
15
- * length is still unknown, so it follows `isSolving` exactly: no history, no delay.
11
+ * the solver's thread). A delay can't run there, so the indicator shows on every solve, before
12
+ * the solve takes the thread: it is the only place that host can say Esc aborts.
16
13
  */
17
14
  export function createSolvingIndicator(
18
15
  isSolving: () => boolean,
19
16
  options: { freezesDuringSolve?: boolean } = {}
20
- ): { readonly show: boolean } {
17
+ ): { readonly show: boolean; readonly slow: boolean } {
18
+ const { SHOW_AFTER_MS, MIN_VISIBLE_MS, SLOW_AFTER_MS } = APP_DEFAULTS.SOLVING_INDICATOR;
19
+
21
20
  if (options.freezesDuringSolve) {
22
21
  return {
22
+ // Read straight from `isSolving`, not through an effect: an effect would run a tick
23
+ // later, after the solve has already frozen the page.
23
24
  get show() {
24
25
  return isSolving();
25
- }
26
+ },
27
+ slow: false
26
28
  };
27
29
  }
28
30
 
29
- const { FAST_THRESHOLD_MS, SLOW_THRESHOLD_MS, HISTORY_SIZE, ANIMATION_DELAY } =
30
- APP_DEFAULTS.SOLVING_INDICATOR;
31
-
32
31
  let show = $state(false);
33
- let timeout: ReturnType<typeof setTimeout> | null = null;
34
- let solveStartTime: number | null = null;
35
- const solveHistory: number[] = [];
32
+ let slow = $state(false);
33
+ let shownAt = 0;
34
+ let showTimer: ReturnType<typeof setTimeout> | null = null;
35
+ let slowTimer: ReturnType<typeof setTimeout> | null = null;
36
+ let hideTimer: ReturnType<typeof setTimeout> | null = null;
37
+
38
+ function clear(timer: ReturnType<typeof setTimeout> | null) {
39
+ if (timer) clearTimeout(timer);
40
+ return null;
41
+ }
42
+
43
+ function hide() {
44
+ hideTimer = null;
45
+ show = false;
46
+ slow = false;
47
+ }
36
48
 
37
49
  $effect(() => {
38
50
  const solving = isSolving();
39
-
40
51
  untrack(() => {
41
52
  if (solving) {
42
- solveStartTime = performance.now();
43
-
44
- const avg =
45
- solveHistory.length === 0
46
- ? Infinity
47
- : solveHistory.reduce((a, b) => a + b, 0) / solveHistory.length;
48
-
49
- if (solveHistory.length > 0 && avg < FAST_THRESHOLD_MS) return;
50
-
51
- const delay =
52
- avg === Infinity || avg >= SLOW_THRESHOLD_MS
53
- ? 0
54
- : ((avg - FAST_THRESHOLD_MS) / (SLOW_THRESHOLD_MS - FAST_THRESHOLD_MS)) *
55
- ANIMATION_DELAY;
56
-
57
- if (!timeout) {
58
- if (delay === 0) {
53
+ // A solve that starts while the last one's indicator is held keeps it up.
54
+ hideTimer = clear(hideTimer);
55
+ if (!show) {
56
+ showTimer ??= setTimeout(() => {
57
+ showTimer = null;
59
58
  show = true;
60
- } else {
61
- timeout = setTimeout(() => {
62
- show = true;
63
- timeout = null;
64
- }, delay);
65
- }
59
+ shownAt = performance.now();
60
+ }, SHOW_AFTER_MS);
66
61
  }
62
+ slowTimer ??= setTimeout(() => {
63
+ slowTimer = null;
64
+ slow = true;
65
+ }, SLOW_AFTER_MS);
67
66
  } else {
68
- if (solveStartTime !== null) {
69
- solveHistory.push(performance.now() - solveStartTime);
70
- if (solveHistory.length > HISTORY_SIZE) solveHistory.shift();
71
- solveStartTime = null;
72
- }
73
-
74
- if (timeout) {
75
- clearTimeout(timeout);
76
- timeout = null;
77
- }
78
- show = false;
67
+ showTimer = clear(showTimer);
68
+ slowTimer = clear(slowTimer);
69
+ if (!show) return;
70
+ const remaining = MIN_VISIBLE_MS - (performance.now() - shownAt);
71
+ if (remaining > 0) hideTimer ??= setTimeout(hide, remaining);
72
+ else hide();
79
73
  }
80
74
  });
75
+ });
81
76
 
82
- return () => {
83
- if (timeout) clearTimeout(timeout);
84
- };
77
+ // Separate from the effect above: a cleanup there would run on every `isSolving` flip and
78
+ // cancel the timers it just set.
79
+ $effect(() => () => {
80
+ clear(showTimer);
81
+ clear(slowTimer);
82
+ clear(hideTimer);
85
83
  });
86
84
 
87
85
  return {
88
86
  get show() {
89
87
  return show;
88
+ },
89
+ get slow() {
90
+ return slow;
90
91
  }
91
92
  };
92
93
  }
@@ -1,8 +1,7 @@
1
1
  export const APP_DEFAULTS = {
2
2
  // File upload limits
3
3
  // TEMP (dev): raised 150 MB → 300 MB so large dev file-widget inputs aren't
4
- // blocked client-side. The server request cap (COMPUTE_REQUEST_MAX_BYTES)
5
- // still defaults to 256 MB, and base64 inflates a raw file by ~4/3, so
4
+ // blocked client-side. The server request cap is 256 MB, and base64 inflates a raw file by ~4/3, so
6
5
  // anything over ~192 MB is rejected with a 413 after the client accepts it.
7
6
  // Revert to 150 before release.
8
7
  FILE_UPLOAD: {
@@ -18,16 +17,14 @@ export const APP_DEFAULTS = {
18
17
  DRAWER_ANIMATION_MS: 350
19
18
  },
20
19
 
21
- // Solving indicator adaptive thresholds
20
+ // See createSolvingIndicator.
22
21
  SOLVING_INDICATOR: {
23
- /** If solve is faster than this, don't show indicator (ms) */
24
- FAST_THRESHOLD_MS: 200,
25
- /** If solve is slower than this, show indicator immediately (ms) */
26
- SLOW_THRESHOLD_MS: 600,
27
- /** Animation delay for solve indicator (ms) */
28
- ANIMATION_DELAY: 300,
29
- /** Number of solve durations to keep in history for averaging */
30
- HISTORY_SIZE: 3
22
+ /** A solve that ends sooner shows no indicator (ms) */
23
+ SHOW_AFTER_MS: 400,
24
+ /** Once shown, the indicator stays at least this long (ms) */
25
+ MIN_VISIBLE_MS: 500,
26
+ /** Past this a solve counts as slow and the viewer dims its stale result (ms) */
27
+ SLOW_AFTER_MS: 2000
31
28
  },
32
29
 
33
30
  // File size formatting
@@ -1,6 +1,6 @@
1
1
  import { getContext, setContext } from 'svelte';
2
2
  import type { GeometryKind } from '@selvajs/schemas';
3
- import type { UIHost } from '$lib/schema/host-support';
3
+ import type { UIHost } from '#lib/schema/host-support.js';
4
4
 
5
5
  // Tells InputControl which host it renders in and how to reach the host's own actions, without
6
6
  // threading a prop through every layout layer. Without a provider the host is Selva.
@@ -0,0 +1,141 @@
1
+ import { hsvToRgb } from '#lib/utils/color-space.js';
2
+
3
+ // ============================================================================
4
+ // Plotly 3 → 4 figure compatibility
5
+ // ============================================================================
6
+ //
7
+ // Chart outputs come from whatever plugin version solved them, often one written against
8
+ // Plotly 3. This rewrites the parts Plotly 4 draws differently or rejects, so those figures
9
+ // keep their look. Figures that are already compatible pass through unchanged.
10
+
11
+ type Json = Record<string, unknown>;
12
+
13
+ export interface PlotlyFigure {
14
+ data: Json[];
15
+ layout?: Json;
16
+ config?: Json;
17
+ frames?: Json[];
18
+ }
19
+
20
+ const REMOVED_MAP_TRACES: Record<string, string> = {
21
+ scattermapbox: 'scattermap',
22
+ choroplethmapbox: 'choroplethmap',
23
+ densitymapbox: 'densitymap'
24
+ };
25
+
26
+ const MAPBOX_SUBPLOT = /^mapbox(\d*)$/;
27
+ const BARE_HEX = /^(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
28
+ const HSV_FUNCTION =
29
+ /^hsva?[\s(]+([-+\d.]+)%?[\s,]+([\d.]+)(%?)[\s,]+([\d.]+)(%?)(?:[\s,/]+([\d.]+)(%?))?[\s)]*$/i;
30
+
31
+ const isObject = (v: unknown): v is Json =>
32
+ typeof v === 'object' && v !== null && !Array.isArray(v);
33
+
34
+ /** Returns a rewritten copy; the input is not modified. */
35
+ export function upgradePlotlyFigure(figure: PlotlyFigure): PlotlyFigure {
36
+ const out = structuredClone(figure);
37
+ const layout = out.layout ?? {};
38
+ normalizeColors(layout);
39
+
40
+ let migratedMaps = false;
41
+ for (const trace of out.data ?? []) {
42
+ if (!isObject(trace)) continue;
43
+ normalizeColors(trace);
44
+
45
+ const replacement = REMOVED_MAP_TRACES[trace.type as string];
46
+ if (replacement) {
47
+ trace.type = replacement;
48
+ if (typeof trace.subplot === 'string')
49
+ trace.subplot = trace.subplot.replace(MAPBOX_SUBPLOT, 'map$1');
50
+ migratedMaps = true;
51
+ } else if (trace.type === 'splom') {
52
+ keepSplomAxesUnlinked(trace);
53
+ }
54
+ }
55
+
56
+ if (migratedMaps) migrateMapLayout(layout);
57
+ // Frame data replaces trace data during playback, so it needs the same colour fixes.
58
+ for (const frame of out.frames ?? []) if (isObject(frame)) normalizeColors(frame);
59
+ return { ...out, layout };
60
+ }
61
+
62
+ // Plotly 4 links each dimension's x and y axes by default.
63
+ function keepSplomAxesUnlinked(trace: Json) {
64
+ if (!Array.isArray(trace.dimensions)) return;
65
+ for (const dim of trace.dimensions) {
66
+ if (!isObject(dim)) continue;
67
+ const axis = isObject(dim.axis) ? dim.axis : (dim.axis = {});
68
+ if (!('matches' in axis)) axis.matches = false;
69
+ }
70
+ }
71
+
72
+ function migrateMapLayout(layout: Json) {
73
+ for (const key of Object.keys(layout)) {
74
+ const match = MAPBOX_SUBPLOT.exec(key);
75
+ if (!match) continue;
76
+
77
+ const map = layout[key];
78
+ delete layout[key];
79
+ const newKey = `map${match[1]}`;
80
+ if (newKey in layout || !isObject(map)) continue;
81
+
82
+ delete map.accesstoken;
83
+ // Stamen and mapbox:// styles have no map equivalent.
84
+ if (typeof map.style === 'string' && /^(stamen|mapbox:\/\/)/.test(map.style))
85
+ map.style = 'open-street-map';
86
+ layout[newKey] = map;
87
+ }
88
+ }
89
+
90
+ // Plotly attributes that hold colours: *color, colorway, colorscale and pie's marker.colors.
91
+ const isColorKey = (key: string) =>
92
+ key.toLowerCase().endsWith('color') ||
93
+ key === 'colors' ||
94
+ key === 'colorway' ||
95
+ key === 'colorscale';
96
+
97
+ function normalizeColors(props: Json) {
98
+ for (const [key, value] of Object.entries(props)) {
99
+ if (isColorKey(key)) props[key] = normalizeColorValue(value, false);
100
+ else if (isObject(value)) normalizeColors(value);
101
+ else if (Array.isArray(value))
102
+ for (const item of value) if (isObject(item)) normalizeColors(item);
103
+ }
104
+ }
105
+
106
+ // Covers a single colour, a per-point list and colorscale stops ([[0, "ff0000"], ...]).
107
+ function normalizeColorValue(value: unknown, inList: boolean): unknown {
108
+ if (Array.isArray(value)) return value.map((v) => normalizeColorValue(v, true));
109
+ if (typeof value !== 'string') return value;
110
+ // Plotly reads numeric strings in a per-point list as numbers for the colorscale.
111
+ if (inList && /^\s*\d+\s*$/.test(value)) return value;
112
+ return normalizePlotlyColor(value);
113
+ }
114
+
115
+ /**
116
+ * Rewrites colour spellings Plotly 3 accepted but Plotly 4 rejects (hex without `#`, `hsv()`)
117
+ * into valid CSS. Anything else is returned unchanged.
118
+ */
119
+ export function normalizePlotlyColor(color: string): string {
120
+ const value = color.trim();
121
+ if (BARE_HEX.test(value)) return `#${value}`;
122
+
123
+ const hsv = HSV_FUNCTION.exec(value);
124
+ if (!hsv) return color;
125
+
126
+ const { r, g, b } = hsvToRgb({
127
+ h: Number(hsv[1]),
128
+ s: unit(hsv[2], hsv[3] === '%'),
129
+ v: unit(hsv[4], hsv[5] === '%')
130
+ });
131
+ const rgb = `${Math.round(r)},${Math.round(g)},${Math.round(b)}`;
132
+ if (hsv[6] === undefined) return `rgb(${rgb})`;
133
+ return `rgba(${rgb},${+unit(hsv[6], hsv[7] === '%').toFixed(3)})`;
134
+ }
135
+
136
+ // Plotly 3 (TinyColor) read 0..1 as a fraction and anything above 1 as a percentage.
137
+ function unit(s: string, percent: boolean): number {
138
+ let x = Number(s);
139
+ if (percent || x > 1) x /= 100;
140
+ return Math.min(1, Math.max(0, x));
141
+ }
@@ -40,6 +40,8 @@ export interface ViewerMessages {
40
40
  lookTechnical: string;
41
41
  lookStudio: string;
42
42
  lookShowcase: string;
43
+ lookNight: string;
44
+ nightMode: string;
43
45
  lookArctic: string;
44
46
  lookXray: string;
45
47
  lookLineart: string;
@@ -77,6 +79,10 @@ export interface ViewerMessages {
77
79
  solveMessagesEscHint: string;
78
80
  solveMessagesDismiss: string;
79
81
  solveSolving: string;
82
+ /** A visible solve has landed; followed by how long it took. */
83
+ solveDone: string;
84
+ /** A visible solve was aborted; the previous result stays. */
85
+ solveStopped: string;
80
86
  parametersTab: string;
81
87
  moreTab: string;
82
88
  scrollTabsBack: string;
@@ -131,6 +137,16 @@ export interface ViewerMessages {
131
137
  /** `{max}` is replaced with the field's character limit. */
132
138
  maxLength: string;
133
139
  invalidFormat: string;
140
+ /** Trigger label; `{color}` is the current hex value. */
141
+ colorPick: string;
142
+ colorArea: string;
143
+ /** `{s}` and `{v}` are percentages. */
144
+ colorAreaValue: string;
145
+ colorHue: string;
146
+ colorHex: string;
147
+ colorHexInvalid: string;
148
+ colorPresets: string;
149
+ colorEyedropper: string;
134
150
  invalidPattern: string;
135
151
 
136
152
  // Geometry input (Rhino only)
@@ -219,6 +235,7 @@ export interface ViewerMessages {
219
235
  copied: string;
220
236
  chartReceiving: string;
221
237
  chartRenderFailed: string;
238
+ downloadChartImage: string;
222
239
  /** `{error}` is replaced with the browser's reason. */
223
240
  fullscreenUnavailable: string;
224
241
  /** `{error}` is replaced with the browser's reason. */
@@ -268,6 +285,8 @@ const en: ViewerMessages = {
268
285
  lookTechnical: 'Technical',
269
286
  lookStudio: 'Studio',
270
287
  lookShowcase: 'Showcase',
288
+ lookNight: 'Night',
289
+ nightMode: 'Night mode',
271
290
  lookArctic: 'Arctic',
272
291
  lookXray: 'X-Ray',
273
292
  lookLineart: 'Line Art',
@@ -300,6 +319,8 @@ const en: ViewerMessages = {
300
319
  solveMessagesEscHint: 'Esc aborts the solve',
301
320
  solveMessagesDismiss: 'Dismiss',
302
321
  solveSolving: 'Solving…',
322
+ solveDone: 'Done',
323
+ solveStopped: 'Stopped',
303
324
  parametersTab: 'Parameters',
304
325
  moreTab: 'More',
305
326
  scrollTabsBack: 'Previous tabs',
@@ -340,6 +361,14 @@ const en: ViewerMessages = {
340
361
  fineDragHint: 'Hold Shift to drag finely',
341
362
  maxLength: 'Maximum {max} characters allowed',
342
363
  invalidFormat: 'Invalid format',
364
+ colorPick: 'Choose color, currently {color}',
365
+ colorArea: 'Saturation and brightness',
366
+ colorAreaValue: 'Saturation {s}%, brightness {v}%',
367
+ colorHue: 'Hue',
368
+ colorHex: 'Hex color',
369
+ colorHexInvalid: 'Enter a hex color such as #2f6fd6',
370
+ colorPresets: 'Presets',
371
+ colorEyedropper: 'Pick a color from the screen',
343
372
  invalidPattern: 'Invalid validation pattern configured',
344
373
 
345
374
  geometryPickAnyOne: 'Pick an object',
@@ -417,6 +446,7 @@ const en: ViewerMessages = {
417
446
  copied: 'Copied!',
418
447
  chartReceiving: 'Receiving chart data...',
419
448
  chartRenderFailed: 'Failed to render chart',
449
+ downloadChartImage: 'Download plot as image',
420
450
  fullscreenUnavailable: 'Fullscreen unavailable: {error}',
421
451
  exitFullscreenFailed: 'Exit fullscreen failed: {error}',
422
452
 
@@ -461,6 +491,8 @@ const de: ViewerMessages = {
461
491
  lookTechnical: 'Technisch',
462
492
  lookStudio: 'Studio',
463
493
  lookShowcase: 'Präsentation',
494
+ lookNight: 'Nacht',
495
+ nightMode: 'Nachtmodus',
464
496
  lookArctic: 'Arktis',
465
497
  lookXray: 'Röntgen',
466
498
  lookLineart: 'Strichzeichnung',
@@ -494,6 +526,8 @@ const de: ViewerMessages = {
494
526
  solveMessagesEscHint: 'Esc bricht die Berechnung ab',
495
527
  solveMessagesDismiss: 'Schliessen',
496
528
  solveSolving: 'Berechnung läuft…',
529
+ solveDone: 'Fertig',
530
+ solveStopped: 'Abgebrochen',
497
531
  parametersTab: 'Parameter',
498
532
  moreTab: 'Mehr',
499
533
  scrollTabsBack: 'Vorherige Tabs',
@@ -534,6 +568,14 @@ const de: ViewerMessages = {
534
568
  fineDragHint: 'Umschalttaste halten für feine Schritte',
535
569
  maxLength: 'Höchstens {max} Zeichen erlaubt',
536
570
  invalidFormat: 'Ungültiges Format',
571
+ colorPick: 'Farbe wählen, aktuell {color}',
572
+ colorArea: 'Sättigung und Helligkeit',
573
+ colorAreaValue: 'Sättigung {s} %, Helligkeit {v} %',
574
+ colorHue: 'Farbton',
575
+ colorHex: 'Hex-Farbe',
576
+ colorHexInvalid: 'Hex-Farbe eingeben, z. B. #2f6fd6',
577
+ colorPresets: 'Vorgaben',
578
+ colorEyedropper: 'Farbe vom Bildschirm aufnehmen',
537
579
  invalidPattern: 'Ungültiges Prüfmuster hinterlegt',
538
580
 
539
581
  geometryPickAnyOne: 'Objekt wählen',
@@ -612,6 +654,7 @@ const de: ViewerMessages = {
612
654
  copied: 'Kopiert!',
613
655
  chartReceiving: 'Diagrammdaten werden empfangen…',
614
656
  chartRenderFailed: 'Diagramm konnte nicht dargestellt werden',
657
+ downloadChartImage: 'Diagramm als Bild herunterladen',
615
658
  fullscreenUnavailable: 'Vollbild nicht verfügbar: {error}',
616
659
  exitFullscreenFailed: 'Vollbild konnte nicht beendet werden: {error}',
617
660
 
package/src/lib/index.ts CHANGED
@@ -13,12 +13,14 @@ export { default as ErrorScreen } from './components/ErrorScreen.svelte';
13
13
  // Design-system primitives (shadcn-svelte + custom)
14
14
  export * from './components/primitives';
15
15
  export { default as StateDisplay } from './components/primitives/StateDisplay.svelte';
16
+ export { default as ColorInput } from './components/preview/inputs/ColorInput.svelte';
16
17
 
17
18
  export { default as Viewer } from './components/viewer/Viewer.svelte';
18
19
 
19
20
  export * from './schema/defaults';
20
21
  export * from './schema/dynamic-value-list';
21
22
  export * from './schema/traversal';
23
+ export { visibleInputItems } from './schema/visibility-rules';
22
24
  export {
23
25
  type UIHost,
24
26
  type ElementKind,
package/src/lib/public.ts CHANGED
@@ -80,6 +80,7 @@ export {
80
80
  export * from './schema/defaults';
81
81
  export * from './schema/traversal';
82
82
  export * from './schema/dynamic-value-list';
83
+ export { visibleInputItems } from './schema/visibility-rules';
83
84
 
84
85
  // UI-facing runtime types (not from schema)
85
86
  export type { ActionButton } from './types/actionButton';
@@ -1,10 +1,12 @@
1
1
  import type {
2
+ InputLayoutItem,
2
3
  LayoutItem,
3
4
  OutputLayoutItem,
4
5
  VisibilityRule,
5
6
  VisibilityCondition,
6
7
  GroupVisibilityCondition,
7
- TabConfig
8
+ TabConfig,
9
+ UISchema
8
10
  } from '@selvajs/schemas';
9
11
  import { isFileData } from '../utils/file-download';
10
12
 
@@ -148,6 +150,30 @@ export function isTabVisible(tab: TabConfig, values: Record<string, unknown>): b
148
150
  );
149
151
  }
150
152
 
153
+ /**
154
+ * The input items the form shows for these values: each passes its own condition, inside a
155
+ * shown group and, when tabbed, a shown tab. For a host that repeats the form back, such as a
156
+ * summary before a commit, without re-deriving the renderer's rules.
157
+ */
158
+ export function visibleInputItems(
159
+ schema: UISchema,
160
+ values: Record<string, unknown>
161
+ ): InputLayoutItem[] {
162
+ const layout = schema?.layout;
163
+ const groups =
164
+ layout?.type === 'tabbed'
165
+ ? (layout.tabs ?? []).filter((t) => isTabVisible(t, values)).flatMap((t) => t.groups ?? [])
166
+ : layout?.type === 'flat'
167
+ ? (layout.groups ?? [])
168
+ : [];
169
+ return groups
170
+ .filter((g) => evaluateGroupVisibility(g, values))
171
+ .flatMap((g) => g.items ?? [])
172
+ .filter(
173
+ (i): i is InputLayoutItem => i.type === 'input' && evaluateVisibility(i, values).visible
174
+ );
175
+ }
176
+
151
177
  /**
152
178
  * A linebreak is always "visible" but renders as a divider only, so a group left with
153
179
  * nothing but separators counts as empty.