@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,11 @@
1
+ interface Props {
2
+ /** The raw markdown string to render */
3
+ content: string;
4
+ /** Whether to enable streaming/typing effect styling */
5
+ streaming?: boolean;
6
+ /** Custom class for the container */
7
+ class?: string;
8
+ }
9
+ declare const MarkdownRenderer: import("svelte").Component<Props, {}, "">;
10
+ type MarkdownRenderer = ReturnType<typeof MarkdownRenderer>;
11
+ export default MarkdownRenderer;
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { FieldDefinition } from '@svadmin/core';
4
+ import { getResource, useForm } from '@svadmin/core';
5
+ import { t } from '@svadmin/core/i18n';
6
+ import * as Dialog from './ui/dialog/index.js';
7
+ import AutoForm from './AutoForm.svelte';
8
+
9
+ let { resourceName, mode = 'create', id, open = $bindable(false), onSuccess } = $props<{
10
+ resourceName: string;
11
+ mode?: 'create' | 'edit';
12
+ id?: string | number;
13
+ open: boolean;
14
+ onSuccess?: () => void;
15
+ }>();
16
+
17
+ const resource = $derived(getResource(resourceName));
18
+ const fieldCount = $derived(resource.fields.filter(f => f.showInForm !== false).length);
19
+ const dialogWidth = $derived(fieldCount > 8 ? 'sm:max-w-3xl' : fieldCount > 5 ? 'sm:max-w-2xl' : 'sm:max-w-lg');
20
+
21
+ function handleClose() {
22
+ open = false;
23
+ onSuccess?.();
24
+ }
25
+ </script>
26
+
27
+ {#if open}
28
+ <Dialog.Dialog bind:open>
29
+ <Dialog.DialogContent class="{dialogWidth} max-h-[85vh] overflow-y-auto">
30
+ <Dialog.DialogHeader>
31
+ <Dialog.DialogTitle>
32
+ {mode === 'create' ? `${t('common.create')}${resource.label}` : `${t('common.edit')}${resource.label}`}
33
+ </Dialog.DialogTitle>
34
+ </Dialog.DialogHeader>
35
+ <AutoForm {resourceName} {mode} {id} />
36
+ </Dialog.DialogContent>
37
+ </Dialog.Dialog>
38
+ {/if}
@@ -0,0 +1,10 @@
1
+ type $$ComponentProps = {
2
+ resourceName: string;
3
+ mode?: 'create' | 'edit';
4
+ id?: string | number;
5
+ open: boolean;
6
+ onSuccess?: () => void;
7
+ };
8
+ declare const ModalForm: import("svelte").Component<$$ComponentProps, {}, "open">;
9
+ type ModalForm = ReturnType<typeof ModalForm>;
10
+ export default ModalForm;
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import { useMenu } from '@svadmin/core';
3
+ import { navigate } from '@svadmin/core/router';
4
+
5
+ const { menuItems } = useMenu();
6
+
7
+ $effect(() => {
8
+ // Automatically navigate to the first defined resource
9
+ if (menuItems.length > 0) {
10
+ navigate(menuItems[0].route);
11
+ }
12
+ });
13
+ </script>
14
+
15
+ <div class="flex h-screen w-screen items-center justify-center p-4 text-muted-foreground">
16
+ <div class="text-center">
17
+ <div class="mb-4 inline-block h-8 w-8 animate-spin rounded-full border-4 border-primary border-r-transparent"></div>
18
+ <p>Navigating to default resource...</p>
19
+ </div>
20
+ </div>
@@ -0,0 +1,3 @@
1
+ declare const NavigateToResource: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type NavigateToResource = ReturnType<typeof NavigateToResource>;
3
+ export default NavigateToResource;
@@ -0,0 +1,39 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import Breadcrumbs from './Breadcrumbs.svelte';
4
+
5
+ interface Props {
6
+ title: string;
7
+ description?: string;
8
+ actions?: Snippet;
9
+ showBreadcrumbs?: boolean;
10
+ class?: string;
11
+ }
12
+
13
+ let {
14
+ title,
15
+ description,
16
+ actions,
17
+ showBreadcrumbs = true,
18
+ class: className = '',
19
+ }: Props = $props();
20
+ </script>
21
+
22
+ <div class="space-y-4 {className}">
23
+ {#if showBreadcrumbs}
24
+ <Breadcrumbs />
25
+ {/if}
26
+ <div class="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
27
+ <div>
28
+ <h1 class="text-xl font-semibold tracking-tight text-foreground">{title}</h1>
29
+ {#if description}
30
+ <p class="text-sm text-muted-foreground">{description}</p>
31
+ {/if}
32
+ </div>
33
+ {#if actions}
34
+ <div class="flex items-center gap-2">
35
+ {@render actions()}
36
+ </div>
37
+ {/if}
38
+ </div>
39
+ </div>
@@ -0,0 +1,11 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ title: string;
4
+ description?: string;
5
+ actions?: Snippet;
6
+ showBreadcrumbs?: boolean;
7
+ class?: string;
8
+ }
9
+ declare const PageHeader: import("svelte").Component<Props, {}, "">;
10
+ type PageHeader = ReturnType<typeof PageHeader>;
11
+ export default PageHeader;
@@ -0,0 +1,71 @@
1
+ <script lang="ts">
2
+ import { fade } from 'svelte/transition';
3
+ import { Skeleton } from './ui/skeleton';
4
+
5
+ let {
6
+ type = 'list',
7
+ rows = 5,
8
+ } = $props<{
9
+ type?: 'list' | 'show' | 'form';
10
+ rows?: number;
11
+ }>();
12
+ </script>
13
+
14
+ <div class="w-full space-y-6" out:fade={{ duration: 200 }}>
15
+ <!-- Header Skeleton -->
16
+ <div class="flex items-center justify-between">
17
+ <div class="space-y-2">
18
+ <Skeleton class="h-8 w-[200px]" />
19
+ <Skeleton class="h-4 w-[300px]" />
20
+ </div>
21
+ {#if type === 'list'}
22
+ <Skeleton class="h-10 w-[120px]" />
23
+ {/if}
24
+ </div>
25
+
26
+ <div class="rounded-md border p-4 space-y-4">
27
+ {#if type === 'list'}
28
+ <!-- Table Header -->
29
+ <div class="flex gap-4 border-b pb-4">
30
+ {#each Array(4) as _}
31
+ <Skeleton class="h-6 flex-1" />
32
+ {/each}
33
+ </div>
34
+ <!-- Table Rows -->
35
+ <div class="space-y-4">
36
+ {#each Array(rows) as _}
37
+ <div class="flex gap-4">
38
+ <Skeleton class="h-6 flex-1" />
39
+ <Skeleton class="h-6 flex-1" />
40
+ <Skeleton class="h-6 flex-1" />
41
+ <Skeleton class="h-6 flex-1" />
42
+ </div>
43
+ {/each}
44
+ </div>
45
+ {:else if type === 'show'}
46
+ <!-- Key-Value pairs -->
47
+ <div class="space-y-6">
48
+ {#each Array(rows) as _}
49
+ <div class="space-y-2">
50
+ <Skeleton class="h-4 w-[100px]" />
51
+ <Skeleton class="h-6 w-[250px]" />
52
+ </div>
53
+ {/each}
54
+ </div>
55
+ {:else if type === 'form'}
56
+ <!-- Form Inputs -->
57
+ <div class="space-y-6">
58
+ {#each Array(rows) as _}
59
+ <div class="space-y-2">
60
+ <Skeleton class="h-4 w-[100px]" />
61
+ <Skeleton class="h-10 w-full max-w-md" />
62
+ </div>
63
+ {/each}
64
+ <div class="pt-4 flex gap-2">
65
+ <Skeleton class="h-10 w-[100px]" />
66
+ <Skeleton class="h-10 w-[100px]" />
67
+ </div>
68
+ </div>
69
+ {/if}
70
+ </div>
71
+ </div>
@@ -0,0 +1,7 @@
1
+ type $$ComponentProps = {
2
+ type?: 'list' | 'show' | 'form';
3
+ rows?: number;
4
+ };
5
+ declare const PageSkeleton: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type PageSkeleton = ReturnType<typeof PageSkeleton>;
7
+ export default PageSkeleton;
@@ -0,0 +1,96 @@
1
+ <script lang="ts">
2
+ import { Input } from './ui/input/index.js';
3
+ import { Button } from './ui/button/index.js';
4
+ import TooltipButton from './TooltipButton.svelte';
5
+ import { Label } from './ui/label/index.js';
6
+ import { Progress } from './ui/progress/index.js';
7
+ import { Lock, Eye, EyeOff } from '@lucide/svelte';
8
+ import { t } from '@svadmin/core/i18n';
9
+
10
+ interface Props {
11
+ id: string;
12
+ label: string;
13
+ value: string;
14
+ placeholder?: string;
15
+ autocomplete?: string;
16
+ showStrength?: boolean;
17
+ class?: string;
18
+ }
19
+
20
+ let {
21
+ id,
22
+ label,
23
+ value = $bindable(''),
24
+ placeholder = '••••••••',
25
+ autocomplete = 'current-password',
26
+ showStrength = false,
27
+ class: className = '',
28
+ }: Props = $props();
29
+
30
+ let showPassword = $state(false);
31
+
32
+ // Password strength calculation
33
+ const strength = $derived.by(() => {
34
+ if (!showStrength || !value) return 0;
35
+ let score = 0;
36
+ if (value.length >= 8) score += 25;
37
+ if (value.length >= 12) score += 10;
38
+ if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 25;
39
+ if (/\d/.test(value)) score += 20;
40
+ if (/[^a-zA-Z0-9]/.test(value)) score += 20;
41
+ return Math.min(score, 100);
42
+ });
43
+
44
+ const strengthColor = $derived(
45
+ strength < 30 ? 'bg-destructive' :
46
+ strength < 60 ? 'bg-warning' :
47
+ strength < 80 ? 'bg-info' : 'bg-success'
48
+ );
49
+
50
+ const strengthLabel = $derived(
51
+ strength < 30 ? 'Weak' :
52
+ strength < 60 ? 'Fair' :
53
+ strength < 80 ? 'Good' : 'Strong'
54
+ );
55
+ </script>
56
+
57
+ <div class="space-y-2 {className}">
58
+ <Label for={id}>{label}</Label>
59
+ <div class="relative">
60
+ <Lock class="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none z-[1]" />
61
+ <Input
62
+ {id}
63
+ type={showPassword ? 'text' : 'password'}
64
+ {placeholder}
65
+ bind:value
66
+ class="pl-9 pr-9"
67
+ autocomplete={autocomplete as any}
68
+ />
69
+ <TooltipButton
70
+ tooltip={showPassword ? t('common.hidePassword') : t('common.showPassword')}
71
+ variant="ghost"
72
+ size="icon"
73
+ type="button"
74
+ class="absolute right-1 top-1/2 -translate-y-1/2 h-7 w-7 z-[1]"
75
+ onclick={(e) => { e.preventDefault(); showPassword = !showPassword; }}
76
+ tabindex={-1}
77
+ >
78
+ {#if showPassword}
79
+ <EyeOff class="h-4 w-4" />
80
+ {:else}
81
+ <Eye class="h-4 w-4" />
82
+ {/if}
83
+ </TooltipButton>
84
+ </div>
85
+ {#if showStrength && value}
86
+ <div class="flex items-center gap-2">
87
+ <div class="flex-1 h-1.5 rounded-full bg-muted overflow-hidden">
88
+ <div
89
+ class="h-full rounded-full transition-all duration-300 {strengthColor}"
90
+ style="width: {strength}%"
91
+ ></div>
92
+ </div>
93
+ <span class="text-xs text-muted-foreground w-12 text-right">{strengthLabel}</span>
94
+ </div>
95
+ {/if}
96
+ </div>
@@ -0,0 +1,12 @@
1
+ interface Props {
2
+ id: string;
3
+ label: string;
4
+ value: string;
5
+ placeholder?: string;
6
+ autocomplete?: string;
7
+ showStrength?: boolean;
8
+ class?: string;
9
+ }
10
+ declare const PasswordInput: import("svelte").Component<Props, {}, "value">;
11
+ type PasswordInput = ReturnType<typeof PasswordInput>;
12
+ export default PasswordInput;
@@ -0,0 +1,185 @@
1
+ <script lang="ts">
2
+ import { Shield, AlertCircle, Check } from '@lucide/svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import type { RoleInfo, ResourceInfo, ActionInfo } from '../types.js';
5
+
6
+ let {
7
+ // Basic metadata lists
8
+ roles = [],
9
+ resources = [],
10
+ actions = [],
11
+
12
+ // Authorization state resolver
13
+ // isGranted(roleCode, resourceCode, actionCode) => boolean
14
+ isGranted,
15
+
16
+ // Interactive states
17
+ selectedRole = $bindable(roles[0]?.code || ''),
18
+ loading = false,
19
+
20
+ // Feedback and alerts (passed down from upper business logic)
21
+ message = '',
22
+ messageType = 'success', // 'success' | 'error' | 'warning'
23
+ conflictCount = 0,
24
+
25
+ // Custom slots for injecting multi-tenant switchers or security filters
26
+ sidebarExtra,
27
+ headerExtra,
28
+
29
+ // Callback event
30
+ onToggle
31
+ }: {
32
+ roles: RoleInfo[];
33
+ resources: ResourceInfo[];
34
+ actions: ActionInfo[];
35
+ isGranted: (role: string, resource: string, action: string) => boolean;
36
+ selectedRole?: string;
37
+ loading?: boolean;
38
+ message?: string;
39
+ messageType?: 'success' | 'error' | 'warning';
40
+ conflictCount?: number;
41
+ sidebarExtra?: Snippet;
42
+ headerExtra?: Snippet;
43
+ onToggle: (role: string, resource: string, action: string, grant: boolean) => void;
44
+ } = $props();
45
+
46
+ </script>
47
+
48
+ <div class="h-full flex flex-col pt-2">
49
+ <!-- Header Title -->
50
+ <div class="mb-6 flex items-center justify-between">
51
+ <div>
52
+ <h1 class="text-2xl font-bold text-foreground flex items-center gap-2">
53
+ <Shield class="w-6 h-6 text-primary" />
54
+ 统一操作权限矩阵
55
+ </h1>
56
+ <p class="text-muted-foreground mt-1 text-sm">直观配置系统模块与角色的鉴权规则网络。</p>
57
+ </div>
58
+
59
+ <!-- Toast Feedback -->
60
+ {#if message}
61
+ <div class={`px-4 py-2 rounded-lg text-sm font-medium shadow-sm transition-all flex items-center gap-2 ${messageType === 'success' ? 'bg-green-500/10 text-green-600 dark:text-green-400 ring-1 ring-green-500/20' : 'bg-destructive/10 text-destructive ring-1 ring-destructive/20'}`}>
62
+ {#if messageType === 'success'}
63
+ <Check class="w-4 h-4" />
64
+ {:else}
65
+ <AlertCircle class="w-4 h-4" />
66
+ {/if}
67
+ {message}
68
+ </div>
69
+ {/if}
70
+ </div>
71
+
72
+ <div class="flex flex-col md:flex-row gap-6 flex-1 min-h-[500px]">
73
+ <!-- Left: Role Selector Sidebar -->
74
+ <div class="w-full md:w-64 flex-shrink-0 bg-card rounded-xl shadow-sm border border-border p-4 flex flex-col">
75
+ <h2 class="text-sm font-semibold text-muted-foreground uppercase tracking-wider mb-4 px-2">业务受众角色</h2>
76
+ <div class="space-y-1 flex-1 overflow-y-auto">
77
+ {#each roles as role}
78
+ <button
79
+ onclick={() => selectedRole = role.code}
80
+ class="w-full text-left px-3 py-2.5 rounded-lg text-sm transition-all duration-200 {selectedRole === role.code ? 'bg-primary/10 text-primary font-medium shadow-sm ring-1 ring-primary/20' : 'text-foreground hover:bg-muted'}"
81
+ >
82
+ {role.name}
83
+ <div class="text-[10px] mt-0.5 opacity-60 font-mono tracking-tighter">{role.code}</div>
84
+ </button>
85
+ {/each}
86
+ {#if roles.length === 0}
87
+ <p class="text-center text-muted-foreground text-sm p-4">暂无角色</p>
88
+ {/if}
89
+ </div>
90
+
91
+ <!-- Slot for Upper Logic inject (e.g. Org Switcher, Security Level Filter) -->
92
+ {#if sidebarExtra}
93
+ <div class="mt-4 pt-4 border-t border-border">
94
+ {@render sidebarExtra()}
95
+ </div>
96
+ {/if}
97
+ </div>
98
+
99
+ <!-- Right: Matrix Grid -->
100
+ <div class="flex-1 bg-card rounded-xl shadow-sm border border-border overflow-hidden flex flex-col">
101
+ <!-- Matrix Header -->
102
+ <div class="p-5 border-b border-border bg-muted/30 flex items-center justify-between">
103
+ <div class="flex items-center gap-4">
104
+ <div>
105
+ <h2 class="text-lg font-bold text-foreground">当前视角:
106
+ <span class="text-primary">{roles.find(r => r.code === selectedRole)?.name || '未选择'}</span>
107
+ </h2>
108
+ <p class="text-xs text-muted-foreground mt-1">勾选以即时挂载/收回操作权限</p>
109
+ </div>
110
+
111
+ <!-- Slot for header extra logic -->
112
+ {#if headerExtra}
113
+ {@render headerExtra()}
114
+ {/if}
115
+ </div>
116
+
117
+ {#if conflictCount > 0}
118
+ <div class="px-3 py-1.5 bg-destructive/10 text-destructive rounded-lg text-xs font-medium ring-1 ring-destructive/20 flex items-center gap-1.5">
119
+ <AlertCircle class="w-4 h-4" /> {conflictCount} 重叠/冲突规则
120
+ </div>
121
+ {/if}
122
+ </div>
123
+
124
+ <!-- Table Area -->
125
+ <div class="flex-1 overflow-auto p-4">
126
+ <table class="min-w-full rounded-lg overflow-hidden shadow-sm ring-1 ring-border/10">
127
+ <thead class="bg-muted/50">
128
+ <tr>
129
+ <th scope="col" class="py-3 pr-3 pl-4 text-left text-sm font-semibold text-foreground w-48">模块域与资源点</th>
130
+ {#each actions as action}
131
+ <th scope="col" class="px-2 py-3 text-center text-sm font-semibold text-foreground">
132
+ <div class="flex flex-col items-center">
133
+ <span>{action.name}</span>
134
+ <span class="text-[10px] text-muted-foreground font-mono">{action.code}</span>
135
+ </div>
136
+ </th>
137
+ {/each}
138
+ </tr>
139
+ </thead>
140
+ <tbody class="bg-card">
141
+ {#if resources.length === 0}
142
+ <tr>
143
+ <td colspan={actions.length + 1} class="py-10 text-center text-muted-foreground">暂无可用资源</td>
144
+ </tr>
145
+ {/if}
146
+ {#each resources as resource, i}
147
+ <!-- Section Grouping Header -->
148
+ {#if resource.section && (i === 0 || resource.section !== resources[i-1].section)}
149
+ <tr class="bg-primary/5">
150
+ <td colspan="{actions.length + 1}" class="px-4 py-2 text-xs font-bold text-primary uppercase tracking-wider">{resource.section}</td>
151
+ </tr>
152
+ {/if}
153
+
154
+ <tr class="even:bg-muted/30 hover:bg-muted/50 transition-colors">
155
+ <td class="whitespace-nowrap py-3 pl-4 pr-3 text-sm">
156
+ <div class="font-medium text-foreground">{resource.name}</div>
157
+ <div class="text-xs text-muted-foreground font-mono">{resource.code}</div>
158
+ </td>
159
+
160
+ <!-- Action Checkboxes -->
161
+ {#each actions as action}
162
+ {@const granted = selectedRole ? isGranted(selectedRole, resource.code, action.code) : false}
163
+ <td class="whitespace-nowrap px-3 py-3 text-center">
164
+ <div class="flex items-center justify-center">
165
+ <button
166
+ disabled={loading || !selectedRole}
167
+ aria-label="Toggle {action.name}"
168
+ onclick={() => onToggle(selectedRole!, resource.code, action.code, !granted)}
169
+ class="w-6 h-6 rounded border flex items-center justify-center transition-all focus:outline-none focus:ring-2 focus:ring-primary/50 {granted ? 'bg-primary border-primary text-primary-foreground' : 'border-input bg-background hover:bg-accent'} {loading || !selectedRole ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}"
170
+ >
171
+ <svg class="w-3.5 h-3.5 {granted ? 'block' : 'hidden'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="3">
172
+ <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
173
+ </svg>
174
+ </button>
175
+ </div>
176
+ </td>
177
+ {/each}
178
+ </tr>
179
+ {/each}
180
+ </tbody>
181
+ </table>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ </div>
@@ -0,0 +1,19 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { RoleInfo, ResourceInfo, ActionInfo } from '../types.js';
3
+ type $$ComponentProps = {
4
+ roles: RoleInfo[];
5
+ resources: ResourceInfo[];
6
+ actions: ActionInfo[];
7
+ isGranted: (role: string, resource: string, action: string) => boolean;
8
+ selectedRole?: string;
9
+ loading?: boolean;
10
+ message?: string;
11
+ messageType?: 'success' | 'error' | 'warning';
12
+ conflictCount?: number;
13
+ sidebarExtra?: Snippet;
14
+ headerExtra?: Snippet;
15
+ onToggle: (role: string, resource: string, action: string, grant: boolean) => void;
16
+ };
17
+ declare const PermissionMatrix: import("svelte").Component<$$ComponentProps, {}, "selectedRole">;
18
+ type PermissionMatrix = ReturnType<typeof PermissionMatrix>;
19
+ export default PermissionMatrix;