@svadmin/ui 0.84.1 → 0.86.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 +29 -0
- package/dist/app-shell.css +216 -0
- package/dist/app.css +496 -171
- package/dist/app.theme.css +496 -171
- package/dist/component-registry.d.ts +7292 -529
- package/dist/component-registry.js +32 -3
- package/dist/components/AppShellPage.svelte +172 -0
- package/dist/components/AppShellPage.svelte.d.ts +30 -0
- package/dist/components/AuthPageShell.svelte +14 -7
- package/dist/components/AuthPageShell.svelte.d.ts +1 -0
- package/dist/components/AutoForm.svelte +7 -12
- package/dist/components/AutoForm.svelte.d.ts +0 -1
- package/dist/components/AutoTable.svelte +2 -0
- package/dist/components/AutoTable.svelte.d.ts +2 -0
- package/dist/components/ConfigurationPage.svelte +0 -3
- package/dist/components/ConfigurationPage.svelte.d.ts +0 -1
- package/dist/components/CreatePage.svelte +1 -5
- package/dist/components/CreatePage.svelte.d.ts +0 -1
- package/dist/components/EditPage.svelte +1 -5
- package/dist/components/EditPage.svelte.d.ts +0 -1
- package/dist/components/FieldRenderer.svelte +2 -10
- package/dist/components/FieldRenderer.svelte.d.ts +0 -1
- package/dist/components/ListPage.svelte +2 -5
- package/dist/components/ListPage.svelte.d.ts +0 -1
- package/dist/components/PageHeader.svelte +1 -3
- package/dist/components/PageHeader.svelte.d.ts +0 -1
- package/dist/components/PagePattern.svelte +36 -13
- package/dist/components/PagePattern.svelte.d.ts +7 -0
- package/dist/components/QuickEditDrawer.svelte +0 -1
- package/dist/components/ShowPage.svelte +5 -9
- package/dist/components/ShowPage.svelte.d.ts +0 -1
- package/dist/components/SvarAutoTable.svelte +2 -1
- package/dist/components/SvarDataGrid.svelte +8 -4
- package/dist/components/SvarDataGrid.svelte.d.ts +3 -0
- package/dist/components/SvarResourceTable.svelte +0 -1
- package/dist/components/SvarResourceTable.svelte.d.ts +0 -1
- package/dist/components/SvarResourceTableView.svelte +2 -2
- package/dist/components/auto-table-grid.d.ts +1 -0
- package/dist/components/content/ContentPageHeader.svelte +2 -1
- package/dist/components/content/ContentPageHeader.svelte.d.ts +1 -0
- package/dist/components/content/ContentPageShell.svelte +1 -1
- package/dist/components/content/ContentPageShell.svelte.d.ts +1 -0
- package/dist/components/content/DataPanel.svelte +58 -0
- package/dist/components/content/DataPanel.svelte.d.ts +16 -0
- package/dist/components/content/DescriptionList.svelte +5 -8
- package/dist/components/content/DescriptionList.svelte.d.ts +0 -1
- package/dist/components/content/FilterToolbar.svelte +2 -5
- package/dist/components/content/FilterToolbar.svelte.d.ts +0 -1
- package/dist/components/content/NetworkTable.svelte +3 -3
- package/dist/components/content/NetworkTable.svelte.d.ts +0 -1
- package/dist/components/content/PageSection.svelte +1 -1
- package/dist/components/content/StatusTabs.svelte +2 -7
- package/dist/components/content/StatusTabs.svelte.d.ts +0 -1
- package/dist/components/content/index.d.ts +1 -0
- package/dist/components/content/index.js +1 -0
- package/dist/components/ui/table/index.d.ts +0 -1
- package/dist/components/ui/table/table.svelte +1 -0
- package/dist/components/ui/table/table.svelte.d.ts +1 -0
- package/dist/components.css +1 -11
- package/dist/data-panel.css +88 -0
- package/dist/design-contract.d.ts +11 -0
- package/dist/design-contract.js +8 -0
- package/dist/design-system.d.ts +3 -2
- package/dist/design-system.js +3 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +2 -0
- package/dist/page-chrome.css +53 -61
- package/dist/recipes.d.ts +67 -154
- package/dist/recipes.js +32 -68
- package/dist/styles/recipes.css +15 -48
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -23,6 +23,17 @@ continue to use public semantic CSS variables; nested themes use `.svadmin-theme
|
|
|
23
23
|
emits compiler metadata. Import one UI CSS entry, not both. Old host `@source`
|
|
24
24
|
directives can be removed; styles are pre-generated, not scanned at consumption.
|
|
25
25
|
|
|
26
|
+
### CSS source of truth
|
|
27
|
+
|
|
28
|
+
`src/app.css` is the live entry. It imports `page-chrome.css`, `app-shell.css`,
|
|
29
|
+
`data-panel.css` and the generated prelude, and `build-static-css.mjs` publishes
|
|
30
|
+
it as `dist/app.css`.
|
|
31
|
+
|
|
32
|
+
`src/components.css` is a **frozen historical snapshot** pinned by
|
|
33
|
+
`design/admin-ui/runtime-source.json`. Do not extend it, and never assert
|
|
34
|
+
shipped behaviour against it: the styling contract tests read `src/app.css`
|
|
35
|
+
precisely because that file is what ships.
|
|
36
|
+
|
|
26
37
|
## Migration Boundary
|
|
27
38
|
|
|
28
39
|
The package publishes precompiled CSS: consumers do not need to compile library
|
|
@@ -34,6 +45,24 @@ rename or delete them mechanically. New styles should use semantic Tailwind
|
|
|
34
45
|
classes and reviewed recipes. This is not a wholesale rewrite of every UI
|
|
35
46
|
component.
|
|
36
47
|
|
|
48
|
+
## Product layer
|
|
49
|
+
|
|
50
|
+
Use the business page layer as the default customer API:
|
|
51
|
+
|
|
52
|
+
- `ListPage`, `CreatePage`, `EditPage`, and `ShowPage` for resource CRUD.
|
|
53
|
+
- `PagePattern` for custom list, form, detail, workspace, and dashboard pages.
|
|
54
|
+
- `AppShellPage` for hosts that bring their own router: sidebar, topbar, primary
|
|
55
|
+
region, optional secondary column and footer, with no data or router coupling.
|
|
56
|
+
- `FilterToolbar`, `AutoTable`, `AutoForm`, `DetailDrawer`, `RowActions`, and
|
|
57
|
+
`DataState` for the recurring work patterns inside those pages.
|
|
58
|
+
|
|
59
|
+
`PagePattern` has a shared `state` contract (`ready`, `loading`, `empty`,
|
|
60
|
+
`error`, `forbidden`) and hides page content while a non-ready state is active.
|
|
61
|
+
This keeps shadcn-svelte as an implementation source while customers receive a
|
|
62
|
+
stable, Ant Design-like product workflow. Prefer these APIs over composing
|
|
63
|
+
primitive `Button`, `Card`, `Dialog`, and `Table` components directly in every
|
|
64
|
+
route.
|
|
65
|
+
|
|
37
66
|
Button, Badge, content layouts and Surface appearance use the shared
|
|
38
67
|
`tailwind-variants` registry. Public props, bindings, semantic class markers and
|
|
39
68
|
null-variant semantics remain compatible. Existing component CSS state rules
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/* Router-agnostic application shell.
|
|
2
|
+
*
|
|
3
|
+
* Every length, size and color here comes from a token. That is the contract
|
|
4
|
+
* hosts rely on: a host with its own router composes the shell with snippets and
|
|
5
|
+
* overrides tokens, instead of re-implementing sidebar, topbar and page
|
|
6
|
+
* composition in bespoke CSS. See docs/components/app-shell.md. */
|
|
7
|
+
@layer components {
|
|
8
|
+
.svadmin-app-shell {
|
|
9
|
+
display: grid;
|
|
10
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
11
|
+
grid-template-columns: minmax(0, 1fr);
|
|
12
|
+
min-height: 100dvh;
|
|
13
|
+
background: var(--background);
|
|
14
|
+
color: var(--foreground);
|
|
15
|
+
font-size: var(--svadmin-text-body);
|
|
16
|
+
line-height: var(--svadmin-leading-body);
|
|
17
|
+
}
|
|
18
|
+
.svadmin-app-shell[data-width="narrow"] {
|
|
19
|
+
--svadmin-shell-max: 48rem;
|
|
20
|
+
}
|
|
21
|
+
.svadmin-app-shell[data-width="wide"] {
|
|
22
|
+
--svadmin-shell-max: 92rem;
|
|
23
|
+
}
|
|
24
|
+
.svadmin-app-shell[data-width="full"] {
|
|
25
|
+
--svadmin-shell-max: none;
|
|
26
|
+
}
|
|
27
|
+
.svadmin-app-shell[data-sidebar="true"] {
|
|
28
|
+
grid-template-columns: var(--svadmin-shell-sidebar-w) minmax(0, 1fr);
|
|
29
|
+
grid-template-areas:
|
|
30
|
+
"topbar topbar"
|
|
31
|
+
"sidebar main"
|
|
32
|
+
"sidebar footer";
|
|
33
|
+
}
|
|
34
|
+
.svadmin-app-shell[data-collapsed="true"] {
|
|
35
|
+
--svadmin-shell-sidebar-w: var(--svadmin-shell-sidebar-w-collapsed);
|
|
36
|
+
}
|
|
37
|
+
.svadmin-app-shell[data-aside="true"] .svadmin-app-shell__body {
|
|
38
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, var(--svadmin-shell-aside-w));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.svadmin-app-shell__skip {
|
|
42
|
+
position: fixed;
|
|
43
|
+
z-index: 60;
|
|
44
|
+
inset-block-start: var(--svadmin-space-2);
|
|
45
|
+
inset-inline-start: var(--svadmin-space-2);
|
|
46
|
+
border: 1px solid var(--border);
|
|
47
|
+
border-radius: var(--radius-md);
|
|
48
|
+
background: var(--card);
|
|
49
|
+
padding: var(--svadmin-space-2) var(--svadmin-space-3);
|
|
50
|
+
color: var(--foreground);
|
|
51
|
+
font-size: var(--svadmin-text-caption);
|
|
52
|
+
font-weight: 600;
|
|
53
|
+
transform: translateY(calc(-1 * (var(--svadmin-space-6) + var(--svadmin-space-5))));
|
|
54
|
+
}
|
|
55
|
+
.svadmin-app-shell__skip:focus-visible {
|
|
56
|
+
transform: none;
|
|
57
|
+
outline: var(--svadmin-focus-width) solid var(--ring);
|
|
58
|
+
outline-offset: var(--svadmin-focus-offset);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.svadmin-app-shell__topbar {
|
|
62
|
+
grid-area: topbar;
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
gap: var(--svadmin-space-3);
|
|
66
|
+
min-width: 0;
|
|
67
|
+
min-height: var(--svadmin-shell-topbar-h);
|
|
68
|
+
border-bottom: 1px solid var(--border);
|
|
69
|
+
background: var(--card);
|
|
70
|
+
padding-inline: var(--svadmin-shell-gutter);
|
|
71
|
+
}
|
|
72
|
+
.svadmin-app-shell__topbar-start,
|
|
73
|
+
.svadmin-app-shell__topbar-end {
|
|
74
|
+
display: flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
min-width: 0;
|
|
77
|
+
gap: var(--svadmin-space-2);
|
|
78
|
+
}
|
|
79
|
+
.svadmin-app-shell__topbar-main {
|
|
80
|
+
display: flex;
|
|
81
|
+
flex: 1 1 auto;
|
|
82
|
+
align-items: center;
|
|
83
|
+
min-width: 0;
|
|
84
|
+
gap: var(--svadmin-space-3);
|
|
85
|
+
}
|
|
86
|
+
.svadmin-app-shell__topbar-end {
|
|
87
|
+
flex: 0 0 auto;
|
|
88
|
+
justify-content: flex-end;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.svadmin-app-shell__sidebar {
|
|
92
|
+
grid-area: sidebar;
|
|
93
|
+
display: flex;
|
|
94
|
+
flex-direction: column;
|
|
95
|
+
min-width: 0;
|
|
96
|
+
min-height: 0;
|
|
97
|
+
border-inline-end: 1px solid var(--sidebar-border, var(--border));
|
|
98
|
+
background: var(--sidebar, var(--card));
|
|
99
|
+
color: var(--sidebar-foreground, var(--foreground));
|
|
100
|
+
overflow-y: auto;
|
|
101
|
+
overscroll-behavior: contain;
|
|
102
|
+
}
|
|
103
|
+
.svadmin-app-shell__sidebar-inner {
|
|
104
|
+
display: flex;
|
|
105
|
+
flex: 1 1 auto;
|
|
106
|
+
flex-direction: column;
|
|
107
|
+
gap: var(--svadmin-space-2);
|
|
108
|
+
min-width: 0;
|
|
109
|
+
padding: var(--svadmin-space-3) var(--svadmin-space-2);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.svadmin-app-shell__main {
|
|
113
|
+
grid-area: main;
|
|
114
|
+
display: flex;
|
|
115
|
+
flex-direction: column;
|
|
116
|
+
min-width: 0;
|
|
117
|
+
min-height: 0;
|
|
118
|
+
}
|
|
119
|
+
.svadmin-app-shell__body {
|
|
120
|
+
display: grid;
|
|
121
|
+
grid-template-columns: minmax(0, 1fr);
|
|
122
|
+
align-items: start;
|
|
123
|
+
gap: var(--svadmin-section-gap);
|
|
124
|
+
width: 100%;
|
|
125
|
+
max-width: var(--svadmin-shell-max);
|
|
126
|
+
margin-inline: auto;
|
|
127
|
+
padding: var(--svadmin-shell-gutter);
|
|
128
|
+
min-width: 0;
|
|
129
|
+
}
|
|
130
|
+
.svadmin-app-shell__content {
|
|
131
|
+
display: grid;
|
|
132
|
+
gap: var(--svadmin-section-gap);
|
|
133
|
+
min-width: 0;
|
|
134
|
+
}
|
|
135
|
+
.svadmin-app-shell__aside {
|
|
136
|
+
display: grid;
|
|
137
|
+
gap: var(--svadmin-section-gap);
|
|
138
|
+
min-width: 0;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.svadmin-app-shell__footer {
|
|
142
|
+
grid-area: footer;
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-wrap: wrap;
|
|
145
|
+
align-items: center;
|
|
146
|
+
justify-content: space-between;
|
|
147
|
+
gap: var(--svadmin-space-2);
|
|
148
|
+
width: 100%;
|
|
149
|
+
max-width: var(--svadmin-shell-max);
|
|
150
|
+
margin-inline: auto;
|
|
151
|
+
border-top: 1px solid var(--border);
|
|
152
|
+
padding: var(--svadmin-space-3) var(--svadmin-shell-gutter);
|
|
153
|
+
color: var(--muted-foreground);
|
|
154
|
+
font-size: var(--svadmin-text-caption);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* The mobile navigation trigger only exists below the sidebar breakpoint. */
|
|
158
|
+
.svadmin-app-shell__mobile-toggle {
|
|
159
|
+
display: none;
|
|
160
|
+
}
|
|
161
|
+
.svadmin-app-shell__scrim {
|
|
162
|
+
display: none;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
@media (max-width: 63.999rem) {
|
|
166
|
+
.svadmin-app-shell[data-sidebar="true"] {
|
|
167
|
+
grid-template-columns: minmax(0, 1fr);
|
|
168
|
+
grid-template-areas:
|
|
169
|
+
"topbar"
|
|
170
|
+
"main"
|
|
171
|
+
"footer";
|
|
172
|
+
}
|
|
173
|
+
.svadmin-app-shell[data-aside="true"] .svadmin-app-shell__body {
|
|
174
|
+
grid-template-columns: minmax(0, 1fr);
|
|
175
|
+
}
|
|
176
|
+
.svadmin-app-shell__mobile-toggle {
|
|
177
|
+
display: inline-flex;
|
|
178
|
+
}
|
|
179
|
+
.svadmin-app-shell__sidebar {
|
|
180
|
+
position: fixed;
|
|
181
|
+
z-index: 45;
|
|
182
|
+
inset-block: var(--svadmin-shell-topbar-h) 0;
|
|
183
|
+
inset-inline-start: 0;
|
|
184
|
+
width: var(--svadmin-shell-sidebar-w);
|
|
185
|
+
max-width: 85vw;
|
|
186
|
+
box-shadow: var(--shadow-overlay);
|
|
187
|
+
transform: translateX(-100%);
|
|
188
|
+
visibility: hidden;
|
|
189
|
+
transition: transform var(--svadmin-motion-standard) var(--svadmin-motion-easing), visibility var(--svadmin-motion-standard);
|
|
190
|
+
}
|
|
191
|
+
[dir="rtl"] .svadmin-app-shell__sidebar {
|
|
192
|
+
transform: translateX(100%);
|
|
193
|
+
}
|
|
194
|
+
.svadmin-app-shell[data-mobile-open="true"] .svadmin-app-shell__sidebar {
|
|
195
|
+
transform: none;
|
|
196
|
+
visibility: visible;
|
|
197
|
+
}
|
|
198
|
+
.svadmin-app-shell[data-mobile-open="true"] .svadmin-app-shell__scrim {
|
|
199
|
+
display: block;
|
|
200
|
+
position: fixed;
|
|
201
|
+
z-index: 40;
|
|
202
|
+
inset: var(--svadmin-shell-topbar-h) 0 0;
|
|
203
|
+
border: 0;
|
|
204
|
+
background: var(--foreground);
|
|
205
|
+
opacity: 0.28;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* 窄视口下页面容器自己承担横向留白,外壳不再重复叠加。 */
|
|
211
|
+
@media (max-width: 40rem) {
|
|
212
|
+
.svadmin-app-shell {
|
|
213
|
+
--svadmin-shell-gutter: var(--svadmin-space-4);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|