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.
Files changed (69) hide show
  1. package/README.md +61 -4
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.js +1 -1
  4. package/dist/server/adapters/drizzle/dataAdapter.js +196 -42
  5. package/dist/server/adapters/drizzle/index.d.ts +10 -1
  6. package/dist/server/adapters/drizzle/index.js +4 -0
  7. package/dist/server/adapters/prisma/dataAdapter.js +71 -11
  8. package/dist/server/adapters/prisma/handler.d.ts +14 -0
  9. package/dist/server/adapters/prisma/handler.js +37 -0
  10. package/dist/server/adapters/retry.d.ts +27 -0
  11. package/dist/server/adapters/retry.js +53 -0
  12. package/dist/server/adapters/types.d.ts +42 -3
  13. package/dist/server/audit.d.ts +65 -0
  14. package/dist/server/audit.js +106 -0
  15. package/dist/server/csrf.d.ts +33 -0
  16. package/dist/server/csrf.js +55 -0
  17. package/dist/server/data.d.ts +18 -2
  18. package/dist/server/data.js +39 -8
  19. package/dist/server/errors.d.ts +47 -0
  20. package/dist/server/errors.js +90 -0
  21. package/dist/server/handler.d.ts +92 -26
  22. package/dist/server/handler.js +263 -560
  23. package/dist/server/introspection/parser.d.ts +15 -0
  24. package/dist/server/introspection/parser.js +17 -0
  25. package/dist/server/mutations.d.ts +13 -0
  26. package/dist/server/mutations.js +476 -0
  27. package/dist/server/plugin.d.ts +47 -0
  28. package/dist/server/plugin.js +1 -0
  29. package/dist/server/pluginAccess.d.ts +7 -0
  30. package/dist/server/pluginAccess.js +79 -0
  31. package/dist/server/pluginRegistry.d.ts +12 -0
  32. package/dist/server/pluginRegistry.js +72 -0
  33. package/dist/server/query/listColumns.d.ts +19 -0
  34. package/dist/server/query/listColumns.js +43 -0
  35. package/dist/server/query/listQuery.d.ts +1 -1
  36. package/dist/server/query/pageSize.d.ts +19 -0
  37. package/dist/server/query/pageSize.js +26 -0
  38. package/dist/server/query/sortQuery.d.ts +31 -0
  39. package/dist/server/query/sortQuery.js +33 -0
  40. package/dist/server/query/urls.js +9 -1
  41. package/dist/server/relationLoaders.d.ts +42 -0
  42. package/dist/server/relationLoaders.js +188 -0
  43. package/dist/server/router.d.ts +10 -0
  44. package/dist/server/router.js +42 -19
  45. package/dist/server/runtime.d.ts +51 -0
  46. package/dist/server/runtime.js +263 -0
  47. package/dist/server/search.d.ts +14 -0
  48. package/dist/server/search.js +78 -0
  49. package/dist/server/submitted.d.ts +20 -0
  50. package/dist/server/submitted.js +54 -0
  51. package/dist/server/views/FieldInput.svelte +114 -8
  52. package/dist/server/views/FieldInput.svelte.d.ts +7 -0
  53. package/dist/server/views/Form.svelte +96 -5
  54. package/dist/server/views/Form.svelte.d.ts +19 -1
  55. package/dist/server/views/Layout.svelte +32 -4
  56. package/dist/server/views/Layout.svelte.d.ts +2 -0
  57. package/dist/server/views/List.svelte +156 -26
  58. package/dist/server/views/List.svelte.d.ts +7 -2
  59. package/dist/server/views/RelationCheckboxes.svelte +26 -5
  60. package/dist/server/views/RelationCheckboxes.svelte.d.ts +9 -0
  61. package/dist/server/views/RelationSelect.svelte +14 -3
  62. package/dist/server/views/RelationSelect.svelte.d.ts +2 -0
  63. package/dist/server/views/html.d.ts +19 -0
  64. package/dist/server/views/html.js +25 -0
  65. package/dist/server/views/pagination.d.ts +9 -0
  66. package/dist/server/views/pagination.js +31 -0
  67. package/dist/server/views/theme.js +147 -3
  68. package/dist/server/views/types.d.ts +15 -0
  69. 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
- .ska-input:focus {
224
- outline: none;
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.1);
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.6.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
- "scripts": {
26
- "dev": "vite dev",
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.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
+ }