@selvajs/ui 6.6.0-beta.2 → 6.6.0-beta.20

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 (401) hide show
  1. package/README.md +0 -3
  2. package/dist/components/ErrorScreen.svelte +7 -3
  3. package/dist/components/compute/AppLayout.svelte +307 -123
  4. package/dist/components/compute/AppLayout.svelte.d.ts +28 -0
  5. package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
  6. package/dist/components/compute/ComputeApp.svelte +46 -22
  7. package/dist/components/compute/ComputeApp.svelte.d.ts +20 -3
  8. package/dist/components/compute/ComputeMessagesDialog.svelte +31 -41
  9. package/dist/components/compute/ParameterPresetManager.svelte +16 -65
  10. package/dist/components/compute/ParameterPresetManager.svelte.d.ts +4 -5
  11. package/dist/components/compute/SolveMessages.svelte +128 -121
  12. package/dist/components/compute/SolveMessages.svelte.d.ts +12 -12
  13. package/dist/components/layout/AppShell.svelte +10 -6
  14. package/dist/components/layout/FooterItemRenderer.svelte +2 -2
  15. package/dist/components/layout/FooterItemRenderer.svelte.d.ts +1 -1
  16. package/dist/components/layout/PageContent.svelte +3 -2
  17. package/dist/components/layout/PageFooter.svelte +26 -14
  18. package/dist/components/layout/PageHeader.svelte +14 -10
  19. package/dist/components/layout/SectionHeader.svelte +4 -2
  20. package/dist/components/layout/SideNav.svelte +57 -8
  21. package/dist/components/layout/SubNav.svelte +2 -2
  22. package/dist/components/preview/ChartOutput.svelte +131 -65
  23. package/dist/components/preview/Group.svelte +42 -22
  24. package/dist/components/preview/HelpButton.svelte +5 -3
  25. package/dist/components/preview/ImageOutput.svelte +435 -71
  26. package/dist/components/preview/InputControl.svelte +125 -51
  27. package/dist/components/preview/InputControl.svelte.d.ts +5 -1
  28. package/dist/components/preview/OutputDisplay.svelte +42 -28
  29. package/dist/components/preview/TabBar.svelte +8 -6
  30. package/dist/components/preview/TabBar.svelte.d.ts +2 -0
  31. package/dist/components/preview/TabContent.svelte +66 -31
  32. package/dist/components/preview/TabContent.svelte.d.ts +5 -1
  33. package/dist/components/preview/TabLayout.svelte +29 -8
  34. package/dist/components/preview/TabLayout.svelte.d.ts +5 -0
  35. package/dist/components/preview/inputs/CheckboxInput.svelte +1 -1
  36. package/dist/components/preview/inputs/ChecklistInput.svelte +11 -6
  37. package/dist/components/preview/inputs/ChecklistInput.svelte.d.ts +2 -1
  38. package/dist/components/preview/inputs/ColorInput.svelte +357 -13
  39. package/dist/components/preview/inputs/ColorInput.svelte.d.ts +2 -0
  40. package/dist/components/preview/inputs/DropdownInput.svelte +20 -5
  41. package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +2 -1
  42. package/dist/components/preview/inputs/FileInput.svelte +115 -103
  43. package/dist/components/preview/inputs/GeometryInput.svelte +128 -0
  44. package/dist/components/preview/inputs/GeometryInput.svelte.d.ts +21 -0
  45. package/dist/components/preview/inputs/NumberInput.svelte +98 -16
  46. package/dist/components/preview/inputs/NumberInput.svelte.d.ts +2 -0
  47. package/dist/components/preview/inputs/OptionGlyph.svelte +29 -0
  48. package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +8 -0
  49. package/dist/components/preview/inputs/SegmentedInput.svelte +45 -0
  50. package/dist/components/preview/inputs/SegmentedInput.svelte.d.ts +12 -0
  51. package/dist/components/preview/inputs/TextInput.svelte +11 -6
  52. package/dist/components/preview/inputs/TileInput.svelte +83 -0
  53. package/dist/components/preview/inputs/TileInput.svelte.d.ts +12 -0
  54. package/dist/components/preview/inputs/index.d.ts +3 -0
  55. package/dist/components/preview/inputs/index.js +3 -0
  56. package/dist/components/primitives/CalculateButton.svelte +56 -24
  57. package/dist/components/primitives/CalculateButton.svelte.d.ts +3 -0
  58. package/dist/components/primitives/Callout.svelte +8 -6
  59. package/dist/components/primitives/Callout.svelte.d.ts +4 -4
  60. package/dist/components/primitives/DataTable.svelte +38 -4
  61. package/dist/components/primitives/DataTable.svelte.d.ts +2 -0
  62. package/dist/components/primitives/FilterableDropdown.svelte +13 -1
  63. package/dist/components/primitives/FilterableDropdown.svelte.d.ts +5 -0
  64. package/dist/components/primitives/ImageUploadField.svelte +1 -1
  65. package/dist/components/primitives/SolvingIndicator.svelte +245 -15
  66. package/dist/components/primitives/SolvingIndicator.svelte.d.ts +15 -0
  67. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  68. package/dist/components/primitives/badge/badge.svelte +4 -4
  69. package/dist/components/primitives/badge/badge.svelte.d.ts +10 -10
  70. package/dist/components/primitives/button/button.svelte +10 -8
  71. package/dist/components/primitives/button/button.svelte.d.ts +20 -17
  72. package/dist/components/primitives/card/card.svelte +1 -1
  73. package/dist/components/primitives/card/card.svelte.d.ts +1 -1
  74. package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
  75. package/dist/components/primitives/command/command-input.svelte +1 -1
  76. package/dist/components/primitives/command/command-item.svelte +1 -1
  77. package/dist/components/primitives/command/command-link-item.svelte +1 -1
  78. package/dist/components/primitives/command/command.svelte +1 -1
  79. package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
  80. package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
  81. package/dist/components/primitives/context-menu/context-menu-item.svelte +1 -1
  82. package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
  83. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  84. package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
  85. package/dist/components/primitives/dialog/dialog-content.svelte +7 -3
  86. package/dist/components/primitives/drawer/Drawer.svelte +1 -1
  87. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
  88. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +2 -0
  89. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
  90. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +2 -0
  91. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
  92. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +2 -1
  93. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  94. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  95. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  96. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  97. package/dist/components/primitives/index.d.ts +1 -1
  98. package/dist/components/primitives/index.js +1 -1
  99. package/dist/components/primitives/input/input.svelte +4 -4
  100. package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +1 -1
  101. package/dist/components/primitives/input-group/input-group.svelte +1 -1
  102. package/dist/components/primitives/mode-toggle/mode-toggle.svelte +5 -2
  103. package/dist/components/primitives/popover/popover-content.svelte +1 -1
  104. package/dist/components/primitives/resizable/resizable-handle.svelte +2 -2
  105. package/dist/components/primitives/scroll-area/scroll-area.svelte +1 -1
  106. package/dist/components/primitives/search/search.svelte +2 -2
  107. package/dist/components/primitives/select/select-content.svelte +1 -1
  108. package/dist/components/primitives/select/select-item.svelte +1 -1
  109. package/dist/components/primitives/select/select-trigger.svelte +1 -1
  110. package/dist/components/primitives/slider/slider.svelte +8 -3
  111. package/dist/components/primitives/slider/slider.svelte.d.ts +5 -1
  112. package/dist/components/primitives/switch/switch.svelte +1 -1
  113. package/dist/components/primitives/tabs/tabs-list.svelte +2 -2
  114. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +6 -6
  115. package/dist/components/primitives/tabs/tabs-trigger.svelte +3 -3
  116. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +7 -7
  117. package/dist/components/primitives/textarea/textarea.svelte +1 -1
  118. package/dist/components/primitives/toggle/toggle.svelte +11 -3
  119. package/dist/components/primitives/toggle/toggle.svelte.d.ts +13 -4
  120. package/dist/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
  121. package/dist/components/primitives/toggle-group/toggle-group.svelte +1 -1
  122. package/dist/components/primitives/tooltip/index.d.ts +6 -0
  123. package/dist/components/primitives/tooltip/index.js +8 -0
  124. package/dist/components/primitives/tooltip/tooltip-content.svelte +34 -0
  125. package/dist/components/primitives/tooltip/tooltip-content.svelte.d.ts +10 -0
  126. package/dist/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  127. package/dist/components/primitives/tooltip/tooltip-portal.svelte.d.ts +4 -0
  128. package/dist/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  129. package/dist/components/primitives/tooltip/tooltip-provider.svelte.d.ts +4 -0
  130. package/dist/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  131. package/dist/components/primitives/tooltip/tooltip-trigger.svelte.d.ts +4 -0
  132. package/dist/components/primitives/tooltip/tooltip.svelte +7 -0
  133. package/dist/components/primitives/tooltip/tooltip.svelte.d.ts +4 -0
  134. package/dist/components/viewer/MeshMetadataPanel.svelte +119 -0
  135. package/dist/components/viewer/MeshMetadataPanel.svelte.d.ts +9 -0
  136. package/dist/components/viewer/SceneManager.svelte +32 -21
  137. package/dist/components/viewer/SceneManager.svelte.d.ts +3 -1
  138. package/dist/components/viewer/Viewer.svelte +195 -207
  139. package/dist/components/viewer/Viewer.svelte.d.ts +7 -2
  140. package/dist/components/viewer/ViewerDock.svelte +404 -0
  141. package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
  142. package/dist/composables/useFooterItem.svelte.d.ts +1 -1
  143. package/dist/composables/useFooterItem.svelte.js +1 -1
  144. package/dist/compute/liveProgress.svelte.d.ts +16 -0
  145. package/dist/compute/liveProgress.svelte.js +90 -0
  146. package/dist/compute/run-panel-action.d.ts +8 -0
  147. package/dist/compute/run-panel-action.js +12 -0
  148. package/dist/compute/solving.svelte.d.ts +11 -7
  149. package/dist/compute/solving.svelte.js +64 -45
  150. package/dist/compute/useSolveSession.svelte.js +3 -0
  151. package/dist/constants.d.ts +6 -8
  152. package/dist/constants.js +8 -11
  153. package/dist/contexts/hostContext.svelte.d.ts +39 -0
  154. package/dist/contexts/hostContext.svelte.js +9 -0
  155. package/dist/features/chart/plotly-compat.d.ts +15 -0
  156. package/dist/features/chart/plotly-compat.js +124 -0
  157. package/dist/i18n/localeContext.svelte.d.ts +10 -3
  158. package/dist/i18n/localeContext.svelte.js +27 -5
  159. package/dist/i18n/messages.d.ts +164 -2
  160. package/dist/i18n/messages.js +281 -11
  161. package/dist/index.d.ts +6 -1
  162. package/dist/index.js +5 -0
  163. package/dist/public.d.ts +2 -1
  164. package/dist/public.js +1 -0
  165. package/dist/schema/host-support.d.ts +29 -0
  166. package/dist/schema/host-support.js +97 -0
  167. package/dist/schema/option-display.d.ts +12 -0
  168. package/dist/schema/option-display.js +29 -0
  169. package/dist/schema/param-exporter.d.ts +4 -1
  170. package/dist/schema/param-exporter.js +10 -6
  171. package/dist/schema/visibility-rules.d.ts +7 -1
  172. package/dist/schema/visibility-rules.js +38 -0
  173. package/dist/styles/base.css +116 -83
  174. package/dist/types/actionButton.d.ts +17 -3
  175. package/dist/types/presetLabels.d.ts +3 -2
  176. package/dist/types/presetLabels.js +9 -8
  177. package/dist/utils/color-space.d.ts +21 -0
  178. package/dist/utils/color-space.js +90 -0
  179. package/dist/utils/file-download.js +10 -22
  180. package/dist/utils/host-files.d.ts +12 -0
  181. package/dist/utils/host-files.js +46 -0
  182. package/dist/utils/loadScript.d.ts +2 -0
  183. package/dist/utils/loadScript.js +2 -0
  184. package/dist/utils/webp-to-png.d.ts +10 -0
  185. package/dist/utils/webp-to-png.js +41 -0
  186. package/package.json +30 -22
  187. package/src/lib/components/ErrorScreen.svelte +7 -3
  188. package/src/lib/components/compute/AppLayout.svelte +307 -123
  189. package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
  190. package/src/lib/components/compute/ComputeApp.svelte +46 -22
  191. package/src/lib/components/compute/ComputeMessagesDialog.svelte +32 -42
  192. package/src/lib/components/compute/ParameterPresetManager.svelte +16 -65
  193. package/src/lib/components/compute/SolveMessages.svelte +130 -123
  194. package/src/lib/components/layout/AppShell.svelte +10 -6
  195. package/src/lib/components/layout/FooterItemRenderer.svelte +2 -2
  196. package/src/lib/components/layout/PageContent.svelte +3 -2
  197. package/src/lib/components/layout/PageFooter.svelte +26 -14
  198. package/src/lib/components/layout/PageHeader.svelte +14 -10
  199. package/src/lib/components/layout/SectionHeader.svelte +4 -2
  200. package/src/lib/components/layout/SideNav.svelte +57 -8
  201. package/src/lib/components/layout/SubNav.svelte +2 -2
  202. package/src/lib/components/preview/ChartOutput.svelte +131 -65
  203. package/src/lib/components/preview/Group.svelte +42 -22
  204. package/src/lib/components/preview/HelpButton.svelte +5 -3
  205. package/src/lib/components/preview/ImageOutput.svelte +435 -71
  206. package/src/lib/components/preview/InputControl.svelte +125 -51
  207. package/src/lib/components/preview/OutputDisplay.svelte +42 -28
  208. package/src/lib/components/preview/TabBar.svelte +8 -6
  209. package/src/lib/components/preview/TabContent.svelte +66 -31
  210. package/src/lib/components/preview/TabLayout.svelte +29 -8
  211. package/src/lib/components/preview/inputs/CheckboxInput.svelte +1 -1
  212. package/src/lib/components/preview/inputs/ChecklistInput.svelte +11 -6
  213. package/src/lib/components/preview/inputs/ColorInput.svelte +357 -13
  214. package/src/lib/components/preview/inputs/DropdownInput.svelte +20 -5
  215. package/src/lib/components/preview/inputs/FileInput.svelte +115 -103
  216. package/src/lib/components/preview/inputs/GeometryInput.svelte +128 -0
  217. package/src/lib/components/preview/inputs/NumberInput.svelte +98 -16
  218. package/src/lib/components/preview/inputs/OptionGlyph.svelte +29 -0
  219. package/src/lib/components/preview/inputs/SegmentedInput.svelte +45 -0
  220. package/src/lib/components/preview/inputs/TextInput.svelte +11 -6
  221. package/src/lib/components/preview/inputs/TileInput.svelte +83 -0
  222. package/src/lib/components/preview/inputs/index.ts +3 -0
  223. package/src/lib/components/primitives/CalculateButton.svelte +56 -24
  224. package/src/lib/components/primitives/Callout.svelte +9 -7
  225. package/src/lib/components/primitives/DataTable.svelte +38 -4
  226. package/src/lib/components/primitives/FilterableDropdown.svelte +14 -2
  227. package/src/lib/components/primitives/ImageUploadField.svelte +1 -1
  228. package/src/lib/components/primitives/IssueList.svelte +1 -1
  229. package/src/lib/components/primitives/SeverityIcon.svelte +1 -1
  230. package/src/lib/components/primitives/SolvingIndicator.svelte +245 -15
  231. package/src/lib/components/primitives/StateDisplay.svelte +1 -1
  232. package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +2 -2
  233. package/src/lib/components/primitives/alert-dialog/alert-dialog-cancel.svelte +2 -2
  234. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +2 -2
  235. package/src/lib/components/primitives/alert-dialog/alert-dialog-description.svelte +1 -1
  236. package/src/lib/components/primitives/alert-dialog/alert-dialog-footer.svelte +1 -1
  237. package/src/lib/components/primitives/alert-dialog/alert-dialog-header.svelte +1 -1
  238. package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
  239. package/src/lib/components/primitives/alert-dialog/alert-dialog-title.svelte +1 -1
  240. package/src/lib/components/primitives/badge/badge.svelte +5 -5
  241. package/src/lib/components/primitives/button/button.svelte +10 -8
  242. package/src/lib/components/primitives/button-group/button-group-separator.svelte +2 -2
  243. package/src/lib/components/primitives/button-group/button-group-text.svelte +1 -1
  244. package/src/lib/components/primitives/button-group/button-group.svelte +1 -1
  245. package/src/lib/components/primitives/card/card-content.svelte +1 -1
  246. package/src/lib/components/primitives/card/card-description.svelte +1 -1
  247. package/src/lib/components/primitives/card/card-footer.svelte +1 -1
  248. package/src/lib/components/primitives/card/card-header.svelte +1 -1
  249. package/src/lib/components/primitives/card/card-title.svelte +1 -1
  250. package/src/lib/components/primitives/card/card.svelte +2 -2
  251. package/src/lib/components/primitives/checkbox/checkbox.svelte +2 -2
  252. package/src/lib/components/primitives/command/command-dialog.svelte +2 -2
  253. package/src/lib/components/primitives/command/command-empty.svelte +1 -1
  254. package/src/lib/components/primitives/command/command-group.svelte +1 -1
  255. package/src/lib/components/primitives/command/command-input.svelte +3 -3
  256. package/src/lib/components/primitives/command/command-item.svelte +2 -2
  257. package/src/lib/components/primitives/command/command-link-item.svelte +2 -2
  258. package/src/lib/components/primitives/command/command-list.svelte +1 -1
  259. package/src/lib/components/primitives/command/command-separator.svelte +1 -1
  260. package/src/lib/components/primitives/command/command-shortcut.svelte +1 -1
  261. package/src/lib/components/primitives/command/command.svelte +2 -2
  262. package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +2 -2
  263. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +2 -2
  264. package/src/lib/components/primitives/context-menu/context-menu-group-heading.svelte +1 -1
  265. package/src/lib/components/primitives/context-menu/context-menu-item.svelte +2 -2
  266. package/src/lib/components/primitives/context-menu/context-menu-label.svelte +1 -1
  267. package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +2 -2
  268. package/src/lib/components/primitives/context-menu/context-menu-separator.svelte +1 -1
  269. package/src/lib/components/primitives/context-menu/context-menu-shortcut.svelte +1 -1
  270. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +2 -2
  271. package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +2 -2
  272. package/src/lib/components/primitives/dialog/dialog-content.svelte +8 -4
  273. package/src/lib/components/primitives/dialog/dialog-description.svelte +1 -1
  274. package/src/lib/components/primitives/dialog/dialog-footer.svelte +1 -1
  275. package/src/lib/components/primitives/dialog/dialog-header.svelte +1 -1
  276. package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
  277. package/src/lib/components/primitives/dialog/dialog-title.svelte +1 -1
  278. package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
  279. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +32 -12
  280. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +6 -2
  281. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
  282. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +5 -3
  283. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +1 -1
  284. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +2 -2
  285. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +1 -1
  286. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +2 -2
  287. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +2 -2
  288. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
  289. package/src/lib/components/primitives/empty/empty-content.svelte +1 -1
  290. package/src/lib/components/primitives/empty/empty-description.svelte +1 -1
  291. package/src/lib/components/primitives/empty/empty-header.svelte +1 -1
  292. package/src/lib/components/primitives/empty/empty-media.svelte +1 -1
  293. package/src/lib/components/primitives/empty/empty-title.svelte +1 -1
  294. package/src/lib/components/primitives/empty/empty.svelte +1 -1
  295. package/src/lib/components/primitives/field/field-content.svelte +1 -1
  296. package/src/lib/components/primitives/field/field-description.svelte +1 -1
  297. package/src/lib/components/primitives/field/field-error.svelte +1 -1
  298. package/src/lib/components/primitives/field/field-group.svelte +1 -1
  299. package/src/lib/components/primitives/field/field-label.svelte +2 -2
  300. package/src/lib/components/primitives/field/field-legend.svelte +1 -1
  301. package/src/lib/components/primitives/field/field-separator.svelte +2 -2
  302. package/src/lib/components/primitives/field/field-set.svelte +1 -1
  303. package/src/lib/components/primitives/field/field-title.svelte +1 -1
  304. package/src/lib/components/primitives/field/field.svelte +1 -1
  305. package/src/lib/components/primitives/index.ts +1 -1
  306. package/src/lib/components/primitives/input/input.svelte +5 -5
  307. package/src/lib/components/primitives/input-group/input-group-addon.svelte +1 -1
  308. package/src/lib/components/primitives/input-group/input-group-button.svelte +2 -2
  309. package/src/lib/components/primitives/input-group/input-group-input.svelte +2 -2
  310. package/src/lib/components/primitives/input-group/input-group-text.svelte +1 -1
  311. package/src/lib/components/primitives/input-group/input-group-textarea.svelte +2 -2
  312. package/src/lib/components/primitives/input-group/input-group.svelte +2 -2
  313. package/src/lib/components/primitives/label/label.svelte +1 -1
  314. package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +5 -2
  315. package/src/lib/components/primitives/popover/popover-content.svelte +2 -2
  316. package/src/lib/components/primitives/popover/popover-description.svelte +1 -1
  317. package/src/lib/components/primitives/popover/popover-header.svelte +1 -1
  318. package/src/lib/components/primitives/popover/popover-title.svelte +1 -1
  319. package/src/lib/components/primitives/popover/popover-trigger.svelte +1 -1
  320. package/src/lib/components/primitives/resizable/resizable-handle.svelte +3 -3
  321. package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -1
  322. package/src/lib/components/primitives/scroll-area/scroll-area-scrollbar.svelte +1 -1
  323. package/src/lib/components/primitives/scroll-area/scroll-area.svelte +2 -2
  324. package/src/lib/components/primitives/search/search.svelte +3 -3
  325. package/src/lib/components/primitives/select/select-content.svelte +2 -2
  326. package/src/lib/components/primitives/select/select-group-heading.svelte +1 -1
  327. package/src/lib/components/primitives/select/select-item.svelte +2 -2
  328. package/src/lib/components/primitives/select/select-label.svelte +1 -1
  329. package/src/lib/components/primitives/select/select-scroll-down-button.svelte +1 -1
  330. package/src/lib/components/primitives/select/select-scroll-up-button.svelte +1 -1
  331. package/src/lib/components/primitives/select/select-separator.svelte +2 -2
  332. package/src/lib/components/primitives/select/select-trigger.svelte +2 -2
  333. package/src/lib/components/primitives/separator/separator.svelte +1 -1
  334. package/src/lib/components/primitives/slider/slider.svelte +9 -4
  335. package/src/lib/components/primitives/spinner/spinner.svelte +1 -1
  336. package/src/lib/components/primitives/switch/switch.svelte +2 -2
  337. package/src/lib/components/primitives/tabs/tabs-content.svelte +1 -1
  338. package/src/lib/components/primitives/tabs/tabs-list.svelte +3 -3
  339. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +4 -4
  340. package/src/lib/components/primitives/tabs/tabs.svelte +1 -1
  341. package/src/lib/components/primitives/textarea/textarea.svelte +2 -2
  342. package/src/lib/components/primitives/toggle/toggle.svelte +12 -4
  343. package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +3 -3
  344. package/src/lib/components/primitives/toggle-group/toggle-group.svelte +3 -3
  345. package/src/lib/components/primitives/tooltip/index.ts +19 -0
  346. package/src/lib/components/primitives/tooltip/tooltip-content.svelte +34 -0
  347. package/src/lib/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  348. package/src/lib/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  349. package/src/lib/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  350. package/src/lib/components/primitives/tooltip/tooltip.svelte +7 -0
  351. package/src/lib/components/viewer/MeshMetadataPanel.svelte +119 -0
  352. package/src/lib/components/viewer/SceneManager.svelte +32 -21
  353. package/src/lib/components/viewer/Viewer.svelte +196 -208
  354. package/src/lib/components/viewer/ViewerDock.svelte +404 -0
  355. package/src/lib/composables/useFooterItem.svelte.ts +1 -1
  356. package/src/lib/compute/liveProgress.svelte.ts +103 -0
  357. package/src/lib/compute/run-panel-action.ts +16 -0
  358. package/src/lib/compute/solving.svelte.ts +66 -50
  359. package/src/lib/compute/useSolveSession.svelte.ts +3 -0
  360. package/src/lib/constants.ts +8 -11
  361. package/src/lib/contexts/hostContext.svelte.ts +51 -0
  362. package/src/lib/features/chart/plotly-compat.ts +141 -0
  363. package/src/lib/i18n/localeContext.svelte.ts +40 -5
  364. package/src/lib/i18n/messages.ts +487 -13
  365. package/src/lib/index.ts +23 -0
  366. package/src/lib/public.ts +2 -0
  367. package/src/lib/schema/host-support.ts +129 -0
  368. package/src/lib/schema/option-display.ts +44 -0
  369. package/src/lib/schema/param-exporter.ts +10 -7
  370. package/src/lib/schema/visibility-rules.ts +50 -1
  371. package/src/lib/styles/base.css +116 -83
  372. package/src/lib/types/actionButton.ts +16 -3
  373. package/src/lib/types/presetLabels.ts +13 -11
  374. package/src/lib/utils/color-space.ts +107 -0
  375. package/src/lib/utils/file-download.ts +11 -21
  376. package/src/lib/utils/host-files.ts +61 -0
  377. package/src/lib/utils/loadScript.ts +3 -0
  378. package/src/lib/utils/webp-to-png.ts +48 -0
  379. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  380. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +0 -3
  381. package/dist/components/primitives/theme-switcher/index.d.ts +0 -1
  382. package/dist/components/primitives/theme-switcher/index.js +0 -1
  383. package/dist/components/viewer/MeshMetadataDialog.svelte +0 -126
  384. package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +0 -10
  385. package/dist/styles/themes/cyberpunk.css +0 -98
  386. package/dist/styles/themes/neutral.css +0 -72
  387. package/dist/styles/themes/ocean.css +0 -75
  388. package/dist/styles/themes/selva.css +0 -105
  389. package/dist/theme/themeStore.svelte.d.ts +0 -12
  390. package/dist/theme/themeStore.svelte.js +0 -40
  391. package/dist/theme/themes.d.ts +0 -5
  392. package/dist/theme/themes.js +0 -13
  393. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  394. package/src/lib/components/primitives/theme-switcher/index.ts +0 -1
  395. package/src/lib/components/viewer/MeshMetadataDialog.svelte +0 -126
  396. package/src/lib/styles/themes/cyberpunk.css +0 -98
  397. package/src/lib/styles/themes/neutral.css +0 -72
  398. package/src/lib/styles/themes/ocean.css +0 -75
  399. package/src/lib/styles/themes/selva.css +0 -105
  400. package/src/lib/theme/themeStore.svelte.ts +0 -50
  401. package/src/lib/theme/themes.ts +0 -18
@@ -0,0 +1,90 @@
1
+ const clamp = (n, min, max) => Math.min(max, Math.max(min, n));
2
+ /** Accepts `#rgb`, `#rrggbb` and the same without `#`. Returns lowercase `#rrggbb`, or null. */
3
+ export function normalizeHex(input) {
4
+ const raw = input.trim().replace(/^#/, '');
5
+ if (/^[0-9a-f]{3}$/i.test(raw)) {
6
+ return `#${raw
7
+ .split('')
8
+ .map((c) => c + c)
9
+ .join('')
10
+ .toLowerCase()}`;
11
+ }
12
+ if (/^[0-9a-f]{6}$/i.test(raw))
13
+ return `#${raw.toLowerCase()}`;
14
+ return null;
15
+ }
16
+ export function hexToRgb(hex) {
17
+ const normalized = normalizeHex(hex);
18
+ if (!normalized)
19
+ return null;
20
+ return {
21
+ r: parseInt(normalized.slice(1, 3), 16),
22
+ g: parseInt(normalized.slice(3, 5), 16),
23
+ b: parseInt(normalized.slice(5, 7), 16)
24
+ };
25
+ }
26
+ export function rgbToHex({ r, g, b }) {
27
+ const channel = (n) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, '0');
28
+ return `#${channel(r)}${channel(g)}${channel(b)}`;
29
+ }
30
+ export function rgbToHsv({ r, g, b }) {
31
+ const rn = r / 255;
32
+ const gn = g / 255;
33
+ const bn = b / 255;
34
+ const max = Math.max(rn, gn, bn);
35
+ const delta = max - Math.min(rn, gn, bn);
36
+ let h = 0;
37
+ if (delta !== 0) {
38
+ if (max === rn)
39
+ h = ((gn - bn) / delta) % 6;
40
+ else if (max === gn)
41
+ h = (bn - rn) / delta + 2;
42
+ else
43
+ h = (rn - gn) / delta + 4;
44
+ h *= 60;
45
+ if (h < 0)
46
+ h += 360;
47
+ }
48
+ return { h, s: max === 0 ? 0 : delta / max, v: max };
49
+ }
50
+ export function hsvToRgb({ h, s, v }) {
51
+ const c = v * s;
52
+ const hp = (((h % 360) + 360) % 360) / 60;
53
+ const x = c * (1 - Math.abs((hp % 2) - 1));
54
+ const [r1, g1, b1] = hp < 1
55
+ ? [c, x, 0]
56
+ : hp < 2
57
+ ? [x, c, 0]
58
+ : hp < 3
59
+ ? [0, c, x]
60
+ : hp < 4
61
+ ? [0, x, c]
62
+ : hp < 5
63
+ ? [x, 0, c]
64
+ : [c, 0, x];
65
+ const m = v - c;
66
+ return { r: (r1 + m) * 255, g: (g1 + m) * 255, b: (b1 + m) * 255 };
67
+ }
68
+ export const hexToHsv = (hex) => {
69
+ const rgb = hexToRgb(hex);
70
+ return rgb ? rgbToHsv(rgb) : null;
71
+ };
72
+ export const hsvToHex = (hsv) => rgbToHex(hsvToRgb(hsv));
73
+ /** WCAG relative luminance of an sRGB color. */
74
+ function luminance({ r, g, b }) {
75
+ const lin = (c) => {
76
+ const n = c / 255;
77
+ return n <= 0.04045 ? n / 12.92 : Math.pow((n + 0.055) / 1.055, 2.4);
78
+ };
79
+ return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);
80
+ }
81
+ /** WCAG contrast ratio between two hex colors, 1 to 21. Null if either isn't a hex color. */
82
+ export function contrastRatio(a, b) {
83
+ const ra = hexToRgb(a);
84
+ const rb = hexToRgb(b);
85
+ if (!ra || !rb)
86
+ return null;
87
+ const la = luminance(ra);
88
+ const lb = luminance(rb);
89
+ return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
90
+ }
@@ -1,6 +1,7 @@
1
- import { downloadFileDataByRoot } from '@selvajs/compute/core';
1
+ import { decodeBase64ToBinary, downloadFileDataByRoot } from '@selvajs/compute/core';
2
2
  import { SvelteMap } from 'svelte/reactivity';
3
3
  import { APP_DEFAULTS } from '../constants';
4
+ import { saveBlob } from './host-files';
4
5
  export const MIME_BY_EXT = {
5
6
  '.png': 'image/png',
6
7
  '.jpg': 'image/jpeg',
@@ -20,23 +21,10 @@ export const MIME_BY_EXT = {
20
21
  function saveSingleFile(file) {
21
22
  const ext = (file.fileType ?? '').toLowerCase();
22
23
  const mime = MIME_BY_EXT[ext] ?? 'application/octet-stream';
23
- let blob;
24
- if (file.isBase64Encoded) {
25
- const binary = atob(file.data);
26
- const bytes = new Uint8Array(binary.length);
27
- for (let i = 0; i < binary.length; i++)
28
- bytes[i] = binary.charCodeAt(i);
29
- blob = new Blob([bytes], { type: mime });
30
- }
31
- else {
32
- blob = new Blob([file.data], { type: mime });
33
- }
34
- const fullName = `${file.fileName}${file.fileType ?? ''}`;
35
- const a = document.createElement('a');
36
- a.href = URL.createObjectURL(blob);
37
- a.download = fullName;
38
- a.click();
39
- URL.revokeObjectURL(a.href);
24
+ const content = file.isBase64Encoded ? decodeBase64ToBinary(file.data) : file.data;
25
+ // decodeBase64ToBinary returns an ArrayBuffer-backed copy, never a SharedArrayBuffer view.
26
+ const blob = new Blob([content], { type: mime });
27
+ return saveBlob(blob, `${file.fileName}${file.fileType ?? ''}`);
40
28
  }
41
29
  export async function downloadFiles(fileData, fileName = 'grasshopper-output') {
42
30
  try {
@@ -45,13 +33,13 @@ export async function downloadFiles(fileData, fileName = 'grasshopper-output') {
45
33
  console.warn('[FileDownload] No files to download');
46
34
  return;
47
35
  }
48
- // A lone file is saved as itself rather than zipped — the one case that needs the DOM
49
- // directly. Everything else, including the per-root archive split, belongs to compute.
36
+ // A lone file is saved as itself rather than zipped. Everything else, including the
37
+ // per-root archive split, belongs to compute.
50
38
  if (filesArray.length === 1) {
51
- saveSingleFile(filesArray[0]);
39
+ await saveSingleFile(filesArray[0]);
52
40
  return;
53
41
  }
54
- await downloadFileDataByRoot(filesArray, fileName);
42
+ await downloadFileDataByRoot(filesArray, fileName, null, { saveBlob });
55
43
  }
56
44
  catch (error) {
57
45
  console.error('[FileDownload] Error downloading files:', error);
@@ -0,0 +1,12 @@
1
+ /** Resolves false when the user cancelled. An anchor download always resolves true: it can't tell. */
2
+ export type BlobSaver = (blob: Blob, fileName: string) => Promise<boolean>;
3
+ /** `accept` is what `<input accept>` takes: `.slvp,.sps`, `image/*`. Resolves null on cancel. */
4
+ export type FilePicker = (options: {
5
+ accept: string;
6
+ }) => Promise<File | null>;
7
+ export declare function setBlobSaver(next: BlobSaver): void;
8
+ export declare function setFilePicker(next: FilePicker): void;
9
+ export declare function saveBlob(blob: Blob, fileName: string): Promise<boolean>;
10
+ export declare function pickFile(options: {
11
+ accept: string;
12
+ }): Promise<File | null>;
@@ -0,0 +1,46 @@
1
+ // Where a file the page offers goes, and where a file the page asks for comes from. A browser
2
+ // gets an <a download> click and a hidden <input type=file>. A host whose WebView can't do
3
+ // either safely (the Rhino panel) installs its own once at start-up, before the first save or pick.
4
+ let saver = saveWithAnchor;
5
+ let picker = pickWithInput;
6
+ export function setBlobSaver(next) {
7
+ saver = next;
8
+ }
9
+ export function setFilePicker(next) {
10
+ picker = next;
11
+ }
12
+ export function saveBlob(blob, fileName) {
13
+ return saver(blob, fileName);
14
+ }
15
+ export function pickFile(options) {
16
+ return picker(options);
17
+ }
18
+ async function saveWithAnchor(blob, fileName) {
19
+ const url = URL.createObjectURL(blob);
20
+ const a = document.createElement('a');
21
+ a.href = url;
22
+ a.download = fileName;
23
+ // Firefox only downloads from an anchor that is in the document.
24
+ document.body.appendChild(a);
25
+ a.click();
26
+ a.remove();
27
+ // Revoking synchronously can abort the download: the browser pins the blob only once it starts.
28
+ setTimeout(() => URL.revokeObjectURL(url), 10_000);
29
+ return true;
30
+ }
31
+ function pickWithInput({ accept }) {
32
+ return new Promise((resolve) => {
33
+ const input = document.createElement('input');
34
+ input.type = 'file';
35
+ input.accept = accept;
36
+ input.style.display = 'none';
37
+ const settle = (file) => {
38
+ input.remove();
39
+ resolve(file);
40
+ };
41
+ input.addEventListener('change', () => settle(input.files?.[0] ?? null), { once: true });
42
+ input.addEventListener('cancel', () => settle(null), { once: true });
43
+ document.body.appendChild(input);
44
+ input.click();
45
+ });
46
+ }
@@ -4,6 +4,8 @@
4
4
  */
5
5
  export declare function loadScript(src: string, options?: {
6
6
  crossOrigin?: string;
7
+ /** Subresource Integrity hash. A cross-origin script also needs `crossOrigin`. */
8
+ integrity?: string;
7
9
  async?: boolean;
8
10
  defer?: boolean;
9
11
  }): Promise<void>;
@@ -17,6 +17,8 @@ export function loadScript(src, options) {
17
17
  script.src = src;
18
18
  if (options?.crossOrigin)
19
19
  script.crossOrigin = options.crossOrigin;
20
+ if (options?.integrity)
21
+ script.integrity = options.integrity;
20
22
  if (options?.async !== undefined)
21
23
  script.async = options.async;
22
24
  if (options?.defer !== undefined)
@@ -0,0 +1,10 @@
1
+ /** True when a WebP should go out as PNG: the input takes PNG, so a PNG is a valid value. */
2
+ export declare function shouldConvertWebp(fileEnding: string, acceptedFormats: readonly string[]): boolean;
3
+ /** Whether the input takes a file with this ending, counting a WebP it would get as PNG. */
4
+ export declare function acceptsFileEnding(fileEnding: string, acceptedFormats: readonly string[]): boolean;
5
+ /**
6
+ * By content, not name: image CDNs serve WebP from URLs with no extension or one naming another
7
+ * format. A WebP file starts `RIFF`, a 4-byte size, then `WEBP`.
8
+ */
9
+ export declare function isWebp(blob: Blob): Promise<boolean>;
10
+ export declare function webpToPng(blob: Blob): Promise<Blob>;
@@ -0,0 +1,41 @@
1
+ // Grasshopper's PDF export can't read WebP: the plugin's PDF library has no WebP decoder, and
2
+ // nothing on Windows or Rhino.Compute decodes it reliably. The browser can, so a WebP picked for
3
+ // an input that also takes PNG is re-encoded here. PNG rather than JPEG keeps transparency.
4
+ /** True when a WebP should go out as PNG: the input takes PNG, so a PNG is a valid value. */
5
+ export function shouldConvertWebp(fileEnding, acceptedFormats) {
6
+ return fileEnding === '.webp' && acceptedFormats.includes('.png');
7
+ }
8
+ /** Whether the input takes a file with this ending, counting a WebP it would get as PNG. */
9
+ export function acceptsFileEnding(fileEnding, acceptedFormats) {
10
+ const ending = fileEnding.toLowerCase();
11
+ if (acceptedFormats.length === 0 || acceptedFormats.includes(ending))
12
+ return true;
13
+ return shouldConvertWebp(ending, acceptedFormats);
14
+ }
15
+ const ascii = (bytes, start, end) => String.fromCharCode(...bytes.subarray(start, end));
16
+ /**
17
+ * By content, not name: image CDNs serve WebP from URLs with no extension or one naming another
18
+ * format. A WebP file starts `RIFF`, a 4-byte size, then `WEBP`.
19
+ */
20
+ export async function isWebp(blob) {
21
+ if (blob.type === 'image/webp')
22
+ return true;
23
+ const head = new Uint8Array(await blob.slice(0, 12).arrayBuffer());
24
+ return head.length === 12 && ascii(head, 0, 4) === 'RIFF' && ascii(head, 8, 12) === 'WEBP';
25
+ }
26
+ export async function webpToPng(blob) {
27
+ const bitmap = await createImageBitmap(blob);
28
+ try {
29
+ const canvas = document.createElement('canvas');
30
+ canvas.width = bitmap.width;
31
+ canvas.height = bitmap.height;
32
+ const context = canvas.getContext('2d');
33
+ if (!context)
34
+ throw new Error('Canvas 2D context unavailable');
35
+ context.drawImage(bitmap, 0, 0);
36
+ return await new Promise((resolve, reject) => canvas.toBlob((png) => (png ? resolve(png) : reject(new Error('PNG encoding failed'))), 'image/png'));
37
+ }
38
+ finally {
39
+ bitmap.close();
40
+ }
41
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selvajs/ui",
3
- "version": "6.6.0-beta.2",
3
+ "version": "6.6.0-beta.20",
4
4
  "description": "Shared UI components and utilities for Selva applications",
5
5
  "license": "MIT",
6
6
  "author": "VektorNode",
@@ -31,17 +31,20 @@
31
31
  ".": {
32
32
  "selva-source": {
33
33
  "types": "./dist/index.d.ts",
34
- "svelte": "./dist/index.js"
34
+ "svelte": "./src/lib/index.ts"
35
35
  },
36
36
  "types": "./dist/public.d.ts",
37
37
  "svelte": "./dist/public.js"
38
38
  },
39
39
  "./external": {
40
+ "selva-source": {
41
+ "types": "./dist/external/storage.d.ts",
42
+ "svelte": "./src/lib/external/storage.ts"
43
+ },
40
44
  "types": "./dist/external/storage.d.ts",
41
45
  "svelte": "./dist/external/storage.js"
42
46
  },
43
- "./styles/base.css": "./src/lib/styles/base.css",
44
- "./styles/themes/*": "./src/lib/styles/themes/*"
47
+ "./styles/base.css": "./src/lib/styles/base.css"
45
48
  },
46
49
  "files": [
47
50
  "dist",
@@ -58,11 +61,11 @@
58
61
  "bits-ui": "^2.18.0",
59
62
  "svelte": "^5",
60
63
  "tailwind-variants": "^3.3.1",
61
- "three": "^0.186.1",
62
- "@selvajs/compute": "^4.2.1",
63
- "@selvajs/schemas": "^5.2.0",
64
- "@selvajs/visualization": "^1.5.0",
65
- "@selvajs/solve": "^1.2.3-beta.0"
64
+ "three": "^0.187.0",
65
+ "@selvajs/compute": "^5.0.0-beta.10",
66
+ "@selvajs/visualization": "^1.6.0-beta.10",
67
+ "@selvajs/schemas": "^5.3.0-beta.3",
68
+ "@selvajs/solve": "^2.0.0-beta.13"
66
69
  },
67
70
  "peerDependenciesMeta": {
68
71
  "three": {
@@ -71,30 +74,35 @@
71
74
  },
72
75
  "dependencies": {
73
76
  "@floating-ui/dom": "^1.8.0",
74
- "@iconify/svelte": "^5.2.1",
75
- "@lucide/svelte": "^1.48.0",
77
+ "@fontsource-variable/hanken-grotesk": "^5.3.0",
78
+ "@iconify/svelte": "^5.2.4",
79
+ "@lucide/svelte": "^1.66.0",
76
80
  "clsx": "^2.1.1",
77
81
  "mode-watcher": "^1.1.0",
78
82
  "paneforge": "^1.0.2",
79
- "svelte-sonner": "^1.2.1",
83
+ "svelte-sonner": "^1.2.2",
80
84
  "tailwind-merge": "^3.7.0",
81
85
  "tw-animate-css": "^1.4.0"
82
86
  },
83
87
  "devDependencies": {
84
88
  "@internationalized/date": "^3.12.4",
85
- "@sveltejs/kit": "2.70.3",
89
+ "@sveltejs/kit": "3.1.1",
86
90
  "@sveltejs/vite-plugin-svelte": "^7.3.1",
87
- "@types/three": "^0.186.0",
88
- "bits-ui": "^2.19.3",
91
+ "@types/three": "^0.187.0",
92
+ "bits-ui": "^2.20.2",
89
93
  "rimraf": "^6.1.3",
90
- "svelte": "5.57.1",
94
+ "svelte": "5.57.3",
91
95
  "tailwind-variants": "^3.3.1",
92
- "vitest": "^5.0.2",
93
- "@selvajs/visualization": "1.5.0",
94
- "@selvajs/schemas": "5.2.0",
95
- "@selvajs/compute": "4.2.1",
96
- "@selvajs/solve": "1.2.3-beta.0",
97
- "@selvajs/config": "0.0.4"
96
+ "vitest": "^5.0.5",
97
+ "@selvajs/compute": "5.0.0-beta.10",
98
+ "@selvajs/config": "0.0.4",
99
+ "@selvajs/visualization": "1.6.0-beta.10",
100
+ "@selvajs/schemas": "5.3.0-beta.3",
101
+ "@selvajs/solve": "2.0.0-beta.13"
102
+ },
103
+ "imports": {
104
+ "#lib": "./src/lib/index.js",
105
+ "#lib/*": "./src/lib/*"
98
106
  },
99
107
  "scripts": {
100
108
  "predev": "node ../../scripts/sync-shared-assets.js",
@@ -3,6 +3,7 @@
3
3
  import * as Card from './primitives/card/index.js';
4
4
  import { Button } from './primitives/button/index.js';
5
5
  import Callout from './primitives/Callout.svelte';
6
+ import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
6
7
 
7
8
  interface Props {
8
9
  status?: number;
@@ -12,9 +13,12 @@
12
13
  }
13
14
 
14
15
  let { status = 500, message, details, homeLink = '/' }: Props = $props();
16
+
17
+ const locale = getLocaleContext();
18
+ const t = $derived(locale.messages);
15
19
  </script>
16
20
 
17
- <div class="p-4 flex min-h-screen items-center justify-center bg-background">
21
+ <div class="p-4 flex min-h-dvh items-center justify-center bg-background">
18
22
  <Card.Root class="max-w-md w-full">
19
23
  <Card.Header>
20
24
  <div class="gap-4 flex flex-col items-center text-center">
@@ -26,7 +30,7 @@
26
30
  </Card.Header>
27
31
  <Card.Content>
28
32
  <div class="gap-4 flex flex-col">
29
- <Callout tone="danger" title="Error">
33
+ <Callout tone="danger" title={t.errorTitle}>
30
34
  {#if message}{message}{/if}
31
35
  </Callout>
32
36
  {#if details}
@@ -37,7 +41,7 @@
37
41
  </div>
38
42
  </Card.Content>
39
43
  <Card.Footer>
40
- <Button variant="outline" href={homeLink} rel="external" class="w-full">Go Home</Button>
44
+ <Button variant="outline" href={homeLink} rel="external" class="w-full">{t.goHome}</Button>
41
45
  </Card.Footer>
42
46
  </Card.Root>
43
47
  </div>