@svadmin/ui 0.29.3 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/dist/README.md +18 -0
  2. package/dist/actions.d.ts +35 -0
  3. package/dist/actions.js +84 -0
  4. package/dist/app.css +673 -0
  5. package/dist/component-registry.svelte.d.ts +36 -0
  6. package/dist/component-registry.svelte.js +20 -0
  7. package/dist/components/AICommandBar.svelte +180 -0
  8. package/dist/components/AICommandBar.svelte.d.ts +6 -0
  9. package/dist/components/AboutSettings.svelte +106 -0
  10. package/dist/components/AboutSettings.svelte.d.ts +18 -0
  11. package/dist/components/AdminApp.svelte +205 -0
  12. package/dist/components/AdminApp.svelte.d.ts +28 -0
  13. package/dist/components/AnimatedCounter.svelte +46 -0
  14. package/dist/components/AnimatedCounter.svelte.d.ts +11 -0
  15. package/dist/components/AnomalyBadge.svelte +65 -0
  16. package/dist/components/AnomalyBadge.svelte.d.ts +16 -0
  17. package/dist/components/AppearanceSettings.svelte +183 -0
  18. package/dist/components/AppearanceSettings.svelte.d.ts +3 -0
  19. package/dist/components/AuditLogDrawer.svelte +93 -0
  20. package/dist/components/AuditLogDrawer.svelte.d.ts +8 -0
  21. package/dist/components/AuditLogViewer.svelte +226 -0
  22. package/dist/components/AuditLogViewer.svelte.d.ts +3 -0
  23. package/dist/components/Authenticated.svelte +51 -0
  24. package/dist/components/Authenticated.svelte.d.ts +11 -0
  25. package/dist/components/AutoForm.svelte +244 -0
  26. package/dist/components/AutoForm.svelte.d.ts +20 -0
  27. package/dist/components/AutoSaveIndicator.svelte +35 -0
  28. package/dist/components/AutoSaveIndicator.svelte.d.ts +9 -0
  29. package/dist/components/AutoTable.svelte +839 -0
  30. package/dist/components/AutoTable.svelte.d.ts +44 -0
  31. package/dist/components/Breadcrumbs.svelte +58 -0
  32. package/dist/components/Breadcrumbs.svelte.d.ts +3 -0
  33. package/dist/components/CanAccess.svelte +23 -0
  34. package/dist/components/CanAccess.svelte.d.ts +12 -0
  35. package/dist/components/CatchAllNavigate.svelte +21 -0
  36. package/dist/components/CatchAllNavigate.svelte.d.ts +3 -0
  37. package/dist/components/ChatDialog.svelte +535 -0
  38. package/dist/components/ChatDialog.svelte.d.ts +14 -0
  39. package/dist/components/ComboboxField.svelte +129 -0
  40. package/dist/components/ComboboxField.svelte.d.ts +17 -0
  41. package/dist/components/CommandPalette.svelte +135 -0
  42. package/dist/components/CommandPalette.svelte.d.ts +8 -0
  43. package/dist/components/ConfigErrorScreen.svelte +126 -0
  44. package/dist/components/ConfigErrorScreen.svelte.d.ts +11 -0
  45. package/dist/components/ConfirmDialog.svelte +53 -0
  46. package/dist/components/ConfirmDialog.svelte.d.ts +13 -0
  47. package/dist/components/CopilotPanel.svelte +163 -0
  48. package/dist/components/CopilotPanel.svelte.d.ts +6 -0
  49. package/dist/components/CreatePage.svelte +39 -0
  50. package/dist/components/CreatePage.svelte.d.ts +10 -0
  51. package/dist/components/DevTools.svelte +149 -0
  52. package/dist/components/DevTools.svelte.d.ts +3 -0
  53. package/dist/components/DraggableGrid.svelte +86 -0
  54. package/dist/components/DraggableGrid.svelte.d.ts +17 -0
  55. package/dist/components/DraggableHeader.svelte +112 -0
  56. package/dist/components/DraggableHeader.svelte.d.ts +25 -0
  57. package/dist/components/DrawerForm.svelte +35 -0
  58. package/dist/components/DrawerForm.svelte.d.ts +11 -0
  59. package/dist/components/EditPage.svelte +52 -0
  60. package/dist/components/EditPage.svelte.d.ts +12 -0
  61. package/dist/components/EmptyState.svelte +31 -0
  62. package/dist/components/EmptyState.svelte.d.ts +8 -0
  63. package/dist/components/ErrorBoundary.svelte +49 -0
  64. package/dist/components/ErrorBoundary.svelte.d.ts +12 -0
  65. package/dist/components/ErrorComponent.svelte +36 -0
  66. package/dist/components/ErrorComponent.svelte.d.ts +9 -0
  67. package/dist/components/FieldRenderer.svelte +357 -0
  68. package/dist/components/FieldRenderer.svelte.d.ts +13 -0
  69. package/dist/components/ForgotPasswordPage.svelte +112 -0
  70. package/dist/components/ForgotPasswordPage.svelte.d.ts +6 -0
  71. package/dist/components/Header.svelte +94 -0
  72. package/dist/components/Header.svelte.d.ts +12 -0
  73. package/dist/components/InferencerPanel.svelte +192 -0
  74. package/dist/components/InferencerPanel.svelte.d.ts +3 -0
  75. package/dist/components/InfiniteList.svelte +93 -0
  76. package/dist/components/InfiniteList.svelte.d.ts +20 -0
  77. package/dist/components/InlineEdit.svelte +88 -0
  78. package/dist/components/InlineEdit.svelte.d.ts +12 -0
  79. package/dist/components/InsightCard.svelte +98 -0
  80. package/dist/components/InsightCard.svelte.d.ts +11 -0
  81. package/dist/components/KeyboardShortcuts.svelte +61 -0
  82. package/dist/components/KeyboardShortcuts.svelte.d.ts +6 -0
  83. package/dist/components/Layout.svelte +167 -0
  84. package/dist/components/Layout.svelte.d.ts +12 -0
  85. package/dist/components/ListPage.svelte +71 -0
  86. package/dist/components/ListPage.svelte.d.ts +32 -0
  87. package/dist/components/LiveIndicator.svelte +58 -0
  88. package/dist/components/LiveIndicator.svelte.d.ts +12 -0
  89. package/dist/components/LoginPage.svelte +163 -0
  90. package/dist/components/LoginPage.svelte.d.ts +28 -0
  91. package/dist/components/MarkdownRenderer.svelte +127 -0
  92. package/dist/components/MarkdownRenderer.svelte.d.ts +11 -0
  93. package/dist/components/ModalForm.svelte +38 -0
  94. package/dist/components/ModalForm.svelte.d.ts +10 -0
  95. package/dist/components/NavigateToResource.svelte +20 -0
  96. package/dist/components/NavigateToResource.svelte.d.ts +3 -0
  97. package/dist/components/PageHeader.svelte +39 -0
  98. package/dist/components/PageHeader.svelte.d.ts +11 -0
  99. package/dist/components/PageSkeleton.svelte +71 -0
  100. package/dist/components/PageSkeleton.svelte.d.ts +7 -0
  101. package/dist/components/PasswordInput.svelte +96 -0
  102. package/dist/components/PasswordInput.svelte.d.ts +12 -0
  103. package/dist/components/PermissionMatrix.svelte +185 -0
  104. package/dist/components/PermissionMatrix.svelte.d.ts +19 -0
  105. package/dist/components/ProfilePage.svelte +284 -0
  106. package/dist/components/ProfilePage.svelte.d.ts +3 -0
  107. package/dist/components/RegisterPage.svelte +112 -0
  108. package/dist/components/RegisterPage.svelte.d.ts +7 -0
  109. package/dist/components/RolesSettings.svelte +146 -0
  110. package/dist/components/RolesSettings.svelte.d.ts +3 -0
  111. package/dist/components/SettingsPage.svelte +113 -0
  112. package/dist/components/SettingsPage.svelte.d.ts +3 -0
  113. package/dist/components/ShowPage.svelte +73 -0
  114. package/dist/components/ShowPage.svelte.d.ts +7 -0
  115. package/dist/components/Sidebar.svelte +417 -0
  116. package/dist/components/Sidebar.svelte.d.ts +14 -0
  117. package/dist/components/SidebarItem.svelte +129 -0
  118. package/dist/components/SidebarItem.svelte.d.ts +11 -0
  119. package/dist/components/SmartSuggest.svelte +158 -0
  120. package/dist/components/SmartSuggest.svelte.d.ts +19 -0
  121. package/dist/components/StatsCard.svelte +79 -0
  122. package/dist/components/StatsCard.svelte.d.ts +23 -0
  123. package/dist/components/StepsForm.svelte +194 -0
  124. package/dist/components/StepsForm.svelte.d.ts +13 -0
  125. package/dist/components/TaskQueueDrawer.svelte +158 -0
  126. package/dist/components/TaskQueueDrawer.svelte.d.ts +11 -0
  127. package/dist/components/TenantSwitcher.svelte +84 -0
  128. package/dist/components/TenantSwitcher.svelte.d.ts +12 -0
  129. package/dist/components/ThemedTitle.svelte +32 -0
  130. package/dist/components/ThemedTitle.svelte.d.ts +9 -0
  131. package/dist/components/Toast.svelte +46 -0
  132. package/dist/components/Toast.svelte.d.ts +3 -0
  133. package/dist/components/TooltipButton.svelte +42 -0
  134. package/dist/components/TooltipButton.svelte.d.ts +14 -0
  135. package/dist/components/UndoableNotification.svelte +69 -0
  136. package/dist/components/UndoableNotification.svelte.d.ts +9 -0
  137. package/dist/components/UpdatePasswordPage.svelte +89 -0
  138. package/dist/components/UpdatePasswordPage.svelte.d.ts +6 -0
  139. package/dist/components/VirtualTable.svelte +76 -0
  140. package/dist/components/VirtualTable.svelte.d.ts +27 -0
  141. package/dist/components/VoiceInput.svelte +120 -0
  142. package/dist/components/VoiceInput.svelte.d.ts +15 -0
  143. package/dist/components/buttons/CloneButton.svelte +30 -0
  144. package/dist/components/buttons/CloneButton.svelte.d.ts +13 -0
  145. package/dist/components/buttons/CreateButton.svelte +29 -0
  146. package/dist/components/buttons/CreateButton.svelte.d.ts +12 -0
  147. package/dist/components/buttons/DeleteButton.svelte +59 -0
  148. package/dist/components/buttons/DeleteButton.svelte.d.ts +15 -0
  149. package/dist/components/buttons/EditButton.svelte +30 -0
  150. package/dist/components/buttons/EditButton.svelte.d.ts +13 -0
  151. package/dist/components/buttons/ExportButton.svelte +30 -0
  152. package/dist/components/buttons/ExportButton.svelte.d.ts +12 -0
  153. package/dist/components/buttons/ImportButton.svelte +56 -0
  154. package/dist/components/buttons/ImportButton.svelte.d.ts +19 -0
  155. package/dist/components/buttons/ListButton.svelte +23 -0
  156. package/dist/components/buttons/ListButton.svelte.d.ts +8 -0
  157. package/dist/components/buttons/RefreshButton.svelte +36 -0
  158. package/dist/components/buttons/RefreshButton.svelte.d.ts +8 -0
  159. package/dist/components/buttons/SaveButton.svelte +27 -0
  160. package/dist/components/buttons/SaveButton.svelte.d.ts +9 -0
  161. package/dist/components/buttons/ShowButton.svelte +31 -0
  162. package/dist/components/buttons/ShowButton.svelte.d.ts +13 -0
  163. package/dist/components/buttons/index.d.ts +10 -0
  164. package/dist/components/buttons/index.js +10 -0
  165. package/dist/components/charts/BarChart.svelte +69 -0
  166. package/dist/components/charts/BarChart.svelte.d.ts +15 -0
  167. package/dist/components/charts/LineChart.svelte +115 -0
  168. package/dist/components/charts/LineChart.svelte.d.ts +17 -0
  169. package/dist/components/charts/PieChart.svelte +95 -0
  170. package/dist/components/charts/PieChart.svelte.d.ts +15 -0
  171. package/dist/components/charts/index.d.ts +3 -0
  172. package/dist/components/charts/index.js +3 -0
  173. package/dist/components/fieldComponentMap.d.ts +24 -0
  174. package/dist/components/fieldComponentMap.js +65 -0
  175. package/dist/components/fields/ArrayField.svelte +86 -0
  176. package/dist/components/fields/ArrayField.svelte.d.ts +9 -0
  177. package/dist/components/fields/BooleanField.svelte +13 -0
  178. package/dist/components/fields/BooleanField.svelte.d.ts +8 -0
  179. package/dist/components/fields/DateField.svelte +6 -0
  180. package/dist/components/fields/DateField.svelte.d.ts +8 -0
  181. package/dist/components/fields/EmailField.svelte +9 -0
  182. package/dist/components/fields/EmailField.svelte.d.ts +6 -0
  183. package/dist/components/fields/FileField.svelte +14 -0
  184. package/dist/components/fields/FileField.svelte.d.ts +7 -0
  185. package/dist/components/fields/ImageField.svelte +9 -0
  186. package/dist/components/fields/ImageField.svelte.d.ts +9 -0
  187. package/dist/components/fields/JsonField.svelte +72 -0
  188. package/dist/components/fields/JsonField.svelte.d.ts +6 -0
  189. package/dist/components/fields/MarkdownField.svelte +9 -0
  190. package/dist/components/fields/MarkdownField.svelte.d.ts +6 -0
  191. package/dist/components/fields/MultiSelectField.svelte +21 -0
  192. package/dist/components/fields/MultiSelectField.svelte.d.ts +10 -0
  193. package/dist/components/fields/NumberField.svelte +6 -0
  194. package/dist/components/fields/NumberField.svelte.d.ts +8 -0
  195. package/dist/components/fields/RelationField.svelte +24 -0
  196. package/dist/components/fields/RelationField.svelte.d.ts +8 -0
  197. package/dist/components/fields/RichTextField.svelte +35 -0
  198. package/dist/components/fields/RichTextField.svelte.d.ts +7 -0
  199. package/dist/components/fields/SelectField.svelte +14 -0
  200. package/dist/components/fields/SelectField.svelte.d.ts +10 -0
  201. package/dist/components/fields/TagField.svelte +12 -0
  202. package/dist/components/fields/TagField.svelte.d.ts +6 -0
  203. package/dist/components/fields/TextField.svelte +11 -0
  204. package/dist/components/fields/TextField.svelte.d.ts +7 -0
  205. package/dist/components/fields/UrlField.svelte +14 -0
  206. package/dist/components/fields/UrlField.svelte.d.ts +7 -0
  207. package/dist/components/ui/alert/alert-description.svelte +17 -0
  208. package/dist/components/ui/alert/alert-description.svelte.d.ts +6 -0
  209. package/dist/components/ui/alert/alert-title.svelte +17 -0
  210. package/dist/components/ui/alert/alert-title.svelte.d.ts +6 -0
  211. package/dist/components/ui/alert/alert.svelte +44 -0
  212. package/dist/components/ui/alert/alert.svelte.d.ts +32 -0
  213. package/dist/components/ui/alert/index.d.ts +4 -0
  214. package/dist/components/ui/alert/index.js +5 -0
  215. package/dist/components/ui/alert-dialog/alert-dialog-content.svelte +29 -0
  216. package/dist/components/ui/alert-dialog/alert-dialog-content.svelte.d.ts +10 -0
  217. package/dist/components/ui/alert-dialog/alert-dialog-description.svelte +16 -0
  218. package/dist/components/ui/alert-dialog/alert-dialog-description.svelte.d.ts +7 -0
  219. package/dist/components/ui/alert-dialog/alert-dialog-footer.svelte +11 -0
  220. package/dist/components/ui/alert-dialog/alert-dialog-footer.svelte.d.ts +8 -0
  221. package/dist/components/ui/alert-dialog/alert-dialog-header.svelte +11 -0
  222. package/dist/components/ui/alert-dialog/alert-dialog-header.svelte.d.ts +8 -0
  223. package/dist/components/ui/alert-dialog/alert-dialog-overlay.svelte +16 -0
  224. package/dist/components/ui/alert-dialog/alert-dialog-overlay.svelte.d.ts +7 -0
  225. package/dist/components/ui/alert-dialog/alert-dialog-portal.svelte +6 -0
  226. package/dist/components/ui/alert-dialog/alert-dialog-portal.svelte.d.ts +3 -0
  227. package/dist/components/ui/alert-dialog/alert-dialog-title.svelte +16 -0
  228. package/dist/components/ui/alert-dialog/alert-dialog-title.svelte.d.ts +7 -0
  229. package/dist/components/ui/alert-dialog/index.d.ts +13 -0
  230. package/dist/components/ui/alert-dialog/index.js +13 -0
  231. package/dist/components/ui/avatar/avatar.svelte +63 -0
  232. package/dist/components/ui/avatar/avatar.svelte.d.ts +32 -0
  233. package/dist/components/ui/avatar/index.d.ts +2 -0
  234. package/dist/components/ui/avatar/index.js +2 -0
  235. package/dist/components/ui/badge/badge.svelte +49 -0
  236. package/dist/components/ui/badge/badge.svelte.d.ts +38 -0
  237. package/dist/components/ui/badge/index.d.ts +2 -0
  238. package/dist/components/ui/badge/index.js +3 -0
  239. package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +18 -0
  240. package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte.d.ts +4 -0
  241. package/dist/components/ui/breadcrumb/breadcrumb-item.svelte +15 -0
  242. package/dist/components/ui/breadcrumb/breadcrumb-item.svelte.d.ts +8 -0
  243. package/dist/components/ui/breadcrumb/breadcrumb-link.svelte +15 -0
  244. package/dist/components/ui/breadcrumb/breadcrumb-link.svelte.d.ts +8 -0
  245. package/dist/components/ui/breadcrumb/breadcrumb-list.svelte +15 -0
  246. package/dist/components/ui/breadcrumb/breadcrumb-list.svelte.d.ts +8 -0
  247. package/dist/components/ui/breadcrumb/breadcrumb-page.svelte +18 -0
  248. package/dist/components/ui/breadcrumb/breadcrumb-page.svelte.d.ts +8 -0
  249. package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte +22 -0
  250. package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte.d.ts +8 -0
  251. package/dist/components/ui/breadcrumb/breadcrumb.svelte +11 -0
  252. package/dist/components/ui/breadcrumb/breadcrumb.svelte.d.ts +8 -0
  253. package/dist/components/ui/breadcrumb/index.d.ts +7 -0
  254. package/dist/components/ui/breadcrumb/index.js +7 -0
  255. package/dist/components/ui/button/button.svelte +90 -0
  256. package/dist/components/ui/button/button.svelte.d.ts +70 -0
  257. package/dist/components/ui/button/index.d.ts +2 -0
  258. package/dist/components/ui/button/index.js +5 -0
  259. package/dist/components/ui/card/card-action.svelte +23 -0
  260. package/dist/components/ui/card/card-action.svelte.d.ts +5 -0
  261. package/dist/components/ui/card/card-content.svelte +20 -0
  262. package/dist/components/ui/card/card-content.svelte.d.ts +5 -0
  263. package/dist/components/ui/card/card-description.svelte +20 -0
  264. package/dist/components/ui/card/card-description.svelte.d.ts +5 -0
  265. package/dist/components/ui/card/card-footer.svelte +20 -0
  266. package/dist/components/ui/card/card-footer.svelte.d.ts +5 -0
  267. package/dist/components/ui/card/card-header.svelte +23 -0
  268. package/dist/components/ui/card/card-header.svelte.d.ts +5 -0
  269. package/dist/components/ui/card/card-title.svelte +15 -0
  270. package/dist/components/ui/card/card-title.svelte.d.ts +5 -0
  271. package/dist/components/ui/card/card.svelte +22 -0
  272. package/dist/components/ui/card/card.svelte.d.ts +8 -0
  273. package/dist/components/ui/card/index.d.ts +8 -0
  274. package/dist/components/ui/card/index.js +10 -0
  275. package/dist/components/ui/checkbox/checkbox.svelte +39 -0
  276. package/dist/components/ui/checkbox/checkbox.svelte.d.ts +4 -0
  277. package/dist/components/ui/checkbox/index.d.ts +2 -0
  278. package/dist/components/ui/checkbox/index.js +4 -0
  279. package/dist/components/ui/collapsible/index.d.ts +5 -0
  280. package/dist/components/ui/collapsible/index.js +5 -0
  281. package/dist/components/ui/command/command-dialog.svelte +31 -0
  282. package/dist/components/ui/command/command-dialog.svelte.d.ts +10 -0
  283. package/dist/components/ui/command/index.d.ts +2 -0
  284. package/dist/components/ui/command/index.js +2 -0
  285. package/dist/components/ui/context-menu/index.d.ts +9 -0
  286. package/dist/components/ui/context-menu/index.js +9 -0
  287. package/dist/components/ui/dialog/dialog-close.svelte +11 -0
  288. package/dist/components/ui/dialog/dialog-close.svelte.d.ts +4 -0
  289. package/dist/components/ui/dialog/dialog-content.svelte +48 -0
  290. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +13 -0
  291. package/dist/components/ui/dialog/dialog-description.svelte +17 -0
  292. package/dist/components/ui/dialog/dialog-description.svelte.d.ts +4 -0
  293. package/dist/components/ui/dialog/dialog-footer.svelte +32 -0
  294. package/dist/components/ui/dialog/dialog-footer.svelte.d.ts +8 -0
  295. package/dist/components/ui/dialog/dialog-header.svelte +20 -0
  296. package/dist/components/ui/dialog/dialog-header.svelte.d.ts +5 -0
  297. package/dist/components/ui/dialog/dialog-overlay.svelte +17 -0
  298. package/dist/components/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
  299. package/dist/components/ui/dialog/dialog-portal.svelte +7 -0
  300. package/dist/components/ui/dialog/dialog-portal.svelte.d.ts +3 -0
  301. package/dist/components/ui/dialog/dialog-title.svelte +17 -0
  302. package/dist/components/ui/dialog/dialog-title.svelte.d.ts +4 -0
  303. package/dist/components/ui/dialog/dialog-trigger.svelte +11 -0
  304. package/dist/components/ui/dialog/dialog-trigger.svelte.d.ts +4 -0
  305. package/dist/components/ui/dialog/dialog.svelte +7 -0
  306. package/dist/components/ui/dialog/dialog.svelte.d.ts +3 -0
  307. package/dist/components/ui/dialog/index.d.ts +11 -0
  308. package/dist/components/ui/dialog/index.js +13 -0
  309. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +43 -0
  310. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
  311. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +35 -0
  312. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte.d.ts +8 -0
  313. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +36 -0
  314. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +9 -0
  315. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +10 -0
  316. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte.d.ts +6 -0
  317. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +27 -0
  318. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +11 -0
  319. package/dist/components/ui/dropdown-menu/dropdown-menu.svelte +45 -0
  320. package/dist/components/ui/dropdown-menu/dropdown-menu.svelte.d.ts +9 -0
  321. package/dist/components/ui/dropdown-menu/index.d.ts +7 -0
  322. package/dist/components/ui/dropdown-menu/index.js +7 -0
  323. package/dist/components/ui/input/index.d.ts +2 -0
  324. package/dist/components/ui/input/index.js +4 -0
  325. package/dist/components/ui/input/input.svelte +48 -0
  326. package/dist/components/ui/input/input.svelte.d.ts +13 -0
  327. package/dist/components/ui/label/index.d.ts +1 -0
  328. package/dist/components/ui/label/index.js +1 -0
  329. package/dist/components/ui/label/label.svelte +18 -0
  330. package/dist/components/ui/label/label.svelte.d.ts +5 -0
  331. package/dist/components/ui/pagination/index.d.ts +7 -0
  332. package/dist/components/ui/pagination/index.js +7 -0
  333. package/dist/components/ui/pagination/pagination-content.svelte +11 -0
  334. package/dist/components/ui/pagination/pagination-content.svelte.d.ts +8 -0
  335. package/dist/components/ui/pagination/pagination-ellipsis.svelte +12 -0
  336. package/dist/components/ui/pagination/pagination-ellipsis.svelte.d.ts +4 -0
  337. package/dist/components/ui/pagination/pagination-item.svelte +11 -0
  338. package/dist/components/ui/pagination/pagination-item.svelte.d.ts +8 -0
  339. package/dist/components/ui/pagination/pagination-link.svelte +26 -0
  340. package/dist/components/ui/pagination/pagination-link.svelte.d.ts +9 -0
  341. package/dist/components/ui/pagination/pagination-next.svelte +22 -0
  342. package/dist/components/ui/pagination/pagination-next.svelte.d.ts +8 -0
  343. package/dist/components/ui/pagination/pagination-previous.svelte +22 -0
  344. package/dist/components/ui/pagination/pagination-previous.svelte.d.ts +8 -0
  345. package/dist/components/ui/pagination/pagination.svelte +11 -0
  346. package/dist/components/ui/pagination/pagination.svelte.d.ts +8 -0
  347. package/dist/components/ui/popover/index.d.ts +6 -0
  348. package/dist/components/ui/popover/index.js +6 -0
  349. package/dist/components/ui/popover/popover-content.svelte +25 -0
  350. package/dist/components/ui/popover/popover-content.svelte.d.ts +7 -0
  351. package/dist/components/ui/progress/index.d.ts +1 -0
  352. package/dist/components/ui/progress/index.js +1 -0
  353. package/dist/components/ui/progress/progress.svelte +22 -0
  354. package/dist/components/ui/progress/progress.svelte.d.ts +8 -0
  355. package/dist/components/ui/scroll-area/index.d.ts +1 -0
  356. package/dist/components/ui/scroll-area/index.js +1 -0
  357. package/dist/components/ui/scroll-area/scroll-area.svelte +20 -0
  358. package/dist/components/ui/scroll-area/scroll-area.svelte.d.ts +9 -0
  359. package/dist/components/ui/select/index.d.ts +2 -0
  360. package/dist/components/ui/select/index.js +2 -0
  361. package/dist/components/ui/select/select.svelte +36 -0
  362. package/dist/components/ui/select/select.svelte.d.ts +8 -0
  363. package/dist/components/ui/separator/index.d.ts +2 -0
  364. package/dist/components/ui/separator/index.js +4 -0
  365. package/dist/components/ui/separator/separator.svelte +23 -0
  366. package/dist/components/ui/separator/separator.svelte.d.ts +4 -0
  367. package/dist/components/ui/sheet/index.d.ts +7 -0
  368. package/dist/components/ui/sheet/index.js +7 -0
  369. package/dist/components/ui/sheet/sheet-content.svelte +28 -0
  370. package/dist/components/ui/sheet/sheet-content.svelte.d.ts +8 -0
  371. package/dist/components/ui/sheet/sheet-description.svelte +22 -0
  372. package/dist/components/ui/sheet/sheet-description.svelte.d.ts +6 -0
  373. package/dist/components/ui/sheet/sheet-footer.svelte +22 -0
  374. package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +6 -0
  375. package/dist/components/ui/sheet/sheet-header.svelte +22 -0
  376. package/dist/components/ui/sheet/sheet-header.svelte.d.ts +6 -0
  377. package/dist/components/ui/sheet/sheet-title.svelte +22 -0
  378. package/dist/components/ui/sheet/sheet-title.svelte.d.ts +6 -0
  379. package/dist/components/ui/sheet/sheet.svelte +78 -0
  380. package/dist/components/ui/sheet/sheet.svelte.d.ts +10 -0
  381. package/dist/components/ui/skeleton/index.d.ts +2 -0
  382. package/dist/components/ui/skeleton/index.js +2 -0
  383. package/dist/components/ui/skeleton/skeleton.svelte +21 -0
  384. package/dist/components/ui/skeleton/skeleton.svelte.d.ts +8 -0
  385. package/dist/components/ui/switch/index.d.ts +2 -0
  386. package/dist/components/ui/switch/index.js +2 -0
  387. package/dist/components/ui/switch/switch.svelte +49 -0
  388. package/dist/components/ui/switch/switch.svelte.d.ts +10 -0
  389. package/dist/components/ui/table/index.d.ts +9 -0
  390. package/dist/components/ui/table/index.js +11 -0
  391. package/dist/components/ui/table/table-body.svelte +15 -0
  392. package/dist/components/ui/table/table-body.svelte.d.ts +5 -0
  393. package/dist/components/ui/table/table-caption.svelte +20 -0
  394. package/dist/components/ui/table/table-caption.svelte.d.ts +5 -0
  395. package/dist/components/ui/table/table-cell.svelte +15 -0
  396. package/dist/components/ui/table/table-cell.svelte.d.ts +5 -0
  397. package/dist/components/ui/table/table-footer.svelte +20 -0
  398. package/dist/components/ui/table/table-footer.svelte.d.ts +5 -0
  399. package/dist/components/ui/table/table-head.svelte +15 -0
  400. package/dist/components/ui/table/table-head.svelte.d.ts +5 -0
  401. package/dist/components/ui/table/table-header.svelte +20 -0
  402. package/dist/components/ui/table/table-header.svelte.d.ts +5 -0
  403. package/dist/components/ui/table/table-row.svelte +15 -0
  404. package/dist/components/ui/table/table-row.svelte.d.ts +5 -0
  405. package/dist/components/ui/table/table.svelte +17 -0
  406. package/dist/components/ui/table/table.svelte.d.ts +5 -0
  407. package/dist/components/ui/tabs/index.d.ts +5 -0
  408. package/dist/components/ui/tabs/index.js +5 -0
  409. package/dist/components/ui/tabs/tabs-content.svelte +30 -0
  410. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +9 -0
  411. package/dist/components/ui/tabs/tabs-list.svelte +26 -0
  412. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +6 -0
  413. package/dist/components/ui/tabs/tabs-trigger.svelte +37 -0
  414. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +9 -0
  415. package/dist/components/ui/tabs/tabs.svelte +27 -0
  416. package/dist/components/ui/tabs/tabs.svelte.d.ts +9 -0
  417. package/dist/components/ui/textarea/index.d.ts +2 -0
  418. package/dist/components/ui/textarea/index.js +2 -0
  419. package/dist/components/ui/textarea/textarea.svelte +24 -0
  420. package/dist/components/ui/textarea/textarea.svelte.d.ts +6 -0
  421. package/dist/components/ui/tooltip/index.d.ts +6 -0
  422. package/dist/components/ui/tooltip/index.js +8 -0
  423. package/dist/components/ui/tooltip/tooltip-content.svelte +52 -0
  424. package/dist/components/ui/tooltip/tooltip-content.svelte.d.ts +11 -0
  425. package/dist/components/ui/tooltip/tooltip-portal.svelte +7 -0
  426. package/dist/components/ui/tooltip/tooltip-portal.svelte.d.ts +4 -0
  427. package/dist/components/ui/tooltip/tooltip-provider.svelte +7 -0
  428. package/dist/components/ui/tooltip/tooltip-provider.svelte.d.ts +4 -0
  429. package/dist/components/ui/tooltip/tooltip-trigger.svelte +7 -0
  430. package/dist/components/ui/tooltip/tooltip-trigger.svelte.d.ts +4 -0
  431. package/dist/components/ui/tooltip/tooltip.svelte +10 -0
  432. package/dist/components/ui/tooltip/tooltip.svelte.d.ts +4 -0
  433. package/dist/editor-config.svelte.d.ts +15 -0
  434. package/dist/editor-config.svelte.js +19 -0
  435. package/dist/index.d.ts +117 -0
  436. package/dist/index.js +127 -0
  437. package/dist/markdown-deps.d.ts +21 -0
  438. package/dist/router-state.svelte.d.ts +5 -0
  439. package/dist/router-state.svelte.js +58 -0
  440. package/dist/types.d.ts +42 -0
  441. package/dist/types.js +1 -0
  442. package/dist/utils.d.ts +16 -0
  443. package/dist/utils.js +5 -0
  444. package/package.json +2 -2
@@ -0,0 +1,158 @@
1
+ <script lang="ts">
2
+ import { Input } from './ui/input/index.js';
3
+ import type { ChatProvider } from '@svadmin/core';
4
+
5
+ interface Props {
6
+ /** The bound value of the input */
7
+ value: string;
8
+ /** The chat provider to generate suggestions */
9
+ provider?: ChatProvider;
10
+ /** Context given to the AI to help it predict the text */
11
+ context?: string;
12
+ /** Standard input props */
13
+ placeholder?: string;
14
+ class?: string;
15
+ id?: string;
16
+ disabled?: boolean;
17
+ name?: string;
18
+ type?: string;
19
+ }
20
+
21
+ let {
22
+ value = $bindable(),
23
+ provider,
24
+ context = '',
25
+ placeholder = '',
26
+ class: className = '',
27
+ id,
28
+ disabled = false,
29
+ name,
30
+ type = 'text'
31
+ }: Props = $props();
32
+
33
+ let suggestion = $state('');
34
+ let isPredicting = $state(false);
35
+ let abortController: AbortController | null = null;
36
+ let predictTimer: ReturnType<typeof setTimeout> | null = null;
37
+
38
+ // The ghost text shows the suggestion, but only the part *after* what the user has typed
39
+ // It only displays if the suggestion actually starts with the current value
40
+ const ghostText = $derived.by(() => {
41
+ if (!suggestion || !value) return '';
42
+ const lowerVal = value.toLowerCase();
43
+ const lowerSugg = suggestion.toLowerCase();
44
+
45
+ if (lowerSugg.startsWith(lowerVal) && suggestion.length > value.length) {
46
+ // Preserve original casing from the suggestion but append only the suffix
47
+ return value + suggestion.slice(value.length);
48
+ }
49
+ return '';
50
+ });
51
+
52
+ const suffixText = $derived(ghostText ? ghostText.slice(value.length) : '');
53
+
54
+ async function predict() {
55
+ if (!provider || !value.trim()) {
56
+ suggestion = '';
57
+ return;
58
+ }
59
+
60
+ isPredicting = true;
61
+ if (abortController) {
62
+ abortController.abort();
63
+ }
64
+ abortController = new AbortController();
65
+
66
+ try {
67
+ const prompt = `You are an autocomplete engine. The user is typing: "${value}".
68
+ Context: ${context}.
69
+ Provide ONLY the most likely completion of the exact phrase the user is typing.
70
+ Include the user's input in your returned string.
71
+ Do not include any other text, Markdown formatting, quotes, or explanations.`;
72
+
73
+ const result = provider.sendMessage(
74
+ [{ id: 'prompt', role: 'user', content: prompt, timestamp: Date.now() }],
75
+ { signal: abortController.signal }
76
+ );
77
+
78
+ suggestion = '';
79
+
80
+ // Handle streaming or Promise responses seamlessly
81
+ if (Symbol.asyncIterator in result) {
82
+ for await (const chunk of result as AsyncIterable<string>) {
83
+ suggestion += chunk;
84
+ }
85
+ } else {
86
+ suggestion = await result;
87
+ }
88
+
89
+ // Clean up the suggestion
90
+ suggestion = suggestion.trim().replace(/^["']|["']$/g, '');
91
+ } catch (err: unknown) {
92
+ if (err instanceof Error && err.name !== 'AbortError') {
93
+ suggestion = '';
94
+ }
95
+ } finally {
96
+ isPredicting = false;
97
+ }
98
+ }
99
+
100
+ function handleInput(e: Event) {
101
+ const target = e.target as HTMLInputElement;
102
+ value = target.value;
103
+
104
+ // Reset suggestion immediately if it no longer matches
105
+ if (suggestion && !suggestion.toLowerCase().startsWith(value.toLowerCase())) {
106
+ suggestion = '';
107
+ }
108
+
109
+ if (predictTimer) clearTimeout(predictTimer);
110
+
111
+ // Debounce prediction
112
+ predictTimer = setTimeout(() => {
113
+ predict();
114
+ }, 500);
115
+ }
116
+
117
+ function handleKeyDown(e: KeyboardEvent) {
118
+ if (e.key === 'Tab' && suffixText) {
119
+ e.preventDefault(); // Prevent standard tab navigation
120
+ value = ghostText;
121
+ suggestion = ''; // Clear suggestion once accepted
122
+ }
123
+ }
124
+
125
+ </script>
126
+
127
+ <div class="relative w-full {className}">
128
+ <!-- Ghost Text Layer (positioned exactly beneath the actual text) -->
129
+ {#if suffixText}
130
+ <div
131
+ class="absolute inset-0 pointer-events-none flex items-center px-3 text-sm font-medium"
132
+ aria-hidden="true"
133
+ >
134
+ <span class="opacity-0">{value}</span>
135
+ <span class="text-muted-foreground/40">{suffixText}</span>
136
+ </div>
137
+ {/if}
138
+
139
+ <!-- Actual Input Layer -->
140
+ <Input
141
+ {id}
142
+ {name}
143
+ {type}
144
+ {disabled}
145
+ {placeholder}
146
+ value={value}
147
+ oninput={handleInput}
148
+ onkeydown={handleKeyDown}
149
+ class="bg-transparent relative z-10 w-full"
150
+ />
151
+
152
+ <!-- Loading indicator -->
153
+ {#if isPredicting}
154
+ <div class="absolute right-3 top-1/2 -translate-y-1/2 pointer-events-none">
155
+ <div class="h-1.5 w-1.5 rounded-full bg-primary/50 animate-pulse"></div>
156
+ </div>
157
+ {/if}
158
+ </div>
@@ -0,0 +1,19 @@
1
+ import type { ChatProvider } from '@svadmin/core';
2
+ interface Props {
3
+ /** The bound value of the input */
4
+ value: string;
5
+ /** The chat provider to generate suggestions */
6
+ provider?: ChatProvider;
7
+ /** Context given to the AI to help it predict the text */
8
+ context?: string;
9
+ /** Standard input props */
10
+ placeholder?: string;
11
+ class?: string;
12
+ id?: string;
13
+ disabled?: boolean;
14
+ name?: string;
15
+ type?: string;
16
+ }
17
+ declare const SmartSuggest: import("svelte").Component<Props, {}, "value">;
18
+ type SmartSuggest = ReturnType<typeof SmartSuggest>;
19
+ export default SmartSuggest;
@@ -0,0 +1,79 @@
1
+ <script lang="ts">
2
+ import { Skeleton } from './ui/skeleton/index.js';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ type ColorVariant = 'primary' | 'success' | 'warning' | 'danger' | 'info';
6
+ type StyleVariant = 'default' | 'outline' | 'filled';
7
+
8
+ const colorMap: Record<ColorVariant, string> = {
9
+ primary: 'bg-primary/10 text-primary',
10
+ success: 'bg-success/10 text-success',
11
+ warning: 'bg-warning/10 text-warning',
12
+ danger: 'bg-destructive/10 text-destructive',
13
+ info: 'bg-info/10 text-info',
14
+ };
15
+
16
+ const variantMap: Record<StyleVariant, string> = {
17
+ default: 'bg-card shadow-sm hover:shadow-md transition-shadow duration-300',
18
+ outline: 'border-2 border-border bg-transparent',
19
+ filled: 'border-0 bg-muted/50 shadow-sm',
20
+ };
21
+
22
+ interface Props {
23
+ label: string;
24
+ value: string | number;
25
+ icon?: import('svelte').Component<{ class?: string }>;
26
+ trend?: { value: number; label?: string };
27
+ loading?: boolean;
28
+ color?: ColorVariant;
29
+ variant?: StyleVariant;
30
+ /** Optional footer snippet for additional content below the value */
31
+ footer?: Snippet;
32
+ class?: string;
33
+ }
34
+
35
+ let {
36
+ label,
37
+ value,
38
+ icon: Icon,
39
+ trend,
40
+ loading = false,
41
+ color = 'primary',
42
+ variant = 'default',
43
+ footer,
44
+ class: className = '',
45
+ }: Props = $props();
46
+ </script>
47
+
48
+ <div class="flex items-center gap-4 rounded-lg p-5 {variantMap[variant]} {className}">
49
+ {#if Icon}
50
+ <div class="flex h-12 w-12 items-center justify-center rounded-lg {colorMap[color]}">
51
+ <Icon class="h-6 w-6" />
52
+ </div>
53
+ {/if}
54
+ <div class="flex-1 min-w-0">
55
+ <p class="text-sm text-muted-foreground">{label}</p>
56
+ {#if loading}
57
+ <Skeleton class="mt-1 h-7 w-20" />
58
+ {:else}
59
+ <div class="flex items-baseline gap-2">
60
+ <p class="text-xl font-mono font-semibold text-foreground tracking-tight">{value}</p>
61
+ {#if trend}
62
+ <span
63
+ class="text-xs font-medium {trend.value >= 0 ? 'text-success' : 'text-destructive'}"
64
+ >
65
+ {trend.value >= 0 ? '↑' : '↓'}{Math.abs(trend.value)}%
66
+ {#if trend.label}
67
+ <span class="text-muted-foreground">{trend.label}</span>
68
+ {/if}
69
+ </span>
70
+ {/if}
71
+ </div>
72
+ {/if}
73
+ {#if footer}
74
+ <div class="mt-2">
75
+ {@render footer()}
76
+ </div>
77
+ {/if}
78
+ </div>
79
+ </div>
@@ -0,0 +1,23 @@
1
+ import type { Snippet } from 'svelte';
2
+ type ColorVariant = 'primary' | 'success' | 'warning' | 'danger' | 'info';
3
+ type StyleVariant = 'default' | 'outline' | 'filled';
4
+ interface Props {
5
+ label: string;
6
+ value: string | number;
7
+ icon?: import('svelte').Component<{
8
+ class?: string;
9
+ }>;
10
+ trend?: {
11
+ value: number;
12
+ label?: string;
13
+ };
14
+ loading?: boolean;
15
+ color?: ColorVariant;
16
+ variant?: StyleVariant;
17
+ /** Optional footer snippet for additional content below the value */
18
+ footer?: Snippet;
19
+ class?: string;
20
+ }
21
+ declare const StatsCard: import("svelte").Component<Props, {}, "">;
22
+ type StatsCard = ReturnType<typeof StatsCard>;
23
+ export default StatsCard;
@@ -0,0 +1,194 @@
1
+ <script lang="ts">
2
+ import { fly } from 'svelte/transition';
3
+ import { useStepsForm, deriveValidator } from '@svadmin/core';
4
+ import type { FieldDefinition } from '@svadmin/core';
5
+ import { getResource } from '@svadmin/core';
6
+ import { navigate } from '@svadmin/core/router';
7
+ import { t } from '@svadmin/core/i18n';
8
+ import { Button } from './ui/button/index.js';
9
+ import * as Card from './ui/card/index.js';
10
+ import { Badge } from './ui/badge/index.js';
11
+ import { Progress } from './ui/progress/index.js';
12
+ import { Save, ArrowLeft, ArrowRight, Check, Loader2 } from '@lucide/svelte';
13
+ import FieldRenderer from './FieldRenderer.svelte';
14
+
15
+ interface StepDef {
16
+ title: string;
17
+ fields: string[];
18
+ }
19
+
20
+ interface Props {
21
+ resourceName: string;
22
+ id?: string | number;
23
+ mode?: 'create' | 'edit';
24
+ steps: StepDef[];
25
+ }
26
+
27
+ let { resourceName, id, mode = 'create', steps }: Props = $props();
28
+
29
+ const resource = $derived(getResource(resourceName));
30
+ const primaryKey = $derived(resource.primaryKey ?? 'id');
31
+
32
+ // All fields used across all steps
33
+ const flatStepsFields = $derived(steps.flatMap(s => s.fields)
34
+ .map(key => resource.fields.find(f => f.key === key))
35
+ .filter((f): f is FieldDefinition => f != null));
36
+
37
+ // Default values from field metadata
38
+ function getDefaultForType(field: FieldDefinition): unknown {
39
+ switch (field.type) {
40
+ case 'text': case 'textarea': case 'richtext': case 'image': return '';
41
+ case 'number': return 0;
42
+ case 'boolean': return false;
43
+ case 'tags': case 'images': case 'multiselect': return [];
44
+ case 'select': return field.options?.[0]?.value ?? '';
45
+ case 'json': return {};
46
+ default: return '';
47
+ }
48
+ }
49
+
50
+ const defaults = $derived((() => {
51
+ const d: Record<string, unknown> = {};
52
+ for (const f of flatStepsFields) d[f.key] = f.defaultValue ?? getDefaultForType(f);
53
+ return d;
54
+ })());
55
+
56
+ const validator = $derived(deriveValidator(flatStepsFields));
57
+
58
+ // ─── useStepsForm: form state + step navigation ──────────────────
59
+ const form = useStepsForm({
60
+ get resource() { return resourceName; },
61
+ get action() { return mode; },
62
+ get id() { return id; },
63
+ get defaultValues() { return defaults; },
64
+ redirect: 'list',
65
+ warnWhenUnsavedChanges: true,
66
+ get validate() { return validator; },
67
+ });
68
+
69
+ const totalSteps = $derived(steps.length);
70
+ const progressValue = $derived(((form.currentStep + 1) / totalSteps) * 100);
71
+ const isLastStep = $derived(form.currentStep >= totalSteps - 1);
72
+
73
+ // Fields for the current step
74
+ const currentFields = $derived(
75
+ steps[form.currentStep]?.fields
76
+ .map(key => resource.fields.find(f => f.key === key))
77
+ .filter((f): f is FieldDefinition => f != null && f.key !== primaryKey) ?? []
78
+ );
79
+
80
+ // Validate only fields in the current step
81
+ function validateCurrentStep(): boolean {
82
+ let valid = true;
83
+ form.clearErrors();
84
+ for (const field of currentFields) {
85
+ const value = form.values[field.key];
86
+ if (field.required && (value === undefined || value === null || value === '')) {
87
+ form.setFieldError(field.key, t('validation.required'));
88
+ valid = false;
89
+ } else if (field.validate) {
90
+ const msg = field.validate(value);
91
+ if (msg) {
92
+ form.setFieldError(field.key, msg);
93
+ valid = false;
94
+ }
95
+ }
96
+ }
97
+ return valid;
98
+ }
99
+
100
+ async function handleSubmit() {
101
+ if (!validateCurrentStep()) return;
102
+
103
+ if (!isLastStep) {
104
+ form.next();
105
+ return;
106
+ }
107
+
108
+ // Last step — submit the full form
109
+ await form.submit({ redirect: 'list' });
110
+ }
111
+ </script>
112
+
113
+ <div class="space-y-6">
114
+ <!-- Step indicators -->
115
+ <div class="space-y-3">
116
+ <div class="flex items-center justify-between text-sm">
117
+ {#each steps as step, i}
118
+ <Button
119
+ variant="ghost"
120
+ type="button"
121
+ class="flex items-center gap-2 transition-colors h-auto py-1 px-2 {i === form.currentStep ? 'text-primary font-semibold' : 'text-muted-foreground'}"
122
+ onclick={() => form.gotoStep(i)}
123
+ >
124
+ <span
125
+ class="flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium transition-colors"
126
+ class:bg-primary={i <= form.currentStep}
127
+ class:text-primary-foreground={i <= form.currentStep}
128
+ class:bg-muted={i > form.currentStep}
129
+ class:text-muted-foreground={i > form.currentStep}
130
+ >
131
+ {#if i < form.currentStep}
132
+ <Check class="h-3.5 w-3.5" />
133
+ {:else}
134
+ {i + 1}
135
+ {/if}
136
+ </span>
137
+ <span class="hidden sm:inline">{step.title}</span>
138
+ </Button>
139
+ {#if i < steps.length - 1}
140
+ <div class="flex-1 mx-2 h-px bg-border" class:bg-primary={i < form.currentStep}></div>
141
+ {/if}
142
+ {/each}
143
+ </div>
144
+ <Progress value={progressValue} class="h-1.5" />
145
+ </div>
146
+
147
+ <!-- Step content -->
148
+ <Card.Root>
149
+ <Card.CardHeader>
150
+ <Card.CardTitle>{steps[form.currentStep]?.title ?? ''}</Card.CardTitle>
151
+ <Badge variant="outline" class="w-fit">
152
+ {t('common.step')} {form.currentStep + 1} / {totalSteps}
153
+ </Badge>
154
+ </Card.CardHeader>
155
+ <Card.CardContent>
156
+ {#key form.currentStep}
157
+ <form class="space-y-5" onsubmit={(e) => { e.preventDefault(); handleSubmit(); }} in:fly={{ x: 30, duration: 250 }}>
158
+ {#each currentFields as field (field.key)}
159
+ <FieldRenderer
160
+ {field}
161
+ value={form.values[field.key]}
162
+ onchange={(v) => form.setFieldValue(field.key, v)}
163
+ />
164
+ {#if form.errors[field.key]}
165
+ <p class="text-destructive text-[0.8125rem] mt-1">{form.errors[field.key]}</p>
166
+ {/if}
167
+ {/each}
168
+
169
+ <div class="flex items-center justify-between pt-4">
170
+ <Button
171
+ type="button"
172
+ variant="outline"
173
+ onclick={() => form.currentStep === 0 ? navigate(`/${resourceName}`) : form.prev()}
174
+ >
175
+ <ArrowLeft class="h-4 w-4" data-icon="inline-start" />
176
+ {form.currentStep === 0 ? t('common.cancel') : t('common.back')}
177
+ </Button>
178
+
179
+ <Button type="submit" disabled={form.submitting}>
180
+ {#if form.submitting}
181
+ <Loader2 class="h-4 w-4 animate-spin" data-icon="inline-start" />
182
+ {:else if isLastStep}
183
+ <Save class="h-4 w-4" data-icon="inline-start" />
184
+ {:else}
185
+ <ArrowRight class="h-4 w-4" data-icon="inline-start" />
186
+ {/if}
187
+ {isLastStep ? t('common.save') : t('common.next')}
188
+ </Button>
189
+ </div>
190
+ </form>
191
+ {/key}
192
+ </Card.CardContent>
193
+ </Card.Root>
194
+ </div>
@@ -0,0 +1,13 @@
1
+ interface StepDef {
2
+ title: string;
3
+ fields: string[];
4
+ }
5
+ interface Props {
6
+ resourceName: string;
7
+ id?: string | number;
8
+ mode?: 'create' | 'edit';
9
+ steps: StepDef[];
10
+ }
11
+ declare const StepsForm: import("svelte").Component<Props, {}, "">;
12
+ type StepsForm = ReturnType<typeof StepsForm>;
13
+ export default StepsForm;
@@ -0,0 +1,158 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { Loader2, CheckCircle2, XCircle, Clock, Download, X, ListTodo } from '@lucide/svelte';
4
+ import { Button } from './ui/button/index.js';
5
+ import { Badge } from './ui/badge/index.js';
6
+ import type { BackgroundTask, TaskStatus } from '../types.js';
7
+
8
+ let {
9
+ open = $bindable(false),
10
+ tasks = $bindable<BackgroundTask[]>([]),
11
+ onDismiss,
12
+ onRetry,
13
+ onDownload,
14
+ }: {
15
+ open?: boolean;
16
+ tasks?: BackgroundTask[];
17
+ onDismiss?: (taskId: string) => void;
18
+ onRetry?: (taskId: string) => void;
19
+ onDownload?: (taskId: string, url: string) => void;
20
+ } = $props();
21
+
22
+ let runningCount = $derived(tasks.filter(t => t.status === 'running' || t.status === 'pending').length);
23
+
24
+ const statusIcon: Record<TaskStatus, typeof Loader2> = {
25
+ pending: Clock,
26
+ running: Loader2,
27
+ completed: CheckCircle2,
28
+ failed: XCircle,
29
+ };
30
+
31
+ const statusColor: Record<TaskStatus, string> = {
32
+ pending: 'text-muted-foreground',
33
+ running: 'text-primary',
34
+ completed: 'text-green-500',
35
+ failed: 'text-destructive',
36
+ };
37
+
38
+ function formatTime(d: string | Date) {
39
+ return new Date(d).toLocaleTimeString();
40
+ }
41
+
42
+ function dismissTask(id: string) {
43
+ tasks = tasks.filter(t => t.id !== id);
44
+ onDismiss?.(id);
45
+ }
46
+ </script>
47
+
48
+ <!-- Trigger Button (to be placed in Header) -->
49
+ <Button
50
+ variant="ghost"
51
+ size="icon"
52
+ class="relative"
53
+ onclick={() => open = !open}
54
+ >
55
+ <ListTodo class="h-4 w-4" />
56
+ {#if runningCount > 0}
57
+ <span class="absolute -top-0.5 -right-0.5 flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[10px] font-bold text-primary-foreground">
58
+ {runningCount}
59
+ </span>
60
+ {/if}
61
+ </Button>
62
+
63
+ <!-- Task Queue Drawer -->
64
+ {#if open}
65
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
66
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
67
+ <div class="fixed inset-0 z-[90] flex justify-end" onclick={() => open = false}>
68
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
69
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
70
+ <div
71
+ class="bg-card shadow-2xl w-full max-w-sm h-full flex flex-col border-l border-border animate-in slide-in-from-right duration-200"
72
+ onclick={(e) => e.stopPropagation()}
73
+ >
74
+ <!-- Header -->
75
+ <div class="p-4 border-b border-border flex items-center justify-between bg-muted/30">
76
+ <div class="flex items-center gap-2">
77
+ <ListTodo class="h-5 w-5 text-muted-foreground" />
78
+ <h2 class="text-sm font-semibold">Background Tasks</h2>
79
+ {#if runningCount > 0}
80
+ <Badge variant="secondary" class="text-xs">{runningCount} active</Badge>
81
+ {/if}
82
+ </div>
83
+ <Button variant="ghost" size="icon" class="h-7 w-7" onclick={() => open = false}>
84
+ <X class="h-4 w-4" />
85
+ </Button>
86
+ </div>
87
+
88
+ <!-- Task List -->
89
+ <div class="flex-1 overflow-y-auto">
90
+ {#each tasks as task}
91
+ {@const Icon = statusIcon[task.status]}
92
+ <div class="p-4 border-b border-border hover:bg-muted/30 transition-colors">
93
+ <div class="flex items-start justify-between gap-2">
94
+ <div class="flex items-start gap-3 flex-1 min-w-0">
95
+ <div class="{statusColor[task.status]} mt-0.5 shrink-0">
96
+ <Icon class="h-4 w-4 {task.status === 'running' ? 'animate-spin' : ''}" />
97
+ </div>
98
+ <div class="flex-1 min-w-0">
99
+ <p class="text-sm font-medium truncate text-foreground">{task.title}</p>
100
+ {#if task.message}
101
+ <p class="text-xs text-muted-foreground mt-0.5">{task.message}</p>
102
+ {/if}
103
+ <p class="text-[10px] text-muted-foreground/60 mt-1 font-mono">{formatTime(task.createdAt)}</p>
104
+ </div>
105
+ </div>
106
+ <button
107
+ class="text-muted-foreground/40 hover:text-muted-foreground transition shrink-0"
108
+ onclick={() => dismissTask(task.id)}
109
+ >
110
+ <X class="h-3.5 w-3.5" />
111
+ </button>
112
+ </div>
113
+
114
+ <!-- Progress bar -->
115
+ {#if task.status === 'running' && task.progress != null}
116
+ <div class="mt-3 ml-7">
117
+ <div class="h-1.5 w-full bg-muted rounded-full overflow-hidden">
118
+ <div
119
+ class="h-full bg-primary rounded-full transition-all duration-500 ease-out"
120
+ style="width: {task.progress}%"
121
+ ></div>
122
+ </div>
123
+ <p class="text-[10px] text-muted-foreground mt-1">{task.progress}%</p>
124
+ </div>
125
+ {/if}
126
+
127
+ <!-- Actions -->
128
+ {#if task.status === 'completed' && task.downloadUrl}
129
+ <div class="mt-2 ml-7">
130
+ <Button
131
+ variant="outline" size="sm" class="h-7 text-xs"
132
+ onclick={() => onDownload?.(task.id, task.downloadUrl!)}
133
+ >
134
+ <Download class="h-3 w-3 mr-1" />
135
+ Download
136
+ </Button>
137
+ </div>
138
+ {:else if task.status === 'failed' && onRetry}
139
+ <div class="mt-2 ml-7">
140
+ <Button
141
+ variant="outline" size="sm" class="h-7 text-xs text-destructive"
142
+ onclick={() => onRetry?.(task.id)}
143
+ >
144
+ Retry
145
+ </Button>
146
+ </div>
147
+ {/if}
148
+ </div>
149
+ {:else}
150
+ <div class="flex flex-col items-center justify-center h-48 text-muted-foreground">
151
+ <ListTodo class="h-8 w-8 mb-2 opacity-30" />
152
+ <p class="text-sm">No background tasks</p>
153
+ </div>
154
+ {/each}
155
+ </div>
156
+ </div>
157
+ </div>
158
+ {/if}
@@ -0,0 +1,11 @@
1
+ import type { BackgroundTask } from '../types.js';
2
+ type $$ComponentProps = {
3
+ open?: boolean;
4
+ tasks?: BackgroundTask[];
5
+ onDismiss?: (taskId: string) => void;
6
+ onRetry?: (taskId: string) => void;
7
+ onDownload?: (taskId: string, url: string) => void;
8
+ };
9
+ declare const TaskQueueDrawer: import("svelte").Component<$$ComponentProps, {}, "open" | "tasks">;
10
+ type TaskQueueDrawer = ReturnType<typeof TaskQueueDrawer>;
11
+ export default TaskQueueDrawer;