@svadmin/ui 0.85.0 → 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.
Files changed (69) hide show
  1. package/README.md +29 -0
  2. package/dist/app-shell.css +216 -0
  3. package/dist/app.css +483 -172
  4. package/dist/app.theme.css +483 -172
  5. package/dist/component-registry.d.ts +7292 -529
  6. package/dist/component-registry.js +32 -3
  7. package/dist/components/AppShellPage.svelte +172 -0
  8. package/dist/components/AppShellPage.svelte.d.ts +30 -0
  9. package/dist/components/AutoForm.svelte +7 -12
  10. package/dist/components/AutoForm.svelte.d.ts +0 -1
  11. package/dist/components/AutoTable.svelte +2 -0
  12. package/dist/components/AutoTable.svelte.d.ts +2 -0
  13. package/dist/components/ConfigurationPage.svelte +0 -3
  14. package/dist/components/ConfigurationPage.svelte.d.ts +0 -1
  15. package/dist/components/CreatePage.svelte +1 -5
  16. package/dist/components/CreatePage.svelte.d.ts +0 -1
  17. package/dist/components/EditPage.svelte +1 -5
  18. package/dist/components/EditPage.svelte.d.ts +0 -1
  19. package/dist/components/FieldRenderer.svelte +2 -10
  20. package/dist/components/FieldRenderer.svelte.d.ts +0 -1
  21. package/dist/components/ListPage.svelte +2 -5
  22. package/dist/components/ListPage.svelte.d.ts +0 -1
  23. package/dist/components/PageHeader.svelte +1 -3
  24. package/dist/components/PageHeader.svelte.d.ts +0 -1
  25. package/dist/components/PagePattern.svelte +36 -13
  26. package/dist/components/PagePattern.svelte.d.ts +7 -0
  27. package/dist/components/QuickEditDrawer.svelte +0 -1
  28. package/dist/components/ShowPage.svelte +5 -9
  29. package/dist/components/ShowPage.svelte.d.ts +0 -1
  30. package/dist/components/SvarAutoTable.svelte +2 -1
  31. package/dist/components/SvarDataGrid.svelte +8 -4
  32. package/dist/components/SvarDataGrid.svelte.d.ts +3 -0
  33. package/dist/components/SvarResourceTable.svelte +0 -1
  34. package/dist/components/SvarResourceTable.svelte.d.ts +0 -1
  35. package/dist/components/SvarResourceTableView.svelte +2 -2
  36. package/dist/components/auto-table-grid.d.ts +1 -0
  37. package/dist/components/content/ContentPageHeader.svelte +2 -1
  38. package/dist/components/content/ContentPageHeader.svelte.d.ts +1 -0
  39. package/dist/components/content/ContentPageShell.svelte +1 -1
  40. package/dist/components/content/ContentPageShell.svelte.d.ts +1 -0
  41. package/dist/components/content/DataPanel.svelte +58 -0
  42. package/dist/components/content/DataPanel.svelte.d.ts +16 -0
  43. package/dist/components/content/DescriptionList.svelte +5 -8
  44. package/dist/components/content/DescriptionList.svelte.d.ts +0 -1
  45. package/dist/components/content/FilterToolbar.svelte +2 -5
  46. package/dist/components/content/FilterToolbar.svelte.d.ts +0 -1
  47. package/dist/components/content/NetworkTable.svelte +3 -3
  48. package/dist/components/content/NetworkTable.svelte.d.ts +0 -1
  49. package/dist/components/content/PageSection.svelte +1 -1
  50. package/dist/components/content/StatusTabs.svelte +2 -7
  51. package/dist/components/content/StatusTabs.svelte.d.ts +0 -1
  52. package/dist/components/content/index.d.ts +1 -0
  53. package/dist/components/content/index.js +1 -0
  54. package/dist/components/ui/table/index.d.ts +0 -1
  55. package/dist/components/ui/table/table.svelte +1 -0
  56. package/dist/components/ui/table/table.svelte.d.ts +1 -0
  57. package/dist/components.css +1 -11
  58. package/dist/data-panel.css +88 -0
  59. package/dist/design-contract.d.ts +11 -0
  60. package/dist/design-contract.js +8 -0
  61. package/dist/design-system.d.ts +3 -2
  62. package/dist/design-system.js +3 -2
  63. package/dist/index.d.ts +4 -2
  64. package/dist/index.js +2 -0
  65. package/dist/page-chrome.css +40 -62
  66. package/dist/recipes.d.ts +67 -154
  67. package/dist/recipes.js +32 -68
  68. package/dist/styles/recipes.css +15 -48
  69. 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
+ }