@svadmin/ui 0.70.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 (372) hide show
  1. package/README.md +40 -25
  2. package/THIRD_PARTY_NOTICES.md +52 -0
  3. package/dist/actions.js +1 -1
  4. package/dist/app.css +7804 -5188
  5. package/dist/app.theme.css +7738 -5173
  6. package/dist/class-properties.generated.d.ts +1 -0
  7. package/dist/class-properties.generated.js +2 -0
  8. package/dist/classnames.d.ts +8 -0
  9. package/dist/classnames.js +26 -0
  10. package/dist/component-registry.svelte.d.ts +33 -19
  11. package/dist/component-registry.svelte.js +6 -4
  12. package/dist/components/AdminApp.svelte +55 -53
  13. package/dist/components/AdminApp.svelte.d.ts +2 -2
  14. package/dist/components/ApiSettings.svelte +19 -1
  15. package/dist/components/AuditLogDrawer.svelte +14 -3
  16. package/dist/components/AutoForm.svelte +162 -50
  17. package/dist/components/AutoForm.svelte.d.ts +4 -0
  18. package/dist/components/AutoTable.svelte +599 -259
  19. package/dist/components/AutoTable.svelte.d.ts +6 -0
  20. package/dist/components/BoundRecordDetailDrawer.svelte +172 -0
  21. package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +11 -0
  22. package/dist/components/Breadcrumbs.svelte +7 -4
  23. package/dist/components/CancelTaskButton.svelte +9 -5
  24. package/dist/components/ColumnHeaderFilter.svelte +4 -3
  25. package/dist/components/ColumnSettings.svelte +1 -0
  26. package/dist/components/ComboboxField.svelte +118 -36
  27. package/dist/components/ComboboxField.svelte.d.ts +5 -4
  28. package/dist/components/CreatePage.svelte +7 -1
  29. package/dist/components/CreatePage.svelte.d.ts +2 -0
  30. package/dist/components/DateRangeInput.svelte +75 -0
  31. package/dist/components/DateRangeInput.svelte.d.ts +25 -0
  32. package/dist/components/DateTimeInput.svelte +65 -0
  33. package/dist/components/DateTimeInput.svelte.d.ts +19 -0
  34. package/dist/components/DetailDrawer.svelte +4 -0
  35. package/dist/components/DetailDrawer.svelte.d.ts +1 -0
  36. package/dist/components/DevTools.svelte +8 -21
  37. package/dist/components/DraggableGrid.svelte +1 -0
  38. package/dist/components/DraggableHeader.svelte +5 -9
  39. package/dist/components/DraggableHeader.svelte.d.ts +43 -18
  40. package/dist/components/DraggableRowTable.svelte +2 -2
  41. package/dist/components/DynamicFormList.svelte +17 -17
  42. package/dist/components/DynamicFormList.svelte.d.ts +2 -1
  43. package/dist/components/EditPage.svelte +7 -1
  44. package/dist/components/EditPage.svelte.d.ts +2 -0
  45. package/dist/components/EditableTable.svelte +4 -0
  46. package/dist/components/ErrorPage.svelte +3 -1
  47. package/dist/components/FieldDisplay.svelte +14 -0
  48. package/dist/components/FieldDisplay.svelte.d.ts +7 -0
  49. package/dist/components/FieldRenderer.svelte +96 -20
  50. package/dist/components/FileUpload.svelte +250 -0
  51. package/dist/components/FileUpload.svelte.d.ts +32 -0
  52. package/dist/components/FilterBuilder.svelte +236 -268
  53. package/dist/components/FilterBuilder.svelte.d.ts +3 -0
  54. package/dist/components/FilterDropdown.svelte.d.ts +1 -1
  55. package/dist/components/Header.svelte +5 -6
  56. package/dist/components/ImportWizard.svelte +182 -94
  57. package/dist/components/InfiniteList.svelte +22 -8
  58. package/dist/components/InfiniteList.svelte.d.ts +5 -3
  59. package/dist/components/InlineEdit.svelte +114 -44
  60. package/dist/components/JsonSchemaForm.svelte +256 -95
  61. package/dist/components/JsonSchemaForm.svelte.d.ts +12 -1
  62. package/dist/components/Layout.svelte +20 -17
  63. package/dist/components/LazyTaskQueueDrawer.svelte +26 -0
  64. package/dist/components/LazyTaskQueueDrawer.svelte.d.ts +8 -0
  65. package/dist/components/ListPage.svelte +11 -6
  66. package/dist/components/ListPage.svelte.d.ts +2 -0
  67. package/dist/components/LoginPage.svelte +1 -1
  68. package/dist/components/MasterDetailView.svelte +3 -3
  69. package/dist/components/MediaLibraryModal.svelte +5 -2
  70. package/dist/components/MentionsInput.svelte +4 -3
  71. package/dist/components/MoneyInput.svelte +25 -0
  72. package/dist/components/MoneyInput.svelte.d.ts +20 -0
  73. package/dist/components/NavigateToResource.svelte +3 -2
  74. package/dist/components/NumberInput.svelte +25 -0
  75. package/dist/components/NumberInput.svelte.d.ts +19 -0
  76. package/dist/components/NumericInput.svelte +110 -0
  77. package/dist/components/NumericInput.svelte.d.ts +23 -0
  78. package/dist/components/PercentInput.svelte +25 -0
  79. package/dist/components/PercentInput.svelte.d.ts +20 -0
  80. package/dist/components/PermissionMatrix.svelte +4 -3
  81. package/dist/components/ProfilePage.svelte +2 -2
  82. package/dist/components/QuickEditDrawer.svelte +42 -0
  83. package/dist/components/QuickEditDrawer.svelte.d.ts +10 -0
  84. package/dist/components/RecordDetailDrawer.svelte +16 -108
  85. package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
  86. package/dist/components/RecordRowActions.svelte +41 -0
  87. package/dist/components/RecordRowActions.svelte.d.ts +14 -0
  88. package/dist/components/ResourceAccessGuard.svelte +7 -5
  89. package/dist/components/ResourceOperationsPage.svelte +25 -19
  90. package/dist/components/ResourceOperationsPage.svelte.d.ts +5 -1
  91. package/dist/components/RetryTaskButton.svelte +9 -5
  92. package/dist/components/RowActions.svelte +5 -3
  93. package/dist/components/SensitiveDataMask.svelte +3 -3
  94. package/dist/components/SettingsPage.svelte +1 -1
  95. package/dist/components/ShowInferencer.svelte +4 -2
  96. package/dist/components/ShowInferencer.svelte.d.ts +2 -0
  97. package/dist/components/ShowPage.svelte +49 -39
  98. package/dist/components/ShowPage.svelte.d.ts +2 -0
  99. package/dist/components/Sidebar.svelte +15 -13
  100. package/dist/components/SplitPaneLayout.svelte +4 -2
  101. package/dist/components/SpreadsheetView.svelte +81 -286
  102. package/dist/components/StepsForm.svelte +166 -49
  103. package/dist/components/StepsForm.svelte.d.ts +1 -0
  104. package/dist/components/SvarAutoTable.svelte +39 -0
  105. package/dist/components/SvarAutoTable.svelte.d.ts +13 -0
  106. package/dist/components/SvarDataGrid.svelte +362 -0
  107. package/dist/components/SvarDataGrid.svelte.d.ts +57 -0
  108. package/dist/components/SvarGridCell.svelte +10 -0
  109. package/dist/components/SvarGridCell.svelte.d.ts +7 -0
  110. package/dist/components/SvarResourceRead.svelte +50 -0
  111. package/dist/components/SvarResourceRead.svelte.d.ts +23 -0
  112. package/dist/components/SvarResourceTable.svelte +63 -0
  113. package/dist/components/SvarResourceTable.svelte.d.ts +42 -0
  114. package/dist/components/SvarResourceTableView.svelte +364 -0
  115. package/dist/components/SvarResourceTableView.svelte.d.ts +4 -0
  116. package/dist/components/TaskDetails.svelte +20 -7
  117. package/dist/components/TaskList.svelte +19 -7
  118. package/dist/components/TaskQueueDrawer.svelte +92 -37
  119. package/dist/components/Toast.svelte +4 -2
  120. package/dist/components/TooltipButton.svelte +1 -1
  121. package/dist/components/TreeSelect.svelte +212 -30
  122. package/dist/components/TreeSelect.svelte.d.ts +3 -1
  123. package/dist/components/ValidatedField.svelte +27 -0
  124. package/dist/components/ValidatedField.svelte.d.ts +35 -0
  125. package/dist/components/account/ImportMembersPage.svelte +2 -2
  126. package/dist/components/account/SecurityLogPage.svelte +3 -1
  127. package/dist/components/account/SettingsEnterprisePage.svelte +7 -5
  128. package/dist/components/account/TeamMembersPage.svelte +1 -1
  129. package/dist/components/auto-table-grid.d.ts +26 -0
  130. package/dist/components/auto-table-grid.js +1 -0
  131. package/dist/components/buttons/CloneButton.svelte +6 -4
  132. package/dist/components/buttons/DeleteButton.svelte +95 -29
  133. package/dist/components/buttons/DeleteButton.svelte.d.ts +2 -0
  134. package/dist/components/buttons/EditButton.svelte +6 -4
  135. package/dist/components/buttons/ExportButton.svelte +22 -4
  136. package/dist/components/buttons/ImportButton.svelte +83 -38
  137. package/dist/components/buttons/ImportButton.svelte.d.ts +6 -10
  138. package/dist/components/buttons/RefreshButton.svelte +48 -8
  139. package/dist/components/buttons/ShowButton.svelte +6 -4
  140. package/dist/components/content/ApiKeyList.svelte +3 -1
  141. package/dist/components/content/ContentPageHeader.svelte +12 -9
  142. package/dist/components/content/ContentPageShell.svelte +8 -9
  143. package/dist/components/content/FileBrowser.svelte +35 -0
  144. package/dist/components/content/FileBrowser.svelte.d.ts +14 -0
  145. package/dist/components/content/FileList.svelte +3 -1
  146. package/dist/components/content/MemberList.svelte +3 -1
  147. package/dist/components/content/MetricBlock.svelte +10 -13
  148. package/dist/components/content/NetworkTable.svelte +6 -4
  149. package/dist/components/content/NetworkTable.svelte.d.ts +1 -0
  150. package/dist/components/content/PageToolbar.svelte +6 -10
  151. package/dist/components/content/SectionHeader.svelte +8 -13
  152. package/dist/components/content/SecurityEventTable.svelte +3 -1
  153. package/dist/components/content/SettingsFieldRow.svelte +9 -23
  154. package/dist/components/content/SettingsGroup.svelte +11 -27
  155. package/dist/components/content/StatusBadge.svelte +3 -8
  156. package/dist/components/content/StatusTabs.svelte +2 -2
  157. package/dist/components/content/WorkspaceLayout.svelte +8 -12
  158. package/dist/components/enterprise/filter-tree.d.ts +48 -0
  159. package/dist/components/enterprise/filter-tree.js +224 -0
  160. package/dist/components/enterprise/json-schema-form.d.ts +39 -0
  161. package/dist/components/enterprise/json-schema-form.js +195 -0
  162. package/dist/components/enterprise/recursive-schema-form.d.ts +30 -0
  163. package/dist/components/enterprise/recursive-schema-form.js +196 -0
  164. package/dist/components/enterprise/spreadsheet-formula.d.ts +12 -0
  165. package/dist/components/enterprise/spreadsheet-formula.js +245 -0
  166. package/dist/components/fieldComponentMap.d.ts +18 -13
  167. package/dist/components/fieldComponentMap.js +100 -47
  168. package/dist/components/fields/AvatarField.svelte +1 -1
  169. package/dist/components/fields/ChoiceField.svelte +16 -0
  170. package/dist/components/fields/ChoiceField.svelte.d.ts +10 -0
  171. package/dist/components/fields/CodeField.svelte +11 -12
  172. package/dist/components/fields/CodeField.svelte.d.ts +1 -1
  173. package/dist/components/fields/DateField.svelte +4 -3
  174. package/dist/components/fields/DateRangeField.svelte +2 -4
  175. package/dist/components/fields/ImageField.svelte +3 -1
  176. package/dist/components/fields/ImagesField.svelte +23 -0
  177. package/dist/components/fields/ImagesField.svelte.d.ts +6 -0
  178. package/dist/components/fields/JsonField.svelte +19 -13
  179. package/dist/components/fields/PasswordField.svelte +5 -0
  180. package/dist/components/fields/PasswordField.svelte.d.ts +6 -0
  181. package/dist/components/fields/date-field-value.d.ts +2 -0
  182. package/dist/components/fields/date-field-value.js +13 -0
  183. package/dist/components/fields/json-value.d.ts +11 -0
  184. package/dist/components/fields/json-value.js +28 -0
  185. package/dist/components/json-schema-form-state.d.ts +37 -0
  186. package/dist/components/json-schema-form-state.js +168 -0
  187. package/dist/components/profile/ActivityTimeline.svelte +2 -2
  188. package/dist/components/record-detail.svelte.d.ts +19 -0
  189. package/dist/components/record-detail.svelte.js +34 -0
  190. package/dist/components/saved-list-views.js +29 -29
  191. package/dist/components/svar-grid-cells.d.ts +14 -0
  192. package/dist/components/svar-grid-cells.js +2 -0
  193. package/dist/components/svar-grid-contract.d.ts +80 -0
  194. package/dist/components/svar-grid-contract.js +159 -0
  195. package/dist/components/svar-grid-interactions.d.ts +54 -0
  196. package/dist/components/svar-grid-interactions.js +174 -0
  197. package/dist/components/svar-grid-loading.d.ts +40 -0
  198. package/dist/components/svar-grid-loading.js +180 -0
  199. package/dist/components/svar-grid-operations.d.ts +37 -0
  200. package/dist/components/svar-grid-operations.js +186 -0
  201. package/dist/components/svar-grid-panes.d.ts +34 -0
  202. package/dist/components/svar-grid-panes.js +66 -0
  203. package/dist/components/svar-grid-resource-loading.d.ts +18 -0
  204. package/dist/components/svar-grid-resource-loading.js +68 -0
  205. package/dist/components/svar-grid-resource-session.svelte.d.ts +29 -0
  206. package/dist/components/svar-grid-resource-session.svelte.js +61 -0
  207. package/dist/components/table-contract.d.ts +13 -0
  208. package/dist/components/table-contract.js +42 -0
  209. package/dist/components/task-utils.js +4 -2
  210. package/dist/components/ui/alert/alert-variants.d.ts +2 -3
  211. package/dist/components/ui/alert/alert-variants.js +1 -2
  212. package/dist/components/ui/alert/alert.svelte +4 -5
  213. package/dist/components/ui/alert/alert.svelte.d.ts +3 -8
  214. package/dist/components/ui/alert/index.js +0 -2
  215. package/dist/components/ui/avatar/avatar-variants.d.ts +2 -3
  216. package/dist/components/ui/avatar/avatar-variants.js +1 -2
  217. package/dist/components/ui/avatar/avatar.svelte +5 -6
  218. package/dist/components/ui/avatar/avatar.svelte.d.ts +3 -8
  219. package/dist/components/ui/badge/badge-variants.d.ts +2 -3
  220. package/dist/components/ui/badge/badge-variants.js +3 -2
  221. package/dist/components/ui/badge/badge.svelte +4 -5
  222. package/dist/components/ui/badge/badge.svelte.d.ts +3 -8
  223. package/dist/components/ui/badge/index.js +0 -2
  224. package/dist/components/ui/button/button-variants.d.ts +2 -3
  225. package/dist/components/ui/button/button-variants.js +5 -3
  226. package/dist/components/ui/button/button.svelte +100 -44
  227. package/dist/components/ui/button/button.svelte.d.ts +8 -12
  228. package/dist/components/ui/button/index.js +0 -2
  229. package/dist/components/ui/command/command-dialog.svelte +3 -1
  230. package/dist/components/ui/command/command-dialog.svelte.d.ts +1 -1
  231. package/dist/components/ui/command/command-group.svelte +4 -2
  232. package/dist/components/ui/command/command-item.svelte +4 -2
  233. package/dist/components/ui/command/command-separator.svelte +3 -1
  234. package/dist/components/ui/command/index.d.ts +5 -5
  235. package/dist/components/ui/input/input.svelte +41 -24
  236. package/dist/components/ui/input/input.svelte.d.ts +5 -4
  237. package/dist/components/ui/sheet/sheet.svelte +9 -3
  238. package/dist/components/ui/sheet/sheet.svelte.d.ts +1 -0
  239. package/dist/components/ui/textarea/textarea.svelte +2 -1
  240. package/dist/components/ui/tooltip/tooltip.svelte +4 -2
  241. package/dist/components.css +3079 -0
  242. package/dist/design-contract.d.ts +13 -0
  243. package/dist/design-contract.js +11 -0
  244. package/dist/design-system.d.ts +15 -0
  245. package/dist/design-system.js +7 -0
  246. package/dist/index.d.ts +15 -1
  247. package/dist/index.js +9 -0
  248. package/dist/inline-value.d.ts +5 -0
  249. package/dist/inline-value.js +24 -0
  250. package/dist/numeric-input.d.ts +2 -0
  251. package/dist/numeric-input.js +9 -0
  252. package/dist/page-chrome.css +12 -49
  253. package/dist/recipes.d.ts +4 -0
  254. package/dist/recipes.js +4 -0
  255. package/dist/rendering/index.d.ts +87 -0
  256. package/dist/rendering/index.js +117 -0
  257. package/dist/styled-system/css/conditions.js +36 -0
  258. package/dist/styled-system/css/css.d.ts +22 -0
  259. package/dist/styled-system/css/css.js +45 -0
  260. package/dist/styled-system/css/cva.d.ts +6 -0
  261. package/dist/styled-system/css/cva.js +87 -0
  262. package/dist/styled-system/css/cx.d.ts +5 -0
  263. package/dist/styled-system/css/cx.js +15 -0
  264. package/dist/styled-system/css/index.d.ts +5 -0
  265. package/dist/styled-system/css/index.js +4 -0
  266. package/dist/styled-system/css/sva.d.ts +4 -0
  267. package/dist/styled-system/css/sva.js +46 -0
  268. package/dist/styled-system/helpers.js +316 -0
  269. package/dist/styled-system/patterns/aspect-ratio.d.ts +20 -0
  270. package/dist/styled-system/patterns/aspect-ratio.js +38 -0
  271. package/dist/styled-system/patterns/bleed.d.ts +21 -0
  272. package/dist/styled-system/patterns/bleed.js +24 -0
  273. package/dist/styled-system/patterns/box.d.ts +20 -0
  274. package/dist/styled-system/patterns/box.js +15 -0
  275. package/dist/styled-system/patterns/center.d.ts +20 -0
  276. package/dist/styled-system/patterns/center.js +21 -0
  277. package/dist/styled-system/patterns/circle.d.ts +20 -0
  278. package/dist/styled-system/patterns/circle.js +25 -0
  279. package/dist/styled-system/patterns/container.d.ts +20 -0
  280. package/dist/styled-system/patterns/container.js +21 -0
  281. package/dist/styled-system/patterns/cq.d.ts +21 -0
  282. package/dist/styled-system/patterns/cq.js +21 -0
  283. package/dist/styled-system/patterns/divider.d.ts +22 -0
  284. package/dist/styled-system/patterns/divider.js +25 -0
  285. package/dist/styled-system/patterns/flex.d.ts +26 -0
  286. package/dist/styled-system/patterns/flex.js +26 -0
  287. package/dist/styled-system/patterns/float.d.ts +23 -0
  288. package/dist/styled-system/patterns/float.js +52 -0
  289. package/dist/styled-system/patterns/grid-item.d.ts +25 -0
  290. package/dist/styled-system/patterns/grid-item.js +25 -0
  291. package/dist/styled-system/patterns/grid.d.ts +24 -0
  292. package/dist/styled-system/patterns/grid.js +27 -0
  293. package/dist/styled-system/patterns/hstack.d.ts +21 -0
  294. package/dist/styled-system/patterns/hstack.js +24 -0
  295. package/dist/styled-system/patterns/index.d.ts +21 -0
  296. package/dist/styled-system/patterns/index.js +20 -0
  297. package/dist/styled-system/patterns/link-overlay.d.ts +20 -0
  298. package/dist/styled-system/patterns/link-overlay.js +24 -0
  299. package/dist/styled-system/patterns/spacer.d.ts +20 -0
  300. package/dist/styled-system/patterns/spacer.js +25 -0
  301. package/dist/styled-system/patterns/square.d.ts +20 -0
  302. package/dist/styled-system/patterns/square.js +24 -0
  303. package/dist/styled-system/patterns/stack.d.ts +23 -0
  304. package/dist/styled-system/patterns/stack.js +24 -0
  305. package/dist/styled-system/patterns/visually-hidden.d.ts +20 -0
  306. package/dist/styled-system/patterns/visually-hidden.js +18 -0
  307. package/dist/styled-system/patterns/vstack.d.ts +21 -0
  308. package/dist/styled-system/patterns/vstack.js +24 -0
  309. package/dist/styled-system/patterns/wrap.d.ts +24 -0
  310. package/dist/styled-system/patterns/wrap.js +25 -0
  311. package/dist/styled-system/recipes/content-header.d.ts +31 -0
  312. package/dist/styled-system/recipes/content-header.js +65 -0
  313. package/dist/styled-system/recipes/content-page.d.ts +34 -0
  314. package/dist/styled-system/recipes/content-page.js +43 -0
  315. package/dist/styled-system/recipes/create-recipe.js +82 -0
  316. package/dist/styled-system/recipes/index.d.ts +17 -0
  317. package/dist/styled-system/recipes/index.js +16 -0
  318. package/dist/styled-system/recipes/metric-block.d.ts +34 -0
  319. package/dist/styled-system/recipes/metric-block.js +76 -0
  320. package/dist/styled-system/recipes/product-list.d.ts +31 -0
  321. package/dist/styled-system/recipes/product-list.js +73 -0
  322. package/dist/styled-system/recipes/product-section.d.ts +31 -0
  323. package/dist/styled-system/recipes/product-section.js +49 -0
  324. package/dist/styled-system/recipes/product-settings-row.d.ts +34 -0
  325. package/dist/styled-system/recipes/product-settings-row.js +58 -0
  326. package/dist/styled-system/recipes/product-settings.d.ts +31 -0
  327. package/dist/styled-system/recipes/product-settings.js +57 -0
  328. package/dist/styled-system/recipes/product-status.d.ts +34 -0
  329. package/dist/styled-system/recipes/product-status.js +45 -0
  330. package/dist/styled-system/recipes/product-toolbar.d.ts +31 -0
  331. package/dist/styled-system/recipes/product-toolbar.js +41 -0
  332. package/dist/styled-system/recipes/product-workspace.d.ts +34 -0
  333. package/dist/styled-system/recipes/product-workspace.js +58 -0
  334. package/dist/styled-system/recipes/surface-metric.d.ts +38 -0
  335. package/dist/styled-system/recipes/surface-metric.js +63 -0
  336. package/dist/styled-system/recipes/surface-table.d.ts +34 -0
  337. package/dist/styled-system/recipes/surface-table.js +62 -0
  338. package/dist/styled-system/recipes/ui-badge.d.ts +31 -0
  339. package/dist/styled-system/recipes/ui-badge.js +38 -0
  340. package/dist/styled-system/recipes/ui-button.d.ts +32 -0
  341. package/dist/styled-system/recipes/ui-button.js +43 -0
  342. package/dist/styled-system/recipes/ui-input.d.ts +31 -0
  343. package/dist/styled-system/recipes/ui-input.js +49 -0
  344. package/dist/styled-system/recipes/ui-textarea.d.ts +31 -0
  345. package/dist/styled-system/recipes/ui-textarea.js +24 -0
  346. package/dist/styled-system/styles.css +1257 -0
  347. package/dist/styled-system/tokens/index.d.ts +9 -0
  348. package/dist/styled-system/tokens/index.js +268 -0
  349. package/dist/styled-system/tokens/tokens.d.ts +36 -0
  350. package/dist/styled-system/types/composition.d.ts +227 -0
  351. package/dist/styled-system/types/conditions.d.ts +236 -0
  352. package/dist/styled-system/types/csstype.d.ts +22570 -0
  353. package/dist/styled-system/types/index.d.ts +6 -0
  354. package/dist/styled-system/types/parts.d.ts +8 -0
  355. package/dist/styled-system/types/pattern.d.ts +78 -0
  356. package/dist/styled-system/types/prop-type.d.ts +223 -0
  357. package/dist/styled-system/types/recipe.d.ts +181 -0
  358. package/dist/styled-system/types/selectors.d.ts +59 -0
  359. package/dist/styled-system/types/static-css.d.ts +56 -0
  360. package/dist/styled-system/types/style-props.d.ts +8088 -0
  361. package/dist/styled-system/types/system-types.d.ts +151 -0
  362. package/dist/styles/aliases.css +49 -0
  363. package/dist/styles/compatibility.epilogue.css +384 -0
  364. package/dist/styles/compatibility.prelude.css +5513 -0
  365. package/dist/styles/conditional-states.css +28 -0
  366. package/dist/styles/conditional-utilities.css +22 -0
  367. package/dist/styles/recipes.css +1262 -0
  368. package/dist/types.d.ts +3 -3
  369. package/dist/utils.d.ts +1 -1
  370. package/dist/utils.js +1 -1
  371. package/package.json +38 -14
  372. package/styles-compatibility.json +12 -0
@@ -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;
@@ -50,6 +55,7 @@ interface Props {
50
55
  total: number;
51
56
  visibleColumnsCount: number;
52
57
  }]>;
58
+ deleteVariables?: unknown;
53
59
  }
54
60
  declare const AutoTable: import("svelte").Component<Props, {}, "">;
55
61
  type AutoTable = ReturnType<typeof AutoTable>;
@@ -0,0 +1,172 @@
1
+ <script lang="ts">
2
+ import type { ResourceRendering } from '../rendering/index.js';
3
+ import { definedOptions } from '@svadmin/core/options';
4
+
5
+ import { useCan, useNavigation, type FieldDefinition } from '@svadmin/core';
6
+ import { useRecordDetail } from './record-detail.svelte';
7
+ import { useTranslation } from '@svadmin/core/i18n';
8
+ import { Copy, Check, Eye, Pencil, RefreshCw } from '@lucide/svelte';
9
+ import DetailDrawer from './DetailDrawer.svelte';
10
+ import FieldDisplay from './FieldDisplay.svelte';
11
+ import { Button } from './ui/button/index.js';
12
+ import { Skeleton } from './ui/skeleton/index.js';
13
+
14
+ let {
15
+ resourceName,
16
+ rendering,
17
+ open = $bindable(false),
18
+ recordId,
19
+ onClose,
20
+ }: {
21
+ resourceName: string;
22
+ rendering?: ResourceRendering | undefined;
23
+ open?: boolean;
24
+ recordId: string | number;
25
+ onClose?: () => void;
26
+ } = $props();
27
+
28
+ const i18n = useTranslation();
29
+ const navigation = useNavigation();
30
+ const detail = useRecordDetail(() => ({ resourceName, id: recordId, rendering }));
31
+ const resource = $derived(detail.resource);
32
+ const showFields = $derived(detail.fields);
33
+ const fieldGroups = $derived.by(() => {
34
+ const groups = new Map<string, FieldDefinition[]>();
35
+ for (const field of showFields) {
36
+ const label = field.group ?? '';
37
+ const fields = groups.get(label) ?? [];
38
+ fields.push(field);
39
+ groups.set(label, fields);
40
+ }
41
+ return [...groups].map(([label, fields]) => ({ label, fields }));
42
+ });
43
+ let copyState = $state<'idle' | 'copied' | 'error'>('idle');
44
+ $effect(() => { void recordId; void resourceName; copyState = 'idle'; });
45
+ const permissionPending = $derived(detail.checkingPermission);
46
+ const canReadRecord = $derived(detail.canRead);
47
+ const query = detail.query;
48
+ const editPermission = useCan(() => ({
49
+ resource: resourceName, action: 'edit', id: recordId,
50
+ queryOptions: { enabled: canReadRecord && resource.canEdit !== false },
51
+ }));
52
+
53
+ function navigateTo(action: 'show' | 'edit'): void {
54
+ if (!canReadRecord || !query.isSuccess || (action === 'edit' &&
55
+ (resource.canEdit === false || editPermission.allowed !== true))) return;
56
+ navigation[action](resourceName, recordId);
57
+ open = false;
58
+ }
59
+
60
+ async function copyId(): Promise<void> {
61
+ if (!canReadRecord || !query.isSuccess) return;
62
+ const id = recordId;
63
+ try {
64
+ await navigator.clipboard.writeText(String(id));
65
+ if (recordId === id) copyState = 'copied';
66
+ } catch {
67
+ if (recordId === id) copyState = 'error';
68
+ }
69
+ }
70
+ </script>
71
+
72
+ {#snippet fieldsList(fields: FieldDefinition[])}
73
+ {#if query.isSuccess}
74
+ {@const record = detail.rendering ? detail.rendering.record(query.data.data) : query.data.data}
75
+ <dl class="svadmin-u-fa6acbf81d74 svadmin-u-d2c3932343f5">
76
+ {#each fields as field (field.key)}
77
+ <div class="svadmin-u-f3c543ad5fe9 svadmin-u-58284b4ea568 svadmin-u-cb11fec3bb46 svadmin-u-d9bdd3d643a2 svadmin-u-022e8076dfea">
78
+ <dt class="svadmin-u-359090c2d529 svadmin-u-2689f3958069 svadmin-u-bfa603190748 svadmin-u-e2327d142859">{field.label}</dt>
79
+ <dd class="svadmin-u-7e0b7cdf1a94 svadmin-u-170cee3ff4e4 svadmin-u-fc7473ca09eb svadmin-u-d4108abe6359">
80
+ <FieldDisplay type={field.type} value={record[field.key]} options={field.options} resourceName={field.resource} />
81
+ </dd>
82
+ </div>
83
+ {/each}
84
+ </dl>
85
+ {/if}
86
+ {/snippet}
87
+
88
+ <DetailDrawer
89
+ bind:open
90
+ data-svadmin-rendering-resource={detail.rendering?.resource.name}
91
+ data-svadmin-rendering-kind={detail.rendering ? 'detail-drawer' : undefined}
92
+ title="{resource.label} {i18n.t('common.detail')}"
93
+ description={`#${recordId}`}
94
+ closeLabel={i18n.t('common.close')}
95
+ width="w-full sm:max-w-xl"
96
+ {...definedOptions({ onClose })}
97
+ data-svadmin-record-detail
98
+ >
99
+ {#snippet extra()}
100
+ {#if canReadRecord && query.isSuccess}
101
+ <Button type="button" variant="ghost" size="icon" onclick={copyId}
102
+ title={i18n.t('common.copyId')} aria-label={i18n.t('common.copyId')}>
103
+ {#if copyState === 'copied'}
104
+ <Check class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" />
105
+ {:else}
106
+ <Copy class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" />
107
+ {/if}
108
+ </Button>
109
+ <span role="status">{copyState === 'copied' ? i18n.t('common.copied') : copyState === 'error' ? i18n.t('common.operationFailed') : ''}</span>
110
+ {/if}
111
+ {/snippet}
112
+ {#if permissionPending || (canReadRecord && query.isLoading)}
113
+ <div class="svadmin-u-fa6acbf81d74 svadmin-u-d2c3932343f5" role="status" aria-live="polite" aria-label={i18n.t('common.loading')} aria-busy="true">
114
+ {#each showFields.slice(0, 6) as field (field.key)}
115
+ <div class="svadmin-u-f3c543ad5fe9 svadmin-u-77a2a20e90d4 svadmin-u-cb11fec3bb46 svadmin-u-d9bdd3d643a2 svadmin-u-022e8076dfea">
116
+ <Skeleton class="svadmin-u-11e59c6d5f6b svadmin-u-69da7e4ff95d" />
117
+ <Skeleton class="svadmin-u-11e59c6d5f6b svadmin-u-6da6a3c3f741 svadmin-u-35b2f3aff60f" />
118
+ </div>
119
+ {/each}
120
+ </div>
121
+ {:else if !canReadRecord}
122
+ <div class="svadmin-u-61357c0c2f29 svadmin-u-ca6bf63030aa" data-svadmin-access-denied>
123
+ <p class="svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">{i18n.t('common.accessDenied')}</p>
124
+ </div>
125
+ {:else if query.isError}
126
+ <div role="alert">
127
+ <p>{i18n.t('common.operationFailed')}</p>
128
+ <Button type="button" variant="ghost" size="icon" title={i18n.t('common.retry')}
129
+ aria-label={i18n.t('common.retry')} disabled={query.isFetching} onclick={detail.refresh}>
130
+ <RefreshCw class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" />
131
+ </Button>
132
+ </div>
133
+ {:else if query.isSuccess}
134
+ {#key `${resourceName}:${recordId}`}
135
+ {#each fieldGroups as group, index (group.label)}
136
+ {#if group.label}
137
+ <details open={index === 0} class="record-detail-group">
138
+ <summary>{group.label}</summary>
139
+ {@render fieldsList(group.fields)}
140
+ </details>
141
+ {:else}
142
+ {@render fieldsList(group.fields)}
143
+ {/if}
144
+ {/each}
145
+ {/key}
146
+ {:else}
147
+ <div class="svadmin-u-61357c0c2f29 svadmin-u-ca6bf63030aa">
148
+ <p class="svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">{i18n.t('common.noData')}</p>
149
+ </div>
150
+ {/if}
151
+
152
+ {#snippet footer()}
153
+ {#if canReadRecord && query.isSuccess}
154
+ <Button type="button" variant="outline" onclick={() => navigateTo('show')}>
155
+ <Eye class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" data-icon="inline-start" aria-hidden="true" />
156
+ {i18n.t('common.openFullDetail')}
157
+ </Button>
158
+ {/if}
159
+ {#if canReadRecord && query.isSuccess && resource.canEdit !== false && editPermission.allowed === true}
160
+ <Button type="button" onclick={() => navigateTo('edit')}>
161
+ <Pencil class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" data-icon="inline-start" aria-hidden="true" />
162
+ {i18n.t('common.edit')}
163
+ </Button>
164
+ {/if}
165
+ {/snippet}
166
+ </DetailDrawer>
167
+
168
+ <style>
169
+ .record-detail-group { border-bottom: 1px solid var(--border); }
170
+ .record-detail-group summary { cursor: pointer; padding: 12px 0; font-weight: 500; }
171
+ .record-detail-group summary:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
172
+ </style>
@@ -0,0 +1,11 @@
1
+ import type { ResourceRendering } from '../rendering/index.js';
2
+ type $$ComponentProps = {
3
+ resourceName: string;
4
+ rendering?: ResourceRendering | undefined;
5
+ open?: boolean;
6
+ recordId: string | number;
7
+ onClose?: () => void;
8
+ };
9
+ declare const BoundRecordDetailDrawer: import("svelte").Component<$$ComponentProps, {}, "open">;
10
+ type BoundRecordDetailDrawer = ReturnType<typeof BoundRecordDetailDrawer>;
11
+ export default BoundRecordDetailDrawer;
@@ -1,4 +1,6 @@
1
1
  <script lang="ts">
2
+ import { definedOptions } from '@svadmin/core/options';
3
+
2
4
  import { captureAdminContext, getResources, type MenuItem } from '@svadmin/core';
3
5
  import { getPath } from '../router-state.svelte.js';
4
6
  import { useTranslation } from '@svadmin/core/i18n';
@@ -16,7 +18,7 @@
16
18
  interface Crumb { label: string; href?: string; }
17
19
 
18
20
  function normalizePath(path: string): string {
19
- const normalized = path.replace(/^#/, '').split(/[?#]/)[0].replace(/\/$/, '');
21
+ const normalized = path.replace(/^#/, '').replace(/[?#].*$/, '').replace(/\/$/, '');
20
22
  return normalized || '/';
21
23
  }
22
24
 
@@ -39,10 +41,10 @@
39
41
  const menuTrail = menu ? findMenuTrail(menu, currentPathname) : undefined;
40
42
  if (menuTrail) {
41
43
  for (const item of menuTrail) {
42
- result.push({
44
+ result.push(definedOptions({
43
45
  label: item.label ?? item.name,
44
46
  href: item.href ? adminContext.formatLink(normalizePath(item.href)) : undefined,
45
- });
47
+ }));
46
48
  }
47
49
  return result;
48
50
  }
@@ -56,6 +58,7 @@
56
58
 
57
59
  for (let i = 0; i < segments.length; i++) {
58
60
  const seg = segments[i];
61
+ if (seg === undefined) continue;
59
62
  currentPath += `/${seg}`;
60
63
 
61
64
  if (resourceNames.includes(seg)) {
@@ -73,7 +76,7 @@
73
76
  currentPath += `/${id}`; // advance path by id
74
77
  result.push({ label: `${actionLabel} #${id}`, href: adminContext.formatLink(currentPath) });
75
78
  i++; // skip next segment since we consumed the id
76
- } else if (i > 0 && resourceNames.includes(segments[i-1])) {
79
+ } else if (i > 0 && resourceNames.some((name) => name === segments[i-1])) {
77
80
  // This is a parent ID (e.g. /teams/123/users) and we are not an action
78
81
  result.push({ label: `#${seg}`, href: adminContext.formatLink(currentPath) });
79
82
  }
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { captureAdminContext, queryKeyMatches } from '@svadmin/core';
2
+ import { captureAdminContext, queryKeyMatches, withValidatedTaskProvider } from '@svadmin/core';
3
3
  import { useQueryClient } from '@tanstack/svelte-query';
4
4
  import { useTranslation } from '@svadmin/core/i18n';
5
5
 
@@ -34,23 +34,27 @@
34
34
 
35
35
  async function handleCancel() {
36
36
  if (!taskProvider?.cancel || pending) return;
37
+ const scopedTaskId = taskId;
38
+ const scope = adminContext.queryKeyMatcher();
37
39
  pending = true;
38
40
  try {
39
- await taskProvider.cancel(taskId);
41
+ const provider = withValidatedTaskProvider(taskProvider);
42
+ if (!provider.cancel) return;
43
+ await provider.cancel(scopedTaskId);
40
44
  await Promise.all([
41
45
  queryClient.invalidateQueries({
42
46
  predicate: (query) => queryKeyMatches(query.queryKey, {
43
- ...adminContext.queryKeyMatcher(),
47
+ ...scope,
44
48
  kind: 'task',
45
49
  action: 'list',
46
50
  }),
47
51
  }),
48
52
  queryClient.invalidateQueries({
49
53
  predicate: (query) => queryKeyMatches(query.queryKey, {
50
- ...adminContext.queryKeyMatcher(),
54
+ ...scope,
51
55
  kind: 'task',
52
56
  action: 'one',
53
- id: taskId,
57
+ id: scopedTaskId,
54
58
  }),
55
59
  }),
56
60
  ]);
@@ -136,14 +136,15 @@
136
136
  bind:value={filterVal}
137
137
  class="svadmin-u-d1c57777d8b6 svadmin-u-6da6a3c3f741 svadmin-u-421ac2be5045 svadmin-u-ca6bcd4b6f3f svadmin-u-e5795dad4d22 svadmin-u-e6f9e383a762 svadmin-u-d5eab218aa34 svadmin-u-359090c2d529 svadmin-u-f10f771f87e9 svadmin-u-3e94a98e1466 svadmin-u-9c1295a6914a"
138
138
  >
139
- <option value="">All</option>
140
- <option value="true">Yes / True</option>
141
- <option value="false">No / False</option>
139
+ <option value="">{i18n.t('common.all')}</option>
140
+ <option value="true">{i18n.t('common.yesTrue')}</option>
141
+ <option value="false">{i18n.t('common.noFalse')}</option>
142
142
  </select>
143
143
  {:else if field.type === 'date'}
144
144
  <input
145
145
  id="header_filter_val_{field.key}"
146
146
  type="date"
147
+ lang={i18n.locale}
147
148
  bind:value={filterVal}
148
149
  class="svadmin-u-d1c57777d8b6 svadmin-u-6da6a3c3f741 svadmin-u-421ac2be5045 svadmin-u-ca6bcd4b6f3f svadmin-u-e5795dad4d22 svadmin-u-e6f9e383a762 svadmin-u-d5eab218aa34 svadmin-u-359090c2d529 svadmin-u-f10f771f87e9 svadmin-u-3e94a98e1466 svadmin-u-9c1295a6914a"
149
150
  />
@@ -82,6 +82,7 @@
82
82
 
83
83
  const next = [...columns];
84
84
  const [moved] = next.splice(index, 1);
85
+ if (moved === undefined) return;
85
86
  next.splice(targetIndex, 0, moved);
86
87
 
87
88
  columns = next;
@@ -1,36 +1,38 @@
1
1
  <script lang="ts">
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { definedReactiveOptions } from '@svadmin/core/options';
3
+
3
4
  import { useTranslation } from '@svadmin/core/i18n';
4
- import { useSelect } from '@svadmin/core';
5
- import type { Filter } from '@svadmin/core';
5
+ import { useResourceContract, useSelect } from '@svadmin/core';
6
+ import type { BaseRecord, Filter } from '@svadmin/core';
7
+ import type { HTMLButtonAttributes } from 'svelte/elements';
8
+ import type { ButtonProps } from './ui/button/index.js';
6
9
  import { Button } from './ui/button/index.js';
7
- import TooltipButton from './TooltipButton.svelte';
8
10
  import { Command } from './ui/command/index.js';
9
11
  import { Skeleton } from './ui/skeleton/index.js';
10
- import { ChevronsUpDown, Check, X, Search } from '@lucide/svelte';
12
+ import { ChevronsUpDown, Check, X, Search, RotateCw } from '@lucide/svelte';
11
13
 
12
14
  const i18n = useTranslation();
13
15
 
14
16
  function clickOutside(node: HTMLElement) {
15
17
  const handler = (e: MouseEvent) => {
16
- if (!node.contains(e.target as Node)) open = false;
18
+ if (e.target instanceof Node && !node.contains(e.target)) open = false;
17
19
  };
18
20
  document.addEventListener('click', handler, true);
19
21
  return { destroy() { document.removeEventListener('click', handler, true); } };
20
22
  }
21
23
 
22
- interface Props {
24
+ interface Props extends Omit<HTMLButtonAttributes, 'value' | 'onchange' | 'children' | 'onclick' | 'type'> {
23
25
  resource: string;
24
- value?: string | number | null;
25
- onchange?: (value: string | number | null) => void;
26
+ value?: string | number | null | (string | number)[];
27
+ onchange?: (value: string | number | null | (string | number)[]) => void;
26
28
  optionLabel?: string;
27
29
  optionValue?: string;
28
30
  placeholder?: string;
29
31
  searchable?: boolean;
32
+ multiple?: boolean;
30
33
  onSearch?: (value: string) => Filter[];
31
34
  id?: string;
32
35
  class?: string;
33
- [key: string]: any;
34
36
  }
35
37
 
36
38
  let {
@@ -41,68 +43,130 @@
41
43
  optionValue = 'id',
42
44
  placeholder = 'Select...',
43
45
  searchable = true,
46
+ multiple = false,
44
47
  onSearch,
48
+ disabled = false,
45
49
  ...restProps
46
50
  }: Props = $props();
47
51
 
48
- const { options, query, onSearchChange } = useSelect({
49
- get resource() { return resource; },
50
- get optionLabel() { return optionLabel; },
51
- get optionValue() { return optionValue; },
52
- get onSearch() { return onSearch ?? (searchable ? (v: string) => v ? [{ field: optionLabel, operator: 'contains' as const, value: v }] : [] : undefined); },
52
+ const buttonRestProps = $derived(restProps as Omit<ButtonProps, 'children' | 'variant' | 'size'>);
53
+
54
+ const binding = useResourceContract(() => resource);
55
+ const defaultSearch = $derived.by(() => {
56
+ const field = optionLabel;
57
+ return (v: string): Filter[] => v ? [{ field, operator: 'contains', value: v }] : [];
53
58
  });
59
+ const select = useSelect(definedReactiveOptions({
60
+ get resource() { return binding.resource; },
61
+ get dataProviderName() { return binding.dataProviderName; },
62
+ get optionLabel() { return optionLabel; },
63
+ get optionValue() {
64
+ const field = optionValue;
65
+ return (row: BaseRecord) => {
66
+ const candidate = row[field];
67
+ if (typeof candidate === 'string' || (typeof candidate === 'number' && Number.isFinite(candidate))) return candidate;
68
+ throw new TypeError('Invalid select value field');
69
+ };
70
+ },
71
+ get projectionKey() { return `combobox:${optionLabel}:${optionValue}`; },
72
+ get defaultValue() {
73
+ if (Array.isArray(value)) return value;
74
+ return value === null || value === undefined ? [] : [value];
75
+ },
76
+ get onSearch() { return onSearch ?? (searchable ? defaultSearch : undefined); },
77
+ }));
54
78
 
55
79
  let open = $state(false);
56
80
  let searchInputValue = $state('');
81
+ $effect(() => {
82
+ void binding.resource;
83
+ void binding.dataProviderName;
84
+ void binding.meta;
85
+ searchInputValue = '';
86
+ open = false;
87
+ });
57
88
 
58
- const selectedLabel = $derived(
59
- (options as { label: string; value: string | number }[])?.find(
60
- (o: { label: string; value: string | number }) => o.value === value
61
- )?.label ?? ''
89
+ const selectedValues = $derived(
90
+ Array.isArray(value) ? value : value === null || value === undefined ? [] : [value],
62
91
  );
92
+ const selectedLabels = $derived(selectedValues.flatMap(selectedValue => {
93
+ const option = select.options.find(candidate => candidate.value === selectedValue);
94
+ return option ? [option.label] : [];
95
+ }));
96
+ const selectedLabel = $derived(selectedLabels.join(', '));
63
97
 
64
98
  function handleSelect(optValue: string | number) {
99
+ if (multiple) {
100
+ const next = selectedValues.includes(optValue)
101
+ ? selectedValues.filter(selectedValue => selectedValue !== optValue)
102
+ : [...selectedValues, optValue];
103
+ onchange?.(next);
104
+ return;
105
+ }
65
106
  onchange?.(optValue === value ? null : optValue);
66
107
  open = false;
67
108
  searchInputValue = '';
109
+ select.onSearchChange('');
68
110
  }
69
111
 
70
112
  function handleClear(e: Event) {
71
113
  e.stopPropagation();
72
- onchange?.(null);
114
+ onchange?.(multiple ? [] : null);
73
115
  open = false;
74
116
  searchInputValue = '';
117
+ select.onSearchChange('');
75
118
  }
76
119
 
77
120
  function handleSearchInput(e: Event) {
78
- const v = (e.currentTarget as HTMLInputElement).value;
121
+ if (!(e.currentTarget instanceof HTMLInputElement)) return;
122
+ const v = e.currentTarget.value;
79
123
  searchInputValue = v;
80
- onSearchChange(v);
124
+ select.onSearchChange(v);
81
125
  }
82
126
  </script>
83
127
 
84
128
  <div class="svadmin-u-d89972fe17d6" use:clickOutside>
129
+ <div class="select-control">
85
130
  <Button
86
131
  variant="outline"
87
132
  type="button"
88
133
  class="svadmin-u-6da6a3c3f741 svadmin-u-8ef2268efbbc svadmin-u-8ecebc9f80e6"
89
134
  onclick={() => { open = !open; }}
90
- {...restProps}
135
+ {...buttonRestProps}
136
+ {disabled}
137
+ aria-haspopup="listbox"
138
+ aria-expanded={open}
139
+ aria-multiselectable={multiple || undefined}
140
+ aria-busy={select.isFetching}
141
+ aria-invalid={select.isError}
91
142
  >
92
143
  {#if selectedLabel}
93
144
  <span class="svadmin-u-f283ea9bea0e">{selectedLabel}</span>
94
- <TooltipButton tooltip={i18n.t('common.clear')} size="icon-sm" class="svadmin-u-cd0d9c512cdc svadmin-u-72470489ff4e svadmin-u-f58b02572ab2" onclick={handleClear}>
95
- <X class="svadmin-u-6a60c09e6aaa svadmin-u-9cea05671a29" />
96
- </TooltipButton>
97
145
  {:else}
98
146
  <span class="svadmin-u-bfa603190748">{placeholder}</span>
99
147
  {/if}
100
148
  <ChevronsUpDown class="svadmin-u-fb56d9cff341 svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3 svadmin-u-012fbd121f37 svadmin-u-0b8c506a0596" />
101
149
  </Button>
150
+ {#if selectedValues.length}
151
+ <Button type="button" variant="ghost" size="icon-sm" {disabled}
152
+ title={i18n.t('common.clear')} aria-label={i18n.t('common.clear')} onclick={handleClear}>
153
+ <X class="svadmin-u-6a60c09e6aaa svadmin-u-9cea05671a29" />
154
+ </Button>
155
+ {/if}
156
+ </div>
157
+ {#if select.isError}
158
+ <div role="alert" class="select-error">
159
+ <span>Unable to load options.</span>
160
+ <Button type="button" variant="ghost" size="icon-sm" disabled={disabled || select.isFetching}
161
+ title={i18n.t('common.retry')} aria-label={i18n.t('common.retry')} onclick={() => select.refetch()}>
162
+ <RotateCw class="svadmin-u-6a60c09e6aaa svadmin-u-9cea05671a29" />
163
+ </Button>
164
+ </div>
165
+ {/if}
102
166
 
103
167
  {#if open}
104
168
  <div class="svadmin-u-da4dbfbc4fdc svadmin-u-181b286668b5 svadmin-u-b6b02c0ebef6 svadmin-u-6da6a3c3f741 svadmin-u-421ac2be5045 svadmin-u-ca6bcd4b6f3f svadmin-u-e541d86d1ec8 svadmin-u-06bbb43166db">
105
- <Command.Root class="svadmin-u-60fbb7713999 svadmin-u-8dddea0773ed svadmin-u-2cd02d11d1af svadmin-u-421ac2be5045 svadmin-u-e541d86d1ec8 svadmin-u-9b13e8ae5c9c">
169
+ <Command.Root shouldFilter={false} class="svadmin-u-60fbb7713999 svadmin-u-8dddea0773ed svadmin-u-2cd02d11d1af svadmin-u-421ac2be5045 svadmin-u-e541d86d1ec8 svadmin-u-9b13e8ae5c9c">
106
170
  {#if searchable}
107
171
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-65fdbade2025 svadmin-u-d5eab218aa34">
108
172
  <Search class="svadmin-u-82cc6c6581cd svadmin-u-7fc7f732bf7e svadmin-u-bf600f8e029c svadmin-u-012fbd121f37 svadmin-u-0b8c506a0596" />
@@ -114,22 +178,28 @@
114
178
  />
115
179
  </div>
116
180
  {/if}
117
- <Command.List class="svadmin-u-558f64349245 svadmin-u-92bf82f493b1 svadmin-u-eb6a3cef9686">
118
- <Command.Empty class="svadmin-u-cb11fec3bb46 svadmin-u-ca6bf63030aa svadmin-u-359090c2d529 svadmin-u-bfa603190748">
119
- No results.
120
- </Command.Empty>
121
- {#if query.isLoading}
181
+ <Command.List
182
+ role="listbox"
183
+ aria-multiselectable={multiple || undefined}
184
+ class="svadmin-u-558f64349245 svadmin-u-92bf82f493b1 svadmin-u-eb6a3cef9686"
185
+ >
186
+ {#if select.isLoading}
122
187
  {#each Array(3) as _, _i (_i)}
123
188
  <div class="svadmin-u-d5eab218aa34 svadmin-u-ec0091ee009b"><Skeleton class="svadmin-u-cd0d9c512cdc svadmin-u-6da6a3c3f741" /></div>
124
189
  {/each}
125
- {:else}
126
- {#each (options as { label: string; value: string | number }[]) ?? [] as opt, _i (_i)}
190
+ {:else if !select.isError}
191
+ {#if !select.options.length}
192
+ <Command.Empty class="svadmin-u-cb11fec3bb46 svadmin-u-ca6bf63030aa svadmin-u-359090c2d529 svadmin-u-bfa603190748">
193
+ No results.
194
+ </Command.Empty>
195
+ {/if}
196
+ {#each select.options as opt (opt.value)}
127
197
  <Command.Item
128
- value={opt.label}
198
+ value={`${typeof opt.value}:${opt.value}`}
129
199
  onSelect={() => handleSelect(opt.value)}
130
200
  class="svadmin-u-d89972fe17d6 svadmin-u-60fbb7713999 svadmin-u-50ca6ba56aa3 svadmin-u-7f6912283f11 svadmin-u-3960ffc248d9 svadmin-u-36d4469299aa svadmin-u-d5eab218aa34 svadmin-u-ec0091ee009b svadmin-u-fc7473ca09eb svadmin-u-df37b1fd9495 svadmin-u-99afb1cc3b47 svadmin-u-529780e25268"
131
201
  >
132
- <Check class="svadmin-u-d2347e8497a9 svadmin-u-7fc7f732bf7e svadmin-u-bf600f8e029c {value === opt.value ? 'svadmin-u-3972e98dc84f' : 'svadmin-u-7065497e1ca0'}" />
202
+ <Check class="svadmin-u-d2347e8497a9 svadmin-u-7fc7f732bf7e svadmin-u-bf600f8e029c {selectedValues.includes(opt.value) ? 'svadmin-u-3972e98dc84f' : 'svadmin-u-7065497e1ca0'}" />
133
203
  {opt.label}
134
204
  </Command.Item>
135
205
  {/each}
@@ -139,3 +209,15 @@
139
209
  </div>
140
210
  {/if}
141
211
  </div>
212
+
213
+ <style>
214
+ .select-control, .select-error {
215
+ display: flex;
216
+ align-items: center;
217
+ gap: 4px;
218
+ }
219
+ .select-error {
220
+ color: var(--destructive);
221
+ font-size: 0.875rem;
222
+ }
223
+ </style>
@@ -1,16 +1,17 @@
1
1
  import type { Filter } from '@svadmin/core';
2
- interface Props {
2
+ import type { HTMLButtonAttributes } from 'svelte/elements';
3
+ interface Props extends Omit<HTMLButtonAttributes, 'value' | 'onchange' | 'children' | 'onclick' | 'type'> {
3
4
  resource: string;
4
- value?: string | number | null;
5
- onchange?: (value: string | number | null) => void;
5
+ value?: string | number | null | (string | number)[];
6
+ onchange?: (value: string | number | null | (string | number)[]) => void;
6
7
  optionLabel?: string;
7
8
  optionValue?: string;
8
9
  placeholder?: string;
9
10
  searchable?: boolean;
11
+ multiple?: boolean;
10
12
  onSearch?: (value: string) => Filter[];
11
13
  id?: string;
12
14
  class?: string;
13
- [key: string]: any;
14
15
  }
15
16
  declare const ComboboxField: import("svelte").Component<Props, {}, "">;
16
17
  type ComboboxField = ReturnType<typeof ComboboxField>;
@@ -1,4 +1,7 @@
1
1
  <script lang="ts">
2
+ import type { ResourceRendering } from '../rendering/index.js';
3
+ import { definedOptions } from '@svadmin/core/options';
4
+
2
5
  import { getResource, captureAdminContext } from '@svadmin/core';
3
6
  import { useTranslation } from '@svadmin/core/i18n';
4
7
  import type { Snippet } from 'svelte';
@@ -10,6 +13,7 @@
10
13
 
11
14
  interface Props {
12
15
  resourceName: string;
16
+ rendering?: ResourceRendering | undefined;
13
17
  title?: string;
14
18
  density?: 'compact' | 'comfortable';
15
19
  columns?: 1 | 2 | 3 | 4;
@@ -20,6 +24,7 @@
20
24
 
21
25
  let {
22
26
  resourceName,
27
+ rendering,
23
28
  title,
24
29
  density = 'comfortable',
25
30
  columns = 1,
@@ -49,12 +54,13 @@
49
54
  </PageHeader>
50
55
 
51
56
  <AutoForm
57
+ {rendering}
52
58
  {resourceName}
53
59
  mode="create"
54
60
  {density}
55
61
  {columns}
56
62
  showHeader={false}
57
63
  onNavigationGuardReady={(guard) => navigateGuard = guard}
58
- {onSuccess}
64
+ {...definedOptions({ "onSuccess": onSuccess })}
59
65
  />
60
66
  </div>
@@ -1,6 +1,8 @@
1
+ import type { ResourceRendering } from '../rendering/index.js';
1
2
  import type { Snippet } from 'svelte';
2
3
  interface Props {
3
4
  resourceName: string;
5
+ rendering?: ResourceRendering | undefined;
4
6
  title?: string;
5
7
  density?: 'compact' | 'comfortable';
6
8
  columns?: 1 | 2 | 3 | 4;