@svadmin/ui 0.72.0 → 0.73.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 (252) hide show
  1. package/README.md +40 -25
  2. package/THIRD_PARTY_NOTICES.md +52 -0
  3. package/dist/app.css +7694 -5117
  4. package/dist/app.theme.css +7645 -5119
  5. package/dist/class-properties.generated.d.ts +1 -0
  6. package/dist/class-properties.generated.js +2 -0
  7. package/dist/classnames.d.ts +8 -0
  8. package/dist/classnames.js +26 -0
  9. package/dist/components/AutoForm.svelte +20 -6
  10. package/dist/components/AutoForm.svelte.d.ts +2 -0
  11. package/dist/components/AutoTable.svelte +249 -9
  12. package/dist/components/AutoTable.svelte.d.ts +5 -0
  13. package/dist/components/BoundRecordDetailDrawer.svelte +8 -2
  14. package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +2 -0
  15. package/dist/components/ComboboxField.svelte +31 -9
  16. package/dist/components/ComboboxField.svelte.d.ts +3 -2
  17. package/dist/components/CreatePage.svelte +4 -0
  18. package/dist/components/CreatePage.svelte.d.ts +2 -0
  19. package/dist/components/DateRangeInput.svelte +75 -0
  20. package/dist/components/DateRangeInput.svelte.d.ts +25 -0
  21. package/dist/components/DateTimeInput.svelte +65 -0
  22. package/dist/components/DateTimeInput.svelte.d.ts +19 -0
  23. package/dist/components/DevTools.svelte +2 -2
  24. package/dist/components/EditPage.svelte +4 -0
  25. package/dist/components/EditPage.svelte.d.ts +2 -0
  26. package/dist/components/FieldRenderer.svelte +90 -18
  27. package/dist/components/FileUpload.svelte +250 -0
  28. package/dist/components/FileUpload.svelte.d.ts +32 -0
  29. package/dist/components/FilterBuilder.svelte +236 -279
  30. package/dist/components/FilterBuilder.svelte.d.ts +3 -0
  31. package/dist/components/ImportWizard.svelte +181 -94
  32. package/dist/components/JsonSchemaForm.svelte +255 -99
  33. package/dist/components/JsonSchemaForm.svelte.d.ts +12 -1
  34. package/dist/components/Layout.svelte +1 -2
  35. package/dist/components/LazyTaskQueueDrawer.svelte.d.ts +1 -1
  36. package/dist/components/ListPage.svelte +4 -0
  37. package/dist/components/ListPage.svelte.d.ts +2 -0
  38. package/dist/components/LoginPage.svelte +1 -1
  39. package/dist/components/MoneyInput.svelte +25 -0
  40. package/dist/components/MoneyInput.svelte.d.ts +20 -0
  41. package/dist/components/NumberInput.svelte +25 -0
  42. package/dist/components/NumberInput.svelte.d.ts +19 -0
  43. package/dist/components/NumericInput.svelte +110 -0
  44. package/dist/components/NumericInput.svelte.d.ts +23 -0
  45. package/dist/components/PercentInput.svelte +25 -0
  46. package/dist/components/PercentInput.svelte.d.ts +20 -0
  47. package/dist/components/QuickEditDrawer.svelte +4 -1
  48. package/dist/components/QuickEditDrawer.svelte.d.ts +2 -0
  49. package/dist/components/RecordDetailDrawer.svelte +4 -2
  50. package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
  51. package/dist/components/ResourceOperationsPage.svelte +25 -19
  52. package/dist/components/ResourceOperationsPage.svelte.d.ts +5 -1
  53. package/dist/components/ShowInferencer.svelte +4 -2
  54. package/dist/components/ShowInferencer.svelte.d.ts +2 -0
  55. package/dist/components/ShowPage.svelte +7 -3
  56. package/dist/components/ShowPage.svelte.d.ts +2 -0
  57. package/dist/components/Sidebar.svelte +5 -5
  58. package/dist/components/SpreadsheetView.svelte +81 -286
  59. package/dist/components/StepsForm.svelte +5 -5
  60. package/dist/components/SvarAutoTable.svelte +39 -0
  61. package/dist/components/SvarAutoTable.svelte.d.ts +13 -0
  62. package/dist/components/SvarDataGrid.svelte +362 -0
  63. package/dist/components/SvarDataGrid.svelte.d.ts +57 -0
  64. package/dist/components/SvarGridCell.svelte +10 -0
  65. package/dist/components/SvarGridCell.svelte.d.ts +7 -0
  66. package/dist/components/SvarResourceRead.svelte +50 -0
  67. package/dist/components/SvarResourceRead.svelte.d.ts +23 -0
  68. package/dist/components/SvarResourceTable.svelte +63 -0
  69. package/dist/components/SvarResourceTable.svelte.d.ts +42 -0
  70. package/dist/components/SvarResourceTableView.svelte +364 -0
  71. package/dist/components/SvarResourceTableView.svelte.d.ts +4 -0
  72. package/dist/components/TaskQueueDrawer.svelte +72 -16
  73. package/dist/components/TreeSelect.svelte +208 -28
  74. package/dist/components/TreeSelect.svelte.d.ts +3 -1
  75. package/dist/components/auto-table-grid.d.ts +26 -0
  76. package/dist/components/auto-table-grid.js +1 -0
  77. package/dist/components/content/ContentPageHeader.svelte +12 -9
  78. package/dist/components/content/ContentPageShell.svelte +6 -9
  79. package/dist/components/content/FileBrowser.svelte +35 -0
  80. package/dist/components/content/FileBrowser.svelte.d.ts +14 -0
  81. package/dist/components/content/MetricBlock.svelte +10 -13
  82. package/dist/components/content/NetworkTable.svelte +3 -3
  83. package/dist/components/content/NetworkTable.svelte.d.ts +1 -0
  84. package/dist/components/content/PageToolbar.svelte +6 -10
  85. package/dist/components/content/SectionHeader.svelte +8 -13
  86. package/dist/components/content/SettingsFieldRow.svelte +9 -23
  87. package/dist/components/content/SettingsGroup.svelte +11 -27
  88. package/dist/components/content/StatusBadge.svelte +3 -8
  89. package/dist/components/content/WorkspaceLayout.svelte +8 -12
  90. package/dist/components/enterprise/filter-tree.d.ts +48 -0
  91. package/dist/components/enterprise/filter-tree.js +224 -0
  92. package/dist/components/enterprise/json-schema-form.d.ts +39 -0
  93. package/dist/components/enterprise/json-schema-form.js +195 -0
  94. package/dist/components/enterprise/recursive-schema-form.d.ts +30 -0
  95. package/dist/components/enterprise/recursive-schema-form.js +196 -0
  96. package/dist/components/enterprise/spreadsheet-formula.d.ts +12 -0
  97. package/dist/components/enterprise/spreadsheet-formula.js +245 -0
  98. package/dist/components/fieldComponentMap.js +5 -0
  99. package/dist/components/fields/DateField.svelte +4 -3
  100. package/dist/components/fields/date-field-value.d.ts +2 -0
  101. package/dist/components/fields/date-field-value.js +13 -0
  102. package/dist/components/json-schema-form-state.d.ts +37 -0
  103. package/dist/components/json-schema-form-state.js +168 -0
  104. package/dist/components/record-detail.svelte.d.ts +3 -0
  105. package/dist/components/record-detail.svelte.js +10 -4
  106. package/dist/components/svar-grid-cells.d.ts +14 -0
  107. package/dist/components/svar-grid-cells.js +2 -0
  108. package/dist/components/svar-grid-contract.d.ts +80 -0
  109. package/dist/components/svar-grid-contract.js +159 -0
  110. package/dist/components/svar-grid-interactions.d.ts +54 -0
  111. package/dist/components/svar-grid-interactions.js +174 -0
  112. package/dist/components/svar-grid-loading.d.ts +40 -0
  113. package/dist/components/svar-grid-loading.js +180 -0
  114. package/dist/components/svar-grid-operations.d.ts +37 -0
  115. package/dist/components/svar-grid-operations.js +186 -0
  116. package/dist/components/svar-grid-panes.d.ts +34 -0
  117. package/dist/components/svar-grid-panes.js +66 -0
  118. package/dist/components/svar-grid-resource-loading.d.ts +18 -0
  119. package/dist/components/svar-grid-resource-loading.js +68 -0
  120. package/dist/components/svar-grid-resource-session.svelte.d.ts +29 -0
  121. package/dist/components/svar-grid-resource-session.svelte.js +61 -0
  122. package/dist/components/ui/badge/badge-variants.js +3 -1
  123. package/dist/components/ui/button/button-variants.js +5 -2
  124. package/dist/components/ui/input/input.svelte +1 -4
  125. package/dist/components/ui/textarea/textarea.svelte +2 -1
  126. package/dist/components.css +3079 -0
  127. package/dist/design-contract.d.ts +13 -0
  128. package/dist/design-contract.js +11 -0
  129. package/dist/design-system.d.ts +15 -0
  130. package/dist/design-system.js +7 -0
  131. package/dist/index.d.ts +14 -0
  132. package/dist/index.js +9 -0
  133. package/dist/page-chrome.css +12 -49
  134. package/dist/recipes.d.ts +4 -0
  135. package/dist/recipes.js +4 -0
  136. package/dist/rendering/index.d.ts +87 -0
  137. package/dist/rendering/index.js +117 -0
  138. package/dist/styled-system/css/conditions.js +36 -0
  139. package/dist/styled-system/css/css.d.ts +22 -0
  140. package/dist/styled-system/css/css.js +45 -0
  141. package/dist/styled-system/css/cva.d.ts +6 -0
  142. package/dist/styled-system/css/cva.js +87 -0
  143. package/dist/styled-system/css/cx.d.ts +5 -0
  144. package/dist/styled-system/css/cx.js +15 -0
  145. package/dist/styled-system/css/index.d.ts +5 -0
  146. package/dist/styled-system/css/index.js +4 -0
  147. package/dist/styled-system/css/sva.d.ts +4 -0
  148. package/dist/styled-system/css/sva.js +46 -0
  149. package/dist/styled-system/helpers.js +316 -0
  150. package/dist/styled-system/patterns/aspect-ratio.d.ts +20 -0
  151. package/dist/styled-system/patterns/aspect-ratio.js +38 -0
  152. package/dist/styled-system/patterns/bleed.d.ts +21 -0
  153. package/dist/styled-system/patterns/bleed.js +24 -0
  154. package/dist/styled-system/patterns/box.d.ts +20 -0
  155. package/dist/styled-system/patterns/box.js +15 -0
  156. package/dist/styled-system/patterns/center.d.ts +20 -0
  157. package/dist/styled-system/patterns/center.js +21 -0
  158. package/dist/styled-system/patterns/circle.d.ts +20 -0
  159. package/dist/styled-system/patterns/circle.js +25 -0
  160. package/dist/styled-system/patterns/container.d.ts +20 -0
  161. package/dist/styled-system/patterns/container.js +21 -0
  162. package/dist/styled-system/patterns/cq.d.ts +21 -0
  163. package/dist/styled-system/patterns/cq.js +21 -0
  164. package/dist/styled-system/patterns/divider.d.ts +22 -0
  165. package/dist/styled-system/patterns/divider.js +25 -0
  166. package/dist/styled-system/patterns/flex.d.ts +26 -0
  167. package/dist/styled-system/patterns/flex.js +26 -0
  168. package/dist/styled-system/patterns/float.d.ts +23 -0
  169. package/dist/styled-system/patterns/float.js +52 -0
  170. package/dist/styled-system/patterns/grid-item.d.ts +25 -0
  171. package/dist/styled-system/patterns/grid-item.js +25 -0
  172. package/dist/styled-system/patterns/grid.d.ts +24 -0
  173. package/dist/styled-system/patterns/grid.js +27 -0
  174. package/dist/styled-system/patterns/hstack.d.ts +21 -0
  175. package/dist/styled-system/patterns/hstack.js +24 -0
  176. package/dist/styled-system/patterns/index.d.ts +21 -0
  177. package/dist/styled-system/patterns/index.js +20 -0
  178. package/dist/styled-system/patterns/link-overlay.d.ts +20 -0
  179. package/dist/styled-system/patterns/link-overlay.js +24 -0
  180. package/dist/styled-system/patterns/spacer.d.ts +20 -0
  181. package/dist/styled-system/patterns/spacer.js +25 -0
  182. package/dist/styled-system/patterns/square.d.ts +20 -0
  183. package/dist/styled-system/patterns/square.js +24 -0
  184. package/dist/styled-system/patterns/stack.d.ts +23 -0
  185. package/dist/styled-system/patterns/stack.js +24 -0
  186. package/dist/styled-system/patterns/visually-hidden.d.ts +20 -0
  187. package/dist/styled-system/patterns/visually-hidden.js +18 -0
  188. package/dist/styled-system/patterns/vstack.d.ts +21 -0
  189. package/dist/styled-system/patterns/vstack.js +24 -0
  190. package/dist/styled-system/patterns/wrap.d.ts +24 -0
  191. package/dist/styled-system/patterns/wrap.js +25 -0
  192. package/dist/styled-system/recipes/content-header.d.ts +31 -0
  193. package/dist/styled-system/recipes/content-header.js +65 -0
  194. package/dist/styled-system/recipes/content-page.d.ts +34 -0
  195. package/dist/styled-system/recipes/content-page.js +43 -0
  196. package/dist/styled-system/recipes/create-recipe.js +82 -0
  197. package/dist/styled-system/recipes/index.d.ts +17 -0
  198. package/dist/styled-system/recipes/index.js +16 -0
  199. package/dist/styled-system/recipes/metric-block.d.ts +34 -0
  200. package/dist/styled-system/recipes/metric-block.js +76 -0
  201. package/dist/styled-system/recipes/product-list.d.ts +31 -0
  202. package/dist/styled-system/recipes/product-list.js +73 -0
  203. package/dist/styled-system/recipes/product-section.d.ts +31 -0
  204. package/dist/styled-system/recipes/product-section.js +49 -0
  205. package/dist/styled-system/recipes/product-settings-row.d.ts +34 -0
  206. package/dist/styled-system/recipes/product-settings-row.js +58 -0
  207. package/dist/styled-system/recipes/product-settings.d.ts +31 -0
  208. package/dist/styled-system/recipes/product-settings.js +57 -0
  209. package/dist/styled-system/recipes/product-status.d.ts +34 -0
  210. package/dist/styled-system/recipes/product-status.js +45 -0
  211. package/dist/styled-system/recipes/product-toolbar.d.ts +31 -0
  212. package/dist/styled-system/recipes/product-toolbar.js +41 -0
  213. package/dist/styled-system/recipes/product-workspace.d.ts +34 -0
  214. package/dist/styled-system/recipes/product-workspace.js +58 -0
  215. package/dist/styled-system/recipes/surface-metric.d.ts +38 -0
  216. package/dist/styled-system/recipes/surface-metric.js +63 -0
  217. package/dist/styled-system/recipes/surface-table.d.ts +34 -0
  218. package/dist/styled-system/recipes/surface-table.js +62 -0
  219. package/dist/styled-system/recipes/ui-badge.d.ts +31 -0
  220. package/dist/styled-system/recipes/ui-badge.js +38 -0
  221. package/dist/styled-system/recipes/ui-button.d.ts +32 -0
  222. package/dist/styled-system/recipes/ui-button.js +43 -0
  223. package/dist/styled-system/recipes/ui-input.d.ts +31 -0
  224. package/dist/styled-system/recipes/ui-input.js +49 -0
  225. package/dist/styled-system/recipes/ui-textarea.d.ts +31 -0
  226. package/dist/styled-system/recipes/ui-textarea.js +24 -0
  227. package/dist/styled-system/styles.css +1257 -0
  228. package/dist/styled-system/tokens/index.d.ts +9 -0
  229. package/dist/styled-system/tokens/index.js +268 -0
  230. package/dist/styled-system/tokens/tokens.d.ts +36 -0
  231. package/dist/styled-system/types/composition.d.ts +227 -0
  232. package/dist/styled-system/types/conditions.d.ts +236 -0
  233. package/dist/styled-system/types/csstype.d.ts +22570 -0
  234. package/dist/styled-system/types/index.d.ts +6 -0
  235. package/dist/styled-system/types/parts.d.ts +8 -0
  236. package/dist/styled-system/types/pattern.d.ts +78 -0
  237. package/dist/styled-system/types/prop-type.d.ts +223 -0
  238. package/dist/styled-system/types/recipe.d.ts +181 -0
  239. package/dist/styled-system/types/selectors.d.ts +59 -0
  240. package/dist/styled-system/types/static-css.d.ts +56 -0
  241. package/dist/styled-system/types/style-props.d.ts +8088 -0
  242. package/dist/styled-system/types/system-types.d.ts +151 -0
  243. package/dist/styles/aliases.css +49 -0
  244. package/dist/styles/compatibility.epilogue.css +384 -0
  245. package/dist/styles/compatibility.prelude.css +5513 -0
  246. package/dist/styles/conditional-states.css +28 -0
  247. package/dist/styles/conditional-utilities.css +22 -0
  248. package/dist/styles/recipes.css +1262 -0
  249. package/dist/utils.d.ts +1 -1
  250. package/dist/utils.js +1 -1
  251. package/package.json +31 -13
  252. package/styles-compatibility.json +12 -0
@@ -0,0 +1,13 @@
1
+ /** 仅公开稳定语义;不向模型暴露 CSS、类名或内部 recipe 实现。 */
2
+ export declare const surfaceDesignContract: {
3
+ readonly version: "svadmin/design-v1";
4
+ readonly metric: {
5
+ readonly tone: readonly ["neutral", "success", "warning", "danger", "info"];
6
+ readonly density: readonly ["comfortable", "compact"];
7
+ };
8
+ readonly table: {
9
+ readonly density: readonly ["comfortable", "compact"];
10
+ };
11
+ };
12
+ export type SurfaceTone = typeof surfaceDesignContract.metric.tone[number];
13
+ export type SurfaceDensity = typeof surfaceDesignContract.metric.density[number];
@@ -0,0 +1,11 @@
1
+ /** 仅公开稳定语义;不向模型暴露 CSS、类名或内部 recipe 实现。 */
2
+ export const surfaceDesignContract = {
3
+ version: 'svadmin/design-v1',
4
+ metric: {
5
+ tone: ['neutral', 'success', 'warning', 'danger', 'info'],
6
+ density: ['comfortable', 'compact'],
7
+ },
8
+ table: {
9
+ density: ['comfortable', 'compact'],
10
+ },
11
+ };
@@ -0,0 +1,15 @@
1
+ import type { SurfaceTone, SurfaceDensity } from "./design-contract.js";
2
+ export declare function metricSurfaceClasses(tone?: SurfaceTone): {
3
+ state: string;
4
+ description: string;
5
+ root: string;
6
+ card: string;
7
+ };
8
+ export declare function tableSurfaceClasses(density?: SurfaceDensity): {
9
+ state: string;
10
+ content: string;
11
+ head: string;
12
+ header: string;
13
+ root: string;
14
+ cell: string;
15
+ };
@@ -0,0 +1,7 @@
1
+ import { surfaceMetric, surfaceTable } from "./styled-system/recipes/index.js";
2
+ export function metricSurfaceClasses(tone = "neutral") {
3
+ return surfaceMetric({ tone });
4
+ }
5
+ export function tableSurfaceClasses(density = "comfortable") {
6
+ return surfaceTable({ density });
7
+ }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ export { surfaceDesignContract } from "./design-contract.js";
2
+ export type { SurfaceTone, SurfaceDensity } from "./design-contract.js";
1
3
  export { default as AdminApp } from './components/AdminApp.svelte';
2
4
  export { default as AutoTable } from './components/AutoTable.svelte';
3
5
  export { default as AutoForm } from './components/AutoForm.svelte';
@@ -120,6 +122,14 @@ export type { PendingMutation } from './components/OfflineSyncBanner.svelte';
120
122
  export { default as InfiniteList } from './components/InfiniteList.svelte';
121
123
  export { default as ComboboxField } from './components/ComboboxField.svelte';
122
124
  export { default as PasswordInput } from './components/PasswordInput.svelte';
125
+ export { default as NumericInput } from './components/NumericInput.svelte';
126
+ export { default as NumberInput } from './components/NumberInput.svelte';
127
+ export { default as MoneyInput } from './components/MoneyInput.svelte';
128
+ export { default as PercentInput } from './components/PercentInput.svelte';
129
+ export { default as DateTimeInput } from './components/DateTimeInput.svelte';
130
+ export type { DateTimeInputMode } from './components/DateTimeInput.svelte';
131
+ export { default as DateRangeInput } from './components/DateRangeInput.svelte';
132
+ export type { DateRangeInputValue } from './components/DateRangeInput.svelte';
123
133
  export { default as AnomalyBadge } from "./components/AnomalyBadge.svelte";
124
134
  export { default as AnimatedCounter } from "./components/AnimatedCounter.svelte";
125
135
  export { default as KeyboardShortcuts } from "./components/KeyboardShortcuts.svelte";
@@ -266,6 +276,8 @@ export type { SecurityEvent } from './components/content/SecurityEventTable.svel
266
276
  export { default as MemberList } from './components/content/MemberList.svelte';
267
277
  export type { MemberSummary } from './components/content/MemberList.svelte';
268
278
  export { default as ImportDropzone } from './components/content/ImportDropzone.svelte';
279
+ export { default as FileUpload } from './components/FileUpload.svelte';
280
+ export type { UploadItem, UploadItemStatus, UploadSession } from './components/FileUpload.svelte';
269
281
  export { default as NetworkUserCard } from './components/content/NetworkUserCard.svelte';
270
282
  export type { NetworkUser, NetworkMetric } from './components/content/NetworkUserCard.svelte';
271
283
  export { default as NetworkTable } from './components/content/NetworkTable.svelte';
@@ -292,3 +304,5 @@ export type { RatingSize } from './components/fields/RatingField.svelte';
292
304
  export type { CurrencyTone } from './components/fields/CurrencyField.svelte';
293
305
  export { default as MediaThumbnail } from './components/content/MediaThumbnail.svelte';
294
306
  export type { MediaThumbnailSize, MediaThumbnailFit } from './components/content/MediaThumbnail.svelte';
307
+ export { default as FileBrowser } from './components/content/FileBrowser.svelte';
308
+ export type { FileBrowserData, FileBrowserInit, FileBrowserMenuOptions, FileBrowserProps } from './components/content/FileBrowser.svelte';
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  // @svadmin/ui — Pre-built admin UI components
2
+ export { surfaceDesignContract } from "./design-contract.js";
2
3
  // Entry component
3
4
  export { default as AdminApp } from './components/AdminApp.svelte';
4
5
  // Admin components
@@ -95,6 +96,12 @@ export { default as OfflineSyncBanner } from './components/OfflineSyncBanner.sve
95
96
  export { default as InfiniteList } from './components/InfiniteList.svelte';
96
97
  export { default as ComboboxField } from './components/ComboboxField.svelte';
97
98
  export { default as PasswordInput } from './components/PasswordInput.svelte';
99
+ export { default as NumericInput } from './components/NumericInput.svelte';
100
+ export { default as NumberInput } from './components/NumberInput.svelte';
101
+ export { default as MoneyInput } from './components/MoneyInput.svelte';
102
+ export { default as PercentInput } from './components/PercentInput.svelte';
103
+ export { default as DateTimeInput } from './components/DateTimeInput.svelte';
104
+ export { default as DateRangeInput } from './components/DateRangeInput.svelte';
98
105
  export { default as AnomalyBadge } from "./components/AnomalyBadge.svelte";
99
106
  export { default as AnimatedCounter } from "./components/AnimatedCounter.svelte";
100
107
  export { default as KeyboardShortcuts } from "./components/KeyboardShortcuts.svelte";
@@ -238,6 +245,7 @@ export { default as ApiKeyList } from './components/content/ApiKeyList.svelte';
238
245
  export { default as SecurityEventTable } from './components/content/SecurityEventTable.svelte';
239
246
  export { default as MemberList } from './components/content/MemberList.svelte';
240
247
  export { default as ImportDropzone } from './components/content/ImportDropzone.svelte';
248
+ export { default as FileUpload } from './components/FileUpload.svelte';
241
249
  export { default as NetworkUserCard } from './components/content/NetworkUserCard.svelte';
242
250
  export { default as NetworkTable } from './components/content/NetworkTable.svelte';
243
251
  export { default as OtpInput } from './components/content/OtpInput.svelte';
@@ -250,3 +258,4 @@ export { default as AuditTimeline } from './components/content/AuditTimeline.sve
250
258
  export { default as FilterDropdown } from './components/FilterDropdown.svelte';
251
259
  export { default as BatchActionBar } from './components/BatchActionBar.svelte';
252
260
  export { default as MediaThumbnail } from './components/content/MediaThumbnail.svelte';
261
+ export { default as FileBrowser } from './components/content/FileBrowser.svelte';
@@ -3,61 +3,45 @@
3
3
  --svadmin-page-header-gap: 0.5rem;
4
4
  min-width: 0;
5
5
  }
6
-
7
6
  .svadmin-page-header[data-density="compact"] {
8
7
  --svadmin-page-header-gap: 0.375rem;
9
8
  }
10
-
11
9
  .svadmin-page-header__breadcrumbs {
12
10
  margin-bottom: 1rem;
13
11
  }
14
-
15
12
  .svadmin-page-header[data-density="compact"] .svadmin-page-header__breadcrumbs {
16
13
  margin-bottom: 0.375rem;
17
14
  font-size: 0.75rem;
18
15
  }
19
-
20
- .svadmin-page-header__row,
21
- .svadmin-filter-toolbar__row {
16
+ .svadmin-page-header__row, .svadmin-filter-toolbar__row {
22
17
  display: flex;
23
18
  flex-direction: column;
24
19
  min-width: 0;
25
20
  gap: 0.5rem;
26
21
  }
27
-
28
22
  .svadmin-page-header__row {
29
23
  gap: var(--svadmin-page-header-gap);
30
24
  }
31
-
32
25
  .svadmin-page-header__heading {
33
26
  display: flex;
34
27
  align-items: center;
35
28
  min-width: 0;
36
29
  gap: 0.625rem;
37
30
  }
38
-
39
31
  .svadmin-page-header__text {
40
32
  min-width: 0;
41
33
  }
42
-
43
- .svadmin-page-header__title-row,
44
- .svadmin-page-header__tags,
45
- .svadmin-page-header__actions,
46
- .svadmin-filter-toolbar__filters,
47
- .svadmin-filter-toolbar__actions {
34
+ .svadmin-page-header__title-row, .svadmin-page-header__tags, .svadmin-page-header__actions, .svadmin-filter-toolbar__filters, .svadmin-filter-toolbar__actions {
48
35
  display: flex;
49
36
  flex-wrap: wrap;
50
37
  align-items: center;
51
38
  min-width: 0;
52
39
  gap: 0.5rem;
53
40
  }
54
-
55
- .svadmin-page-header__tags,
56
- .svadmin-page-header__actions {
41
+ .svadmin-page-header__tags, .svadmin-page-header__actions {
57
42
  max-width: 100%;
58
43
  gap: var(--svadmin-page-header-gap);
59
44
  }
60
-
61
45
  .svadmin-page-header__title {
62
46
  min-width: 0;
63
47
  color: var(--foreground);
@@ -66,73 +50,59 @@
66
50
  line-height: 1.75rem;
67
51
  overflow-wrap: anywhere;
68
52
  }
69
-
70
53
  .svadmin-page-header__description {
71
54
  color: var(--muted-foreground);
72
55
  font-size: 0.875rem;
73
56
  line-height: 1.25rem;
74
57
  overflow-wrap: anywhere;
75
58
  }
76
-
77
59
  .svadmin-page-header[data-density="compact"] .svadmin-page-header__title {
78
60
  font-size: 1.125rem;
79
61
  }
80
-
81
62
  .svadmin-page-header[data-density="compact"] .svadmin-page-header__description {
82
63
  font-size: 0.75rem;
83
64
  line-height: 1rem;
84
65
  }
85
-
86
66
  .svadmin-page-header .svadmin-page-header__back {
87
67
  flex-shrink: 0;
88
68
  color: var(--muted-foreground);
89
69
  }
90
-
91
70
  .svadmin-page-header .svadmin-page-header__back:hover {
92
71
  color: var(--foreground);
93
72
  }
94
-
95
73
  .svadmin-page-header .svadmin-page-header__back-icon {
96
74
  width: 1rem;
97
75
  height: 1rem;
98
76
  }
99
-
100
77
  .svadmin-breadcrumbs {
101
78
  min-width: 0;
102
79
  }
103
-
104
80
  .svadmin-breadcrumbs--spaced {
105
81
  margin-bottom: 1rem;
106
82
  }
107
-
108
83
  .svadmin-breadcrumbs__item {
109
84
  display: inline-flex;
110
85
  min-width: 0;
111
86
  overflow-wrap: anywhere;
112
87
  }
113
-
114
88
  .svadmin-breadcrumbs__label {
115
89
  color: var(--muted-foreground);
116
90
  }
117
-
118
91
  .svadmin-filter-toolbar {
119
92
  --svadmin-filter-control-height: 2.25rem;
120
93
  --svadmin-filter-control-font: 0.875rem;
121
94
  --svadmin-filter-search-icon-size: 1rem;
122
95
  min-width: 0;
123
96
  }
124
-
125
97
  .svadmin-filter-toolbar[data-density="compact"] {
126
98
  --svadmin-filter-control-height: 2rem;
127
99
  --svadmin-filter-control-font: 0.75rem;
128
100
  --svadmin-filter-search-icon-size: 0.875rem;
129
101
  }
130
-
131
102
  .svadmin-filter-toolbar__search {
132
103
  position: relative;
133
104
  min-width: 0;
134
105
  }
135
-
136
106
  .svadmin-filter-toolbar__search-icon {
137
107
  position: absolute;
138
108
  top: 50%;
@@ -143,21 +113,18 @@
143
113
  transform: translateY(-50%);
144
114
  pointer-events: none;
145
115
  }
146
-
147
116
  .svadmin-filter-toolbar[data-density] .svadmin-filter-toolbar__input {
148
117
  height: var(--svadmin-filter-control-height);
149
118
  padding-inline: 2.25rem;
150
119
  font-size: var(--svadmin-filter-control-font);
151
120
  line-height: 1rem;
152
121
  }
153
-
154
122
  .svadmin-filter-toolbar[data-density] .svadmin-filter-toolbar__clear {
155
123
  position: absolute;
156
124
  top: 50%;
157
125
  right: 0.25rem;
158
126
  transform: translateY(-50%);
159
127
  }
160
-
161
128
  .svadmin-filter-toolbar[data-density] .svadmin-filter-toolbar__toggle {
162
129
  flex-shrink: 0;
163
130
  gap: 0.375rem;
@@ -167,23 +134,19 @@
167
134
  white-space: normal;
168
135
  overflow-wrap: anywhere;
169
136
  }
170
-
171
137
  .svadmin-filter-toolbar[data-density="compact"] .svadmin-filter-toolbar__toggle {
172
138
  padding-inline: 0.625rem;
173
139
  }
174
-
175
140
  .svadmin-filter-toolbar .svadmin-filter-toolbar__control-icon {
176
141
  width: 0.875rem;
177
142
  height: 0.875rem;
178
143
  }
179
-
180
144
  .svadmin-filter-toolbar .svadmin-filter-toolbar__chevron {
181
145
  width: 0.75rem;
182
146
  height: 0.75rem;
183
147
  margin-left: 0.125rem;
184
148
  color: var(--muted-foreground);
185
149
  }
186
-
187
150
  .svadmin-filter-toolbar[data-density] .svadmin-filter-toolbar__count {
188
151
  height: 1rem;
189
152
  min-height: 1rem;
@@ -195,32 +158,32 @@
195
158
  line-height: 1;
196
159
  font-variant-numeric: tabular-nums;
197
160
  }
198
-
199
161
  .svadmin-filter-toolbar .svadmin-filter-toolbar-advanced {
200
162
  margin-top: 0.5rem;
201
- border: 1px solid color-mix(in oklch, var(--border) 60%, transparent);
163
+ border: 1px solid var(--border);
164
+ @supports (color: color-mix(in lab, red, red)) {
165
+ border: 1px solid color-mix(in oklch, var(--border) 60%, transparent);
166
+ }
202
167
  border-radius: var(--radius-lg);
203
- background: color-mix(in oklch, var(--muted) 20%, transparent);
168
+ background: var(--muted);
169
+ @supports (color: color-mix(in lab, red, red)) {
170
+ background: color-mix(in oklch, var(--muted) 20%, transparent);
171
+ }
204
172
  padding: 0.75rem;
205
173
  overflow-wrap: anywhere;
206
174
  }
207
-
208
175
  @media (min-width: 640px) {
209
- .svadmin-page-header__row,
210
- .svadmin-filter-toolbar__row {
176
+ .svadmin-page-header__row, .svadmin-filter-toolbar__row {
211
177
  flex-direction: row;
212
178
  flex-wrap: wrap;
213
179
  align-items: center;
214
180
  }
215
-
216
181
  .svadmin-page-header__row {
217
182
  justify-content: space-between;
218
183
  }
219
-
220
184
  .svadmin-page-header__heading {
221
185
  flex: 1 1 16rem;
222
186
  }
223
-
224
187
  .svadmin-filter-toolbar__search {
225
188
  flex: 1 1 14rem;
226
189
  }
@@ -0,0 +1,4 @@
1
+ /** 只选择构建期已生成的类名,不在浏览器生成 CSS。 */
2
+ export { surfaceMetric, surfaceTable, uiButton, uiBadge, uiInput, uiTextarea } from './styled-system/recipes/index.js';
3
+ /** Stripe-first 产品组合部件,消费端仅选择已生成 CSS。 */
4
+ export { productSection, productToolbar, productWorkspace, productSettings, productSettingsRow, productList, productStatus } from './styled-system/recipes/index.js';
@@ -0,0 +1,4 @@
1
+ /** 只选择构建期已生成的类名,不在浏览器生成 CSS。 */
2
+ export { surfaceMetric, surfaceTable, uiButton, uiBadge, uiInput, uiTextarea } from './styled-system/recipes/index.js';
3
+ /** Stripe-first 产品组合部件,消费端仅选择已生成 CSS。 */
4
+ export { productSection, productToolbar, productWorkspace, productSettings, productSettingsRow, productList, productStatus } from './styled-system/recipes/index.js';
@@ -0,0 +1,87 @@
1
+ import type { Component, Snippet } from 'svelte';
2
+ import type { BaseRecord, FieldDefinition } from '@svadmin/core';
3
+ import { type ContractFormAction, type ContractFormDraft, type ContractFormValues, type ContractId, type ContractRecord, type ContractSchemas, type ResourceContract } from '@svadmin/core/resource-contract';
4
+ export type RecordField<S extends ContractSchemas> = Extract<keyof ContractRecord<S>, string>;
5
+ export type FormField<S extends ContractSchemas, A extends ContractFormAction> = Extract<keyof ContractFormValues<S, A>, string>;
6
+ /** 与 AutoTable 的现有 snippet 参数兼容;未经校验的数据保持 unknown。 */
7
+ export interface CellInput {
8
+ value: unknown;
9
+ record: Record<string, unknown>;
10
+ }
11
+ export interface FieldInput {
12
+ field: FieldDefinition;
13
+ value: unknown;
14
+ onchange: (value: unknown) => void;
15
+ }
16
+ export interface CellContext<S extends ContractSchemas, K extends RecordField<S>> {
17
+ key: K;
18
+ record: ContractRecord<S>;
19
+ value: ContractRecord<S>[K];
20
+ }
21
+ export type FieldState<T> = {
22
+ valid: true;
23
+ value: T;
24
+ } | {
25
+ valid: false;
26
+ };
27
+ export interface FieldContext<S extends ContractSchemas, A extends ContractFormAction, K extends FormField<S, A>> {
28
+ field: FieldDefinition & {
29
+ key: K;
30
+ };
31
+ state: FieldState<ContractFormValues<S, A>[K]>;
32
+ readonly: boolean;
33
+ /** 只接收符合当前操作契约的值,运行时也会重新校验。 */
34
+ onchange: (value: ContractFormValues<S, A>[K]) => void;
35
+ /** 草稿可以暂时不满足业务约束,但必须是可快照的普通数据。 */
36
+ onDraftChange: (value: unknown) => void;
37
+ }
38
+ export type CellSnippets<S extends ContractSchemas> = Partial<Record<RecordField<S>, Snippet<[CellInput]>>>;
39
+ export interface RowContext<S extends ContractSchemas> {
40
+ record: ContractRecord<S>;
41
+ id: ContractId<S>;
42
+ }
43
+ /** 动态路由只擦除资源类型,不把未知记录或草稿假定为业务类型。 */
44
+ export interface ResourceRendering {
45
+ readonly resource: ResourceContract;
46
+ record(value: unknown): BaseRecord;
47
+ records(value: unknown): BaseRecord[];
48
+ draft(action: ContractFormAction, value: unknown): Record<string, unknown>;
49
+ }
50
+ /** 同名但不同实例的契约也不可混用;宿主配置必须绑定实际查询契约。 */
51
+ export declare function bindResourceRendering(rendering: ResourceRendering | undefined, resource: ResourceContract): ResourceRendering | undefined;
52
+ /** 业务记录/草稿边界;无需自定义 snippet 时,不把完整渲染工具链加入首屏。 */
53
+ export declare function createResourceRendering<S extends ContractSchemas>(resource: ResourceContract<S>): Readonly<{
54
+ resource: ResourceContract<S>;
55
+ record: (value: unknown) => ContractRecord<S>;
56
+ records: (value: unknown) => ContractRecord<S>[];
57
+ draft: <A extends ContractFormAction>(action: A, value: unknown) => ContractFormDraft<S, A>;
58
+ }>;
59
+ /** 原生 Svelte 渲染适配器:不执行生成代码,不发请求,也不改变组件生命周期。 */
60
+ export declare function createResourceRenderers<S extends ContractSchemas>(resource: ResourceContract<S>): Readonly<{
61
+ resource: ResourceContract<S>;
62
+ record: (value: unknown) => ContractRecord<S>;
63
+ records: (value: unknown) => ContractRecord<S>[];
64
+ draft: <A extends ContractFormAction>(action: A, value: unknown) => Partial<Record<Extract<keyof ContractFormValues<S, A>, string>, unknown>>;
65
+ cell: <K extends RecordField<S>>(key: K, input: CellInput) => CellContext<S, K>;
66
+ row: (input: {
67
+ record: Record<string, unknown>;
68
+ id: string | number;
69
+ }) => RowContext<S>;
70
+ summary: (input: {
71
+ data: readonly unknown[];
72
+ total: number;
73
+ visibleColumnsCount: number;
74
+ }) => {
75
+ data: ContractRecord<S>[];
76
+ total: number;
77
+ visibleColumnsCount: number;
78
+ };
79
+ columns: <const C extends CellSnippets<S>>(snippets: C & Record<Exclude<keyof C, RecordField<S>>, never>) => C;
80
+ field: <A extends ContractFormAction, K extends FormField<S, A>>(action: A, key: K, input: FieldInput) => FieldContext<S, A, K>;
81
+ }>;
82
+ /** 在普通 .ts 配置中保留组件与属性的类型关联;使用原生 <view.component {...view.props} />。 */
83
+ export interface ComponentView<P extends Record<string, unknown>> {
84
+ component: Component<P>;
85
+ props: P;
86
+ }
87
+ export declare function componentView<P extends Record<string, unknown>>(component: Component<P>, props: NoInfer<P>): ComponentView<P>;
@@ -0,0 +1,117 @@
1
+ import { snapshotPlainData } from '@svadmin/core/schema';
2
+ import { contractFormInvalidFields, contractKey, getContractFormFields, parseContractId, parseContractRecord, snapshotContractFormDraft, } from '@svadmin/core/resource-contract';
3
+ /** 同名但不同实例的契约也不可混用;宿主配置必须绑定实际查询契约。 */
4
+ export function bindResourceRendering(rendering, resource) {
5
+ if (rendering && rendering.resource !== resource) {
6
+ throw new TypeError('Renderer resource contract mismatch');
7
+ }
8
+ return rendering;
9
+ }
10
+ function assertAction(action) {
11
+ if (!['create', 'edit', 'clone', 'show'].includes(action)) {
12
+ throw new TypeError('Invalid renderer form action');
13
+ }
14
+ }
15
+ function fieldState(resource, action, key, value) {
16
+ try {
17
+ const draft = snapshotContractFormDraft(resource, action, { [key]: value });
18
+ const invalid = contractFormInvalidFields(resource, action, draft);
19
+ if (invalid.includes(key) || invalid.includes('_root'))
20
+ return { valid: false };
21
+ return { valid: true, value: Object.hasOwn(draft, key) ? draft[key] : undefined };
22
+ }
23
+ catch {
24
+ return { valid: false };
25
+ }
26
+ }
27
+ /** 业务记录/草稿边界;无需自定义 snippet 时,不把完整渲染工具链加入首屏。 */
28
+ export function createResourceRendering(resource) {
29
+ contractKey(resource);
30
+ function record(value) {
31
+ return parseContractRecord(resource, value);
32
+ }
33
+ function records(value) {
34
+ const snapshot = snapshotPlainData(value);
35
+ if (!Array.isArray(snapshot))
36
+ throw new TypeError('Renderer records must be an array');
37
+ return snapshot.map(record);
38
+ }
39
+ function draft(action, value) {
40
+ assertAction(action);
41
+ return snapshotContractFormDraft(resource, action, value);
42
+ }
43
+ return Object.freeze({ resource, record, records, draft });
44
+ }
45
+ /** 原生 Svelte 渲染适配器:不执行生成代码,不发请求,也不改变组件生命周期。 */
46
+ export function createResourceRenderers(resource) {
47
+ const boundary = createResourceRendering(resource);
48
+ const { record, records, draft } = boundary;
49
+ const recordFields = new Set(getContractFormFields(resource, 'show'));
50
+ function cell(key, input) {
51
+ if (!recordFields.has(key))
52
+ throw new TypeError('Unknown renderer record field');
53
+ const checked = record(input.record);
54
+ // value 从已校验记录读取,不相信调用方传入的脱离记录的 value。
55
+ return { key, record: checked, value: checked[key] };
56
+ }
57
+ function row(input) {
58
+ const checked = record(input.record);
59
+ const id = parseContractId(resource, input.id);
60
+ if (!Object.is(id, checked['id']))
61
+ throw new TypeError('Renderer row identity mismatch');
62
+ return { record: checked, id };
63
+ }
64
+ function summary(input) {
65
+ if (!Array.isArray(input.data) || !Number.isSafeInteger(input.total) || input.total < 0
66
+ || !Number.isSafeInteger(input.visibleColumnsCount) || input.visibleColumnsCount < 0) {
67
+ throw new TypeError('Invalid renderer summary');
68
+ }
69
+ return { data: input.data.map(record), total: input.total, visibleColumnsCount: input.visibleColumnsCount };
70
+ }
71
+ function columns(snippets) {
72
+ if (!snippets || ![Object.prototype, null].includes(Object.getPrototypeOf(snippets))
73
+ || Object.getOwnPropertySymbols(snippets).length) {
74
+ throw new TypeError('Invalid renderer column map');
75
+ }
76
+ for (const [key, property] of Object.entries(Object.getOwnPropertyDescriptors(snippets))) {
77
+ if (!recordFields.has(key) || !property.enumerable || !('value' in property)
78
+ || typeof property.value !== 'function')
79
+ throw new TypeError('Invalid renderer column');
80
+ }
81
+ // 不冻结调用方对象,也不保留可被后来添加属性的原始映射。
82
+ return { ...snippets };
83
+ }
84
+ function field(action, key, input) {
85
+ assertAction(action);
86
+ if (!getContractFormFields(resource, action).includes(key) || input.field.key !== key) {
87
+ throw new TypeError('Renderer form field mismatch');
88
+ }
89
+ const change = input.onchange;
90
+ const readonly = action === 'show';
91
+ function assertWritable() {
92
+ if (readonly)
93
+ throw new TypeError('Cannot update a read-only renderer');
94
+ }
95
+ return {
96
+ field: { ...input.field, key },
97
+ state: fieldState(resource, action, key, input.value),
98
+ readonly,
99
+ onchange(value) {
100
+ assertWritable();
101
+ const checked = fieldState(resource, action, key, value);
102
+ if (!checked.valid)
103
+ throw new TypeError('Invalid renderer field value');
104
+ change(checked.value);
105
+ },
106
+ onDraftChange(value) {
107
+ assertWritable();
108
+ const draft = snapshotContractFormDraft(resource, action, { [key]: value });
109
+ change(Object.hasOwn(draft, key) ? draft[key] : undefined);
110
+ },
111
+ };
112
+ }
113
+ return Object.freeze({ resource, record, records, draft, cell, row, summary, columns, field });
114
+ }
115
+ export function componentView(component, props) {
116
+ return { component, props };
117
+ }
@@ -0,0 +1,36 @@
1
+ import { withoutSpace } from '../helpers.js';
2
+
3
+ const conditionsStr = "_hover,_focus,_focusWithin,_focusVisible,_disabled,_active,_visited,_target,_readOnly,_readWrite,_empty,_checked,_enabled,_expanded,_highlighted,_complete,_incomplete,_dragging,_before,_after,_firstLetter,_firstLine,_marker,_selection,_file,_backdrop,_first,_last,_only,_even,_odd,_firstOfType,_lastOfType,_onlyOfType,_peerFocus,_peerHover,_peerActive,_peerFocusWithin,_peerFocusVisible,_peerDisabled,_peerChecked,_peerInvalid,_peerExpanded,_peerPlaceholderShown,_groupFocus,_groupHover,_groupActive,_groupFocusWithin,_groupFocusVisible,_groupDisabled,_groupChecked,_groupExpanded,_groupInvalid,_indeterminate,_required,_valid,_invalid,_autofill,_inRange,_outOfRange,_placeholder,_placeholderShown,_pressed,_selected,_grabbed,_underValue,_overValue,_atValue,_default,_optional,_open,_closed,_fullscreen,_loading,_hidden,_current,_currentPage,_currentStep,_today,_unavailable,_rangeStart,_rangeEnd,_now,_topmost,_motionReduce,_motionSafe,_print,_landscape,_portrait,_dark,_light,_osDark,_osLight,_highContrast,_lessContrast,_moreContrast,_ltr,_rtl,_scrollbar,_scrollbarThumb,_scrollbarTrack,_horizontal,_vertical,_icon,_starting,_noscript,_invertedColors,base"
4
+ const conditions = new Set(conditionsStr.split(','))
5
+
6
+ const conditionRegex = /^@|&|&$/
7
+
8
+ export function isCondition(value){
9
+ return conditions.has(value) || conditionRegex.test(value)
10
+ }
11
+
12
+ const underscoreRegex = /^_/
13
+ const conditionsSelectorRegex = /&|@/
14
+
15
+ export function finalizeConditions(paths){
16
+ return paths.map((path) => {
17
+ if (conditions.has(path)){
18
+ return path.replace(underscoreRegex, '')
19
+ }
20
+
21
+ if (conditionsSelectorRegex.test(path)){
22
+ return `[${withoutSpace(path.trim())}]`
23
+ }
24
+
25
+ return path
26
+ })}
27
+
28
+ export function sortConditions(paths){
29
+ return paths.sort((a, b) => {
30
+ const aa = isCondition(a)
31
+ const bb = isCondition(b)
32
+ if (aa && !bb) return 1
33
+ if (!aa && bb) return -1
34
+ return 0
35
+ })
36
+ }
@@ -0,0 +1,22 @@
1
+ /* eslint-disable */
2
+ import type { SystemStyleObject } from '../types/index';
3
+
4
+ type Styles = SystemStyleObject | undefined | null | false
5
+
6
+ interface CssRawFunction {
7
+ (styles: Styles): SystemStyleObject
8
+ (styles: Styles[]): SystemStyleObject
9
+ (...styles: Array<Styles | Styles[]>): SystemStyleObject
10
+ (styles: Styles): SystemStyleObject
11
+ }
12
+
13
+ interface CssFunction {
14
+ (styles: Styles): string
15
+ (styles: Styles[]): string
16
+ (...styles: Array<Styles | Styles[]>): string
17
+ (styles: Styles): string
18
+
19
+ raw: CssRawFunction
20
+ }
21
+
22
+ export declare const css: CssFunction;