@svadmin/ui 0.73.0 → 0.75.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.
- package/README.md +53 -28
- package/dist/app.css +3733 -4119
- package/dist/app.theme.css +3733 -4119
- package/dist/component-registry.d.ts +14977 -0
- package/dist/component-registry.js +216 -0
- package/dist/components/AboutSettings.svelte +7 -1
- package/dist/components/AboutSettings.svelte.d.ts +4 -1
- package/dist/components/ActivityFeed.svelte +9 -3
- package/dist/components/ActivityFeed.svelte.d.ts +3 -0
- package/dist/components/AdminApp.svelte +24 -15
- package/dist/components/AdminApp.svelte.d.ts +6 -0
- package/dist/components/ApiSettings.svelte +41 -5
- package/dist/components/ApprovalCenter.svelte +283 -0
- package/dist/components/ApprovalCenter.svelte.d.ts +10 -0
- package/dist/components/AuditLogViewer.svelte +3 -1
- package/dist/components/AutoForm.svelte +33 -3
- package/dist/components/AutoForm.svelte.d.ts +1 -0
- package/dist/components/AutoTable.svelte +610 -47
- package/dist/components/AutoTable.svelte.d.ts +17 -1
- package/dist/components/BoundRecordDetailDrawer.svelte +9 -0
- package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +2 -0
- package/dist/components/Breadcrumbs.svelte +11 -1
- package/dist/components/CancelTaskButton.svelte +12 -42
- package/dist/components/ColorPicker.svelte +73 -0
- package/dist/components/ColorPicker.svelte.d.ts +15 -0
- package/dist/components/ComboboxField.svelte +114 -27
- package/dist/components/ComboboxField.svelte.d.ts +1 -0
- package/dist/components/DashboardView.svelte +99 -0
- package/dist/components/DashboardView.svelte.d.ts +14 -0
- package/dist/components/DatePicker.svelte +10 -0
- package/dist/components/DatePicker.svelte.d.ts +6 -0
- package/dist/components/DateRangeInput.svelte +85 -5
- package/dist/components/DateRangeInput.svelte.d.ts +10 -0
- package/dist/components/DateRangePicker.svelte +10 -0
- package/dist/components/DateRangePicker.svelte.d.ts +6 -0
- package/dist/components/DateTimeInput.svelte +85 -16
- package/dist/components/DateTimeInput.svelte.d.ts +19 -11
- package/dist/components/DateTimePicker.svelte +10 -0
- package/dist/components/DateTimePicker.svelte.d.ts +6 -0
- package/dist/components/DevTools.svelte +34 -26
- package/dist/components/DevframePanel.svelte +123 -0
- package/dist/components/DevframePanel.svelte.d.ts +3 -0
- package/dist/components/ErrorSummary.svelte +52 -0
- package/dist/components/ErrorSummary.svelte.d.ts +14 -0
- package/dist/components/FieldRenderer.svelte +82 -81
- package/dist/components/FileUpload.svelte +214 -52
- package/dist/components/FileUpload.svelte.d.ts +11 -0
- package/dist/components/FilterBuilder.svelte +88 -66
- package/dist/components/FilterCollectionInput.svelte +80 -0
- package/dist/components/FilterCollectionInput.svelte.d.ts +10 -0
- package/dist/components/GanttChart.svelte +66 -14
- package/dist/components/GanttChart.svelte.d.ts +6 -0
- package/dist/components/Header.svelte +18 -2
- package/dist/components/ImportWizard.svelte +339 -17
- package/dist/components/ImportWizard.svelte.d.ts +11 -0
- package/dist/components/JsonSchemaForm.svelte +120 -52
- package/dist/components/JsonSchemaForm.svelte.d.ts +7 -1
- package/dist/components/KanbanBoard.svelte +195 -40
- package/dist/components/KanbanBoard.svelte.d.ts +9 -2
- package/dist/components/Layout.svelte +4 -2
- package/dist/components/LazyAutoForm.svelte +28 -0
- package/dist/components/LazyAutoForm.svelte.d.ts +8 -0
- package/dist/components/LazyAutoTable.svelte +28 -0
- package/dist/components/LazyAutoTable.svelte.d.ts +8 -0
- package/dist/components/LazyPage.svelte +3 -3
- package/dist/components/LazyPage.svelte.d.ts +2 -2
- package/dist/components/LazySettingsPage.svelte +28 -0
- package/dist/components/LazySettingsPage.svelte.d.ts +8 -0
- package/dist/components/LazyShowPage.svelte +28 -0
- package/dist/components/LazyShowPage.svelte.d.ts +8 -0
- package/dist/components/ListPage.svelte +5 -1
- package/dist/components/ListPage.svelte.d.ts +3 -0
- package/dist/components/LoginPage.svelte +1 -1
- package/dist/components/MultiTabKeepAlive.svelte +11 -6
- package/dist/components/NotificationsSettings.svelte +69 -2
- package/dist/components/NotificationsSettings.svelte.d.ts +25 -1
- package/dist/components/PasswordInput.svelte +3 -3
- package/dist/components/PasswordInput.svelte.d.ts +2 -1
- package/dist/components/PermissionMatrix.svelte +20 -1
- package/dist/components/PivotExportButton.svelte +157 -0
- package/dist/components/PivotExportButton.svelte.d.ts +16 -0
- package/dist/components/PivotTable.svelte +229 -74
- package/dist/components/PivotTable.svelte.d.ts +19 -2
- package/dist/components/RadioGroup.svelte +121 -0
- package/dist/components/RadioGroup.svelte.d.ts +43 -0
- package/dist/components/RangeSlider.svelte +127 -0
- package/dist/components/RangeSlider.svelte.d.ts +22 -0
- package/dist/components/Rate.svelte +121 -0
- package/dist/components/Rate.svelte.d.ts +16 -0
- package/dist/components/RecordDetailDrawer.svelte +4 -2
- package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
- package/dist/components/RelationPicker.svelte +341 -0
- package/dist/components/RelationPicker.svelte.d.ts +26 -0
- package/dist/components/ResourceOperationsPage.svelte +23 -19
- package/dist/components/ResourceOperationsPage.svelte.d.ts +2 -2
- package/dist/components/RetryTaskButton.svelte +12 -42
- package/dist/components/SecuritySettings.svelte +29 -5
- package/dist/components/SegmentedControl.svelte +145 -0
- package/dist/components/SegmentedControl.svelte.d.ts +38 -0
- package/dist/components/SettingsPage.svelte +3 -1
- package/dist/components/SettingsPage.svelte.d.ts +1 -0
- package/dist/components/ShowPage.svelte +18 -3
- package/dist/components/ShowPage.svelte.d.ts +3 -0
- package/dist/components/Sidebar.svelte +2 -2
- package/dist/components/Slider.svelte +100 -0
- package/dist/components/Slider.svelte.d.ts +19 -0
- package/dist/components/SpreadsheetView.svelte +1213 -95
- package/dist/components/SpreadsheetView.svelte.d.ts +19 -0
- package/dist/components/TagsInput.svelte +178 -0
- package/dist/components/TagsInput.svelte.d.ts +17 -0
- package/dist/components/TimePicker.svelte +10 -0
- package/dist/components/TimePicker.svelte.d.ts +6 -0
- package/dist/components/TooltipButton.svelte +3 -4
- package/dist/components/TreeSelect.svelte +267 -53
- package/dist/components/TreeSelect.svelte.d.ts +3 -0
- package/dist/components/TreeTable.svelte +484 -82
- package/dist/components/TreeTable.svelte.d.ts +24 -1
- package/dist/components/TwoFactorAuthPage.svelte +85 -48
- package/dist/components/TwoFactorAuthPage.svelte.d.ts +12 -1
- package/dist/components/VirtualTable.svelte +116 -20
- package/dist/components/VirtualTable.svelte.d.ts +5 -0
- package/dist/components/account/CompanyProfilePage.svelte +74 -38
- package/dist/components/account/GetStartedPage.svelte +2 -1
- package/dist/components/account/ImportMembersPage.svelte +22 -167
- package/dist/components/account/ImportMembersPage.svelte.d.ts +4 -1
- package/dist/components/account/MemberDirectory.svelte +156 -0
- package/dist/components/account/MemberDirectory.svelte.d.ts +19 -0
- package/dist/components/account/MembersStarterPage.svelte +9 -55
- package/dist/components/account/MembersStarterPage.svelte.d.ts +5 -1
- package/dist/components/account/SecurityLogPage.svelte +4 -1
- package/dist/components/account/SettingsPlainPage.svelte +7 -38
- package/dist/components/account/SettingsPlainPage.svelte.d.ts +4 -1
- package/dist/components/account/SettingsSidebarPage.svelte +7 -20
- package/dist/components/account/TeamMembersPage.svelte +4 -20
- package/dist/components/account/TeamMembersPage.svelte.d.ts +5 -1
- package/dist/components/account/UserProfilePage.svelte +3 -25
- package/dist/components/account/UserProfilePage.svelte.d.ts +17 -2
- package/dist/components/buttons/ExportButton.svelte +56 -12
- package/dist/components/buttons/ExportButton.svelte.d.ts +11 -0
- package/dist/components/content/ContentPageHeader.svelte +1 -1
- package/dist/components/content/ContentPageShell.svelte +1 -1
- package/dist/components/content/MetricBlock.svelte +1 -1
- package/dist/components/content/PageToolbar.svelte +1 -1
- package/dist/components/content/ReferenceNotice.svelte +5 -0
- package/dist/components/content/ReferenceNotice.svelte.d.ts +18 -0
- package/dist/components/content/SectionHeader.svelte +1 -1
- package/dist/components/content/SettingsFieldRow.svelte +1 -1
- package/dist/components/content/SettingsGroup.svelte +1 -1
- package/dist/components/content/StatusBadge.svelte +1 -1
- package/dist/components/content/WorkspaceLayout.svelte +1 -1
- package/dist/components/export-reference.d.ts +2 -0
- package/dist/components/export-reference.js +9 -0
- package/dist/components/fieldComponentMap.js +2 -5
- package/dist/components/fields/DateField.svelte +12 -13
- package/dist/components/fields/MarkdownField.svelte +14 -5
- package/dist/components/fields/date-display.d.ts +6 -0
- package/dist/components/fields/date-display.js +24 -0
- package/dist/components/network/TeamCrewTablePage.svelte +6 -1
- package/dist/components/network/UserCardsNFTPage.svelte +2 -0
- package/dist/components/profile/PublicProfilePage.svelte +2 -0
- package/dist/components/saved-list-views.d.ts +74 -1
- package/dist/components/saved-list-views.js +191 -3
- package/dist/components/table-contract.d.ts +12 -1
- package/dist/components/task-action.svelte.d.ts +13 -0
- package/dist/components/task-action.svelte.js +73 -0
- package/dist/components/ui/DesignSystemShowcase.svelte +164 -0
- package/dist/components/ui/DesignSystemShowcase.svelte.d.ts +3 -0
- package/dist/components/ui/badge/badge-variants.d.ts +3 -2
- package/dist/components/ui/badge/badge-variants.js +2 -3
- package/dist/components/ui/badge/badge.svelte +3 -0
- package/dist/components/ui/badge/badge.svelte.d.ts +1 -0
- package/dist/components/ui/button/button-variants.d.ts +5 -4
- package/dist/components/ui/button/button-variants.js +7 -5
- package/dist/components/ui/checkbox/checkbox.svelte +5 -1
- package/dist/components/ui/checkbox/checkbox.svelte.d.ts +5 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +1 -2
- package/dist/components/ui/input/input.svelte +7 -2
- package/dist/components/ui/input/input.svelte.d.ts +4 -1
- package/dist/components/ui/select/select.svelte +4 -1
- package/dist/components/ui/select/select.svelte.d.ts +2 -1
- package/dist/components/ui/textarea/textarea.svelte +2 -2
- package/dist/components.css +33 -2
- package/dist/date-input-policy.d.ts +4 -0
- package/dist/date-input-policy.js +35 -0
- package/dist/design-system-components.d.ts +100 -0
- package/dist/design-system-components.js +101 -0
- package/dist/design-system.js +1 -1
- package/dist/devtools-bridge.d.ts +80 -0
- package/dist/devtools-bridge.js +92 -0
- package/dist/editor-config.svelte.d.ts +4 -2
- package/dist/index.d.ts +37 -2
- package/dist/index.js +23 -2
- package/dist/recipes.d.ts +960 -4
- package/dist/recipes.js +264 -4
- package/dist/tree-table-model.d.ts +24 -0
- package/dist/tree-table-model.js +111 -0
- package/dist/types.d.ts +4 -4
- package/package.json +22 -10
- package/dist/styled-system/css/conditions.js +0 -36
- package/dist/styled-system/css/css.d.ts +0 -22
- package/dist/styled-system/css/css.js +0 -45
- package/dist/styled-system/css/cva.d.ts +0 -6
- package/dist/styled-system/css/cva.js +0 -87
- package/dist/styled-system/css/cx.d.ts +0 -5
- package/dist/styled-system/css/cx.js +0 -15
- package/dist/styled-system/css/index.d.ts +0 -5
- package/dist/styled-system/css/index.js +0 -4
- package/dist/styled-system/css/sva.d.ts +0 -4
- package/dist/styled-system/css/sva.js +0 -46
- package/dist/styled-system/helpers.js +0 -316
- package/dist/styled-system/patterns/aspect-ratio.d.ts +0 -20
- package/dist/styled-system/patterns/aspect-ratio.js +0 -38
- package/dist/styled-system/patterns/bleed.d.ts +0 -21
- package/dist/styled-system/patterns/bleed.js +0 -24
- package/dist/styled-system/patterns/box.d.ts +0 -20
- package/dist/styled-system/patterns/box.js +0 -15
- package/dist/styled-system/patterns/center.d.ts +0 -20
- package/dist/styled-system/patterns/center.js +0 -21
- package/dist/styled-system/patterns/circle.d.ts +0 -20
- package/dist/styled-system/patterns/circle.js +0 -25
- package/dist/styled-system/patterns/container.d.ts +0 -20
- package/dist/styled-system/patterns/container.js +0 -21
- package/dist/styled-system/patterns/cq.d.ts +0 -21
- package/dist/styled-system/patterns/cq.js +0 -21
- package/dist/styled-system/patterns/divider.d.ts +0 -22
- package/dist/styled-system/patterns/divider.js +0 -25
- package/dist/styled-system/patterns/flex.d.ts +0 -26
- package/dist/styled-system/patterns/flex.js +0 -26
- package/dist/styled-system/patterns/float.d.ts +0 -23
- package/dist/styled-system/patterns/float.js +0 -52
- package/dist/styled-system/patterns/grid-item.d.ts +0 -25
- package/dist/styled-system/patterns/grid-item.js +0 -25
- package/dist/styled-system/patterns/grid.d.ts +0 -24
- package/dist/styled-system/patterns/grid.js +0 -27
- package/dist/styled-system/patterns/hstack.d.ts +0 -21
- package/dist/styled-system/patterns/hstack.js +0 -24
- package/dist/styled-system/patterns/index.d.ts +0 -21
- package/dist/styled-system/patterns/index.js +0 -20
- package/dist/styled-system/patterns/link-overlay.d.ts +0 -20
- package/dist/styled-system/patterns/link-overlay.js +0 -24
- package/dist/styled-system/patterns/spacer.d.ts +0 -20
- package/dist/styled-system/patterns/spacer.js +0 -25
- package/dist/styled-system/patterns/square.d.ts +0 -20
- package/dist/styled-system/patterns/square.js +0 -24
- package/dist/styled-system/patterns/stack.d.ts +0 -23
- package/dist/styled-system/patterns/stack.js +0 -24
- package/dist/styled-system/patterns/visually-hidden.d.ts +0 -20
- package/dist/styled-system/patterns/visually-hidden.js +0 -18
- package/dist/styled-system/patterns/vstack.d.ts +0 -21
- package/dist/styled-system/patterns/vstack.js +0 -24
- package/dist/styled-system/patterns/wrap.d.ts +0 -24
- package/dist/styled-system/patterns/wrap.js +0 -25
- package/dist/styled-system/recipes/content-header.d.ts +0 -31
- package/dist/styled-system/recipes/content-header.js +0 -65
- package/dist/styled-system/recipes/content-page.d.ts +0 -34
- package/dist/styled-system/recipes/content-page.js +0 -43
- package/dist/styled-system/recipes/create-recipe.js +0 -82
- package/dist/styled-system/recipes/index.d.ts +0 -17
- package/dist/styled-system/recipes/index.js +0 -16
- package/dist/styled-system/recipes/metric-block.d.ts +0 -34
- package/dist/styled-system/recipes/metric-block.js +0 -76
- package/dist/styled-system/recipes/product-list.d.ts +0 -31
- package/dist/styled-system/recipes/product-list.js +0 -73
- package/dist/styled-system/recipes/product-section.d.ts +0 -31
- package/dist/styled-system/recipes/product-section.js +0 -49
- package/dist/styled-system/recipes/product-settings-row.d.ts +0 -34
- package/dist/styled-system/recipes/product-settings-row.js +0 -58
- package/dist/styled-system/recipes/product-settings.d.ts +0 -31
- package/dist/styled-system/recipes/product-settings.js +0 -57
- package/dist/styled-system/recipes/product-status.d.ts +0 -34
- package/dist/styled-system/recipes/product-status.js +0 -45
- package/dist/styled-system/recipes/product-toolbar.d.ts +0 -31
- package/dist/styled-system/recipes/product-toolbar.js +0 -41
- package/dist/styled-system/recipes/product-workspace.d.ts +0 -34
- package/dist/styled-system/recipes/product-workspace.js +0 -58
- package/dist/styled-system/recipes/surface-metric.d.ts +0 -38
- package/dist/styled-system/recipes/surface-metric.js +0 -63
- package/dist/styled-system/recipes/surface-table.d.ts +0 -34
- package/dist/styled-system/recipes/surface-table.js +0 -62
- package/dist/styled-system/recipes/ui-badge.d.ts +0 -31
- package/dist/styled-system/recipes/ui-badge.js +0 -38
- package/dist/styled-system/recipes/ui-button.d.ts +0 -32
- package/dist/styled-system/recipes/ui-button.js +0 -43
- package/dist/styled-system/recipes/ui-input.d.ts +0 -31
- package/dist/styled-system/recipes/ui-input.js +0 -49
- package/dist/styled-system/recipes/ui-textarea.d.ts +0 -31
- package/dist/styled-system/recipes/ui-textarea.js +0 -24
- package/dist/styled-system/styles.css +0 -1257
- package/dist/styled-system/tokens/index.d.ts +0 -9
- package/dist/styled-system/tokens/index.js +0 -268
- package/dist/styled-system/tokens/tokens.d.ts +0 -36
- package/dist/styled-system/types/composition.d.ts +0 -227
- package/dist/styled-system/types/conditions.d.ts +0 -236
- package/dist/styled-system/types/csstype.d.ts +0 -22570
- package/dist/styled-system/types/index.d.ts +0 -6
- package/dist/styled-system/types/parts.d.ts +0 -8
- package/dist/styled-system/types/pattern.d.ts +0 -78
- package/dist/styled-system/types/prop-type.d.ts +0 -223
- package/dist/styled-system/types/recipe.d.ts +0 -181
- package/dist/styled-system/types/selectors.d.ts +0 -59
- package/dist/styled-system/types/static-css.d.ts +0 -56
- package/dist/styled-system/types/style-props.d.ts +0 -8088
- package/dist/styled-system/types/system-types.d.ts +0 -151
|
@@ -14,13 +14,86 @@ export interface SavedListView {
|
|
|
14
14
|
id: string;
|
|
15
15
|
name: string;
|
|
16
16
|
state: SavedListViewState;
|
|
17
|
+
version?: number;
|
|
18
|
+
source?: 'local' | 'team' | 'system';
|
|
19
|
+
readOnly?: boolean;
|
|
20
|
+
default?: boolean;
|
|
21
|
+
access?: SavedListViewAccess;
|
|
22
|
+
}
|
|
23
|
+
export type SavedListViewAccessMode = 'team' | 'organization' | 'restricted';
|
|
24
|
+
export interface SavedListViewAccess {
|
|
25
|
+
mode: SavedListViewAccessMode;
|
|
26
|
+
subjectIds: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface SavedListViewSubject {
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
description?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface SavedListViewMutation {
|
|
34
|
+
id: string;
|
|
35
|
+
name: string;
|
|
36
|
+
state: SavedListViewState;
|
|
37
|
+
/** null 仅允许创建;更新必须提供读取到的版本。 */
|
|
38
|
+
expectedVersion: number | null;
|
|
39
|
+
source: 'team' | 'system';
|
|
40
|
+
}
|
|
41
|
+
export interface SavedListViewMutationSuccess {
|
|
42
|
+
ok: true;
|
|
43
|
+
view: SavedListView;
|
|
44
|
+
version: number;
|
|
45
|
+
}
|
|
46
|
+
export interface SavedListViewMutationConflict {
|
|
47
|
+
ok: false;
|
|
48
|
+
code: 'VERSION_CONFLICT';
|
|
49
|
+
current: SavedListView;
|
|
50
|
+
version: number;
|
|
51
|
+
}
|
|
52
|
+
export interface SavedListViewRemoveSuccess {
|
|
53
|
+
ok: true;
|
|
54
|
+
id: string;
|
|
55
|
+
version: number;
|
|
56
|
+
}
|
|
57
|
+
export interface SavedListViewProvider {
|
|
58
|
+
list: (scope: ListPreferenceScope) => Promise<unknown>;
|
|
59
|
+
/** 可选的成员目录查询;授权仍由宿主服务端负责。 */
|
|
60
|
+
listAccessSubjects?: (scope: ListPreferenceScope, input: {
|
|
61
|
+
query?: string;
|
|
62
|
+
limit?: number;
|
|
63
|
+
}) => Promise<unknown>;
|
|
64
|
+
save?: (scope: ListPreferenceScope, mutation: SavedListViewMutation) => Promise<unknown>;
|
|
65
|
+
remove?: (scope: ListPreferenceScope, input: {
|
|
66
|
+
id: string;
|
|
67
|
+
expectedVersion: number;
|
|
68
|
+
}) => Promise<unknown>;
|
|
69
|
+
setDefault?: (scope: ListPreferenceScope, input: {
|
|
70
|
+
id: string;
|
|
71
|
+
source: 'team' | 'system';
|
|
72
|
+
expectedVersion: number;
|
|
73
|
+
default: boolean;
|
|
74
|
+
}) => Promise<unknown>;
|
|
75
|
+
updateAccess?: (scope: ListPreferenceScope, input: {
|
|
76
|
+
id: string;
|
|
77
|
+
source: 'team' | 'system';
|
|
78
|
+
expectedVersion: number;
|
|
79
|
+
access: SavedListViewAccess;
|
|
80
|
+
}) => Promise<unknown>;
|
|
17
81
|
}
|
|
18
82
|
export interface ListPreferenceScope {
|
|
19
83
|
resourceName: string;
|
|
20
84
|
providerName: string;
|
|
21
85
|
tenantIdentity?: string | number;
|
|
86
|
+
identityKey?: string;
|
|
22
87
|
}
|
|
23
|
-
export declare function
|
|
88
|
+
export declare function decodeSavedListViewAccess(value: unknown): SavedListViewAccess | undefined;
|
|
89
|
+
export declare function decodeSavedListViewSubjects(value: unknown): SavedListViewSubject[] | undefined;
|
|
90
|
+
export declare function readSavedListViews(raw: string | null, allowedColumnIds: Set<string>, source?: SavedListView['source']): SavedListView[];
|
|
91
|
+
export declare function decodeSavedListViewMutationResult(value: unknown, allowedColumnIds: Set<string>, expected?: Pick<SavedListViewMutation, 'id' | 'source' | 'expectedVersion'>): SavedListViewMutationSuccess | SavedListViewMutationConflict | undefined;
|
|
92
|
+
export declare function decodeSavedListViewRemoveResult(value: unknown, expected: {
|
|
93
|
+
id: string;
|
|
94
|
+
expectedVersion: number;
|
|
95
|
+
}): SavedListViewRemoveSuccess | undefined;
|
|
96
|
+
export declare function decodeRemoteSavedListViews(value: unknown, allowedColumnIds: Set<string>, writable?: boolean): SavedListView[];
|
|
24
97
|
export declare function serializeSavedListViews(views: SavedListView[]): string;
|
|
25
98
|
export declare function cloneSavedListViewState(state: SavedListViewState): SavedListViewState;
|
|
26
99
|
export declare function listPreferenceScopeId(scope: ListPreferenceScope): string;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { snapshotPlainData } from '@svadmin/core/schema';
|
|
1
2
|
const STORAGE_VERSION = 1;
|
|
2
3
|
const MAX_SAVED_VIEWS = 25;
|
|
3
4
|
const MAX_FILTER_NODES = 200;
|
|
@@ -91,7 +92,63 @@ function parseState(value, allowedColumnIds) {
|
|
|
91
92
|
columnOrder,
|
|
92
93
|
};
|
|
93
94
|
}
|
|
94
|
-
|
|
95
|
+
function parseAccess(value) {
|
|
96
|
+
if (!isRecord(value) || Object.keys(value).some(key => key !== 'mode' && key !== 'subjectIds'))
|
|
97
|
+
return;
|
|
98
|
+
const mode = value['mode'];
|
|
99
|
+
const ids = value['subjectIds'];
|
|
100
|
+
if ((mode !== 'team' && mode !== 'organization' && mode !== 'restricted')
|
|
101
|
+
|| !Array.isArray(ids) || ids.length > 200)
|
|
102
|
+
return;
|
|
103
|
+
const subjectIds = [];
|
|
104
|
+
for (const id of ids) {
|
|
105
|
+
if (typeof id !== 'string' || !id.trim() || id !== id.trim() || id.length > 200
|
|
106
|
+
|| subjectIds.includes(id))
|
|
107
|
+
return;
|
|
108
|
+
subjectIds.push(id);
|
|
109
|
+
}
|
|
110
|
+
if ((mode === 'restricted') !== (subjectIds.length > 0))
|
|
111
|
+
return;
|
|
112
|
+
return { mode, subjectIds };
|
|
113
|
+
}
|
|
114
|
+
export function decodeSavedListViewAccess(value) {
|
|
115
|
+
try {
|
|
116
|
+
return parseAccess(snapshotPlainData(value));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export function decodeSavedListViewSubjects(value) {
|
|
123
|
+
try {
|
|
124
|
+
const snapshot = snapshotPlainData(value);
|
|
125
|
+
if (!Array.isArray(snapshot) || snapshot.length > 200)
|
|
126
|
+
return;
|
|
127
|
+
const seen = new Set();
|
|
128
|
+
const subjects = [];
|
|
129
|
+
for (const entry of snapshot) {
|
|
130
|
+
if (!isRecord(entry)
|
|
131
|
+
|| Object.keys(entry).some(key => !['id', 'label', 'description'].includes(key))
|
|
132
|
+
|| typeof entry['id'] !== 'string' || !entry['id'].trim() || entry['id'] !== entry['id'].trim()
|
|
133
|
+
|| entry['id'].length > 200 || seen.has(entry['id'])
|
|
134
|
+
|| typeof entry['label'] !== 'string' || !entry['label'].trim() || entry['label'].length > 200
|
|
135
|
+
|| (entry['description'] !== undefined
|
|
136
|
+
&& (typeof entry['description'] !== 'string' || entry['description'].length > 500)))
|
|
137
|
+
return;
|
|
138
|
+
seen.add(entry['id']);
|
|
139
|
+
subjects.push({
|
|
140
|
+
id: entry['id'],
|
|
141
|
+
label: entry['label'].trim(),
|
|
142
|
+
...(entry['description'] === undefined ? {} : { description: entry['description'] }),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return subjects;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export function readSavedListViews(raw, allowedColumnIds, source = 'local') {
|
|
95
152
|
if (!raw)
|
|
96
153
|
return [];
|
|
97
154
|
try {
|
|
@@ -110,8 +167,20 @@ export function readSavedListViews(raw, allowedColumnIds) {
|
|
|
110
167
|
const state = parseState(entry['state'], allowedColumnIds);
|
|
111
168
|
if (!state)
|
|
112
169
|
continue;
|
|
170
|
+
const access = entry['access'] === undefined ? undefined : parseAccess(entry['access']);
|
|
171
|
+
if (entry['access'] !== undefined && !access)
|
|
172
|
+
continue;
|
|
113
173
|
seenIds.add(entry['id']);
|
|
114
|
-
views.push({
|
|
174
|
+
views.push({
|
|
175
|
+
id: entry['id'], name: entry['name'].trim(), state,
|
|
176
|
+
...(isPositiveInteger(entry['version'], Number.MAX_SAFE_INTEGER) ? { version: entry['version'] } : {}),
|
|
177
|
+
...(source !== 'local' ? {
|
|
178
|
+
source: entry['source'] === 'system' ? 'system' : 'team',
|
|
179
|
+
readOnly: true,
|
|
180
|
+
...(entry['default'] === true ? { default: true } : {}),
|
|
181
|
+
...(access === undefined ? {} : { access }),
|
|
182
|
+
} : {}),
|
|
183
|
+
});
|
|
115
184
|
}
|
|
116
185
|
return views;
|
|
117
186
|
}
|
|
@@ -121,6 +190,124 @@ export function readSavedListViews(raw, allowedColumnIds) {
|
|
|
121
190
|
throw error;
|
|
122
191
|
}
|
|
123
192
|
}
|
|
193
|
+
export function decodeSavedListViewMutationResult(value, allowedColumnIds, expected) {
|
|
194
|
+
try {
|
|
195
|
+
if (expected && (!expected.id.trim()
|
|
196
|
+
|| !['team', 'system'].includes(expected.source)
|
|
197
|
+
|| (expected.expectedVersion !== null
|
|
198
|
+
&& !isPositiveInteger(expected.expectedVersion, Number.MAX_SAFE_INTEGER))))
|
|
199
|
+
return;
|
|
200
|
+
const snapshot = snapshotPlainData(value);
|
|
201
|
+
if (!isRecord(snapshot) || typeof snapshot['ok'] !== 'boolean')
|
|
202
|
+
return;
|
|
203
|
+
const keys = snapshot['ok'] ? ['ok', 'version', 'view'] : ['ok', 'code', 'version', 'current'];
|
|
204
|
+
if (Object.keys(snapshot).some(key => !keys.includes(key)))
|
|
205
|
+
return;
|
|
206
|
+
const parseReceiptView = (candidate, version) => {
|
|
207
|
+
if (!isRecord(candidate)
|
|
208
|
+
|| Object.keys(candidate).some(key => !['id', 'name', 'state', 'version', 'source', 'readOnly', 'default', 'access'].includes(key))
|
|
209
|
+
|| candidate['version'] !== version
|
|
210
|
+
|| (candidate['readOnly'] !== undefined && typeof candidate['readOnly'] !== 'boolean')
|
|
211
|
+
|| (candidate['default'] !== undefined && typeof candidate['default'] !== 'boolean')
|
|
212
|
+
|| (candidate['source'] !== undefined && candidate['source'] !== 'team' && candidate['source'] !== 'system'))
|
|
213
|
+
return;
|
|
214
|
+
const access = candidate['access'] === undefined ? undefined : parseAccess(candidate['access']);
|
|
215
|
+
if (candidate['access'] !== undefined && !access)
|
|
216
|
+
return;
|
|
217
|
+
const state = candidate['state'];
|
|
218
|
+
if (!isRecord(state) || Object.keys(state).some(key => !['search', 'filters', 'sorters', 'pagination', 'columnVisibility', 'columnOrder'].includes(key)))
|
|
219
|
+
return;
|
|
220
|
+
if (!isRecord(state['pagination']) || Object.keys(state['pagination']).some(key => !['current', 'pageSize'].includes(key)))
|
|
221
|
+
return;
|
|
222
|
+
if (!isRecord(state['columnVisibility']) || Object.entries(state['columnVisibility'])
|
|
223
|
+
.some(([key, visible]) => !allowedColumnIds.has(key) || typeof visible !== 'boolean'))
|
|
224
|
+
return;
|
|
225
|
+
if (!Array.isArray(state['columnOrder']) || state['columnOrder'].some(key => typeof key !== 'string' || !allowedColumnIds.has(key))
|
|
226
|
+
|| new Set(state['columnOrder']).size !== state['columnOrder'].length)
|
|
227
|
+
return;
|
|
228
|
+
if (!Array.isArray(state['sorters']) || state['sorters'].some(sorter => !isRecord(sorter) || Object.keys(sorter).some(key => !['field', 'order'].includes(key))))
|
|
229
|
+
return;
|
|
230
|
+
const exactFilter = (filter, depth = 0) => {
|
|
231
|
+
if (!isRecord(filter) || depth > 20)
|
|
232
|
+
return false;
|
|
233
|
+
if ('field' in filter)
|
|
234
|
+
return Object.keys(filter).every(key => ['field', 'operator', 'value'].includes(key));
|
|
235
|
+
return Object.keys(filter).every(key => ['operator', 'value'].includes(key))
|
|
236
|
+
&& Array.isArray(filter['value']) && filter['value'].every(child => exactFilter(child, depth + 1));
|
|
237
|
+
};
|
|
238
|
+
if (!Array.isArray(state['filters']) || !state['filters'].every(filter => exactFilter(filter)))
|
|
239
|
+
return;
|
|
240
|
+
const views = readSavedListViews(JSON.stringify({ version: STORAGE_VERSION, views: [candidate] }), allowedColumnIds);
|
|
241
|
+
const view = views[0];
|
|
242
|
+
if (!view || view.name !== candidate['name'])
|
|
243
|
+
return;
|
|
244
|
+
if (expected && (view.id !== expected.id || candidate['source'] !== expected.source))
|
|
245
|
+
return;
|
|
246
|
+
return {
|
|
247
|
+
...view,
|
|
248
|
+
...(candidate['source'] === undefined ? {} : { source: candidate['source'] }),
|
|
249
|
+
...(candidate['readOnly'] === undefined ? {} : { readOnly: candidate['readOnly'] }),
|
|
250
|
+
...(candidate['default'] === undefined ? {} : { default: candidate['default'] }),
|
|
251
|
+
...(access === undefined ? {} : { access }),
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
if (snapshot['ok'] === true) {
|
|
255
|
+
if (!isPositiveInteger(snapshot['version'], Number.MAX_SAFE_INTEGER))
|
|
256
|
+
return;
|
|
257
|
+
if (expected?.expectedVersion !== undefined && expected.expectedVersion !== null
|
|
258
|
+
&& snapshot['version'] <= expected.expectedVersion)
|
|
259
|
+
return;
|
|
260
|
+
const view = parseReceiptView(snapshot['view'], snapshot['version']);
|
|
261
|
+
if (!view)
|
|
262
|
+
return;
|
|
263
|
+
return { ok: true, view, version: snapshot['version'] };
|
|
264
|
+
}
|
|
265
|
+
if (snapshot['code'] !== 'VERSION_CONFLICT' || !isPositiveInteger(snapshot['version'], Number.MAX_SAFE_INTEGER))
|
|
266
|
+
return;
|
|
267
|
+
const current = parseReceiptView(snapshot['current'], snapshot['version']);
|
|
268
|
+
if (!current)
|
|
269
|
+
return;
|
|
270
|
+
return { ok: false, code: 'VERSION_CONFLICT', current, version: snapshot['version'] };
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
export function decodeSavedListViewRemoveResult(value, expected) {
|
|
277
|
+
try {
|
|
278
|
+
const snapshot = snapshotPlainData(value);
|
|
279
|
+
if (!isRecord(snapshot) || snapshot['ok'] !== true
|
|
280
|
+
|| Object.keys(snapshot).some(key => !['ok', 'id', 'version'].includes(key))
|
|
281
|
+
|| snapshot['id'] !== expected.id
|
|
282
|
+
|| !isPositiveInteger(expected.expectedVersion, Number.MAX_SAFE_INTEGER)
|
|
283
|
+
|| !isPositiveInteger(snapshot['version'], Number.MAX_SAFE_INTEGER)
|
|
284
|
+
|| snapshot['version'] <= expected.expectedVersion)
|
|
285
|
+
return;
|
|
286
|
+
return { ok: true, id: expected.id, version: snapshot['version'] };
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
export function decodeRemoteSavedListViews(value, allowedColumnIds, writable = false) {
|
|
293
|
+
try {
|
|
294
|
+
const snapshot = snapshotPlainData(value);
|
|
295
|
+
if (!Array.isArray(snapshot))
|
|
296
|
+
return [];
|
|
297
|
+
return readSavedListViews(JSON.stringify({ version: STORAGE_VERSION, views: snapshot }), allowedColumnIds, 'team')
|
|
298
|
+
.map(view => {
|
|
299
|
+
const entry = snapshot.find(entry => isRecord(entry) && entry['id'] === view.id);
|
|
300
|
+
return {
|
|
301
|
+
...view,
|
|
302
|
+
readOnly: !writable || !view.version || !isRecord(entry) || entry['readOnly'] !== false,
|
|
303
|
+
...(isRecord(entry) && entry['default'] === true ? { default: true } : {}),
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
return [];
|
|
309
|
+
}
|
|
310
|
+
}
|
|
124
311
|
export function serializeSavedListViews(views) {
|
|
125
312
|
return JSON.stringify({ version: STORAGE_VERSION, views: views.slice(0, MAX_SAVED_VIEWS) });
|
|
126
313
|
}
|
|
@@ -137,10 +324,11 @@ export function listPreferenceScopeId(scope) {
|
|
|
137
324
|
`r:${encodeURIComponent(scope.resourceName)}`,
|
|
138
325
|
`p:${encodeURIComponent(scope.providerName)}`,
|
|
139
326
|
`t:${encodeScopeValue(scope.tenantIdentity)}`,
|
|
327
|
+
...(scope.identityKey === undefined ? [] : [`u:${encodeScopeValue(scope.identityKey)}`]),
|
|
140
328
|
].join('|');
|
|
141
329
|
}
|
|
142
330
|
export function canMigrateLegacyListPreferences(scope) {
|
|
143
|
-
return scope.providerName === 'default' && scope.tenantIdentity === undefined;
|
|
331
|
+
return scope.providerName === 'default' && scope.tenantIdentity === undefined && scope.identityKey === undefined;
|
|
144
332
|
}
|
|
145
333
|
export function savedListViewsStorageKey(scope) {
|
|
146
334
|
return `svadmin-list-views-v2-${listPreferenceScopeId(scope)}`;
|
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
import type { BaseRecord } from '@svadmin/core';
|
|
1
|
+
import type { BaseRecord, Filter, Sort } from '@svadmin/core';
|
|
2
2
|
export type TableRecord = BaseRecord & {
|
|
3
3
|
id: string | number;
|
|
4
4
|
};
|
|
5
|
+
export type BatchSelection = {
|
|
6
|
+
scope: 'selected';
|
|
7
|
+
ids: (string | number)[];
|
|
8
|
+
currentPageIds: (string | number)[];
|
|
9
|
+
} | {
|
|
10
|
+
scope: 'all';
|
|
11
|
+
filters: Filter[];
|
|
12
|
+
sorters: Sort[];
|
|
13
|
+
total: number;
|
|
14
|
+
excludedIds: (string | number)[];
|
|
15
|
+
};
|
|
5
16
|
/** The list hook validates business fields; this adapter proves table identity and detaches UI reads. */
|
|
6
17
|
export declare function copyTableRecord(value: unknown): TableRecord;
|
|
7
18
|
export declare function tableRowKey(id: string | number): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TaskProvider } from '@svadmin/core';
|
|
2
|
+
export declare function createTaskAction(options: {
|
|
3
|
+
action: 'cancel' | 'retry';
|
|
4
|
+
taskId: string;
|
|
5
|
+
provider?: TaskProvider | undefined;
|
|
6
|
+
disabled: boolean;
|
|
7
|
+
onSuccess?: (() => void) | undefined;
|
|
8
|
+
onError?: ((error: unknown) => void) | undefined;
|
|
9
|
+
}): {
|
|
10
|
+
run: () => Promise<void>;
|
|
11
|
+
readonly pending: boolean;
|
|
12
|
+
readonly available: boolean;
|
|
13
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { onDestroy } from 'svelte';
|
|
2
|
+
import { captureAdminContext, captureAuthSession, queryKeyMatches, TaskError, withValidatedTaskProvider } from '@svadmin/core';
|
|
3
|
+
import { useQueryClient } from '@tanstack/svelte-query';
|
|
4
|
+
export function createTaskAction(options) {
|
|
5
|
+
const context = captureAdminContext();
|
|
6
|
+
const client = useQueryClient();
|
|
7
|
+
const provider = $derived(options.provider ?? context.taskProvider);
|
|
8
|
+
const scope = $derived({
|
|
9
|
+
provider, id: options.taskId, tenant: context.tenantCacheKey?.__svadminTenant,
|
|
10
|
+
auth: context.authProvider, session: captureAuthSession(context.authProvider),
|
|
11
|
+
router: context.routerProvider, access: context.accessControlProvider,
|
|
12
|
+
});
|
|
13
|
+
let mounted = true;
|
|
14
|
+
let attempt = $state.raw();
|
|
15
|
+
function current(origin) {
|
|
16
|
+
return mounted && origin.provider === scope.provider && origin.id === scope.id
|
|
17
|
+
&& origin.tenant === scope.tenant && origin.auth === scope.auth
|
|
18
|
+
&& origin.router === scope.router && origin.access === scope.access
|
|
19
|
+
&& origin.session.isCurrent();
|
|
20
|
+
}
|
|
21
|
+
onDestroy(() => { mounted = false; attempt = undefined; });
|
|
22
|
+
$effect.pre(() => {
|
|
23
|
+
if (attempt && !current(attempt.scope))
|
|
24
|
+
attempt = undefined;
|
|
25
|
+
});
|
|
26
|
+
const pending = $derived(!!attempt && current(attempt.scope));
|
|
27
|
+
const available = $derived(!options.disabled && scope.session.available && !!provider?.[options.action]);
|
|
28
|
+
async function run() {
|
|
29
|
+
if (!available || pending || !mounted || !provider)
|
|
30
|
+
return;
|
|
31
|
+
const origin = scope;
|
|
32
|
+
const token = { scope: origin };
|
|
33
|
+
const matcher = context.queryKeyMatcher();
|
|
34
|
+
const success = options.onSuccess;
|
|
35
|
+
const failure = options.onError;
|
|
36
|
+
attempt = token;
|
|
37
|
+
let error;
|
|
38
|
+
let failed = false;
|
|
39
|
+
let deliver;
|
|
40
|
+
try {
|
|
41
|
+
const operation = withValidatedTaskProvider(provider)[options.action];
|
|
42
|
+
if (!operation)
|
|
43
|
+
return;
|
|
44
|
+
await operation(origin.id);
|
|
45
|
+
if (!current(origin) || attempt !== token)
|
|
46
|
+
return;
|
|
47
|
+
await Promise.allSettled([client.invalidateQueries({
|
|
48
|
+
predicate: query => queryKeyMatches(query.queryKey, { ...matcher, kind: 'task', action: 'list' })
|
|
49
|
+
|| queryKeyMatches(query.queryKey, { ...matcher, kind: 'task', action: 'one', id: origin.id }),
|
|
50
|
+
})]);
|
|
51
|
+
}
|
|
52
|
+
catch (cause) {
|
|
53
|
+
failed = true;
|
|
54
|
+
error = cause instanceof TaskError ? cause : new TaskError('TASK_PROVIDER_FAILED');
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
deliver = current(origin) && attempt === token;
|
|
58
|
+
if (attempt === token)
|
|
59
|
+
attempt = undefined;
|
|
60
|
+
}
|
|
61
|
+
if (!deliver || !current(origin))
|
|
62
|
+
return;
|
|
63
|
+
// 观察者异常不能被误报为服务端操作失败,也不能形成未处理的 Promise。
|
|
64
|
+
try {
|
|
65
|
+
if (failed)
|
|
66
|
+
await failure?.(error);
|
|
67
|
+
else
|
|
68
|
+
await success?.();
|
|
69
|
+
}
|
|
70
|
+
catch { /* 回调由宿主管理,不重试已发出的写入。 */ }
|
|
71
|
+
}
|
|
72
|
+
return { run, get pending() { return pending; }, get available() { return available; } };
|
|
73
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Button } from "./button/index.js";
|
|
3
|
+
import Badge from "./badge/badge.svelte";
|
|
4
|
+
import Checkbox from "./checkbox/checkbox.svelte";
|
|
5
|
+
import Input from "./input/input.svelte";
|
|
6
|
+
import Select from "./select/select.svelte";
|
|
7
|
+
import * as Tabs from "./tabs/index.js";
|
|
8
|
+
import * as DropdownMenu from "./dropdown-menu/index.js";
|
|
9
|
+
import * as Dialog from "./dialog/index.js";
|
|
10
|
+
import * as Tooltip from "./tooltip/index.js";
|
|
11
|
+
import * as Table from "./table/index.js";
|
|
12
|
+
import StatusBadge from "../content/StatusBadge.svelte";
|
|
13
|
+
|
|
14
|
+
let dialogOpen = $state(false);
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<div class="svadmin-design-system-showcase">
|
|
18
|
+
<section aria-labelledby="buttons-heading">
|
|
19
|
+
<h2 id="buttons-heading">Button states / 按钮状态</h2>
|
|
20
|
+
<div class="svadmin-design-system-showcase__row">
|
|
21
|
+
<Button>Default</Button>
|
|
22
|
+
<Button variant="outline">Outline</Button>
|
|
23
|
+
<Button variant="secondary" size="sm">Compact</Button>
|
|
24
|
+
<Button disabled>Disabled</Button>
|
|
25
|
+
</div>
|
|
26
|
+
</section>
|
|
27
|
+
|
|
28
|
+
<section aria-labelledby="fields-heading">
|
|
29
|
+
<h2 id="fields-heading">Fields and selection / 字段与选择</h2>
|
|
30
|
+
<div class="svadmin-design-system-showcase__grid">
|
|
31
|
+
<Input aria-label="Default input" placeholder="Default" />
|
|
32
|
+
<Input aria-label="Compact input" data-size="compact" placeholder="Compact" />
|
|
33
|
+
<Select aria-label="Status" size="compact" placeholder="Choose a status" />
|
|
34
|
+
<label class="svadmin-design-system-showcase__checkbox">
|
|
35
|
+
<Checkbox aria-label="Enabled" size="compact" />
|
|
36
|
+
Enabled
|
|
37
|
+
</label>
|
|
38
|
+
</div>
|
|
39
|
+
</section>
|
|
40
|
+
|
|
41
|
+
<section aria-labelledby="status-heading">
|
|
42
|
+
<h2 id="status-heading">Semantic status / 语义状态</h2>
|
|
43
|
+
<div class="svadmin-design-system-showcase__row">
|
|
44
|
+
<Badge variant="subtle-success">Success</Badge>
|
|
45
|
+
<Badge variant="subtle-warning">Warning</Badge>
|
|
46
|
+
<Badge variant="subtle-destructive">Danger</Badge>
|
|
47
|
+
<Badge variant="outline" size="compact">Compact</Badge>
|
|
48
|
+
</div>
|
|
49
|
+
</section>
|
|
50
|
+
|
|
51
|
+
<section aria-labelledby="tabs-heading">
|
|
52
|
+
<h2 id="tabs-heading">Tabs interaction / 标签页交互</h2>
|
|
53
|
+
<Tabs.Root value="overview">
|
|
54
|
+
<Tabs.List aria-label="Design system sections">
|
|
55
|
+
<Tabs.Trigger value="overview">Overview</Tabs.Trigger>
|
|
56
|
+
<Tabs.Trigger value="states">States</Tabs.Trigger>
|
|
57
|
+
<Tabs.Trigger value="disabled" disabled>Disabled</Tabs.Trigger>
|
|
58
|
+
</Tabs.List>
|
|
59
|
+
<Tabs.Content value="overview">Overview content</Tabs.Content>
|
|
60
|
+
<Tabs.Content value="states">State content</Tabs.Content>
|
|
61
|
+
</Tabs.Root>
|
|
62
|
+
</section>
|
|
63
|
+
|
|
64
|
+
<section aria-labelledby="overlay-heading">
|
|
65
|
+
<h2 id="overlay-heading">Menus and overlays / 菜单与浮层</h2>
|
|
66
|
+
<div class="svadmin-design-system-showcase__row">
|
|
67
|
+
<DropdownMenu.Root>
|
|
68
|
+
<DropdownMenu.Trigger class="svadmin-design-system-showcase__trigger">Menu</DropdownMenu.Trigger>
|
|
69
|
+
<DropdownMenu.Content>
|
|
70
|
+
<DropdownMenu.Item>View details</DropdownMenu.Item>
|
|
71
|
+
<DropdownMenu.Item disabled>Disabled action</DropdownMenu.Item>
|
|
72
|
+
</DropdownMenu.Content>
|
|
73
|
+
</DropdownMenu.Root>
|
|
74
|
+
<Dialog.Root bind:open={dialogOpen}>
|
|
75
|
+
<Dialog.Trigger class="svadmin-design-system-showcase__trigger">Open dialog</Dialog.Trigger>
|
|
76
|
+
<Dialog.Content>
|
|
77
|
+
<Dialog.Header>
|
|
78
|
+
<Dialog.Title>Component dialog</Dialog.Title>
|
|
79
|
+
<Dialog.Description>Dialog focus and close behavior.</Dialog.Description>
|
|
80
|
+
</Dialog.Header>
|
|
81
|
+
<Dialog.Footer>
|
|
82
|
+
<Dialog.Close class="svadmin-design-system-showcase__trigger">Close</Dialog.Close>
|
|
83
|
+
</Dialog.Footer>
|
|
84
|
+
</Dialog.Content>
|
|
85
|
+
</Dialog.Root>
|
|
86
|
+
<Tooltip.Root>
|
|
87
|
+
<Tooltip.Trigger class="svadmin-design-system-showcase__trigger">Hover hint</Tooltip.Trigger>
|
|
88
|
+
<Tooltip.Content>Tooltip content</Tooltip.Content>
|
|
89
|
+
</Tooltip.Root>
|
|
90
|
+
</div>
|
|
91
|
+
</section>
|
|
92
|
+
|
|
93
|
+
<section aria-labelledby="table-heading">
|
|
94
|
+
<h2 id="table-heading">Table and status / 表格与状态</h2>
|
|
95
|
+
<div class="svadmin-design-system-showcase__row">
|
|
96
|
+
<StatusBadge status="success" label="Ready" />
|
|
97
|
+
<StatusBadge status="warning" label="Review" />
|
|
98
|
+
<StatusBadge status="danger" label="Blocked" />
|
|
99
|
+
</div>
|
|
100
|
+
<Table.Root>
|
|
101
|
+
<Table.Header>
|
|
102
|
+
<Table.Row>
|
|
103
|
+
<Table.Head>Component</Table.Head>
|
|
104
|
+
<Table.Head>State</Table.Head>
|
|
105
|
+
</Table.Row>
|
|
106
|
+
</Table.Header>
|
|
107
|
+
<Table.Body>
|
|
108
|
+
<Table.Row>
|
|
109
|
+
<Table.Cell>Table</Table.Cell>
|
|
110
|
+
<Table.Cell>Ready</Table.Cell>
|
|
111
|
+
</Table.Row>
|
|
112
|
+
</Table.Body>
|
|
113
|
+
</Table.Root>
|
|
114
|
+
</section>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<style>
|
|
118
|
+
.svadmin-design-system-showcase {
|
|
119
|
+
display: grid;
|
|
120
|
+
gap: 1.5rem;
|
|
121
|
+
max-width: 64rem;
|
|
122
|
+
padding: 1.5rem;
|
|
123
|
+
color: var(--foreground);
|
|
124
|
+
background: var(--background);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.svadmin-design-system-showcase section {
|
|
128
|
+
display: grid;
|
|
129
|
+
gap: 0.75rem;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.svadmin-design-system-showcase h2 {
|
|
133
|
+
margin: 0;
|
|
134
|
+
font-size: 0.875rem;
|
|
135
|
+
font-weight: 600;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.svadmin-design-system-showcase__row,
|
|
139
|
+
.svadmin-design-system-showcase__grid {
|
|
140
|
+
display: flex;
|
|
141
|
+
flex-wrap: wrap;
|
|
142
|
+
align-items: center;
|
|
143
|
+
gap: 0.75rem;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.svadmin-design-system-showcase__grid > :global(*) {
|
|
147
|
+
min-width: 12rem;
|
|
148
|
+
flex: 1 1 12rem;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.svadmin-design-system-showcase__checkbox {
|
|
152
|
+
display: flex;
|
|
153
|
+
align-items: center;
|
|
154
|
+
gap: 0.5rem;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
:global(.svadmin-design-system-showcase__trigger) {
|
|
158
|
+
border: 1px solid var(--border);
|
|
159
|
+
border-radius: 0.375rem;
|
|
160
|
+
background: var(--background);
|
|
161
|
+
padding: 0.375rem 0.625rem;
|
|
162
|
+
color: var(--foreground);
|
|
163
|
+
}
|
|
164
|
+
</style>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { type BadgeRecipeProps } from '../../../recipes.js';
|
|
2
|
+
export type BadgeVariant = NonNullable<BadgeRecipeProps["variant"]>;
|
|
2
3
|
export declare const badgeVariants: ({ variant, class: className, className: extraClassName, }?: {
|
|
3
|
-
variant?: BadgeVariant | null;
|
|
4
|
+
variant?: BadgeVariant | null | undefined;
|
|
4
5
|
class?: string;
|
|
5
6
|
className?: string;
|
|
6
7
|
}) => string;
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import { uiBadge } from '../../../
|
|
2
|
-
export const badgeVariants = ({ variant
|
|
3
|
-
uiBadge(variant ? { variant } : {}), className, extraClassName].filter(Boolean).join(" ");
|
|
1
|
+
import { badgeRecipe as uiBadge } from '../../../recipes.js';
|
|
2
|
+
export const badgeVariants = ({ variant, class: className = "", className: extraClassName = "", } = {}) => uiBadge({ variant, class: [className, extraClassName].filter(Boolean).join(" ") }).root;
|
|
@@ -13,10 +13,12 @@
|
|
|
13
13
|
href,
|
|
14
14
|
class: className,
|
|
15
15
|
variant = "default",
|
|
16
|
+
size = "default",
|
|
16
17
|
children,
|
|
17
18
|
...restProps
|
|
18
19
|
}: WithElementRef<HTMLAnchorAttributes> & {
|
|
19
20
|
variant?: BadgeVariantValue;
|
|
21
|
+
size?: "default" | "compact";
|
|
20
22
|
} = $props();
|
|
21
23
|
</script>
|
|
22
24
|
|
|
@@ -25,6 +27,7 @@
|
|
|
25
27
|
bind:this={ref}
|
|
26
28
|
data-slot="badge"
|
|
27
29
|
data-variant={variant}
|
|
30
|
+
data-size={size}
|
|
28
31
|
{href}
|
|
29
32
|
class={cn(resolveBadgeVariants({ variant }), className)}
|
|
30
33
|
{...restProps}
|
|
@@ -4,6 +4,7 @@ import type { HTMLAnchorAttributes } from "svelte/elements";
|
|
|
4
4
|
import { type WithElementRef } from "../../../utils.js";
|
|
5
5
|
type $$ComponentProps = WithElementRef<HTMLAnchorAttributes> & {
|
|
6
6
|
variant?: BadgeVariantValue;
|
|
7
|
+
size?: "default" | "compact";
|
|
7
8
|
};
|
|
8
9
|
declare const Badge: import("svelte").Component<$$ComponentProps, {}, "ref">;
|
|
9
10
|
type Badge = ReturnType<typeof Badge>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
export type
|
|
1
|
+
import { type ButtonRecipeProps } from '../../../recipes.js';
|
|
2
|
+
export type ButtonVariant = NonNullable<ButtonRecipeProps["variant"]>;
|
|
3
|
+
export type ButtonSize = NonNullable<ButtonRecipeProps["size"]>;
|
|
3
4
|
export declare const buttonVariants: ({ variant, size, class: className, className: extraClassName, }?: {
|
|
4
|
-
variant?: ButtonVariant | null;
|
|
5
|
-
size?: ButtonSize | null;
|
|
5
|
+
variant?: ButtonVariant | null | undefined;
|
|
6
|
+
size?: ButtonSize | null | undefined;
|
|
6
7
|
class?: string;
|
|
7
8
|
className?: string;
|
|
8
9
|
}) => string;
|