@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,80 @@
1
+ <script lang="ts">
2
+ import { Plus, X } from '@lucide/svelte';
3
+ import { FILTER_COLLECTION_LIMIT, isNumericFilterField, type FieldDefinition } from '@svadmin/core';
4
+ import { useTranslation } from '@svadmin/core/i18n';
5
+ import { Button } from './ui/button/index.js';
6
+ import { Input } from './ui/input/index.js';
7
+ import { Select } from './ui/select/index.js';
8
+
9
+ let { field, value, range = false, onchange }: {
10
+ field: FieldDefinition; value: unknown; range?: boolean; onchange: (value: unknown[]) => void;
11
+ } = $props();
12
+ const i18n = useTranslation();
13
+ const values = $derived<unknown[]>(Array.isArray(value) ? value : range ? [null, null] : [null]);
14
+
15
+ function update(index: number, next: unknown) {
16
+ onchange(values.map((item, position) => position === index ? next : item));
17
+ }
18
+ </script>
19
+
20
+ <div class="filter-collection">
21
+ {#each values as item, index (index)}
22
+ {@const label = range
23
+ ? i18n.t(index === 0 ? 'filter.rangeStart' : 'filter.rangeEnd')
24
+ : i18n.t('filter.collectionItem', { number: String(index + 1) })}
25
+ <div class="filter-collection-item">
26
+ {#if field.type === 'select'}
27
+ <Select aria-label={label} value={String(field.options?.findIndex(option => option.value === item) ?? -1)}
28
+ onchange={(event: Event) => {
29
+ if (!(event.currentTarget instanceof HTMLSelectElement)) return;
30
+ const option = field.options?.[Number(event.currentTarget.value)];
31
+ if (option && !option.disabled) update(index, option.value);
32
+ }}>
33
+ <option value="-1" disabled>{i18n.t('common.selectOption')}</option>
34
+ {#each field.options ?? [] as option, position (position)}
35
+ <option value={String(position)} disabled={option.disabled}>{option.label}</option>
36
+ {/each}
37
+ </Select>
38
+ {:else if field.type === 'boolean'}
39
+ <Select aria-label={label} value={typeof item === 'boolean' ? String(item) : ''}
40
+ onchange={(event: Event) => {
41
+ if (!(event.currentTarget instanceof HTMLSelectElement)) return;
42
+ update(index, event.currentTarget.value === 'true' ? true : event.currentTarget.value === 'false' ? false : null);
43
+ }}>
44
+ <option value="" disabled>{i18n.t('common.selectOption')}</option>
45
+ <option value="true">{i18n.t('common.yes')}</option>
46
+ <option value="false">{i18n.t('common.no')}</option>
47
+ </Select>
48
+ {:else if isNumericFilterField(field)}
49
+ <Input type="number" step="any" aria-label={label} value={typeof item === 'number' ? item : undefined}
50
+ oninput={(event: Event) => {
51
+ if (event.currentTarget instanceof HTMLInputElement) update(index, event.currentTarget.value === '' ? null : event.currentTarget.valueAsNumber);
52
+ }} />
53
+ {:else}
54
+ <Input type="text" aria-label={label} value={typeof item === 'string' ? item : ''}
55
+ oninput={(event: Event) => {
56
+ if (event.currentTarget instanceof HTMLInputElement) update(index, event.currentTarget.value);
57
+ }} />
58
+ {/if}
59
+ {#if !range}
60
+ <Button type="button" variant="ghost" size="icon-sm" aria-label={i18n.t('filter.removeValue')}
61
+ title={i18n.t('filter.removeValue')} disabled={values.length <= 1}
62
+ onclick={() => onchange(values.filter((_, position) => position !== index))}>
63
+ <X size={16} />
64
+ </Button>
65
+ {/if}
66
+ </div>
67
+ {/each}
68
+ {#if !range}
69
+ <Button type="button" variant="ghost" size="icon-sm" aria-label={i18n.t('filter.addValue')}
70
+ title={i18n.t('filter.addValue')} disabled={values.length >= FILTER_COLLECTION_LIMIT}
71
+ onclick={() => onchange([...values, null])}>
72
+ <Plus size={16} />
73
+ </Button>
74
+ {/if}
75
+ </div>
76
+
77
+ <style>
78
+ .filter-collection { display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; }
79
+ .filter-collection-item { display: flex; gap: 4px; align-items: center; width: 180px; max-width: 100%; }
80
+ </style>
@@ -0,0 +1,10 @@
1
+ import { type FieldDefinition } from '@svadmin/core';
2
+ type $$ComponentProps = {
3
+ field: FieldDefinition;
4
+ value: unknown;
5
+ range?: boolean;
6
+ onchange: (value: unknown[]) => void;
7
+ };
8
+ declare const FilterCollectionInput: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type FilterCollectionInput = ReturnType<typeof FilterCollectionInput>;
10
+ export default FilterCollectionInput;
@@ -1,6 +1,10 @@
1
1
  <script lang="ts">
2
2
  import { Badge } from './ui/badge/index.js';
3
3
  import { cn } from '../utils.js';
4
+ import { useTranslation } from '@svadmin/core/i18n';
5
+ import { GANTT_LIMITS, validateGantt } from '@svadmin/core/gantt';
6
+ import { Diamond, RotateCw } from '@lucide/svelte';
7
+ import { Button } from './ui/button/index.js';
4
8
 
5
9
  export interface GanttTask {
6
10
  id: string;
@@ -11,6 +15,8 @@
11
15
  category?: string;
12
16
  assignee?: string;
13
17
  status?: 'planned' | 'in_progress' | 'completed' | 'delayed';
18
+ dependencies?: string[];
19
+ milestone?: boolean;
14
20
  }
15
21
 
16
22
  interface Props {
@@ -18,6 +24,10 @@
18
24
  totalDays?: number;
19
25
  dayLabelPrefix?: string;
20
26
  onselecttask?: (task: GanttTask) => void;
27
+ loading?: boolean;
28
+ error?: string | undefined;
29
+ onRetry?: () => void;
30
+ ariaLabel?: string;
21
31
  class?: string;
22
32
  }
23
33
 
@@ -26,12 +36,32 @@
26
36
  totalDays = 14,
27
37
  dayLabelPrefix = 'D',
28
38
  onselecttask,
39
+ loading = false,
40
+ error,
41
+ onRetry,
42
+ ariaLabel,
29
43
  class: className = '',
30
44
  }: Props = $props();
31
45
 
32
46
  const days = $derived(
33
- Array.from({ length: totalDays }, (_, i) => `${dayLabelPrefix}${i + 1}`)
47
+ Array.from({ length: Number.isSafeInteger(totalDays) && totalDays > 0 && totalDays <= GANTT_LIMITS.days ? totalDays : 0 }, (_, i) => `${dayLabelPrefix}${i + 1}`)
34
48
  );
49
+ const i18n = useTranslation();
50
+ const validationError = $derived(validateGantt(loading || error ? [] : tasks, totalDays));
51
+ const displayError = $derived(error || (validationError ? i18n.t(`gantt.${validationError}`) : ''));
52
+ const available = $derived(!loading && !displayError);
53
+ function taskLabel(task: GanttTask): string {
54
+ const range = task.milestone ? i18n.t('gantt.milestone', { day: task.startDay + 1 })
55
+ : i18n.t('gantt.range', { start: task.startDay + 1, end: task.startDay + task.durationDays });
56
+ const progress = task.progress === undefined ? '' : `, ${i18n.t('gantt.progress', { progress: task.progress })}`;
57
+ const dependencies = task.dependencies?.length
58
+ ? `, ${i18n.t('gantt.dependsOn', { tasks: task.dependencies.join(', ') })}` : '';
59
+ return `${task.title}, ${range}, ${i18n.t(`gantt.${task.status ?? 'planned'}`)}${progress}${dependencies}`;
60
+ }
61
+
62
+ function selectTask(task: GanttTask): void {
63
+ if (available) onselecttask?.(task);
64
+ }
35
65
 
36
66
  function getStatusBadgeVariant(status?: string) {
37
67
  switch (status) {
@@ -58,18 +88,28 @@
58
88
  }
59
89
  </script>
60
90
 
61
- <div class={cn('svadmin-u-a217b4eaa918 svadmin-u-ca6bcd4b6f3f svadmin-u-18049387f0af svadmin-u-cd0ad9a56558 svadmin-u-8e63407b5ceb svadmin-u-cef5b893cf23 svadmin-u-359090c2d529 svadmin-u-6ed543e2fbbb', className)}>
91
+ <div role="region" aria-label={ariaLabel ?? i18n.t('gantt.title')} aria-busy={loading} class={cn('svadmin-u-a217b4eaa918 svadmin-u-ca6bcd4b6f3f svadmin-u-18049387f0af svadmin-u-cd0ad9a56558 svadmin-u-8e63407b5ceb svadmin-u-cef5b893cf23 svadmin-u-359090c2d529 svadmin-u-6ed543e2fbbb', className)}>
62
92
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-f4cc511ff0c1 svadmin-u-65fdbade2025 svadmin-u-05faf5c801ff">
63
93
  <div class="svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">
64
- Project Gantt Schedule <span class="svadmin-u-bfa603190748 svadmin-u-8ecebc9f80e6">({tasks.length} tasks / {totalDays} days)</span>
94
+ {i18n.t('gantt.title')} <span class="svadmin-u-bfa603190748 svadmin-u-8ecebc9f80e6">({i18n.t('gantt.summary', { tasks: tasks.length, days: totalDays })})</span>
65
95
  </div>
66
96
  </div>
67
97
 
68
- <div class="svadmin-u-1384f66f41d0 svadmin-u-5f22e64f2282 svadmin-u-ca6bcd4b6f3f svadmin-u-05faf5c801ff">
98
+ {#if loading}
99
+ <div role="status">{i18n.t('common.loading')}</div>
100
+ {:else if displayError}
101
+ <div role="alert">{displayError}</div>
102
+ {#if error && onRetry}
103
+ <Button type="button" variant="ghost" size="sm" onclick={onRetry}><RotateCw aria-hidden="true" />{i18n.t('common.retry')}</Button>
104
+ {/if}
105
+ {:else if tasks.length === 0}
106
+ <div role="status">{i18n.t('gantt.noData')}</div>
107
+ {:else}
108
+ <div class="svadmin-u-1384f66f41d0 svadmin-u-5f22e64f2282 svadmin-u-ca6bcd4b6f3f svadmin-u-05faf5c801ff" style="overflow-x: auto;">
69
109
  <div class="svadmin-u-c05fcc7c4caa">
70
110
  <!-- Timeline Header -->
71
111
  <div class="svadmin-u-60fbb7713999 svadmin-u-65fdbade2025 svadmin-u-05faf5c801ff svadmin-u-b00f43c30c2b svadmin-u-e83a7042bc91 svadmin-u-bfa603190748">
72
- <div class="svadmin-u-d16aae848835 svadmin-u-9fe52d5d506c svadmin-u-5ceb636bd9f3 svadmin-u-05faf5c801ff svadmin-u-2eba0d65d059 svadmin-u-012fbd121f37">Task Name</div>
112
+ <div class="svadmin-u-d16aae848835 svadmin-u-9fe52d5d506c svadmin-u-5ceb636bd9f3 svadmin-u-05faf5c801ff svadmin-u-2eba0d65d059 svadmin-u-012fbd121f37">{i18n.t('gantt.task')}</div>
73
113
  <div class="svadmin-u-36e579c0b41c svadmin-u-60fbb7713999">
74
114
  {#each days as day (day)}
75
115
  <div class="svadmin-u-36e579c0b41c svadmin-u-7660b450905a svadmin-u-ca6bf63030aa svadmin-u-5ceb636bd9f3 svadmin-u-6ee2d41e2d2d svadmin-u-d058ca6de60f svadmin-u-0e65706bcccd svadmin-u-bb5b5fc23bd9">
@@ -84,19 +124,27 @@
84
124
  {#each tasks as task (task.id)}
85
125
  {@const leftPct = (task.startDay / totalDays) * 100}
86
126
  {@const widthPct = (task.durationDays / totalDays) * 100}
127
+ <!-- 只有配置选择回调时才同时启用按钮角色和键盘焦点。 -->
128
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
87
129
  <div
88
- role="button"
89
- tabindex="0"
130
+ role={onselecttask ? 'button' : 'group'}
131
+ tabindex={onselecttask ? 0 : undefined}
132
+ aria-label={taskLabel(task)}
90
133
  class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-c4b5eaba40e3 svadmin-u-ceb69a6b0e5f svadmin-u-34516836730d"
91
- onclick={() => onselecttask?.(task)}
92
- onkeydown={(e) => { if (e.key === 'Enter') onselecttask?.(task); }}
134
+ onclick={() => selectTask(task)}
135
+ onkeydown={(e) => {
136
+ if (onselecttask && (e.key === 'Enter' || e.key === ' ') && !e.repeat && !e.isComposing) {
137
+ e.preventDefault();
138
+ selectTask(task);
139
+ }
140
+ }}
93
141
  >
94
142
  <!-- Task Info Column -->
95
143
  <div class="svadmin-u-d16aae848835 svadmin-u-9fe52d5d506c svadmin-u-5ceb636bd9f3 svadmin-u-05faf5c801ff svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-77a2a20e90d4 svadmin-u-012fbd121f37">
96
144
  <div class="svadmin-u-f283ea9bea0e svadmin-u-2689f3958069 svadmin-u-d4108abe6359">{task.title}</div>
97
145
  {#if task.status}
98
146
  <Badge variant="outline" class={cn('svadmin-u-e09880869d1f svadmin-u-d8e0e382c67b svadmin-u-68ecb30dbec6 uppercase', getStatusBadgeVariant(task.status))}>
99
- {task.status}
147
+ {i18n.t(`gantt.${task.status}`)}
100
148
  </Badge>
101
149
  {/if}
102
150
  </div>
@@ -111,12 +159,17 @@
111
159
  </div>
112
160
 
113
161
  <!-- Bar element -->
162
+ {#if task.milestone}
163
+ <span data-gantt-milestone style={`position: absolute; left: ${leftPct}%; width: 16px; height: 16px;`}>
164
+ <Diamond aria-hidden="true" size={16} />
165
+ </span>
166
+ {:else}
114
167
  <div
115
168
  class={cn(
116
169
  'svadmin-u-d89972fe17d6 svadmin-u-f6fe902450dc svadmin-u-421ac2be5045 svadmin-u-cef5b893cf23 svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-d5eab218aa34 svadmin-u-1dc571a3609f svadmin-u-2689f3958069 svadmin-u-2cd02d11d1af svadmin-u-0fe7d7d814d0 group svadmin-u-7703298183eb',
117
170
  getBarColor(task.status)
118
171
  )}
119
- style={`margin-left: ${leftPct}%; width: ${Math.max(widthPct, 4)}%;`}
172
+ style={`margin-left: ${leftPct}%; width: ${widthPct}%; flex-shrink: 0;`}
120
173
  >
121
174
  <!-- Inner progress fill -->
122
175
  {#if task.progress !== undefined}
@@ -131,14 +184,13 @@
131
184
  <span class="svadmin-u-d89972fe17d6 svadmin-u-236812d64c82 svadmin-u-e09880869d1f svadmin-u-4f5874c554b6 svadmin-u-0e65706bcccd">{task.progress}%</span>
132
185
  {/if}
133
186
  </div>
187
+ {/if}
134
188
  </div>
135
189
  </div>
136
190
  {/each}
137
191
 
138
- {#if tasks.length === 0}
139
- <div class="svadmin-u-a1f611f027dd svadmin-u-ca6bf63030aa svadmin-u-bfa603190748">No schedule tasks available</div>
140
- {/if}
141
192
  </div>
142
193
  </div>
143
194
  </div>
195
+ {/if}
144
196
  </div>
@@ -7,12 +7,18 @@ export interface GanttTask {
7
7
  category?: string;
8
8
  assignee?: string;
9
9
  status?: 'planned' | 'in_progress' | 'completed' | 'delayed';
10
+ dependencies?: string[];
11
+ milestone?: boolean;
10
12
  }
11
13
  interface Props {
12
14
  tasks: GanttTask[];
13
15
  totalDays?: number;
14
16
  dayLabelPrefix?: string;
15
17
  onselecttask?: (task: GanttTask) => void;
18
+ loading?: boolean;
19
+ error?: string | undefined;
20
+ onRetry?: () => void;
21
+ ariaLabel?: string;
16
22
  class?: string;
17
23
  }
18
24
  declare const GanttChart: import("svelte").Component<Props, {}, "">;
@@ -39,7 +39,7 @@
39
39
  const CustomNotificationPanel = registry?.NotificationPanel;
40
40
  </script>
41
41
 
42
- <header class="svadmin-u-3e0fd166d494 svadmin-u-2167406b24d7 svadmin-u-0f2fff0ae96e svadmin-u-60fbb7713999 svadmin-u-07017cde3e97 svadmin-u-6da6a3c3f741 svadmin-u-012fbd121f37 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-65fdbade2025 svadmin-u-6ee2d41e2d2d svadmin-u-16d6f96aa157 svadmin-u-1ca6dd1e47c4 svadmin-u-f0faeb26d656 svadmin-u-8a3831239aa5">
42
+ <header data-svadmin-topbar class="svadmin-u-3e0fd166d494 svadmin-u-2167406b24d7 svadmin-u-0f2fff0ae96e svadmin-u-60fbb7713999 svadmin-u-07017cde3e97 svadmin-u-6da6a3c3f741 svadmin-u-012fbd121f37 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-65fdbade2025 svadmin-u-6ee2d41e2d2d svadmin-u-16d6f96aa157 svadmin-u-1ca6dd1e47c4 svadmin-u-f0faeb26d656 svadmin-u-8a3831239aa5">
43
43
  <div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-0c3bc98565dd">
44
44
  {#if children}
45
45
  {@render children()}
@@ -68,7 +68,7 @@
68
68
  {/if}
69
69
 
70
70
  {#if showSearch && onSearchClick}
71
- <Button variant="outline" size="sm" onclick={onSearchClick} class="svadmin-u-77a2a20e90d4 svadmin-u-bfa603190748 svadmin-u-e7a768f922d2 svadmin-u-0e17f2bd9074 svadmin-u-5f22e64f2282 svadmin-u-05faf5c801ff">
71
+ <Button variant="outline" size="sm" onclick={onSearchClick} aria-label={i18n.t('common.search')} class="svadmin-header-search svadmin-u-77a2a20e90d4 svadmin-u-bfa603190748 svadmin-u-e7a768f922d2 svadmin-u-0e17f2bd9074 svadmin-u-5f22e64f2282 svadmin-u-05faf5c801ff">
72
72
  <Search class="svadmin-u-7fc7f732bf7e svadmin-u-bf600f8e029c" />
73
73
  <span class="svadmin-u-99d72c7fc3e2 svadmin-u-ee3c1259a368 svadmin-u-359090c2d529">{i18n.t('common.search')}</span>
74
74
  <kbd class="svadmin-u-99d72c7fc3e2 svadmin-u-e3fd07f96126 svadmin-u-3960ffc248d9 svadmin-u-a3899220f90e svadmin-u-07389a777c1f svadmin-u-ca6bcd4b6f3f svadmin-u-706701550477 svadmin-u-45d828117213 svadmin-u-465609a240a8 svadmin-u-1dc571a3609f svadmin-u-2689f3958069 svadmin-u-0e65706bcccd svadmin-u-bfa603190748">
@@ -96,3 +96,19 @@
96
96
  {/if}
97
97
  </div>
98
98
  </header>
99
+
100
+ <style>
101
+ header[data-svadmin-topbar] {
102
+ height: auto;
103
+ min-height: 4.375rem;
104
+ padding-block: 0.75rem;
105
+ }
106
+
107
+ header[data-svadmin-topbar] > div:first-child {
108
+ min-width: 0;
109
+ }
110
+
111
+ header[data-svadmin-topbar] :global(.svadmin-breadcrumbs--spaced) {
112
+ margin-bottom: 0;
113
+ }
114
+ </style>