includio-cms 0.5.3 → 0.5.7

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 (109) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/ROADMAP.md +33 -0
  3. package/dist/admin/api/rest/handler.d.ts +7 -0
  4. package/dist/admin/api/rest/handler.js +116 -0
  5. package/dist/admin/api/rest/middleware/apiKey.d.ts +6 -0
  6. package/dist/admin/api/rest/middleware/apiKey.js +45 -0
  7. package/dist/admin/api/rest/routes/collections.d.ts +5 -0
  8. package/dist/admin/api/rest/routes/collections.js +104 -0
  9. package/dist/admin/api/rest/routes/entries.d.ts +2 -0
  10. package/dist/admin/api/rest/routes/entries.js +37 -0
  11. package/dist/admin/api/rest/routes/languages.d.ts +1 -0
  12. package/dist/admin/api/rest/routes/languages.js +5 -0
  13. package/dist/admin/api/rest/routes/schema.d.ts +2 -0
  14. package/dist/admin/api/rest/routes/schema.js +78 -0
  15. package/dist/admin/api/rest/routes/singletons.d.ts +3 -0
  16. package/dist/admin/api/rest/routes/singletons.js +60 -0
  17. package/dist/admin/auth-client.d.ts +48 -48
  18. package/dist/admin/client/admin/admin-after-login-layout.svelte +5 -3
  19. package/dist/admin/client/admin/admin-layout.svelte +0 -2
  20. package/dist/admin/client/collection/bulk-actions-bar.svelte +3 -1
  21. package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +1 -1
  22. package/dist/admin/client/collection/collection-entries.svelte +334 -166
  23. package/dist/admin/client/collection/collection-page.svelte +6 -3
  24. package/dist/admin/client/collection/data-table.svelte +127 -18
  25. package/dist/admin/client/collection/data-table.svelte.d.ts +2 -0
  26. package/dist/admin/client/collection/row-actions.svelte +3 -1
  27. package/dist/admin/client/collection/row-actions.svelte.d.ts +1 -1
  28. package/dist/admin/client/entry/entry-page.svelte +5 -4
  29. package/dist/admin/client/form/form-config-wrapper.svelte +5 -3
  30. package/dist/admin/client/form/form-page.svelte +5 -5
  31. package/dist/admin/client/form/form-submission/form-submission-page.svelte +30 -32
  32. package/dist/admin/components/accessibility/accessibility-overview.svelte +7 -5
  33. package/dist/admin/components/accessibility/accessibility-overview.svelte.d.ts +2 -17
  34. package/dist/admin/components/dashboard/a11y-gauge.svelte +7 -4
  35. package/dist/admin/components/dashboard/a11y-gauge.svelte.d.ts +2 -17
  36. package/dist/admin/components/dashboard/accessibility-hub.svelte +7 -4
  37. package/dist/admin/components/dashboard/accessibility-hub.svelte.d.ts +2 -17
  38. package/dist/admin/components/dashboard/form-submissions-widget.svelte +8 -3
  39. package/dist/admin/components/dashboard/form-submissions-widget.svelte.d.ts +2 -17
  40. package/dist/admin/components/dashboard/recent-activity.svelte +8 -3
  41. package/dist/admin/components/dashboard/recent-activity.svelte.d.ts +2 -17
  42. package/dist/admin/components/dashboard/recent-entries.svelte +8 -3
  43. package/dist/admin/components/dashboard/recent-entries.svelte.d.ts +2 -17
  44. package/dist/admin/components/fields/image-field.svelte +21 -20
  45. package/dist/admin/components/fields/media-field.svelte +45 -44
  46. package/dist/admin/components/fields/relation-field.svelte +428 -149
  47. package/dist/admin/components/fields/relation-picker-dialog.svelte +112 -0
  48. package/dist/admin/components/fields/relation-picker-dialog.svelte.d.ts +22 -0
  49. package/dist/admin/components/fields/seo-field.svelte +66 -10
  50. package/dist/admin/components/icons/icon-map.d.ts +4 -0
  51. package/dist/admin/components/icons/icon-map.js +143 -0
  52. package/dist/admin/components/layout/header-actions.svelte +0 -10
  53. package/dist/admin/components/layout/nav-collections.svelte +55 -57
  54. package/dist/admin/components/layout/nav-collections.svelte.d.ts +2 -17
  55. package/dist/admin/components/layout/nav-forms.svelte +49 -49
  56. package/dist/admin/components/layout/nav-forms.svelte.d.ts +2 -17
  57. package/dist/admin/components/layout/nav-search.svelte +15 -22
  58. package/dist/admin/components/layout/nav-singletons.svelte +35 -38
  59. package/dist/admin/components/layout/nav-singletons.svelte.d.ts +2 -17
  60. package/dist/admin/components/media/file/file-preview.svelte +92 -91
  61. package/dist/admin/components/media/file-preview.svelte +17 -18
  62. package/dist/admin/components/media/media-library.svelte +39 -41
  63. package/dist/admin/components/media/media-selector.svelte +8 -8
  64. package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +6 -8
  65. package/dist/admin/components/tiptap/content-editor.svelte +2 -2
  66. package/dist/admin/components/tiptap/editor-toolbar.svelte +1 -1
  67. package/dist/admin/components/tiptap/inline-block-node.d.ts +1 -0
  68. package/dist/admin/components/tiptap/inline-block-node.js +12 -1
  69. package/dist/admin/components/tiptap/tiptap-editor.svelte +1 -1
  70. package/dist/admin/remote/entry.remote.d.ts +20 -1
  71. package/dist/admin/remote/entry.remote.js +24 -3
  72. package/dist/admin/remote/invite.d.ts +2 -2
  73. package/dist/cli/scaffold/admin.js +8 -0
  74. package/dist/cms/runtime/remote.d.ts +8 -0
  75. package/dist/cms/runtime/remote.js +7 -0
  76. package/dist/cms/runtime/types.d.ts +1 -1
  77. package/dist/components/ui/input/input.svelte.d.ts +1 -1
  78. package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
  79. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
  80. package/dist/components/ui/sonner/sonner.svelte +1 -2
  81. package/dist/core/cms.d.ts +2 -1
  82. package/dist/core/cms.js +2 -0
  83. package/dist/core/server/entries/operations/get.d.ts +11 -0
  84. package/dist/core/server/entries/operations/get.js +63 -1
  85. package/dist/core/server/entries/operations/update.d.ts +1 -0
  86. package/dist/core/server/entries/operations/update.js +5 -1
  87. package/dist/core/server/fields/resolveUrlFields.js +49 -18
  88. package/dist/db-postgres/schema/entry.d.ts +17 -0
  89. package/dist/db-postgres/schema/entry.js +4 -2
  90. package/dist/server/auth.d.ts +4 -4
  91. package/dist/sveltekit/components/structured-content.svelte +18 -5
  92. package/dist/sveltekit/server/handle.js +1 -0
  93. package/dist/types/cms.d.ts +7 -0
  94. package/dist/types/collections.d.ts +2 -0
  95. package/dist/types/config.d.ts +2 -2
  96. package/dist/types/entries.d.ts +7 -1
  97. package/dist/types/forms.d.ts +2 -0
  98. package/dist/types/index.d.ts +2 -1
  99. package/dist/types/index.js +1 -0
  100. package/dist/updates/0.5.4/index.d.ts +2 -0
  101. package/dist/updates/0.5.4/index.js +15 -0
  102. package/dist/updates/0.5.5/index.d.ts +2 -0
  103. package/dist/updates/0.5.5/index.js +20 -0
  104. package/dist/updates/0.5.6/index.d.ts +2 -0
  105. package/dist/updates/0.5.6/index.js +17 -0
  106. package/dist/updates/0.5.7/index.d.ts +2 -0
  107. package/dist/updates/0.5.7/index.js +14 -0
  108. package/dist/updates/index.js +5 -1
  109. package/package.json +6 -2
@@ -44,6 +44,8 @@
44
44
  draft: '○',
45
45
  scheduled: '◐'
46
46
  };
47
+
48
+ const query = $derived(remotes.getRecentEntries(6));
47
49
  </script>
48
50
 
49
51
  <section class="dash-card dash-card--entries" aria-labelledby="entries-heading">
@@ -52,7 +54,7 @@
52
54
  <a href="/admin/entries" class="dash-card-link">{lang[interfaceLanguage.current].viewAll}</a>
53
55
  </div>
54
56
 
55
- {#await remotes.getRecentEntries(6)}
57
+ {#if !query.ready}
56
58
  <ul class="entries-list">
57
59
  {#each Array(4) as _}
58
60
  <li class="entry-item">
@@ -65,7 +67,9 @@
65
67
  </li>
66
68
  {/each}
67
69
  </ul>
68
- {:then entries}
70
+ {:else if query.current}
71
+ {@const entries = query.current}
72
+ <div class:opacity-60={query.loading} class="transition-opacity duration-200">
69
73
  {#if entries.length === 0}
70
74
  <p class="text-center text-sm py-6" style="color:var(--text-light)">
71
75
  {lang[interfaceLanguage.current].noEntries}
@@ -90,5 +94,6 @@
90
94
  {/each}
91
95
  </ul>
92
96
  {/if}
93
- {/await}
97
+ </div>
98
+ {/if}
94
99
  </section>
@@ -1,18 +1,3 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const RecentEntries: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
- [evt: string]: CustomEvent<any>;
16
- }, {}, {}, string>;
17
- type RecentEntries = InstanceType<typeof RecentEntries>;
1
+ declare const RecentEntries: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type RecentEntries = ReturnType<typeof RecentEntries>;
18
3
  export default RecentEntries;
@@ -51,29 +51,30 @@
51
51
  {#if value && ((typeof value === 'string' && value !== '') || (Array.isArray(value) && value.length > 0))}
52
52
  <div class="group/dialog-trigger relative aspect-square max-w-64 overflow-hidden rounded-2xl border">
53
53
  {#if typeof value === 'string'}
54
- {#await remotes.getFileById(value)}
54
+ {@const fileQuery = remotes.getFileById(value)}
55
+ {#if !fileQuery.ready}
55
56
  <div class="animate-pulse bg-muted w-full h-full rounded-xl"></div>
56
- {:then file}
57
- {#if file}
58
- <button
59
- type="button"
60
- class="p-1 w-full h-full cursor-zoom-in"
61
- onclick={(e) => {
62
- e.stopPropagation();
63
- e.preventDefault();
64
- openLightbox(file);
65
- }}
66
- >
67
- <FileMiniature {file} />
68
- </button>
69
- {/if}
70
- {/await}
57
+ {:else if fileQuery.current}
58
+ {@const file = fileQuery.current}
59
+ <button
60
+ type="button"
61
+ class="p-1 w-full h-full cursor-zoom-in"
62
+ onclick={(e) => {
63
+ e.stopPropagation();
64
+ e.preventDefault();
65
+ openLightbox(file);
66
+ }}
67
+ >
68
+ <FileMiniature {file} />
69
+ </button>
70
+ {/if}
71
71
  {:else if Array.isArray(value) && value.length > 0}
72
72
  {@const valueArr = value}
73
- {#await remotes.getMediaFiles({ data: { ids: valueArr } })}
73
+ {@const mFilesQuery = remotes.getMediaFiles({ data: { ids: valueArr } })}
74
+ {#if !mFilesQuery.ready}
74
75
  <div class="animate-pulse bg-muted w-full h-full rounded-xl"></div>
75
- {:then files}
76
- {@const file = files[currentIndex]}
76
+ {:else if mFilesQuery.current}
77
+ {@const file = mFilesQuery.current[currentIndex]}
77
78
  {#if file}
78
79
  <button
79
80
  type="button"
@@ -87,7 +88,7 @@
87
88
  <FileMiniature {file} />
88
89
  </button>
89
90
  {/if}
90
- {/await}
91
+ {/if}
91
92
  <!-- Nawigacja multi-image -->
92
93
  {#if valueArr.length > 1}
93
94
  <div class="absolute inset-x-0 top-1/2 flex -translate-y-1/2 justify-between px-1 pointer-events-none">
@@ -195,58 +195,59 @@
195
195
  {#if value && ((typeof value === 'string' && value !== '') || (Array.isArray(value) && value.length > 0))}
196
196
  <div class="max-w-96">
197
197
  {#if typeof value === 'string'}
198
- {#await remotes.getFileById(value)}
198
+ {@const fileQuery = remotes.getFileById(value)}
199
+ {#if !fileQuery.ready}
199
200
  <div class="animate-pulse bg-muted w-full aspect-video rounded-xl"></div>
200
- {:then file}
201
- {#if file}
202
- {#if file.type === 'video'}
203
- <div class="overflow-hidden rounded-2xl border">
204
- {@render videoPreview(file)}
205
- <div class="flex items-center justify-between gap-2 p-2 bg-gradient-to-t from-muted/50">
206
- <Button {...props} size="sm" variant="secondary" class="h-8">
207
- <Plus class="h-4 w-4" />
208
- {lang[interfaceLanguage.current].change}
201
+ {:else if fileQuery.current}
202
+ {@const file = fileQuery.current}
203
+ {#if file.type === 'video'}
204
+ <div class="overflow-hidden rounded-2xl border">
205
+ {@render videoPreview(file)}
206
+ <div class="flex items-center justify-between gap-2 p-2 bg-gradient-to-t from-muted/50">
207
+ <Button {...props} size="sm" variant="secondary" class="h-8">
208
+ <Plus class="h-4 w-4" />
209
+ {lang[interfaceLanguage.current].change}
210
+ </Button>
211
+ {#if !field.required}
212
+ <Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation(); value = ''; }}>
213
+ <X class="h-4 w-4" />
214
+ {lang[interfaceLanguage.current].remove}
209
215
  </Button>
210
- {#if !field.required}
211
- <Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation(); value = ''; }}>
212
- <X class="h-4 w-4" />
213
- {lang[interfaceLanguage.current].remove}
214
- </Button>
215
- {/if}
216
- </div>
217
- {@render accessibilityPanel(file)}
216
+ {/if}
218
217
  </div>
219
- {:else}
220
- <div class="group/dialog-trigger relative aspect-square max-w-64 overflow-hidden rounded-2xl border">
221
- <button
222
- type="button"
223
- class="p-1 w-full h-full cursor-zoom-in"
224
- onclick={(e) => { e.stopPropagation(); e.preventDefault(); openLightbox(file); }}
225
- >
226
- <FileMiniature {file} />
227
- </button>
228
- <div class="absolute inset-x-0 bottom-0 flex items-center justify-between gap-2 bg-gradient-to-t from-black/60 to-transparent p-2 pt-8">
229
- <Button {...props} size="sm" variant="secondary" class="h-8">
230
- <Plus class="h-4 w-4" />
231
- {lang[interfaceLanguage.current].change}
218
+ {@render accessibilityPanel(file)}
219
+ </div>
220
+ {:else}
221
+ <div class="group/dialog-trigger relative aspect-square max-w-64 overflow-hidden rounded-2xl border">
222
+ <button
223
+ type="button"
224
+ class="p-1 w-full h-full cursor-zoom-in"
225
+ onclick={(e) => { e.stopPropagation(); e.preventDefault(); openLightbox(file); }}
226
+ >
227
+ <FileMiniature {file} />
228
+ </button>
229
+ <div class="absolute inset-x-0 bottom-0 flex items-center justify-between gap-2 bg-gradient-to-t from-black/60 to-transparent p-2 pt-8">
230
+ <Button {...props} size="sm" variant="secondary" class="h-8">
231
+ <Plus class="h-4 w-4" />
232
+ {lang[interfaceLanguage.current].change}
233
+ </Button>
234
+ {#if !field.required}
235
+ <Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation(); value = ''; }}>
236
+ <X class="h-4 w-4" />
237
+ {lang[interfaceLanguage.current].remove}
232
238
  </Button>
233
- {#if !field.required}
234
- <Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation(); value = ''; }}>
235
- <X class="h-4 w-4" />
236
- {lang[interfaceLanguage.current].remove}
237
- </Button>
238
- {/if}
239
- </div>
239
+ {/if}
240
240
  </div>
241
- {/if}
241
+ </div>
242
242
  {/if}
243
- {/await}
243
+ {/if}
244
244
  {:else if Array.isArray(value) && value.length > 0}
245
245
  {@const valueArr = value}
246
- {#await remotes.getMediaFiles({ data: { ids: valueArr } })}
246
+ {@const mFilesQuery = remotes.getMediaFiles({ data: { ids: valueArr } })}
247
+ {#if !mFilesQuery.ready}
247
248
  <div class="animate-pulse bg-muted w-full aspect-video rounded-xl"></div>
248
- {:then files}
249
- {@const file = files[currentIndex]}
249
+ {:else if mFilesQuery.current}
250
+ {@const file = mFilesQuery.current[currentIndex]}
250
251
  {#if file}
251
252
  <div class="group/dialog-trigger relative overflow-hidden rounded-2xl border">
252
253
  {#if file.type === 'video'}
@@ -298,7 +299,7 @@
298
299
  </div>
299
300
  {@render accessibilityPanel(file)}
300
301
  {/if}
301
- {/await}
302
+ {/if}
302
303
  {/if}
303
304
  </div>
304
305
  {:else}