@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
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
//
|
|
3
|
-
export const buttonVariants = ({ variant
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { buttonRecipe } from '../../../recipes.js';
|
|
2
|
+
// 只组合语义类,不要求消费者安装 Tailwind 编译器或 class merger。
|
|
3
|
+
export const buttonVariants = ({ variant, size, class: className = "", className: extraClassName = "", } = {}) => buttonRecipe({
|
|
4
|
+
variant,
|
|
5
|
+
size,
|
|
6
|
+
class: [className, extraClassName].filter(Boolean).join(" "),
|
|
7
|
+
}).root;
|
|
@@ -8,14 +8,18 @@
|
|
|
8
8
|
ref = $bindable(null),
|
|
9
9
|
checked = $bindable(false),
|
|
10
10
|
indeterminate = $bindable(false),
|
|
11
|
+
size = "default",
|
|
11
12
|
class: className,
|
|
12
13
|
...restProps
|
|
13
|
-
}: WithoutChildrenOrChild<CheckboxPrimitive.RootProps>
|
|
14
|
+
}: Omit<WithoutChildrenOrChild<CheckboxPrimitive.RootProps>, "size"> & {
|
|
15
|
+
size?: "default" | "compact";
|
|
16
|
+
} = $props();
|
|
14
17
|
</script>
|
|
15
18
|
|
|
16
19
|
<CheckboxPrimitive.Root
|
|
17
20
|
bind:ref
|
|
18
21
|
data-slot="checkbox"
|
|
22
|
+
data-size={size}
|
|
19
23
|
class={cn("svadmin-checkbox", className)}
|
|
20
24
|
bind:checked
|
|
21
25
|
bind:indeterminate
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { Checkbox as CheckboxPrimitive } from "bits-ui";
|
|
2
|
-
|
|
2
|
+
import { type WithoutChildrenOrChild } from "../../../utils.js";
|
|
3
|
+
type $$ComponentProps = Omit<WithoutChildrenOrChild<CheckboxPrimitive.RootProps>, "size"> & {
|
|
4
|
+
size?: "default" | "compact";
|
|
5
|
+
};
|
|
6
|
+
declare const Checkbox: import("svelte").Component<$$ComponentProps, {}, "ref" | "checked" | "indeterminate">;
|
|
3
7
|
type Checkbox = ReturnType<typeof Checkbox>;
|
|
4
8
|
export default Checkbox;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
2
|
import { cn, type WithElementRef } from "../../../utils.js";
|
|
4
3
|
import type { HTMLButtonAttributes } from "svelte/elements";
|
|
5
4
|
import { getContext } from "svelte";
|
|
@@ -19,7 +18,7 @@
|
|
|
19
18
|
function handleClick(e: MouseEvent) {
|
|
20
19
|
e.stopPropagation();
|
|
21
20
|
toggle?.();
|
|
22
|
-
restProps.onclick?.(e as
|
|
21
|
+
restProps.onclick?.(e as Parameters<NonNullable<typeof restProps.onclick>>[0]);
|
|
23
22
|
}
|
|
24
23
|
</script>
|
|
25
24
|
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
? number | null | undefined
|
|
12
12
|
: string | null | undefined;
|
|
13
13
|
|
|
14
|
-
type Props = WithElementRef<Omit<HTMLInputAttributes, "type" | "value">> &
|
|
14
|
+
type Props = WithElementRef<Omit<HTMLInputAttributes, "type" | "value" | "size">> &
|
|
15
|
+
{ size?: "default" | "compact"; nativeSize?: number } &
|
|
15
16
|
(Type extends "file"
|
|
16
17
|
? { type: "file"; files?: FileList; value?: never }
|
|
17
18
|
: { type?: Type; files?: undefined; value?: InputValue });
|
|
@@ -22,6 +23,8 @@
|
|
|
22
23
|
type,
|
|
23
24
|
files = $bindable(),
|
|
24
25
|
disabled,
|
|
26
|
+
size = "default",
|
|
27
|
+
nativeSize,
|
|
25
28
|
class: className,
|
|
26
29
|
"data-slot": dataSlot = "input",
|
|
27
30
|
...restProps
|
|
@@ -30,7 +33,7 @@
|
|
|
30
33
|
const i18n = useTranslation();
|
|
31
34
|
const isFileInput = $derived(type?.toLowerCase() === "file");
|
|
32
35
|
const isDateInput = $derived(["date", "datetime-local", "month", "week", "time"].includes(type?.toLowerCase() ?? ""));
|
|
33
|
-
const attributes = $derived(definedOptions({ ...restProps, disabled }));
|
|
36
|
+
const attributes = $derived(definedOptions({ ...restProps, disabled, size: nativeSize }));
|
|
34
37
|
const selectedFiles = $derived(files ? Array.from(files) : []);
|
|
35
38
|
const selectedFileLabel = $derived.by(() => {
|
|
36
39
|
const firstFile = selectedFiles[0];
|
|
@@ -48,6 +51,7 @@
|
|
|
48
51
|
<input
|
|
49
52
|
bind:this={ref}
|
|
50
53
|
data-slot={dataSlot}
|
|
54
|
+
data-size={size}
|
|
51
55
|
data-input-type="file"
|
|
52
56
|
class={cn("svadmin-input", className)}
|
|
53
57
|
type="file"
|
|
@@ -63,6 +67,7 @@
|
|
|
63
67
|
<input
|
|
64
68
|
bind:this={ref}
|
|
65
69
|
data-slot={dataSlot}
|
|
70
|
+
data-size={size}
|
|
66
71
|
class={cn("svadmin-input", className)}
|
|
67
72
|
{type}
|
|
68
73
|
lang={isDateInput ? i18n.locale : undefined}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { HTMLInputAttributes, HTMLInputTypeAttribute } from "svelte/elements";
|
|
2
2
|
declare function $$render<Type extends HTMLInputTypeAttribute | undefined = undefined>(): {
|
|
3
|
-
props: Omit<HTMLInputAttributes, "type" | "value"> & {
|
|
3
|
+
props: Omit<HTMLInputAttributes, "type" | "size" | "value"> & {
|
|
4
4
|
ref?: HTMLElement | null;
|
|
5
|
+
} & {
|
|
6
|
+
size?: "default" | "compact";
|
|
7
|
+
nativeSize?: number;
|
|
5
8
|
} & (Type extends "file" ? {
|
|
6
9
|
type: "file";
|
|
7
10
|
files?: FileList;
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
// Use HTMLElement instead of HTMLSelectElement to avoid TS error:
|
|
6
6
|
// HTMLSelectElement.remove() returns void, incompatible with HTMLElement's Element return
|
|
7
|
-
type Props = WithElementRef<HTMLSelectAttributes, HTMLElement> & {
|
|
7
|
+
type Props = Omit<WithElementRef<HTMLSelectAttributes, HTMLElement>, "size"> & {
|
|
8
8
|
placeholder?: string;
|
|
9
|
+
size?: "default" | "compact";
|
|
9
10
|
};
|
|
10
11
|
|
|
11
12
|
let {
|
|
@@ -13,6 +14,7 @@
|
|
|
13
14
|
value = $bindable(""),
|
|
14
15
|
class: className,
|
|
15
16
|
placeholder,
|
|
17
|
+
size = "default",
|
|
16
18
|
children,
|
|
17
19
|
...restProps
|
|
18
20
|
}: Props = $props();
|
|
@@ -21,6 +23,7 @@
|
|
|
21
23
|
<select
|
|
22
24
|
bind:this={ref}
|
|
23
25
|
data-slot="select"
|
|
26
|
+
data-size={size}
|
|
24
27
|
class={cn(
|
|
25
28
|
"svadmin-select",
|
|
26
29
|
className
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type WithElementRef } from "../../../utils.js";
|
|
2
2
|
import type { HTMLSelectAttributes } from "svelte/elements";
|
|
3
|
-
type Props = WithElementRef<HTMLSelectAttributes, HTMLElement> & {
|
|
3
|
+
type Props = Omit<WithElementRef<HTMLSelectAttributes, HTMLElement>, "size"> & {
|
|
4
4
|
placeholder?: string;
|
|
5
|
+
size?: "default" | "compact";
|
|
5
6
|
};
|
|
6
7
|
declare const Select: import("svelte").Component<Props, {}, "value" | "ref">;
|
|
7
8
|
type Select = ReturnType<typeof Select>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { HTMLTextareaAttributes } from "svelte/elements";
|
|
3
3
|
import { cn, type WithElementRef } from "../../../utils.js";
|
|
4
|
-
import { uiTextarea } from "../../../
|
|
4
|
+
import { textareaRecipe as uiTextarea } from "../../../recipes.js";
|
|
5
5
|
|
|
6
6
|
type Props = WithElementRef<HTMLTextareaAttributes, HTMLTextAreaElement>;
|
|
7
7
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<textarea
|
|
17
17
|
bind:this={ref}
|
|
18
18
|
data-slot="textarea"
|
|
19
|
-
class={cn(
|
|
19
|
+
class={cn(uiTextarea().root, className)}
|
|
20
20
|
bind:value
|
|
21
21
|
{...restProps}
|
|
22
22
|
></textarea>
|
package/dist/components.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* @svadmin/ui -
|
|
1
|
+
/* @svadmin/ui - Admin UI product tokens
|
|
2
2
|
* Imported by AdminApp and overridable by consumer CSS.
|
|
3
3
|
* Metronic references inform capability coverage, never visual styling.
|
|
4
4
|
*/
|
|
@@ -668,6 +668,37 @@ h1, h2, h3, h4, h5, h6, [data-slot="card-title"] {
|
|
|
668
668
|
main {
|
|
669
669
|
scroll-behavior: smooth;
|
|
670
670
|
}
|
|
671
|
+
.svadmin-sidebar-expanded,
|
|
672
|
+
.svadmin-sidebar-collapsed {
|
|
673
|
+
flex: 0 0 auto;
|
|
674
|
+
width: var(--svadmin-sidebar-width);
|
|
675
|
+
}
|
|
676
|
+
.svadmin-sidebar-expanded {
|
|
677
|
+
--svadmin-sidebar-width: 252px;
|
|
678
|
+
}
|
|
679
|
+
.svadmin-sidebar-collapsed {
|
|
680
|
+
--svadmin-sidebar-width: 70px;
|
|
681
|
+
}
|
|
682
|
+
.svadmin-sidebar-content-expanded,
|
|
683
|
+
.svadmin-sidebar-content-collapsed {
|
|
684
|
+
min-width: 0;
|
|
685
|
+
}
|
|
686
|
+
@media (min-width: 768px) {
|
|
687
|
+
.svadmin-sidebar-content-expanded {
|
|
688
|
+
margin-left: 252px;
|
|
689
|
+
}
|
|
690
|
+
.svadmin-sidebar-content-collapsed {
|
|
691
|
+
margin-left: 70px;
|
|
692
|
+
}
|
|
693
|
+
[dir="rtl"] .svadmin-sidebar-content-expanded {
|
|
694
|
+
margin-left: 0;
|
|
695
|
+
margin-right: 252px;
|
|
696
|
+
}
|
|
697
|
+
[dir="rtl"] .svadmin-sidebar-content-collapsed {
|
|
698
|
+
margin-left: 0;
|
|
699
|
+
margin-right: 70px;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
671
702
|
[dir="rtl"] {
|
|
672
703
|
direction: rtl;
|
|
673
704
|
}
|
|
@@ -2114,7 +2145,7 @@ details[data-svadmin-filter]:not([open]) > :not(summary), details.svadmin-collap
|
|
|
2114
2145
|
display: none !important;
|
|
2115
2146
|
}
|
|
2116
2147
|
|
|
2117
|
-
/* ---
|
|
2148
|
+
/* --- Admin UI layout preset (clean-flat) --- */
|
|
2118
2149
|
/* Keep this public class for layoutPreset API compatibility. The preset only
|
|
2119
2150
|
* adjusts density and composition; color, focus, and elevation stay semantic. */
|
|
2120
2151
|
.layout-clean-flat {
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type DateInputMode = 'date' | 'time' | 'datetime';
|
|
2
|
+
/** 仅接受无时区原生输入值,不让 Date 的宽松解析改写日历含义。 */
|
|
3
|
+
export declare function dateInputNumber(value: string, mode: DateInputMode): number | undefined;
|
|
4
|
+
export declare function dateInputAllowed(value: string, mode: DateInputMode, min?: string, max?: string, disabledDate?: (date: string) => boolean): boolean;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** 仅接受无时区原生输入值,不让 Date 的宽松解析改写日历含义。 */
|
|
2
|
+
export function dateInputNumber(value, mode) {
|
|
3
|
+
const day = '\\d{4}-\\d{2}-\\d{2}';
|
|
4
|
+
const time = '\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,3})?)?';
|
|
5
|
+
if (!new RegExp(`^${mode === 'date' ? day : mode === 'time' ? time : `${day}T${time}`}$`).test(value))
|
|
6
|
+
return;
|
|
7
|
+
const source = mode === 'date' ? `${value}T00:00` : mode === 'time' ? `2000-01-01T${value}` : value;
|
|
8
|
+
const [date, clock = ''] = source.split('T');
|
|
9
|
+
if (date?.startsWith('0000-'))
|
|
10
|
+
return;
|
|
11
|
+
const [hours, minutes, seconds = '00'] = clock.split(':');
|
|
12
|
+
const [wholeSeconds, fraction = ''] = seconds.split('.');
|
|
13
|
+
const canonical = `${date}T${hours}:${minutes}:${wholeSeconds}.${fraction.padEnd(3, '0')}Z`;
|
|
14
|
+
const parsed = new Date(canonical);
|
|
15
|
+
if (!Number.isFinite(parsed.getTime()) || parsed.toISOString() !== canonical)
|
|
16
|
+
return;
|
|
17
|
+
return parsed.getTime();
|
|
18
|
+
}
|
|
19
|
+
export function dateInputAllowed(value, mode, min, max, disabledDate) {
|
|
20
|
+
const number = dateInputNumber(value, mode);
|
|
21
|
+
if (number === undefined)
|
|
22
|
+
return false;
|
|
23
|
+
const lower = min === undefined ? undefined : dateInputNumber(min, mode);
|
|
24
|
+
const upper = max === undefined ? undefined : dateInputNumber(max, mode);
|
|
25
|
+
if ((min !== undefined && lower === undefined) || (max !== undefined && upper === undefined))
|
|
26
|
+
return false;
|
|
27
|
+
if ((lower !== undefined && number < lower) || (upper !== undefined && number > upper))
|
|
28
|
+
return false;
|
|
29
|
+
try {
|
|
30
|
+
return mode === 'time' || !disabledDate?.(value.slice(0, 10));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export type DesignComponentState = "default" | "hover" | "focus" | "disabled" | "loading" | "error" | "readonly" | "open" | "closed" | "boundary" | "empty" | "filtered-empty" | "forbidden" | "success" | "warning" | "danger" | "neutral" | "active" | "inactive" | "checked" | "unchecked" | "mixed" | "focus-restore" | "overflow" | "value";
|
|
2
|
+
export type DesignComponentContract = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
codePath: string;
|
|
6
|
+
codeExport: string;
|
|
7
|
+
states: readonly DesignComponentState[];
|
|
8
|
+
themes: readonly ["light", "dark"];
|
|
9
|
+
sizes: readonly ["default", "compact"];
|
|
10
|
+
};
|
|
11
|
+
export declare const designSystemComponents: readonly [{
|
|
12
|
+
readonly id: "ui.button";
|
|
13
|
+
readonly name: "Button";
|
|
14
|
+
readonly codePath: "packages/ui/src/components/ui/button/index.ts";
|
|
15
|
+
readonly codeExport: "Button";
|
|
16
|
+
readonly states: readonly ["default", "hover", "focus", "disabled", "loading"];
|
|
17
|
+
readonly themes: readonly ["light", "dark"];
|
|
18
|
+
readonly sizes: readonly ["default", "compact"];
|
|
19
|
+
}, {
|
|
20
|
+
readonly id: "ui.input";
|
|
21
|
+
readonly name: "Input";
|
|
22
|
+
readonly codePath: "packages/ui/src/components/ui/input/index.ts";
|
|
23
|
+
readonly codeExport: "Input";
|
|
24
|
+
readonly states: readonly ["empty", "value", "focus", "disabled", "error", "readonly"];
|
|
25
|
+
readonly themes: readonly ["light", "dark"];
|
|
26
|
+
readonly sizes: readonly ["default", "compact"];
|
|
27
|
+
}, {
|
|
28
|
+
readonly id: "ui.select";
|
|
29
|
+
readonly name: "Select";
|
|
30
|
+
readonly codePath: "packages/ui/src/components/ui/select/index.ts";
|
|
31
|
+
readonly codeExport: "Select";
|
|
32
|
+
readonly states: readonly ["empty", "value", "focus", "disabled", "error"];
|
|
33
|
+
readonly themes: readonly ["light", "dark"];
|
|
34
|
+
readonly sizes: readonly ["default", "compact"];
|
|
35
|
+
}, {
|
|
36
|
+
readonly id: "ui.checkbox";
|
|
37
|
+
readonly name: "Checkbox";
|
|
38
|
+
readonly codePath: "packages/ui/src/components/ui/checkbox/index.ts";
|
|
39
|
+
readonly codeExport: "Checkbox";
|
|
40
|
+
readonly states: readonly ["unchecked", "checked", "focus", "disabled", "mixed"];
|
|
41
|
+
readonly themes: readonly ["light", "dark"];
|
|
42
|
+
readonly sizes: readonly ["default", "compact"];
|
|
43
|
+
}, {
|
|
44
|
+
readonly id: "ui.tabs";
|
|
45
|
+
readonly name: "Tabs";
|
|
46
|
+
readonly codePath: "packages/ui/src/components/ui/tabs/index.ts";
|
|
47
|
+
readonly codeExport: "Tabs";
|
|
48
|
+
readonly states: readonly ["active", "inactive", "focus", "disabled"];
|
|
49
|
+
readonly themes: readonly ["light", "dark"];
|
|
50
|
+
readonly sizes: readonly ["default", "compact"];
|
|
51
|
+
}, {
|
|
52
|
+
readonly id: "ui.badge";
|
|
53
|
+
readonly name: "Badge";
|
|
54
|
+
readonly codePath: "packages/ui/src/components/ui/badge/index.ts";
|
|
55
|
+
readonly codeExport: "Badge";
|
|
56
|
+
readonly states: readonly ["success", "warning", "danger", "neutral"];
|
|
57
|
+
readonly themes: readonly ["light", "dark"];
|
|
58
|
+
readonly sizes: readonly ["default", "compact"];
|
|
59
|
+
}, {
|
|
60
|
+
readonly id: "ui.menu";
|
|
61
|
+
readonly name: "Menu";
|
|
62
|
+
readonly codePath: "packages/ui/src/components/ui/dropdown-menu/index.ts";
|
|
63
|
+
readonly codeExport: "DropdownMenu";
|
|
64
|
+
readonly states: readonly ["closed", "open", "focus", "overflow"];
|
|
65
|
+
readonly themes: readonly ["light", "dark"];
|
|
66
|
+
readonly sizes: readonly ["default", "compact"];
|
|
67
|
+
}, {
|
|
68
|
+
readonly id: "ui.dialog";
|
|
69
|
+
readonly name: "Dialog";
|
|
70
|
+
readonly codePath: "packages/ui/src/components/ui/dialog/index.ts";
|
|
71
|
+
readonly codeExport: "Dialog";
|
|
72
|
+
readonly states: readonly ["closed", "open", "focus-restore", "overflow"];
|
|
73
|
+
readonly themes: readonly ["light", "dark"];
|
|
74
|
+
readonly sizes: readonly ["default", "compact"];
|
|
75
|
+
}, {
|
|
76
|
+
readonly id: "ui.tooltip";
|
|
77
|
+
readonly name: "Tooltip";
|
|
78
|
+
readonly codePath: "packages/ui/src/components/ui/tooltip/index.ts";
|
|
79
|
+
readonly codeExport: "Tooltip";
|
|
80
|
+
readonly states: readonly ["closed", "open", "boundary"];
|
|
81
|
+
readonly themes: readonly ["light", "dark"];
|
|
82
|
+
readonly sizes: readonly ["default", "compact"];
|
|
83
|
+
}, {
|
|
84
|
+
readonly id: "ui.table";
|
|
85
|
+
readonly name: "Table";
|
|
86
|
+
readonly codePath: "packages/ui/src/components/ui/table/index.ts";
|
|
87
|
+
readonly codeExport: "Table";
|
|
88
|
+
readonly states: readonly ["loading", "default", "empty", "filtered-empty", "error", "forbidden"];
|
|
89
|
+
readonly themes: readonly ["light", "dark"];
|
|
90
|
+
readonly sizes: readonly ["default", "compact"];
|
|
91
|
+
}, {
|
|
92
|
+
readonly id: "ui.status-badge";
|
|
93
|
+
readonly name: "StatusBadge";
|
|
94
|
+
readonly codePath: "packages/ui/src/components/content/StatusBadge.svelte";
|
|
95
|
+
readonly codeExport: "StatusBadge";
|
|
96
|
+
readonly states: readonly ["success", "warning", "danger", "neutral"];
|
|
97
|
+
readonly themes: readonly ["light", "dark"];
|
|
98
|
+
readonly sizes: readonly ["default", "compact"];
|
|
99
|
+
}];
|
|
100
|
+
export type DesignComponentId = (typeof designSystemComponents)[number]["id"];
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export const designSystemComponents = [
|
|
2
|
+
{
|
|
3
|
+
id: "ui.button",
|
|
4
|
+
name: "Button",
|
|
5
|
+
codePath: "packages/ui/src/components/ui/button/index.ts",
|
|
6
|
+
codeExport: "Button",
|
|
7
|
+
states: ["default", "hover", "focus", "disabled", "loading"],
|
|
8
|
+
themes: ["light", "dark"],
|
|
9
|
+
sizes: ["default", "compact"],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: "ui.input",
|
|
13
|
+
name: "Input",
|
|
14
|
+
codePath: "packages/ui/src/components/ui/input/index.ts",
|
|
15
|
+
codeExport: "Input",
|
|
16
|
+
states: ["empty", "value", "focus", "disabled", "error", "readonly"],
|
|
17
|
+
themes: ["light", "dark"],
|
|
18
|
+
sizes: ["default", "compact"],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "ui.select",
|
|
22
|
+
name: "Select",
|
|
23
|
+
codePath: "packages/ui/src/components/ui/select/index.ts",
|
|
24
|
+
codeExport: "Select",
|
|
25
|
+
states: ["empty", "value", "focus", "disabled", "error"],
|
|
26
|
+
themes: ["light", "dark"],
|
|
27
|
+
sizes: ["default", "compact"],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "ui.checkbox",
|
|
31
|
+
name: "Checkbox",
|
|
32
|
+
codePath: "packages/ui/src/components/ui/checkbox/index.ts",
|
|
33
|
+
codeExport: "Checkbox",
|
|
34
|
+
states: ["unchecked", "checked", "focus", "disabled", "mixed"],
|
|
35
|
+
themes: ["light", "dark"],
|
|
36
|
+
sizes: ["default", "compact"],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "ui.tabs",
|
|
40
|
+
name: "Tabs",
|
|
41
|
+
codePath: "packages/ui/src/components/ui/tabs/index.ts",
|
|
42
|
+
codeExport: "Tabs",
|
|
43
|
+
states: ["active", "inactive", "focus", "disabled"],
|
|
44
|
+
themes: ["light", "dark"],
|
|
45
|
+
sizes: ["default", "compact"],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "ui.badge",
|
|
49
|
+
name: "Badge",
|
|
50
|
+
codePath: "packages/ui/src/components/ui/badge/index.ts",
|
|
51
|
+
codeExport: "Badge",
|
|
52
|
+
states: ["success", "warning", "danger", "neutral"],
|
|
53
|
+
themes: ["light", "dark"],
|
|
54
|
+
sizes: ["default", "compact"],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "ui.menu",
|
|
58
|
+
name: "Menu",
|
|
59
|
+
codePath: "packages/ui/src/components/ui/dropdown-menu/index.ts",
|
|
60
|
+
codeExport: "DropdownMenu",
|
|
61
|
+
states: ["closed", "open", "focus", "overflow"],
|
|
62
|
+
themes: ["light", "dark"],
|
|
63
|
+
sizes: ["default", "compact"],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "ui.dialog",
|
|
67
|
+
name: "Dialog",
|
|
68
|
+
codePath: "packages/ui/src/components/ui/dialog/index.ts",
|
|
69
|
+
codeExport: "Dialog",
|
|
70
|
+
states: ["closed", "open", "focus-restore", "overflow"],
|
|
71
|
+
themes: ["light", "dark"],
|
|
72
|
+
sizes: ["default", "compact"],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "ui.tooltip",
|
|
76
|
+
name: "Tooltip",
|
|
77
|
+
codePath: "packages/ui/src/components/ui/tooltip/index.ts",
|
|
78
|
+
codeExport: "Tooltip",
|
|
79
|
+
states: ["closed", "open", "boundary"],
|
|
80
|
+
themes: ["light", "dark"],
|
|
81
|
+
sizes: ["default", "compact"],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: "ui.table",
|
|
85
|
+
name: "Table",
|
|
86
|
+
codePath: "packages/ui/src/components/ui/table/index.ts",
|
|
87
|
+
codeExport: "Table",
|
|
88
|
+
states: ["loading", "default", "empty", "filtered-empty", "error", "forbidden"],
|
|
89
|
+
themes: ["light", "dark"],
|
|
90
|
+
sizes: ["default", "compact"],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: "ui.status-badge",
|
|
94
|
+
name: "StatusBadge",
|
|
95
|
+
codePath: "packages/ui/src/components/content/StatusBadge.svelte",
|
|
96
|
+
codeExport: "StatusBadge",
|
|
97
|
+
states: ["success", "warning", "danger", "neutral"],
|
|
98
|
+
themes: ["light", "dark"],
|
|
99
|
+
sizes: ["default", "compact"],
|
|
100
|
+
},
|
|
101
|
+
];
|
package/dist/design-system.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { surfaceMetric, surfaceTable } from "./
|
|
1
|
+
import { surfaceMetricRecipe as surfaceMetric, surfaceTableRecipe as surfaceTable } from "./recipes.js";
|
|
2
2
|
export function metricSurfaceClasses(tone = "neutral") {
|
|
3
3
|
return surfaceMetric({ tone });
|
|
4
4
|
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { DevtoolsQueryDiagnostic, SvadminDevtoolsSnapshot } from '@svadmin/devtools-contract';
|
|
2
|
+
export declare const SVADMIN_DEVFRAME_CHANNEL = "svadmin:devtools";
|
|
3
|
+
export type { DevtoolsCacheDiagnostics, DevtoolsProviderDiagnostic, DevtoolsQueryDiagnostic, SvadminDevtoolsSnapshot, } from '@svadmin/devtools-contract';
|
|
4
|
+
export type SvadminDevtoolsBridge = {
|
|
5
|
+
getSnapshot: () => SvadminDevtoolsSnapshot | null;
|
|
6
|
+
subscribe: (listener: (snapshot: SvadminDevtoolsSnapshot) => void) => () => void;
|
|
7
|
+
cache: {
|
|
8
|
+
cancel: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
9
|
+
invalidate: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
10
|
+
refetch: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
11
|
+
remove: (selector?: DevtoolsQuerySelector) => void;
|
|
12
|
+
reset: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
13
|
+
clear: () => void;
|
|
14
|
+
clearMutations: () => void;
|
|
15
|
+
};
|
|
16
|
+
devframe: {
|
|
17
|
+
channelName: typeof SVADMIN_DEVFRAME_CHANNEL;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export type DevtoolsQuerySelector = Partial<Pick<DevtoolsQueryDiagnostic, 'provider' | 'resource' | 'operation'>>;
|
|
21
|
+
type QueryClientLike = {
|
|
22
|
+
getQueryCache: () => {
|
|
23
|
+
getAll: () => Array<{
|
|
24
|
+
queryKey: readonly unknown[];
|
|
25
|
+
queryHash: string;
|
|
26
|
+
}>;
|
|
27
|
+
clear: () => void;
|
|
28
|
+
};
|
|
29
|
+
invalidateQueries: (filters: {
|
|
30
|
+
queryKey?: readonly unknown[];
|
|
31
|
+
}) => Promise<void>;
|
|
32
|
+
cancelQueries: (filters: {
|
|
33
|
+
queryKey?: readonly unknown[];
|
|
34
|
+
}) => Promise<void>;
|
|
35
|
+
refetchQueries: (filters: {
|
|
36
|
+
queryKey?: readonly unknown[];
|
|
37
|
+
}) => Promise<void>;
|
|
38
|
+
removeQueries: (filters: {
|
|
39
|
+
queryKey?: readonly unknown[];
|
|
40
|
+
}) => void;
|
|
41
|
+
resetQueries: (filters: {
|
|
42
|
+
queryKey?: readonly unknown[];
|
|
43
|
+
}) => Promise<void>;
|
|
44
|
+
getMutationCache: () => {
|
|
45
|
+
clear: () => void;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export type SvadminDevframeProtocol = {
|
|
49
|
+
functions: {
|
|
50
|
+
pageScript: {
|
|
51
|
+
getSnapshot: () => SvadminDevtoolsSnapshot | null;
|
|
52
|
+
cacheCancel: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
53
|
+
cacheInvalidate: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
54
|
+
cacheRefetch: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
55
|
+
cacheRemove: (selector?: DevtoolsQuerySelector) => void;
|
|
56
|
+
cacheReset: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
57
|
+
cacheClear: () => void;
|
|
58
|
+
clearMutations: () => void;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
export declare function publishSvadminDevtoolsSnapshot(next: SvadminDevtoolsSnapshot): void;
|
|
63
|
+
export declare function getSvadminDevtoolsSnapshot(): SvadminDevtoolsSnapshot | null;
|
|
64
|
+
export declare function subscribeSvadminDevtools(listener: (next: SvadminDevtoolsSnapshot) => void): () => void;
|
|
65
|
+
export declare function attachSvadminDevtoolsQueryClient(client: QueryClientLike): void;
|
|
66
|
+
export declare function createSvadminDevtoolsCacheActions(): {
|
|
67
|
+
cancel: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
68
|
+
invalidate: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
69
|
+
refetch: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
70
|
+
remove: (selector?: DevtoolsQuerySelector) => void;
|
|
71
|
+
reset: (selector?: DevtoolsQuerySelector) => Promise<void>;
|
|
72
|
+
clear: () => void;
|
|
73
|
+
clearMutations: () => void | undefined;
|
|
74
|
+
};
|
|
75
|
+
export declare function installSvadminDevtoolsBridge(): void;
|
|
76
|
+
declare global {
|
|
77
|
+
interface Window {
|
|
78
|
+
__SVADMIN_DEVTOOLS__?: SvadminDevtoolsBridge;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { parseQueryKey } from '@svadmin/core';
|
|
2
|
+
import { createPageScriptChannel } from 'devframe/in-page-channel';
|
|
3
|
+
import { DEV } from 'esm-env';
|
|
4
|
+
export const SVADMIN_DEVFRAME_CHANNEL = 'svadmin:devtools';
|
|
5
|
+
const listeners = new Set();
|
|
6
|
+
let snapshot = null;
|
|
7
|
+
let queryClient = null;
|
|
8
|
+
let devframeChannel = null;
|
|
9
|
+
export function publishSvadminDevtoolsSnapshot(next) {
|
|
10
|
+
snapshot = next;
|
|
11
|
+
for (const listener of listeners)
|
|
12
|
+
listener(next);
|
|
13
|
+
}
|
|
14
|
+
export function getSvadminDevtoolsSnapshot() {
|
|
15
|
+
return snapshot;
|
|
16
|
+
}
|
|
17
|
+
export function subscribeSvadminDevtools(listener) {
|
|
18
|
+
listeners.add(listener);
|
|
19
|
+
if (snapshot)
|
|
20
|
+
listener(snapshot);
|
|
21
|
+
return () => listeners.delete(listener);
|
|
22
|
+
}
|
|
23
|
+
function matchesSelector(query, selector) {
|
|
24
|
+
if (!selector || Object.keys(selector).length === 0)
|
|
25
|
+
return true;
|
|
26
|
+
const descriptor = parseQueryKey(query.queryKey);
|
|
27
|
+
if (!descriptor)
|
|
28
|
+
return false;
|
|
29
|
+
const operation = `${descriptor.kind}:${descriptor.action ?? 'call'}`;
|
|
30
|
+
return (selector.provider === undefined || selector.provider === descriptor.provider)
|
|
31
|
+
&& (selector.resource === undefined || selector.resource === descriptor.resource)
|
|
32
|
+
&& (selector.operation === undefined || selector.operation === operation);
|
|
33
|
+
}
|
|
34
|
+
function matchingQueryKeys(selector) {
|
|
35
|
+
return (queryClient?.getQueryCache().getAll() ?? [])
|
|
36
|
+
.filter((query) => matchesSelector(query, selector))
|
|
37
|
+
.map((query) => query.queryKey);
|
|
38
|
+
}
|
|
39
|
+
function withMatchingQueries(operation, selector) {
|
|
40
|
+
return Promise.all(matchingQueryKeys(selector).map((queryKey) => operation(queryKey))).then(() => undefined);
|
|
41
|
+
}
|
|
42
|
+
export function attachSvadminDevtoolsQueryClient(client) {
|
|
43
|
+
queryClient = client;
|
|
44
|
+
}
|
|
45
|
+
export function createSvadminDevtoolsCacheActions() {
|
|
46
|
+
return {
|
|
47
|
+
cancel: (selector) => withMatchingQueries((queryKey) => queryClient?.cancelQueries({ queryKey }), selector),
|
|
48
|
+
invalidate: (selector) => withMatchingQueries((queryKey) => queryClient?.invalidateQueries({ queryKey }), selector),
|
|
49
|
+
refetch: (selector) => withMatchingQueries((queryKey) => queryClient?.refetchQueries({ queryKey }), selector),
|
|
50
|
+
remove: (selector) => {
|
|
51
|
+
for (const queryKey of matchingQueryKeys(selector))
|
|
52
|
+
queryClient?.removeQueries({ queryKey });
|
|
53
|
+
},
|
|
54
|
+
reset: (selector) => withMatchingQueries((queryKey) => queryClient?.resetQueries({ queryKey }), selector),
|
|
55
|
+
clear: () => {
|
|
56
|
+
queryClient?.getQueryCache().clear();
|
|
57
|
+
},
|
|
58
|
+
clearMutations: () => queryClient?.getMutationCache().clear(),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function installSvadminDevtoolsBridge() {
|
|
62
|
+
if (typeof window === 'undefined' || !DEV)
|
|
63
|
+
return;
|
|
64
|
+
if (!devframeChannel) {
|
|
65
|
+
const cache = createSvadminDevtoolsCacheActions();
|
|
66
|
+
devframeChannel = createPageScriptChannel({
|
|
67
|
+
name: SVADMIN_DEVFRAME_CHANNEL,
|
|
68
|
+
functions: {
|
|
69
|
+
getSnapshot: { type: 'query', handler: getSvadminDevtoolsSnapshot },
|
|
70
|
+
cacheCancel: { type: 'action', handler: cache.cancel },
|
|
71
|
+
cacheInvalidate: { type: 'action', handler: cache.invalidate },
|
|
72
|
+
cacheRefetch: { type: 'action', handler: cache.refetch },
|
|
73
|
+
cacheRemove: { type: 'action', handler: cache.remove },
|
|
74
|
+
cacheReset: { type: 'action', handler: cache.reset },
|
|
75
|
+
cacheClear: { type: 'action', handler: cache.clear },
|
|
76
|
+
clearMutations: { type: 'action', handler: cache.clearMutations },
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const bridge = {
|
|
81
|
+
getSnapshot: getSvadminDevtoolsSnapshot,
|
|
82
|
+
subscribe: subscribeSvadminDevtools,
|
|
83
|
+
cache: createSvadminDevtoolsCacheActions(),
|
|
84
|
+
devframe: { channelName: SVADMIN_DEVFRAME_CHANNEL },
|
|
85
|
+
};
|
|
86
|
+
Object.defineProperty(window, '__SVADMIN_DEVTOOLS__', {
|
|
87
|
+
configurable: true,
|
|
88
|
+
enumerable: false,
|
|
89
|
+
value: bridge,
|
|
90
|
+
writable: false,
|
|
91
|
+
});
|
|
92
|
+
}
|