@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selvajs/ui",
3
- "version": "6.5.1-beta.0",
3
+ "version": "6.6.0-beta.2",
4
4
  "description": "Shared UI components and utilities for Selva applications",
5
5
  "license": "MIT",
6
6
  "author": "VektorNode",
@@ -54,15 +54,15 @@
54
54
  "**/*.css"
55
55
  ],
56
56
  "peerDependencies": {
57
- "@sveltejs/kit": "^2",
57
+ "@sveltejs/kit": "^2 || ^3",
58
58
  "bits-ui": "^2.18.0",
59
59
  "svelte": "^5",
60
60
  "tailwind-variants": "^3.3.1",
61
61
  "three": "^0.186.1",
62
62
  "@selvajs/compute": "^4.2.1",
63
63
  "@selvajs/schemas": "^5.2.0",
64
- "@selvajs/solve": "^1.2.3-beta.0",
65
- "@selvajs/visualization": "^1.5.0"
64
+ "@selvajs/visualization": "^1.5.0",
65
+ "@selvajs/solve": "^1.2.3-beta.0"
66
66
  },
67
67
  "peerDependenciesMeta": {
68
68
  "three": {
@@ -90,11 +90,11 @@
90
90
  "svelte": "5.57.1",
91
91
  "tailwind-variants": "^3.3.1",
92
92
  "vitest": "^5.0.2",
93
- "@selvajs/compute": "4.2.1",
94
- "@selvajs/config": "0.0.4",
95
- "@selvajs/schemas": "5.2.0",
96
93
  "@selvajs/visualization": "1.5.0",
97
- "@selvajs/solve": "1.2.3-beta.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"
98
98
  },
99
99
  "scripts": {
100
100
  "predev": "node ../../scripts/sync-shared-assets.js",
@@ -38,20 +38,12 @@
38
38
  <AlertDialog.Header>
39
39
  <AlertDialog.Title>{title}</AlertDialog.Title>
40
40
  {#if description}
41
- <AlertDialog.Description class={variant === 'destructive' ? 'text-destructive' : undefined}>
42
- {description}
43
- </AlertDialog.Description>
41
+ <AlertDialog.Description>{description}</AlertDialog.Description>
44
42
  {/if}
45
43
  </AlertDialog.Header>
46
44
  <AlertDialog.Footer>
47
45
  <AlertDialog.Cancel disabled={pending}>{cancelLabel}</AlertDialog.Cancel>
48
- <AlertDialog.Action
49
- onclick={handleConfirm}
50
- disabled={pending}
51
- class={variant === 'destructive'
52
- ? 'text-destructive-foreground bg-destructive hover:bg-destructive/90'
53
- : undefined}
54
- >
46
+ <AlertDialog.Action onclick={handleConfirm} disabled={pending} {variant}>
55
47
  {pending ? (pendingLabel ?? confirmLabel) : confirmLabel}
56
48
  </AlertDialog.Action>
57
49
  </AlertDialog.Footer>
@@ -2,6 +2,7 @@
2
2
  import { AlertCircle } from '@lucide/svelte';
3
3
  import * as Card from './primitives/card/index.js';
4
4
  import { Button } from './primitives/button/index.js';
5
+ import Callout from './primitives/Callout.svelte';
5
6
 
6
7
  interface Props {
7
8
  status?: number;
@@ -15,39 +16,28 @@
15
16
 
16
17
  <div class="p-4 flex min-h-screen items-center justify-center bg-background">
17
18
  <Card.Root class="max-w-md w-full">
18
- <Card.Header class="text-center">
19
- <div class="mb-4 flex justify-center">
19
+ <Card.Header>
20
+ <div class="gap-4 flex flex-col items-center text-center">
20
21
  <div class="p-3 rounded-full bg-destructive/10">
21
- <AlertCircle class="h-8 w-8 text-destructive" />
22
+ <AlertCircle class="size-8 text-destructive" />
22
23
  </div>
24
+ <h1 class="text-3xl font-semibold">{status}</h1>
23
25
  </div>
24
- <Card.Title class="text-3xl">{status}</Card.Title>
25
26
  </Card.Header>
26
- <Card.Content class="space-y-4">
27
- <div class="p-4 rounded-lg border border-destructive/50 bg-destructive/10">
28
- <div class="gap-3 flex">
29
- <AlertCircle class="mt-0.5 h-4 w-4 shrink-0 text-destructive" />
30
- <div class="flex-1">
31
- <p class="text-sm font-semibold text-destructive">Error</p>
32
- {#if message}
33
- <p class="text-sm text-destructive/80">{message}</p>
34
- {/if}
35
- </div>
36
- </div>
37
- </div>
38
-
39
- {#if details}
40
- <div class="p-4 rounded-lg bg-muted">
41
- <p class="font-mono text-sm break-all text-muted-foreground">
27
+ <Card.Content>
28
+ <div class="gap-4 flex flex-col">
29
+ <Callout tone="danger" title="Error">
30
+ {#if message}{message}{/if}
31
+ </Callout>
32
+ {#if details}
33
+ <p class="p-4 font-mono text-sm rounded-lg bg-muted break-all text-muted-foreground">
42
34
  {details}
43
35
  </p>
44
- </div>
45
- {/if}
36
+ {/if}
37
+ </div>
46
38
  </Card.Content>
47
- <Card.Footer class="gap-2 flex">
48
- <Button variant="outline" class="flex-1">
49
- <a href={homeLink} class="w-full" rel="external">Go Home</a>
50
- </Button>
39
+ <Card.Footer>
40
+ <Button variant="outline" href={homeLink} rel="external" class="w-full">Go Home</Button>
51
41
  </Card.Footer>
52
42
  </Card.Root>
53
43
  </div>
@@ -162,8 +162,8 @@
162
162
  <TabLayout {schema} {values} {onValueChange} {panelFilter} {requestedTabId} />
163
163
  {/if}
164
164
  {#if showParameterStateManager || (!isMobile && showCalculateButton && schema.instanceSolve === false)}
165
- <div class="panel-footer px-3">
166
- <div class="gap-2 flex flex-wrap items-center justify-center">
165
+ <div class="panel-footer px-1">
166
+ <div class="gap-2 flex flex-wrap items-center [&>button]:flex-1">
167
167
  {#if showParameterStateManager}
168
168
  <ParameterPresetManager
169
169
  {schema}
@@ -226,10 +226,9 @@
226
226
  </div>
227
227
 
228
228
  <div
229
- class="drawer-container"
229
+ class="drawer-container rounded-t-2xl z-40 border-t bg-background shadow-sheet"
230
230
  class:drawer-open={drawerOpen}
231
231
  class:drawer-closed={!drawerOpen}
232
- style="z-index: 40;"
233
232
  >
234
233
  <button
235
234
  class="drawer-handle-bar"
@@ -363,7 +362,7 @@
363
362
  </Resizable.Pane>
364
363
  <Resizable.Handle
365
364
  withHandle
366
- class="bg-transparent"
365
+ line={false}
367
366
  data-collapsed={leftCollapsed}
368
367
  onclick={() => {
369
368
  if (leftCollapsed) leftPaneRef?.expand();
@@ -390,7 +389,7 @@
390
389
  {#if hasRightPanel}
391
390
  <Resizable.Handle
392
391
  withHandle
393
- class="bg-transparent"
392
+ line={false}
394
393
  data-collapsed={rightCollapsed}
395
394
  onclick={() => {
396
395
  if (rightCollapsed) rightPaneRef?.expand();
@@ -460,8 +459,8 @@
460
459
 
461
460
  .panel-footer {
462
461
  flex-shrink: 0;
463
- padding-top: 1.5rem;
464
- padding-bottom: 1rem;
462
+ padding-top: 0.75rem;
463
+ padding-bottom: 0.5rem;
465
464
  display: flex;
466
465
  flex-direction: column;
467
466
  gap: 0.5rem;
@@ -472,13 +471,8 @@
472
471
  bottom: 0;
473
472
  left: 0;
474
473
  right: 0;
475
- z-index: 100;
476
474
  display: flex;
477
475
  flex-direction: column;
478
- border-radius: 1rem 1rem 0 0;
479
- background: var(--background);
480
- border-top: 1px solid var(--border);
481
- box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.12);
482
476
  transition: height 0.35s cubic-bezier(0.32, 0.72, 0, 1);
483
477
  overflow: hidden;
484
478
  }
@@ -217,14 +217,14 @@
217
217
 
218
218
  let resolvedIsEmbedded = $derived(isEmbedded ?? page.url.searchParams.get('embed') === 'true');
219
219
  let resolvedPrimaryColor = $derived(primaryColor ?? page.url.searchParams.get('primary'));
220
- let customStyle = $derived(
221
- resolvedPrimaryColor ? `--primary: ${hexToOklch(resolvedPrimaryColor)}` : ''
220
+ let primaryOverride = $derived(
221
+ resolvedPrimaryColor ? hexToOklch(resolvedPrimaryColor) : undefined
222
222
  );
223
223
 
224
224
  let pageTitle = $derived(title ?? (schema?.description || schema.name));
225
225
  </script>
226
226
 
227
- <div style={customStyle} style:display="contents">
227
+ <div class="contents" style:--primary={primaryOverride}>
228
228
  <AppShell
229
229
  mode="fixed"
230
230
  showHeader={!resolvedIsEmbedded}
@@ -3,14 +3,13 @@
3
3
  //
4
4
  // The counterpart to `SolveMessages`, which interrupts only for what the definition's author
5
5
  // wrote. Everything else — Grasshopper complaining about its own components — lands here,
6
- // where it is available without being in the way. One section per level, most severe first, with the
7
- // component that raised each message shown as a label rather than spliced into its text.
6
+ // where it is available without being in the way. Most severe first, with the component that
7
+ // raised each message on its own line rather than spliced into its text.
8
8
 
9
9
  import type { Snippet } from 'svelte';
10
- import { CircleAlert, TriangleAlert, Info } from '@lucide/svelte';
11
10
  import type { SolveDiagnostic } from '@selvajs/solve/shared';
12
11
  import * as Dialog from '$lib/components/primitives/dialog';
13
- import { Badge } from '$lib/components/primitives/badge';
12
+ import IssueList, { type Issue } from '$lib/components/primitives/IssueList.svelte';
14
13
 
15
14
  interface Props {
16
15
  /** The last solve's messages. Preferred over `errors`/`warnings` when both are given. */
@@ -42,32 +41,24 @@
42
41
  count: number;
43
42
  }
44
43
 
45
- // Tone classes are written out, never interpolated: Tailwind scans source text, so a
46
- // constructed class name is not emitted and the icon would render colourless.
47
44
  const LEVELS = [
48
45
  {
49
46
  level: 'error',
50
- heading: 'Errors',
47
+ severity: 'error',
51
48
  one: 'error',
52
- many: 'errors',
53
- icon: CircleAlert,
54
- tone: 'text-destructive'
49
+ many: 'errors'
55
50
  },
56
51
  {
57
52
  level: 'warning',
58
- heading: 'Warnings',
53
+ severity: 'warning',
59
54
  one: 'warning',
60
- many: 'warnings',
61
- icon: TriangleAlert,
62
- tone: 'text-amber-500'
55
+ many: 'warnings'
63
56
  },
64
57
  {
65
58
  level: 'remark',
66
- heading: 'Notes',
59
+ severity: 'note',
67
60
  one: 'note',
68
- many: 'notes',
69
- icon: Info,
70
- tone: 'text-muted-foreground'
61
+ many: 'notes'
71
62
  }
72
63
  ] as const;
73
64
 
@@ -95,14 +86,25 @@
95
86
  return { ...meta, items };
96
87
  }).filter((section) => section.items.length > 0)
97
88
  );
89
+
90
+ const issues = $derived<Issue[]>(
91
+ sections.flatMap((section) =>
92
+ section.items.map((item) => ({
93
+ severity: section.severity,
94
+ message: item.message,
95
+ source: item.source,
96
+ count: item.count
97
+ }))
98
+ )
99
+ );
98
100
  </script>
99
101
 
100
102
  <Dialog.Root bind:open>
101
- <Dialog.Trigger class="focus:outline-none">
103
+ <Dialog.Trigger>
102
104
  {@render trigger()}
103
105
  </Dialog.Trigger>
104
106
 
105
- <Dialog.Content class="max-w-lg gap-4">
107
+ <Dialog.Content class="max-w-lg">
106
108
  <Dialog.Header>
107
109
  <Dialog.Title>Messages</Dialog.Title>
108
110
  <Dialog.Description>
@@ -115,34 +117,6 @@
115
117
  </Dialog.Description>
116
118
  </Dialog.Header>
117
119
 
118
- <div class="space-y-4 max-h-[60vh] overflow-y-auto">
119
- {#each sections as section (section.level)}
120
- <section>
121
- <h3 class="mb-1.5 gap-1.5 text-xs font-medium flex items-center text-muted-foreground">
122
- <section.icon class="h-3.5 w-3.5 {section.tone}" />
123
- {section.heading}
124
- </h3>
125
- <ul class="divide-y rounded-lg border">
126
- {#each section.items as item (item.message + (item.source ?? ''))}
127
- <li class="gap-3 px-3 py-2 text-sm flex items-start justify-between">
128
- <p class="min-w-0 wrap-anywhere">
129
- {item.message}
130
- {#if item.count > 1}
131
- <span class="ml-1 text-xs text-muted-foreground tabular-nums"
132
- >×{item.count}</span
133
- >
134
- {/if}
135
- </p>
136
- {#if item.source}
137
- <Badge variant="secondary" class="font-normal max-w-[40%] shrink-0 truncate">
138
- {item.source}
139
- </Badge>
140
- {/if}
141
- </li>
142
- {/each}
143
- </ul>
144
- </section>
145
- {/each}
146
- </div>
120
+ <IssueList {issues} />
147
121
  </Dialog.Content>
148
122
  </Dialog.Root>
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { Download, Upload, AlertTriangle, CheckCircle } from '@lucide/svelte';
2
+ import { Download, Upload } from '@lucide/svelte';
3
3
  import type { UISchema, ParameterPreset } from '@selvajs/schemas';
4
4
  import {
5
5
  createSavedState,
@@ -8,7 +8,7 @@
8
8
  exportStateAsJson,
9
9
  importStateFromJson
10
10
  } from '../../schema/param-exporter';
11
- import { Button, Input, Label, Textarea, Dialog, Card, toast } from '../primitives';
11
+ import { Button, Input, Label, Textarea, Dialog, Callout, IssueList, toast } from '../primitives';
12
12
 
13
13
  import type { ActionButton } from '../../types/actionButton';
14
14
  import { DEFAULT_PRESET_LABELS, type PresetLabels } from '../../types/presetLabels';
@@ -156,7 +156,7 @@
156
156
  </script>
157
157
 
158
158
  {#if showSaveButton}
159
- <Button variant="default" size="sm" onclick={openExportDialog}>
159
+ <Button variant="outline" size="sm" onclick={openExportDialog}>
160
160
  <Download class="mr-2 h-4 w-4" />
161
161
  {t.saveButton}
162
162
  </Button>
@@ -239,7 +239,7 @@
239
239
  </Dialog.Header>
240
240
 
241
241
  {#if onListStates}
242
- <div class="py-4 max-h-[60vh] overflow-y-auto">
242
+ <div class="py-4">
243
243
  {#if isLoadingList}
244
244
  <p class="text-sm py-8 text-center text-muted-foreground">…</p>
245
245
  {:else if listError}
@@ -283,7 +283,7 @@
283
283
 
284
284
  <!-- Validation Dialog -->
285
285
  <Dialog.Root bind:open={showValidationDialog}>
286
- <Dialog.Content class="max-w-2xl max-h-[80vh] overflow-y-auto">
286
+ <Dialog.Content class="max-w-2xl">
287
287
  <Dialog.Header>
288
288
  <Dialog.Title>{t.validationTitle}</Dialog.Title>
289
289
  <Dialog.Description>
@@ -296,75 +296,31 @@
296
296
  {#if loadResult}
297
297
  <div class="gap-4 py-4 grid">
298
298
  {#if loadResult.isValid}
299
- <Card.Root class="p-4 border-success/30 bg-success/5">
300
- <div class="gap-3 flex items-start">
301
- <CheckCircle class="h-5 w-5 text-success" />
302
- <div>
303
- <h4 class="text-sm font-semibold text-success-foreground">
304
- {t.validationNoIssuesTitle}
305
- </h4>
306
- <p class="text-sm mt-1 text-success-foreground/80">
307
- {t.validationNoIssuesBody}
308
- </p>
309
- </div>
310
- </div>
311
- </Card.Root>
299
+ <Callout tone="success" title={t.validationNoIssuesTitle}>
300
+ {t.validationNoIssuesBody}
301
+ </Callout>
312
302
  {:else if loadResult.canLoad}
313
- <Card.Root class="p-4 border-warning/30 bg-warning/5">
314
- <div class="gap-3 flex items-start">
315
- <AlertTriangle class="h-5 w-5 text-warning" />
316
- <div>
317
- <h4 class="text-sm font-semibold text-warning-foreground">
318
- {t.validationWarningsTitle}
319
- </h4>
320
- <p class="text-sm mt-1 text-warning-foreground/80">
321
- {t.validationWarningsBody.replace('{count}', String(loadResult.issues.length))}
322
- </p>
323
- </div>
324
- </div>
325
- </Card.Root>
303
+ <Callout tone="warning" title={t.validationWarningsTitle}>
304
+ {t.validationWarningsBody.replace('{count}', String(loadResult.issues.length))}
305
+ </Callout>
326
306
  {:else}
327
- <Card.Root class="p-4 border-destructive/30 bg-destructive/5">
328
- <div class="gap-3 flex items-start">
329
- <AlertTriangle class="h-5 w-5 text-destructive" />
330
- <div>
331
- <h4 class="text-sm font-semibold text-destructive">{t.validationErrorsTitle}</h4>
332
- <p class="text-sm mt-1 text-destructive/80">
333
- {t.validationErrorsBody}
334
- </p>
335
- </div>
336
- </div>
337
- </Card.Root>
307
+ <Callout tone="danger" title={t.validationErrorsTitle}>
308
+ {t.validationErrorsBody}
309
+ </Callout>
338
310
  {/if}
339
311
 
340
312
  {#if !loadResult.isValid}
341
- <div class="space-y-2">
313
+ <div class="gap-2 flex flex-col">
342
314
  <h4 class="text-sm font-medium">{t.validationIssuesHeading}</h4>
343
- {#each loadResult.issues as issue (issue.message)}
344
- <div
345
- class="p-3 rounded-lg border {issue.severity === 'error'
346
- ? 'border-destructive/30 bg-destructive/5'
347
- : 'border-warning/30 bg-warning/5'}"
348
- >
349
- <div class="gap-2 flex items-start">
350
- <AlertTriangle
351
- class="h-4 w-4 mt-0.5 {issue.severity === 'error'
352
- ? 'text-destructive'
353
- : 'text-warning'}"
354
- />
355
- <div class="flex-1">
356
- <p class="text-sm font-medium">{issue.message}</p>
357
- {#if issue.details}
358
- <p class="text-xs mt-1 text-muted-foreground">
359
- {t.validationExpected}
360
- {issue.details.expected} → {t.validationActual}
361
- {issue.details.actual}
362
- </p>
363
- {/if}
364
- </div>
365
- </div>
366
- </div>
367
- {/each}
315
+ <IssueList
316
+ issues={loadResult.issues.map((issue) => ({
317
+ severity: issue.severity === 'error' ? 'error' : 'warning',
318
+ message: issue.message,
319
+ detail: issue.details
320
+ ? `${t.validationExpected} ${issue.details.expected} → ${t.validationActual} ${issue.details.actual}`
321
+ : undefined
322
+ }))}
323
+ />
368
324
  </div>
369
325
  {/if}
370
326
  </div>
@@ -13,10 +13,12 @@
13
13
  // anything, so it appears on its own after the solve and fades.
14
14
 
15
15
  import { untrack } from 'svelte';
16
- import { CircleAlert, TriangleAlert, Info, LoaderCircle } from '@lucide/svelte';
16
+ import { LoaderCircle } from '@lucide/svelte';
17
17
  import type { SolveDiagnostic } from '@selvajs/solve/shared';
18
18
  import type { LiveSolveState, SolvePhase } from '@selvajs/solve/client';
19
19
  import { Button } from '$lib/components/primitives/button';
20
+ import IssueList, { type Issue } from '$lib/components/primitives/IssueList.svelte';
21
+ import SeverityIcon from '$lib/components/primitives/SeverityIcon.svelte';
20
22
 
21
23
  interface Props {
22
24
  /** What the running (or most recent) solve has said over the live channel. */
@@ -194,6 +196,15 @@
194
196
  view === 'live' ? [...live.diagnostics] : view === 'idle' ? authoredRemarks : authoredGating
195
197
  );
196
198
 
199
+ // A remark states something without asking anything, so it reads as a quiet note.
200
+ const issues = $derived<Issue[]>(
201
+ rows.map((d) => ({
202
+ severity: d.level === 'remark' ? 'note' : d.level,
203
+ message: d.message,
204
+ source: d.source
205
+ }))
206
+ );
207
+
197
208
  // Steps a few milliseconds long would swap the headline faster than it can be read. Each one
198
209
  // stays up for at least this long; steps that end sooner are skipped in the label but still
199
210
  // count in the bar. The label and its step count move together so they never disagree.
@@ -245,7 +256,7 @@
245
256
 
246
257
  {#if visible}
247
258
  <div
248
- class="bottom-4 p-3 shadow-lg fixed left-1/2 z-50 w-[min(32rem,calc(100vw-2rem))] -translate-x-1/2 rounded-lg border bg-background {view ===
259
+ class="bottom-4 p-3 shadow-lg w-lg fixed left-1/2 z-50 max-w-screen-inset -translate-x-1/2 rounded-lg border bg-background {view ===
249
260
  'blocked'
250
261
  ? 'border-destructive/50'
251
262
  : ''}"
@@ -267,8 +278,8 @@
267
278
  {/if}
268
279
  <Button
269
280
  variant="secondary"
270
- size="sm"
271
- class="-my-1 h-7 px-3 text-xs shrink-0"
281
+ size="xs"
282
+ class="-my-1 shrink-0"
272
283
  disabled={finishing}
273
284
  onclick={onabort}
274
285
  >
@@ -299,8 +310,9 @@
299
310
  ? { width: 1, ms: FINISH_MS }
300
311
  : (bars[p.source ?? ''] ?? { width: p.fraction, ms: 150 })}
301
312
  <div
302
- class="h-full rounded-full bg-primary transition-[width] ease-linear"
303
- style="width: {bar.width * 100}%; transition-duration: {bar.ms}ms"
313
+ class="h-full w-(--bar-width) rounded-full bg-primary transition-all duration-(--bar-ms) ease-linear"
314
+ style:--bar-width="{bar.width * 100}%"
315
+ style:--bar-ms="{bar.ms}ms"
304
316
  ></div>
305
317
  {:else}
306
318
  <div class="animate-pulse h-full w-1/3 rounded-full bg-primary/60"></div>
@@ -314,10 +326,10 @@
314
326
  <div class="mb-2">
315
327
  <div class="gap-2 text-sm font-medium flex items-center">
316
328
  {#if view === 'blocked'}
317
- <CircleAlert class="h-4 w-4 shrink-0 text-destructive" />
329
+ <SeverityIcon severity="error" />
318
330
  {labels.blockedTitle}
319
331
  {:else}
320
- <TriangleAlert class="h-4 w-4 text-amber-500 shrink-0" />
332
+ <SeverityIcon severity="warning" />
321
333
  {labels.messagesTitle}
322
334
  {/if}
323
335
  </div>
@@ -328,29 +340,9 @@
328
340
  {/if}
329
341
 
330
342
  {#if rows.length > 0}
331
- <ul
332
- class="max-h-40 space-y-2 text-sm overflow-y-auto {view === 'live'
333
- ? 'mt-3 pt-3 border-t'
334
- : ''}"
335
- >
336
- {#each rows as row, i (i)}
337
- <li class="gap-2 flex">
338
- {#if row.level === 'error'}
339
- <CircleAlert class="mt-0.5 h-4 w-4 shrink-0 text-destructive" />
340
- {:else if row.level === 'warning'}
341
- <TriangleAlert class="mt-0.5 h-4 w-4 text-amber-500 shrink-0" />
342
- {:else}
343
- <Info class="mt-0.5 h-4 w-4 shrink-0 text-muted-foreground" />
344
- {/if}
345
- <div class="min-w-0 flex-1">
346
- <p class="wrap-anywhere">{row.message}</p>
347
- {#if row.source}
348
- <p class="text-xs text-muted-foreground">{row.source}</p>
349
- {/if}
350
- </div>
351
- </li>
352
- {/each}
353
- </ul>
343
+ <div class="max-h-40 overflow-y-auto {view === 'live' ? 'mt-3 pt-3 border-t' : ''}">
344
+ <IssueList {issues} variant="plain" />
345
+ </div>
354
346
  {/if}
355
347
 
356
348
  {#if view === 'review' || view === 'blocked'}
@@ -40,23 +40,21 @@
40
40
  </p>
41
41
  <div class="gap-1 flex items-center">
42
42
  <Button
43
- size="sm"
43
+ size="icon-sm"
44
44
  variant="outline"
45
45
  disabled={page <= 1}
46
46
  onclick={() => (page -= 1)}
47
47
  aria-label="Previous page"
48
- class="h-8 w-8 p-0"
49
48
  >
50
49
  <ChevronLeft class="h-4 w-4" />
51
50
  </Button>
52
51
  <span class="px-2 font-mono text-xs text-muted-foreground">{page} / {pageCount}</span>
53
52
  <Button
54
- size="sm"
53
+ size="icon-sm"
55
54
  variant="outline"
56
55
  disabled={page >= pageCount}
57
56
  onclick={() => (page += 1)}
58
57
  aria-label="Next page"
59
- class="h-8 w-8 p-0"
60
58
  >
61
59
  <ChevronRight class="h-4 w-4" />
62
60
  </Button>
@@ -82,7 +82,7 @@
82
82
  {/if}
83
83
  <span class="text-sm font-medium flex-1 truncate">{item.label}</span>
84
84
  {#if item.badge !== undefined}
85
- <span class="font-mono shrink-0 text-[11px] tabular-nums opacity-60">{item.badge}</span>
85
+ <span class="font-mono shrink-0 text-2xs tabular-nums opacity-60">{item.badge}</span>
86
86
  {/if}
87
87
  </a>
88
88
  {/each}
@@ -188,11 +188,7 @@
188
188
  {:else if !figData}
189
189
  <div class="px-4 py-8 text-sm text-center text-muted-foreground">Waiting for chart data...</div>
190
190
  {:else}
191
- <div
192
- bind:this={containerEl}
193
- class="w-full"
194
- style="height: {isFullscreen ? '100vh' : '380px'};"
195
- ></div>
191
+ <div bind:this={containerEl} class="w-full {isFullscreen ? 'h-screen' : 'h-95'}"></div>
196
192
 
197
193
  <div
198
194
  class="gap-1 left-2 top-2 absolute z-10 flex items-center opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 {isFullscreen