@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
@@ -15,32 +15,18 @@
15
15
  type Grid,
16
16
  type ThreeViewer
17
17
  } from '@selvajs/visualization/render';
18
- import {
19
- Maximize,
20
- Minimize,
21
- Camera,
22
- Layers,
23
- Settings2,
24
- Box,
25
- Square,
26
- Frame,
27
- Ruler,
28
- Grid3x3,
29
- Palette,
30
- Spline
31
- } from '@lucide/svelte';
32
18
  import { SvelteSet } from 'svelte/reactivity';
33
19
  import type * as THREE from 'three';
34
20
  import type { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
35
21
  import { createSceneOutliner, type SceneOutliner } from '@selvajs/visualization/scene';
22
+ import { clearGeometryCache } from '@selvajs/visualization/parse';
36
23
  import SceneManager from './SceneManager.svelte';
24
+ import ViewerDock from './ViewerDock.svelte';
37
25
  import MeshMetadataPanel from './MeshMetadataPanel.svelte';
38
26
  import * as Resizable from '../primitives/resizable/index.js';
39
- import * as DropdownMenu from '../primitives/dropdown-menu/index.js';
40
- import { Button } from '../primitives/button/index.js';
41
- import type { Locale } from '../../i18n/messages';
42
- import { layerLocaleContext } from '../../i18n/localeContext.svelte';
43
- import { saveBlob } from '../../utils/host-files';
27
+ import type { Locale } from '../../i18n/messages.js';
28
+ import { layerLocaleContext } from '../../i18n/localeContext.svelte.js';
29
+ import { saveBlob } from '../../utils/host-files.js';
44
30
 
45
31
  export interface ViewerConfig {
46
32
  showScreenshotButton?: boolean;
@@ -51,6 +37,8 @@
51
37
  showDisplayMenu?: boolean;
52
38
  enableMeshClick?: boolean;
53
39
  backgroundColor?: string;
40
+ /** The look to open in. Default `technical`. */
41
+ look?: Look;
54
42
  /** Initial state of the edge overlay and its display-menu checkmark. Default false. */
55
43
  showEdges?: boolean;
56
44
  }
@@ -58,7 +46,10 @@
58
46
  interface Props {
59
47
  meshes: any[];
60
48
  isFullscreen?: boolean;
49
+ /** @deprecated Ignored: the panel's solve status shows a running solve. */
61
50
  isSolving?: boolean;
51
+ /** @deprecated Ignored, like `isSolving`. */
52
+ isSlow?: boolean;
62
53
  isBlurred?: boolean;
63
54
  drawerOpen?: boolean;
64
55
  viewerConfig?: ViewerConfig;
@@ -87,13 +78,13 @@
87
78
  showDisplayMenu: true,
88
79
  enableMeshClick: true,
89
80
  backgroundColor: '#E6E6E6',
81
+ look: 'technical',
90
82
  showEdges: false
91
83
  };
92
84
 
93
85
  let {
94
86
  meshes,
95
87
  isFullscreen = $bindable(false),
96
- isSolving = false,
97
88
  isBlurred = false,
98
89
  drawerOpen = false,
99
90
  viewerConfig = {},
@@ -119,11 +110,14 @@
119
110
  let clearEdges: ThreeViewer['clearEdges'] | null = null;
120
111
  let invalidate: (() => void) | null = null;
121
112
  let captureImage: ThreeViewer['captureImage'] | null = null;
122
- let setLook: ((look: Look) => void) | null = null;
113
+ let setLook: ThreeViewer['setLook'] | null = null;
114
+ let syncEmissiveLights: (() => void) | null = null;
123
115
  let updateGridScale: (() => void) | null = null;
124
116
  let updateShadowBounds: (() => void) | null = null;
125
117
  let fitToView: (() => void) | null = null;
126
118
  let clearSelection: (() => void) | null = null;
119
+ let selectEntries: ThreeViewer['selectEntries'] | null = null;
120
+ let setHover: ThreeViewer['setHover'] | null = null;
127
121
  let viewerInitialized = false;
128
122
  let sceneVersion = $state(0);
129
123
  let hideButton = $state(false);
@@ -138,9 +132,16 @@
138
132
  let projection: CameraProjection = $state('perspective');
139
133
  let measureActive = $state(false);
140
134
  let gridVisible = $state(false);
141
- let renderStyle: Look = $state('technical');
135
+ // A saved schema can name a look this build doesn't have, and an unknown look throws on mount.
136
+ const openingLook = untrack(() => {
137
+ const look = viewerConfig.look;
138
+ return look && LOOKS.includes(look) ? look : defaultViewerConfig.look;
139
+ });
140
+ const opensAsLineDrawing = LOOK_PRESETS[openingLook].requiresEdges === true;
141
+ const configuredEdges = untrack(() => viewerConfig.showEdges) ?? defaultViewerConfig.showEdges;
142
+ let renderStyle: Look = $state(openingLook);
142
143
  // Seeded once, then owned by the menu toggle.
143
- let edgesVisible = $state(untrack(() => viewerConfig.showEdges) ?? defaultViewerConfig.showEdges);
144
+ let edgesVisible = $state(opensAsLineDrawing || configuredEdges);
144
145
  let selectedMeshMetadata: Record<string, any> | null = $state(null);
145
146
  let selectedMeshName: string | null = $state(null);
146
147
 
@@ -153,14 +154,20 @@
153
154
  arctic: t.lookArctic,
154
155
  xray: t.lookXray,
155
156
  lineart: t.lookLineart,
156
- wireframe: t.lookWireframe
157
+ wireframe: t.lookWireframe,
158
+ night: t.lookNight
157
159
  });
160
+ // Night has its own toggle, so it stays out of the radio list.
158
161
  const styleOptions = $derived<{ look: Look; label: string }[]>(
159
- LOOKS.map((look) => ({
162
+ LOOKS.filter((look) => look !== 'night').map((look) => ({
160
163
  look,
161
164
  label: lookLabels[look] ?? look.charAt(0).toUpperCase() + look.slice(1)
162
165
  }))
163
166
  );
167
+ const nightOn = $derived(renderStyle === 'night');
168
+
169
+ // What the night toggle returns to.
170
+ let dayLook: Look = $state(openingLook === 'night' ? defaultViewerConfig.look : openingLook);
164
171
 
165
172
  const VIEW_PRESETS: { preset: ViewPreset; label: () => string }[] = [
166
173
  { preset: 'top', label: () => t.viewTop },
@@ -198,8 +205,8 @@
198
205
  events: {
199
206
  // Fires before onMeshMetadataClicked, so picking an object without metadata closes the
200
207
  // previous object's panel instead of leaving it describing the wrong thing.
201
- onObjectSelected: closeMetadata,
202
- onBackgroundClicked: closeMetadata,
208
+ onObjectSelected: dropPanelSelection,
209
+ onBackgroundClicked: dropPanelSelection,
203
210
  onMeshMetadataClicked: config.enableMeshClick
204
211
  ? (metadata: Record<string, unknown>) => {
205
212
  if (hasUsefulMetadata(metadata)) {
@@ -227,25 +234,25 @@
227
234
  invalidate = init.invalidate;
228
235
  captureImage = init.captureImage;
229
236
  setLook = init.setLook;
237
+ syncEmissiveLights = init.syncEmissiveLights;
230
238
  updateGridScale = init.updateGridScale;
231
239
  updateShadowBounds = init.updateShadowBounds;
232
240
  fitToView = init.fitToView;
233
241
  clearSelection = init.clearSelection;
242
+ selectEntries = init.selectEntries;
243
+ setHover = init.setHover;
234
244
  projection = init.cameraController.getProjection();
235
245
 
236
- const renderer = init.renderer;
237
-
238
246
  // Untracked so the host reading `meshes` or config inside its setup can't re-run onMount's teardown.
239
247
  const hostCleanup = untrack(() => onViewerReady?.(init));
240
248
 
241
249
  return () => {
242
250
  // Before dispose, so the host can still remove its own objects from a live scene.
243
251
  hostCleanup?.();
252
+ // Also frees the GL context: a second forceContextLoss() here hits an already-lost one.
244
253
  init.dispose();
245
- // `{#key definitionKey}` recreates the canvas + WebGLRenderer + GL context
246
- // on every definition switch; browsers cap live contexts (~16). Explicitly
247
- // drop this one so the GPU-side context is released now rather than at GC.
248
- renderer.forceContextLoss();
254
+ // Parsed geometry outlives the viewer otherwise: the cache is page-wide.
255
+ clearGeometryCache();
249
256
  };
250
257
  });
251
258
 
@@ -273,12 +280,13 @@
273
280
 
274
281
  // Edges the lineart look switched on, so leaving it can put the user's own choice back rather
275
282
  // than stranding them with overlays they never asked for.
276
- let edgesBeforeLineDrawing: boolean | null = null;
283
+ let edgesBeforeLineDrawing: boolean | null = opensAsLineDrawing ? configuredEdges : null;
277
284
 
278
285
  function setRenderStyle(look: Look) {
279
286
  if (!setLook || look === renderStyle) return;
280
287
  const wasLineDrawing = LOOK_PRESETS[renderStyle].requiresEdges === true;
281
288
  renderStyle = look;
289
+ if (look !== 'night') dayLook = look;
282
290
  setLook(look);
283
291
 
284
292
  // A look never drives the overlay itself; honouring `requiresEdges` is the host's call. Without
@@ -344,6 +352,10 @@
344
352
  else clearEdges?.(scene);
345
353
  }
346
354
 
355
+ function toggleNight() {
356
+ setRenderStyle(nightOn ? dayLook : 'night');
357
+ }
358
+
347
359
  function toggleEdges() {
348
360
  edgesVisible = !edgesVisible;
349
361
  // Toggling by hand inside lineart overrides what that look forced, so the pre-look value is
@@ -360,7 +372,8 @@
360
372
  untrack(() => {
361
373
  // The new meshes carry the materials the parser built, so a look that overrides them
362
374
  // (arctic, x-ray) has to be re-applied or the solve silently reverts to shaded.
363
- setLook?.(renderStyle);
375
+ // Emissive lights wait for `applyTo` below, or a hidden lamp would count as lit.
376
+ setLook?.(renderStyle, { deferEmissiveLights: true });
364
377
  // updateScene discarded the previous solve's overlays along with its content.
365
378
  if (edgesVisible) applyEdges?.(scene!, edgeOverrides());
366
379
  // Rescale the grid so cells and fade match the new content's extent.
@@ -371,6 +384,7 @@
371
384
  // The rebuild un-hid everything; the outliner keys hidden state on Grasshopper
372
385
  // identity, not on the instances just discarded, so it can re-hide it.
373
386
  outliner?.applyTo();
387
+ syncEmissiveLights?.();
374
388
  sceneVersion++;
375
389
  // Repaint now rather than on the render loop's safety interval.
376
390
  invalidate?.();
@@ -387,6 +401,24 @@
387
401
  selectedMeshName = null;
388
402
  }
389
403
 
404
+ // A click on the canvas replaces whatever the panel selected: one selection at a time.
405
+ function dropPanelSelection() {
406
+ closeMetadata();
407
+ selectedObjects.clear();
408
+ }
409
+
410
+ // Mirrors the panel's selection into the viewport. The size check skips walking the entries for
411
+ // the common empty case, which also keeps `has()` from subscribing to every key.
412
+ $effect(() => {
413
+ if (selectedObjects.size === 0) {
414
+ selectEntries?.([]);
415
+ return;
416
+ }
417
+ const chosen = outliner?.entries().filter((entry) => selectedObjects.has(entry.key)) ?? [];
418
+ closeMetadata();
419
+ selectEntries?.(chosen);
420
+ });
421
+
390
422
  function dismissMetadata() {
391
423
  closeMetadata();
392
424
  clearSelection?.();
@@ -409,6 +441,27 @@
409
441
  isFullscreen = !isFullscreen;
410
442
  }
411
443
 
444
+ // Single letters; F (fit) is handled by the canvas itself. Held back while typing, e.g. in the
445
+ // scene manager's search box.
446
+ const SHORTCUTS: Record<string, () => void> = {
447
+ o: toggleProjection,
448
+ m: toggleMeasure,
449
+ g: toggleGrid,
450
+ n: toggleNight,
451
+ e: toggleEdges,
452
+ s: () => (sceneManagerOpen = !sceneManagerOpen)
453
+ };
454
+
455
+ function handleShortcut(event: KeyboardEvent) {
456
+ if (event.ctrlKey || event.metaKey || event.altKey || event.repeat) return;
457
+ const target = event.target as HTMLElement;
458
+ if (target.closest('input, textarea, select, [contenteditable]')) return;
459
+ const action = SHORTCUTS[event.key.toLowerCase()];
460
+ if (!action) return;
461
+ event.preventDefault();
462
+ action();
463
+ }
464
+
412
465
  function hasUsefulMetadata(metadata: Record<string, any>): boolean {
413
466
  if (!metadata) return false;
414
467
 
@@ -439,10 +492,13 @@
439
492
  }
440
493
  </script>
441
494
 
495
+ <!-- Key events bubble up from the focused canvas or any control inside; the div itself is not interactive. -->
496
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
442
497
  <div
443
498
  class="min-h-64 sm:min-h-96 lg:min-h-125 relative h-full flex-1 border {isFullscreen
444
499
  ? 'fullscreen-viewer'
445
500
  : 'overflow-hidden rounded-lg'}"
501
+ onkeydown={handleShortcut}
446
502
  >
447
503
  <Resizable.PaneGroup direction="horizontal" class="h-full w-full">
448
504
  <!-- `defaultSize` must sum to 100 across the live panes. Panes register a frame before the
@@ -456,7 +512,7 @@
456
512
  the DOM, so this is the only observable proof a solve's geometry decoded and
457
513
  rendered; e2e asserts on it. -->
458
514
  <canvas
459
- class="viewer-canvas block h-full w-full select-none"
515
+ class="viewer-canvas block h-full w-full outline-none select-none"
460
516
  data-testid="viewer-canvas"
461
517
  data-mesh-count={meshes.length}
462
518
  bind:this={canvas}
@@ -468,10 +524,6 @@
468
524
  : 'blur-overlay-inactive'}"
469
525
  ></div>
470
526
 
471
- {#if isSolving}
472
- <div class="inset-0 animate-in fade-in backdrop-blur-xs absolute z-10 duration-200"></div>
473
- {/if}
474
-
475
527
  {#if logoUrl}
476
528
  <!-- pointer-events:none so it never intercepts canvas drags. -->
477
529
  <div
@@ -497,143 +549,36 @@
497
549
  {/if}
498
550
 
499
551
  {#if config.showToolsMenu}
500
- <div
501
- class="left-4 bottom-4 gap-2 *:shadow-lg absolute z-50 flex items-center *:rounded-md {hideButton
502
- ? 'pointer-events-none opacity-0'
503
- : ''}"
504
- >
505
- <DropdownMenu.Root>
506
- <DropdownMenu.Trigger>
507
- {#snippet child({ props })}
508
- <Button
509
- {...props}
510
- variant="overlay"
511
- size="icon-lg"
512
- title={t.toolsMenu}
513
- aria-label={t.toolsMenu}
514
- >
515
- <Settings2 />
516
- </Button>
517
- {/snippet}
518
- </DropdownMenu.Trigger>
519
- <!-- Above the fullscreen viewer, which sits at z-index 10000. -->
520
- <DropdownMenu.Content sideOffset={6} class="min-w-44 z-10001 w-auto">
521
- <DropdownMenu.Item onSelect={toggleProjection}>
522
- {#if projection === 'perspective'}
523
- <Square />
524
- {t.switchToOrthographic}
525
- {:else}
526
- <Box />
527
- {t.switchToPerspective}
528
- {/if}
529
- </DropdownMenu.Item>
530
- <DropdownMenu.Item onSelect={() => fitToView?.()}>
531
- <Frame />
532
- {t.fitToView}
533
- </DropdownMenu.Item>
534
-
535
- <DropdownMenu.Sub>
536
- <DropdownMenu.SubTrigger>
537
- <Box />
538
- {t.views}
539
- </DropdownMenu.SubTrigger>
540
- <DropdownMenu.SubContent class="z-10001">
541
- {#each VIEW_PRESETS as { preset, label } (preset)}
542
- <DropdownMenu.Item onSelect={() => setView(preset)}
543
- >{label()}</DropdownMenu.Item
544
- >
545
- {/each}
546
- </DropdownMenu.SubContent>
547
- </DropdownMenu.Sub>
548
-
549
- {#if config.showDisplayMenu}
550
- <DropdownMenu.Sub>
551
- <DropdownMenu.SubTrigger>
552
- <Palette />
553
- {t.display}
554
- </DropdownMenu.SubTrigger>
555
- <DropdownMenu.SubContent class="min-w-40 z-10001">
556
- <DropdownMenu.RadioGroup
557
- value={renderStyle}
558
- onValueChange={(look) => setRenderStyle(look as typeof renderStyle)}
559
- >
560
- {#each styleOptions as { look, label } (look)}
561
- <DropdownMenu.RadioItem value={look} closeOnSelect={false}>
562
- {label}
563
- </DropdownMenu.RadioItem>
564
- {/each}
565
- </DropdownMenu.RadioGroup>
566
- <DropdownMenu.Separator />
567
- <DropdownMenu.CheckboxItem
568
- checked={edgesVisible}
569
- onCheckedChange={toggleEdges}
570
- >
571
- <Spline />
572
- {t.edges}
573
- </DropdownMenu.CheckboxItem>
574
- </DropdownMenu.SubContent>
575
- </DropdownMenu.Sub>
576
- {/if}
577
-
578
- <DropdownMenu.CheckboxItem checked={measureActive} onCheckedChange={toggleMeasure}>
579
- <Ruler />
580
- {t.measure}
581
- </DropdownMenu.CheckboxItem>
582
-
583
- {#if config.showGridToggle}
584
- <DropdownMenu.CheckboxItem checked={gridVisible} onCheckedChange={toggleGrid}>
585
- <Grid3x3 />
586
- {t.grid}
587
- </DropdownMenu.CheckboxItem>
588
- {/if}
589
-
590
- {#if config.showSceneManager || config.showScreenshotButton || config.showFullscreenButton}
591
- <DropdownMenu.Separator />
592
- {/if}
593
-
594
- {#if config.showSceneManager}
595
- <DropdownMenu.CheckboxItem
596
- checked={sceneManagerOpen}
597
- onCheckedChange={() => (sceneManagerOpen = !sceneManagerOpen)}
598
- >
599
- <Layers />
600
- {t.sceneManager}
601
- </DropdownMenu.CheckboxItem>
602
- {/if}
603
-
604
- {#if config.showScreenshotButton}
605
- <DropdownMenu.Item onSelect={downloadScreenshot}>
606
- <Camera />
607
- {t.screenshot}
608
- </DropdownMenu.Item>
609
- {/if}
610
-
611
- {#if config.showFullscreenButton}
612
- <DropdownMenu.Item onSelect={toggleFullscreen}>
613
- {#if isFullscreen}
614
- <Minimize />
615
- {t.exitFullscreen}
616
- {:else}
617
- <Maximize />
618
- {t.fullscreen}
619
- {/if}
620
- </DropdownMenu.Item>
621
- {/if}
622
- </DropdownMenu.Content>
623
- </DropdownMenu.Root>
624
- <!-- Touch has no F key, and fit-to-view is the way back from a framed part. -->
625
- <div class="hidden pointer-coarse:block">
626
- <Button
627
- variant="overlay"
628
- size="icon-lg"
629
- title={t.fitToView}
630
- aria-label={t.fitToView}
631
- onclick={() => fitToView?.()}
632
- >
633
- <Frame />
634
- </Button>
635
- </div>
636
- </div>
552
+ <ViewerDock
553
+ {t}
554
+ hidden={hideButton}
555
+ showDisplay={config.showDisplayMenu}
556
+ showGrid={config.showGridToggle}
557
+ showSceneManager={config.showSceneManager}
558
+ showScreenshot={config.showScreenshotButton}
559
+ showFullscreen={config.showFullscreenButton}
560
+ {styleOptions}
561
+ viewPresets={VIEW_PRESETS.map(({ preset, label }) => ({ preset, label: label() }))}
562
+ {renderStyle}
563
+ {nightOn}
564
+ {edgesVisible}
565
+ {measureActive}
566
+ {gridVisible}
567
+ {sceneManagerOpen}
568
+ {projection}
569
+ {isFullscreen}
570
+ onSetLook={setRenderStyle}
571
+ onToggleNight={toggleNight}
572
+ onToggleEdges={toggleEdges}
573
+ onToggleMeasure={toggleMeasure}
574
+ onToggleGrid={toggleGrid}
575
+ onToggleSceneManager={() => (sceneManagerOpen = !sceneManagerOpen)}
576
+ onToggleProjection={toggleProjection}
577
+ onSetView={setView}
578
+ onFit={() => fitToView?.()}
579
+ onScreenshot={downloadScreenshot}
580
+ onToggleFullscreen={toggleFullscreen}
581
+ />
637
582
  {/if}
638
583
  </div>
639
584
  </Resizable.Pane>
@@ -641,7 +586,12 @@
641
586
  {#if sceneManagerOpen && scene && outliner}
642
587
  <Resizable.Handle withHandle />
643
588
  <Resizable.Pane id="scene-manager" order={2} defaultSize={15} minSize={8} maxSize={30}>
644
- <SceneManager {outliner} {sceneVersion} onVisibilityChange={() => invalidate?.()} />
589
+ <SceneManager
590
+ {outliner}
591
+ {sceneVersion}
592
+ onVisibilityChange={() => syncEmissiveLights?.()}
593
+ onHover={(entry) => setHover?.(entry?.object ?? null, entry?.memberIndex ?? null)}
594
+ />
645
595
  </Resizable.Pane>
646
596
  {/if}
647
597
  </Resizable.PaneGroup>
@@ -1,5 +1,5 @@
1
- import { type ThreeViewer } from '@selvajs/visualization/render';
2
- import type { Locale } from '../../i18n/messages';
1
+ import { type Look, type ThreeViewer } from '@selvajs/visualization/render';
2
+ import type { Locale } from '../../i18n/messages.js';
3
3
  export interface ViewerConfig {
4
4
  showScreenshotButton?: boolean;
5
5
  showFullscreenButton?: boolean;
@@ -9,13 +9,18 @@ export interface ViewerConfig {
9
9
  showDisplayMenu?: boolean;
10
10
  enableMeshClick?: boolean;
11
11
  backgroundColor?: string;
12
+ /** The look to open in. Default `technical`. */
13
+ look?: Look;
12
14
  /** Initial state of the edge overlay and its display-menu checkmark. Default false. */
13
15
  showEdges?: boolean;
14
16
  }
15
17
  interface Props {
16
18
  meshes: any[];
17
19
  isFullscreen?: boolean;
20
+ /** @deprecated Ignored: the panel's solve status shows a running solve. */
18
21
  isSolving?: boolean;
22
+ /** @deprecated Ignored, like `isSolving`. */
23
+ isSlow?: boolean;
19
24
  isBlurred?: boolean;
20
25
  drawerOpen?: boolean;
21
26
  viewerConfig?: ViewerConfig;