@selvajs/ui 0.9.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 (541) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -0
  3. package/dist/components/ErrorScreen.svelte +53 -0
  4. package/dist/components/ErrorScreen.svelte.d.ts +9 -0
  5. package/dist/components/compute/AppLayout.svelte +470 -0
  6. package/dist/components/compute/AppLayout.svelte.d.ts +23 -0
  7. package/dist/components/compute/CollapsedPanelStrip.svelte +64 -0
  8. package/dist/components/compute/CollapsedPanelStrip.svelte.d.ts +11 -0
  9. package/dist/components/compute/ComputeApp.svelte +243 -0
  10. package/dist/components/compute/ComputeApp.svelte.d.ts +29 -0
  11. package/dist/components/compute/ComputeMessages.svelte +169 -0
  12. package/dist/components/compute/ComputeMessages.svelte.d.ts +7 -0
  13. package/dist/components/compute/ParameterPresetManager.svelte +326 -0
  14. package/dist/components/compute/ParameterPresetManager.svelte.d.ts +13 -0
  15. package/dist/components/compute/index.d.ts +5 -0
  16. package/dist/components/compute/index.js +5 -0
  17. package/dist/components/layout/AppShell.svelte +110 -0
  18. package/dist/components/layout/AppShell.svelte.d.ts +24 -0
  19. package/dist/components/layout/EmptyState.svelte +48 -0
  20. package/dist/components/layout/EmptyState.svelte.d.ts +15 -0
  21. package/dist/components/layout/FooterItemRenderer.svelte +20 -0
  22. package/dist/components/layout/FooterItemRenderer.svelte.d.ts +7 -0
  23. package/dist/components/layout/PageContent.svelte +12 -0
  24. package/dist/components/layout/PageContent.svelte.d.ts +7 -0
  25. package/dist/components/layout/PageFooter.svelte +222 -0
  26. package/dist/components/layout/PageFooter.svelte.d.ts +9 -0
  27. package/dist/components/layout/PageHeader.svelte +67 -0
  28. package/dist/components/layout/PageHeader.svelte.d.ts +14 -0
  29. package/dist/components/layout/SectionHeader.svelte +38 -0
  30. package/dist/components/layout/SectionHeader.svelte.d.ts +11 -0
  31. package/dist/components/layout/SideNav.svelte +82 -0
  32. package/dist/components/layout/SideNav.svelte.d.ts +19 -0
  33. package/dist/components/layout/SubNav.svelte +45 -0
  34. package/dist/components/layout/SubNav.svelte.d.ts +14 -0
  35. package/dist/components/layout/index.d.ts +10 -0
  36. package/dist/components/layout/index.js +9 -0
  37. package/dist/components/preview/ChartOutput.svelte +222 -0
  38. package/dist/components/preview/ChartOutput.svelte.d.ts +8 -0
  39. package/dist/components/preview/Group.svelte +134 -0
  40. package/dist/components/preview/Group.svelte.d.ts +25 -0
  41. package/dist/components/preview/ImageOutput.svelte +156 -0
  42. package/dist/components/preview/ImageOutput.svelte.d.ts +8 -0
  43. package/dist/components/preview/InputControl.svelte +130 -0
  44. package/dist/components/preview/InputControl.svelte.d.ts +11 -0
  45. package/dist/components/preview/OutputDisplay.svelte +297 -0
  46. package/dist/components/preview/OutputDisplay.svelte.d.ts +9 -0
  47. package/dist/components/preview/TabBar.svelte +36 -0
  48. package/dist/components/preview/TabBar.svelte.d.ts +8 -0
  49. package/dist/components/preview/TabContent.svelte +125 -0
  50. package/dist/components/preview/TabContent.svelte.d.ts +13 -0
  51. package/dist/components/preview/TabLayout.svelte +109 -0
  52. package/dist/components/preview/TabLayout.svelte.d.ts +13 -0
  53. package/dist/components/preview/index.d.ts +3 -0
  54. package/dist/components/preview/index.js +4 -0
  55. package/dist/components/preview/inputs/CheckboxInput.svelte +29 -0
  56. package/dist/components/preview/inputs/CheckboxInput.svelte.d.ts +10 -0
  57. package/dist/components/preview/inputs/ChecklistInput.svelte +50 -0
  58. package/dist/components/preview/inputs/ChecklistInput.svelte.d.ts +11 -0
  59. package/dist/components/preview/inputs/ColorInput.svelte +21 -0
  60. package/dist/components/preview/inputs/ColorInput.svelte.d.ts +7 -0
  61. package/dist/components/preview/inputs/DropdownInput.svelte +40 -0
  62. package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +10 -0
  63. package/dist/components/preview/inputs/FileInput.svelte +368 -0
  64. package/dist/components/preview/inputs/FileInput.svelte.d.ts +10 -0
  65. package/dist/components/preview/inputs/NumberInput.svelte +152 -0
  66. package/dist/components/preview/inputs/NumberInput.svelte.d.ts +11 -0
  67. package/dist/components/preview/inputs/TextInput.svelte +74 -0
  68. package/dist/components/preview/inputs/TextInput.svelte.d.ts +11 -0
  69. package/dist/components/preview/inputs/index.d.ts +7 -0
  70. package/dist/components/preview/inputs/index.js +7 -0
  71. package/dist/components/primitives/CalculateButton.svelte +40 -0
  72. package/dist/components/primitives/CalculateButton.svelte.d.ts +9 -0
  73. package/dist/components/primitives/DataTable.svelte +39 -0
  74. package/dist/components/primitives/DataTable.svelte.d.ts +36 -0
  75. package/dist/components/primitives/ImageUploadField.svelte +84 -0
  76. package/dist/components/primitives/ImageUploadField.svelte.d.ts +15 -0
  77. package/dist/components/primitives/SolvingIndicator.svelte +54 -0
  78. package/dist/components/primitives/SolvingIndicator.svelte.d.ts +6 -0
  79. package/dist/components/primitives/StateDisplay.svelte +106 -0
  80. package/dist/components/primitives/StateDisplay.svelte.d.ts +10 -0
  81. package/dist/components/primitives/ViewToggle.svelte +47 -0
  82. package/dist/components/primitives/ViewToggle.svelte.d.ts +9 -0
  83. package/dist/components/primitives/alert/alert-description.svelte +23 -0
  84. package/dist/components/primitives/alert/alert-description.svelte.d.ts +5 -0
  85. package/dist/components/primitives/alert/alert-title.svelte +20 -0
  86. package/dist/components/primitives/alert/alert-title.svelte.d.ts +5 -0
  87. package/dist/components/primitives/alert/alert.svelte +44 -0
  88. package/dist/components/primitives/alert/alert.svelte.d.ts +26 -0
  89. package/dist/components/primitives/alert/index.d.ts +5 -0
  90. package/dist/components/primitives/alert/index.js +7 -0
  91. package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte +18 -0
  92. package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte.d.ts +4 -0
  93. package/dist/components/primitives/alert-dialog/alert-dialog-cancel.svelte +18 -0
  94. package/dist/components/primitives/alert-dialog/alert-dialog-cancel.svelte.d.ts +4 -0
  95. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +27 -0
  96. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte.d.ts +8 -0
  97. package/dist/components/primitives/alert-dialog/alert-dialog-description.svelte +17 -0
  98. package/dist/components/primitives/alert-dialog/alert-dialog-description.svelte.d.ts +4 -0
  99. package/dist/components/primitives/alert-dialog/alert-dialog-footer.svelte +20 -0
  100. package/dist/components/primitives/alert-dialog/alert-dialog-footer.svelte.d.ts +5 -0
  101. package/dist/components/primitives/alert-dialog/alert-dialog-header.svelte +20 -0
  102. package/dist/components/primitives/alert-dialog/alert-dialog-header.svelte.d.ts +5 -0
  103. package/dist/components/primitives/alert-dialog/alert-dialog-overlay.svelte +20 -0
  104. package/dist/components/primitives/alert-dialog/alert-dialog-overlay.svelte.d.ts +4 -0
  105. package/dist/components/primitives/alert-dialog/alert-dialog-title.svelte +17 -0
  106. package/dist/components/primitives/alert-dialog/alert-dialog-title.svelte.d.ts +4 -0
  107. package/dist/components/primitives/alert-dialog/alert-dialog-trigger.svelte +7 -0
  108. package/dist/components/primitives/alert-dialog/alert-dialog-trigger.svelte.d.ts +4 -0
  109. package/dist/components/primitives/alert-dialog/index.d.ts +12 -0
  110. package/dist/components/primitives/alert-dialog/index.js +15 -0
  111. package/dist/components/primitives/badge/badge.svelte +49 -0
  112. package/dist/components/primitives/badge/badge.svelte.d.ts +32 -0
  113. package/dist/components/primitives/badge/index.d.ts +2 -0
  114. package/dist/components/primitives/badge/index.js +2 -0
  115. package/dist/components/primitives/button/button.svelte +83 -0
  116. package/dist/components/primitives/button/button.svelte.d.ts +67 -0
  117. package/dist/components/primitives/button/index.d.ts +2 -0
  118. package/dist/components/primitives/button/index.js +4 -0
  119. package/dist/components/primitives/button-group/button-group-separator.svelte +20 -0
  120. package/dist/components/primitives/button-group/button-group-separator.svelte.d.ts +13 -0
  121. package/dist/components/primitives/button-group/button-group-text.svelte +30 -0
  122. package/dist/components/primitives/button-group/button-group-text.svelte.d.ts +11 -0
  123. package/dist/components/primitives/button-group/button-group.svelte +46 -0
  124. package/dist/components/primitives/button-group/button-group.svelte.d.ts +26 -0
  125. package/dist/components/primitives/button-group/index.d.ts +4 -0
  126. package/dist/components/primitives/button-group/index.js +6 -0
  127. package/dist/components/primitives/card/card-action.svelte +20 -0
  128. package/dist/components/primitives/card/card-action.svelte.d.ts +5 -0
  129. package/dist/components/primitives/card/card-content.svelte +15 -0
  130. package/dist/components/primitives/card/card-content.svelte.d.ts +5 -0
  131. package/dist/components/primitives/card/card-description.svelte +20 -0
  132. package/dist/components/primitives/card/card-description.svelte.d.ts +5 -0
  133. package/dist/components/primitives/card/card-footer.svelte +20 -0
  134. package/dist/components/primitives/card/card-footer.svelte.d.ts +5 -0
  135. package/dist/components/primitives/card/card-header.svelte +23 -0
  136. package/dist/components/primitives/card/card-header.svelte.d.ts +5 -0
  137. package/dist/components/primitives/card/card-title.svelte +20 -0
  138. package/dist/components/primitives/card/card-title.svelte.d.ts +5 -0
  139. package/dist/components/primitives/card/card.svelte +23 -0
  140. package/dist/components/primitives/card/card.svelte.d.ts +5 -0
  141. package/dist/components/primitives/card/index.d.ts +8 -0
  142. package/dist/components/primitives/card/index.js +10 -0
  143. package/dist/components/primitives/checkbox/checkbox.svelte +36 -0
  144. package/dist/components/primitives/checkbox/checkbox.svelte.d.ts +4 -0
  145. package/dist/components/primitives/checkbox/index.d.ts +2 -0
  146. package/dist/components/primitives/checkbox/index.js +4 -0
  147. package/dist/components/primitives/collapsible/collapsible-content.svelte +7 -0
  148. package/dist/components/primitives/collapsible/collapsible-content.svelte.d.ts +4 -0
  149. package/dist/components/primitives/collapsible/collapsible-trigger.svelte +7 -0
  150. package/dist/components/primitives/collapsible/collapsible-trigger.svelte.d.ts +4 -0
  151. package/dist/components/primitives/collapsible/collapsible.svelte +11 -0
  152. package/dist/components/primitives/collapsible/collapsible.svelte.d.ts +4 -0
  153. package/dist/components/primitives/collapsible/index.d.ts +4 -0
  154. package/dist/components/primitives/collapsible/index.js +6 -0
  155. package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +38 -0
  156. package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte.d.ts +9 -0
  157. package/dist/components/primitives/context-menu/context-menu-content.svelte +25 -0
  158. package/dist/components/primitives/context-menu/context-menu-content.svelte.d.ts +7 -0
  159. package/dist/components/primitives/context-menu/context-menu-group-heading.svelte +21 -0
  160. package/dist/components/primitives/context-menu/context-menu-group-heading.svelte.d.ts +7 -0
  161. package/dist/components/primitives/context-menu/context-menu-group.svelte +7 -0
  162. package/dist/components/primitives/context-menu/context-menu-group.svelte.d.ts +4 -0
  163. package/dist/components/primitives/context-menu/context-menu-item.svelte +27 -0
  164. package/dist/components/primitives/context-menu/context-menu-item.svelte.d.ts +8 -0
  165. package/dist/components/primitives/context-menu/context-menu-label.svelte +24 -0
  166. package/dist/components/primitives/context-menu/context-menu-label.svelte.d.ts +8 -0
  167. package/dist/components/primitives/context-menu/context-menu-radio-group.svelte +16 -0
  168. package/dist/components/primitives/context-menu/context-menu-radio-group.svelte.d.ts +4 -0
  169. package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +31 -0
  170. package/dist/components/primitives/context-menu/context-menu-radio-item.svelte.d.ts +4 -0
  171. package/dist/components/primitives/context-menu/context-menu-separator.svelte +17 -0
  172. package/dist/components/primitives/context-menu/context-menu-separator.svelte.d.ts +4 -0
  173. package/dist/components/primitives/context-menu/context-menu-shortcut.svelte +20 -0
  174. package/dist/components/primitives/context-menu/context-menu-shortcut.svelte.d.ts +5 -0
  175. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +20 -0
  176. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte.d.ts +4 -0
  177. package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +29 -0
  178. package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte.d.ts +8 -0
  179. package/dist/components/primitives/context-menu/context-menu-trigger.svelte +7 -0
  180. package/dist/components/primitives/context-menu/context-menu-trigger.svelte.d.ts +4 -0
  181. package/dist/components/primitives/context-menu/index.d.ts +16 -0
  182. package/dist/components/primitives/context-menu/index.js +19 -0
  183. package/dist/components/primitives/dialog/dialog-close.svelte +7 -0
  184. package/dist/components/primitives/dialog/dialog-close.svelte.d.ts +4 -0
  185. package/dist/components/primitives/dialog/dialog-content.svelte +43 -0
  186. package/dist/components/primitives/dialog/dialog-content.svelte.d.ts +11 -0
  187. package/dist/components/primitives/dialog/dialog-description.svelte +17 -0
  188. package/dist/components/primitives/dialog/dialog-description.svelte.d.ts +4 -0
  189. package/dist/components/primitives/dialog/dialog-footer.svelte +20 -0
  190. package/dist/components/primitives/dialog/dialog-footer.svelte.d.ts +5 -0
  191. package/dist/components/primitives/dialog/dialog-header.svelte +20 -0
  192. package/dist/components/primitives/dialog/dialog-header.svelte.d.ts +5 -0
  193. package/dist/components/primitives/dialog/dialog-overlay.svelte +20 -0
  194. package/dist/components/primitives/dialog/dialog-overlay.svelte.d.ts +4 -0
  195. package/dist/components/primitives/dialog/dialog-title.svelte +17 -0
  196. package/dist/components/primitives/dialog/dialog-title.svelte.d.ts +4 -0
  197. package/dist/components/primitives/dialog/dialog-trigger.svelte +7 -0
  198. package/dist/components/primitives/dialog/dialog-trigger.svelte.d.ts +4 -0
  199. package/dist/components/primitives/dialog/index.d.ts +11 -0
  200. package/dist/components/primitives/dialog/index.js +14 -0
  201. package/dist/components/primitives/drawer/Drawer.svelte +32 -0
  202. package/dist/components/primitives/drawer/Drawer.svelte.d.ts +10 -0
  203. package/dist/components/primitives/drawer/index.d.ts +1 -0
  204. package/dist/components/primitives/drawer/index.js +1 -0
  205. package/dist/components/primitives/field/field-content.svelte +20 -0
  206. package/dist/components/primitives/field/field-content.svelte.d.ts +5 -0
  207. package/dist/components/primitives/field/field-description.svelte +25 -0
  208. package/dist/components/primitives/field/field-description.svelte.d.ts +5 -0
  209. package/dist/components/primitives/field/field-error.svelte +58 -0
  210. package/dist/components/primitives/field/field-error.svelte.d.ts +12 -0
  211. package/dist/components/primitives/field/field-group.svelte +23 -0
  212. package/dist/components/primitives/field/field-group.svelte.d.ts +5 -0
  213. package/dist/components/primitives/field/field-label.svelte +26 -0
  214. package/dist/components/primitives/field/field-label.svelte.d.ts +10 -0
  215. package/dist/components/primitives/field/field-legend.svelte +29 -0
  216. package/dist/components/primitives/field/field-legend.svelte.d.ts +8 -0
  217. package/dist/components/primitives/field/field-separator.svelte +35 -0
  218. package/dist/components/primitives/field/field-separator.svelte.d.ts +9 -0
  219. package/dist/components/primitives/field/field-set.svelte +24 -0
  220. package/dist/components/primitives/field/field-set.svelte.d.ts +5 -0
  221. package/dist/components/primitives/field/field-title.svelte +23 -0
  222. package/dist/components/primitives/field/field-title.svelte.d.ts +5 -0
  223. package/dist/components/primitives/field/field.svelte +53 -0
  224. package/dist/components/primitives/field/field.svelte.d.ts +29 -0
  225. package/dist/components/primitives/field/index.d.ts +11 -0
  226. package/dist/components/primitives/field/index.js +13 -0
  227. package/dist/components/primitives/index.d.ts +29 -0
  228. package/dist/components/primitives/index.js +32 -0
  229. package/dist/components/primitives/input/index.d.ts +2 -0
  230. package/dist/components/primitives/input/index.js +4 -0
  231. package/dist/components/primitives/input/input.svelte +52 -0
  232. package/dist/components/primitives/input/input.svelte.d.ts +13 -0
  233. package/dist/components/primitives/label/index.d.ts +2 -0
  234. package/dist/components/primitives/label/index.js +4 -0
  235. package/dist/components/primitives/label/label.svelte +20 -0
  236. package/dist/components/primitives/label/label.svelte.d.ts +4 -0
  237. package/dist/components/primitives/mode-toggle/index.d.ts +1 -0
  238. package/dist/components/primitives/mode-toggle/index.js +1 -0
  239. package/dist/components/primitives/mode-toggle/mode-toggle.svelte +16 -0
  240. package/dist/components/primitives/mode-toggle/mode-toggle.svelte.d.ts +18 -0
  241. package/dist/components/primitives/resizable/index.d.ts +4 -0
  242. package/dist/components/primitives/resizable/index.js +6 -0
  243. package/dist/components/primitives/resizable/resizable-handle.svelte +27 -0
  244. package/dist/components/primitives/resizable/resizable-handle.svelte.d.ts +8 -0
  245. package/dist/components/primitives/resizable/resizable-pane-group.svelte +24 -0
  246. package/dist/components/primitives/resizable/resizable-pane-group.svelte.d.ts +7 -0
  247. package/dist/components/primitives/scroll-area/index.d.ts +3 -0
  248. package/dist/components/primitives/scroll-area/index.js +5 -0
  249. package/dist/components/primitives/scroll-area/scroll-area-scrollbar.svelte +31 -0
  250. package/dist/components/primitives/scroll-area/scroll-area-scrollbar.svelte.d.ts +4 -0
  251. package/dist/components/primitives/scroll-area/scroll-area.svelte +43 -0
  252. package/dist/components/primitives/scroll-area/scroll-area.svelte.d.ts +11 -0
  253. package/dist/components/primitives/search/index.d.ts +2 -0
  254. package/dist/components/primitives/search/index.js +4 -0
  255. package/dist/components/primitives/search/search.svelte +79 -0
  256. package/dist/components/primitives/search/search.svelte.d.ts +13 -0
  257. package/dist/components/primitives/select/index.d.ts +11 -0
  258. package/dist/components/primitives/select/index.js +14 -0
  259. package/dist/components/primitives/select/select-content.svelte +40 -0
  260. package/dist/components/primitives/select/select-content.svelte.d.ts +8 -0
  261. package/dist/components/primitives/select/select-group-heading.svelte +21 -0
  262. package/dist/components/primitives/select/select-group-heading.svelte.d.ts +10 -0
  263. package/dist/components/primitives/select/select-group.svelte +7 -0
  264. package/dist/components/primitives/select/select-group.svelte.d.ts +4 -0
  265. package/dist/components/primitives/select/select-item.svelte +38 -0
  266. package/dist/components/primitives/select/select-item.svelte.d.ts +4 -0
  267. package/dist/components/primitives/select/select-label.svelte +20 -0
  268. package/dist/components/primitives/select/select-label.svelte.d.ts +6 -0
  269. package/dist/components/primitives/select/select-scroll-down-button.svelte +20 -0
  270. package/dist/components/primitives/select/select-scroll-down-button.svelte.d.ts +4 -0
  271. package/dist/components/primitives/select/select-scroll-up-button.svelte +20 -0
  272. package/dist/components/primitives/select/select-scroll-up-button.svelte.d.ts +4 -0
  273. package/dist/components/primitives/select/select-separator.svelte +18 -0
  274. package/dist/components/primitives/select/select-separator.svelte.d.ts +4 -0
  275. package/dist/components/primitives/select/select-trigger.svelte +29 -0
  276. package/dist/components/primitives/select/select-trigger.svelte.d.ts +8 -0
  277. package/dist/components/primitives/separator/index.d.ts +2 -0
  278. package/dist/components/primitives/separator/index.js +4 -0
  279. package/dist/components/primitives/separator/separator.svelte +21 -0
  280. package/dist/components/primitives/separator/separator.svelte.d.ts +4 -0
  281. package/dist/components/primitives/slider/index.d.ts +2 -0
  282. package/dist/components/primitives/slider/index.js +4 -0
  283. package/dist/components/primitives/slider/slider.svelte +52 -0
  284. package/dist/components/primitives/slider/slider.svelte.d.ts +5 -0
  285. package/dist/components/primitives/sonner/index.d.ts +2 -0
  286. package/dist/components/primitives/sonner/index.js +2 -0
  287. package/dist/components/primitives/sonner/sonner.svelte +13 -0
  288. package/dist/components/primitives/sonner/sonner.svelte.d.ts +4 -0
  289. package/dist/components/primitives/switch/index.d.ts +2 -0
  290. package/dist/components/primitives/switch/index.js +4 -0
  291. package/dist/components/primitives/switch/switch.svelte +29 -0
  292. package/dist/components/primitives/switch/switch.svelte.d.ts +4 -0
  293. package/dist/components/primitives/tabs/index.d.ts +5 -0
  294. package/dist/components/primitives/tabs/index.js +7 -0
  295. package/dist/components/primitives/tabs/tabs-content.svelte +17 -0
  296. package/dist/components/primitives/tabs/tabs-content.svelte.d.ts +4 -0
  297. package/dist/components/primitives/tabs/tabs-list.svelte +16 -0
  298. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +4 -0
  299. package/dist/components/primitives/tabs/tabs-trigger.svelte +20 -0
  300. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +4 -0
  301. package/dist/components/primitives/tabs/tabs.svelte +19 -0
  302. package/dist/components/primitives/tabs/tabs.svelte.d.ts +4 -0
  303. package/dist/components/primitives/textarea/index.d.ts +2 -0
  304. package/dist/components/primitives/textarea/index.js +4 -0
  305. package/dist/components/primitives/textarea/textarea.svelte +23 -0
  306. package/dist/components/primitives/textarea/textarea.svelte.d.ts +5 -0
  307. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +39 -0
  308. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +3 -0
  309. package/dist/components/primitives/theme-switcher/index.d.ts +1 -0
  310. package/dist/components/primitives/theme-switcher/index.js +1 -0
  311. package/dist/components/viewer/MeshMetadataDialog.svelte +122 -0
  312. package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +10 -0
  313. package/dist/components/viewer/SceneManager.svelte +297 -0
  314. package/dist/components/viewer/SceneManager.svelte.d.ts +8 -0
  315. package/dist/components/viewer/Viewer.svelte +311 -0
  316. package/dist/components/viewer/Viewer.svelte.d.ts +18 -0
  317. package/dist/components/viewer/index.d.ts +3 -0
  318. package/dist/components/viewer/index.js +3 -0
  319. package/dist/composables/useFooterItem.svelte.d.ts +15 -0
  320. package/dist/composables/useFooterItem.svelte.js +33 -0
  321. package/dist/compute/computeThrottle.svelte.d.ts +24 -0
  322. package/dist/compute/computeThrottle.svelte.js +70 -0
  323. package/dist/compute/solving.svelte.d.ts +12 -0
  324. package/dist/compute/solving.svelte.js +68 -0
  325. package/dist/constants.d.ts +28 -0
  326. package/dist/constants.js +32 -0
  327. package/dist/contexts/footerContext.svelte.d.ts +18 -0
  328. package/dist/contexts/footerContext.svelte.js +24 -0
  329. package/dist/index.d.ts +14 -0
  330. package/dist/index.js +20 -0
  331. package/dist/schema/defaults.d.ts +1 -0
  332. package/dist/schema/defaults.js +13 -0
  333. package/dist/schema/param-exporter.d.ts +15 -0
  334. package/dist/schema/param-exporter.js +120 -0
  335. package/dist/schema/visibility-rules.d.ts +12 -0
  336. package/dist/schema/visibility-rules.js +63 -0
  337. package/dist/styles/base.css +145 -0
  338. package/dist/styles/themes/cyberpunk.css +98 -0
  339. package/dist/styles/themes/neutral.css +72 -0
  340. package/dist/styles/themes/ocean.css +75 -0
  341. package/dist/styles/themes/selva.css +105 -0
  342. package/dist/theme/themeStore.svelte.d.ts +12 -0
  343. package/dist/theme/themeStore.svelte.js +40 -0
  344. package/dist/theme/themes.d.ts +5 -0
  345. package/dist/theme/themes.js +13 -0
  346. package/dist/types/actionButton.d.ts +33 -0
  347. package/dist/types/actionButton.js +1 -0
  348. package/dist/types/solveFn.d.ts +26 -0
  349. package/dist/types/solveFn.js +1 -0
  350. package/dist/utils/color.d.ts +1 -0
  351. package/dist/utils/color.js +38 -0
  352. package/dist/utils/debounce.d.ts +14 -0
  353. package/dist/utils/debounce.js +30 -0
  354. package/dist/utils/file-download.d.ts +22 -0
  355. package/dist/utils/file-download.js +93 -0
  356. package/dist/utils/loadScript.d.ts +14 -0
  357. package/dist/utils/loadScript.js +38 -0
  358. package/dist/utils.d.ts +12 -0
  359. package/dist/utils.js +5 -0
  360. package/package.json +100 -0
  361. package/src/lib/components/ErrorScreen.svelte +53 -0
  362. package/src/lib/components/compute/AppLayout.svelte +470 -0
  363. package/src/lib/components/compute/CollapsedPanelStrip.svelte +64 -0
  364. package/src/lib/components/compute/ComputeApp.svelte +243 -0
  365. package/src/lib/components/compute/ComputeMessages.svelte +169 -0
  366. package/src/lib/components/compute/ParameterPresetManager.svelte +326 -0
  367. package/src/lib/components/compute/index.ts +5 -0
  368. package/src/lib/components/layout/AppShell.svelte +110 -0
  369. package/src/lib/components/layout/EmptyState.svelte +48 -0
  370. package/src/lib/components/layout/FooterItemRenderer.svelte +20 -0
  371. package/src/lib/components/layout/PageContent.svelte +12 -0
  372. package/src/lib/components/layout/PageFooter.svelte +222 -0
  373. package/src/lib/components/layout/PageHeader.svelte +67 -0
  374. package/src/lib/components/layout/SectionHeader.svelte +38 -0
  375. package/src/lib/components/layout/SideNav.svelte +82 -0
  376. package/src/lib/components/layout/SubNav.svelte +45 -0
  377. package/src/lib/components/layout/index.ts +11 -0
  378. package/src/lib/components/preview/ChartOutput.svelte +222 -0
  379. package/src/lib/components/preview/Group.svelte +134 -0
  380. package/src/lib/components/preview/ImageOutput.svelte +156 -0
  381. package/src/lib/components/preview/InputControl.svelte +130 -0
  382. package/src/lib/components/preview/OutputDisplay.svelte +297 -0
  383. package/src/lib/components/preview/TabBar.svelte +36 -0
  384. package/src/lib/components/preview/TabContent.svelte +125 -0
  385. package/src/lib/components/preview/TabLayout.svelte +109 -0
  386. package/src/lib/components/preview/index.ts +4 -0
  387. package/src/lib/components/preview/inputs/CheckboxInput.svelte +29 -0
  388. package/src/lib/components/preview/inputs/ChecklistInput.svelte +50 -0
  389. package/src/lib/components/preview/inputs/ColorInput.svelte +21 -0
  390. package/src/lib/components/preview/inputs/DropdownInput.svelte +40 -0
  391. package/src/lib/components/preview/inputs/FileInput.svelte +368 -0
  392. package/src/lib/components/preview/inputs/NumberInput.svelte +152 -0
  393. package/src/lib/components/preview/inputs/TextInput.svelte +74 -0
  394. package/src/lib/components/preview/inputs/index.ts +7 -0
  395. package/src/lib/components/primitives/CalculateButton.svelte +40 -0
  396. package/src/lib/components/primitives/DataTable.svelte +39 -0
  397. package/src/lib/components/primitives/ImageUploadField.svelte +84 -0
  398. package/src/lib/components/primitives/SolvingIndicator.svelte +54 -0
  399. package/src/lib/components/primitives/StateDisplay.svelte +106 -0
  400. package/src/lib/components/primitives/ViewToggle.svelte +47 -0
  401. package/src/lib/components/primitives/alert/alert-description.svelte +23 -0
  402. package/src/lib/components/primitives/alert/alert-title.svelte +20 -0
  403. package/src/lib/components/primitives/alert/alert.svelte +44 -0
  404. package/src/lib/components/primitives/alert/index.ts +14 -0
  405. package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +18 -0
  406. package/src/lib/components/primitives/alert-dialog/alert-dialog-cancel.svelte +18 -0
  407. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +27 -0
  408. package/src/lib/components/primitives/alert-dialog/alert-dialog-description.svelte +17 -0
  409. package/src/lib/components/primitives/alert-dialog/alert-dialog-footer.svelte +20 -0
  410. package/src/lib/components/primitives/alert-dialog/alert-dialog-header.svelte +20 -0
  411. package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +20 -0
  412. package/src/lib/components/primitives/alert-dialog/alert-dialog-title.svelte +17 -0
  413. package/src/lib/components/primitives/alert-dialog/alert-dialog-trigger.svelte +7 -0
  414. package/src/lib/components/primitives/alert-dialog/index.ts +39 -0
  415. package/src/lib/components/primitives/badge/badge.svelte +49 -0
  416. package/src/lib/components/primitives/badge/index.ts +2 -0
  417. package/src/lib/components/primitives/button/button.svelte +83 -0
  418. package/src/lib/components/primitives/button/index.ts +17 -0
  419. package/src/lib/components/primitives/button-group/button-group-separator.svelte +20 -0
  420. package/src/lib/components/primitives/button-group/button-group-text.svelte +30 -0
  421. package/src/lib/components/primitives/button-group/button-group.svelte +46 -0
  422. package/src/lib/components/primitives/button-group/index.ts +13 -0
  423. package/src/lib/components/primitives/card/card-action.svelte +20 -0
  424. package/src/lib/components/primitives/card/card-content.svelte +15 -0
  425. package/src/lib/components/primitives/card/card-description.svelte +20 -0
  426. package/src/lib/components/primitives/card/card-footer.svelte +20 -0
  427. package/src/lib/components/primitives/card/card-header.svelte +23 -0
  428. package/src/lib/components/primitives/card/card-title.svelte +20 -0
  429. package/src/lib/components/primitives/card/card.svelte +23 -0
  430. package/src/lib/components/primitives/card/index.ts +25 -0
  431. package/src/lib/components/primitives/checkbox/checkbox.svelte +36 -0
  432. package/src/lib/components/primitives/checkbox/index.ts +6 -0
  433. package/src/lib/components/primitives/collapsible/collapsible-content.svelte +7 -0
  434. package/src/lib/components/primitives/collapsible/collapsible-trigger.svelte +7 -0
  435. package/src/lib/components/primitives/collapsible/collapsible.svelte +11 -0
  436. package/src/lib/components/primitives/collapsible/index.ts +13 -0
  437. package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +38 -0
  438. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +25 -0
  439. package/src/lib/components/primitives/context-menu/context-menu-group-heading.svelte +21 -0
  440. package/src/lib/components/primitives/context-menu/context-menu-group.svelte +7 -0
  441. package/src/lib/components/primitives/context-menu/context-menu-item.svelte +27 -0
  442. package/src/lib/components/primitives/context-menu/context-menu-label.svelte +24 -0
  443. package/src/lib/components/primitives/context-menu/context-menu-radio-group.svelte +16 -0
  444. package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +31 -0
  445. package/src/lib/components/primitives/context-menu/context-menu-separator.svelte +17 -0
  446. package/src/lib/components/primitives/context-menu/context-menu-shortcut.svelte +20 -0
  447. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +20 -0
  448. package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +29 -0
  449. package/src/lib/components/primitives/context-menu/context-menu-trigger.svelte +7 -0
  450. package/src/lib/components/primitives/context-menu/index.ts +51 -0
  451. package/src/lib/components/primitives/dialog/dialog-close.svelte +7 -0
  452. package/src/lib/components/primitives/dialog/dialog-content.svelte +43 -0
  453. package/src/lib/components/primitives/dialog/dialog-description.svelte +17 -0
  454. package/src/lib/components/primitives/dialog/dialog-footer.svelte +20 -0
  455. package/src/lib/components/primitives/dialog/dialog-header.svelte +20 -0
  456. package/src/lib/components/primitives/dialog/dialog-overlay.svelte +20 -0
  457. package/src/lib/components/primitives/dialog/dialog-title.svelte +17 -0
  458. package/src/lib/components/primitives/dialog/dialog-trigger.svelte +7 -0
  459. package/src/lib/components/primitives/dialog/index.ts +37 -0
  460. package/src/lib/components/primitives/drawer/Drawer.svelte +32 -0
  461. package/src/lib/components/primitives/drawer/index.ts +1 -0
  462. package/src/lib/components/primitives/field/field-content.svelte +20 -0
  463. package/src/lib/components/primitives/field/field-description.svelte +25 -0
  464. package/src/lib/components/primitives/field/field-error.svelte +58 -0
  465. package/src/lib/components/primitives/field/field-group.svelte +23 -0
  466. package/src/lib/components/primitives/field/field-label.svelte +26 -0
  467. package/src/lib/components/primitives/field/field-legend.svelte +29 -0
  468. package/src/lib/components/primitives/field/field-separator.svelte +35 -0
  469. package/src/lib/components/primitives/field/field-set.svelte +24 -0
  470. package/src/lib/components/primitives/field/field-title.svelte +23 -0
  471. package/src/lib/components/primitives/field/field.svelte +53 -0
  472. package/src/lib/components/primitives/field/index.ts +33 -0
  473. package/src/lib/components/primitives/index.ts +41 -0
  474. package/src/lib/components/primitives/input/index.ts +7 -0
  475. package/src/lib/components/primitives/input/input.svelte +52 -0
  476. package/src/lib/components/primitives/label/index.ts +7 -0
  477. package/src/lib/components/primitives/label/label.svelte +20 -0
  478. package/src/lib/components/primitives/mode-toggle/index.ts +1 -0
  479. package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +16 -0
  480. package/src/lib/components/primitives/resizable/index.ts +13 -0
  481. package/src/lib/components/primitives/resizable/resizable-handle.svelte +27 -0
  482. package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +24 -0
  483. package/src/lib/components/primitives/scroll-area/index.ts +10 -0
  484. package/src/lib/components/primitives/scroll-area/scroll-area-scrollbar.svelte +31 -0
  485. package/src/lib/components/primitives/scroll-area/scroll-area.svelte +43 -0
  486. package/src/lib/components/primitives/search/index.ts +7 -0
  487. package/src/lib/components/primitives/search/search.svelte +79 -0
  488. package/src/lib/components/primitives/select/index.ts +37 -0
  489. package/src/lib/components/primitives/select/select-content.svelte +40 -0
  490. package/src/lib/components/primitives/select/select-group-heading.svelte +21 -0
  491. package/src/lib/components/primitives/select/select-group.svelte +7 -0
  492. package/src/lib/components/primitives/select/select-item.svelte +38 -0
  493. package/src/lib/components/primitives/select/select-label.svelte +20 -0
  494. package/src/lib/components/primitives/select/select-scroll-down-button.svelte +20 -0
  495. package/src/lib/components/primitives/select/select-scroll-up-button.svelte +20 -0
  496. package/src/lib/components/primitives/select/select-separator.svelte +18 -0
  497. package/src/lib/components/primitives/select/select-trigger.svelte +29 -0
  498. package/src/lib/components/primitives/separator/index.ts +7 -0
  499. package/src/lib/components/primitives/separator/separator.svelte +21 -0
  500. package/src/lib/components/primitives/slider/index.ts +7 -0
  501. package/src/lib/components/primitives/slider/slider.svelte +52 -0
  502. package/src/lib/components/primitives/sonner/index.ts +2 -0
  503. package/src/lib/components/primitives/sonner/sonner.svelte +13 -0
  504. package/src/lib/components/primitives/switch/index.ts +7 -0
  505. package/src/lib/components/primitives/switch/switch.svelte +29 -0
  506. package/src/lib/components/primitives/tabs/index.ts +16 -0
  507. package/src/lib/components/primitives/tabs/tabs-content.svelte +17 -0
  508. package/src/lib/components/primitives/tabs/tabs-list.svelte +16 -0
  509. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +20 -0
  510. package/src/lib/components/primitives/tabs/tabs.svelte +19 -0
  511. package/src/lib/components/primitives/textarea/index.ts +7 -0
  512. package/src/lib/components/primitives/textarea/textarea.svelte +23 -0
  513. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +39 -0
  514. package/src/lib/components/primitives/theme-switcher/index.ts +1 -0
  515. package/src/lib/components/viewer/MeshMetadataDialog.svelte +122 -0
  516. package/src/lib/components/viewer/SceneManager.svelte +297 -0
  517. package/src/lib/components/viewer/Viewer.svelte +311 -0
  518. package/src/lib/components/viewer/index.ts +3 -0
  519. package/src/lib/composables/useFooterItem.svelte.ts +40 -0
  520. package/src/lib/compute/computeThrottle.svelte.ts +97 -0
  521. package/src/lib/compute/solving.svelte.ts +77 -0
  522. package/src/lib/constants.ts +35 -0
  523. package/src/lib/contexts/footerContext.svelte.ts +54 -0
  524. package/src/lib/index.ts +31 -0
  525. package/src/lib/schema/defaults.ts +13 -0
  526. package/src/lib/schema/param-exporter.ts +160 -0
  527. package/src/lib/schema/visibility-rules.ts +94 -0
  528. package/src/lib/styles/base.css +145 -0
  529. package/src/lib/styles/themes/cyberpunk.css +98 -0
  530. package/src/lib/styles/themes/neutral.css +72 -0
  531. package/src/lib/styles/themes/ocean.css +75 -0
  532. package/src/lib/styles/themes/selva.css +105 -0
  533. package/src/lib/theme/themeStore.svelte.ts +50 -0
  534. package/src/lib/theme/themes.ts +18 -0
  535. package/src/lib/types/actionButton.ts +33 -0
  536. package/src/lib/types/solveFn.ts +29 -0
  537. package/src/lib/utils/color.ts +45 -0
  538. package/src/lib/utils/debounce.ts +36 -0
  539. package/src/lib/utils/file-download.ts +108 -0
  540. package/src/lib/utils/loadScript.ts +48 -0
  541. package/src/lib/utils.ts +13 -0
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Compute throttle utility for managing async compute requests.
3
+ *
4
+ * - Only one request in-flight at a time
5
+ * - Latest values always win (no queue)
6
+ * - AbortController support to cancel stale requests
7
+ * - Configurable timeout with automatic abort
8
+ */
9
+ interface ComputeThrottleOptions {
10
+ timeout?: number;
11
+ }
12
+ /**
13
+ * Creates a throttled compute handler that keeps only one request in-flight.
14
+ * If a new value arrives while one is running, it overwrites the single pending
15
+ * slot — older pending values are dropped. The pending value runs once the
16
+ * current request finishes (or aborts).
17
+ */
18
+ export declare function createComputeThrottle<T>(computeFn: (values: T, signal: AbortSignal) => Promise<void>, options?: ComputeThrottleOptions): {
19
+ trigger: (values: T) => void;
20
+ readonly isComputing: boolean;
21
+ readonly hasPending: boolean;
22
+ cancel: () => void;
23
+ };
24
+ export {};
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Fallback per-solve abort timeout (ms) when the caller doesn't pass one.
3
+ * Used only by callers without a deployment-specific limit (e.g. builder-app
4
+ * over WebSocket); compute-app supplies `MAX_SOLVE_DURATION_MS` from its
5
+ * server config via `ComputeApp`'s `solveTimeoutMs` prop.
6
+ */
7
+ const DEFAULT_TIMEOUT_MS = 60_000;
8
+ /**
9
+ * Creates a throttled compute handler that keeps only one request in-flight.
10
+ * If a new value arrives while one is running, it overwrites the single pending
11
+ * slot — older pending values are dropped. The pending value runs once the
12
+ * current request finishes (or aborts).
13
+ */
14
+ export function createComputeThrottle(computeFn, options = {}) {
15
+ const { timeout = DEFAULT_TIMEOUT_MS } = options;
16
+ let isComputing = $state(false);
17
+ let pendingValues = $state(null);
18
+ let currentAbortController = null;
19
+ function abortCurrent() {
20
+ currentAbortController?.abort();
21
+ currentAbortController = null;
22
+ }
23
+ async function executeCompute(values) {
24
+ abortCurrent();
25
+ currentAbortController = new AbortController();
26
+ const { signal } = currentAbortController;
27
+ const timeoutId = setTimeout(() => currentAbortController?.abort(), timeout);
28
+ isComputing = true;
29
+ try {
30
+ await computeFn(values, signal);
31
+ }
32
+ catch (err) {
33
+ if (!(err instanceof Error && err.name === 'AbortError')) {
34
+ throw err;
35
+ }
36
+ }
37
+ finally {
38
+ clearTimeout(timeoutId);
39
+ isComputing = false;
40
+ currentAbortController = null;
41
+ if (pendingValues !== null) {
42
+ const next = pendingValues;
43
+ pendingValues = null;
44
+ executeCompute(next);
45
+ }
46
+ }
47
+ }
48
+ function trigger(values) {
49
+ if (isComputing) {
50
+ pendingValues = values;
51
+ }
52
+ else {
53
+ executeCompute(values);
54
+ }
55
+ }
56
+ function cancel() {
57
+ pendingValues = null;
58
+ abortCurrent();
59
+ }
60
+ return {
61
+ trigger,
62
+ get isComputing() {
63
+ return isComputing;
64
+ },
65
+ get hasPending() {
66
+ return pendingValues !== null;
67
+ },
68
+ cancel
69
+ };
70
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Creates an adaptive solving indicator that measures actual solve durations
3
+ * and adjusts its visibility delay accordingly.
4
+ *
5
+ * - Fast solves (<200ms avg): indicator never shown (avoids flicker)
6
+ * - Slow solves (>600ms avg): indicator shown immediately
7
+ * - In between: indicator shown after a proportional delay
8
+ * - First solve: shows immediately (no history yet)
9
+ */
10
+ export declare function createSolvingIndicator(isSolving: () => boolean): {
11
+ readonly show: boolean;
12
+ };
@@ -0,0 +1,68 @@
1
+ import { untrack } from 'svelte';
2
+ import { APP_DEFAULTS } from '../constants';
3
+ /**
4
+ * Creates an adaptive solving indicator that measures actual solve durations
5
+ * and adjusts its visibility delay accordingly.
6
+ *
7
+ * - Fast solves (<200ms avg): indicator never shown (avoids flicker)
8
+ * - Slow solves (>600ms avg): indicator shown immediately
9
+ * - In between: indicator shown after a proportional delay
10
+ * - First solve: shows immediately (no history yet)
11
+ */
12
+ export function createSolvingIndicator(isSolving) {
13
+ const { FAST_THRESHOLD_MS, SLOW_THRESHOLD_MS, HISTORY_SIZE, ANIMATION_DELAY } = APP_DEFAULTS.SOLVING_INDICATOR;
14
+ let show = $state(false);
15
+ let timeout = null;
16
+ let solveStartTime = null;
17
+ const solveHistory = [];
18
+ $effect(() => {
19
+ const solving = isSolving();
20
+ untrack(() => {
21
+ if (solving) {
22
+ solveStartTime = performance.now();
23
+ const avg = solveHistory.length === 0
24
+ ? Infinity
25
+ : solveHistory.reduce((a, b) => a + b, 0) / solveHistory.length;
26
+ if (solveHistory.length > 0 && avg < FAST_THRESHOLD_MS)
27
+ return;
28
+ const delay = avg === Infinity || avg >= SLOW_THRESHOLD_MS
29
+ ? 0
30
+ : ((avg - FAST_THRESHOLD_MS) / (SLOW_THRESHOLD_MS - FAST_THRESHOLD_MS)) *
31
+ ANIMATION_DELAY;
32
+ if (!timeout) {
33
+ if (delay === 0) {
34
+ show = true;
35
+ }
36
+ else {
37
+ timeout = setTimeout(() => {
38
+ show = true;
39
+ timeout = null;
40
+ }, delay);
41
+ }
42
+ }
43
+ }
44
+ else {
45
+ if (solveStartTime !== null) {
46
+ solveHistory.push(performance.now() - solveStartTime);
47
+ if (solveHistory.length > HISTORY_SIZE)
48
+ solveHistory.shift();
49
+ solveStartTime = null;
50
+ }
51
+ if (timeout) {
52
+ clearTimeout(timeout);
53
+ timeout = null;
54
+ }
55
+ show = false;
56
+ }
57
+ });
58
+ return () => {
59
+ if (timeout)
60
+ clearTimeout(timeout);
61
+ };
62
+ });
63
+ return {
64
+ get show() {
65
+ return show;
66
+ }
67
+ };
68
+ }
@@ -0,0 +1,28 @@
1
+ export declare const APP_DEFAULTS: {
2
+ FILE_UPLOAD: {
3
+ MAX_SIZE_MB: number;
4
+ MAX_SIZE_BYTES: number;
5
+ };
6
+ TIMEOUTS: {
7
+ /** Duration to show solving state (ms) */
8
+ SOLVE_STATE_DURATION: number;
9
+ /** Parameter export callback delay (ms) */
10
+ PARAM_EXPORT_DELAY: number;
11
+ /** Viewer initialization delay (ms) */
12
+ VIEWER_INIT_DELAY: number;
13
+ };
14
+ SOLVING_INDICATOR: {
15
+ /** If solve is faster than this, don't show indicator (ms) */
16
+ FAST_THRESHOLD_MS: number;
17
+ /** If solve is slower than this, show indicator immediately (ms) */
18
+ SLOW_THRESHOLD_MS: number;
19
+ /** Animation delay for solve indicator (ms) */
20
+ ANIMATION_DELAY: number;
21
+ /** Number of solve durations to keep in history for averaging */
22
+ HISTORY_SIZE: number;
23
+ };
24
+ FILE_SIZE: {
25
+ /** Bytes per kilobyte */
26
+ BYTES_PER_KB: number;
27
+ };
28
+ };
@@ -0,0 +1,32 @@
1
+ export const APP_DEFAULTS = {
2
+ // File upload limits
3
+ FILE_UPLOAD: {
4
+ MAX_SIZE_MB: 150,
5
+ MAX_SIZE_BYTES: 150 * 1024 * 1024
6
+ },
7
+ // Timing & performance thresholds
8
+ TIMEOUTS: {
9
+ /** Duration to show solving state (ms) */
10
+ SOLVE_STATE_DURATION: 3500,
11
+ /** Parameter export callback delay (ms) */
12
+ PARAM_EXPORT_DELAY: 100,
13
+ /** Viewer initialization delay (ms) */
14
+ VIEWER_INIT_DELAY: 350
15
+ },
16
+ // Solving indicator adaptive thresholds
17
+ SOLVING_INDICATOR: {
18
+ /** If solve is faster than this, don't show indicator (ms) */
19
+ FAST_THRESHOLD_MS: 200,
20
+ /** If solve is slower than this, show indicator immediately (ms) */
21
+ SLOW_THRESHOLD_MS: 600,
22
+ /** Animation delay for solve indicator (ms) */
23
+ ANIMATION_DELAY: 300,
24
+ /** Number of solve durations to keep in history for averaging */
25
+ HISTORY_SIZE: 3
26
+ },
27
+ // File size formatting
28
+ FILE_SIZE: {
29
+ /** Bytes per kilobyte */
30
+ BYTES_PER_KB: 1024
31
+ }
32
+ };
@@ -0,0 +1,18 @@
1
+ import { SvelteMap } from 'svelte/reactivity';
2
+ export interface FooterItem {
3
+ id: string;
4
+ component: any;
5
+ /** Called on every render — return reactive state to keep footer in sync */
6
+ getProps: () => Record<string, any>;
7
+ position: 'left' | 'right';
8
+ priority: number;
9
+ onClick?: () => void;
10
+ }
11
+ export interface FooterStore {
12
+ items: SvelteMap<string, FooterItem>;
13
+ register(id: string, component: any, getProps: () => Record<string, any>, position?: 'left' | 'right', priority?: number, onClick?: () => void): void;
14
+ unregister(id: string): void;
15
+ }
16
+ export declare const FOOTER_CONTEXT_KEY: unique symbol;
17
+ export declare function initializeFooterContext(): FooterStore;
18
+ export declare function useFooter(): FooterStore;
@@ -0,0 +1,24 @@
1
+ import { getContext, setContext } from 'svelte';
2
+ import { SvelteMap } from 'svelte/reactivity';
3
+ export const FOOTER_CONTEXT_KEY = Symbol('footer-context');
4
+ export function initializeFooterContext() {
5
+ const items = new SvelteMap();
6
+ const store = {
7
+ items,
8
+ register(id, component, getProps, position = 'left', priority = 0, onClick) {
9
+ items.set(id, { id, component, getProps, position, priority, onClick });
10
+ },
11
+ unregister(id) {
12
+ items.delete(id);
13
+ }
14
+ };
15
+ setContext(FOOTER_CONTEXT_KEY, store);
16
+ return store;
17
+ }
18
+ export function useFooter() {
19
+ const store = getContext(FOOTER_CONTEXT_KEY);
20
+ if (!store) {
21
+ throw new Error('useFooter must be called within a component that is a descendant of the root layout');
22
+ }
23
+ return store;
24
+ }
@@ -0,0 +1,14 @@
1
+ export * from './components/layout';
2
+ export { default as AppLayout } from './components/compute/AppLayout.svelte';
3
+ export { default as ComputeApp } from './components/compute/ComputeApp.svelte';
4
+ export { default as ErrorScreen } from './components/ErrorScreen.svelte';
5
+ export * from './components/primitives';
6
+ export { default as StateDisplay } from './components/primitives/StateDisplay.svelte';
7
+ export { default as Viewer } from './components/viewer/Viewer.svelte';
8
+ export * from './schema/defaults';
9
+ export * from './compute/solving.svelte';
10
+ export * from './contexts/footerContext.svelte';
11
+ export * from './composables/useFooterItem.svelte';
12
+ export * from './utils';
13
+ export type { ActionButton } from './types/actionButton';
14
+ export type { SolveFn } from './types/solveFn';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ // Layout components (page chrome: shell, header, footer, nav)
2
+ export * from './components/layout';
3
+ // Compute app (schema + viewer + solve controls composed into a runnable app)
4
+ export { default as AppLayout } from './components/compute/AppLayout.svelte';
5
+ export { default as ComputeApp } from './components/compute/ComputeApp.svelte';
6
+ // Error screen
7
+ export { default as ErrorScreen } from './components/ErrorScreen.svelte';
8
+ // Design-system primitives (shadcn-svelte + custom)
9
+ export * from './components/primitives';
10
+ export { default as StateDisplay } from './components/primitives/StateDisplay.svelte';
11
+ // 3D viewer
12
+ export { default as Viewer } from './components/viewer/Viewer.svelte';
13
+ // Utilities
14
+ export * from './schema/defaults';
15
+ export * from './compute/solving.svelte';
16
+ // Contexts & Composables
17
+ export * from './contexts/footerContext.svelte';
18
+ export * from './composables/useFooterItem.svelte';
19
+ // Utils (cn function)
20
+ export * from './utils';
@@ -0,0 +1 @@
1
+ export declare function getDefaultValue(paramType: string): unknown;
@@ -0,0 +1,13 @@
1
+ export function getDefaultValue(paramType) {
2
+ switch (paramType) {
3
+ case 'number':
4
+ case 'integer':
5
+ return 0;
6
+ case 'boolean':
7
+ return false;
8
+ case 'text':
9
+ return '';
10
+ default:
11
+ return null;
12
+ }
13
+ }
@@ -0,0 +1,15 @@
1
+ import type { UISchema, ParameterPreset, ValidationIssueMessage } from '@selvajs/schemas';
2
+ export declare function createSavedState(schema: UISchema, currentValues: Record<string, unknown>, metadata: {
3
+ name: string;
4
+ description?: string;
5
+ author?: string;
6
+ tags?: string[];
7
+ }): ParameterPreset;
8
+ export declare function validateSavedState(savedState: ParameterPreset, currentSchema: UISchema): {
9
+ isValid: boolean;
10
+ issues: ValidationIssueMessage[];
11
+ canLoad: boolean;
12
+ };
13
+ export declare function extractLoadableValues(savedState: ParameterPreset, currentSchema: UISchema, validation: ReturnType<typeof validateSavedState>): Record<string, unknown>;
14
+ export declare function exportStateAsJson(savedState: ParameterPreset): void;
15
+ export declare function importStateFromJson(file: File): Promise<ParameterPreset>;
@@ -0,0 +1,120 @@
1
+ import { APP_DEFAULTS } from '../constants';
2
+ function getGroups(schema) {
3
+ if (!schema.layout)
4
+ return [];
5
+ if (schema.layout.type === 'tabbed')
6
+ return schema.layout.tabs.flatMap((t) => t.groups ?? []);
7
+ if (schema.layout.type === 'flat')
8
+ return schema.layout.groups ?? [];
9
+ return [];
10
+ }
11
+ export function createSavedState(schema, currentValues, metadata) {
12
+ const parameters = [];
13
+ for (const group of getGroups(schema)) {
14
+ for (const item of group.items ?? []) {
15
+ if (item.type !== 'input')
16
+ continue;
17
+ const value = currentValues[item.paramId];
18
+ const inputDef = schema.inputs.find((i) => i.id === item.paramId);
19
+ if (value !== undefined && inputDef) {
20
+ parameters.push({
21
+ paramId: item.paramId,
22
+ nickname: inputDef.nickname,
23
+ displayName: item.displayName || inputDef.nickname,
24
+ paramType: inputDef.paramType,
25
+ value,
26
+ groupName: group.label
27
+ });
28
+ }
29
+ }
30
+ }
31
+ return {
32
+ id: crypto.randomUUID(),
33
+ name: metadata.name,
34
+ description: metadata.description,
35
+ timestamp: new Date().toISOString(),
36
+ schemaId: schema.id,
37
+ documentId: schema.documentId ?? '',
38
+ projectFileName: schema.projectFileName ?? '',
39
+ pluginVersion: schema.pluginVersion ?? '',
40
+ author: metadata.author,
41
+ tags: metadata.tags ?? [],
42
+ parameters
43
+ };
44
+ }
45
+ export function validateSavedState(savedState, currentSchema) {
46
+ const issues = [];
47
+ if (savedState.documentId !== (currentSchema.documentId ?? '')) {
48
+ issues.push({
49
+ paramId: '__document__',
50
+ severity: 'error',
51
+ message: 'Document ID mismatch - this state was saved for a different document',
52
+ details: { expected: currentSchema.documentId ?? '', actual: savedState.documentId }
53
+ });
54
+ }
55
+ if (savedState.schemaId !== currentSchema.id) {
56
+ issues.push({
57
+ paramId: '__schema__',
58
+ severity: 'warning',
59
+ message: 'Schema has changed since this state was saved',
60
+ details: { expected: currentSchema.id, actual: savedState.schemaId }
61
+ });
62
+ }
63
+ for (const paramState of savedState.parameters) {
64
+ const inputDef = currentSchema.inputs.find((i) => i.id === paramState.paramId);
65
+ if (!inputDef) {
66
+ issues.push({
67
+ paramId: paramState.paramId,
68
+ severity: 'error',
69
+ message: `Parameter "${paramState.nickname}" no longer exists in the schema`
70
+ });
71
+ continue;
72
+ }
73
+ if (inputDef.nickname !== paramState.nickname) {
74
+ issues.push({
75
+ paramId: paramState.paramId,
76
+ severity: 'warning',
77
+ message: 'Parameter nickname changed',
78
+ details: { expected: paramState.nickname, actual: inputDef.nickname }
79
+ });
80
+ }
81
+ }
82
+ const hasErrors = issues.some((i) => i.severity === 'error');
83
+ return { isValid: issues.length === 0, issues, canLoad: !hasErrors };
84
+ }
85
+ export function extractLoadableValues(savedState, currentSchema, validation) {
86
+ const errorParamIds = new Set(validation.issues
87
+ .filter((i) => i.severity === 'error' && !i.paramId.startsWith('__'))
88
+ .map((i) => i.paramId));
89
+ const values = {};
90
+ for (const paramState of savedState.parameters) {
91
+ const exists = currentSchema.inputs.some((i) => i.id === paramState.paramId);
92
+ if (!errorParamIds.has(paramState.paramId) && exists) {
93
+ values[paramState.paramId] = paramState.value;
94
+ }
95
+ }
96
+ return values;
97
+ }
98
+ export function exportStateAsJson(savedState) {
99
+ const blob = new Blob([JSON.stringify(savedState, null, 2)], { type: 'application/json' });
100
+ const url = URL.createObjectURL(blob);
101
+ const link = document.createElement('a');
102
+ link.href = url;
103
+ link.download = `${savedState.name.replace(/[^a-z0-9]/gi, '_')}_${savedState.timestamp.split('T')[0].replace(/-/g, '_')}.sps`;
104
+ link.style.display = 'none';
105
+ document.body.appendChild(link);
106
+ setTimeout(() => {
107
+ link.click();
108
+ setTimeout(() => {
109
+ document.body.removeChild(link);
110
+ URL.revokeObjectURL(url);
111
+ }, APP_DEFAULTS.TIMEOUTS.PARAM_EXPORT_DELAY);
112
+ }, 0);
113
+ }
114
+ export async function importStateFromJson(file) {
115
+ const state = JSON.parse(await file.text());
116
+ if (!state.id || !state.name || !state.documentId || !state.parameters) {
117
+ throw new Error('Invalid saved state file format');
118
+ }
119
+ return state;
120
+ }
@@ -0,0 +1,12 @@
1
+ import type { LayoutItem, VisibilityRule, VisibilityCondition, GroupVisibilityCondition } from '@selvajs/schemas';
2
+ export interface VisibilityResult {
3
+ visible: boolean;
4
+ disabled: boolean;
5
+ defaultValue?: unknown;
6
+ }
7
+ export declare function evaluateRule(rule: VisibilityRule, values: Record<string, unknown>): boolean;
8
+ export declare function evaluateCondition(condition: VisibilityCondition | GroupVisibilityCondition, values: Record<string, unknown>): boolean;
9
+ export declare function evaluateVisibility(item: LayoutItem, values: Record<string, unknown>): VisibilityResult;
10
+ export declare function evaluateGroupVisibility(group: {
11
+ visibilityCondition?: GroupVisibilityCondition;
12
+ }, values: Record<string, unknown>): boolean;
@@ -0,0 +1,63 @@
1
+ const toStringArray = (value) => {
2
+ if (Array.isArray(value))
3
+ return value.map(String);
4
+ if (value === undefined || value === null || value === '')
5
+ return [];
6
+ return [String(value)];
7
+ };
8
+ const RULE_OPERATORS = {
9
+ equals: (a, b) => a === b,
10
+ notEquals: (a, b) => a !== b,
11
+ greaterThan: (a, b) => Number(a) > Number(b),
12
+ lessThan: (a, b) => Number(a) < Number(b),
13
+ greaterThanOrEqual: (a, b) => Number(a) >= Number(b),
14
+ lessThanOrEqual: (a, b) => Number(a) <= Number(b),
15
+ between: (a, _, vals) => vals?.length === 2 && Number(a) >= Number(vals[0]) && Number(a) <= Number(vals[1]),
16
+ in: (a, _, vals) => vals?.includes(String(a)) ?? false,
17
+ notIn: (a, _, vals) => !(vals?.includes(String(a)) ?? false),
18
+ matches: (a, b) => {
19
+ try {
20
+ return new RegExp(String(b)).test(String(a));
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ },
26
+ contains: (a, b) => toStringArray(a).includes(String(b)),
27
+ containsAny: (a, _, vals) => {
28
+ const arr = toStringArray(a);
29
+ return vals?.some((v) => arr.includes(String(v))) ?? false;
30
+ },
31
+ isEmpty: (a) => toStringArray(a).length === 0,
32
+ isNotEmpty: (a) => toStringArray(a).length > 0
33
+ };
34
+ export function evaluateRule(rule, values) {
35
+ const fn = RULE_OPERATORS[rule.operator];
36
+ return fn ? fn(values[rule.paramId], rule.value, rule.values) : false;
37
+ }
38
+ export function evaluateCondition(condition, values) {
39
+ const results = condition.rules.map((rule) => evaluateRule(rule, values));
40
+ return condition.mode === 'any' ? results.some(Boolean) : results.every(Boolean);
41
+ }
42
+ const ACTIONS = {
43
+ show: (met) => ({ visible: met, disabled: false }),
44
+ hide: (met, dv) => ({ visible: !met, disabled: false, defaultValue: dv }),
45
+ disable: (met, dv) => ({ visible: true, disabled: met, defaultValue: met ? dv : undefined })
46
+ };
47
+ export function evaluateVisibility(item, values) {
48
+ if (item.type === 'linebreak')
49
+ return { visible: true, disabled: false };
50
+ if (!item.visibilityCondition?.rules)
51
+ return { visible: true, disabled: false };
52
+ const { action = 'show', defaultValue } = item.visibilityCondition;
53
+ const met = evaluateCondition(item.visibilityCondition, values);
54
+ const actionFn = ACTIONS[action] ?? ACTIONS.show;
55
+ return actionFn(met, defaultValue);
56
+ }
57
+ export function evaluateGroupVisibility(group, values) {
58
+ if (!group.visibilityCondition?.rules)
59
+ return true;
60
+ const { action = 'show' } = group.visibilityCondition;
61
+ const met = evaluateCondition(group.visibilityCondition, values);
62
+ return action === 'hide' ? !met : met;
63
+ }