@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 @@
1
+ export declare const classProperties: Readonly<Record<string, readonly number[]>>;
@@ -0,0 +1,2 @@
1
+ // Generated from owned finite CSS by scripts/build-native-classnames.mjs.
2
+ export const classProperties = { "[writing-mode:vertical-rl]": [144], "appearance-none": [28, 38], "bg-emerald-500/10": [41, 256], "bg-info": [41], "bg-rose-500": [41], "blur": [4, 70], "border-zinc-800": [49], "capitalize": [129], "collapse": [140], "container": [142, 172, 191, 211, 223, 233], "contents": [68], "dark:bg-destructive": [147], "dark:text-green-400": [149], "drop-shadow-sm": [6, 7, 70], "fade-in": [9], "fade-in-0": [9], "fill-amber-500": [69], "filter": [70], "inline": [68], "invisible": [140], "italic": [77], "line-through": [127], "max-w-[64rem]": [98], "max-w-[74rem]": [98], "max-w-[78rem]": [98], "max-w-[92rem]": [98], "max-w-xs": [98], "no-underline": [127], "outline": [104, 105], "running": [37], "scrollbar-none": [125], "slide-in-from-right": [11], "sm:col-span-3": [164], "sm:col-span-4": [164], "sm:max-w-xl": [172], "static": [119], "svadmin-u-005b1fee4088": [97], "svadmin-u-00cde2e9f1cf": [100], "svadmin-u-00e05b9a87d5": [65], "svadmin-u-012fbd121f37": [73], "svadmin-u-01cc1873771f": [110, 111], "svadmin-u-020ba687fa12": [161], "svadmin-u-0214b4b355d1": [68], "svadmin-u-022e8076dfea": [159, 183], "svadmin-u-0277bd2c2996": [100], "svadmin-u-02af9e5da98e": [130], "svadmin-u-02cafd385619": [110, 111], "svadmin-u-02fc11cfd270": [160], "svadmin-u-03b4dd7f172b": [110, 111], "svadmin-u-0478c89a150f": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-0497cfa907ee": [98], "svadmin-u-050494726fba": [176], "svadmin-u-054cb4e36116": [30, 32, 68, 106], "svadmin-u-055a17b0d27b": [99], "svadmin-u-05f954a846d6": [49, 257], "svadmin-u-05faf5c801ff": [49, 257], "svadmin-u-064e4b9e19c3": [25, 87], "svadmin-u-069503724c35": [142], "svadmin-u-06b1d9433e62": [76], "svadmin-u-06bbb43166db": [24, 63], "svadmin-u-07017cde3e97": [83], "svadmin-u-07389a777c1f": [44, 45, 57, 58], "svadmin-u-078ed38802b9": [222], "svadmin-u-083abb355258": [65, 258], "svadmin-u-087ea857932e": [117], "svadmin-u-08cc9b1d44f8": [25, 87], "svadmin-u-095acb275581": [83], "svadmin-u-09ace3a4d9f5": [25, 87], "svadmin-u-09c1ba5f3e1a": [112], "svadmin-u-09deafdfd7f5": [24, 63], "svadmin-u-0a0bdc193a65": [16, 255], "svadmin-u-0a58453f3755": [181], "svadmin-u-0a769880db93": [83], "svadmin-u-0a88129d55fd": [96], "svadmin-u-0ab8667228fd": [96], "svadmin-u-0b8c506a0596": [102], "svadmin-u-0b91436debbd": [113, 114], "svadmin-u-0bf5f8e17abf": [184], "svadmin-u-0c15f6cff5a0": [18, 19], "svadmin-u-0c3bc98565dd": [66, 123], "svadmin-u-0c5e9137c7de": [44, 45, 57, 58], "svadmin-u-0c67ca474a69": [102], "svadmin-u-0cfe3fb5e434": [99], "svadmin-u-0d304f904cb0": [66, 123], "svadmin-u-0da48290f782": [92, 93], "svadmin-u-0e12dc7de920": [92, 93], "svadmin-u-0e17f2bd9074": [113, 114], "svadmin-u-0e5b245b4ed1": [99], "svadmin-u-0e65706bcccd": [75], "svadmin-u-0f2fff0ae96e": [145], "svadmin-u-0f618ab9ca2f": [65], "svadmin-u-0f8a144a7c17": [66], "svadmin-u-0fe7d7d814d0": [0, 1, 2, 135, 136, 137], "svadmin-u-1004c0c3954c": [66, 123], "svadmin-u-106b502aac96": [65, 258], "svadmin-u-10d7a2feb011": [142], "svadmin-u-10db0d558201": [83], "svadmin-u-1100bef66e60": [110, 111], "svadmin-u-11863ecc32e7": [142], "svadmin-u-119b2aa0b8f6": [55, 61], "svadmin-u-11e59c6d5f6b": [83], "svadmin-u-1256b2f6ad2d": [89, 90], "svadmin-u-1301e5c1ce71": [57, 58], "svadmin-u-133e86d6e1b8": [41, 256], "svadmin-u-1384f66f41d0": [108], "svadmin-u-145745bf5286": [145], "svadmin-u-14ce684b980b": [83], "svadmin-u-14e46609fd68": [24, 63], "svadmin-u-152267a018a5": [99], "svadmin-u-15e1b1f444fe": [96], "svadmin-u-166af870e200": [91], "svadmin-u-16a5872ee870": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-16b1efa5875e": [20, 63], "svadmin-u-16d6f96aa157": [41, 256], "svadmin-u-170cee3ff4e4": [107], "svadmin-u-1734f23deafe": [100], "svadmin-u-173fa8f06789": [117], "svadmin-u-177c5cdba493": [113, 114], "svadmin-u-179c0e54131c": [99], "svadmin-u-17a9f7af2265": [41, 256], "svadmin-u-18049387f0af": [49], "svadmin-u-181b286668b5": [145], "svadmin-u-18550d5945ae": [13, 88], "svadmin-u-1884518576f2": [174, 175, 176, 177, 178, 179, 180, 181], "svadmin-u-189f036c335c": [62], "svadmin-u-18a6e7a36f29": [49, 257], "svadmin-u-18d3e28787c3": [165], "svadmin-u-18f4ce4080f9": [146, 148], "svadmin-u-19d9b25e8fae": [209], "svadmin-u-1b1df78e4d0a": [116], "svadmin-u-1b2d54a3fd12": [110, 111], "svadmin-u-1bb883263ed2": [91], "svadmin-u-1c1af10f0ece": [41, 256], "svadmin-u-1ca6dd1e47c4": [3, 29, 40], "svadmin-u-1d274d2422d8": [98], "svadmin-u-1d4402dfae51": [98], "svadmin-u-1d5904e7e755": [76], "svadmin-u-1d7f28b046ad": [25, 87], "svadmin-u-1d9f2d98d149": [142], "svadmin-u-1dc571a3609f": [76], "svadmin-u-1e3de5ebbb2f": [142], "svadmin-u-1eb5c6df38c1": [74], "svadmin-u-1ee417e4637c": [67], "svadmin-u-1f51d781e606": [166], "svadmin-u-1fdf1b136104": [124], "svadmin-u-20269b6b378e": [69], "svadmin-u-2074a75bf2e7": [73], "svadmin-u-20aaf08a7ed1": [65], "svadmin-u-20ebde75765d": [115], "svadmin-u-2167406b24d7": [131], "svadmin-u-21752b56424c": [16], "svadmin-u-2191c1456297": [98], "svadmin-u-22a0a8a25f55": [147, 150], "svadmin-u-22bb278694b4": [49, 257], "svadmin-u-22e59b722111": [86], "svadmin-u-22fda335435d": [41, 256], "svadmin-u-233c0494b485": [0, 8, 135], "svadmin-u-236812d64c82": [145], "svadmin-u-23e1f628d033": [142], "svadmin-u-24104d87db9a": [41, 256], "svadmin-u-243d62579c55": [99], "svadmin-u-24546591650c": [121], "svadmin-u-2472e9b81a97": [98], "svadmin-u-2534f14adad5": [98], "svadmin-u-259ce51fc8f3": [151], "svadmin-u-25effcb585ab": [100], "svadmin-u-2689f3958069": [12, 79], "svadmin-u-269105289e8f": [41, 256], "svadmin-u-2691847b25ed": [16, 255], "svadmin-u-26e4f7bdbd56": [49, 257], "svadmin-u-27165ed73e86": [156, 157], "svadmin-u-283481e780bb": [41, 256], "svadmin-u-2859c861d7de": [41, 256], "svadmin-u-286893e2971d": [100], "svadmin-u-287a02ddc463": [41, 256], "svadmin-u-28ab41ff3b38": [142], "svadmin-u-28ae52cc20ae": [100], "svadmin-u-2917dba92464": [41, 256], "svadmin-u-29b733e4c162": [67], "svadmin-u-29f553b60628": [41, 256], "svadmin-u-2a2db4667b27": [102], "svadmin-u-2a95a5f480f7": [131], "svadmin-u-2adea12c41f3": [207], "svadmin-u-2b64ecb90ede": [196, 205], "svadmin-u-2b6f77ad4036": [16, 255], "svadmin-u-2bbcfc3b5179": [142], "svadmin-u-2c1f5e2b6a5b": [224], "svadmin-u-2c69d147b501": [122], "svadmin-u-2c955d1b45df": [80], "svadmin-u-2cc8041eca99": [98], "svadmin-u-2cd02d11d1af": [106], "svadmin-u-2d56f1807e51": [41, 256], "svadmin-u-2daa8e5e2f2e": [31, 61, 64, 83, 89, 90, 91, 92, 93, 94, 95, 96, 106, 110, 111, 112, 113, 114, 115, 116, 117, 119, 141, 142], "svadmin-u-2e479b8dbbd7": [134], "svadmin-u-2e7a6d18a20d": [100], "svadmin-u-2eba0d65d059": [126], "svadmin-u-2ee0591bf105": [209], "svadmin-u-2ef11f1cb219": [41], "svadmin-u-2f27a80ed92b": [209], "svadmin-u-2f2a842e50fa": [83], "svadmin-u-2f960aa0c478": [49, 257], "svadmin-u-3032cae0badb": [14, 78], "svadmin-u-306d283a53fe": [27, 138], "svadmin-u-308fc069e46e": [126], "svadmin-u-30c1d058f0db": [117], "svadmin-u-30ca335ae9c2": [65], "svadmin-u-30f13f694038": [41, 256], "svadmin-u-3143d72a3869": [100], "svadmin-u-319548b23f75": [158], "svadmin-u-31d2902b53fb": [142], "svadmin-u-31f2553311b6": [96], "svadmin-u-32aac21b02c8": [81], "svadmin-u-3350916b3513": [122], "svadmin-u-3355648fe22b": [41], "svadmin-u-33787152c8e8": [146, 148], "svadmin-u-338625ff877e": [41, 256], "svadmin-u-34516836730d": [67], "svadmin-u-358af0b65a31": [41, 256], "svadmin-u-359090c2d529": [76, 88], "svadmin-u-35b2f3aff60f": [98], "svadmin-u-3698555097d6": [98], "svadmin-u-36b381be4df3": [27, 138], "svadmin-u-36d4469299aa": [44, 45, 57, 58], "svadmin-u-36e579c0b41c": [71], "svadmin-u-3713c4c7843d": [98], "svadmin-u-375dc44df6e9": [41, 256], "svadmin-u-375f36f67650": [123], "svadmin-u-38a2a10339a0": [238], "svadmin-u-3960ffc248d9": [34], "svadmin-u-3972e98dc84f": [102], "svadmin-u-3a1268a4e17f": [83], "svadmin-u-3a33f11548cd": [65, 258], "svadmin-u-3a4ff758c2ab": [65], "svadmin-u-3b9871a0bf93": [166], "svadmin-u-3bb45dd48a74": [41, 256], "svadmin-u-3bbc8c13feec": [67], "svadmin-u-3c63a476b257": [134], "svadmin-u-3c8ea328c09e": [83], "svadmin-u-3d50bc090e79": [239, 240, 241, 242, 243, 244, 245, 246], "svadmin-u-3daca9af0861": [20, 63], "svadmin-u-3e0fd166d494": [119], "svadmin-u-3e1868fc53e2": [16], "svadmin-u-3e3534b4c5df": [65, 258], "svadmin-u-3eb153dc198f": [206], "svadmin-u-3ee5df8c651f": [62], "svadmin-u-3f2a1ff6358f": [99], "svadmin-u-3fd0f778c8d9": [162], "svadmin-u-3febee094e85": [76, 88], "svadmin-u-40137e897961": [36], "svadmin-u-421ac2be5045": [44, 45, 57, 58], "svadmin-u-422d10025c0d": [208], "svadmin-u-42536e69e639": [76, 88], "svadmin-u-426b8b75185b": [83], "svadmin-u-438b2237b8d6": [24, 63], "svadmin-u-43928fcc832f": [41, 256], "svadmin-u-43ed7af3fc8a": [41], "svadmin-u-44559afbdbd7": [20, 63], "svadmin-u-4455d4748b63": [81], "svadmin-u-445ec4d497ce": [50, 51], "svadmin-u-4460ceede36b": [100], "svadmin-u-44ee8ba0a421": [66, 123], "svadmin-u-451f34ab545d": [143], "svadmin-u-4558bce6d8c0": [209], "svadmin-u-4583f90cd9bd": [48], "svadmin-u-45c5dd0869c8": [86], "svadmin-u-45d828117213": [113, 114], "svadmin-u-465609a240a8": [110, 111], "svadmin-u-467420585af4": [97], "svadmin-u-46daeb0b661f": [41, 256], "svadmin-u-4701b613ff95": [174, 175], "svadmin-u-478497d5efa5": [209], "svadmin-u-479a710e57e6": [99], "svadmin-u-47a69140380e": [142], "svadmin-u-4827635fb99f": [142], "svadmin-u-4a33def12a78": [209], "svadmin-u-4a5f0ea04648": [5, 55], "svadmin-u-4b159de349a5": [99], "svadmin-u-4b5cc19bfdfc": [85], "svadmin-u-4bdb6700d16a": [100], "svadmin-u-4bfac3b6a99f": [98], "svadmin-u-4c15f4f8c5ab": [121], "svadmin-u-4c1e8d12f3db": [49], "svadmin-u-4cf5af8d25d3": [41, 256], "svadmin-u-4d62c2e3009b": [209], "svadmin-u-4e5ca9623e22": [65, 258], "svadmin-u-4e5d2af5fc1f": [96], "svadmin-u-4ee734926ff6": [76, 88], "svadmin-u-4f5874c554b6": [102], "svadmin-u-4f98da6f3301": [142], "svadmin-u-5064267f78e3": [65], "svadmin-u-506a96403942": [91], "svadmin-u-508ebf85b1c9": [83], "svadmin-u-50ca6ba56aa3": [67], "svadmin-u-50d0d216a2f8": [96], "svadmin-u-513d5c30bf66": [66], "svadmin-u-516b03df0b7c": [142], "svadmin-u-52083e7da442": [68], "svadmin-u-520bb7118c41": [97], "svadmin-u-52183a1cca53": [65, 258], "svadmin-u-521fa0c7c407": [49], "svadmin-u-52be28846b5f": [117], "svadmin-u-536a7530a44f": [145], "svadmin-u-53bb3a280599": [41, 256], "svadmin-u-53eae0624db1": [98], "svadmin-u-53ecdb131b58": [99], "svadmin-u-5540f3495030": [167], "svadmin-u-558f64349245": [97], "svadmin-u-55acecc7e2f1": [41, 256], "svadmin-u-55b6d9158f15": [41, 256], "svadmin-u-56796a90bec5": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-569eb16216dd": [112], "svadmin-u-56bf8ae82a10": [0, 1, 2, 135, 136, 137], "svadmin-u-58284b4ea568": [66, 123], "svadmin-u-582e6ef4b245": [17], "svadmin-u-591f378e24a1": [49, 257], "svadmin-u-5a14cc9f9ed4": [186], "svadmin-u-5a1ab9dd55a5": [65], "svadmin-u-5a438c30beec": [121], "svadmin-u-5b92fd698365": [16, 255], "svadmin-u-5bd7b080992c": [120], "svadmin-u-5ceb636bd9f3": [53, 54], "svadmin-u-5d17652eacdf": [209], "svadmin-u-5e8a03e061f9": [131], "svadmin-u-5f1ff8fe8768": [65, 258], "svadmin-u-5f22e64f2282": [44, 45, 57, 58], "svadmin-u-5f89f14a26db": [84], "svadmin-u-6032d46445ba": [65], "svadmin-u-60541e1e26f8": [34], "svadmin-u-60ed9c3ef326": [41, 256], "svadmin-u-60fbb7713999": [68], "svadmin-u-610bcc1bb506": [49, 257], "svadmin-u-61357c0c2f29": [110, 111], "svadmin-u-618162408e7a": [95], "svadmin-u-6199866f612f": [98], "svadmin-u-625a4c3fbeb2": [0, 8, 135], "svadmin-u-62925abe316b": [121], "svadmin-u-62c392c49841": [210], "svadmin-u-633ef3c47872": [24, 63], "svadmin-u-63a285be6490": [66, 123], "svadmin-u-64643d78ed9b": [41], "svadmin-u-64a6e3fce6e0": [201, 202], "svadmin-u-64cac80d2e9a": [153], "svadmin-u-64f847a259bc": [222], "svadmin-u-650758f4572a": [142], "svadmin-u-65281709dacf": [91], "svadmin-u-65935df577ba": [55, 61], "svadmin-u-65ac0c49a5d5": [46, 47], "svadmin-u-65fdbade2025": [46, 47], "svadmin-u-660d2effb880": [110, 111], "svadmin-u-6643d7cf66cb": [222], "svadmin-u-665f07fe73cc": [83, 142], "svadmin-u-668b21aa5409": [83], "svadmin-u-671513a87226": [142], "svadmin-u-676c91deb47e": [160], "svadmin-u-67d6184a0024": [0, 1, 2, 135, 136, 137], "svadmin-u-67d7e383dca6": [97], "svadmin-u-68750801bcf6": [41, 256], "svadmin-u-687e17559be1": [209], "svadmin-u-68d3fc190004": [121], "svadmin-u-68d55a736ff4": [65, 258], "svadmin-u-68ecb30dbec6": [110, 111], "svadmin-u-68f2db624df7": [44, 45, 57, 58], "svadmin-u-68fe531347b9": [100], "svadmin-u-69450ef1487e": [12, 79], "svadmin-u-69aaf7265e58": [100], "svadmin-u-69cdf25ad1e4": [76], "svadmin-u-69da7e4ff95d": [142], "svadmin-u-6a1572b6bf5a": [41, 256], "svadmin-u-6a31d3b03df0": [33, 139], "svadmin-u-6a60c09e6aaa": [83], "svadmin-u-6aef32016896": [120], "svadmin-u-6b189c6edadb": [13, 88], "svadmin-u-6b3526212209": [186], "svadmin-u-6b7265b65ab7": [83, 142], "svadmin-u-6b7d6e21ccbd": [117], "svadmin-u-6c32e8173349": [62], "svadmin-u-6ca625288b1e": [142], "svadmin-u-6cbc84dd9e1a": [49], "svadmin-u-6da6a3c3f741": [142], "svadmin-u-6dfb687ea917": [158], "svadmin-u-6e718d5684c2": [83], "svadmin-u-6ee2d41e2d2d": [49, 257], "svadmin-u-6f27f4f79e55": [34], "svadmin-u-6f8ab8abb126": [17], "svadmin-u-6ffcd84c45e5": [49], "svadmin-u-7054e2767710": [13, 88], "svadmin-u-7065497e1ca0": [102], "svadmin-u-706701550477": [41, 256], "svadmin-u-706c16d853e6": [66], "svadmin-u-707e8e52f284": [41], "svadmin-u-711a3789b7a6": [65, 258], "svadmin-u-714816efc69c": [102], "svadmin-u-7178afa5bad6": [209], "svadmin-u-71e31b2f1bb2": [142], "svadmin-u-71ec51c9997d": [142], "svadmin-u-7209fd2a90e7": [174, 175], "svadmin-u-72470489ff4e": [142], "svadmin-u-72a4c7cdeef7": [65], "svadmin-u-7357df2b2e0c": [76], "svadmin-u-73a1340934c0": [83], "svadmin-u-73fc3fb18ceb": [106], "svadmin-u-74b2435a1d40": [142], "svadmin-u-74f9876a6800": [89, 90, 91, 92, 93, 94, 95, 96], "svadmin-u-751fb0d102ba": [76, 88], "svadmin-u-7597e11b4d4b": [113, 114], "svadmin-u-75b1bec3ea0e": [41], "svadmin-u-75be195e1cd6": [96], "svadmin-u-76067d04e222": [76], "svadmin-u-7660b450905a": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-76610325273f": [92, 93], "svadmin-u-76747e5e02ff": [65], "svadmin-u-77533d414653": [170], "svadmin-u-77a2a20e90d4": [66, 123], "svadmin-u-77c08e015d14": [85], "svadmin-u-783b0d9d1e2c": [83, 142], "svadmin-u-7890552ecd63": [0, 8, 135], "svadmin-u-78e6d0ebb9a4": [102], "svadmin-u-793346c7362c": [99], "svadmin-u-793c2275b157": [213, 214, 215, 216, 217, 218, 219, 220], "svadmin-u-79bf1259388b": [75], "svadmin-u-7a0854fdbc30": [41, 256], "svadmin-u-7a09f4b2d159": [99], "svadmin-u-7a470f4c9b28": [131], "svadmin-u-7a9aabfcd059": [177, 178], "svadmin-u-7a9ad020b130": [83, 142], "svadmin-u-7ab81aede9d8": [142], "svadmin-u-7b17becb34a1": [98], "svadmin-u-7b2d63937d23": [121], "svadmin-u-7b32fba79b0f": [24, 63], "svadmin-u-7b7df0449b80": [62, 86, 121, 131], "svadmin-u-7bbb00f9ba7a": [83, 142], "svadmin-u-7bc555991dba": [119], "svadmin-u-7be4d67a6256": [65, 258], "svadmin-u-7d167f503a39": [209], "svadmin-u-7d283214b870": [203, 204], "svadmin-u-7d5d4c29be2a": [118], "svadmin-u-7d85d0c21a32": [101], "svadmin-u-7e0b7cdf1a94": [100], "svadmin-u-7e3e9a76c966": [113, 114], "svadmin-u-7e74e5fe798a": [142], "svadmin-u-7e9a2a250cc3": [66, 123], "svadmin-u-7ec10f86d9b1": [142], "svadmin-u-7f044b149379": [24, 63], "svadmin-u-7f19cdf4c5bb": [41], "svadmin-u-7f351d50b6e6": [41, 256], "svadmin-u-7f6912283f11": [33, 139], "svadmin-u-7fc47b48933f": [102], "svadmin-u-7fc7f732bf7e": [83], "svadmin-u-7fcf9124b5df": [112], "svadmin-u-8045cf4c0182": [165], "svadmin-u-8078c71d23ee": [33, 139], "svadmin-u-811148b13d1e": [65], "svadmin-u-81976f3f2c63": [115], "svadmin-u-823f000e740a": [18, 19], "svadmin-u-82cc6c6581cd": [95], "svadmin-u-82d0b7da66df": [99], "svadmin-u-831f8770959d": [224], "svadmin-u-8417db9333ae": [41, 256], "svadmin-u-844322115e56": [0, 8, 135], "svadmin-u-845f53365c8d": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-84789e8a20cd": [142], "svadmin-u-84bdd56b0e81": [169], "svadmin-u-85399de17097": [16], "svadmin-u-85d919893645": [41, 256], "svadmin-u-86171d20618e": [83], "svadmin-u-86843cf1e227": [85], "svadmin-u-8782d84cc906": [131], "svadmin-u-87faeaaa291e": [212], "svadmin-u-8956a4275b9d": [95], "svadmin-u-897d497e57b6": [98], "svadmin-u-898c0bcba480": [165], "svadmin-u-89904d276530": [99], "svadmin-u-89a62219c1a7": [39], "svadmin-u-8a1efe654daa": [65, 258], "svadmin-u-8a25a995eb8e": [41, 256], "svadmin-u-8a3831239aa5": [194, 195], "svadmin-u-8a539c7fe216": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-8a5560925d62": [56], "svadmin-u-8a7a926578c8": [99], "svadmin-u-8aee2b07b47d": [97], "svadmin-u-8b434b651a9e": [16, 255], "svadmin-u-8b8196092091": [42, 43], "svadmin-u-8baf13a3e9d7": [25, 87], "svadmin-u-8bd891360308": [152, 185], "svadmin-u-8d08385288a6": [67], "svadmin-u-8dddea0773ed": [72], "svadmin-u-8e63407b5ceb": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-8e75e3db482b": [81], "svadmin-u-8e7bba3352f0": [16, 255], "svadmin-u-8ecebc9f80e6": [12, 79], "svadmin-u-8edb3fc31a03": [186], "svadmin-u-8ef2268efbbc": [85], "svadmin-u-8ffe7a29179a": [94], "svadmin-u-9079b62ef1cb": [115], "svadmin-u-918184635b1d": [65], "svadmin-u-9249876ba240": [174, 175], "svadmin-u-92b7f35f04c0": [67], "svadmin-u-92bf82f493b1": [109], "svadmin-u-92e13d146fd7": [142], "svadmin-u-92e7450ad20d": [142], "svadmin-u-931228bbb579": [81], "svadmin-u-9335c39f6eff": [117], "svadmin-u-93b32079b969": [89, 90], "svadmin-u-940911bf310c": [110, 111], "svadmin-u-940924b6e2d9": [142], "svadmin-u-945ecb9a9005": [49, 257], "svadmin-u-952dfef04298": [234, 236], "svadmin-u-956fcc198f22": [222], "svadmin-u-95b7dea5a67f": [49, 257], "svadmin-u-9673d11dbf8a": [182], "svadmin-u-96747a728556": [65, 258], "svadmin-u-9678c61eaac3": [83], "svadmin-u-967d113a1451": [41, 256], "svadmin-u-968a1e649bad": [99], "svadmin-u-9794ab45094d": [98], "svadmin-u-97f0119b2cac": [41, 256], "svadmin-u-980d09f1c472": [52], "svadmin-u-983fa003115f": [25, 87], "svadmin-u-98714a2f7d41": [65, 258], "svadmin-u-989541ad4512": [115], "svadmin-u-989c466fdbe7": [41, 256], "svadmin-u-9939b97359ce": [83, 142], "svadmin-u-9953408a8ef3": [96], "svadmin-u-998e0b29fe9e": [163, 168], "svadmin-u-99d459b1015d": [41, 256], "svadmin-u-99d72c7fc3e2": [68], "svadmin-u-9a2db8f949b6": [131], "svadmin-u-9a638cfe8212": [190], "svadmin-u-9af3b4b6dc9e": [83, 142], "svadmin-u-9b13e8ae5c9c": [65], "svadmin-u-9b3d0721b628": [83], "svadmin-u-9c4dae6452a4": [161], "svadmin-u-9cea05671a29": [142], "svadmin-u-9d5d8b4711b4": [49, 257], "svadmin-u-9d60be3a6d80": [188], "svadmin-u-9e10c04e17bb": [92, 93], "svadmin-u-9e3dc30c26a3": [98], "svadmin-u-9e50f522071f": [39], "svadmin-u-9e83b2412bc9": [115], "svadmin-u-9f76a62f4f44": [153], "svadmin-u-9fcd8a13827e": [112], "svadmin-u-9fe52d5d506c": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-a0206a0583c8": [99], "svadmin-u-a02aa8a60111": [172], "svadmin-u-a06ab179a5d5": [225, 226, 227, 228, 229, 230, 231, 232], "svadmin-u-a09a722d3ce4": [172], "svadmin-u-a10fdd7667ee": [16, 255], "svadmin-u-a127a4f41a7d": [49, 257], "svadmin-u-a139beb4e318": [110, 111], "svadmin-u-a14daebf7748": [76], "svadmin-u-a1e7a8069878": [100], "svadmin-u-a1f611f027dd": [110, 111], "svadmin-u-a201da4b0d91": [97], "svadmin-u-a217b4eaa918": [44, 45, 57, 58], "svadmin-u-a29b7a649c77": [5, 55], "svadmin-u-a2edcb1a3a6b": [141], "svadmin-u-a3158643e114": [16, 255], "svadmin-u-a327049cac5b": [206], "svadmin-u-a3899220f90e": [66, 123], "svadmin-u-a4326536b8f5": [118], "svadmin-u-a43c96035e6f": [209], "svadmin-u-a4805b5f5b63": [97], "svadmin-u-a486cacb3a15": [41], "svadmin-u-a4ba1a079087": [24, 63], "svadmin-u-a4d0f420b78d": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-a4fe7d4d1e07": [49, 257], "svadmin-u-a50d3377f4ac": [67], "svadmin-u-a59afa8d9b9d": [41], "svadmin-u-a6afccfc915b": [49, 257], "svadmin-u-a6e88615d742": [72], "svadmin-u-a77ed4d908c0": [91], "svadmin-u-a7a63217e098": [65], "svadmin-u-a909a196be82": [41, 256], "svadmin-u-a9436de0cd55": [235, 237], "svadmin-u-a94f89d92058": [207], "svadmin-u-a968a4123359": [154, 155], "svadmin-u-a9ef791a0777": [100], "svadmin-u-aa2c13a5e1b4": [116], "svadmin-u-aa6c1169cd77": [72], "svadmin-u-aac62f0e854f": [96], "svadmin-u-aadad6871af8": [83], "svadmin-u-ab159a179155": [41, 256], "svadmin-u-ab1b20c2292a": [165], "svadmin-u-ab82c25c24ec": [116], "svadmin-u-ac204c108886": [44, 45, 57, 58], "svadmin-u-ac402894e356": [41, 256], "svadmin-u-ac7e80a2c2ae": [212], "svadmin-u-acaee62117b1": [83], "svadmin-u-ad36c0242ee8": [124], "svadmin-u-ad47d17e603c": [24, 63], "svadmin-u-add63bc6753d": [83, 142], "svadmin-u-adfb03d826b8": [89, 90], "svadmin-u-ae2181c7b10f": [142], "svadmin-u-ae724a8c3dec": [67], "svadmin-u-aea6160836e7": [83], "svadmin-u-afbdd13a380e": [36], "svadmin-u-afc45e21ada6": [99], "svadmin-u-b00f43c30c2b": [41, 256], "svadmin-u-b03f3c253900": [186], "svadmin-u-b06f8413aa63": [83, 142], "svadmin-u-b1044d8600a8": [131], "svadmin-u-b1104f41444a": [101], "svadmin-u-b1c4d746518d": [65], "svadmin-u-b247a17a0d75": [41, 256], "svadmin-u-b2e7cc55921c": [86], "svadmin-u-b39e60c339f4": [66, 123], "svadmin-u-b4168890eac6": [97], "svadmin-u-b45ce4b65d53": [94], "svadmin-u-b485ae1c3b47": [55, 61], "svadmin-u-b486a1ee45b0": [76], "svadmin-u-b4f9f7800899": [65, 258], "svadmin-u-b59cd297c349": [39], "svadmin-u-b5f3ff77f4f9": [83], "svadmin-u-b63b7d8eef5d": [97], "svadmin-u-b6777c6db914": [91], "svadmin-u-b67ee2eeca37": [142], "svadmin-u-b6b02c0ebef6": [96], "svadmin-u-b7012bb243cc": [34], "svadmin-u-b7ce0d2f6c04": [142], "svadmin-u-b7daff9b9ddd": [174, 175], "svadmin-u-b7dfca40c07f": [186], "svadmin-u-b86f7f946cd8": [222], "svadmin-u-b8f0a08ece1e": [83], "svadmin-u-b950dda299d3": [59, 60], "svadmin-u-b9e5bb3c1a40": [67], "svadmin-u-ba002e28b7ba": [172], "svadmin-u-ba1dab71e35e": [41, 256], "svadmin-u-ba939ea82d8b": [41], "svadmin-u-bac517ea5f0f": [209], "svadmin-u-baceed3462fd": [142], "svadmin-u-bb0c4bfc52bd": [68], "svadmin-u-bb10ec63a8d0": [222], "svadmin-u-bb3e95154365": [199, 200], "svadmin-u-bcf14a5a5472": [123], "svadmin-u-be2e831be5dd": [81], "svadmin-u-be62e835b692": [16, 255], "svadmin-u-bee68af349c9": [59, 60], "svadmin-u-bf1b5b54929e": [222], "svadmin-u-bf600f8e029c": [142], "svadmin-u-bf60a82ffbd9": [187], "svadmin-u-bfa603190748": [65], "svadmin-u-c05fcc7c4caa": [100], "svadmin-u-c07e54fd1439": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-c0980a65a70d": [98], "svadmin-u-c0bedbbc0c34": [172], "svadmin-u-c163b0edfdf0": [123], "svadmin-u-c1b9bd611950": [62], "svadmin-u-c1ca66f139f6": [142], "svadmin-u-c2385a463da8": [13, 88], "svadmin-u-c3c9f24b386b": [97], "svadmin-u-c4501453167b": [65], "svadmin-u-c4b15df0fe95": [182], "svadmin-u-c55dcda26eec": [131], "svadmin-u-c614099df7f7": [100], "svadmin-u-c688a14d7b97": [49, 257], "svadmin-u-c68af9986751": [94], "svadmin-u-c696a0890973": [142], "svadmin-u-c698f77c9ba5": [41, 256], "svadmin-u-c69e21ff5804": [98], "svadmin-u-c6a5b7446421": [97], "svadmin-u-c6b7e58a30d8": [13, 88], "svadmin-u-c74901da6f6c": [122], "svadmin-u-c78facc7a0a6": [86], "svadmin-u-c7d50d5fc0c3": [35], "svadmin-u-c7f14f00a474": [99], "svadmin-u-c80f3ab59fae": [173], "svadmin-u-c82b67c88e69": [127], "svadmin-u-c98d73ab4dcd": [209], "svadmin-u-c9b99cd93450": [110, 111], "svadmin-u-c9c45f3d5d06": [221], "svadmin-u-c9ed8c5f79ae": [49, 257], "svadmin-u-ca6bcd4b6f3f": [55, 61], "svadmin-u-ca6bf63030aa": [126], "svadmin-u-cb11fec3bb46": [110, 111], "svadmin-u-cbbf90f9a828": [142], "svadmin-u-cbc20887874e": [100], "svadmin-u-cc06a6575385": [177, 178], "svadmin-u-cc46d0fa277d": [83, 142], "svadmin-u-ccc86a0cef94": [41, 256], "svadmin-u-cd009d7d208c": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-cd0ad9a56558": [41], "svadmin-u-cd0d9c512cdc": [83], "svadmin-u-cdaa0b7ef445": [159, 183], "svadmin-u-cddc79d3aaec": [65, 258], "svadmin-u-cddd27bcad85": [65], "svadmin-u-cdf6e054e5e0": [49, 257], "svadmin-u-ce335a8e4f56": [117], "svadmin-u-ceb69a6b0e5f": [0, 1, 2, 135, 136, 137], "svadmin-u-ceb7ac66b25b": [66, 123], "svadmin-u-cecf8bbb11d7": [209], "svadmin-u-cef5b893cf23": [24, 63], "svadmin-u-cf3893e36c22": [98], "svadmin-u-cff55289f8f2": [76], "svadmin-u-d008dee27eaa": [49, 257], "svadmin-u-d043cad8e3fa": [142], "svadmin-u-d058ca6de60f": [76], "svadmin-u-d05bf7110c88": [190], "svadmin-u-d07ac033ff8d": [16, 255], "svadmin-u-d0a52b312f7d": [83], "svadmin-u-d0ce7c24d9dd": [206], "svadmin-u-d0dfe7e6acb2": [247, 248, 249, 250, 251, 252, 253, 254], "svadmin-u-d139dd09e38d": [113, 114], "svadmin-u-d16aae848835": [142], "svadmin-u-d1c57777d8b6": [83], "svadmin-u-d2347e8497a9": [95], "svadmin-u-d2d2d97dd0c8": [115], "svadmin-u-d2ffb24f3e1d": [186], "svadmin-u-d378a2461dc3": [164], "svadmin-u-d3aed606df1d": [41], "svadmin-u-d4108abe6359": [65], "svadmin-u-d4f78465b34d": [50, 51], "svadmin-u-d528c7381898": [49, 257], "svadmin-u-d542b60b5312": [41, 256], "svadmin-u-d59b97947485": [36], "svadmin-u-d5c9b0001e7e": [76, 88], "svadmin-u-d5e98261a758": [46, 47], "svadmin-u-d5eab218aa34": [113, 114], "svadmin-u-d633790a1397": [69], "svadmin-u-d694ba66e322": [131], "svadmin-u-d7bf6780c9a5": [190], "svadmin-u-d7c8339810d3": [81], "svadmin-u-d83be576442b": [86], "svadmin-u-d854e5698b57": [142], "svadmin-u-d89972fe17d6": [119], "svadmin-u-d8cdcad240d1": [121], "svadmin-u-d8e0e382c67b": [113, 114], "svadmin-u-d8f5213f0fe0": [83, 142], "svadmin-u-d9256981a032": [25, 87], "svadmin-u-d9a1932be4d4": [209], "svadmin-u-d9bdd3d643a2": [165], "svadmin-u-d9c3c520f7d5": [41, 256], "svadmin-u-d9d0c50e89ff": [41, 256], "svadmin-u-da019856f2cc": [91], "svadmin-u-da2c5d419684": [49], "svadmin-u-da4dbfbc4fdc": [119], "svadmin-u-da619aaefdf6": [69, 259], "svadmin-u-daf5dc5fac2b": [194, 195], "svadmin-u-db5a366a0e21": [145], "svadmin-u-dc7972ebf3f3": [142], "svadmin-u-dccfb8555c84": [41, 256], "svadmin-u-dd317c20a8aa": [186], "svadmin-u-dd90176a46af": [146, 148], "svadmin-u-de2d5f919ba9": [213, 214, 215, 216, 217, 218, 219, 220], "svadmin-u-de8350a3bbad": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-de96100841e6": [221], "svadmin-u-df37b1fd9495": [15, 104], "svadmin-u-df403bbae8fc": [142], "svadmin-u-dfb5e722be57": [82], "svadmin-u-dfe9bd9e7001": [171], "svadmin-u-dff2e7481197": [62, 86, 121, 131], "svadmin-u-e00052b6f07e": [199, 200], "svadmin-u-e00ad81645a2": [165], "svadmin-u-e09880869d1f": [76], "svadmin-u-e09a917c4c3b": [49, 257], "svadmin-u-e0d9cc7f0647": [113, 114], "svadmin-u-e12dfd448aa6": [89, 90, 91, 92, 93, 94, 95, 96], "svadmin-u-e2327d142859": [163, 168], "svadmin-u-e25ca6535dea": [13, 88], "svadmin-u-e271e6ae16dc": [108], "svadmin-u-e299d4635ea7": [174, 175, 176, 177, 178, 179, 180, 181], "svadmin-u-e2f2b4a69d35": [197, 198], "svadmin-u-e2fe2012a697": [142], "svadmin-u-e31889b585dc": [81], "svadmin-u-e32fca50a966": [173], "svadmin-u-e3fd07f96126": [160], "svadmin-u-e477a6af4cb6": [188], "svadmin-u-e4af885410fe": [115], "svadmin-u-e4d6f343b9ff": [190], "svadmin-u-e541d86d1ec8": [41], "svadmin-u-e5738cbd2714": [97], "svadmin-u-e5795dad4d22": [49], "svadmin-u-e632769ad71e": [86], "svadmin-u-e6f9e383a762": [41], "svadmin-u-e7a768f922d2": [83], "svadmin-u-e7e371071bc5": [142], "svadmin-u-e7ee55ac7ffe": [110, 111], "svadmin-u-e82ae8be04aa": [141], "svadmin-u-e836f6e0a16f": [83], "svadmin-u-e83a7042bc91": [12, 79], "svadmin-u-e86fadb84483": [192, 193], "svadmin-u-e91f4cd3974c": [174, 175, 176, 177, 178, 179, 180, 181], "svadmin-u-e9963c2ac628": [36], "svadmin-u-e9cbeabe7285": [86], "svadmin-u-e9fadafbd4a2": [13, 88], "svadmin-u-ea37b42b1c3b": [103], "svadmin-u-ea875e48d525": [86], "svadmin-u-eadef238231e": [0, 1, 2, 135, 136, 137], "svadmin-u-eb6a3cef9686": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-eb6e8b881acd": [110, 111, 112, 113, 114, 115, 116, 117], "svadmin-u-ec0091ee009b": [110, 111], "svadmin-u-eccd13ef4f2f": [96], "svadmin-u-ecf9478d01e6": [98], "svadmin-u-ecfeb742a3f3": [86], "svadmin-u-ed43795e908d": [65], "svadmin-u-ed831a4dff32": [142], "svadmin-u-ed8a5df7b2fb": [83], "svadmin-u-ed9d3d832af8": [24, 63], "svadmin-u-eda955402ba6": [116], "svadmin-u-edaba517866e": [142], "svadmin-u-ee15a477cd9c": [99], "svadmin-u-ee1a5af3aa10": [49], "svadmin-u-ee3c1259a368": [160], "svadmin-u-eea04c60c0ca": [189], "svadmin-u-ef114b5f5ad1": [83], "svadmin-u-ef2d6f74d3d0": [83, 142], "svadmin-u-ef72121aca75": [103], "svadmin-u-efaa0701487e": [26, 138], "svadmin-u-efc981d0f818": [142], "svadmin-u-f04f99ff45cb": [91], "svadmin-u-f09b0bbad9dd": [142], "svadmin-u-f0c1e65bd6f2": [49, 257], "svadmin-u-f0faeb26d656": [113, 114], "svadmin-u-f160abf88b25": [41, 256], "svadmin-u-f1669c2d7424": [41], "svadmin-u-f24b9e2db7e8": [83], "svadmin-u-f283ea9bea0e": [106, 128, 141], "svadmin-u-f2868c227fcd": [102], "svadmin-u-f3c543ad5fe9": [68], "svadmin-u-f42e9fee68a1": [16, 255], "svadmin-u-f46b61a9b310": [117], "svadmin-u-f4cc511ff0c1": [112], "svadmin-u-f50571addf44": [145], "svadmin-u-f5583b2907be": [49, 257], "svadmin-u-f57e7530965b": [50, 51], "svadmin-u-f58b02572ab2": [94], "svadmin-u-f5c8cc114f47": [44, 45, 57, 58], "svadmin-u-f69834fc7f5b": [96], "svadmin-u-f6fe902450dc": [83], "svadmin-u-f71dfc1f3d97": [41, 256], "svadmin-u-f7b5fa971871": [83, 142], "svadmin-u-f81ede24db81": [97], "svadmin-u-f82f0c255ad9": [83], "svadmin-u-f8516763aedd": [100], "svadmin-u-f854738e0622": [102], "svadmin-u-f89e35297f0f": [153], "svadmin-u-f92d02360b8f": [113, 114], "svadmin-u-f93148569c39": [65, 258], "svadmin-u-fa3f7111e53b": [98], "svadmin-u-fa68ba954fb0": [65], "svadmin-u-fafb9e0bfb6a": [116], "svadmin-u-fb1b0d05046d": [41], "svadmin-u-fb56d9cff341": [94], "svadmin-u-fb7302e5364d": [99], "svadmin-u-fb77735ed17c": [96], "svadmin-u-fb88ccaacf5b": [91], "svadmin-u-fc7473ca09eb": [76, 88], "svadmin-u-fd0beb7ec078": [222], "svadmin-u-fd1dda07320a": [16], "svadmin-u-fd9aebd23c39": [97], "svadmin-u-fd9bb0dd33ac": [94], "svadmin-u-fd9dca32f483": [41, 256], "svadmin-u-fdb4af3ae0bc": [115], "svadmin-u-fde8b650ab2d": [172], "svadmin-u-febbcd95bf06": [222], "svadmin-u-febc34e471df": [24, 63], "svadmin-u-fecb6ec6cfa0": [21, 22, 23, 124], "svadmin-u-fed9c9b1e894": [69], "svadmin-u-ff4a6777f1bc": [83], "svadmin-u-ff4d2db0e22a": [97], "svadmin-u-ffe6499f370c": [16, 255], "table": [68], "table-caption": [68], "table-cell": [68], "table-row": [68], "text-green-500": [65], "touch-none": [132], "transform": [133], "uppercase": [129], "visible": [140], "zoom-in-50": [10], "zoom-in-95": [10] };
@@ -0,0 +1,8 @@
1
+ import { type ClassValue } from 'clsx';
2
+ export type { ClassValue } from 'clsx';
3
+ /**
4
+ * Compose native classes. Only owned finite classes have conflict metadata.
5
+ * Unknown host classes are retained; arbitrary utility syntax is not interpreted.
6
+ */
7
+ export declare function composeClasses(classes: string, properties: Readonly<Record<string, readonly number[]>>): string;
8
+ export declare function cn(...inputs: ClassValue[]): string;
@@ -0,0 +1,26 @@
1
+ import { clsx } from 'clsx';
2
+ import { classProperties } from './class-properties.generated.js';
3
+ /**
4
+ * Compose native classes. Only owned finite classes have conflict metadata.
5
+ * Unknown host classes are retained; arbitrary utility syntax is not interpreted.
6
+ */
7
+ export function composeClasses(classes, properties) {
8
+ const covered = new Set();
9
+ const seen = new Set();
10
+ const kept = [];
11
+ for (const name of classes.split(/\s+/u).filter(Boolean).reverse()) {
12
+ if (seen.has(name))
13
+ continue;
14
+ seen.add(name);
15
+ const declarations = Object.hasOwn(properties, name) ? properties[name] : undefined;
16
+ if (declarations?.length && declarations.every((atom) => covered.has(atom)))
17
+ continue;
18
+ kept.push(name);
19
+ for (const atom of declarations ?? [])
20
+ covered.add(atom);
21
+ }
22
+ return kept.reverse().join(' ');
23
+ }
24
+ export function cn(...inputs) {
25
+ return composeClasses(clsx(inputs), classProperties);
26
+ }
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import { bindResourceRendering, type ResourceRendering } from '../rendering/index.js';
2
3
  import { definedReactiveOptions } from '@svadmin/core/options';
3
4
 
4
5
  import { definedOptions } from '@svadmin/core/options';
@@ -24,6 +25,7 @@
24
25
 
25
26
  interface Props {
26
27
  resourceName: string;
28
+ rendering?: ResourceRendering | undefined;
27
29
  id?: string | number;
28
30
  mode?: 'create' | 'edit' | 'clone' | 'show';
29
31
  density?: 'compact' | 'comfortable';
@@ -40,6 +42,7 @@
40
42
 
41
43
  let {
42
44
  resourceName,
45
+ rendering,
43
46
  id,
44
47
  mode = 'create',
45
48
  density = 'comfortable',
@@ -56,6 +59,7 @@
56
59
  const navigation = useNavigation();
57
60
  const context = captureAdminContext();
58
61
  const binding = useResourceContract(() => resourceName);
62
+ const activeRendering = $derived(bindResourceRendering(rendering, binding.resource));
59
63
  const isReadonly = $derived(mode === 'show');
60
64
  const isCompact = $derived(density === 'compact');
61
65
 
@@ -143,7 +147,7 @@
143
147
 
144
148
  // ─── useForm: single source of truth for values, errors, tainted ──
145
149
  const form = useForm(definedReactiveOptions({
146
- get resource() { return binding.resource; },
150
+ get resource() { void activeRendering; return binding.resource; },
147
151
  get action() { return mode; },
148
152
  get id() { return id; },
149
153
  get defaultValues() { return defaults; },
@@ -158,6 +162,14 @@
158
162
  },
159
163
  }));
160
164
 
165
+ const renderedDraft = $derived.by(() => {
166
+ try {
167
+ return { ok: true, values: form.ready && activeRendering ? activeRendering.draft(mode, form.values) : form.values };
168
+ } catch {
169
+ return { ok: false, values: {} };
170
+ }
171
+ });
172
+
161
173
  // ─── Submission error (non-field, e.g. network error) ─────────────
162
174
  let submitError = $state<string | null>(null);
163
175
  let formElement = $state.raw<HTMLFormElement>();
@@ -282,7 +294,7 @@
282
294
  });
283
295
  </script>
284
296
 
285
- <div class={isCompact ? 'svadmin-u-3e7ce58d64fa' : 'svadmin-u-b3542e058833'}>
297
+ <div class={isCompact ? 'svadmin-u-3e7ce58d64fa' : 'svadmin-u-b3542e058833'} data-svadmin-rendering-resource={activeRendering?.resource.name} data-svadmin-rendering-kind={activeRendering ? 'form' : undefined}>
286
298
  {#if showHeader}
287
299
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-0c3bc98565dd">
288
300
  <TooltipButton
@@ -319,6 +331,8 @@
319
331
  <Button type="button" variant="outline" onclick={retry}>
320
332
  {i18n.t('common.retry')}
321
333
  </Button>
334
+ {:else if !renderedDraft.ok}
335
+ <p role="alert">{i18n.t('common.operationFailed')}</p>
322
336
  {:else if form.ready}
323
337
  <form bind:this={formElement} onsubmit={submitEvent} class="svadmin-u-cf3893e36c22 svadmin-u-b3542e058833" novalidate>
324
338
  {#if submitError}
@@ -343,11 +357,11 @@
343
357
  {#each group.fields as field (field.key)}
344
358
  <div class={cn(columns > 1 && isFullWidthField(field) && 'svadmin-u-2c955d1b45df', !!form.errors[field.key] && 'svadmin-u-ee1a5af3aa10')}>
345
359
  {#if fieldRenderer}
346
- {@render fieldRenderer({ field, value: form.values[field.key], onchange: fieldChange(field.key) })}
360
+ {@render fieldRenderer({ field, value: renderedDraft.values[field.key], onchange: fieldChange(field.key) })}
347
361
  {:else}
348
362
  <FieldRenderer
349
363
  {field}
350
- value={form.values[field.key]}
364
+ value={renderedDraft.values[field.key]}
351
365
  onchange={fieldChange(field.key)}
352
366
  {density}
353
367
  invalid={!!form.errors[field.key]}
@@ -371,11 +385,11 @@
371
385
  {#each formFields as field (field.key)}
372
386
  <div class={cn(columns > 1 && isFullWidthField(field) && 'svadmin-u-2c955d1b45df', !!form.errors[field.key] && 'svadmin-u-ee1a5af3aa10')}>
373
387
  {#if fieldRenderer}
374
- {@render fieldRenderer({ field, value: form.values[field.key], onchange: fieldChange(field.key) })}
388
+ {@render fieldRenderer({ field, value: renderedDraft.values[field.key], onchange: fieldChange(field.key) })}
375
389
  {:else}
376
390
  <FieldRenderer
377
391
  {field}
378
- value={form.values[field.key]}
392
+ value={renderedDraft.values[field.key]}
379
393
  onchange={fieldChange(field.key)}
380
394
  {density}
381
395
  invalid={!!form.errors[field.key]}
@@ -1,7 +1,9 @@
1
+ import { type ResourceRendering } from '../rendering/index.js';
1
2
  import type { FieldDefinition } from '@svadmin/core';
2
3
  import type { Snippet } from 'svelte';
3
4
  interface Props {
4
5
  resourceName: string;
6
+ rendering?: ResourceRendering | undefined;
5
7
  id?: string | number;
6
8
  mode?: 'create' | 'edit' | 'clone' | 'show';
7
9
  density?: 'compact' | 'comfortable';
@@ -1,4 +1,6 @@
1
1
  <script lang="ts">
2
+ import { bindResourceRendering, type ResourceRendering } from '../rendering/index.js';
3
+ import type { AutoTableGridState } from './auto-table-grid.js';
2
4
  import { definedOptions } from '@svadmin/core/options';
3
5
 
4
6
  import { onDestroy, tick, untrack } from 'svelte';
@@ -23,6 +25,7 @@
23
25
  import { createAtom, useSelector } from '@tanstack/svelte-store';
24
26
  import {
25
27
  column_getCanSort,
28
+ column_getSize,
26
29
  column_getIsSorted,
27
30
  column_toggleSorting,
28
31
  header_getSize,
@@ -104,6 +107,9 @@
104
107
  // ─── Props with Snippet composability ─────────────────────────
105
108
  interface Props {
106
109
  resourceName: string;
110
+ rendering?: ResourceRendering | undefined;
111
+ /** 可选主体渲染器:不替换资源、权限、工具栏和持久化逻辑。 */
112
+ gridBody?: Snippet<[AutoTableGridState]>;
107
113
  selectable?: boolean;
108
114
  density?: 'compact' | 'comfortable';
109
115
  showHeader?: boolean;
@@ -136,6 +142,8 @@
136
142
 
137
143
  let {
138
144
  resourceName,
145
+ rendering,
146
+ gridBody,
139
147
  selectable = true,
140
148
  density = 'comfortable',
141
149
  showHeader = true,
@@ -163,6 +171,7 @@
163
171
  const navigation = useNavigation();
164
172
 
165
173
  const binding = useResourceContract(() => resourceName);
174
+ const activeRendering = $derived(bindResourceRendering(rendering, binding.resource));
166
175
  const resource = $derived(adminContext.getResource(resourceName));
167
176
  const primaryKey = $derived(resource.primaryKey ?? 'id');
168
177
  const listPermission = useCan(() => ({ resource: resourceName, action: 'list' }));
@@ -522,7 +531,7 @@
522
531
 
523
532
  // ─── Data fetching ────────────────────────────────────────────
524
533
  const listResult = useList({
525
- get resource() { return binding.resource; },
534
+ get resource() { void activeRendering; return binding.resource; },
526
535
  get dataProviderName() { return binding.dataProviderName; },
527
536
  get queryOptions() { return { enabled: canRead }; },
528
537
  get pagination() { return queryPagination; },
@@ -530,10 +539,25 @@
530
539
  get filters() { return queryFilters; },
531
540
  });
532
541
  const query = listResult;
533
- const pageRecords = $derived.by(() => {
534
- try { return { ok: true as const, data: canRead ? checkedTableRows(query.data?.data ?? []) : [] }; }
535
- catch { return { ok: false as const, data: [] }; }
536
- });
542
+ const pageRecords = {
543
+ get ok(): boolean {
544
+ if (!canRead) return true;
545
+ try {
546
+ checkedTableRows(activeRendering ? activeRendering.records(query.data?.data ?? []) : query.data?.data ?? []);
547
+ return true;
548
+ } catch {
549
+ return false;
550
+ }
551
+ },
552
+ get data(): TableRecord[] {
553
+ if (!canRead) return [];
554
+ try {
555
+ return checkedTableRows(activeRendering ? activeRendering.records(query.data?.data ?? []) : query.data?.data ?? []);
556
+ } catch {
557
+ return [];
558
+ }
559
+ },
560
+ };
537
561
  let deleteRequest = $state<{ ids: (string | number)[]; batch: boolean } | null>(null);
538
562
  const deletePermission = useCan(() => definedOptions({
539
563
  resource: resourceName, action: 'delete',
@@ -543,7 +567,7 @@
543
567
  }));
544
568
  const deleteAllowed = $derived(canRead && resource.canDelete !== false && deleteRequest !== null && deletePermission.allowed);
545
569
  const deleteManyResult = useDeleteMany({
546
- get resource() { return binding.resource; },
570
+ get resource() { void activeRendering; return binding.resource; },
547
571
  get enabled() { return deleteAllowed; },
548
572
  });
549
573
  const deleteManyMutation = deleteManyResult.mutation;
@@ -1035,7 +1059,19 @@
1035
1059
  const detailOpen = $derived(detailRecordId != null);
1036
1060
  $effect.pre(() => {
1037
1061
  const scope = tableScope;
1038
- if (previousTableScope && previousTableScope !== scope) {
1062
+ if (previousTableScope && (
1063
+ previousTableScope.contract !== scope.contract ||
1064
+ previousTableScope.resourceName !== scope.resourceName ||
1065
+ previousTableScope.provider !== scope.provider ||
1066
+ previousTableScope.meta !== scope.meta ||
1067
+ previousTableScope.tenant !== scope.tenant ||
1068
+ previousTableScope.auth !== scope.auth ||
1069
+ previousTableScope.router !== scope.router ||
1070
+ previousTableScope.permissionProvider !== scope.permissionProvider ||
1071
+ previousTableScope.canRead !== scope.canRead ||
1072
+ previousTableScope.canDelete !== scope.canDelete ||
1073
+ previousTableScope.variables !== scope.variables
1074
+ )) {
1039
1075
  activeDelete = undefined;
1040
1076
  confirmOpen = false;
1041
1077
  confirmPending = false;
@@ -1177,8 +1213,205 @@
1177
1213
  function refreshList() {
1178
1214
  if (canRead && !query.isFetching) void listResult.refetch();
1179
1215
  }
1216
+ const gridRowIndex = $derived(new Map(tableView.rows.map(row => [rowIdValue(row), row])));
1217
+ const gridColumns = $derived.by(() => {
1218
+ void tableColumnOrder.current; void tableColumnVisibility.current;
1219
+ return table_getAllLeafColumns(tbl).filter(column => isColumnVisible(column.id)).map(column => ({
1220
+ key: column.id,
1221
+ label: column.id === '_actions' ? i18n.t('common.actions') : column.id === '_select' ? i18n.t('common.selectAll') : column.id === '_expand' ? i18n.t('common.expand') : visibleFields.find(field => field.key === column.id)?.label ?? column.id,
1222
+ width: Math.max(40, Math.min(4096, column_getSize(column))),
1223
+ sortable: column_getCanSort(column),
1224
+ }));
1225
+ });
1226
+ function changeGridSort(next: readonly Sort[]): void {
1227
+ if (!canRead || query.isFetching || deleteManyMutation.isPending) return;
1228
+ markSavedViewDirty();
1229
+ const accepted = next.filter(sort => gridColumns.some(column => column.key === sort.field && column.sortable));
1230
+ sorters = accepted.map(sort => ({ ...sort }));
1231
+ sortingAtom.set(accepted.map(sort => ({ id: sort.field, desc: sort.order === 'desc' })));
1232
+ pagination = { ...pagination, current: 1 };
1233
+ }
1180
1234
  </script>
1181
1235
 
1236
+ {#snippet renderGridCell({ id, field }: { id: string | number; field: string })}
1237
+ {@const row = gridRowIndex.get(id)}
1238
+ {#if row}
1239
+ {@const record = copyTableRecord(row.original)}
1240
+ {@const cell = row_getVisibleCells(row).find(item => item.column.id === field)}
1241
+ {#if cell}
1242
+ <ContextMenu.Root>
1243
+ <ContextMenu.Trigger>
1244
+ {#snippet child({ props })}
1245
+ <div {...props}>
1246
+ {#if cell.column.id === '_select'}
1247
+ {#if batchActions}
1248
+ <Checkbox
1249
+ aria-label={i18n.t('common.selectRow', { id })}
1250
+ checked={rowIsSelected(row.id)}
1251
+ onCheckedChange={() => toggleRowSelection(row)}
1252
+ />
1253
+ {:else}
1254
+ <CanAccess resource={resourceName} action="delete" params={{ id }}>
1255
+ <Checkbox
1256
+ aria-label={i18n.t('common.selectRow', { id })}
1257
+ checked={rowIsSelected(row.id)}
1258
+ onCheckedChange={() => toggleRowSelection(row)}
1259
+ />
1260
+ </CanAccess>
1261
+ {/if}
1262
+ {:else if cell.column.id === '_expand'}
1263
+ <TooltipButton tooltip={rowIsExpanded(row.id) ? i18n.t('common.collapse') : i18n.t('common.expand')} variant="ghost" size="icon" class="svadmin-u-d0a52b312f7d svadmin-u-cbbf90f9a828" onclick={() => toggleRowExpanded(row.id)}>
1264
+ {#if rowIsExpanded(row.id)}
1265
+ <ChevronUp class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" />
1266
+ {:else}
1267
+ <ChevronDown class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" />
1268
+ {/if}
1269
+ </TooltipButton>
1270
+ {:else if cell.column.id === '_actions'}
1271
+ <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-77c08e015d14 svadmin-u-44ee8ba0a421">
1272
+ {#if rowActions}
1273
+ {@render rowActions({ record, id })}
1274
+ {:else}
1275
+ {@render defaultRowActions(id)}
1276
+ {/if}
1277
+ </div>
1278
+ {:else}
1279
+ {@const field = visibleFields.find(f => f.key === cell.column.id)}
1280
+ {@const customColumn = field ? customColumns?.[field.key] : undefined}
1281
+ {#if customColumn}
1282
+ {@render customColumn({ value: clonePlainValue(cell_getValue(cell)), record: copyTableRecord(record) })}
1283
+ {:else if defaultCellRenderer && field}
1284
+ {@render defaultCellRenderer({ field, value: clonePlainValue(cell_getValue(cell)), record: copyTableRecord(record) })}
1285
+ {:else if canEdit && field && field.showInEdit !== false && writableFields.has(field.key) && field.key !== primaryKey && field.key !== 'id' && ['text', 'number', 'email', 'url'].includes(field.type)}
1286
+ <CanAccess resource={resourceName} action="edit" params={{ id }}>
1287
+ <InlineEdit
1288
+ {resourceName}
1289
+ recordId={id}
1290
+ {field}
1291
+ value={cell_getValue(cell)}
1292
+ />
1293
+ {#snippet fallback()}
1294
+ <FieldDisplay type={field.type} value={cell_getValue(cell)} options={field.options} />
1295
+ {/snippet}
1296
+ </CanAccess>
1297
+ {:else if field?.key === 'id'}
1298
+ <span class="svadmin-u-0214b4b355d1 svadmin-u-f283ea9bea0e svadmin-u-0e65706bcccd svadmin-u-359090c2d529" title={String(cell_getValue(cell) ?? '—')}>{cell_getValue(cell) ?? '—'}</span>
1299
+ {:else if field}
1300
+ <FieldDisplay type={field.type} value={cell_getValue(cell)} options={field.options} resourceName={field.resource} />
1301
+ {/if}
1302
+ {/if}
1303
+ </div>
1304
+ {/snippet}
1305
+ </ContextMenu.Trigger>
1306
+ <ContextMenu.Content class="svadmin-u-74b2435a1d40">
1307
+ {#if canEdit}
1308
+ <CanAccess resource={resourceName} action="edit" params={{ id }}>
1309
+ <ContextMenu.Item onclick={() => navigation.edit(resourceName, id)} class="svadmin-u-77a2a20e90d4">
1310
+ <Pencil class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" /> {i18n.t('common.edit')}
1311
+ </ContextMenu.Item>
1312
+ </CanAccess>
1313
+ {/if}
1314
+ {#if canShow}
1315
+ <CanAccess resource={resourceName} action="show" params={{ id }}>
1316
+ <ContextMenu.Item onclick={() => openDetail(id)} class="svadmin-u-77a2a20e90d4">
1317
+ <Eye class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" /> {i18n.t('common.detail')}
1318
+ </ContextMenu.Item>
1319
+ </CanAccess>
1320
+ {/if}
1321
+ <ContextMenu.Item onclick={() => navigator.clipboard?.writeText(String(id))} class="svadmin-u-77a2a20e90d4">
1322
+ <Copy class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" /> {i18n.t('common.copyId')}
1323
+ </ContextMenu.Item>
1324
+ {#if canDelete}
1325
+ <CanAccess resource={resourceName} action="delete" params={{ id }}>
1326
+ <ContextMenu.Separator />
1327
+ <ContextMenu.Item onclick={() => confirmDelete(id)} class="svadmin-u-77a2a20e90d4 svadmin-u-811148b13d1e">
1328
+ <Trash2 class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" /> {i18n.t('common.delete')}
1329
+ </ContextMenu.Item>
1330
+ </CanAccess>
1331
+ {/if}
1332
+ </ContextMenu.Content>
1333
+ </ContextMenu.Root>
1334
+ {/if}
1335
+ {/if}
1336
+ {/snippet}
1337
+
1338
+ {#snippet renderGridControls()}
1339
+ <Table.Root density={currentDensity}>
1340
+ <Table.Header>
1341
+ {#each tableView.headerGroups as headerGroup, _i (_i)}
1342
+ {@const visibleHeaders = headerGroup.headers.filter((header: Header<TableFeatures, TableRecord, unknown>) => isColumnVisible(header.column.id))}
1343
+ <DraggableHeader
1344
+ columns={visibleHeaders.map((header) => ({ id: header.column.id, header }))}
1345
+ onReorder={setColumnOrder}
1346
+ >
1347
+ {#snippet header(col, _index, dragProps)}
1348
+ {@const header = col.header}
1349
+ <Table.Head
1350
+ {...dragProps}
1351
+ class={cn('svadmin-u-65fdbade2025 svadmin-u-18049387f0af svadmin-u-b247a17a0d75 svadmin-u-2689f3958069 svadmin-u-d9256981a032 svadmin-u-bfa603190748 svadmin-u-f6e31b39b8e4', dragProps.class)}
1352
+ style={header_getSize(header) != null && header_getSize(header) !== 150 ? `width:${header_getSize(header)}px` : undefined}
1353
+ >
1354
+ {#if header.id === '_select'}
1355
+ {#if batchActions}
1356
+ <Checkbox
1357
+ aria-label={i18n.t('common.selectAll')}
1358
+ checked={table_getIsAllRowsSelected(tbl)}
1359
+ onCheckedChange={toggleAllRowsSelection}
1360
+ />
1361
+ {:else if !acEnabled || deleteResourcePermission.isLoading || deleteResourcePermission.allowed}
1362
+ <Checkbox
1363
+ aria-label={i18n.t('common.selectAll')}
1364
+ checked={table_getIsAllRowsSelected(tbl)}
1365
+ onCheckedChange={toggleAllRowsSelection}
1366
+ />
1367
+ {/if}
1368
+ {:else if header.id === '_expand'}
1369
+ <!-- empty -->
1370
+ {:else if header.id === '_actions'}
1371
+ <span class="svadmin-u-308fc069e46e svadmin-u-0214b4b355d1">{i18n.t('common.actions')}</span>
1372
+ {:else if column_getCanSort(header.column)}
1373
+ <Button
1374
+ variant="ghost"
1375
+ size="sm"
1376
+ class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-44ee8ba0a421 svadmin-u-ea7b2e9e070e svadmin-u-8ffe7a29179a svadmin-u-b8f0a08ece1e svadmin-u-660d2effb880 svadmin-u-d5eab218aa34 uppercase svadmin-u-8baf13a3e9d7 svadmin-u-7357df2b2e0c svadmin-u-e83a7042bc91"
1377
+ onclick={() => toggleColumnSort(header.column)}
1378
+ >
1379
+ {visibleFields.find(f => f.key === header.id)?.label ?? header.id}
1380
+ <span class="svadmin-u-359090c2d529 svadmin-u-0b8c506a0596">
1381
+ {#if column_getIsSorted(header.column) === 'asc'}↑
1382
+ {:else if column_getIsSorted(header.column) === 'desc'}↓
1383
+ {:else}⇅
1384
+ {/if}
1385
+ </span>
1386
+ </Button>
1387
+ {:else}
1388
+ {visibleFields.find(f => f.key === header.id)?.label ?? header.id}
1389
+ {/if}
1390
+ </Table.Head>
1391
+ {/snippet}
1392
+ </DraggableHeader>
1393
+ {/each}
1394
+ </Table.Header>
1395
+ </Table.Root>
1396
+ {/snippet}
1397
+
1398
+ {#snippet renderGridAfter()}
1399
+ <Table.Root density={currentDensity}>
1400
+ <Table.Body>
1401
+ {#each tableView.rows as row (row.id)}
1402
+ {#if expandedRowRender && rowIsExpanded(row.id)}
1403
+ <Table.Row><Table.Cell colspan={Math.max(1, gridColumns.length)}>
1404
+ {@render expandedRowRender({ record: copyTableRecord(row.original) })}
1405
+ </Table.Cell></Table.Row>
1406
+ {/if}
1407
+ {/each}
1408
+ </Table.Body>
1409
+ {#if summary}<Table.Footer>
1410
+ {@render summary({ data: pageRecords.data.map(copyTableRecord), total: query.data?.total ?? 0, visibleColumnsCount: gridColumns.length })}
1411
+ </Table.Footer>{/if}
1412
+ </Table.Root>
1413
+ {/snippet}
1414
+
1182
1415
  {#snippet defaultRowActions(id: string | number)}
1183
1416
  <RecordRowActions
1184
1417
  {resourceName} {id} {canShow} {canEdit} {canDelete}
@@ -1208,7 +1441,7 @@
1208
1441
  </DataState>
1209
1442
  {/snippet}
1210
1443
 
1211
- <div class="svadmin-u-6ed543e2fbbb">
1444
+ <div class="svadmin-u-6ed543e2fbbb" data-svadmin-rendering-resource={activeRendering?.resource.name} data-svadmin-rendering-kind={activeRendering ? 'table' : undefined}>
1212
1445
  {#if operationError}<p role="alert">{operationError}</p>{/if}
1213
1446
  {#if detailState.invalid}<p role="alert">{i18n.t('common.operationFailed')}</p>{/if}
1214
1447
  {#if showHeader}
@@ -1589,6 +1822,12 @@
1589
1822
  description={i18n.t('common.operationFailed')}
1590
1823
  retry={refreshList}
1591
1824
  />
1825
+ {:else if gridBody && pageRecords.data.length > 0}
1826
+ {@render gridBody({ records: pageRecords.data.map(copyTableRecord), columns: gridColumns, primaryKey: 'id',
1827
+ sorters: querySorters, density: currentDensity, locale: i18n.locale, label: resource.label,
1828
+ scopeKey: JSON.stringify([resourceName, queryPagination, querySorters, queryFilters, adminContext.tenantCacheKey?.__svadminTenant]),
1829
+ disabled: query.isFetching || deleteManyMutation.isPending,
1830
+ onSortChange: changeGridSort, cell: renderGridCell, controls: renderGridControls, after: renderGridAfter })}
1592
1831
  {:else}
1593
1832
  <div in:fade={{ duration: 150 }}>
1594
1833
  <!-- Desktop Table (hidden on mobile) -->
@@ -1921,6 +2160,7 @@
1921
2160
 
1922
2161
  {#if detailRecordId != null}
1923
2162
  <RecordDetailDrawer
2163
+ rendering={activeRendering}
1924
2164
  resourceName={resourceName}
1925
2165
  open={detailOpen}
1926
2166
  recordId={detailRecordId}
@@ -1930,6 +2170,6 @@
1930
2170
 
1931
2171
  {#if quickEditId != null && canRead && canEdit}
1932
2172
  {#key quickEditId}
1933
- <QuickEditDrawer {resourceName} recordId={quickEditId} onClose={() => quickEditId = undefined} />
2173
+ <QuickEditDrawer rendering={activeRendering} {resourceName} recordId={quickEditId} onClose={() => quickEditId = undefined} />
1934
2174
  {/key}
1935
2175
  {/if}
@@ -1,7 +1,12 @@
1
+ import { type ResourceRendering } from '../rendering/index.js';
2
+ import type { AutoTableGridState } from './auto-table-grid.js';
1
3
  import type { BaseRecord, FieldDefinition, Sort } from '@svadmin/core';
2
4
  import type { Snippet } from 'svelte';
3
5
  interface Props {
4
6
  resourceName: string;
7
+ rendering?: ResourceRendering | undefined;
8
+ /** 可选主体渲染器:不替换资源、权限、工具栏和持久化逻辑。 */
9
+ gridBody?: Snippet<[AutoTableGridState]>;
5
10
  selectable?: boolean;
6
11
  density?: 'compact' | 'comfortable';
7
12
  showHeader?: boolean;