@selvajs/ui 6.5.1-beta.0 → 6.6.0-beta.2

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 (348) hide show
  1. package/dist/components/ConfirmDialog.svelte +2 -10
  2. package/dist/components/ErrorScreen.svelte +16 -26
  3. package/dist/components/compute/AppLayout.svelte +7 -13
  4. package/dist/components/compute/ComputeApp.svelte +3 -3
  5. package/dist/components/compute/ComputeMessagesDialog.svelte +23 -49
  6. package/dist/components/compute/ParameterPresetManager.svelte +24 -68
  7. package/dist/components/compute/SolveMessages.svelte +23 -31
  8. package/dist/components/layout/Pagination.svelte +2 -4
  9. package/dist/components/layout/SideNav.svelte +1 -1
  10. package/dist/components/preview/ChartOutput.svelte +1 -5
  11. package/dist/components/preview/Group.svelte +71 -102
  12. package/dist/components/preview/Group.svelte.d.ts +1 -1
  13. package/dist/components/preview/HelpButton.svelte +34 -0
  14. package/dist/components/preview/HelpButton.svelte.d.ts +8 -0
  15. package/dist/components/preview/ImageOutput.svelte +2 -4
  16. package/dist/components/preview/InputControl.svelte +45 -45
  17. package/dist/components/preview/OutputDisplay.svelte +12 -22
  18. package/dist/components/preview/TabBar.svelte +106 -22
  19. package/dist/components/preview/TabBar.svelte.d.ts +1 -0
  20. package/dist/components/preview/TabContent.svelte +27 -56
  21. package/dist/components/preview/TabLayout.svelte +3 -3
  22. package/dist/components/preview/inputs/CheckboxInput.svelte +7 -7
  23. package/dist/components/preview/inputs/CheckboxInput.svelte.d.ts +3 -0
  24. package/dist/components/preview/inputs/ColorInput.svelte +1 -1
  25. package/dist/components/preview/inputs/FileInput.svelte +10 -13
  26. package/dist/components/preview/inputs/NumberInput.svelte +37 -57
  27. package/dist/components/preview/inputs/TextInput.svelte +0 -1
  28. package/dist/components/primitives/CalculateButton.svelte +1 -1
  29. package/dist/components/primitives/Callout.svelte +11 -18
  30. package/dist/components/primitives/DataTable.svelte +3 -4
  31. package/dist/components/primitives/FilterableDropdown.svelte +42 -129
  32. package/dist/components/primitives/FilterableDropdown.svelte.d.ts +1 -1
  33. package/dist/components/primitives/IssueList.svelte +56 -0
  34. package/dist/components/primitives/IssueList.svelte.d.ts +20 -0
  35. package/dist/components/primitives/SeverityIcon.svelte +15 -0
  36. package/dist/components/primitives/SeverityIcon.svelte.d.ts +8 -0
  37. package/dist/components/primitives/SolvingIndicator.svelte +1 -29
  38. package/dist/components/primitives/StateDisplay.svelte +19 -79
  39. package/dist/components/primitives/ViewToggle.svelte +18 -33
  40. package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte +9 -3
  41. package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte.d.ts +6 -1
  42. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  43. package/dist/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
  44. package/dist/components/primitives/badge/badge.svelte +2 -2
  45. package/dist/components/primitives/badge/badge.svelte.d.ts +4 -4
  46. package/dist/components/primitives/button/button.svelte +3 -2
  47. package/dist/components/primitives/button/button.svelte.d.ts +7 -4
  48. package/dist/components/primitives/card/card-header.svelte +1 -1
  49. package/dist/components/primitives/card/card.svelte +21 -5
  50. package/dist/components/primitives/card/card.svelte.d.ts +25 -1
  51. package/dist/components/primitives/card/index.d.ts +1 -2
  52. package/dist/components/primitives/card/index.js +2 -3
  53. package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
  54. package/dist/components/primitives/command/command-dialog.svelte +42 -0
  55. package/dist/components/primitives/command/command-dialog.svelte.d.ts +14 -0
  56. package/dist/components/primitives/command/command-empty.svelte +17 -0
  57. package/dist/components/primitives/command/command-empty.svelte.d.ts +4 -0
  58. package/dist/components/primitives/command/command-group.svelte +33 -0
  59. package/dist/components/primitives/command/command-group.svelte.d.ts +7 -0
  60. package/dist/components/primitives/command/command-input.svelte +36 -0
  61. package/dist/components/primitives/command/command-input.svelte.d.ts +4 -0
  62. package/dist/components/primitives/command/command-item.svelte +28 -0
  63. package/dist/components/primitives/command/command-item.svelte.d.ts +4 -0
  64. package/dist/components/primitives/command/command-link-item.svelte +21 -0
  65. package/dist/components/primitives/command/command-link-item.svelte.d.ts +4 -0
  66. package/dist/components/primitives/command/command-list.svelte +20 -0
  67. package/dist/components/primitives/command/command-list.svelte.d.ts +4 -0
  68. package/dist/components/primitives/command/command-loading.svelte +7 -0
  69. package/dist/components/primitives/command/command-loading.svelte.d.ts +4 -0
  70. package/dist/components/primitives/command/command-separator.svelte +17 -0
  71. package/dist/components/primitives/command/command-separator.svelte.d.ts +4 -0
  72. package/dist/components/primitives/command/command-shortcut.svelte +23 -0
  73. package/dist/components/primitives/command/command-shortcut.svelte.d.ts +5 -0
  74. package/dist/components/primitives/command/command.svelte +28 -0
  75. package/dist/components/primitives/command/command.svelte.d.ts +8 -0
  76. package/dist/components/primitives/command/index.d.ts +12 -0
  77. package/dist/components/primitives/command/index.js +14 -0
  78. package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
  79. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  80. package/dist/components/primitives/dialog/dialog-content.svelte +5 -1
  81. package/dist/components/primitives/dialog/dialog-content.svelte.d.ts +2 -0
  82. package/dist/components/primitives/dialog/dialog-overlay.svelte +1 -1
  83. package/dist/components/primitives/dialog/dialog-title.svelte +6 -2
  84. package/dist/components/primitives/dialog/dialog-title.svelte.d.ts +5 -1
  85. package/dist/components/primitives/drawer/Drawer.svelte +1 -1
  86. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  87. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +4 -0
  88. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  89. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
  90. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +31 -0
  91. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +10 -0
  92. package/dist/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  93. package/dist/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +8 -0
  94. package/dist/components/primitives/dropdown-menu/dropdown-menu-group.svelte +7 -0
  95. package/dist/components/primitives/dropdown-menu/dropdown-menu-group.svelte.d.ts +4 -0
  96. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +27 -0
  97. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +8 -0
  98. package/dist/components/primitives/dropdown-menu/dropdown-menu-label.svelte +24 -0
  99. package/dist/components/primitives/dropdown-menu/dropdown-menu-label.svelte.d.ts +8 -0
  100. package/dist/components/primitives/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  101. package/dist/components/primitives/dropdown-menu/dropdown-menu-portal.svelte.d.ts +3 -0
  102. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  103. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +4 -0
  104. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  105. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +4 -0
  106. package/dist/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  107. package/dist/components/primitives/dropdown-menu/dropdown-menu-separator.svelte.d.ts +4 -0
  108. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
  109. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +5 -0
  110. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  111. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +10 -0
  112. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  113. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +7 -0
  114. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  115. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub.svelte.d.ts +3 -0
  116. package/dist/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  117. package/dist/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +4 -0
  118. package/dist/components/primitives/dropdown-menu/dropdown-menu.svelte +7 -0
  119. package/dist/components/primitives/dropdown-menu/dropdown-menu.svelte.d.ts +3 -0
  120. package/dist/components/primitives/dropdown-menu/index.d.ts +18 -0
  121. package/dist/components/primitives/dropdown-menu/index.js +18 -0
  122. package/dist/components/primitives/{alert/alert-description.svelte → empty/empty-content.svelte} +3 -3
  123. package/dist/components/primitives/empty/empty-content.svelte.d.ts +5 -0
  124. package/dist/components/primitives/empty/empty-description.svelte +23 -0
  125. package/dist/components/primitives/{alert/alert-description.svelte.d.ts → empty/empty-description.svelte.d.ts} +4 -4
  126. package/dist/components/primitives/{alert/alert-title.svelte → empty/empty-header.svelte} +3 -3
  127. package/dist/components/primitives/empty/empty-header.svelte.d.ts +5 -0
  128. package/dist/components/primitives/empty/empty-media.svelte +41 -0
  129. package/dist/components/primitives/empty/empty-media.svelte.d.ts +26 -0
  130. package/dist/components/primitives/{card/card-action.svelte → empty/empty-title.svelte} +2 -2
  131. package/dist/components/primitives/{card/card-action.svelte.d.ts → empty/empty-title.svelte.d.ts} +3 -3
  132. package/dist/components/primitives/empty/empty.svelte +23 -0
  133. package/dist/components/primitives/empty/empty.svelte.d.ts +5 -0
  134. package/dist/components/primitives/empty/index.d.ts +7 -0
  135. package/dist/components/primitives/empty/index.js +9 -0
  136. package/dist/components/primitives/index.d.ts +10 -1
  137. package/dist/components/primitives/index.js +10 -1
  138. package/dist/components/primitives/input/input.svelte +4 -4
  139. package/dist/components/primitives/input-group/index.d.ts +7 -0
  140. package/dist/components/primitives/input-group/index.js +9 -0
  141. package/dist/components/primitives/input-group/input-group-addon.svelte +53 -0
  142. package/dist/components/primitives/input-group/input-group-addon.svelte.d.ts +32 -0
  143. package/dist/components/primitives/input-group/input-group-button.svelte +49 -0
  144. package/dist/components/primitives/input-group/input-group-button.svelte.d.ts +32 -0
  145. package/dist/components/primitives/input-group/input-group-input.svelte +25 -0
  146. package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +11 -0
  147. package/dist/components/primitives/input-group/input-group-text.svelte +22 -0
  148. package/dist/components/primitives/input-group/input-group-text.svelte.d.ts +5 -0
  149. package/dist/components/primitives/input-group/input-group-textarea.svelte +23 -0
  150. package/dist/components/primitives/input-group/input-group-textarea.svelte.d.ts +3 -0
  151. package/dist/components/primitives/input-group/input-group.svelte +24 -0
  152. package/dist/components/primitives/{alert/alert-title.svelte.d.ts → input-group/input-group.svelte.d.ts} +4 -4
  153. package/dist/components/primitives/mode-toggle/mode-toggle.svelte +2 -6
  154. package/dist/components/primitives/popover/index.d.ts +9 -0
  155. package/dist/components/primitives/popover/index.js +11 -0
  156. package/dist/components/primitives/popover/popover-close.svelte +7 -0
  157. package/dist/components/primitives/popover/popover-close.svelte.d.ts +4 -0
  158. package/dist/components/primitives/popover/popover-content.svelte +31 -0
  159. package/dist/components/primitives/popover/popover-content.svelte.d.ts +10 -0
  160. package/dist/components/primitives/popover/popover-description.svelte +20 -0
  161. package/dist/components/primitives/popover/popover-description.svelte.d.ts +5 -0
  162. package/dist/components/primitives/popover/popover-header.svelte +20 -0
  163. package/dist/components/primitives/popover/popover-header.svelte.d.ts +5 -0
  164. package/dist/components/primitives/popover/popover-portal.svelte +7 -0
  165. package/dist/components/primitives/popover/popover-portal.svelte.d.ts +3 -0
  166. package/dist/components/primitives/popover/popover-title.svelte +15 -0
  167. package/dist/components/primitives/popover/popover-title.svelte.d.ts +5 -0
  168. package/dist/components/primitives/popover/popover-trigger.svelte +17 -0
  169. package/dist/components/primitives/popover/popover-trigger.svelte.d.ts +4 -0
  170. package/dist/components/primitives/popover/popover.svelte +7 -0
  171. package/dist/components/primitives/popover/popover.svelte.d.ts +3 -0
  172. package/dist/components/primitives/resizable/resizable-handle.svelte +6 -2
  173. package/dist/components/primitives/resizable/resizable-handle.svelte.d.ts +2 -0
  174. package/dist/components/primitives/resizable/resizable-pane-group.svelte +1 -4
  175. package/dist/components/primitives/scroll-area/scroll-area.svelte +1 -1
  176. package/dist/components/primitives/search/search.svelte +3 -3
  177. package/dist/components/primitives/select/select-content.svelte +1 -1
  178. package/dist/components/primitives/select/select-trigger.svelte +1 -1
  179. package/dist/components/primitives/severity.d.ts +7 -0
  180. package/dist/components/primitives/severity.js +19 -0
  181. package/dist/components/primitives/slider/slider.svelte +2 -2
  182. package/dist/components/primitives/sonner/sonner.svelte +1 -1
  183. package/dist/components/primitives/spinner/index.d.ts +1 -0
  184. package/dist/components/primitives/spinner/index.js +1 -0
  185. package/dist/components/primitives/spinner/spinner.svelte +29 -0
  186. package/dist/components/primitives/spinner/spinner.svelte.d.ts +4 -0
  187. package/dist/components/primitives/switch/switch.svelte +2 -2
  188. package/dist/components/primitives/tabs/tabs-list.svelte +27 -5
  189. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +22 -1
  190. package/dist/components/primitives/tabs/tabs-trigger.svelte +23 -5
  191. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +22 -1
  192. package/dist/components/primitives/tabs/tabs.svelte +6 -2
  193. package/dist/components/primitives/tabs/tabs.svelte.d.ts +5 -1
  194. package/dist/components/primitives/textarea/textarea.svelte +1 -1
  195. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +1 -1
  196. package/dist/components/primitives/toggle/index.d.ts +3 -0
  197. package/dist/components/primitives/toggle/index.js +5 -0
  198. package/dist/components/primitives/toggle/toggle.svelte +52 -0
  199. package/dist/components/primitives/toggle/toggle.svelte.d.ts +43 -0
  200. package/dist/components/primitives/toggle-group/index.d.ts +3 -0
  201. package/dist/components/primitives/toggle-group/index.js +5 -0
  202. package/dist/components/primitives/toggle-group/toggle-group-item.svelte +35 -0
  203. package/dist/components/primitives/toggle-group/toggle-group-item.svelte.d.ts +6 -0
  204. package/dist/components/primitives/toggle-group/toggle-group.svelte +75 -0
  205. package/dist/components/primitives/toggle-group/toggle-group.svelte.d.ts +17 -0
  206. package/dist/components/viewer/MeshMetadataDialog.svelte +3 -3
  207. package/dist/components/viewer/SceneManager.svelte +14 -5
  208. package/dist/components/viewer/Viewer.svelte +120 -171
  209. package/dist/i18n/messages.d.ts +2 -0
  210. package/dist/i18n/messages.js +4 -0
  211. package/dist/styles/base.css +43 -0
  212. package/package.json +8 -8
  213. package/src/lib/components/ConfirmDialog.svelte +2 -10
  214. package/src/lib/components/ErrorScreen.svelte +16 -26
  215. package/src/lib/components/compute/AppLayout.svelte +7 -13
  216. package/src/lib/components/compute/ComputeApp.svelte +3 -3
  217. package/src/lib/components/compute/ComputeMessagesDialog.svelte +23 -49
  218. package/src/lib/components/compute/ParameterPresetManager.svelte +24 -68
  219. package/src/lib/components/compute/SolveMessages.svelte +23 -31
  220. package/src/lib/components/layout/Pagination.svelte +2 -4
  221. package/src/lib/components/layout/SideNav.svelte +1 -1
  222. package/src/lib/components/preview/ChartOutput.svelte +1 -5
  223. package/src/lib/components/preview/Group.svelte +71 -102
  224. package/src/lib/components/preview/HelpButton.svelte +34 -0
  225. package/src/lib/components/preview/ImageOutput.svelte +2 -4
  226. package/src/lib/components/preview/InputControl.svelte +45 -45
  227. package/src/lib/components/preview/OutputDisplay.svelte +12 -22
  228. package/src/lib/components/preview/TabBar.svelte +106 -22
  229. package/src/lib/components/preview/TabContent.svelte +27 -56
  230. package/src/lib/components/preview/TabLayout.svelte +3 -3
  231. package/src/lib/components/preview/inputs/CheckboxInput.svelte +7 -7
  232. package/src/lib/components/preview/inputs/ColorInput.svelte +1 -1
  233. package/src/lib/components/preview/inputs/FileInput.svelte +10 -13
  234. package/src/lib/components/preview/inputs/NumberInput.svelte +37 -57
  235. package/src/lib/components/preview/inputs/TextInput.svelte +0 -1
  236. package/src/lib/components/primitives/CalculateButton.svelte +1 -1
  237. package/src/lib/components/primitives/Callout.svelte +11 -18
  238. package/src/lib/components/primitives/DataTable.svelte +3 -4
  239. package/src/lib/components/primitives/FilterableDropdown.svelte +42 -129
  240. package/src/lib/components/primitives/IssueList.svelte +56 -0
  241. package/src/lib/components/primitives/SeverityIcon.svelte +15 -0
  242. package/src/lib/components/primitives/SolvingIndicator.svelte +1 -29
  243. package/src/lib/components/primitives/StateDisplay.svelte +19 -79
  244. package/src/lib/components/primitives/ViewToggle.svelte +18 -33
  245. package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +9 -3
  246. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  247. package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
  248. package/src/lib/components/primitives/badge/badge.svelte +2 -2
  249. package/src/lib/components/primitives/button/button.svelte +3 -2
  250. package/src/lib/components/primitives/card/card-header.svelte +1 -1
  251. package/src/lib/components/primitives/card/card.svelte +21 -5
  252. package/src/lib/components/primitives/card/index.ts +1 -4
  253. package/src/lib/components/primitives/checkbox/checkbox.svelte +1 -1
  254. package/src/lib/components/primitives/command/command-dialog.svelte +42 -0
  255. package/src/lib/components/primitives/command/command-empty.svelte +17 -0
  256. package/src/lib/components/primitives/command/command-group.svelte +33 -0
  257. package/src/lib/components/primitives/command/command-input.svelte +36 -0
  258. package/src/lib/components/primitives/command/command-item.svelte +28 -0
  259. package/src/lib/components/primitives/command/command-link-item.svelte +21 -0
  260. package/src/lib/components/primitives/command/command-list.svelte +20 -0
  261. package/src/lib/components/primitives/command/command-loading.svelte +7 -0
  262. package/src/lib/components/primitives/command/command-separator.svelte +17 -0
  263. package/src/lib/components/primitives/command/command-shortcut.svelte +23 -0
  264. package/src/lib/components/primitives/command/command.svelte +28 -0
  265. package/src/lib/components/primitives/command/index.ts +37 -0
  266. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +1 -1
  267. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  268. package/src/lib/components/primitives/dialog/dialog-content.svelte +5 -1
  269. package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
  270. package/src/lib/components/primitives/dialog/dialog-title.svelte +6 -2
  271. package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
  272. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  273. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  274. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +31 -0
  275. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  276. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group.svelte +7 -0
  277. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +27 -0
  278. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +24 -0
  279. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  280. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  281. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  282. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  283. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
  284. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  285. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  286. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  287. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  288. package/src/lib/components/primitives/dropdown-menu/dropdown-menu.svelte +7 -0
  289. package/src/lib/components/primitives/dropdown-menu/index.ts +54 -0
  290. package/src/lib/components/primitives/{alert/alert-description.svelte → empty/empty-content.svelte} +3 -3
  291. package/src/lib/components/primitives/empty/empty-description.svelte +23 -0
  292. package/src/lib/components/primitives/{alert/alert-title.svelte → empty/empty-header.svelte} +3 -3
  293. package/src/lib/components/primitives/empty/empty-media.svelte +41 -0
  294. package/src/lib/components/primitives/{card/card-action.svelte → empty/empty-title.svelte} +2 -2
  295. package/src/lib/components/primitives/empty/empty.svelte +23 -0
  296. package/src/lib/components/primitives/empty/index.ts +22 -0
  297. package/src/lib/components/primitives/index.ts +10 -1
  298. package/src/lib/components/primitives/input/input.svelte +4 -4
  299. package/src/lib/components/primitives/input-group/index.ts +22 -0
  300. package/src/lib/components/primitives/input-group/input-group-addon.svelte +53 -0
  301. package/src/lib/components/primitives/input-group/input-group-button.svelte +49 -0
  302. package/src/lib/components/primitives/input-group/input-group-input.svelte +25 -0
  303. package/src/lib/components/primitives/input-group/input-group-text.svelte +22 -0
  304. package/src/lib/components/primitives/input-group/input-group-textarea.svelte +23 -0
  305. package/src/lib/components/primitives/input-group/input-group.svelte +24 -0
  306. package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +2 -6
  307. package/src/lib/components/primitives/popover/index.ts +28 -0
  308. package/src/lib/components/primitives/popover/popover-close.svelte +7 -0
  309. package/src/lib/components/primitives/popover/popover-content.svelte +31 -0
  310. package/src/lib/components/primitives/popover/popover-description.svelte +20 -0
  311. package/src/lib/components/primitives/popover/popover-header.svelte +20 -0
  312. package/src/lib/components/primitives/popover/popover-portal.svelte +7 -0
  313. package/src/lib/components/primitives/popover/popover-title.svelte +15 -0
  314. package/src/lib/components/primitives/popover/popover-trigger.svelte +17 -0
  315. package/src/lib/components/primitives/popover/popover.svelte +7 -0
  316. package/src/lib/components/primitives/resizable/resizable-handle.svelte +6 -2
  317. package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -4
  318. package/src/lib/components/primitives/scroll-area/scroll-area.svelte +1 -1
  319. package/src/lib/components/primitives/search/search.svelte +3 -3
  320. package/src/lib/components/primitives/select/select-content.svelte +1 -1
  321. package/src/lib/components/primitives/select/select-trigger.svelte +1 -1
  322. package/src/lib/components/primitives/severity.ts +26 -0
  323. package/src/lib/components/primitives/slider/slider.svelte +2 -2
  324. package/src/lib/components/primitives/sonner/sonner.svelte +1 -1
  325. package/src/lib/components/primitives/spinner/index.ts +1 -0
  326. package/src/lib/components/primitives/spinner/spinner.svelte +29 -0
  327. package/src/lib/components/primitives/switch/switch.svelte +2 -2
  328. package/src/lib/components/primitives/tabs/tabs-list.svelte +27 -5
  329. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +23 -5
  330. package/src/lib/components/primitives/tabs/tabs.svelte +6 -2
  331. package/src/lib/components/primitives/textarea/textarea.svelte +1 -1
  332. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +1 -1
  333. package/src/lib/components/primitives/toggle/index.ts +13 -0
  334. package/src/lib/components/primitives/toggle/toggle.svelte +52 -0
  335. package/src/lib/components/primitives/toggle-group/index.ts +10 -0
  336. package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +35 -0
  337. package/src/lib/components/primitives/toggle-group/toggle-group.svelte +75 -0
  338. package/src/lib/components/viewer/MeshMetadataDialog.svelte +3 -3
  339. package/src/lib/components/viewer/SceneManager.svelte +14 -5
  340. package/src/lib/components/viewer/Viewer.svelte +120 -171
  341. package/src/lib/i18n/messages.ts +6 -0
  342. package/src/lib/styles/base.css +43 -0
  343. package/dist/components/primitives/alert/alert.svelte +0 -44
  344. package/dist/components/primitives/alert/alert.svelte.d.ts +0 -26
  345. package/dist/components/primitives/alert/index.d.ts +0 -5
  346. package/dist/components/primitives/alert/index.js +0 -7
  347. package/src/lib/components/primitives/alert/alert.svelte +0 -44
  348. package/src/lib/components/primitives/alert/index.ts +0 -14
@@ -0,0 +1,6 @@
1
+ import { ToggleGroup as ToggleGroupPrimitive } from 'bits-ui';
2
+ import { type ToggleVariants } from '../toggle/index.js';
3
+ type $$ComponentProps = ToggleGroupPrimitive.ItemProps & ToggleVariants;
4
+ declare const ToggleGroupItem: import("svelte").Component<$$ComponentProps, {}, "ref" | "value">;
5
+ type ToggleGroupItem = ReturnType<typeof ToggleGroupItem>;
6
+ export default ToggleGroupItem;
@@ -0,0 +1,75 @@
1
+ <script lang="ts" module>
2
+ import { getContext, setContext } from 'svelte';
3
+ import { toggleVariants } from '../toggle/index.js';
4
+ import type { VariantProps } from 'tailwind-variants';
5
+
6
+ type ToggleVariants = VariantProps<typeof toggleVariants>;
7
+
8
+ interface ToggleGroupContext extends ToggleVariants {
9
+ spacing?: number;
10
+ orientation?: 'horizontal' | 'vertical';
11
+ }
12
+
13
+ export function setToggleGroupCtx(props: ToggleGroupContext) {
14
+ setContext('toggleGroup', props);
15
+ }
16
+
17
+ export function getToggleGroupCtx() {
18
+ return getContext<Required<ToggleGroupContext>>('toggleGroup');
19
+ }
20
+ </script>
21
+
22
+ <script lang="ts">
23
+ import { ToggleGroup as ToggleGroupPrimitive } from 'bits-ui';
24
+ import { cn } from '../../../utils.js';
25
+
26
+ let {
27
+ ref = $bindable(null),
28
+ value = $bindable(),
29
+ class: className,
30
+ size = 'default',
31
+ spacing = 0,
32
+ orientation = 'horizontal',
33
+ variant = 'default',
34
+ ...restProps
35
+ }: ToggleGroupPrimitive.RootProps &
36
+ ToggleVariants & {
37
+ spacing?: number;
38
+ orientation?: 'horizontal' | 'vertical';
39
+ } = $props();
40
+
41
+ setToggleGroupCtx({
42
+ get variant() {
43
+ return variant;
44
+ },
45
+ get size() {
46
+ return size;
47
+ },
48
+ get spacing() {
49
+ return spacing;
50
+ },
51
+ get orientation() {
52
+ return orientation;
53
+ }
54
+ });
55
+ </script>
56
+
57
+ <!--
58
+ Discriminated Unions + Destructing (required for bindable) do not
59
+ get along, so we shut typescript up by casting `value` to `never`.
60
+ -->
61
+ <ToggleGroupPrimitive.Root
62
+ bind:value={value as never}
63
+ bind:ref
64
+ {orientation}
65
+ data-slot="toggle-group"
66
+ data-variant={variant}
67
+ data-size={size}
68
+ data-spacing={spacing}
69
+ style="--gap: calc(var(--spacing) * {spacing})"
70
+ class={cn(
71
+ 'group/toggle-group flex w-fit flex-row items-center gap-(--gap) rounded-lg data-vertical:flex-col data-vertical:items-stretch data-[size=sm]:rounded-md',
72
+ className
73
+ )}
74
+ {...restProps}
75
+ />
@@ -0,0 +1,17 @@
1
+ import { toggleVariants } from '../toggle/index.js';
2
+ import type { VariantProps } from 'tailwind-variants';
3
+ type ToggleVariants = VariantProps<typeof toggleVariants>;
4
+ interface ToggleGroupContext extends ToggleVariants {
5
+ spacing?: number;
6
+ orientation?: 'horizontal' | 'vertical';
7
+ }
8
+ export declare function setToggleGroupCtx(props: ToggleGroupContext): void;
9
+ export declare function getToggleGroupCtx(): Required<ToggleGroupContext>;
10
+ import { ToggleGroup as ToggleGroupPrimitive } from 'bits-ui';
11
+ type $$ComponentProps = ToggleGroupPrimitive.RootProps & ToggleVariants & {
12
+ spacing?: number;
13
+ orientation?: 'horizontal' | 'vertical';
14
+ };
15
+ declare const ToggleGroup: import("svelte").Component<$$ComponentProps, {}, "ref" | "value">;
16
+ type ToggleGroup = ReturnType<typeof ToggleGroup>;
17
+ export default ToggleGroup;
@@ -48,10 +48,10 @@
48
48
  </script>
49
49
 
50
50
  <Dialog.Root bind:open {onOpenChange}>
51
- <Dialog.Content class="min-w-60 max-w-xs p-0 gap-0 w-auto overflow-hidden">
51
+ <Dialog.Content variant="flush" class="min-w-60 max-w-xs w-auto">
52
52
  {#if meshName}
53
53
  <div class="px-4 pt-3 pb-2 border-b">
54
- <Dialog.Title class="text-sm font-semibold">{meshName}</Dialog.Title>
54
+ <Dialog.Title size="sm">{meshName}</Dialog.Title>
55
55
  </div>
56
56
  {:else}
57
57
  <Dialog.Title class="sr-only">{t.objectFallbackName}</Dialog.Title>
@@ -102,7 +102,7 @@
102
102
  {:else if typeof value === 'number'}
103
103
  <span class="font-mono">{value}</span>
104
104
  {:else if typeof value === 'boolean'}
105
- <span class={value ? 'text-green-500' : 'text-muted-foreground'}
105
+ <span class={value ? 'text-success' : 'text-muted-foreground'}
106
106
  >{value ? 'true' : 'false'}</span
107
107
  >
108
108
  {:else}
@@ -256,9 +256,18 @@
256
256
  <!-- Spacer sized to the full list; windowed rows are placed into it by offset. The listbox
257
257
  sits here rather than per layer: windowing renders one flat row list, so every option
258
258
  shares a single owner. -->
259
- <div role="listbox" aria-multiselectable="true" class="relative" style:height="{totalHeight}px">
259
+ <div
260
+ role="listbox"
261
+ aria-multiselectable="true"
262
+ class="relative h-(--list-h)"
263
+ style:--list-h="{totalHeight}px"
264
+ >
260
265
  {#each visibleRows as row (row.key)}
261
- <div class="inset-x-0 absolute" style:top="{row.top}px" style:height="{row.height}px">
266
+ <div
267
+ class="inset-x-0 absolute top-(--row-top) h-(--row-h)"
268
+ style:--row-top="{row.top}px"
269
+ style:--row-h="{row.height}px"
270
+ >
262
271
  {#if row.kind === 'layer'}
263
272
  {@const entries = row.entries}
264
273
  {@const numHidden = hiddenCount(entries)}
@@ -304,7 +313,7 @@
304
313
  {row.layerName}
305
314
  </span>
306
315
 
307
- <span class="shrink-0 text-[10px] text-muted-foreground/50 tabular-nums">
316
+ <span class="shrink-0 text-2xs text-muted-foreground/50 tabular-nums">
308
317
  {entries.length}
309
318
  </span>
310
319
  </div>
@@ -355,7 +364,7 @@
355
364
  </span>
356
365
 
357
366
  <span
358
- class="rounded px-1 py-0.5 font-medium shrink-0 bg-muted text-[9px] text-muted-foreground/70"
367
+ class="rounded px-1 py-0.5 font-medium shrink-0 bg-muted text-2xs text-muted-foreground/70"
359
368
  >
360
369
  {getTypeLabel(entry.object)}
361
370
  </span>
@@ -390,7 +399,7 @@
390
399
  background: transparent;
391
400
  }
392
401
  div::-webkit-scrollbar-thumb {
393
- background: hsl(var(--muted-foreground) / 0.15);
402
+ background: color-mix(in oklch, var(--muted-foreground) 15%, transparent);
394
403
  border-radius: 2px;
395
404
  }
396
405
  </style>
@@ -26,12 +26,9 @@
26
26
  Frame,
27
27
  Ruler,
28
28
  Grid3x3,
29
- Check,
30
- ChevronRight,
31
29
  Palette,
32
30
  Spline
33
31
  } from '@lucide/svelte';
34
- import { DropdownMenu } from 'bits-ui';
35
32
  import { SvelteSet } from 'svelte/reactivity';
36
33
  import type * as THREE from 'three';
37
34
  import type { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
@@ -39,6 +36,8 @@
39
36
  import SceneManager from './SceneManager.svelte';
40
37
  import MeshMetadataDialog from './MeshMetadataDialog.svelte';
41
38
  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';
42
41
  import type { Locale } from '../../i18n/messages';
43
42
  import { setLocaleContext, getLocaleContext } from '../../i18n/localeContext.svelte';
44
43
 
@@ -417,7 +416,7 @@
417
416
  <div
418
417
  class="min-h-64 sm:min-h-96 lg:min-h-125 relative h-full flex-1 border {isFullscreen
419
418
  ? 'fullscreen-viewer'
420
- : 'overflow-hidden rounded-[0.625rem]'}"
419
+ : 'overflow-hidden rounded-lg'}"
421
420
  >
422
421
  <Resizable.PaneGroup direction="horizontal" class="h-full w-full">
423
422
  <!-- `defaultSize` must sum to 100 across the live panes. Panes register a frame before the
@@ -426,7 +425,7 @@
426
425
  scene pane keeps a sliver of its intended width. Hence 85 + 15, and the explicit id/order
427
426
  so a conditionally-rendered pane keeps its slot. -->
428
427
  <Resizable.Pane id="viewport" order={1} defaultSize={sceneManagerOpen ? 85 : 100} minSize={40}>
429
- <div class="relative h-full w-full" style="touch-action: none;">
428
+ <div class="relative h-full w-full touch-none">
430
429
  <!-- Mesh count of the geometry currently in the scene. The canvas itself is opaque to
431
430
  the DOM, so this is the only observable proof a solve's geometry decoded and
432
431
  rendered; e2e asserts on it. -->
@@ -444,19 +443,18 @@
444
443
  ></div>
445
444
 
446
445
  {#if isSolving}
447
- <div
448
- class="inset-0 absolute z-10 animate-[selva-viewer-fade-in_0.2s_ease-out] backdrop-blur-[2px] transition-all duration-300"
449
- ></div>
446
+ <div class="inset-0 animate-in fade-in backdrop-blur-xs absolute z-10 duration-200"></div>
450
447
  {/if}
451
448
 
452
449
  {#if logoUrl}
453
450
  <!-- Bottom offset matches the tools menu so it clears the mobile drawer handle.
454
451
  Always pointer-events:none so it never intercepts canvas drags. -->
455
452
  <div
456
- class="right-4 {isFullscreen ? 'bottom-4' : 'bottom-16 sm:bottom-4'} absolute z-20"
457
- style={hideButton
458
- ? 'opacity: 0; pointer-events: none;'
459
- : 'opacity: 1; pointer-events: none;'}
453
+ class="right-4 {isFullscreen
454
+ ? 'bottom-4'
455
+ : 'bottom-16 sm:bottom-4'} pointer-events-none absolute z-20 {hideButton
456
+ ? 'opacity-0'
457
+ : ''}"
460
458
  >
461
459
  <img
462
460
  src={logoUrl}
@@ -467,171 +465,131 @@
467
465
  {/if}
468
466
 
469
467
  {#if config.showToolsMenu}
470
- {@const itemClass =
471
- 'gap-2 px-2 py-1.5 text-sm flex cursor-pointer select-none items-center rounded-sm outline-none transition-colors hover:bg-muted focus:bg-muted'}
472
468
  <div
473
469
  class="left-4 {isFullscreen
474
470
  ? 'bottom-4'
475
- : 'bottom-16 sm:bottom-4'} absolute z-50 flex items-center"
476
- style={hideButton
477
- ? 'opacity: 0; pointer-events: none;'
478
- : 'opacity: 1; pointer-events: auto;'}
471
+ : 'bottom-16 sm:bottom-4'} shadow-lg absolute z-50 flex items-center rounded-lg {hideButton
472
+ ? 'pointer-events-none opacity-0'
473
+ : ''}"
479
474
  >
480
475
  <DropdownMenu.Root>
481
- <DropdownMenu.Trigger
482
- class="h-10 w-10 shadow-lg hover:shadow-xl flex items-center justify-center rounded-lg border border-border bg-card/90 transition-all hover:bg-card active:scale-95 data-[state=open]:bg-secondary/60"
483
- title={t.toolsMenu}
484
- aria-label={t.toolsMenu}
485
- >
486
- <Settings2 class="h-5 w-5 text-card-foreground" />
476
+ <DropdownMenu.Trigger>
477
+ {#snippet child({ props })}
478
+ <Button
479
+ {...props}
480
+ variant="outline"
481
+ size="icon-lg"
482
+ title={t.toolsMenu}
483
+ aria-label={t.toolsMenu}
484
+ >
485
+ <Settings2 />
486
+ </Button>
487
+ {/snippet}
487
488
  </DropdownMenu.Trigger>
488
- <DropdownMenu.Portal>
489
- <DropdownMenu.Content
490
- sideOffset={6}
491
- align="start"
492
- class="data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 min-w-44 p-1 shadow-md z-10001 rounded-md border bg-popover text-popover-foreground"
493
- >
494
- <DropdownMenu.Item class={itemClass} onSelect={toggleProjection}>
495
- {#if projection === 'perspective'}
496
- <Square class="h-4 w-4" />
497
- {t.switchToOrthographic}
498
- {:else}
499
- <Box class="h-4 w-4" />
500
- {t.switchToPerspective}
501
- {/if}
502
- </DropdownMenu.Item>
503
-
504
- <DropdownMenu.Item class={itemClass} onSelect={() => fitToView?.()}>
505
- <Frame class="h-4 w-4" />
506
- {t.fitToView}
507
- </DropdownMenu.Item>
489
+ <!-- Above the fullscreen viewer, which sits at z-index 10000. -->
490
+ <DropdownMenu.Content sideOffset={6} class="min-w-44 z-10001 w-auto">
491
+ <DropdownMenu.Item onSelect={toggleProjection}>
492
+ {#if projection === 'perspective'}
493
+ <Square />
494
+ {t.switchToOrthographic}
495
+ {:else}
496
+ <Box />
497
+ {t.switchToPerspective}
498
+ {/if}
499
+ </DropdownMenu.Item>
500
+ <DropdownMenu.Item onSelect={() => fitToView?.()}>
501
+ <Frame />
502
+ {t.fitToView}
503
+ </DropdownMenu.Item>
504
+
505
+ <DropdownMenu.Sub>
506
+ <DropdownMenu.SubTrigger>
507
+ <Box />
508
+ {t.views}
509
+ </DropdownMenu.SubTrigger>
510
+ <DropdownMenu.SubContent class="z-10001">
511
+ {#each VIEW_PRESETS as { preset, label } (preset)}
512
+ <DropdownMenu.Item onSelect={() => setView(preset)}
513
+ >{label()}</DropdownMenu.Item
514
+ >
515
+ {/each}
516
+ </DropdownMenu.SubContent>
517
+ </DropdownMenu.Sub>
508
518
 
519
+ {#if config.showDisplayMenu}
509
520
  <DropdownMenu.Sub>
510
- <DropdownMenu.SubTrigger class="{itemClass} data-[state=open]:bg-muted">
511
- <Box class="h-4 w-4" />
512
- <span class="flex-1">{t.views}</span>
513
- <ChevronRight class="h-4 w-4 text-muted-foreground" />
521
+ <DropdownMenu.SubTrigger>
522
+ <Palette />
523
+ {t.display}
514
524
  </DropdownMenu.SubTrigger>
515
- <DropdownMenu.SubContent
516
- sideOffset={4}
517
- class="min-w-32 p-1 shadow-md z-10001 rounded-md border bg-popover text-popover-foreground"
518
- >
519
- {#each VIEW_PRESETS as { preset, label } (preset)}
520
- <DropdownMenu.Item
521
- class="px-2 py-1.5 text-sm flex cursor-pointer items-center rounded-sm transition-colors outline-none select-none hover:bg-muted focus:bg-muted"
522
- onSelect={() => setView(preset)}
523
- >
524
- {label()}
525
- </DropdownMenu.Item>
526
- {/each}
527
- </DropdownMenu.SubContent>
528
- </DropdownMenu.Sub>
529
-
530
- {#if config.showDisplayMenu}
531
- <DropdownMenu.Sub>
532
- <DropdownMenu.SubTrigger class="{itemClass} data-[state=open]:bg-muted">
533
- <Palette class="h-4 w-4" />
534
- <span class="flex-1">{t.display}</span>
535
- <ChevronRight class="h-4 w-4 text-muted-foreground" />
536
- </DropdownMenu.SubTrigger>
537
- <DropdownMenu.SubContent
538
- sideOffset={4}
539
- class="min-w-40 p-1 shadow-md z-10001 rounded-md border bg-popover text-popover-foreground"
525
+ <DropdownMenu.SubContent class="min-w-40 z-10001">
526
+ <DropdownMenu.RadioGroup
527
+ value={renderStyle}
528
+ onValueChange={(look) => setRenderStyle(look as typeof renderStyle)}
540
529
  >
541
530
  {#each STYLE_OPTIONS as { look, label } (look)}
542
- <DropdownMenu.Item
543
- closeOnSelect={false}
544
- class="{itemClass} {renderStyle === look ? 'text-primary' : ''}"
545
- onSelect={() => setRenderStyle(look)}
546
- >
547
- <span class="flex-1">{label}</span>
548
- {#if renderStyle === look}
549
- <Check class="h-4 w-4" />
550
- {/if}
551
- </DropdownMenu.Item>
531
+ <DropdownMenu.RadioItem value={look} closeOnSelect={false}>
532
+ {label}
533
+ </DropdownMenu.RadioItem>
552
534
  {/each}
553
-
554
- <DropdownMenu.Separator class="my-1 h-px bg-border" />
555
-
556
- <DropdownMenu.Item
557
- closeOnSelect={false}
558
- class="{itemClass} {edgesVisible ? 'text-primary' : ''}"
559
- onSelect={toggleEdges}
560
- >
561
- <Spline class="h-4 w-4" />
562
- <span class="flex-1">{t.edges}</span>
563
- {#if edgesVisible}
564
- <Check class="h-4 w-4" />
565
- {/if}
566
- </DropdownMenu.Item>
567
- </DropdownMenu.SubContent>
568
- </DropdownMenu.Sub>
569
- {/if}
570
-
571
- <DropdownMenu.Item
572
- closeOnSelect={false}
573
- class="{itemClass} {measureActive ? 'text-primary' : ''}"
574
- onSelect={toggleMeasure}
535
+ </DropdownMenu.RadioGroup>
536
+ <DropdownMenu.Separator />
537
+ <DropdownMenu.CheckboxItem
538
+ checked={edgesVisible}
539
+ onCheckedChange={toggleEdges}
540
+ >
541
+ <Spline />
542
+ {t.edges}
543
+ </DropdownMenu.CheckboxItem>
544
+ </DropdownMenu.SubContent>
545
+ </DropdownMenu.Sub>
546
+ {/if}
547
+
548
+ <DropdownMenu.CheckboxItem checked={measureActive} onCheckedChange={toggleMeasure}>
549
+ <Ruler />
550
+ {t.measure}
551
+ </DropdownMenu.CheckboxItem>
552
+
553
+ {#if config.showGridToggle}
554
+ <DropdownMenu.CheckboxItem checked={gridVisible} onCheckedChange={toggleGrid}>
555
+ <Grid3x3 />
556
+ {t.grid}
557
+ </DropdownMenu.CheckboxItem>
558
+ {/if}
559
+
560
+ {#if config.showSceneManager || config.showScreenshotButton || config.showFullscreenButton}
561
+ <DropdownMenu.Separator />
562
+ {/if}
563
+
564
+ {#if config.showSceneManager}
565
+ <DropdownMenu.CheckboxItem
566
+ checked={sceneManagerOpen}
567
+ onCheckedChange={() => (sceneManagerOpen = !sceneManagerOpen)}
575
568
  >
576
- <Ruler class="h-4 w-4" />
577
- <span class="flex-1">{t.measure}</span>
578
- {#if measureActive}
579
- <Check class="h-4 w-4" />
580
- {/if}
569
+ <Layers />
570
+ {t.sceneManager}
571
+ </DropdownMenu.CheckboxItem>
572
+ {/if}
573
+
574
+ {#if config.showScreenshotButton}
575
+ <DropdownMenu.Item onSelect={downloadScreenshot}>
576
+ <Camera />
577
+ {t.screenshot}
581
578
  </DropdownMenu.Item>
579
+ {/if}
582
580
 
583
- {#if config.showGridToggle}
584
- <DropdownMenu.Item
585
- closeOnSelect={false}
586
- class="{itemClass} {gridVisible ? 'text-primary' : ''}"
587
- onSelect={toggleGrid}
588
- >
589
- <Grid3x3 class="h-4 w-4" />
590
- <span class="flex-1">{t.grid}</span>
591
- {#if gridVisible}
592
- <Check class="h-4 w-4" />
593
- {/if}
594
- </DropdownMenu.Item>
595
- {/if}
596
-
597
- {#if config.showSceneManager || config.showScreenshotButton || config.showFullscreenButton}
598
- <DropdownMenu.Separator class="my-1 h-px bg-border" />
599
- {/if}
600
-
601
- {#if config.showSceneManager}
602
- <DropdownMenu.Item
603
- closeOnSelect={false}
604
- class="{itemClass} {sceneManagerOpen ? 'text-primary' : ''}"
605
- onSelect={() => (sceneManagerOpen = !sceneManagerOpen)}
606
- >
607
- <Layers class="h-4 w-4" />
608
- <span class="flex-1">{t.sceneManager}</span>
609
- {#if sceneManagerOpen}
610
- <Check class="h-4 w-4" />
611
- {/if}
612
- </DropdownMenu.Item>
613
- {/if}
614
-
615
- {#if config.showScreenshotButton}
616
- <DropdownMenu.Item class={itemClass} onSelect={downloadScreenshot}>
617
- <Camera class="h-4 w-4" />
618
- {t.screenshot}
619
- </DropdownMenu.Item>
620
- {/if}
621
-
622
- {#if config.showFullscreenButton}
623
- <DropdownMenu.Item class={itemClass} onSelect={toggleFullscreen}>
624
- {#if isFullscreen}
625
- <Minimize class="h-4 w-4" />
626
- {t.exitFullscreen}
627
- {:else}
628
- <Maximize class="h-4 w-4" />
629
- {t.fullscreen}
630
- {/if}
631
- </DropdownMenu.Item>
632
- {/if}
633
- </DropdownMenu.Content>
634
- </DropdownMenu.Portal>
581
+ {#if config.showFullscreenButton}
582
+ <DropdownMenu.Item onSelect={toggleFullscreen}>
583
+ {#if isFullscreen}
584
+ <Minimize />
585
+ {t.exitFullscreen}
586
+ {:else}
587
+ <Maximize />
588
+ {t.fullscreen}
589
+ {/if}
590
+ </DropdownMenu.Item>
591
+ {/if}
592
+ </DropdownMenu.Content>
635
593
  </DropdownMenu.Root>
636
594
  </div>
637
595
  {/if}
@@ -699,13 +657,4 @@
699
657
  backdrop-filter: blur(0px);
700
658
  }
701
659
  }
702
-
703
- @keyframes selva-viewer-fade-in {
704
- from {
705
- opacity: 0;
706
- }
707
- to {
708
- opacity: 1;
709
- }
710
- }
711
660
  </style>
@@ -47,6 +47,8 @@ export interface ViewerMessages {
47
47
  solveSolving: string;
48
48
  parametersTab: string;
49
49
  moreTab: string;
50
+ scrollTabsBack: string;
51
+ scrollTabsForward: string;
50
52
  expandPanel: string;
51
53
  collapsePanel: string;
52
54
  /** `{side}` is replaced with `panelSideLeft` / `panelSideRight`. */
@@ -52,6 +52,8 @@ const en = {
52
52
  solveSolving: 'Solving…',
53
53
  parametersTab: 'Parameters',
54
54
  moreTab: 'More',
55
+ scrollTabsBack: 'Previous tabs',
56
+ scrollTabsForward: 'More tabs',
55
57
  expandPanel: 'Expand panel',
56
58
  collapsePanel: 'Collapse panel',
57
59
  expandSidePanel: 'Expand {side} panel',
@@ -112,6 +114,8 @@ const de = {
112
114
  solveSolving: 'Berechnung läuft…',
113
115
  parametersTab: 'Parameter',
114
116
  moreTab: 'Mehr',
117
+ scrollTabsBack: 'Vorherige Tabs',
118
+ scrollTabsForward: 'Weitere Tabs',
115
119
  expandPanel: 'Bereich aufklappen',
116
120
  collapsePanel: 'Bereich zuklappen',
117
121
  expandSidePanel: '{side} Bereich aufklappen',
@@ -20,6 +20,7 @@
20
20
  --accent: oklch(0.93 0 0);
21
21
  --accent-foreground: oklch(0.3 0 0);
22
22
  --destructive: oklch(0.6 0.18 27);
23
+ --destructive-foreground: oklch(0.985 0 0);
23
24
  --border: oklch(0.86 0 0);
24
25
  --input: oklch(0.91 0 0);
25
26
  --ring: oklch(0.67 0 0);
@@ -44,6 +45,8 @@
44
45
  --sidebar-ring: oklch(0.67 0 0);
45
46
  --inputparam: oklch(1 0 0);
46
47
  --outputparam: oklch(1 0 0);
48
+ /* Scrim behind modal dialogs and drawers. */
49
+ --overlay: oklch(0 0 0 / 50%);
47
50
  }
48
51
 
49
52
  .dark {
@@ -62,6 +65,7 @@
62
65
  --accent: oklch(0.36 0 0);
63
66
  --accent-foreground: oklch(0.92 0 0);
64
67
  --destructive: oklch(0.7 0.17 22);
68
+ --destructive-foreground: oklch(0.985 0 0);
65
69
  --border: oklch(1 0 0 / 14%);
66
70
  --input: oklch(1 0 0 / 12%);
67
71
  --ring: oklch(0.74 0 0);
@@ -108,6 +112,8 @@
108
112
  --color-accent: var(--accent);
109
113
  --color-accent-foreground: var(--accent-foreground);
110
114
  --color-destructive: var(--destructive);
115
+ --color-destructive-foreground: var(--destructive-foreground);
116
+ --color-overlay: var(--overlay);
111
117
  --color-border: var(--border);
112
118
  --color-input: var(--input);
113
119
  --color-ring: var(--ring);
@@ -134,6 +140,43 @@
134
140
  --color-outputparam: var(--outputparam);
135
141
  }
136
142
 
143
+ /* Design tokens beyond Tailwind's defaults. Reach for these before an arbitrary value: the
144
+ design-system lint rejects `text-[10px]`, `max-h-[85dvh]` and the like. */
145
+ @theme {
146
+ /* Type tags, counters and other dense labels. */
147
+ --text-2xs: 0.625rem;
148
+ --text-2xs--line-height: calc(0.875 / 0.625);
149
+ /* Bottom sheets cast their shadow upward. */
150
+ --shadow-sheet: 0 -4px 24px oklch(0 0 0 / 12%);
151
+ /* Width of anything that must keep a 1rem gutter on each side of the viewport. */
152
+ --container-screen-inset: calc(100% - 2rem);
153
+ }
154
+
155
+ @utility max-h-dialog {
156
+ max-height: 85dvh;
157
+ }
158
+
159
+ @utility no-scrollbar {
160
+ scrollbar-width: none;
161
+ &::-webkit-scrollbar {
162
+ display: none;
163
+ }
164
+ }
165
+
166
+ /* Number fields whose value is set elsewhere (a slider, a stepper) drop the browser's spinner. */
167
+ @utility no-spinner {
168
+ appearance: textfield;
169
+ &::-webkit-inner-spin-button,
170
+ &::-webkit-outer-spin-button {
171
+ appearance: none;
172
+ margin: 0;
173
+ }
174
+ }
175
+
176
+ @utility rounded-inherit {
177
+ border-radius: inherit;
178
+ }
179
+
137
180
  @layer base {
138
181
  * {
139
182
  @apply border-border outline-ring/50;