sveltekit-admin 0.6.0 → 0.9.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 +61 -4
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -1
- package/dist/server/adapters/drizzle/dataAdapter.js +196 -42
- package/dist/server/adapters/drizzle/index.d.ts +10 -1
- package/dist/server/adapters/drizzle/index.js +4 -0
- package/dist/server/adapters/prisma/dataAdapter.js +71 -11
- package/dist/server/adapters/prisma/handler.d.ts +14 -0
- package/dist/server/adapters/prisma/handler.js +37 -0
- package/dist/server/adapters/retry.d.ts +27 -0
- package/dist/server/adapters/retry.js +53 -0
- package/dist/server/adapters/types.d.ts +42 -3
- package/dist/server/audit.d.ts +65 -0
- package/dist/server/audit.js +106 -0
- package/dist/server/csrf.d.ts +33 -0
- package/dist/server/csrf.js +55 -0
- package/dist/server/data.d.ts +18 -2
- package/dist/server/data.js +39 -8
- package/dist/server/errors.d.ts +47 -0
- package/dist/server/errors.js +90 -0
- package/dist/server/handler.d.ts +92 -26
- package/dist/server/handler.js +263 -560
- package/dist/server/introspection/parser.d.ts +15 -0
- package/dist/server/introspection/parser.js +17 -0
- package/dist/server/mutations.d.ts +13 -0
- package/dist/server/mutations.js +476 -0
- package/dist/server/plugin.d.ts +47 -0
- package/dist/server/plugin.js +1 -0
- package/dist/server/pluginAccess.d.ts +7 -0
- package/dist/server/pluginAccess.js +79 -0
- package/dist/server/pluginRegistry.d.ts +12 -0
- package/dist/server/pluginRegistry.js +72 -0
- package/dist/server/query/listColumns.d.ts +19 -0
- package/dist/server/query/listColumns.js +43 -0
- package/dist/server/query/listQuery.d.ts +1 -1
- package/dist/server/query/pageSize.d.ts +19 -0
- package/dist/server/query/pageSize.js +26 -0
- package/dist/server/query/sortQuery.d.ts +31 -0
- package/dist/server/query/sortQuery.js +33 -0
- package/dist/server/query/urls.js +9 -1
- package/dist/server/relationLoaders.d.ts +42 -0
- package/dist/server/relationLoaders.js +188 -0
- package/dist/server/router.d.ts +10 -0
- package/dist/server/router.js +42 -19
- package/dist/server/runtime.d.ts +51 -0
- package/dist/server/runtime.js +263 -0
- package/dist/server/search.d.ts +14 -0
- package/dist/server/search.js +78 -0
- package/dist/server/submitted.d.ts +20 -0
- package/dist/server/submitted.js +54 -0
- package/dist/server/views/FieldInput.svelte +114 -8
- package/dist/server/views/FieldInput.svelte.d.ts +7 -0
- package/dist/server/views/Form.svelte +96 -5
- package/dist/server/views/Form.svelte.d.ts +19 -1
- package/dist/server/views/Layout.svelte +32 -4
- package/dist/server/views/Layout.svelte.d.ts +2 -0
- package/dist/server/views/List.svelte +156 -26
- package/dist/server/views/List.svelte.d.ts +7 -2
- package/dist/server/views/RelationCheckboxes.svelte +26 -5
- package/dist/server/views/RelationCheckboxes.svelte.d.ts +9 -0
- package/dist/server/views/RelationSelect.svelte +14 -3
- package/dist/server/views/RelationSelect.svelte.d.ts +2 -0
- package/dist/server/views/html.d.ts +19 -0
- package/dist/server/views/html.js +25 -0
- package/dist/server/views/pagination.d.ts +9 -0
- package/dist/server/views/pagination.js +31 -0
- package/dist/server/views/theme.js +147 -3
- package/dist/server/views/types.d.ts +15 -0
- package/package.json +24 -21
|
@@ -182,6 +182,45 @@ export function styles(primaryColor) {
|
|
|
182
182
|
letter-spacing: 0.05em;
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
+
.ska-pagination__pages {
|
|
186
|
+
display: flex;
|
|
187
|
+
align-items: center;
|
|
188
|
+
gap: 0.25rem;
|
|
189
|
+
flex-wrap: wrap;
|
|
190
|
+
}
|
|
191
|
+
.ska-pagination__gap { padding: 0 0.25rem; color: #64748b; }
|
|
192
|
+
.ska-bulk { margin-bottom: 0.75rem; }
|
|
193
|
+
.ska-table__select { width: 2.5rem; text-align: center; }
|
|
194
|
+
.ska-alert--success {
|
|
195
|
+
background: #f0fdf4;
|
|
196
|
+
border-color: #bbf7d0;
|
|
197
|
+
color: #166534;
|
|
198
|
+
}
|
|
199
|
+
.ska-pagination__sizes {
|
|
200
|
+
display: flex;
|
|
201
|
+
align-items: center;
|
|
202
|
+
gap: 0.25rem;
|
|
203
|
+
flex-wrap: wrap;
|
|
204
|
+
}
|
|
205
|
+
.ska-pagination__current {
|
|
206
|
+
background: var(--ska-primary);
|
|
207
|
+
color: #fff;
|
|
208
|
+
border-color: var(--ska-primary);
|
|
209
|
+
cursor: default;
|
|
210
|
+
}
|
|
211
|
+
.ska-table th a.ska-th-sort {
|
|
212
|
+
color: inherit;
|
|
213
|
+
text-decoration: none;
|
|
214
|
+
display: inline-flex;
|
|
215
|
+
align-items: center;
|
|
216
|
+
gap: 0.25rem;
|
|
217
|
+
}
|
|
218
|
+
.ska-table th a.ska-th-sort:hover { text-decoration: underline; }
|
|
219
|
+
.ska-table th a.ska-th-sort:focus-visible {
|
|
220
|
+
outline: 2px solid var(--ska-primary);
|
|
221
|
+
outline-offset: 2px;
|
|
222
|
+
border-radius: 2px;
|
|
223
|
+
}
|
|
185
224
|
.ska-table td {
|
|
186
225
|
padding: 0.75rem 1rem;
|
|
187
226
|
border-bottom: 1px solid #e2e8f0;
|
|
@@ -220,10 +259,15 @@ export function styles(primaryColor) {
|
|
|
220
259
|
transition: all 0.15s;
|
|
221
260
|
}
|
|
222
261
|
|
|
223
|
-
|
|
224
|
-
|
|
262
|
+
/* 'outline: none' remplacé par un box-shadow à 10 % d'opacité donnait un
|
|
263
|
+
contraste d'environ 1,1:1 contre le fond blanc — soit, en pratique, aucun
|
|
264
|
+
indicateur de focus. Le contour reprend la couleur de marque, qui est
|
|
265
|
+
elle contrastée, et le box-shadow ne fait plus que l'accompagner. */
|
|
266
|
+
.ska-input:focus-visible {
|
|
267
|
+
outline: 2px solid var(--ska-primary);
|
|
268
|
+
outline-offset: 1px;
|
|
225
269
|
border-color: var(--ska-primary);
|
|
226
|
-
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.
|
|
270
|
+
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);
|
|
227
271
|
}
|
|
228
272
|
|
|
229
273
|
.ska-input[readonly] {
|
|
@@ -231,6 +275,25 @@ export function styles(primaryColor) {
|
|
|
231
275
|
color: #6b7280;
|
|
232
276
|
}
|
|
233
277
|
|
|
278
|
+
/* Sélecteur d'attribut et non une classe : aria-invalid est déjà la source
|
|
279
|
+
de vérité pour les lecteurs d'écran, une classe parallèle finirait par en
|
|
280
|
+
diverger. */
|
|
281
|
+
.ska-input[aria-invalid='true'] {
|
|
282
|
+
border-color: #dc2626;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.ska-input[aria-invalid='true']:focus-visible {
|
|
286
|
+
outline-color: #dc2626;
|
|
287
|
+
border-color: #dc2626;
|
|
288
|
+
box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.ska-field__error {
|
|
292
|
+
margin-top: 0.375rem;
|
|
293
|
+
font-size: 0.8125rem;
|
|
294
|
+
color: #b91c1c;
|
|
295
|
+
}
|
|
296
|
+
|
|
234
297
|
.ska-checkbox-wrap {
|
|
235
298
|
display: flex;
|
|
236
299
|
align-items: center;
|
|
@@ -533,5 +596,86 @@ export function styles(primaryColor) {
|
|
|
533
596
|
color: #16a34a;
|
|
534
597
|
border: 1px solid #bbf7d0;
|
|
535
598
|
}
|
|
599
|
+
|
|
600
|
+
/* Hors flux tant qu'il n'est pas ciblé : 'display: none' le retirerait de
|
|
601
|
+
l'ordre de tabulation, ce qui le rendrait inatteignable — donc inutile. */
|
|
602
|
+
.ska-skip {
|
|
603
|
+
position: absolute;
|
|
604
|
+
left: -9999px;
|
|
605
|
+
top: 0;
|
|
606
|
+
background: var(--ska-primary);
|
|
607
|
+
color: #fff;
|
|
608
|
+
padding: 0.625rem 1rem;
|
|
609
|
+
border-radius: 0 0 0.375rem 0;
|
|
610
|
+
z-index: 100;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
.ska-skip:focus {
|
|
614
|
+
left: 0;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/* Un seul contour, de la couleur de marque, sur tout ce qui prend le focus.
|
|
618
|
+
'focus-visible' et non 'focus' : le contour apparaît au clavier sans
|
|
619
|
+
s'afficher au clic à la souris. La cible du lien d'évitement porte
|
|
620
|
+
tabindex="-1" pour être focusable par programme, mais elle ne doit pas
|
|
621
|
+
dessiner de contour pour autant. */
|
|
622
|
+
.ska-btn:focus-visible,
|
|
623
|
+
.ska-nav__link:focus-visible,
|
|
624
|
+
.ska-logo:focus-visible,
|
|
625
|
+
.ska-back:focus-visible,
|
|
626
|
+
.ska-checkbox:focus-visible,
|
|
627
|
+
.ska-logout__btn:focus-visible,
|
|
628
|
+
.ska-skip:focus-visible {
|
|
629
|
+
outline: 2px solid var(--ska-primary);
|
|
630
|
+
outline-offset: 2px;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
.ska-main:focus-visible { outline: none; }
|
|
634
|
+
|
|
635
|
+
/* La sidebar était fixe à 260px et le contenu décalé d'autant : sur un
|
|
636
|
+
écran de 375px il restait 115px utilisables. Elle repasse dans le flux et
|
|
637
|
+
la navigation devient horizontale. */
|
|
638
|
+
@media (max-width: 900px) {
|
|
639
|
+
.ska-layout { flex-direction: column; }
|
|
640
|
+
|
|
641
|
+
.ska-sidebar {
|
|
642
|
+
position: static;
|
|
643
|
+
width: auto;
|
|
644
|
+
height: auto;
|
|
645
|
+
border-right: none;
|
|
646
|
+
border-bottom: 1px solid #e2e8f0;
|
|
647
|
+
padding: 1rem;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
.ska-nav {
|
|
651
|
+
display: flex;
|
|
652
|
+
flex-wrap: wrap;
|
|
653
|
+
gap: 0.25rem;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
.ska-nav__item { margin-bottom: 0; }
|
|
657
|
+
|
|
658
|
+
.ska-main {
|
|
659
|
+
margin-left: 0;
|
|
660
|
+
padding: 1rem;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
.ska-header {
|
|
664
|
+
flex-direction: column;
|
|
665
|
+
gap: 0.75rem;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
.ska-form { max-width: none; }
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/* Cinq 'transition: all' vivent dans cette feuille. Le réglage système est
|
|
672
|
+
une demande explicite, pas une préférence esthétique. */
|
|
673
|
+
@media (prefers-reduced-motion: reduce) {
|
|
674
|
+
* {
|
|
675
|
+
transition-duration: 0.01ms !important;
|
|
676
|
+
animation-duration: 0.01ms !important;
|
|
677
|
+
scroll-behavior: auto !important;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
536
680
|
`;
|
|
537
681
|
}
|
|
@@ -16,12 +16,27 @@ export interface ViewModel {
|
|
|
16
16
|
label: string;
|
|
17
17
|
fields: PrismaField[];
|
|
18
18
|
primaryKey: string;
|
|
19
|
+
/**
|
|
20
|
+
* Valeurs déclarées de chaque enum du schéma, indexées par nom de type.
|
|
21
|
+
* Portées par le ViewModel plutôt que passées à part comme le fait
|
|
22
|
+
* `filterDetection` : le formulaire résout un enum champ par champ, et un
|
|
23
|
+
* second chemin d'acheminement vers les mêmes valeurs finirait par diverger.
|
|
24
|
+
*/
|
|
25
|
+
enums?: Map<string, string[]>;
|
|
19
26
|
relationGraph?: RelationGraph;
|
|
20
27
|
/** Options résolues pour chaque arête to-one-owning, indexées par "Model.field" */
|
|
21
28
|
relationOptions?: Map<string, RelationMeta>;
|
|
22
29
|
/** Compteurs des relations inverses (1-N, 1-1), indexés par "Model.field" */
|
|
23
30
|
relatedCounts?: Map<string, number>;
|
|
24
31
|
}
|
|
32
|
+
export interface RecordAction {
|
|
33
|
+
label: string;
|
|
34
|
+
href: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ListRecordAction {
|
|
37
|
+
label: string;
|
|
38
|
+
hrefFor: (id: string | number) => string;
|
|
39
|
+
}
|
|
25
40
|
/**
|
|
26
41
|
* Résolution async d'un filtre FK (kind 'fk' dans ResolvedFilterField) :
|
|
27
42
|
* options scopées pour la sidebar + label du chip actif scopé lui aussi
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sveltekit-admin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Django-like admin panel for SvelteKit + Prisma",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"svelte": "./dist/index.js",
|
|
@@ -22,23 +22,8 @@
|
|
|
22
22
|
"!dist/**/*.test.*",
|
|
23
23
|
"!dist/**/*.spec.*"
|
|
24
24
|
],
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"build": "npm run package",
|
|
28
|
-
"package": "svelte-kit sync && svelte-package -o dist && echo 'Package size:' && bun pm pack --dry-run 2>&1 | grep -E 'Total files|Unpacked size'",
|
|
29
|
-
"prepublishOnly": "npm run package",
|
|
30
|
-
"size": "bun run package && node scripts/package-size.mjs",
|
|
31
|
-
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
32
|
-
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
33
|
-
"test:gen": "prisma generate --schema tests/fixtures/prisma/schema.prisma",
|
|
34
|
-
"test": "svelte-kit sync && npm run test:gen && vitest run",
|
|
35
|
-
"test:watch": "svelte-kit sync && npm run test:gen && vitest",
|
|
36
|
-
"test:coverage": "svelte-kit sync && npm run test:gen && vitest run --coverage",
|
|
37
|
-
"lint": "svelte-kit sync && eslint .",
|
|
38
|
-
"format": "prettier --write .",
|
|
39
|
-
"changeset": "changeset",
|
|
40
|
-
"version-packages": "changeset version",
|
|
41
|
-
"release": "npm run package && changeset publish"
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"provenance": true
|
|
42
27
|
},
|
|
43
28
|
"peerDependencies": {
|
|
44
29
|
"@prisma/client": ">=5.0.0",
|
|
@@ -55,7 +40,7 @@
|
|
|
55
40
|
}
|
|
56
41
|
},
|
|
57
42
|
"devDependencies": {
|
|
58
|
-
"@changesets/cli": "^3.0.
|
|
43
|
+
"@changesets/cli": "^3.0.1",
|
|
59
44
|
"@eslint/js": "9",
|
|
60
45
|
"@prisma/client": "^6.19.3",
|
|
61
46
|
"@sveltejs/adapter-auto": "^7.0.1",
|
|
@@ -98,5 +83,23 @@
|
|
|
98
83
|
"bugs": {
|
|
99
84
|
"url": "https://github.com/dotNacer/sveltekit-admin/issues"
|
|
100
85
|
},
|
|
101
|
-
"author": "dotNacer"
|
|
102
|
-
|
|
86
|
+
"author": "dotNacer",
|
|
87
|
+
"scripts": {
|
|
88
|
+
"dev": "vite dev",
|
|
89
|
+
"build": "pnpm run package",
|
|
90
|
+
"package": "svelte-kit sync && svelte-package -o dist",
|
|
91
|
+
"size": "pnpm run package && node scripts/package-size.mjs",
|
|
92
|
+
"smoke:packaged": "node scripts/consumer-smoke.mjs",
|
|
93
|
+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
94
|
+
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
95
|
+
"test:gen": "prisma generate --schema tests/fixtures/prisma/schema.prisma",
|
|
96
|
+
"test": "svelte-kit sync && pnpm run test:gen && vitest run",
|
|
97
|
+
"test:watch": "svelte-kit sync && pnpm run test:gen && vitest",
|
|
98
|
+
"test:coverage": "svelte-kit sync && pnpm run test:gen && vitest run --coverage",
|
|
99
|
+
"lint": "svelte-kit sync && eslint .",
|
|
100
|
+
"format": "prettier --write .",
|
|
101
|
+
"changeset": "changeset",
|
|
102
|
+
"version-packages": "changeset version",
|
|
103
|
+
"release": "pnpm run package && changeset publish"
|
|
104
|
+
}
|
|
105
|
+
}
|