@svadmin/ui 0.73.0 → 0.74.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 (295) hide show
  1. package/README.md +53 -28
  2. package/dist/app.css +3733 -4119
  3. package/dist/app.theme.css +3733 -4119
  4. package/dist/component-registry.d.ts +14977 -0
  5. package/dist/component-registry.js +216 -0
  6. package/dist/components/AboutSettings.svelte +7 -1
  7. package/dist/components/AboutSettings.svelte.d.ts +4 -1
  8. package/dist/components/ActivityFeed.svelte +9 -3
  9. package/dist/components/ActivityFeed.svelte.d.ts +3 -0
  10. package/dist/components/AdminApp.svelte +19 -10
  11. package/dist/components/AdminApp.svelte.d.ts +6 -0
  12. package/dist/components/ApiSettings.svelte +41 -5
  13. package/dist/components/ApprovalCenter.svelte +283 -0
  14. package/dist/components/ApprovalCenter.svelte.d.ts +10 -0
  15. package/dist/components/AuditLogViewer.svelte +3 -1
  16. package/dist/components/AutoForm.svelte +33 -3
  17. package/dist/components/AutoForm.svelte.d.ts +1 -0
  18. package/dist/components/AutoTable.svelte +610 -47
  19. package/dist/components/AutoTable.svelte.d.ts +17 -1
  20. package/dist/components/BoundRecordDetailDrawer.svelte +9 -0
  21. package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +2 -0
  22. package/dist/components/Breadcrumbs.svelte +11 -1
  23. package/dist/components/CancelTaskButton.svelte +12 -42
  24. package/dist/components/ColorPicker.svelte +73 -0
  25. package/dist/components/ColorPicker.svelte.d.ts +15 -0
  26. package/dist/components/ComboboxField.svelte +114 -27
  27. package/dist/components/ComboboxField.svelte.d.ts +1 -0
  28. package/dist/components/DashboardView.svelte +99 -0
  29. package/dist/components/DashboardView.svelte.d.ts +14 -0
  30. package/dist/components/DatePicker.svelte +10 -0
  31. package/dist/components/DatePicker.svelte.d.ts +6 -0
  32. package/dist/components/DateRangeInput.svelte +85 -5
  33. package/dist/components/DateRangeInput.svelte.d.ts +10 -0
  34. package/dist/components/DateRangePicker.svelte +10 -0
  35. package/dist/components/DateRangePicker.svelte.d.ts +6 -0
  36. package/dist/components/DateTimeInput.svelte +74 -5
  37. package/dist/components/DateTimeInput.svelte.d.ts +8 -0
  38. package/dist/components/DateTimePicker.svelte +10 -0
  39. package/dist/components/DateTimePicker.svelte.d.ts +6 -0
  40. package/dist/components/DevTools.svelte +34 -26
  41. package/dist/components/DevframePanel.svelte +123 -0
  42. package/dist/components/DevframePanel.svelte.d.ts +3 -0
  43. package/dist/components/ErrorSummary.svelte +52 -0
  44. package/dist/components/ErrorSummary.svelte.d.ts +14 -0
  45. package/dist/components/FieldRenderer.svelte +82 -81
  46. package/dist/components/FileUpload.svelte +214 -52
  47. package/dist/components/FileUpload.svelte.d.ts +11 -0
  48. package/dist/components/FilterBuilder.svelte +88 -66
  49. package/dist/components/FilterCollectionInput.svelte +80 -0
  50. package/dist/components/FilterCollectionInput.svelte.d.ts +10 -0
  51. package/dist/components/GanttChart.svelte +66 -14
  52. package/dist/components/GanttChart.svelte.d.ts +6 -0
  53. package/dist/components/Header.svelte +18 -2
  54. package/dist/components/ImportWizard.svelte +339 -17
  55. package/dist/components/ImportWizard.svelte.d.ts +11 -0
  56. package/dist/components/JsonSchemaForm.svelte +120 -52
  57. package/dist/components/JsonSchemaForm.svelte.d.ts +7 -1
  58. package/dist/components/KanbanBoard.svelte +195 -40
  59. package/dist/components/KanbanBoard.svelte.d.ts +9 -2
  60. package/dist/components/Layout.svelte +4 -2
  61. package/dist/components/LazyAutoForm.svelte +28 -0
  62. package/dist/components/LazyAutoForm.svelte.d.ts +8 -0
  63. package/dist/components/LazyAutoTable.svelte +28 -0
  64. package/dist/components/LazyAutoTable.svelte.d.ts +8 -0
  65. package/dist/components/LazySettingsPage.svelte +28 -0
  66. package/dist/components/LazySettingsPage.svelte.d.ts +8 -0
  67. package/dist/components/LazyShowPage.svelte +28 -0
  68. package/dist/components/LazyShowPage.svelte.d.ts +8 -0
  69. package/dist/components/ListPage.svelte +5 -1
  70. package/dist/components/ListPage.svelte.d.ts +3 -0
  71. package/dist/components/LoginPage.svelte +1 -1
  72. package/dist/components/MultiTabKeepAlive.svelte +11 -6
  73. package/dist/components/NotificationsSettings.svelte +69 -2
  74. package/dist/components/NotificationsSettings.svelte.d.ts +25 -1
  75. package/dist/components/PermissionMatrix.svelte +20 -1
  76. package/dist/components/PivotExportButton.svelte +157 -0
  77. package/dist/components/PivotExportButton.svelte.d.ts +16 -0
  78. package/dist/components/PivotTable.svelte +229 -74
  79. package/dist/components/PivotTable.svelte.d.ts +19 -2
  80. package/dist/components/RadioGroup.svelte +121 -0
  81. package/dist/components/RadioGroup.svelte.d.ts +43 -0
  82. package/dist/components/RangeSlider.svelte +127 -0
  83. package/dist/components/RangeSlider.svelte.d.ts +22 -0
  84. package/dist/components/Rate.svelte +121 -0
  85. package/dist/components/Rate.svelte.d.ts +16 -0
  86. package/dist/components/RecordDetailDrawer.svelte +4 -2
  87. package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
  88. package/dist/components/RelationPicker.svelte +341 -0
  89. package/dist/components/RelationPicker.svelte.d.ts +26 -0
  90. package/dist/components/ResourceOperationsPage.svelte +18 -18
  91. package/dist/components/ResourceOperationsPage.svelte.d.ts +2 -2
  92. package/dist/components/RetryTaskButton.svelte +12 -42
  93. package/dist/components/SecuritySettings.svelte +29 -5
  94. package/dist/components/SegmentedControl.svelte +145 -0
  95. package/dist/components/SegmentedControl.svelte.d.ts +38 -0
  96. package/dist/components/SettingsPage.svelte +3 -1
  97. package/dist/components/SettingsPage.svelte.d.ts +1 -0
  98. package/dist/components/ShowPage.svelte +18 -3
  99. package/dist/components/ShowPage.svelte.d.ts +3 -0
  100. package/dist/components/Sidebar.svelte +2 -2
  101. package/dist/components/Slider.svelte +100 -0
  102. package/dist/components/Slider.svelte.d.ts +19 -0
  103. package/dist/components/SpreadsheetView.svelte +1213 -95
  104. package/dist/components/SpreadsheetView.svelte.d.ts +19 -0
  105. package/dist/components/TagsInput.svelte +178 -0
  106. package/dist/components/TagsInput.svelte.d.ts +17 -0
  107. package/dist/components/TimePicker.svelte +10 -0
  108. package/dist/components/TimePicker.svelte.d.ts +6 -0
  109. package/dist/components/TreeSelect.svelte +267 -53
  110. package/dist/components/TreeSelect.svelte.d.ts +3 -0
  111. package/dist/components/TreeTable.svelte +484 -82
  112. package/dist/components/TreeTable.svelte.d.ts +24 -1
  113. package/dist/components/TwoFactorAuthPage.svelte +85 -48
  114. package/dist/components/TwoFactorAuthPage.svelte.d.ts +12 -1
  115. package/dist/components/VirtualTable.svelte +116 -20
  116. package/dist/components/VirtualTable.svelte.d.ts +5 -0
  117. package/dist/components/account/CompanyProfilePage.svelte +74 -38
  118. package/dist/components/account/GetStartedPage.svelte +2 -1
  119. package/dist/components/account/ImportMembersPage.svelte +22 -167
  120. package/dist/components/account/ImportMembersPage.svelte.d.ts +4 -1
  121. package/dist/components/account/MemberDirectory.svelte +156 -0
  122. package/dist/components/account/MemberDirectory.svelte.d.ts +19 -0
  123. package/dist/components/account/MembersStarterPage.svelte +9 -55
  124. package/dist/components/account/MembersStarterPage.svelte.d.ts +5 -1
  125. package/dist/components/account/SecurityLogPage.svelte +4 -1
  126. package/dist/components/account/SettingsPlainPage.svelte +7 -38
  127. package/dist/components/account/SettingsPlainPage.svelte.d.ts +4 -1
  128. package/dist/components/account/SettingsSidebarPage.svelte +7 -20
  129. package/dist/components/account/TeamMembersPage.svelte +4 -20
  130. package/dist/components/account/TeamMembersPage.svelte.d.ts +5 -1
  131. package/dist/components/account/UserProfilePage.svelte +3 -25
  132. package/dist/components/account/UserProfilePage.svelte.d.ts +17 -2
  133. package/dist/components/buttons/ExportButton.svelte +56 -12
  134. package/dist/components/buttons/ExportButton.svelte.d.ts +11 -0
  135. package/dist/components/content/ContentPageHeader.svelte +1 -1
  136. package/dist/components/content/ContentPageShell.svelte +1 -1
  137. package/dist/components/content/MetricBlock.svelte +1 -1
  138. package/dist/components/content/PageToolbar.svelte +1 -1
  139. package/dist/components/content/ReferenceNotice.svelte +5 -0
  140. package/dist/components/content/ReferenceNotice.svelte.d.ts +18 -0
  141. package/dist/components/content/SectionHeader.svelte +1 -1
  142. package/dist/components/content/SettingsFieldRow.svelte +1 -1
  143. package/dist/components/content/SettingsGroup.svelte +1 -1
  144. package/dist/components/content/StatusBadge.svelte +1 -1
  145. package/dist/components/content/WorkspaceLayout.svelte +1 -1
  146. package/dist/components/export-reference.d.ts +2 -0
  147. package/dist/components/export-reference.js +9 -0
  148. package/dist/components/fieldComponentMap.js +2 -5
  149. package/dist/components/fields/DateField.svelte +12 -13
  150. package/dist/components/fields/date-display.d.ts +6 -0
  151. package/dist/components/fields/date-display.js +24 -0
  152. package/dist/components/network/TeamCrewTablePage.svelte +6 -1
  153. package/dist/components/network/UserCardsNFTPage.svelte +2 -0
  154. package/dist/components/profile/PublicProfilePage.svelte +2 -0
  155. package/dist/components/saved-list-views.d.ts +74 -1
  156. package/dist/components/saved-list-views.js +191 -3
  157. package/dist/components/table-contract.d.ts +12 -1
  158. package/dist/components/task-action.svelte.d.ts +13 -0
  159. package/dist/components/task-action.svelte.js +73 -0
  160. package/dist/components/ui/DesignSystemShowcase.svelte +164 -0
  161. package/dist/components/ui/DesignSystemShowcase.svelte.d.ts +3 -0
  162. package/dist/components/ui/badge/badge-variants.d.ts +3 -2
  163. package/dist/components/ui/badge/badge-variants.js +2 -3
  164. package/dist/components/ui/badge/badge.svelte +3 -0
  165. package/dist/components/ui/badge/badge.svelte.d.ts +1 -0
  166. package/dist/components/ui/button/button-variants.d.ts +5 -4
  167. package/dist/components/ui/button/button-variants.js +7 -5
  168. package/dist/components/ui/checkbox/checkbox.svelte +5 -1
  169. package/dist/components/ui/checkbox/checkbox.svelte.d.ts +5 -1
  170. package/dist/components/ui/input/input.svelte +7 -2
  171. package/dist/components/ui/input/input.svelte.d.ts +4 -1
  172. package/dist/components/ui/select/select.svelte +4 -1
  173. package/dist/components/ui/select/select.svelte.d.ts +2 -1
  174. package/dist/components/ui/textarea/textarea.svelte +2 -2
  175. package/dist/components.css +33 -2
  176. package/dist/date-input-policy.d.ts +4 -0
  177. package/dist/date-input-policy.js +35 -0
  178. package/dist/design-system-components.d.ts +100 -0
  179. package/dist/design-system-components.js +101 -0
  180. package/dist/design-system.js +1 -1
  181. package/dist/devtools-bridge.d.ts +80 -0
  182. package/dist/devtools-bridge.js +92 -0
  183. package/dist/index.d.ts +37 -2
  184. package/dist/index.js +23 -2
  185. package/dist/recipes.d.ts +960 -4
  186. package/dist/recipes.js +264 -4
  187. package/dist/tree-table-model.d.ts +24 -0
  188. package/dist/tree-table-model.js +111 -0
  189. package/package.json +22 -10
  190. package/dist/styled-system/css/conditions.js +0 -36
  191. package/dist/styled-system/css/css.d.ts +0 -22
  192. package/dist/styled-system/css/css.js +0 -45
  193. package/dist/styled-system/css/cva.d.ts +0 -6
  194. package/dist/styled-system/css/cva.js +0 -87
  195. package/dist/styled-system/css/cx.d.ts +0 -5
  196. package/dist/styled-system/css/cx.js +0 -15
  197. package/dist/styled-system/css/index.d.ts +0 -5
  198. package/dist/styled-system/css/index.js +0 -4
  199. package/dist/styled-system/css/sva.d.ts +0 -4
  200. package/dist/styled-system/css/sva.js +0 -46
  201. package/dist/styled-system/helpers.js +0 -316
  202. package/dist/styled-system/patterns/aspect-ratio.d.ts +0 -20
  203. package/dist/styled-system/patterns/aspect-ratio.js +0 -38
  204. package/dist/styled-system/patterns/bleed.d.ts +0 -21
  205. package/dist/styled-system/patterns/bleed.js +0 -24
  206. package/dist/styled-system/patterns/box.d.ts +0 -20
  207. package/dist/styled-system/patterns/box.js +0 -15
  208. package/dist/styled-system/patterns/center.d.ts +0 -20
  209. package/dist/styled-system/patterns/center.js +0 -21
  210. package/dist/styled-system/patterns/circle.d.ts +0 -20
  211. package/dist/styled-system/patterns/circle.js +0 -25
  212. package/dist/styled-system/patterns/container.d.ts +0 -20
  213. package/dist/styled-system/patterns/container.js +0 -21
  214. package/dist/styled-system/patterns/cq.d.ts +0 -21
  215. package/dist/styled-system/patterns/cq.js +0 -21
  216. package/dist/styled-system/patterns/divider.d.ts +0 -22
  217. package/dist/styled-system/patterns/divider.js +0 -25
  218. package/dist/styled-system/patterns/flex.d.ts +0 -26
  219. package/dist/styled-system/patterns/flex.js +0 -26
  220. package/dist/styled-system/patterns/float.d.ts +0 -23
  221. package/dist/styled-system/patterns/float.js +0 -52
  222. package/dist/styled-system/patterns/grid-item.d.ts +0 -25
  223. package/dist/styled-system/patterns/grid-item.js +0 -25
  224. package/dist/styled-system/patterns/grid.d.ts +0 -24
  225. package/dist/styled-system/patterns/grid.js +0 -27
  226. package/dist/styled-system/patterns/hstack.d.ts +0 -21
  227. package/dist/styled-system/patterns/hstack.js +0 -24
  228. package/dist/styled-system/patterns/index.d.ts +0 -21
  229. package/dist/styled-system/patterns/index.js +0 -20
  230. package/dist/styled-system/patterns/link-overlay.d.ts +0 -20
  231. package/dist/styled-system/patterns/link-overlay.js +0 -24
  232. package/dist/styled-system/patterns/spacer.d.ts +0 -20
  233. package/dist/styled-system/patterns/spacer.js +0 -25
  234. package/dist/styled-system/patterns/square.d.ts +0 -20
  235. package/dist/styled-system/patterns/square.js +0 -24
  236. package/dist/styled-system/patterns/stack.d.ts +0 -23
  237. package/dist/styled-system/patterns/stack.js +0 -24
  238. package/dist/styled-system/patterns/visually-hidden.d.ts +0 -20
  239. package/dist/styled-system/patterns/visually-hidden.js +0 -18
  240. package/dist/styled-system/patterns/vstack.d.ts +0 -21
  241. package/dist/styled-system/patterns/vstack.js +0 -24
  242. package/dist/styled-system/patterns/wrap.d.ts +0 -24
  243. package/dist/styled-system/patterns/wrap.js +0 -25
  244. package/dist/styled-system/recipes/content-header.d.ts +0 -31
  245. package/dist/styled-system/recipes/content-header.js +0 -65
  246. package/dist/styled-system/recipes/content-page.d.ts +0 -34
  247. package/dist/styled-system/recipes/content-page.js +0 -43
  248. package/dist/styled-system/recipes/create-recipe.js +0 -82
  249. package/dist/styled-system/recipes/index.d.ts +0 -17
  250. package/dist/styled-system/recipes/index.js +0 -16
  251. package/dist/styled-system/recipes/metric-block.d.ts +0 -34
  252. package/dist/styled-system/recipes/metric-block.js +0 -76
  253. package/dist/styled-system/recipes/product-list.d.ts +0 -31
  254. package/dist/styled-system/recipes/product-list.js +0 -73
  255. package/dist/styled-system/recipes/product-section.d.ts +0 -31
  256. package/dist/styled-system/recipes/product-section.js +0 -49
  257. package/dist/styled-system/recipes/product-settings-row.d.ts +0 -34
  258. package/dist/styled-system/recipes/product-settings-row.js +0 -58
  259. package/dist/styled-system/recipes/product-settings.d.ts +0 -31
  260. package/dist/styled-system/recipes/product-settings.js +0 -57
  261. package/dist/styled-system/recipes/product-status.d.ts +0 -34
  262. package/dist/styled-system/recipes/product-status.js +0 -45
  263. package/dist/styled-system/recipes/product-toolbar.d.ts +0 -31
  264. package/dist/styled-system/recipes/product-toolbar.js +0 -41
  265. package/dist/styled-system/recipes/product-workspace.d.ts +0 -34
  266. package/dist/styled-system/recipes/product-workspace.js +0 -58
  267. package/dist/styled-system/recipes/surface-metric.d.ts +0 -38
  268. package/dist/styled-system/recipes/surface-metric.js +0 -63
  269. package/dist/styled-system/recipes/surface-table.d.ts +0 -34
  270. package/dist/styled-system/recipes/surface-table.js +0 -62
  271. package/dist/styled-system/recipes/ui-badge.d.ts +0 -31
  272. package/dist/styled-system/recipes/ui-badge.js +0 -38
  273. package/dist/styled-system/recipes/ui-button.d.ts +0 -32
  274. package/dist/styled-system/recipes/ui-button.js +0 -43
  275. package/dist/styled-system/recipes/ui-input.d.ts +0 -31
  276. package/dist/styled-system/recipes/ui-input.js +0 -49
  277. package/dist/styled-system/recipes/ui-textarea.d.ts +0 -31
  278. package/dist/styled-system/recipes/ui-textarea.js +0 -24
  279. package/dist/styled-system/styles.css +0 -1257
  280. package/dist/styled-system/tokens/index.d.ts +0 -9
  281. package/dist/styled-system/tokens/index.js +0 -268
  282. package/dist/styled-system/tokens/tokens.d.ts +0 -36
  283. package/dist/styled-system/types/composition.d.ts +0 -227
  284. package/dist/styled-system/types/conditions.d.ts +0 -236
  285. package/dist/styled-system/types/csstype.d.ts +0 -22570
  286. package/dist/styled-system/types/index.d.ts +0 -6
  287. package/dist/styled-system/types/parts.d.ts +0 -8
  288. package/dist/styled-system/types/pattern.d.ts +0 -78
  289. package/dist/styled-system/types/prop-type.d.ts +0 -223
  290. package/dist/styled-system/types/recipe.d.ts +0 -181
  291. package/dist/styled-system/types/selectors.d.ts +0 -59
  292. package/dist/styled-system/types/static-css.d.ts +0 -56
  293. package/dist/styled-system/types/style-props.d.ts +0 -8088
  294. package/dist/styled-system/types/system-types.d.ts +0 -151
  295. package/dist/styles/recipes.css +0 -1262
@@ -0,0 +1,216 @@
1
+ import { allRecipes, describeRecipe } from "./recipes.js";
2
+ import { surfaceDesignContract } from "./design-contract.js";
3
+ // 组件主题入口;不是允许模型写入 CSS 的白名单。
4
+ const semanticTokens = ["foreground", "muted-foreground", "border"];
5
+ function variant(recipe, name) {
6
+ const metadata = describeRecipe(recipe);
7
+ const value = metadata.defaults;
8
+ return {
9
+ kind: "enum",
10
+ values: metadata.variants[name] ?? [],
11
+ ...(value[name] !== undefined ? { default: value[name] } : {}),
12
+ };
13
+ }
14
+ const registryEntries = [
15
+ {
16
+ id: "content-page-shell",
17
+ component: "@svadmin/ui/components/content/ContentPageShell.svelte",
18
+ recipe: "contentPageRecipe",
19
+ props: {
20
+ title: { kind: "string" },
21
+ eyebrow: { kind: "string" },
22
+ description: { kind: "string" },
23
+ pageId: { kind: "string" },
24
+ width: variant("contentPageRecipe", "width"),
25
+ class: { kind: "string" },
26
+ },
27
+ slots: { children: { kind: "snippet", required: true }, actions: { kind: "snippet" } },
28
+ tokens: semanticTokens,
29
+ states: ["default"],
30
+ },
31
+ {
32
+ id: "content-page-header",
33
+ component: "@svadmin/ui/components/content/ContentPageHeader.svelte",
34
+ recipe: "contentHeaderRecipe",
35
+ props: {
36
+ title: { kind: "string", required: true },
37
+ eyebrow: { kind: "string" },
38
+ description: { kind: "string" },
39
+ breadcrumbs: { kind: "string[]" },
40
+ class: { kind: "string" },
41
+ },
42
+ slots: { actions: { kind: "snippet" } },
43
+ tokens: semanticTokens,
44
+ states: ["default"],
45
+ },
46
+ {
47
+ id: "metric-block",
48
+ component: "@svadmin/ui/components/content/MetricBlock.svelte",
49
+ recipe: "metricBlockRecipe",
50
+ props: {
51
+ label: { kind: "string", required: true },
52
+ value: { kind: "string | number", required: true },
53
+ detail: { kind: "string" },
54
+ trend: { kind: "string" },
55
+ trendTone: variant("metricBlockRecipe", "trendTone"),
56
+ loading: { kind: "boolean", default: false },
57
+ class: { kind: "string" },
58
+ },
59
+ slots: { icon: { kind: "snippet" } },
60
+ tokens: [...semanticTokens, "card", "success", "destructive", "warning-foreground"],
61
+ states: ["default", "loading"],
62
+ },
63
+ {
64
+ id: "settings-field-row",
65
+ component: "@svadmin/ui/components/content/SettingsFieldRow.svelte",
66
+ recipe: "productSettingsRowRecipe",
67
+ props: {
68
+ label: { kind: "string", required: true },
69
+ description: { kind: "string" },
70
+ separated: { kind: "boolean", default: false },
71
+ class: { kind: "string" },
72
+ },
73
+ slots: { control: { kind: "snippet", required: true } },
74
+ tokens: semanticTokens,
75
+ states: ["default", "separated"],
76
+ },
77
+ {
78
+ id: "settings-group",
79
+ component: "@svadmin/ui/components/content/SettingsGroup.svelte",
80
+ recipe: "productSettingsRecipe",
81
+ props: {
82
+ title: { kind: "string", required: true },
83
+ description: { kind: "string" },
84
+ class: { kind: "string" },
85
+ bodyClass: { kind: "string" },
86
+ },
87
+ slots: {
88
+ children: { kind: "snippet", required: true },
89
+ actions: { kind: "snippet" },
90
+ },
91
+ tokens: semanticTokens,
92
+ states: ["default"],
93
+ },
94
+ {
95
+ id: "workspace-layout",
96
+ component: "@svadmin/ui/components/content/WorkspaceLayout.svelte",
97
+ recipe: "productWorkspaceRecipe",
98
+ props: {
99
+ secondaryWidth: { kind: "string", default: "22rem" },
100
+ secondaryCollapsed: { kind: "boolean", default: false },
101
+ secondaryCollapsedWidth: { kind: "string", default: "3rem" },
102
+ mobileOrder: { kind: "enum", values: ["primary-first", "secondary-first"], default: "primary-first" },
103
+ class: { kind: "string" },
104
+ },
105
+ slots: {
106
+ primary: { kind: "snippet", required: true },
107
+ summary: { kind: "snippet" },
108
+ secondary: { kind: "snippet" },
109
+ },
110
+ tokens: semanticTokens,
111
+ states: ["default", "secondary-collapsed"],
112
+ },
113
+ {
114
+ id: "button",
115
+ component: "@svadmin/ui/components/ui/button/button.svelte",
116
+ recipe: "buttonRecipe",
117
+ props: {
118
+ variant: variant("buttonRecipe", "variant"),
119
+ size: variant("buttonRecipe", "size"),
120
+ disabled: { kind: "boolean", default: false },
121
+ disabledReason: { kind: "string" },
122
+ },
123
+ slots: { children: { kind: "snippet" } },
124
+ tokens: semanticTokens,
125
+ states: ["default", "disabled", "focus-visible"],
126
+ nativeProps: "HTMLButtonAttributes | HTMLAnchorAttributes; WithElementRef",
127
+ },
128
+ {
129
+ id: "badge",
130
+ component: "@svadmin/ui/components/ui/badge/badge.svelte",
131
+ recipe: "badgeRecipe",
132
+ props: {
133
+ variant: variant("badgeRecipe", "variant"),
134
+ size: { kind: "enum", values: ["default", "compact"], default: "default" },
135
+ },
136
+ slots: { children: { kind: "snippet" } },
137
+ tokens: semanticTokens,
138
+ states: ["default"],
139
+ nativeProps: "HTMLAnchorAttributes; WithElementRef",
140
+ },
141
+ {
142
+ id: "textarea",
143
+ component: "@svadmin/ui/components/ui/textarea/textarea.svelte",
144
+ recipe: "textareaRecipe",
145
+ props: {},
146
+ slots: {},
147
+ tokens: semanticTokens,
148
+ states: ["default", "disabled", "focus-visible", "aria-invalid"],
149
+ nativeProps: "HTMLTextareaAttributes; WithElementRef; bind:value",
150
+ },
151
+ {
152
+ id: "section-header",
153
+ component: "@svadmin/ui/components/content/SectionHeader.svelte",
154
+ recipe: "productSectionRecipe",
155
+ props: {
156
+ title: { kind: "string", required: true },
157
+ description: { kind: "string" },
158
+ id: { kind: "string" },
159
+ class: { kind: "string" },
160
+ },
161
+ slots: { actions: { kind: "snippet" } },
162
+ tokens: semanticTokens,
163
+ states: ["default"],
164
+ },
165
+ {
166
+ id: "page-toolbar",
167
+ component: "@svadmin/ui/components/content/PageToolbar.svelte",
168
+ recipe: "productToolbarRecipe",
169
+ props: { class: { kind: "string" } },
170
+ slots: {
171
+ leading: { kind: "snippet" },
172
+ trailing: { kind: "snippet" },
173
+ children: { kind: "snippet" },
174
+ },
175
+ tokens: semanticTokens,
176
+ states: ["default"],
177
+ },
178
+ {
179
+ id: "status-badge",
180
+ component: "@svadmin/ui/components/content/StatusBadge.svelte",
181
+ recipe: "productStatusRecipe",
182
+ props: {
183
+ status: { kind: "enum", values: describeRecipe("productStatusRecipe").variants["status"] ?? [], required: true },
184
+ label: { kind: "string", description: "Defaults to status" },
185
+ class: { kind: "string" },
186
+ },
187
+ slots: {},
188
+ tokens: [...semanticTokens, "success", "warning", "destructive", "info"],
189
+ states: ["default"],
190
+ },
191
+ ];
192
+ export const componentRegistry = registryEntries.map((entry) => ({
193
+ ...entry,
194
+ recipeMetadata: describeRecipe(entry.recipe),
195
+ tokens: [...entry.tokens],
196
+ states: [...entry.states],
197
+ }));
198
+ export function getComponentRegistry() {
199
+ return componentRegistry.map((entry) => ({
200
+ ...entry,
201
+ props: { ...entry.props },
202
+ slots: { ...entry.slots },
203
+ }));
204
+ }
205
+ export function createComponentRegistryManifest() {
206
+ return {
207
+ version: "svadmin/component-registry-v1",
208
+ purpose: "authoring-only",
209
+ coverage: "twelve-ui-components-and-fourteen-recipes",
210
+ runtimeCatalog: "@svadmin/surface: createSurfaceCatalogManifest",
211
+ designContract: surfaceDesignContract,
212
+ recipes: Object.fromEntries(Object.keys(allRecipes)
213
+ .map(name => [name, describeRecipe(name)])),
214
+ components: getComponentRegistry(),
215
+ };
216
+ }
@@ -9,7 +9,13 @@
9
9
  const adminContext = captureAdminContext();
10
10
  const resources = $derived(adminContext.resources);
11
11
  const providerNames = $derived(adminContext.getDataProviderNames());
12
- const version = '__SVADMIN_VERSION__';
12
+ let { version: suppliedVersion }: { version?: string } = $props();
13
+ const buildVersion = '__SVADMIN_VERSION__';
14
+ const version = $derived(suppliedVersion ?? (
15
+ buildVersion.startsWith('__')
16
+ ? (i18n.locale === 'zh-CN' ? '开发构建(未提供版本)' : 'Development build (version unavailable)')
17
+ : buildVersion
18
+ ));
13
19
  </script>
14
20
 
15
21
  <div class="svadmin-u-b3542e058833">
@@ -1,3 +1,6 @@
1
- declare const AboutSettings: import("svelte").Component<Record<string, never>, {}, "">;
1
+ type $$ComponentProps = {
2
+ version?: string;
3
+ };
4
+ declare const AboutSettings: import("svelte").Component<$$ComponentProps, {}, "">;
2
5
  type AboutSettings = ReturnType<typeof AboutSettings>;
3
6
  export default AboutSettings;
@@ -19,6 +19,9 @@
19
19
 
20
20
  interface Props {
21
21
  activities?: ActivityItem[];
22
+ title?: string;
23
+ emptyLabel?: string;
24
+ countLabel?: string;
22
25
  onaddcomment?: (comment: string) => void | Promise<void>;
23
26
  allowComment?: boolean;
24
27
  class?: string;
@@ -26,6 +29,9 @@
26
29
 
27
30
  let {
28
31
  activities = [],
32
+ title = 'Activity & Timeline Stream',
33
+ emptyLabel = 'No recent activities',
34
+ countLabel,
29
35
  onaddcomment,
30
36
  allowComment = true,
31
37
  class: className = '',
@@ -50,9 +56,9 @@
50
56
  <div class="svadmin-activity-feed__header">
51
57
  <h4 class="svadmin-activity-feed__title">
52
58
  <MessageSquare class="svadmin-activity-feed__icon" />
53
- Activity & Timeline Stream
59
+ {title}
54
60
  </h4>
55
- <span class="svadmin-activity-feed__count">{activities.length} event{activities.length === 1 ? '' : 's'}</span>
61
+ <span class="svadmin-activity-feed__count">{countLabel ?? `${activities.length} event${activities.length === 1 ? '' : 's'}`}</span>
56
62
  </div>
57
63
 
58
64
  <div class="svadmin-activity-feed__timeline">
@@ -92,7 +98,7 @@
92
98
 
93
99
  {#if activities.length === 0}
94
100
  <div class="svadmin-activity-feed__empty">
95
- No recent activities
101
+ {emptyLabel}
96
102
  </div>
97
103
  {/if}
98
104
  </div>
@@ -12,6 +12,9 @@ export interface ActivityItem {
12
12
  }
13
13
  interface Props {
14
14
  activities?: ActivityItem[];
15
+ title?: string;
16
+ emptyLabel?: string;
17
+ countLabel?: string;
15
18
  onaddcomment?: (comment: string) => void | Promise<void>;
16
19
  allowComment?: boolean;
17
20
  class?: string;
@@ -61,9 +61,9 @@
61
61
  import { QueryClient, QueryClientProvider, type DefaultOptions } from '@tanstack/svelte-query';
62
62
  import { setComponentRegistry, type ComponentRegistry } from '../component-registry.svelte.js';
63
63
  import Layout, { type LayoutAIAssistantProps } from './Layout.svelte';
64
- import AutoTable from './AutoTable.svelte';
65
- import AutoForm from './AutoForm.svelte';
66
- import ShowPage from './ShowPage.svelte';
64
+ import AutoTable from './LazyAutoTable.svelte';
65
+ import AutoForm from './LazyAutoForm.svelte';
66
+ import ShowPage from './LazyShowPage.svelte';
67
67
  import Toast from './Toast.svelte';
68
68
  import LoginPage from './LoginPage.svelte';
69
69
  import RegisterPage from './RegisterPage.svelte';
@@ -73,7 +73,7 @@
73
73
  import Sidebar from './Sidebar.svelte';
74
74
  import Header from './Header.svelte';
75
75
  import TaskQueueDrawer from './LazyTaskQueueDrawer.svelte';
76
- import SettingsPage from './SettingsPage.svelte';
76
+ import SettingsPage from './LazySettingsPage.svelte';
77
77
  import ErrorPage from './ErrorPage.svelte';
78
78
  import SystemPageShell from './SystemPageShell.svelte';
79
79
  import LazyPage from './LazyPage.svelte';
@@ -84,8 +84,14 @@
84
84
  import { Skeleton } from './ui/skeleton/index.js';
85
85
  import { provideRouterState } from '../router-state.svelte.js';
86
86
  import type { AdminProviderBundle } from '../types.js';
87
+ import type { MfaEnrollmentProvider } from './TwoFactorAuthPage.svelte';
88
+ import type { NotificationPreferencesProvider } from './NotificationsSettings.svelte';
89
+ import type { MemberDirectoryProvider } from './account/MemberDirectory.svelte';
87
90
 
88
91
  interface Props {
92
+ mfaEnrollmentProvider?: MfaEnrollmentProvider;
93
+ notificationPreferencesProvider?: NotificationPreferencesProvider;
94
+ memberDirectoryProvider?: MemberDirectoryProvider;
89
95
  /** Single provider, or named providers such as `{ default, analytics }`. */
90
96
  dataProvider?: DataProviderInput;
91
97
  /** Core canonical provider bundle. Existing top-level props take precedence. */
@@ -150,6 +156,9 @@
150
156
  }
151
157
 
152
158
  let {
159
+ mfaEnrollmentProvider,
160
+ notificationPreferencesProvider,
161
+ memberDirectoryProvider,
153
162
  dataProvider,
154
163
  providerBundle,
155
164
  providers,
@@ -545,7 +554,7 @@
545
554
  <ConfigErrorScreen title="{title} — {translation.t('common.configRequired')}" />
546
555
  {:else if (isAuthenticated || !resolvedAuthProvider) && isStandaloneTwoFactor && !authRechecking}
547
556
  <SystemPageShell {title}>
548
- <LazyPage loader={loadTwoFactorAuthPage} props={{}} />
557
+ <LazyPage loader={loadTwoFactorAuthPage} props={mfaEnrollmentProvider ? { enrollmentProvider: mfaEnrollmentProvider } : {}} />
549
558
  </SystemPageShell>
550
559
  {:else if standaloneErrorStatus}
551
560
  <SystemPageShell {title}>
@@ -582,19 +591,19 @@
582
591
  {:else if renderedRoute === '/account/company-profile' || renderedRoute === '/account/home/company-profile'}
583
592
  <LazyPage loader={loadCompanyProfilePage} props={{}} />
584
593
  {:else if renderedRoute === '/account/settings-plain' || renderedRoute === '/account/home/settings-plain'}
585
- <LazyPage loader={loadSettingsPlainPage} props={{}} />
594
+ <LazyPage loader={loadSettingsPlainPage} props={notificationPreferencesProvider ? { preferencesProvider: notificationPreferencesProvider } : {}} />
586
595
  {:else if renderedRoute === '/account/settings-sidebar' || renderedRoute === '/account/home/settings-sidebar'}
587
596
  <LazyPage loader={loadSettingsSidebarPage} props={{}} />
588
597
  {:else if renderedRoute === '/account/settings-enterprise' || renderedRoute === '/account/home/settings-enterprise'}
589
598
  <LazyPage loader={loadSettingsEnterprisePage} props={{}} />
590
599
  {:else if renderedRoute === '/account/:tab'}
591
- <SettingsPage />
600
+ <SettingsPage {...notificationPreferencesProvider ? { preferencesProvider: notificationPreferencesProvider } : {}} />
592
601
  {:else if renderedRoute === '/account/import-members' || renderedRoute === '/account/members/import-members'}
593
602
  <LazyPage loader={loadImportMembersPage} props={{}} />
594
603
  {:else if renderedRoute === '/account/members-starter' || renderedRoute === '/account/members/members-starter'}
595
- <LazyPage loader={loadMembersStarterPage} props={{}} />
604
+ <LazyPage loader={loadMembersStarterPage} props={memberDirectoryProvider ? { memberProvider: memberDirectoryProvider } : {}} />
596
605
  {:else if renderedRoute === '/account/team-members' || renderedRoute === '/account/members/team-members'}
597
- <LazyPage loader={loadTeamMembersPage} props={{}} />
606
+ <LazyPage loader={loadTeamMembersPage} props={memberDirectoryProvider ? { memberProvider: memberDirectoryProvider } : {}} />
598
607
  {:else if renderedRoute === '/account/security-log' || renderedRoute === '/account/security/security-log'}
599
608
  <LazyPage loader={loadSecurityLogPage} props={{}} />
600
609
  {:else if renderedRoute === '/network/user-cards' || renderedRoute === '/network/user-cards/nft'}
@@ -602,7 +611,7 @@
602
611
  {:else if renderedRoute === '/network/team-crew' || renderedRoute === '/network/user-table/team-crew'}
603
612
  <LazyPage loader={loadTeamCrewTablePage} props={{}} />
604
613
  {:else if renderedRoute.startsWith('/settings')}
605
- <SettingsPage />
614
+ <SettingsPage {...notificationPreferencesProvider ? { preferencesProvider: notificationPreferencesProvider } : {}} />
606
615
  {:else if renderedRoute === '/' || renderedRoute === '' || renderedRoute === '/inventory-dashboard'}
607
616
  {#if dashboard}
608
617
  {@render dashboard()}
@@ -5,7 +5,13 @@ import { QueryClient, type DefaultOptions } from '@tanstack/svelte-query';
5
5
  import { type ComponentRegistry } from '../component-registry.svelte.js';
6
6
  import { type LayoutAIAssistantProps } from './Layout.svelte';
7
7
  import type { AdminProviderBundle } from '../types.js';
8
+ import type { MfaEnrollmentProvider } from './TwoFactorAuthPage.svelte';
9
+ import type { NotificationPreferencesProvider } from './NotificationsSettings.svelte';
10
+ import type { MemberDirectoryProvider } from './account/MemberDirectory.svelte';
8
11
  interface Props {
12
+ mfaEnrollmentProvider?: MfaEnrollmentProvider;
13
+ notificationPreferencesProvider?: NotificationPreferencesProvider;
14
+ memberDirectoryProvider?: MemberDirectoryProvider;
9
15
  /** Single provider, or named providers such as `{ default, analytics }`. */
10
16
  dataProvider?: DataProviderInput;
11
17
  /** Core canonical provider bundle. Existing top-level props take precedence. */
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import ConfirmDialog from './ConfirmDialog.svelte';
2
3
  import { definedOptions } from '@svadmin/core/options';
3
4
  import { captureAdminContext, notifyWithProvider, type ApiCredentialSummary, type WebhookSummary } from '@svadmin/core';
4
5
  import { useTranslation } from '@svadmin/core/i18n';
@@ -25,6 +26,7 @@
25
26
  let newKeyPermissions = $state({ Read: true, Write: false, Delete: false, Admin: false });
26
27
  let generatedSecret = $state('');
27
28
  let copied = $state(false);
29
+ let copyError = $state('');
28
30
  let newWebhookName = $state('');
29
31
  let newWebhookUrl = $state('');
30
32
  let newWebhookEvent = $state('resource.created');
@@ -32,6 +34,16 @@
32
34
  let error = $state<string | null>(null);
33
35
  let submitting = $state(false);
34
36
  let requestId = 0;
37
+ let pendingDanger = $state<{ label: string; run: () => Promise<void> } | null>(null);
38
+ let deleting = $state(false);
39
+ function requestDanger(label: string, run: () => Promise<void>) {
40
+ const epoch = requestId;
41
+ pendingDanger = { label, run: async () => {
42
+ if (epoch !== requestId || deleting) return;
43
+ deleting = true;
44
+ try { await run(); } finally { if (epoch === requestId) deleting = false; }
45
+ } };
46
+ }
35
47
 
36
48
  function message(error: unknown): string {
37
49
  return error instanceof Error ? error.message : String(error);
@@ -45,7 +57,10 @@
45
57
  webhooks = [];
46
58
  generatedSecret = '';
47
59
  copied = false;
60
+ copyError = '';
48
61
  error = null;
62
+ pendingDanger = null;
63
+ deleting = false;
49
64
  loading = false;
50
65
  submitting = false;
51
66
  if (!provider) return;
@@ -104,6 +119,7 @@
104
119
  keys = [...keys, created.credential];
105
120
  generatedSecret = created.secret;
106
121
  copied = false;
122
+ copyError = '';
107
123
  newKeyName = '';
108
124
  newKeyPermissions = { Read: true, Write: false, Delete: false, Admin: false };
109
125
  } catch (caught) {
@@ -114,7 +130,11 @@
114
130
  }
115
131
  }
116
132
 
117
- async function revokeKey(id: string): Promise<void> {
133
+ async function revokeKey(id: string, confirmed = false): Promise<void> {
134
+ if (!confirmed) {
135
+ requestDanger(`${i18n.t('common.delete')}: ${keys.find(key => key.id === id)?.name ?? id}`, () => revokeKey(id, true));
136
+ return;
137
+ }
118
138
  const provider = credentialProvider;
119
139
  const currentRequest = requestId;
120
140
  const context = adminContext.enterpriseRequestContext;
@@ -130,7 +150,11 @@
130
150
  }
131
151
  }
132
152
 
133
- async function deleteWebhook(id: string): Promise<void> {
153
+ async function deleteWebhook(id: string, confirmed = false): Promise<void> {
154
+ if (!confirmed) {
155
+ requestDanger(`${i18n.t('common.delete')}: ${webhooks.find(hook => hook.id === id)?.name ?? id}`, () => deleteWebhook(id, true));
156
+ return;
157
+ }
134
158
  const provider = credentialProvider;
135
159
  const currentRequest = requestId;
136
160
  const context = adminContext.enterpriseRequestContext;
@@ -147,11 +171,17 @@
147
171
  }
148
172
 
149
173
  async function copySecret(): Promise<void> {
174
+ const currentRequest = requestId;
175
+ const secret = generatedSecret;
176
+ copyError = '';
177
+ copied = false;
150
178
  try {
151
- await navigator.clipboard.writeText(generatedSecret);
152
- copied = true;
179
+ await navigator.clipboard.writeText(secret);
180
+ if (currentRequest === requestId && generatedSecret === secret) copied = true;
153
181
  } catch {
154
- copied = false;
182
+ if (currentRequest === requestId && generatedSecret === secret) {
183
+ copyError = isZh ? '复制失败,请手动保存密钥。' : 'Copy failed. Save the secret manually.';
184
+ }
155
185
  }
156
186
  }
157
187
  </script>
@@ -161,6 +191,7 @@
161
191
  <WorkspaceLayout secondaryWidth="21rem">
162
192
  {#snippet summary()}
163
193
  {#if generatedSecret}
194
+ {#if copyError}<p role="alert">{copyError}</p>{/if}
164
195
  <section class="svadmin-u-5f22e64f2282 svadmin-u-ca6bcd4b6f3f svadmin-u-a6afccfc915b svadmin-u-989c466fdbe7 svadmin-u-8e63407b5ceb" role="status" aria-live="polite">
165
196
  <div class="svadmin-u-60fbb7713999 svadmin-u-8dddea0773ed svadmin-u-0c3bc98565dd svadmin-u-020ba687fa12 svadmin-u-9f76a62f4f44 svadmin-u-3b9871a0bf93"><div class="svadmin-u-60fbb7713999 svadmin-u-7e0b7cdf1a94 svadmin-u-60541e1e26f8 svadmin-u-1004c0c3954c"><ShieldCheck class="svadmin-u-15e1b1f444fe svadmin-u-add63bc6753d svadmin-u-012fbd121f37 svadmin-u-20aaf08a7ed1" /><div class="svadmin-u-7e0b7cdf1a94"><h2 class="svadmin-u-fc7473ca09eb svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{i18n.t('api.successTitle')}</h2><p class="svadmin-u-b6b02c0ebef6 svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">{i18n.t('api.successHint')}</p></div></div><Button variant="ghost" size="sm" onclick={() => { generatedSecret = ''; copied = false; }}>{i18n.t('common.close')}</Button></div>
166
197
  <div class="svadmin-u-0ab8667228fd svadmin-u-60fbb7713999 svadmin-u-7e0b7cdf1a94 svadmin-u-3960ffc248d9 svadmin-u-77a2a20e90d4"><Input readonly value={generatedSecret} class="svadmin-u-7e0b7cdf1a94 svadmin-u-0e65706bcccd svadmin-u-359090c2d529" aria-label={i18n.t('api.successTitle')} /><Button size="icon" onclick={copySecret} aria-label={i18n.t('common.copy')}>{#if copied}<Check class="svadmin-u-f7b5fa971871" />{:else}<Copy class="svadmin-u-f7b5fa971871" />{/if}</Button></div>
@@ -202,3 +233,8 @@
202
233
  {/snippet}
203
234
  </WorkspaceLayout>
204
235
  </ContentPageShell>
236
+ <ConfirmDialog open={pendingDanger !== null}
237
+ title={pendingDanger?.label ?? ''}
238
+ message={isZh ? '撤销或删除后,使用此凭据或 Webhook 的服务将受影响。确认继续?' : 'Services using this credential or webhook will be affected. Continue?'}
239
+ oncancel={() => pendingDanger = null}
240
+ onconfirm={() => { const action = pendingDanger; pendingDanger = null; void action?.run(); }} />