@svadmin/ui 0.73.0 → 0.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.md +53 -28
  2. package/dist/app.css +3733 -4119
  3. package/dist/app.theme.css +3733 -4119
  4. package/dist/component-registry.d.ts +14977 -0
  5. package/dist/component-registry.js +216 -0
  6. package/dist/components/AboutSettings.svelte +7 -1
  7. package/dist/components/AboutSettings.svelte.d.ts +4 -1
  8. package/dist/components/ActivityFeed.svelte +9 -3
  9. package/dist/components/ActivityFeed.svelte.d.ts +3 -0
  10. package/dist/components/AdminApp.svelte +19 -10
  11. package/dist/components/AdminApp.svelte.d.ts +6 -0
  12. package/dist/components/ApiSettings.svelte +41 -5
  13. package/dist/components/ApprovalCenter.svelte +283 -0
  14. package/dist/components/ApprovalCenter.svelte.d.ts +10 -0
  15. package/dist/components/AuditLogViewer.svelte +3 -1
  16. package/dist/components/AutoForm.svelte +33 -3
  17. package/dist/components/AutoForm.svelte.d.ts +1 -0
  18. package/dist/components/AutoTable.svelte +610 -47
  19. package/dist/components/AutoTable.svelte.d.ts +17 -1
  20. package/dist/components/BoundRecordDetailDrawer.svelte +9 -0
  21. package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +2 -0
  22. package/dist/components/Breadcrumbs.svelte +11 -1
  23. package/dist/components/CancelTaskButton.svelte +12 -42
  24. package/dist/components/ColorPicker.svelte +73 -0
  25. package/dist/components/ColorPicker.svelte.d.ts +15 -0
  26. package/dist/components/ComboboxField.svelte +114 -27
  27. package/dist/components/ComboboxField.svelte.d.ts +1 -0
  28. package/dist/components/DashboardView.svelte +99 -0
  29. package/dist/components/DashboardView.svelte.d.ts +14 -0
  30. package/dist/components/DatePicker.svelte +10 -0
  31. package/dist/components/DatePicker.svelte.d.ts +6 -0
  32. package/dist/components/DateRangeInput.svelte +85 -5
  33. package/dist/components/DateRangeInput.svelte.d.ts +10 -0
  34. package/dist/components/DateRangePicker.svelte +10 -0
  35. package/dist/components/DateRangePicker.svelte.d.ts +6 -0
  36. package/dist/components/DateTimeInput.svelte +74 -5
  37. package/dist/components/DateTimeInput.svelte.d.ts +8 -0
  38. package/dist/components/DateTimePicker.svelte +10 -0
  39. package/dist/components/DateTimePicker.svelte.d.ts +6 -0
  40. package/dist/components/DevTools.svelte +34 -26
  41. package/dist/components/DevframePanel.svelte +123 -0
  42. package/dist/components/DevframePanel.svelte.d.ts +3 -0
  43. package/dist/components/ErrorSummary.svelte +52 -0
  44. package/dist/components/ErrorSummary.svelte.d.ts +14 -0
  45. package/dist/components/FieldRenderer.svelte +82 -81
  46. package/dist/components/FileUpload.svelte +214 -52
  47. package/dist/components/FileUpload.svelte.d.ts +11 -0
  48. package/dist/components/FilterBuilder.svelte +88 -66
  49. package/dist/components/FilterCollectionInput.svelte +80 -0
  50. package/dist/components/FilterCollectionInput.svelte.d.ts +10 -0
  51. package/dist/components/GanttChart.svelte +66 -14
  52. package/dist/components/GanttChart.svelte.d.ts +6 -0
  53. package/dist/components/Header.svelte +18 -2
  54. package/dist/components/ImportWizard.svelte +339 -17
  55. package/dist/components/ImportWizard.svelte.d.ts +11 -0
  56. package/dist/components/JsonSchemaForm.svelte +120 -52
  57. package/dist/components/JsonSchemaForm.svelte.d.ts +7 -1
  58. package/dist/components/KanbanBoard.svelte +195 -40
  59. package/dist/components/KanbanBoard.svelte.d.ts +9 -2
  60. package/dist/components/Layout.svelte +4 -2
  61. package/dist/components/LazyAutoForm.svelte +28 -0
  62. package/dist/components/LazyAutoForm.svelte.d.ts +8 -0
  63. package/dist/components/LazyAutoTable.svelte +28 -0
  64. package/dist/components/LazyAutoTable.svelte.d.ts +8 -0
  65. package/dist/components/LazySettingsPage.svelte +28 -0
  66. package/dist/components/LazySettingsPage.svelte.d.ts +8 -0
  67. package/dist/components/LazyShowPage.svelte +28 -0
  68. package/dist/components/LazyShowPage.svelte.d.ts +8 -0
  69. package/dist/components/ListPage.svelte +5 -1
  70. package/dist/components/ListPage.svelte.d.ts +3 -0
  71. package/dist/components/LoginPage.svelte +1 -1
  72. package/dist/components/MultiTabKeepAlive.svelte +11 -6
  73. package/dist/components/NotificationsSettings.svelte +69 -2
  74. package/dist/components/NotificationsSettings.svelte.d.ts +25 -1
  75. package/dist/components/PermissionMatrix.svelte +20 -1
  76. package/dist/components/PivotExportButton.svelte +157 -0
  77. package/dist/components/PivotExportButton.svelte.d.ts +16 -0
  78. package/dist/components/PivotTable.svelte +229 -74
  79. package/dist/components/PivotTable.svelte.d.ts +19 -2
  80. package/dist/components/RadioGroup.svelte +121 -0
  81. package/dist/components/RadioGroup.svelte.d.ts +43 -0
  82. package/dist/components/RangeSlider.svelte +127 -0
  83. package/dist/components/RangeSlider.svelte.d.ts +22 -0
  84. package/dist/components/Rate.svelte +121 -0
  85. package/dist/components/Rate.svelte.d.ts +16 -0
  86. package/dist/components/RecordDetailDrawer.svelte +4 -2
  87. package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
  88. package/dist/components/RelationPicker.svelte +341 -0
  89. package/dist/components/RelationPicker.svelte.d.ts +26 -0
  90. package/dist/components/ResourceOperationsPage.svelte +18 -18
  91. package/dist/components/ResourceOperationsPage.svelte.d.ts +2 -2
  92. package/dist/components/RetryTaskButton.svelte +12 -42
  93. package/dist/components/SecuritySettings.svelte +29 -5
  94. package/dist/components/SegmentedControl.svelte +145 -0
  95. package/dist/components/SegmentedControl.svelte.d.ts +38 -0
  96. package/dist/components/SettingsPage.svelte +3 -1
  97. package/dist/components/SettingsPage.svelte.d.ts +1 -0
  98. package/dist/components/ShowPage.svelte +18 -3
  99. package/dist/components/ShowPage.svelte.d.ts +3 -0
  100. package/dist/components/Sidebar.svelte +2 -2
  101. package/dist/components/Slider.svelte +100 -0
  102. package/dist/components/Slider.svelte.d.ts +19 -0
  103. package/dist/components/SpreadsheetView.svelte +1213 -95
  104. package/dist/components/SpreadsheetView.svelte.d.ts +19 -0
  105. package/dist/components/TagsInput.svelte +178 -0
  106. package/dist/components/TagsInput.svelte.d.ts +17 -0
  107. package/dist/components/TimePicker.svelte +10 -0
  108. package/dist/components/TimePicker.svelte.d.ts +6 -0
  109. package/dist/components/TreeSelect.svelte +267 -53
  110. package/dist/components/TreeSelect.svelte.d.ts +3 -0
  111. package/dist/components/TreeTable.svelte +484 -82
  112. package/dist/components/TreeTable.svelte.d.ts +24 -1
  113. package/dist/components/TwoFactorAuthPage.svelte +85 -48
  114. package/dist/components/TwoFactorAuthPage.svelte.d.ts +12 -1
  115. package/dist/components/VirtualTable.svelte +116 -20
  116. package/dist/components/VirtualTable.svelte.d.ts +5 -0
  117. package/dist/components/account/CompanyProfilePage.svelte +74 -38
  118. package/dist/components/account/GetStartedPage.svelte +2 -1
  119. package/dist/components/account/ImportMembersPage.svelte +22 -167
  120. package/dist/components/account/ImportMembersPage.svelte.d.ts +4 -1
  121. package/dist/components/account/MemberDirectory.svelte +156 -0
  122. package/dist/components/account/MemberDirectory.svelte.d.ts +19 -0
  123. package/dist/components/account/MembersStarterPage.svelte +9 -55
  124. package/dist/components/account/MembersStarterPage.svelte.d.ts +5 -1
  125. package/dist/components/account/SecurityLogPage.svelte +4 -1
  126. package/dist/components/account/SettingsPlainPage.svelte +7 -38
  127. package/dist/components/account/SettingsPlainPage.svelte.d.ts +4 -1
  128. package/dist/components/account/SettingsSidebarPage.svelte +7 -20
  129. package/dist/components/account/TeamMembersPage.svelte +4 -20
  130. package/dist/components/account/TeamMembersPage.svelte.d.ts +5 -1
  131. package/dist/components/account/UserProfilePage.svelte +3 -25
  132. package/dist/components/account/UserProfilePage.svelte.d.ts +17 -2
  133. package/dist/components/buttons/ExportButton.svelte +56 -12
  134. package/dist/components/buttons/ExportButton.svelte.d.ts +11 -0
  135. package/dist/components/content/ContentPageHeader.svelte +1 -1
  136. package/dist/components/content/ContentPageShell.svelte +1 -1
  137. package/dist/components/content/MetricBlock.svelte +1 -1
  138. package/dist/components/content/PageToolbar.svelte +1 -1
  139. package/dist/components/content/ReferenceNotice.svelte +5 -0
  140. package/dist/components/content/ReferenceNotice.svelte.d.ts +18 -0
  141. package/dist/components/content/SectionHeader.svelte +1 -1
  142. package/dist/components/content/SettingsFieldRow.svelte +1 -1
  143. package/dist/components/content/SettingsGroup.svelte +1 -1
  144. package/dist/components/content/StatusBadge.svelte +1 -1
  145. package/dist/components/content/WorkspaceLayout.svelte +1 -1
  146. package/dist/components/export-reference.d.ts +2 -0
  147. package/dist/components/export-reference.js +9 -0
  148. package/dist/components/fieldComponentMap.js +2 -5
  149. package/dist/components/fields/DateField.svelte +12 -13
  150. package/dist/components/fields/date-display.d.ts +6 -0
  151. package/dist/components/fields/date-display.js +24 -0
  152. package/dist/components/network/TeamCrewTablePage.svelte +6 -1
  153. package/dist/components/network/UserCardsNFTPage.svelte +2 -0
  154. package/dist/components/profile/PublicProfilePage.svelte +2 -0
  155. package/dist/components/saved-list-views.d.ts +74 -1
  156. package/dist/components/saved-list-views.js +191 -3
  157. package/dist/components/table-contract.d.ts +12 -1
  158. package/dist/components/task-action.svelte.d.ts +13 -0
  159. package/dist/components/task-action.svelte.js +73 -0
  160. package/dist/components/ui/DesignSystemShowcase.svelte +164 -0
  161. package/dist/components/ui/DesignSystemShowcase.svelte.d.ts +3 -0
  162. package/dist/components/ui/badge/badge-variants.d.ts +3 -2
  163. package/dist/components/ui/badge/badge-variants.js +2 -3
  164. package/dist/components/ui/badge/badge.svelte +3 -0
  165. package/dist/components/ui/badge/badge.svelte.d.ts +1 -0
  166. package/dist/components/ui/button/button-variants.d.ts +5 -4
  167. package/dist/components/ui/button/button-variants.js +7 -5
  168. package/dist/components/ui/checkbox/checkbox.svelte +5 -1
  169. package/dist/components/ui/checkbox/checkbox.svelte.d.ts +5 -1
  170. package/dist/components/ui/input/input.svelte +7 -2
  171. package/dist/components/ui/input/input.svelte.d.ts +4 -1
  172. package/dist/components/ui/select/select.svelte +4 -1
  173. package/dist/components/ui/select/select.svelte.d.ts +2 -1
  174. package/dist/components/ui/textarea/textarea.svelte +2 -2
  175. package/dist/components.css +33 -2
  176. package/dist/date-input-policy.d.ts +4 -0
  177. package/dist/date-input-policy.js +35 -0
  178. package/dist/design-system-components.d.ts +100 -0
  179. package/dist/design-system-components.js +101 -0
  180. package/dist/design-system.js +1 -1
  181. package/dist/devtools-bridge.d.ts +80 -0
  182. package/dist/devtools-bridge.js +92 -0
  183. package/dist/index.d.ts +37 -2
  184. package/dist/index.js +23 -2
  185. package/dist/recipes.d.ts +960 -4
  186. package/dist/recipes.js +264 -4
  187. package/dist/tree-table-model.d.ts +24 -0
  188. package/dist/tree-table-model.js +111 -0
  189. package/package.json +22 -10
  190. package/dist/styled-system/css/conditions.js +0 -36
  191. package/dist/styled-system/css/css.d.ts +0 -22
  192. package/dist/styled-system/css/css.js +0 -45
  193. package/dist/styled-system/css/cva.d.ts +0 -6
  194. package/dist/styled-system/css/cva.js +0 -87
  195. package/dist/styled-system/css/cx.d.ts +0 -5
  196. package/dist/styled-system/css/cx.js +0 -15
  197. package/dist/styled-system/css/index.d.ts +0 -5
  198. package/dist/styled-system/css/index.js +0 -4
  199. package/dist/styled-system/css/sva.d.ts +0 -4
  200. package/dist/styled-system/css/sva.js +0 -46
  201. package/dist/styled-system/helpers.js +0 -316
  202. package/dist/styled-system/patterns/aspect-ratio.d.ts +0 -20
  203. package/dist/styled-system/patterns/aspect-ratio.js +0 -38
  204. package/dist/styled-system/patterns/bleed.d.ts +0 -21
  205. package/dist/styled-system/patterns/bleed.js +0 -24
  206. package/dist/styled-system/patterns/box.d.ts +0 -20
  207. package/dist/styled-system/patterns/box.js +0 -15
  208. package/dist/styled-system/patterns/center.d.ts +0 -20
  209. package/dist/styled-system/patterns/center.js +0 -21
  210. package/dist/styled-system/patterns/circle.d.ts +0 -20
  211. package/dist/styled-system/patterns/circle.js +0 -25
  212. package/dist/styled-system/patterns/container.d.ts +0 -20
  213. package/dist/styled-system/patterns/container.js +0 -21
  214. package/dist/styled-system/patterns/cq.d.ts +0 -21
  215. package/dist/styled-system/patterns/cq.js +0 -21
  216. package/dist/styled-system/patterns/divider.d.ts +0 -22
  217. package/dist/styled-system/patterns/divider.js +0 -25
  218. package/dist/styled-system/patterns/flex.d.ts +0 -26
  219. package/dist/styled-system/patterns/flex.js +0 -26
  220. package/dist/styled-system/patterns/float.d.ts +0 -23
  221. package/dist/styled-system/patterns/float.js +0 -52
  222. package/dist/styled-system/patterns/grid-item.d.ts +0 -25
  223. package/dist/styled-system/patterns/grid-item.js +0 -25
  224. package/dist/styled-system/patterns/grid.d.ts +0 -24
  225. package/dist/styled-system/patterns/grid.js +0 -27
  226. package/dist/styled-system/patterns/hstack.d.ts +0 -21
  227. package/dist/styled-system/patterns/hstack.js +0 -24
  228. package/dist/styled-system/patterns/index.d.ts +0 -21
  229. package/dist/styled-system/patterns/index.js +0 -20
  230. package/dist/styled-system/patterns/link-overlay.d.ts +0 -20
  231. package/dist/styled-system/patterns/link-overlay.js +0 -24
  232. package/dist/styled-system/patterns/spacer.d.ts +0 -20
  233. package/dist/styled-system/patterns/spacer.js +0 -25
  234. package/dist/styled-system/patterns/square.d.ts +0 -20
  235. package/dist/styled-system/patterns/square.js +0 -24
  236. package/dist/styled-system/patterns/stack.d.ts +0 -23
  237. package/dist/styled-system/patterns/stack.js +0 -24
  238. package/dist/styled-system/patterns/visually-hidden.d.ts +0 -20
  239. package/dist/styled-system/patterns/visually-hidden.js +0 -18
  240. package/dist/styled-system/patterns/vstack.d.ts +0 -21
  241. package/dist/styled-system/patterns/vstack.js +0 -24
  242. package/dist/styled-system/patterns/wrap.d.ts +0 -24
  243. package/dist/styled-system/patterns/wrap.js +0 -25
  244. package/dist/styled-system/recipes/content-header.d.ts +0 -31
  245. package/dist/styled-system/recipes/content-header.js +0 -65
  246. package/dist/styled-system/recipes/content-page.d.ts +0 -34
  247. package/dist/styled-system/recipes/content-page.js +0 -43
  248. package/dist/styled-system/recipes/create-recipe.js +0 -82
  249. package/dist/styled-system/recipes/index.d.ts +0 -17
  250. package/dist/styled-system/recipes/index.js +0 -16
  251. package/dist/styled-system/recipes/metric-block.d.ts +0 -34
  252. package/dist/styled-system/recipes/metric-block.js +0 -76
  253. package/dist/styled-system/recipes/product-list.d.ts +0 -31
  254. package/dist/styled-system/recipes/product-list.js +0 -73
  255. package/dist/styled-system/recipes/product-section.d.ts +0 -31
  256. package/dist/styled-system/recipes/product-section.js +0 -49
  257. package/dist/styled-system/recipes/product-settings-row.d.ts +0 -34
  258. package/dist/styled-system/recipes/product-settings-row.js +0 -58
  259. package/dist/styled-system/recipes/product-settings.d.ts +0 -31
  260. package/dist/styled-system/recipes/product-settings.js +0 -57
  261. package/dist/styled-system/recipes/product-status.d.ts +0 -34
  262. package/dist/styled-system/recipes/product-status.js +0 -45
  263. package/dist/styled-system/recipes/product-toolbar.d.ts +0 -31
  264. package/dist/styled-system/recipes/product-toolbar.js +0 -41
  265. package/dist/styled-system/recipes/product-workspace.d.ts +0 -34
  266. package/dist/styled-system/recipes/product-workspace.js +0 -58
  267. package/dist/styled-system/recipes/surface-metric.d.ts +0 -38
  268. package/dist/styled-system/recipes/surface-metric.js +0 -63
  269. package/dist/styled-system/recipes/surface-table.d.ts +0 -34
  270. package/dist/styled-system/recipes/surface-table.js +0 -62
  271. package/dist/styled-system/recipes/ui-badge.d.ts +0 -31
  272. package/dist/styled-system/recipes/ui-badge.js +0 -38
  273. package/dist/styled-system/recipes/ui-button.d.ts +0 -32
  274. package/dist/styled-system/recipes/ui-button.js +0 -43
  275. package/dist/styled-system/recipes/ui-input.d.ts +0 -31
  276. package/dist/styled-system/recipes/ui-input.js +0 -49
  277. package/dist/styled-system/recipes/ui-textarea.d.ts +0 -31
  278. package/dist/styled-system/recipes/ui-textarea.js +0 -24
  279. package/dist/styled-system/styles.css +0 -1257
  280. package/dist/styled-system/tokens/index.d.ts +0 -9
  281. package/dist/styled-system/tokens/index.js +0 -268
  282. package/dist/styled-system/tokens/tokens.d.ts +0 -36
  283. package/dist/styled-system/types/composition.d.ts +0 -227
  284. package/dist/styled-system/types/conditions.d.ts +0 -236
  285. package/dist/styled-system/types/csstype.d.ts +0 -22570
  286. package/dist/styled-system/types/index.d.ts +0 -6
  287. package/dist/styled-system/types/parts.d.ts +0 -8
  288. package/dist/styled-system/types/pattern.d.ts +0 -78
  289. package/dist/styled-system/types/prop-type.d.ts +0 -223
  290. package/dist/styled-system/types/recipe.d.ts +0 -181
  291. package/dist/styled-system/types/selectors.d.ts +0 -59
  292. package/dist/styled-system/types/static-css.d.ts +0 -56
  293. package/dist/styled-system/types/style-props.d.ts +0 -8088
  294. package/dist/styled-system/types/system-types.d.ts +0 -151
  295. package/dist/styles/recipes.css +0 -1262
@@ -0,0 +1,52 @@
1
+ <script lang="ts">
2
+ import { useTranslation } from '@svadmin/core/i18n';
3
+
4
+ const i18n = useTranslation();
5
+
6
+ export interface FormErrorEntry {
7
+ fieldKey: string;
8
+ label: string;
9
+ message: string;
10
+ }
11
+
12
+ let {
13
+ errors = [],
14
+ title = i18n.t('common.formErrors'),
15
+ id,
16
+ onfocusfield,
17
+ } = $props<{
18
+ errors?: FormErrorEntry[];
19
+ title?: string;
20
+ id?: string;
21
+ onfocusfield?: (fieldKey: string) => void;
22
+ }>();
23
+
24
+ const headingId = $derived(id ? `${id}-title` : undefined);
25
+ </script>
26
+
27
+ {#if errors.length > 0}
28
+ <div
29
+ class="svadmin-u-ee1a5af3aa10"
30
+ role="region"
31
+ aria-labelledby={headingId}
32
+ >
33
+ <h2 id={headingId} class="svadmin-u-2689f3958069">{title}</h2>
34
+ <ul>
35
+ {#each errors as error (error.fieldKey)}
36
+ <li>
37
+ {#if onfocusfield}
38
+ <button
39
+ type="button"
40
+ class="svadmin-u-d4108abe6359"
41
+ onclick={() => onfocusfield?.(error.fieldKey)}
42
+ >
43
+ {error.label}: {error.message}
44
+ </button>
45
+ {:else}
46
+ <span>{error.label}: {error.message}</span>
47
+ {/if}
48
+ </li>
49
+ {/each}
50
+ </ul>
51
+ </div>
52
+ {/if}
@@ -0,0 +1,14 @@
1
+ export interface FormErrorEntry {
2
+ fieldKey: string;
3
+ label: string;
4
+ message: string;
5
+ }
6
+ type $$ComponentProps = {
7
+ errors?: FormErrorEntry[];
8
+ title?: string;
9
+ id?: string;
10
+ onfocusfield?: (fieldKey: string) => void;
11
+ };
12
+ declare const ErrorSummary: import("svelte").Component<$$ComponentProps, {}, "">;
13
+ type ErrorSummary = ReturnType<typeof ErrorSummary>;
14
+ export default ErrorSummary;
@@ -24,6 +24,9 @@
24
24
  import DateTimeInput from './DateTimeInput.svelte';
25
25
  import DateRangeInput, { type DateRangeInputValue } from './DateRangeInput.svelte';
26
26
  import FileUpload from './FileUpload.svelte';
27
+ import ColorPicker from './ColorPicker.svelte';
28
+ import Rate from './Rate.svelte';
29
+ import TagsInput from './TagsInput.svelte';
27
30
  import TreeSelect, { type TreeSelectOption } from './TreeSelect.svelte';
28
31
  import Cascader, { type CascaderOption } from './Cascader.svelte';
29
32
  import Transfer, { type TransferItem } from './Transfer.svelte';
@@ -56,6 +59,11 @@
56
59
  const boolVal = $derived((value as boolean) ?? false);
57
60
  const tagsVal = $derived((value as string[]) ?? []);
58
61
  const multiVal = $derived((value as (string | number)[]) ?? []);
62
+ type FieldOption = NonNullable<FieldDefinition['options']>[number];
63
+ const selectToken = $derived.by(() => {
64
+ const index = field.options?.findIndex((option: FieldOption) => option.value === value) ?? -1;
65
+ return index < 0 ? '' : `option:${index}`;
66
+ });
59
67
  const imagesVal = $derived((value as string[]) ?? []);
60
68
  let jsonEditText = $state('');
61
69
  let jsonEditing = false;
@@ -65,24 +73,20 @@
65
73
  jsonEditText = typeof value === 'string' ? String(value) : JSON.stringify(value, null, 2);
66
74
  });
67
75
 
68
- function handleTagKeydown(e: KeyboardEvent) {
69
- if (e.key === 'Enter') {
70
- e.preventDefault();
71
- const input = e.target as HTMLInputElement;
72
- const tag = input.value.trim();
73
- if (tag) {
74
- onchange([...tagsVal, tag]);
75
- input.value = '';
76
- }
76
+ function changeSelect(event: Event) {
77
+ if (disabled || !(event.currentTarget instanceof HTMLSelectElement)) return;
78
+ const token = event.currentTarget.value;
79
+ if (token === '') {
80
+ onchange(null);
81
+ return;
77
82
  }
83
+ const option = field.options?.find((_option: FieldOption, index: number) => token === `option:${index}`);
84
+ if (option && !option.disabled) onchange(option.value);
78
85
  }
79
86
 
80
- function removeTag(index: number) {
81
- onchange(tagsVal.filter((_: string, i: number) => i !== index));
82
- }
83
-
84
- // Multiselect toggle
87
+ // 禁用值保留回显,但不能从复选框或标签删除入口修改。
85
88
  function toggleMulti(optValue: string | number) {
89
+ if (disabled || field.options?.find((option: FieldOption) => option.value === optValue)?.disabled) return;
86
90
  if (multiVal.includes(optValue)) {
87
91
  onchange(multiVal.filter((v: string | number) => v !== optValue));
88
92
  } else {
@@ -186,33 +190,17 @@
186
190
  />
187
191
 
188
192
  {:else if field.type === 'color'}
189
- <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-1004c0c3954c">
190
- <input
191
- id={field.key}
192
- name={field.key}
193
- type="color"
194
- value={strVal || '#000000'}
195
- oninput={(e) => onchange((e.target as HTMLInputElement).value)}
196
- class="svadmin-u-426b8b75185b svadmin-u-7e74e5fe798a svadmin-u-34516836730d svadmin-u-421ac2be5045 svadmin-u-ca6bcd4b6f3f svadmin-u-e5795dad4d22 svadmin-u-e6f9e383a762 svadmin-u-eb6a3cef9686"
197
- disabled={disabled}
198
- aria-invalid={invalid || undefined}
199
- aria-describedby={errorId}
200
- />
201
- <Input
202
- type="text"
203
- value={strVal}
204
- oninput={(e) => onchange((e.target as HTMLInputElement).value)}
205
- placeholder="#000000"
206
- class="svadmin-u-1d274d2422d8 svadmin-u-0e65706bcccd svadmin-u-fc7473ca09eb"
207
- {disabled}
208
- />
209
- {#if strVal}
210
- <span
211
- class="svadmin-u-ed8a5df7b2fb svadmin-u-2bbcfc3b5179 svadmin-u-ac204c108886 svadmin-u-ca6bcd4b6f3f svadmin-u-18049387f0af svadmin-u-438b2237b8d6"
212
- style="background-color: {strVal}"
213
- ></span>
214
- {/if}
215
- </div>
193
+ <ColorPicker
194
+ id={field.key}
195
+ name={field.key}
196
+ value={strVal}
197
+ onchange={onchange}
198
+ required={field.required}
199
+ invalid={invalid}
200
+ describedby={errorId}
201
+ ariaLabel={field.label}
202
+ {disabled}
203
+ />
216
204
 
217
205
  {:else if field.type === 'number'}
218
206
  <NumberInput
@@ -361,14 +349,14 @@
361
349
  />
362
350
 
363
351
  {:else if field.type === 'select'}
352
+ <input type="hidden" name={field.key} value={value == null ? '' : String(value)} {disabled} />
364
353
  {#if (field.options?.length ?? 0) > 8}
365
354
  <select
366
355
  id={field.key}
367
- name={field.key}
368
356
  data-slot="select"
369
357
  class="svadmin-u-60fbb7713999 svadmin-u-426b8b75185b svadmin-u-6da6a3c3f741 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-421ac2be5045 svadmin-u-ca6bcd4b6f3f svadmin-u-e5795dad4d22 svadmin-u-e6f9e383a762 svadmin-u-0e17f2bd9074 svadmin-u-03b4dd7f172b svadmin-u-fc7473ca09eb svadmin-u-582e6ef4b245 svadmin-u-9c24ab70af61 svadmin-u-55d048ebfb1c svadmin-u-608dd26cd5ba svadmin-u-80b9d0ae125f svadmin-u-6b22a22a9752 svadmin-u-5f533b3a7de7 svadmin-u-b29d8adbad2e"
370
- value={strVal}
371
- onchange={(e) => onchange((e.target as HTMLSelectElement).value)}
358
+ value={selectToken}
359
+ onchange={changeSelect}
372
360
  required={field.required}
373
361
  aria-invalid={invalid || undefined}
374
362
  aria-describedby={errorId}
@@ -376,30 +364,29 @@
376
364
  >
377
365
  <option value="">{i18n.t('field.selectPlaceholder')}</option>
378
366
  {#each field.options ?? [] as opt, _i (_i)}
379
- <option value={opt.value}>{opt.label}</option>
367
+ <option value={`option:${_i}`} disabled={opt.disabled}>{opt.label}</option>
380
368
  {/each}
381
369
  </select>
382
370
  {:else}
383
371
  <Select
384
372
  id={field.key}
385
- name={field.key}
386
- value={strVal}
387
- onchange={(e) => onchange((e.target as HTMLSelectElement).value)}
373
+ value={selectToken}
374
+ onchange={changeSelect}
388
375
  required={field.required}
389
376
  aria-invalid={invalid || undefined}
390
377
  aria-describedby={errorId}
391
378
  {disabled}
392
- placeholder={i18n.t('field.selectPlaceholder')}
393
379
  >
380
+ <option value="">{i18n.t('field.selectPlaceholder')}</option>
394
381
  {#each field.options ?? [] as opt, _i (_i)}
395
- <option value={opt.value}>{opt.label}</option>
382
+ <option value={`option:${_i}`} disabled={opt.disabled}>{opt.label}</option>
396
383
  {/each}
397
384
  </Select>
398
385
  {/if}
399
386
 
400
387
  {:else if field.type === 'multiselect'}
401
388
  {#each multiVal as selectedValue, selectedIndex (`${selectedValue}-${selectedIndex}`)}
402
- <input type="hidden" name={`${field.key}[]`} value={String(selectedValue)} />
389
+ <input type="hidden" name={`${field.key}[]`} value={String(selectedValue)} {disabled} />
403
390
  {/each}
404
391
  <div
405
392
  class="svadmin-u-6f7e013d6499 svadmin-u-5f22e64f2282 svadmin-u-ca6bcd4b6f3f svadmin-u-e5795dad4d22 svadmin-u-eb6e8b881acd svadmin-u-558f64349245 svadmin-u-92bf82f493b1"
@@ -411,12 +398,12 @@
411
398
  {#each field.options ?? [] as opt, _i (_i)}
412
399
  <label class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-77a2a20e90d4 svadmin-u-fc7473ca09eb svadmin-u-34516836730d svadmin-u-39f703dbe296 svadmin-u-07389a777c1f svadmin-u-d8e0e382c67b svadmin-u-465609a240a8 svadmin-u-ceb69a6b0e5f">
413
400
  <Checkbox
414
- id={`${field.key}-${opt.value}`}
401
+ id={`${field.key}-option-${_i}`}
415
402
  checked={multiVal.includes(opt.value)}
416
403
  onCheckedChange={() => toggleMulti(opt.value)}
417
404
  aria-invalid={invalid || undefined}
418
405
  aria-describedby={errorId}
419
- disabled={disabled}
406
+ disabled={disabled || opt.disabled}
420
407
  />
421
408
  {opt.label}
422
409
  </label>
@@ -431,7 +418,7 @@
431
418
  {@const label = field.options?.find((o: { label: string; value: string | number }) => o.value === v)?.label ?? String(v)}
432
419
  <Badge variant="secondary" class="svadmin-u-44ee8ba0a421">
433
420
  {label}
434
- <button type="button" onclick={() => toggleMulti(v)} class="svadmin-u-b45ce4b65d53 svadmin-u-36d4469299aa svadmin-u-51e95020d6f2 svadmin-u-8db899b4e072 svadmin-u-ceb69a6b0e5f" aria-label={i18n.t('common.clear')}>×</button>
421
+ <button type="button" disabled={disabled || field.options?.find((option: FieldOption) => option.value === v)?.disabled} onclick={() => toggleMulti(v)} class="svadmin-u-b45ce4b65d53 svadmin-u-36d4469299aa svadmin-u-51e95020d6f2 svadmin-u-8db899b4e072 svadmin-u-ceb69a6b0e5f" aria-label={i18n.t('common.clear')}>×</button>
435
422
  </Badge>
436
423
  {/each}
437
424
  </div>
@@ -452,39 +439,30 @@
452
439
  </div>
453
440
 
454
441
  {:else if field.type === 'tags'}
455
- {#each tagsVal as tag, tagIndex (`${tag}-${tagIndex}`)}
456
- <input type="hidden" name={`${field.key}[]`} value={tag} />
457
- {/each}
458
- <div class="svadmin-u-6f7e013d6499">
459
- <div class="svadmin-u-60fbb7713999 svadmin-u-1eb5c6df38c1 svadmin-u-58284b4ea568">
460
- {#each tagsVal as tag, i (i)}
461
- <Badge variant="secondary" class="svadmin-u-44ee8ba0a421">
462
- {tag}
463
- <button
464
- type="button"
465
- onclick={() => removeTag(i)}
466
- class="svadmin-u-b45ce4b65d53 svadmin-u-36d4469299aa svadmin-u-51e95020d6f2 svadmin-u-8db899b4e072 svadmin-u-ceb69a6b0e5f"
467
- aria-label={i18n.t('common.clear')}
468
- >×</button>
469
- </Badge>
470
- {/each}
471
- </div>
472
- <Input
473
- id={field.key}
474
- type="text"
475
- placeholder={i18n.t('field.tagsPlaceholder')}
476
- onkeydown={handleTagKeydown}
477
- aria-invalid={invalid || undefined}
478
- aria-describedby={errorId}
479
- {disabled}
480
- />
481
- </div>
442
+ <TagsInput
443
+ name={`${field.key}[]`}
444
+ value={tagsVal}
445
+ onchange={onchange}
446
+ placeholder={i18n.t('field.tagsPlaceholder')}
447
+ required={field.required}
448
+ invalid={invalid}
449
+ describedby={errorId}
450
+ ariaLabel={field.label}
451
+ {disabled}
452
+ />
482
453
 
483
454
  {:else if field.type === 'date' || field.type === 'time' || field.type === 'datetime'}
484
455
  <DateTimeInput
485
456
  id={field.key}
486
457
  name={field.key}
487
458
  mode={field.type}
459
+ min={field.dateInput?.min}
460
+ max={field.dateInput?.max}
461
+ step={field.dateInput?.step}
462
+ disabledDate={field.dateInput?.disabledDate}
463
+ valueMode={field.dateInput?.valueMode}
464
+ timeZone={field.dateInput?.timeZone}
465
+ disambiguation={field.dateInput?.disambiguation}
488
466
  value={strVal || null}
489
467
  onchange={(next) => onchange(next)}
490
468
  required={field.required}
@@ -496,7 +474,18 @@
496
474
  {:else if field.type === 'daterange'}
497
475
  <DateRangeInput
498
476
  startId={`${field.key}-start`}
477
+ mode={field.dateInput?.rangeMode ?? 'date'}
478
+ valueMode={field.dateInput?.valueMode}
479
+ timeZone={field.dateInput?.timeZone}
480
+ disambiguation={field.dateInput?.disambiguation}
481
+ min={field.dateInput?.min}
482
+ max={field.dateInput?.max}
483
+ step={field.dateInput?.step}
484
+ disabledDate={field.dateInput?.disabledDate}
485
+ presets={field.dateInput?.presets}
499
486
  endId={`${field.key}-end`}
487
+ startAriaLabel={`${field.label} ${i18n.t('common.startDate')}`}
488
+ endAriaLabel={`${field.label} ${i18n.t('common.endDate')}`}
500
489
  startName={`${field.key}.start`}
501
490
  endName={`${field.key}.end`}
502
491
  value={value as DateRangeInputValue | null}
@@ -507,6 +496,18 @@
507
496
  {disabled}
508
497
  />
509
498
 
499
+ {:else if field.type === 'rate' || field.type === 'rating'}
500
+ <Rate
501
+ name={field.key}
502
+ value={numVal ?? 0}
503
+ onchange={onchange}
504
+ required={field.required}
505
+ invalid={invalid}
506
+ describedby={errorId}
507
+ ariaLabel={field.label}
508
+ {disabled}
509
+ />
510
+
510
511
  {:else if field.type === 'file'}
511
512
  <FileUpload
512
513
  id={field.key}