@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
@@ -1,19 +1,19 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { UISchema, SupportedTypes, ParameterPreset } from '@selvajs/schemas';
4
- import type { SolveSettlement } from '@selvajs/solve/client';
4
+ import type { LiveSolveState, SolveSettlement } from '@selvajs/solve/client';
5
5
  import type { ActionButton } from '../../types/actionButton';
6
6
  import type { PresetLabels } from '../../types/presetLabels';
7
- import { ChevronUp, Download, Ellipsis, Upload } from '@lucide/svelte';
7
+ import { ChevronLeft, ChevronUp, Download, Ellipsis, Upload } from '@lucide/svelte';
8
8
  import type { ThreeViewer } from '@selvajs/visualization/render';
9
9
  import Viewer, { type ViewerConfig } from '../viewer/Viewer.svelte';
10
10
  import CalculateButton from '../primitives/CalculateButton.svelte';
11
11
  import SolvingIndicator from '../primitives/SolvingIndicator.svelte';
12
12
  import TabLayout from '../preview/TabLayout.svelte';
13
13
  import CollapsedPanelStrip from './CollapsedPanelStrip.svelte';
14
- import * as Resizable from '$lib/components/primitives/resizable';
15
- import * as DropdownMenu from '$lib/components/primitives/dropdown-menu/index.js';
16
- import { Button } from '$lib';
14
+ import * as Resizable from '#lib/components/primitives/resizable/index.js';
15
+ import * as DropdownMenu from '#lib/components/primitives/dropdown-menu/index.js';
16
+ import { Button } from '#lib';
17
17
  import ParameterPresetManager from './ParameterPresetManager.svelte';
18
18
  import { runPanelAction } from '../../compute/run-panel-action';
19
19
  import { getLocaleContext } from '../../i18n/localeContext.svelte';
@@ -34,8 +34,20 @@
34
34
  showViewer: boolean;
35
35
  meshes?: any[];
36
36
  isSolving: boolean;
37
+ /**
38
+ * `createSolvingIndicator(...).show`, not `isSolving`: grows the action row's solve status,
39
+ * which would otherwise flash on every sub-second solve.
40
+ */
37
41
  showSolvingIndicator?: boolean;
38
- /** `SolvingIndicator`'s `placement`; `inline` puts it in the action row. */
42
+ /** `createSolvingIndicator(...).slow`: the solve status grows into a card with progress. */
43
+ solveIsSlow?: boolean;
44
+ /** The session's live channel: step, count and bar for that card. */
45
+ live?: LiveSolveState;
46
+ /** Abort in that card. The host's `SolveMessages` should then take `progressShownByHost`. */
47
+ onabort?: () => void;
48
+ /** As passed to `createSolvingIndicator`. */
49
+ freezesDuringSolve?: boolean;
50
+ /** @deprecated Ignored: the solving status always sits in the action row. */
39
51
  solvingIndicatorPlacement?: 'floating' | 'inline';
40
52
  /** Rendered above the action row, for a host that keeps the solve's messages in the flow. */
41
53
  solveMessages?: Snippet;
@@ -68,7 +80,10 @@
68
80
  meshes = [],
69
81
  isSolving,
70
82
  showSolvingIndicator = false,
71
- solvingIndicatorPlacement = 'floating',
83
+ solveIsSlow = false,
84
+ live,
85
+ onabort,
86
+ freezesDuringSolve = false,
72
87
  solveMessages,
73
88
  hasPendingChanges = false,
74
89
  hasNeverSolved = false,
@@ -140,16 +155,37 @@
140
155
  // With several tabs the first tab's name would mislabel whichever one is showing.
141
156
  const drawerLabel = $derived(leftTabs.length === 1 ? leftTabs[0].label : t.parametersTab);
142
157
 
158
+ // A phone on its side is wide enough for the desktop columns but far too short for them, and a
159
+ // bottom drawer would leave the model a strip. It gets the phone layout with the drawer moved to
160
+ // the right edge instead.
161
+ let sideSheet = $state(false);
162
+
143
163
  $effect(() => {
144
- const mqMobile = window.matchMedia('(max-width: 639px)');
164
+ const mqNarrow = window.matchMedia('(max-width: 639px)');
165
+ const mqPhoneLandscape = window.matchMedia(
166
+ '(pointer: coarse) and (orientation: landscape) and (max-height: 500px)'
167
+ );
145
168
  function update() {
146
- isMobile = mqMobile.matches;
169
+ sideSheet = mqPhoneLandscape.matches;
170
+ isMobile = mqNarrow.matches || sideSheet;
147
171
  }
148
172
  update();
149
- mqMobile.addEventListener('change', update);
150
- return () => mqMobile.removeEventListener('change', update);
173
+ mqNarrow.addEventListener('change', update);
174
+ mqPhoneLandscape.addEventListener('change', update);
175
+ return () => {
176
+ mqNarrow.removeEventListener('change', update);
177
+ mqPhoneLandscape.removeEventListener('change', update);
178
+ };
151
179
  });
152
180
 
181
+ // Without a viewer there's nothing to sit beside, so a narrow host (a docked Rhino panel) gets
182
+ // the phone's single edge-to-edge column instead of a card floating in its own margins.
183
+ const STACK_BELOW_WIDTH = 900;
184
+ let rootWidth = $state(0);
185
+ const stacked = $derived(
186
+ isMobile || (!hasViewer && rootWidth > 0 && rootWidth < STACK_BELOW_WIDTH)
187
+ );
188
+
153
189
  let leftCollapsed = $state(false);
154
190
  let rightCollapsed = $state(false);
155
191
  let leftPaneRef = $state<{ expand: () => void } | null>(null);
@@ -166,30 +202,39 @@
166
202
  await onLoadValues?.(loadedValues);
167
203
  }
168
204
 
169
- let touchStartY = 0;
205
+ let touchStart = { x: 0, y: 0 };
170
206
 
207
+ // The side sheet beside the model has no half state: it is open or closed.
171
208
  function stepDrawer(by: number) {
209
+ if (sideSheet) {
210
+ drawer = by > 0 ? 'full' : 'closed';
211
+ return;
212
+ }
172
213
  const index = DRAWER_STATES.indexOf(drawer) + by;
173
214
  drawer = DRAWER_STATES[Math.max(0, Math.min(DRAWER_STATES.length - 1, index))];
174
215
  }
175
216
 
176
217
  function onDrawerTouchStart(e: TouchEvent) {
177
- touchStartY = e.touches[0].clientY;
218
+ touchStart = { x: e.touches[0].clientX, y: e.touches[0].clientY };
178
219
  }
179
220
 
221
+ // Toward the open side opens: up for the bottom drawer, left for the side sheet.
180
222
  function onDrawerTouchEnd(e: TouchEvent) {
181
- const deltaY = e.changedTouches[0].clientY - touchStartY;
223
+ const delta = sideSheet
224
+ ? e.changedTouches[0].clientX - touchStart.x
225
+ : e.changedTouches[0].clientY - touchStart.y;
182
226
  const SWIPE_THRESHOLD = 40;
183
- if (Math.abs(deltaY) > SWIPE_THRESHOLD) {
227
+ if (Math.abs(delta) > SWIPE_THRESHOLD) {
184
228
  // Suppresses the click a short swipe can still end in, which would step the drawer twice.
185
229
  e.preventDefault();
186
- stepDrawer(deltaY < 0 ? 1 : -1);
230
+ stepDrawer(delta < 0 ? 1 : -1);
187
231
  }
188
232
  }
189
233
 
190
- // A tap walks closed → half → full → closed.
234
+ // A tap walks closed → half → full → closed; the side sheet just toggles.
191
235
  function onDrawerHandleClick() {
192
- drawer = drawer === 'full' ? 'closed' : DRAWER_STATES[DRAWER_STATES.indexOf(drawer) + 1];
236
+ if (sideSheet) drawer = drawer === 'closed' ? 'full' : 'closed';
237
+ else drawer = drawer === 'full' ? 'closed' : DRAWER_STATES[DRAWER_STATES.indexOf(drawer) + 1];
193
238
  }
194
239
  </script>
195
240
 
@@ -255,9 +300,9 @@
255
300
  <!-- One primary action and one menu. A definition that solves on every change has no Calculate,
256
301
  so the menu sits alone at the end of the row. -->
257
302
  {#snippet footer()}
258
- {#if solveMessages}
259
- <div class="px-2">{@render solveMessages()}</div>
260
- {/if}
303
+ <!-- No wrapper: it would always render (the messages' live region is never empty) and pick up
304
+ the drawer footer's row padding, leaving a gap above Calculate with nothing in it. -->
305
+ {@render solveMessages?.()}
261
306
  {#if schema.instanceSolve === false}
262
307
  <CalculateButton
263
308
  {hasPendingChanges}
@@ -266,13 +311,18 @@
266
311
  {oncalculate}
267
312
  trailing={hasMenu ? actionsMenu : undefined}
268
313
  />
269
- {:else if hasMenu || solvingIndicatorPlacement === 'inline'}
270
- <div class="mt-3 pb-3 pt-2 px-2 gap-2 flex items-center border-t border-border/50">
271
- {#if solvingIndicatorPlacement === 'inline'}
272
- <SolvingIndicator show={showSolvingIndicator} placement="inline" />
273
- {/if}
314
+ {:else}
315
+ <div class="mt-3 pb-3 pt-2 px-2 gap-2 flex items-center border-t border-border">
316
+ <SolvingIndicator
317
+ {isSolving}
318
+ show={showSolvingIndicator}
319
+ slow={solveIsSlow}
320
+ {live}
321
+ {onabort}
322
+ {freezesDuringSolve}
323
+ />
274
324
  {#if hasMenu}
275
- <div class="ml-auto">{@render actionsMenu()}</div>
325
+ {@render actionsMenu()}
276
326
  {/if}
277
327
  </div>
278
328
  {/if}
@@ -287,9 +337,9 @@
287
337
  )}
288
338
  <div class="panel-content-wrapper">
289
339
  {#if schema.layout.type === 'tabbed'}
290
- <TabLayout {schema} {values} {onValueChange} {panelFilter} {requestedTabId} bare={isMobile} />
340
+ <TabLayout {schema} {values} {onValueChange} {panelFilter} {requestedTabId} bare={stacked} />
291
341
  {/if}
292
- {#if hostsFooter && !isMobile}
342
+ {#if hostsFooter && !stacked}
293
343
  <div class="panel-footer px-1">
294
344
  {@render footer()}
295
345
  </div>
@@ -306,15 +356,17 @@
306
356
 
307
357
  <main
308
358
  data-layout-root
309
- class="min-h-0 sm:flex-row sm:py-(--page-py) flex flex-1 flex-col overflow-hidden {leftCollapsed
310
- ? 'sm:pl-0'
311
- : 'sm:pl-(--page-px)'} {rightCollapsed ? 'sm:pr-0' : 'sm:pr-(--page-px)'}"
359
+ class="min-h-0 flex flex-1 flex-col overflow-hidden {stacked
360
+ ? ''
361
+ : `sm:flex-row sm:py-2 ${leftCollapsed ? 'sm:pl-0' : 'sm:pl-2'} ${rightCollapsed ? 'sm:pr-0' : 'sm:pr-2'}`}"
312
362
  class:fullscreen-layout={isViewerFullscreen}
313
363
  class:relative={isMobile}
314
- class:mobile-root={isMobile}
364
+ class:mobile-root={stacked}
365
+ class:side-sheet={isMobile && sideSheet}
366
+ bind:clientWidth={rootWidth}
315
367
  >
316
- {#if isMobile}
317
- {#if hasViewer}
368
+ {#if stacked}
369
+ {#if isMobile && hasViewer}
318
370
  <!-- Ends above the drawer rather than behind it, so the model stays centred in what is
319
371
  visible. It jumps straight to its new size: animating it would resize the canvas,
320
372
  and its render targets, on every frame of the drawer's slide. -->
@@ -322,20 +374,22 @@
322
374
  <Viewer
323
375
  {meshes}
324
376
  bind:isFullscreen={isViewerFullscreen}
325
- {isSolving}
326
- drawerOpen={drawer === 'full'}
377
+ drawerOpen={!sideSheet && drawer === 'full'}
327
378
  {logoUrl}
328
379
  {onViewerReady}
329
380
  viewerConfig={{
330
381
  ...viewerConfig,
331
- backgroundColor: schema?.viewerOptions?.backgroundColor,
382
+ backgroundColor: schema?.viewerOptions?.backgroundColor ?? viewerConfig.backgroundColor,
383
+ look: schema?.viewerOptions?.look ?? viewerConfig.look,
332
384
  showSceneManager: false
333
385
  }}
334
386
  />
335
387
  </div>
336
388
 
337
389
  <div
338
- class="drawer-container rounded-t-2xl z-40 border-t bg-background shadow-sheet drawer-{drawer}"
390
+ class="drawer-container z-40 bg-background shadow-sheet drawer-{drawer} {sideSheet
391
+ ? 'rounded-l-xl border-l'
392
+ : 'rounded-t-xl border-t'}"
339
393
  >
340
394
  <!-- Named by its visible label; aria-expanded carries the open/closed state. -->
341
395
  <button
@@ -346,42 +400,57 @@
346
400
  aria-expanded={drawer !== 'closed'}
347
401
  >
348
402
  <div class="drawer-pill"></div>
349
- <span class="text-sm font-medium ml-2 text-foreground">{drawerLabel}</span>
350
- <ChevronUp
351
- size={16}
352
- class="ml-auto text-muted-foreground transition-transform duration-300 {drawer ===
353
- 'full'
354
- ? 'rotate-180'
355
- : ''}"
356
- />
403
+ <span class="drawer-label text-sm font-medium text-foreground">{drawerLabel}</span>
404
+ {#if sideSheet}
405
+ <ChevronLeft
406
+ size={16}
407
+ class="text-muted-foreground transition-transform duration-300 {drawer !== 'closed'
408
+ ? 'rotate-180'
409
+ : ''}"
410
+ />
411
+ {:else}
412
+ <ChevronUp
413
+ size={16}
414
+ class="ml-auto text-muted-foreground transition-transform duration-300 {drawer ===
415
+ 'full'
416
+ ? 'rotate-180'
417
+ : ''}"
418
+ />
419
+ {/if}
357
420
  </button>
358
421
 
359
- <!-- Inert while closed: the fields are clipped out of view, and tabbing into them
422
+ <div class="drawer-body">
423
+ <!-- Inert while closed: the fields are clipped out of view, and tabbing into them
360
424
  would scroll the drawer's insides around behind the handle. -->
361
- <div class="drawer-content" inert={drawer === 'closed'}>
362
- <div class="px-2 pb-4">
363
- {#if hasLeftPanel}
364
- {@render panelContent(hasRightPanel ? 'left' : undefined, requestedLeftTabId, false)}
365
- {/if}
366
- {#if hasRightPanel}
367
- <!-- Decorative: the section below names itself with a heading. -->
368
- <div class="my-4 gap-2 flex items-center" aria-hidden="true">
369
- <div class="h-px flex-1 bg-border"></div>
370
- <span class="text-xs font-medium px-1 text-muted-foreground">
371
- {rightTabs[0]?.label ?? t.moreTab}
372
- </span>
373
- <div class="h-px flex-1 bg-border"></div>
374
- </div>
375
- {@render panelContent('right', requestedRightTabId, false)}
376
- {/if}
425
+ <div class="drawer-content" inert={drawer === 'closed'}>
426
+ <div class="px-2 pb-4">
427
+ {#if hasLeftPanel}
428
+ {@render panelContent(
429
+ hasRightPanel ? 'left' : undefined,
430
+ requestedLeftTabId,
431
+ false
432
+ )}
433
+ {/if}
434
+ {#if hasRightPanel}
435
+ <!-- Decorative: the section below names itself with a heading. -->
436
+ <div class="my-4 gap-2 flex items-center" aria-hidden="true">
437
+ <div class="h-px flex-1 bg-border"></div>
438
+ <span class="text-xs font-medium px-1 text-muted-foreground">
439
+ {rightTabs[0]?.label ?? t.moreTab}
440
+ </span>
441
+ <div class="h-px flex-1 bg-border"></div>
442
+ </div>
443
+ {@render panelContent('right', requestedRightTabId, false)}
444
+ {/if}
445
+ </div>
377
446
  </div>
378
- </div>
379
447
 
380
- {@render drawerFooter(drawer === 'closed')}
448
+ {@render drawerFooter(drawer === 'closed')}
449
+ </div>
381
450
  </div>
382
451
  {:else}
383
452
  <div class="flex flex-1 flex-col overflow-hidden">
384
- <div class="px-3 pt-3 flex-1 overflow-y-auto">
453
+ <div class="px-3 pt-3 sm:px-5 flex-1 overflow-y-auto">
385
454
  {#if hasLeftPanel}
386
455
  {@render panelContent(hasRightPanel ? 'left' : undefined, requestedLeftTabId, false)}
387
456
  {/if}
@@ -401,7 +470,7 @@
401
470
  {/if}
402
471
  {:else if !hasViewer && !isTwoPanelMode && hasLeftPanel !== hasRightPanel}
403
472
  <!-- Single centered panel (left-only or right-only), no viewer -->
404
- <div class="min-h-0 flex h-full flex-1 justify-center">
473
+ <div class="min-h-0 p-1 flex h-full flex-1 justify-center">
405
474
  <div class="min-h-0 flex h-full w-4/5 flex-col">
406
475
  {@render panelContent(
407
476
  hasRightPanel ? 'right' : undefined,
@@ -428,7 +497,7 @@
428
497
  <Resizable.PaneGroup
429
498
  direction="horizontal"
430
499
  autoSaveId="selva-layout-{layoutKey}"
431
- class="min-h-0 flex-1"
500
+ class="min-h-0 m-1 flex-1"
432
501
  >
433
502
  {#if hasLeftPanel}
434
503
  <Resizable.Pane
@@ -441,7 +510,6 @@
441
510
  collapsedSize={0}
442
511
  onCollapse={() => (leftCollapsed = true)}
443
512
  onExpand={() => (leftCollapsed = false)}
444
- class="ml-1"
445
513
  >
446
514
  <div
447
515
  class="min-h-0 flex h-full flex-col {isViewerFullscreen || leftCollapsed
@@ -454,6 +522,7 @@
454
522
  <Resizable.Handle
455
523
  withHandle
456
524
  line={false}
525
+ class="translate-x-1.5 z-20"
457
526
  data-collapsed={leftCollapsed}
458
527
  onclick={() => {
459
528
  if (leftCollapsed) leftPaneRef?.expand();
@@ -462,30 +531,34 @@
462
531
  {/if}
463
532
 
464
533
  {#if hasViewer}
465
- <Resizable.Pane order={2} minSize={20} class="min-h-0 mx-1 flex flex-col">
534
+ <Resizable.Pane order={2} minSize={20} class="min-h-0 flex flex-col">
466
535
  <Viewer
467
536
  {meshes}
468
537
  bind:isFullscreen={isViewerFullscreen}
469
- {isSolving}
470
538
  {logoUrl}
471
539
  {onViewerReady}
472
540
  viewerConfig={{
473
541
  ...viewerConfig,
474
- backgroundColor: schema?.viewerOptions?.backgroundColor
542
+ backgroundColor:
543
+ schema?.viewerOptions?.backgroundColor ?? viewerConfig.backgroundColor,
544
+ look: schema?.viewerOptions?.look ?? viewerConfig.look
475
545
  }}
476
546
  />
477
547
  </Resizable.Pane>
478
548
  {/if}
479
549
 
480
550
  {#if hasRightPanel}
481
- <Resizable.Handle
482
- withHandle
483
- line={false}
484
- data-collapsed={rightCollapsed}
485
- onclick={() => {
486
- if (rightCollapsed) rightPaneRef?.expand();
487
- }}
488
- />
551
+ {#if hasViewer || !hasLeftPanel}
552
+ <Resizable.Handle
553
+ withHandle
554
+ line={false}
555
+ class="-translate-x-1.5 z-20"
556
+ data-collapsed={rightCollapsed}
557
+ onclick={() => {
558
+ if (rightCollapsed) rightPaneRef?.expand();
559
+ }}
560
+ />
561
+ {/if}
489
562
  <Resizable.Pane
490
563
  bind:this={rightPaneRef}
491
564
  order={3}
@@ -496,7 +569,6 @@
496
569
  collapsedSize={0}
497
570
  onCollapse={() => (rightCollapsed = true)}
498
571
  onExpand={() => (rightCollapsed = false)}
499
- class="mr-1"
500
572
  >
501
573
  <div
502
574
  class="min-h-0 flex h-full flex-col {isViewerFullscreen || rightCollapsed
@@ -523,10 +595,6 @@
523
595
  {/if}
524
596
  </div>
525
597
  {/if}
526
-
527
- {#if solvingIndicatorPlacement === 'floating'}
528
- <SolvingIndicator show={showSolvingIndicator} />
529
- {/if}
530
598
  </main>
531
599
 
532
600
  <!-- The save, load and validation dialogs; the footer's menu opens them. -->
@@ -592,6 +660,12 @@
592
660
  bottom: var(--drawer-half-h);
593
661
  }
594
662
 
663
+ /* The viewer's own minimum height is for a page that scrolls; here the region sets it, and
664
+ anything taller would run under the drawer and take the viewer's dock with it. */
665
+ .viewer-region > :global(*) {
666
+ min-height: 0;
667
+ }
668
+
595
669
  .drawer-container {
596
670
  position: absolute;
597
671
  bottom: 0;
@@ -645,6 +719,77 @@
645
719
  opacity: 0.4;
646
720
  }
647
721
 
722
+ .drawer-body {
723
+ flex: 1;
724
+ min-height: 0;
725
+ display: flex;
726
+ flex-direction: column;
727
+ }
728
+
729
+ .drawer-label {
730
+ margin-left: 0.5rem;
731
+ }
732
+
733
+ /* Phone on its side: the drawer becomes a sheet on the right, its handle a strip down its edge. */
734
+ .side-sheet {
735
+ --sheet-closed-w: 3.25rem;
736
+ /* vw, not %: the drawer body resolves this against the sheet, not the layout. */
737
+ --sheet-open-w: min(22rem, 55vw);
738
+ }
739
+
740
+ .side-sheet .viewer-region {
741
+ inset: 0 var(--sheet-closed-w) 0 0;
742
+ }
743
+
744
+ .side-sheet .viewer-region-raised {
745
+ right: var(--sheet-open-w);
746
+ }
747
+
748
+ .side-sheet .drawer-container {
749
+ top: 0;
750
+ left: auto;
751
+ height: auto;
752
+ flex-direction: row;
753
+ transition: width 0.35s cubic-bezier(0.32, 0.72, 0, 1);
754
+ }
755
+
756
+ .side-sheet .drawer-closed {
757
+ width: var(--sheet-closed-w);
758
+ }
759
+
760
+ .side-sheet .drawer-half,
761
+ .side-sheet .drawer-full {
762
+ width: var(--sheet-open-w);
763
+ }
764
+
765
+ .side-sheet .drawer-handle-bar {
766
+ width: var(--sheet-closed-w);
767
+ height: auto;
768
+ padding: 0 0 0 0.75rem;
769
+ flex-direction: column;
770
+ justify-content: center;
771
+ gap: 0.75rem;
772
+ }
773
+
774
+ .side-sheet .drawer-pill {
775
+ top: 50%;
776
+ left: 8px;
777
+ transform: translateY(-50%);
778
+ width: 4px;
779
+ height: 2.5rem;
780
+ }
781
+
782
+ .side-sheet .drawer-label {
783
+ margin-left: 0;
784
+ writing-mode: vertical-rl;
785
+ transform: rotate(180deg);
786
+ }
787
+
788
+ /* Holds its open width while the sheet slides, so the fields don't reflow on every frame. */
789
+ .side-sheet .drawer-body {
790
+ min-width: calc(var(--sheet-open-w) - var(--sheet-closed-w));
791
+ }
792
+
648
793
  .drawer-content {
649
794
  flex: 1;
650
795
  overflow-y: auto;
@@ -20,12 +20,14 @@
20
20
  [
21
21
  'gap-1 py-2 lg:py-3 lg:flex-col lg:w-auto px-2 lg:px-0',
22
22
  'flex w-full shrink-0 flex-row items-center',
23
- 'backdrop-blur-sm bg-background/90 cursor-pointer'
23
+ 'backdrop-blur-sm bg-background/90 cursor-pointer',
24
+ side === 'left' ? 'lg:border-r' : 'lg:border-l',
25
+ 'border-border'
24
26
  ].join(' ')
25
27
  );
26
28
 
27
29
  const tabButtonClass =
28
- 'w-8 h-8 rounded cursor-pointer flex shrink-0 items-center justify-center text-muted-foreground transition-colors hover:bg-accent hover:text-foreground';
30
+ 'w-8 h-8 rounded-md cursor-pointer flex shrink-0 items-center justify-center text-muted-foreground transition-colors hover:bg-hover hover:text-foreground';
29
31
  </script>
30
32
 
31
33
  <div
@@ -57,7 +57,7 @@
57
57
  footerText?: string;
58
58
  /**
59
59
  * How long one solve may take before the client aborts it (ms). Pass the same value the
60
- * server enforces (`COMPUTE_SOLVE_DEADLINE_MS`), or the client aborts solves that would
60
+ * server enforces for this definition's compute server, or the client aborts solves that would
61
61
  * have finished.
62
62
  */
63
63
  solveDeadlineMs: number;
@@ -286,7 +286,10 @@
286
286
  showViewer={!!schema.viewerOptions?.enableRemote}
287
287
  meshes={session.meshes}
288
288
  isSolving={session.isSolving}
289
- showSolvingIndicator={schema.instanceSolve !== false && solvingIndicator.show}
289
+ showSolvingIndicator={solvingIndicator.show}
290
+ solveIsSlow={solvingIndicator.slow}
291
+ live={session.live}
292
+ onabort={() => session.abort()}
290
293
  hasPendingChanges={session.hasPendingChanges}
291
294
  hasNeverSolved={session.hasNeverSolved}
292
295
  bind:isViewerFullscreen
@@ -317,4 +320,5 @@
317
320
  onabort={() => session.abort()}
318
321
  onconfirm={() => session.acknowledge()}
319
322
  ondiscard={() => session.discard()}
323
+ progressShownByHost={schema?.instanceSolve !== false}
320
324
  />
@@ -8,10 +8,10 @@
8
8
 
9
9
  import type { Snippet } from 'svelte';
10
10
  import type { SolveDiagnostic } from '@selvajs/solve/shared';
11
- import * as Dialog from '$lib/components/primitives/dialog';
12
- import IssueList, { type Issue } from '$lib/components/primitives/IssueList.svelte';
13
- import { getLocaleContext } from '$lib/i18n/localeContext.svelte';
14
- import { formatCount } from '$lib/i18n/messages';
11
+ import * as Dialog from '#lib/components/primitives/dialog/index.js';
12
+ import IssueList, { type Issue } from '#lib/components/primitives/IssueList.svelte';
13
+ import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
14
+ import { formatCount } from '#lib/i18n/messages.js';
15
15
 
16
16
  interface Props {
17
17
  /** The last solve's messages. Preferred over `errors`/`warnings` when both are given. */
@@ -203,7 +203,7 @@
203
203
  <button
204
204
  type="button"
205
205
  onclick={() => selectListedState(preset)}
206
- class="p-3 w-full rounded-lg border text-left transition-colors hover:bg-muted"
206
+ class="p-3 w-full rounded-lg border text-left transition-colors hover:bg-hover"
207
207
  >
208
208
  <div class="text-sm font-medium">{preset.name}</div>
209
209
  {#if preset.description}