@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,65 @@
1
+ <script lang="ts">
2
+ import { Badge } from './ui/badge/index.js';
3
+ import { TrendingUp, TrendingDown, AlertTriangle } from '@lucide/svelte';
4
+ import TooltipButton from './TooltipButton.svelte';
5
+
6
+ interface Props {
7
+ /** The actual current value */
8
+ value: number;
9
+ /** The baseline/expected value to compare against */
10
+ baseline: number;
11
+ /** Threshold percentage to trigger an anomaly (e.g. 0.2 means 20% diff) */
12
+ threshold?: number;
13
+ /** Optional label formatting */
14
+ formatter?: (val: number) => string;
15
+ /** If true, lower is better (e.g. latency). Default false (higher is better e.g. revenue). */
16
+ lowerIsBetter?: boolean;
17
+ class?: string;
18
+ }
19
+
20
+ let {
21
+ value,
22
+ baseline,
23
+ threshold = 0.2,
24
+ formatter = (v) => v.toString(),
25
+ lowerIsBetter = false,
26
+ class: className = ''
27
+ }: Props = $props();
28
+
29
+ // Calculate percentage difference
30
+ const diff = $derived(baseline === 0 ? 0 : (value - baseline) / Math.abs(baseline));
31
+ const isAnomaly = $derived(Math.abs(diff) >= threshold);
32
+
33
+ // Determine sentiment (good, bad, neutral)
34
+ const isGood = $derived(
35
+ !isAnomaly ? null :
36
+ (lowerIsBetter ? diff < 0 : diff > 0)
37
+ );
38
+
39
+ const percentLabel = $derived(`${Math.abs(diff * 100).toFixed(1)}%`);
40
+ </script>
41
+
42
+ {#if !isAnomaly}
43
+ <span class="text-muted-foreground text-sm font-medium {className}">
44
+ {formatter(value)}
45
+ </span>
46
+ {:else}
47
+ <TooltipButton
48
+ tooltip={`Baseline: ${formatter(baseline)} (${diff > 0 ? '+' : '-'}${percentLabel})`}
49
+ variant="ghost"
50
+ size="sm"
51
+ class="p-0 h-auto hover:bg-transparent"
52
+ >
53
+ <Badge
54
+ variant={isGood ? 'default' : 'destructive'}
55
+ class="flex items-center gap-1 font-mono text-xs px-1.5 py-0 {isGood ? 'bg-success hover:bg-success/90 text-success-foreground' : ''} {className}"
56
+ >
57
+ {#if diff > 0}
58
+ <TrendingUp class="h-3 w-3" />
59
+ {:else}
60
+ <TrendingDown class="h-3 w-3" />
61
+ {/if}
62
+ {formatter(value)}
63
+ </Badge>
64
+ </TooltipButton>
65
+ {/if}
@@ -0,0 +1,16 @@
1
+ interface Props {
2
+ /** The actual current value */
3
+ value: number;
4
+ /** The baseline/expected value to compare against */
5
+ baseline: number;
6
+ /** Threshold percentage to trigger an anomaly (e.g. 0.2 means 20% diff) */
7
+ threshold?: number;
8
+ /** Optional label formatting */
9
+ formatter?: (val: number) => string;
10
+ /** If true, lower is better (e.g. latency). Default false (higher is better e.g. revenue). */
11
+ lowerIsBetter?: boolean;
12
+ class?: string;
13
+ }
14
+ declare const AnomalyBadge: import("svelte").Component<Props, {}, "">;
15
+ type AnomalyBadge = ReturnType<typeof AnomalyBadge>;
16
+ export default AnomalyBadge;
@@ -0,0 +1,183 @@
1
+ <script lang="ts">
2
+ import { t } from '@svadmin/core/i18n';
3
+ import { getTheme, setTheme, getResolvedTheme, colorThemes, getColorTheme, setColorTheme, getColorPresets } from '@svadmin/core';
4
+ import { getLocale, setLocale, getAvailableLocales } from '@svadmin/core/i18n';
5
+ import * as Card from './ui/card/index.js';
6
+ import { Button } from './ui/button/index.js';
7
+ import { Sun, Moon, Monitor, Check } from '@lucide/svelte';
8
+
9
+ // Theme mode
10
+ const themeOptions = [
11
+ { value: 'light' as const, icon: Sun, label: 'settings.light' },
12
+ { value: 'dark' as const, icon: Moon, label: 'settings.dark' },
13
+ { value: 'system' as const, icon: Monitor, label: 'settings.systemTheme' },
14
+ ];
15
+
16
+ let currentTheme = $derived(getTheme());
17
+ let currentColor = $derived(getColorTheme());
18
+ let currentLocale = $derived(getLocale());
19
+ const availableLocales = getAvailableLocales();
20
+ const presets = getColorPresets();
21
+
22
+ // Sidebar density
23
+ const DENSITY_KEY = 'svadmin-sidebar-density';
24
+ let density = $state<'compact' | 'standard'>(
25
+ (typeof localStorage !== 'undefined' ? localStorage.getItem(DENSITY_KEY) : null) as 'compact' | 'standard' ?? 'standard'
26
+ );
27
+
28
+ function setDensity(d: 'compact' | 'standard') {
29
+ density = d;
30
+ if (typeof localStorage !== 'undefined') localStorage.setItem(DENSITY_KEY, d);
31
+ }
32
+
33
+ // Page size
34
+ const PAGE_SIZE_KEY = 'svadmin-default-page-size';
35
+ const pageSizeOptions = [10, 20, 50];
36
+ let pageSize = $state<number>(
37
+ typeof localStorage !== 'undefined' ? parseInt(localStorage.getItem(PAGE_SIZE_KEY) ?? '10', 10) : 10
38
+ );
39
+
40
+ function setPageSize(size: number) {
41
+ pageSize = size;
42
+ if (typeof localStorage !== 'undefined') localStorage.setItem(PAGE_SIZE_KEY, String(size));
43
+ }
44
+
45
+ // Locale display names
46
+ const localeNames: Record<string, string> = {
47
+ 'zh-CN': '中文(简体)',
48
+ 'en': 'English',
49
+ 'ja': '日本語',
50
+ 'ko': '한국어',
51
+ };
52
+ </script>
53
+
54
+ <div class="space-y-6">
55
+ <div>
56
+ <h2 class="text-xl font-semibold text-foreground">{t('settings.appearance')}</h2>
57
+ <p class="text-sm text-muted-foreground mt-1">{t('settings.settingsDescription')}</p>
58
+ </div>
59
+
60
+ <!-- Theme Mode -->
61
+ <Card.Card>
62
+ <Card.CardHeader class="pb-3">
63
+ <Card.CardTitle class="text-base">{t('settings.themeMode')}</Card.CardTitle>
64
+ </Card.CardHeader>
65
+ <Card.CardContent>
66
+ <div class="grid grid-cols-3 gap-3">
67
+ {#each themeOptions as opt}
68
+ {@const active = currentTheme === opt.value}
69
+ <button
70
+ class="relative flex flex-col items-center gap-2 rounded-xl border-2 p-4 transition-all duration-200
71
+ {active
72
+ ? 'border-primary bg-primary/5 shadow-sm'
73
+ : 'border-border hover:border-muted-foreground/30 hover:bg-accent/50'}"
74
+ onclick={() => setTheme(opt.value)}
75
+ >
76
+ {#if active}
77
+ <div class="absolute top-2 right-2">
78
+ <Check class="h-3.5 w-3.5 text-primary" />
79
+ </div>
80
+ {/if}
81
+ <div class="h-10 w-10 rounded-lg flex items-center justify-center
82
+ {active ? 'bg-primary/10 text-primary' : 'bg-muted text-muted-foreground'}">
83
+ <opt.icon class="h-5 w-5" />
84
+ </div>
85
+ <span class="text-xs font-medium {active ? 'text-primary' : 'text-muted-foreground'}">
86
+ {t(opt.label)}
87
+ </span>
88
+ </button>
89
+ {/each}
90
+ </div>
91
+ </Card.CardContent>
92
+ </Card.Card>
93
+
94
+ <!-- Color Accent -->
95
+ <Card.Card>
96
+ <Card.CardHeader class="pb-3">
97
+ <Card.CardTitle class="text-base">{t('settings.colorAccent')}</Card.CardTitle>
98
+ </Card.CardHeader>
99
+ <Card.CardContent>
100
+ <div class="flex flex-wrap gap-3">
101
+ {#each presets as preset}
102
+ {@const active = currentColor === preset.name}
103
+ <button
104
+ class="group relative h-9 w-9 rounded-full transition-all duration-200 hover:scale-110
105
+ {active ? 'ring-2 ring-offset-2 ring-offset-background scale-110' : 'opacity-70 hover:opacity-100'}"
106
+ style="background-color: {preset.color}; {active ? `--tw-ring-color: ${preset.color}` : ''}"
107
+ onclick={() => setColorTheme(preset.name as Parameters<typeof setColorTheme>[0])}
108
+ title={preset.label}
109
+ >
110
+ {#if active}
111
+ <Check class="h-4 w-4 text-white absolute inset-0 m-auto drop-shadow-sm" />
112
+ {/if}
113
+ </button>
114
+ {/each}
115
+ </div>
116
+ </Card.CardContent>
117
+ </Card.Card>
118
+
119
+ <!-- Interface -->
120
+ <Card.Card>
121
+ <Card.CardHeader class="pb-3">
122
+ <Card.CardTitle class="text-base">{t('settings.interface')}</Card.CardTitle>
123
+ </Card.CardHeader>
124
+ <Card.CardContent class="space-y-5">
125
+ <!-- Language -->
126
+ <div class="flex items-center justify-between">
127
+ <div>
128
+ <p class="text-sm font-medium text-foreground">{t('settings.language')}</p>
129
+ <p class="text-xs text-muted-foreground">{localeNames[currentLocale] ?? currentLocale}</p>
130
+ </div>
131
+ <select
132
+ class="h-9 rounded-md border border-input bg-background px-3 text-sm ring-offset-background
133
+ focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2"
134
+ value={currentLocale}
135
+ onchange={(e) => setLocale((e.target as HTMLSelectElement).value)}
136
+ >
137
+ {#each availableLocales as loc}
138
+ <option value={loc}>{localeNames[loc] ?? loc}</option>
139
+ {/each}
140
+ </select>
141
+ </div>
142
+
143
+ <div class="h-px bg-border"></div>
144
+
145
+ <!-- Sidebar Density -->
146
+ <div class="flex items-center justify-between">
147
+ <div>
148
+ <p class="text-sm font-medium text-foreground">{t('settings.sidebarDensity')}</p>
149
+ </div>
150
+ <div class="flex rounded-lg border border-input overflow-hidden">
151
+ <button
152
+ class="px-3 py-1.5 text-xs font-medium transition-colors
153
+ {density === 'compact' ? 'bg-primary text-primary-foreground' : 'bg-background text-muted-foreground hover:bg-accent'}"
154
+ onclick={() => setDensity('compact')}
155
+ >{t('settings.compact')}</button>
156
+ <button
157
+ class="px-3 py-1.5 text-xs font-medium transition-colors
158
+ {density === 'standard' ? 'bg-primary text-primary-foreground' : 'bg-background text-muted-foreground hover:bg-accent'}"
159
+ onclick={() => setDensity('standard')}
160
+ >{t('settings.standard')}</button>
161
+ </div>
162
+ </div>
163
+
164
+ <div class="h-px bg-border"></div>
165
+
166
+ <!-- Default Page Size -->
167
+ <div class="flex items-center justify-between">
168
+ <div>
169
+ <p class="text-sm font-medium text-foreground">{t('settings.defaultPageSize')}</p>
170
+ </div>
171
+ <div class="flex rounded-lg border border-input overflow-hidden">
172
+ {#each pageSizeOptions as size}
173
+ <button
174
+ class="px-3 py-1.5 text-xs font-mono font-medium transition-colors
175
+ {pageSize === size ? 'bg-primary text-primary-foreground' : 'bg-background text-muted-foreground hover:bg-accent'}"
176
+ onclick={() => setPageSize(size)}
177
+ >{size}</button>
178
+ {/each}
179
+ </div>
180
+ </div>
181
+ </Card.CardContent>
182
+ </Card.Card>
183
+ </div>
@@ -0,0 +1,3 @@
1
+ declare const AppearanceSettings: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type AppearanceSettings = ReturnType<typeof AppearanceSettings>;
3
+ export default AppearanceSettings;
@@ -0,0 +1,93 @@
1
+ <script lang="ts">
2
+ import { getAuditLogProvider, t } from '@svadmin/core';
3
+ import type { AuditEntry } from '@svadmin/core';
4
+ import * as Sheet from './ui/sheet/index.js';
5
+ import { History, Loader2 } from '@lucide/svelte';
6
+
7
+ let { open = $bindable(false), resource, recordId } = $props<{
8
+ open: boolean;
9
+ resource: string;
10
+ recordId?: string | number;
11
+ }>();
12
+
13
+ let logs = $state<AuditEntry[]>([]);
14
+ let isLoading = $state(false);
15
+
16
+ $effect(() => {
17
+ if (open) {
18
+ const provider = getAuditLogProvider();
19
+ if (provider) {
20
+ isLoading = true;
21
+ provider.get({ resource, meta: recordId ? { recordId } : undefined })
22
+ .then((data) => {
23
+ logs = data;
24
+ isLoading = false;
25
+ })
26
+ .catch((err) => {
27
+ console.error('[svadmin] Failed to fetch audit logs', err);
28
+ isLoading = false;
29
+ });
30
+ }
31
+ }
32
+ });
33
+
34
+ // Action semantic color mapping
35
+ function getActionColor(action: string) {
36
+ switch (action) {
37
+ case 'create': return 'bg-success';
38
+ case 'update': return 'bg-info';
39
+ case 'delete': return 'bg-destructive';
40
+ default: return 'bg-muted-foreground';
41
+ }
42
+ }
43
+ </script>
44
+
45
+ <Sheet.Root bind:open>
46
+ <Sheet.Content class="w-full sm:max-w-md overflow-y-auto">
47
+ <Sheet.Header>
48
+ <Sheet.Title class="flex items-center gap-2">
49
+ <History class="h-5 w-5" />
50
+ {t('common.history') || 'History'}
51
+ </Sheet.Title>
52
+ <Sheet.Description>
53
+ Audit log and revision history for this record.
54
+ </Sheet.Description>
55
+ </Sheet.Header>
56
+
57
+ <div class="mt-8 space-y-4">
58
+ {#if isLoading}
59
+ <div class="flex justify-center py-8 text-muted-foreground">
60
+ <Loader2 class="h-6 w-6 animate-spin" />
61
+ </div>
62
+ {:else if logs.length === 0}
63
+ <div class="text-center py-10">
64
+ <History class="h-8 w-8 mx-auto text-muted-foreground/30 mb-3" />
65
+ <p class="text-sm text-muted-foreground">
66
+ {t('common.noData') || 'No audit logs found'}
67
+ </p>
68
+ </div>
69
+ {:else}
70
+ <div class="relative border-l border-border ml-3 pl-6 space-y-8">
71
+ {#each logs as log}
72
+ <div class="relative">
73
+ <span class="absolute -left-7 top-1 flex h-2 w-2 items-center justify-center rounded-full ring-4 ring-background {getActionColor(log.action)}"></span>
74
+ <div class="flex flex-col gap-1.5">
75
+ <div class="flex items-center gap-2 justify-between">
76
+ <span class="text-sm font-semibold capitalize">{log.action}</span>
77
+ <span class="text-xs text-muted-foreground">
78
+ {new Date(log.timestamp).toLocaleString()}
79
+ </span>
80
+ </div>
81
+ {#if log.userId}
82
+ <span class="text-xs text-muted-foreground font-mono bg-muted inline-flex px-1.5 py-0.5 rounded w-fit">
83
+ User: {log.userId}
84
+ </span>
85
+ {/if}
86
+ </div>
87
+ </div>
88
+ {/each}
89
+ </div>
90
+ {/if}
91
+ </div>
92
+ </Sheet.Content>
93
+ </Sheet.Root>
@@ -0,0 +1,8 @@
1
+ type $$ComponentProps = {
2
+ open: boolean;
3
+ resource: string;
4
+ recordId?: string | number;
5
+ };
6
+ declare const AuditLogDrawer: import("svelte").Component<$$ComponentProps, {}, "open">;
7
+ type AuditLogDrawer = ReturnType<typeof AuditLogDrawer>;
8
+ export default AuditLogDrawer;
@@ -0,0 +1,226 @@
1
+ <script lang="ts">
2
+ import { t } from '@svadmin/core/i18n';
3
+ import { getAuthProvider } from '@svadmin/core';
4
+ import type { AuditLog } from '@svadmin/core';
5
+ import { toast } from '@svadmin/core/toast';
6
+ import * as Table from './ui/table/index.js';
7
+ import { Badge } from './ui/badge/index.js';
8
+ import { Button } from './ui/button/index.js';
9
+ import { Input } from './ui/input/index.js';
10
+ import { Loader2, ChevronLeft, ChevronRight, Search, FileSearch, Eye, X } from '@lucide/svelte';
11
+
12
+ const authProvider = getAuthProvider();
13
+
14
+ let logs = $state<AuditLog[]>([]);
15
+ let total = $state(0);
16
+ let page = $state(1);
17
+ let pageSize = 20;
18
+ let loading = $state(true);
19
+ let error = $state<string | null>(null);
20
+ let searchQuery = $state('');
21
+
22
+ // Snapshot drawer
23
+ let drawerOpen = $state(false);
24
+ let drawerLog = $state<AuditLog | null>(null);
25
+
26
+ async function loadLogs() {
27
+ if (!authProvider?.getAuditLogs) {
28
+ error = t('settings.auditNotSupported') ?? 'Audit logs are not supported by the current AuthProvider';
29
+ loading = false;
30
+ return;
31
+ }
32
+ loading = true;
33
+ try {
34
+ const result = await authProvider.getAuditLogs({ page, pageSize });
35
+ logs = result.data;
36
+ total = result.total;
37
+ } catch (e) {
38
+ toast.error((e as Error).message);
39
+ } finally {
40
+ loading = false;
41
+ }
42
+ }
43
+
44
+ $effect(() => {
45
+ loadLogs();
46
+ });
47
+
48
+ let totalPages = $derived(Math.ceil(total / pageSize) || 1);
49
+
50
+ let filteredLogs = $derived(
51
+ searchQuery.trim()
52
+ ? logs.filter(l =>
53
+ (l.userName ?? '').toLowerCase().includes(searchQuery.toLowerCase()) ||
54
+ l.action.toLowerCase().includes(searchQuery.toLowerCase()) ||
55
+ (l.resource ?? '').toLowerCase().includes(searchQuery.toLowerCase())
56
+ )
57
+ : logs
58
+ );
59
+
60
+ function openSnapshot(log: AuditLog) {
61
+ drawerLog = log;
62
+ drawerOpen = true;
63
+ }
64
+
65
+ function formatDate(d: string | Date) {
66
+ return new Date(d).toLocaleString();
67
+ }
68
+
69
+ function getActionColor(action: string): 'default' | 'secondary' | 'destructive' | 'outline' {
70
+ const a = action.toLowerCase();
71
+ if (a.includes('delete') || a.includes('remove')) return 'destructive';
72
+ if (a.includes('create') || a.includes('add')) return 'default';
73
+ if (a.includes('update') || a.includes('edit')) return 'secondary';
74
+ return 'outline';
75
+ }
76
+ </script>
77
+
78
+ <div class="h-full flex flex-col">
79
+ <!-- Header -->
80
+ <div class="mb-6">
81
+ <h2 class="text-xl font-semibold text-foreground flex items-center gap-2">
82
+ <FileSearch class="h-5 w-5 text-muted-foreground" />
83
+ {t('settings.auditLogs') ?? 'Audit Logs'}
84
+ </h2>
85
+ <p class="text-sm text-muted-foreground mt-1">
86
+ {t('settings.auditDescription') ?? 'Track and review all system operations for compliance and debugging.'}
87
+ </p>
88
+ </div>
89
+
90
+ {#if error}
91
+ <div class="p-6 border border-destructive/20 bg-destructive/5 text-destructive rounded-lg text-center">
92
+ <p>{error}</p>
93
+ </div>
94
+ {:else}
95
+ <!-- Search Bar -->
96
+ <div class="mb-4 relative">
97
+ <Search class="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
98
+ <Input
99
+ bind:value={searchQuery}
100
+ placeholder={t('settings.searchLogs') ?? 'Search by user, action, or resource...'}
101
+ class="pl-9"
102
+ />
103
+ </div>
104
+
105
+ <!-- Table -->
106
+ <div class="flex-1 shadow-sm ring-1 ring-border/10 rounded-lg bg-card overflow-hidden">
107
+ {#if loading}
108
+ <div class="flex items-center justify-center h-48 text-muted-foreground">
109
+ <Loader2 class="h-5 w-5 animate-spin mr-2" />
110
+ {t('common.loading')}
111
+ </div>
112
+ {:else}
113
+ <div class="overflow-auto">
114
+ <Table.Root>
115
+ <Table.Header>
116
+ <Table.Row>
117
+ <Table.Head class="w-[160px]">{t('settings.auditTime') ?? 'Time'}</Table.Head>
118
+ <Table.Head>{t('settings.auditUser') ?? 'User'}</Table.Head>
119
+ <Table.Head>{t('settings.auditAction') ?? 'Action'}</Table.Head>
120
+ <Table.Head>{t('settings.auditResource') ?? 'Resource'}</Table.Head>
121
+ <Table.Head class="w-[120px]">{t('settings.auditIp') ?? 'IP Address'}</Table.Head>
122
+ <Table.Head class="w-[60px] text-center">{t('common.detail') ?? 'Detail'}</Table.Head>
123
+ </Table.Row>
124
+ </Table.Header>
125
+ <Table.Body>
126
+ {#each filteredLogs as log}
127
+ <Table.Row class="border-0 even:bg-muted/20 hover:bg-muted/40 transition-colors">
128
+ <Table.Cell class="text-xs text-muted-foreground font-mono">
129
+ {formatDate(log.createdAt)}
130
+ </Table.Cell>
131
+ <Table.Cell class="text-sm font-medium">{log.userName ?? log.userId ?? '—'}</Table.Cell>
132
+ <Table.Cell>
133
+ <Badge variant={getActionColor(log.action)}>{log.action}</Badge>
134
+ </Table.Cell>
135
+ <Table.Cell class="text-sm text-muted-foreground">{log.resource ?? '—'}</Table.Cell>
136
+ <Table.Cell class="text-xs text-muted-foreground font-mono">{log.ipAddress ?? '—'}</Table.Cell>
137
+ <Table.Cell class="text-center">
138
+ {#if log.details}
139
+ <Button variant="ghost" size="icon" class="h-7 w-7" onclick={() => openSnapshot(log)}>
140
+ <Eye class="h-3.5 w-3.5" />
141
+ </Button>
142
+ {/if}
143
+ </Table.Cell>
144
+ </Table.Row>
145
+ {:else}
146
+ <Table.Row>
147
+ <Table.Cell colspan={6} class="h-24 text-center text-muted-foreground">
148
+ {t('common.noData')}
149
+ </Table.Cell>
150
+ </Table.Row>
151
+ {/each}
152
+ </Table.Body>
153
+ </Table.Root>
154
+ </div>
155
+ {/if}
156
+ </div>
157
+
158
+ <!-- Pagination -->
159
+ <div class="mt-4 flex items-center justify-between text-sm text-muted-foreground">
160
+ <span>{total} {t('settings.auditTotal') ?? 'total records'}</span>
161
+ <div class="flex items-center gap-2">
162
+ <Button
163
+ variant="outline" size="sm"
164
+ disabled={page <= 1}
165
+ onclick={() => { page--; loadLogs(); }}
166
+ >
167
+ <ChevronLeft class="h-4 w-4" />
168
+ </Button>
169
+ <span>{page} / {totalPages}</span>
170
+ <Button
171
+ variant="outline" size="sm"
172
+ disabled={page >= totalPages}
173
+ onclick={() => { page++; loadLogs(); }}
174
+ >
175
+ <ChevronRight class="h-4 w-4" />
176
+ </Button>
177
+ </div>
178
+ </div>
179
+ {/if}
180
+ </div>
181
+
182
+ <!-- Snapshot Drawer -->
183
+ {#if drawerOpen && drawerLog}
184
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
185
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
186
+ <div class="fixed inset-0 z-[100] flex justify-end bg-black/40 backdrop-blur-sm" onclick={() => drawerOpen = false}>
187
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
188
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
189
+ <div class="bg-card shadow-2xl w-full max-w-2xl h-full flex flex-col animate-in slide-in-from-right duration-300" onclick={(e) => e.stopPropagation()}>
190
+ <!-- Drawer Header -->
191
+ <div class="p-6 shadow-[0_1px_0_rgba(0,0,0,0.05)] dark:shadow-[0_1px_0_rgba(255,255,255,0.05)] flex items-center justify-between bg-muted/30">
192
+ <div>
193
+ <h2 class="text-lg font-bold text-foreground flex items-center gap-2">
194
+ <FileSearch class="h-5 w-5 text-primary" />
195
+ {t('settings.auditSnapshot') ?? 'Change Snapshot'}
196
+ </h2>
197
+ <p class="text-xs text-muted-foreground mt-1">{formatDate(drawerLog.createdAt)} · {drawerLog.userName ?? drawerLog.userId}</p>
198
+ </div>
199
+ <button onclick={() => drawerOpen = false} class="text-muted-foreground hover:text-foreground transition p-2 rounded-lg hover:bg-muted">
200
+ <X class="w-5 h-5" />
201
+ </button>
202
+ </div>
203
+
204
+ <!-- Meta Tags -->
205
+ <div class="px-6 py-3 shadow-[0_1px_0_rgba(0,0,0,0.05)] dark:shadow-[0_1px_0_rgba(255,255,255,0.05)] flex items-center gap-2 flex-wrap">
206
+ <Badge variant="outline">{drawerLog.action}</Badge>
207
+ {#if drawerLog.resource}
208
+ <Badge variant="secondary">{drawerLog.resource}</Badge>
209
+ {/if}
210
+ {#if drawerLog.ipAddress}
211
+ <Badge variant="outline" class="font-mono text-xs">{drawerLog.ipAddress}</Badge>
212
+ {/if}
213
+ </div>
214
+
215
+ <!-- JSON Diff Viewer -->
216
+ <div class="flex-1 p-6 overflow-y-auto bg-foreground/[0.03] dark:bg-background/50">
217
+ <pre class="whitespace-pre-wrap text-xs font-mono leading-relaxed text-foreground/80 bg-muted/30 rounded-lg p-4 border border-border">{typeof drawerLog.details === 'object' ? JSON.stringify(drawerLog.details, null, 2) : drawerLog.details}</pre>
218
+ </div>
219
+
220
+ <!-- Footer -->
221
+ <div class="p-4 shadow-[0_-1px_0_rgba(0,0,0,0.05)] dark:shadow-[0_-1px_0_rgba(255,255,255,0.05)] bg-muted/20 text-right text-[11px] text-muted-foreground font-medium">
222
+ System audit snapshot · Read-only
223
+ </div>
224
+ </div>
225
+ </div>
226
+ {/if}
@@ -0,0 +1,3 @@
1
+ declare const AuditLogViewer: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type AuditLogViewer = ReturnType<typeof AuditLogViewer>;
3
+ export default AuditLogViewer;
@@ -0,0 +1,51 @@
1
+ <script lang="ts">
2
+ import { useIsAuthenticated } from '@svadmin/core';
3
+ import type { Snippet } from 'svelte';
4
+ import { navigate } from '@svadmin/core';
5
+
6
+ let {
7
+ children,
8
+ fallback,
9
+ loading,
10
+ redirectTo = '/login',
11
+ appendCurrentPathToQuery = true,
12
+ } = $props<{
13
+ children?: Snippet;
14
+ fallback?: Snippet;
15
+ loading?: Snippet;
16
+ redirectTo?: string;
17
+ appendCurrentPathToQuery?: boolean;
18
+ }>();
19
+
20
+ const isAuth = useIsAuthenticated();
21
+
22
+ function triggerRedirect() {
23
+ if (fallback) return;
24
+ let url = redirectTo;
25
+ if (appendCurrentPathToQuery && typeof window !== 'undefined') {
26
+ const current = encodeURIComponent(window.location.pathname + window.location.search);
27
+ url += `?to=${current}`;
28
+ }
29
+ navigate(url);
30
+ }
31
+
32
+ $effect(() => {
33
+ if (!isAuth.isLoading && !isAuth.isAuthenticated) {
34
+ triggerRedirect();
35
+ }
36
+ });
37
+ </script>
38
+
39
+ {#if isAuth.isLoading}
40
+ {#if loading}
41
+ {@render loading()}
42
+ {/if}
43
+ {:else if isAuth.isAuthenticated}
44
+ {#if children}
45
+ {@render children()}
46
+ {/if}
47
+ {:else}
48
+ {#if fallback}
49
+ {@render fallback()}
50
+ {/if}
51
+ {/if}
@@ -0,0 +1,11 @@
1
+ import type { Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ children?: Snippet;
4
+ fallback?: Snippet;
5
+ loading?: Snippet;
6
+ redirectTo?: string;
7
+ appendCurrentPathToQuery?: boolean;
8
+ };
9
+ declare const Authenticated: import("svelte").Component<$$ComponentProps, {}, "">;
10
+ type Authenticated = ReturnType<typeof Authenticated>;
11
+ export default Authenticated;