includio-cms 0.5.2 → 0.5.5

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 (132) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/ROADMAP.md +29 -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 +7 -7
  18. package/dist/admin/client/collection/collection-entries.svelte +56 -5
  19. package/dist/admin/client/collection/data-table.svelte +127 -18
  20. package/dist/admin/client/collection/data-table.svelte.d.ts +2 -0
  21. package/dist/admin/client/entry/entry-form.svelte +1 -0
  22. package/dist/admin/client/entry/entry.svelte +130 -123
  23. package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +92 -9
  24. package/dist/admin/components/fields/blocks-field.svelte +142 -112
  25. package/dist/admin/components/fields/blocks-field.svelte.d.ts +10 -30
  26. package/dist/admin/components/fields/boolean-field.svelte +28 -38
  27. package/dist/admin/components/fields/boolean-field.svelte.d.ts +5 -27
  28. package/dist/admin/components/fields/checkboxes-field.svelte +12 -24
  29. package/dist/admin/components/fields/checkboxes-field.svelte.d.ts +5 -27
  30. package/dist/admin/components/fields/content-field.svelte +4 -17
  31. package/dist/admin/components/fields/content-field.svelte.d.ts +5 -27
  32. package/dist/admin/components/fields/date-field.svelte +8 -21
  33. package/dist/admin/components/fields/date-field.svelte.d.ts +5 -27
  34. package/dist/admin/components/fields/datetime-field.svelte +8 -21
  35. package/dist/admin/components/fields/datetime-field.svelte.d.ts +5 -27
  36. package/dist/admin/components/fields/field-renderer.svelte +32 -19
  37. package/dist/admin/components/fields/field-renderer.svelte.d.ts +1 -1
  38. package/dist/admin/components/fields/field-value-bridge.svelte +21 -0
  39. package/dist/admin/components/fields/field-value-bridge.svelte.d.ts +31 -0
  40. package/dist/admin/components/fields/fields-form.svelte +13 -10
  41. package/dist/admin/components/fields/file-field.svelte +12 -27
  42. package/dist/admin/components/fields/file-field.svelte.d.ts +5 -27
  43. package/dist/admin/components/fields/image-field.svelte +13 -28
  44. package/dist/admin/components/fields/image-field.svelte.d.ts +5 -27
  45. package/dist/admin/components/fields/media-field.svelte +15 -30
  46. package/dist/admin/components/fields/media-field.svelte.d.ts +5 -27
  47. package/dist/admin/components/fields/number-field.svelte +6 -20
  48. package/dist/admin/components/fields/number-field.svelte.d.ts +5 -27
  49. package/dist/admin/components/fields/object-field.svelte +26 -29
  50. package/dist/admin/components/fields/object-field.svelte.d.ts +11 -31
  51. package/dist/admin/components/fields/radio-field.svelte +8 -20
  52. package/dist/admin/components/fields/radio-field.svelte.d.ts +5 -27
  53. package/dist/admin/components/fields/relation-field.svelte +28 -40
  54. package/dist/admin/components/fields/relation-field.svelte.d.ts +5 -27
  55. package/dist/admin/components/fields/richtext-field.svelte +4 -17
  56. package/dist/admin/components/fields/richtext-field.svelte.d.ts +5 -27
  57. package/dist/admin/components/fields/select-field.svelte +14 -28
  58. package/dist/admin/components/fields/select-field.svelte.d.ts +5 -27
  59. package/dist/admin/components/fields/seo-field.svelte +5 -12
  60. package/dist/admin/components/fields/seo-field.svelte.d.ts +8 -28
  61. package/dist/admin/components/fields/simple-array-field.svelte +29 -42
  62. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +5 -27
  63. package/dist/admin/components/fields/slug-field.svelte +6 -11
  64. package/dist/admin/components/fields/slug-field.svelte.d.ts +6 -26
  65. package/dist/admin/components/fields/text-field-wrapper.svelte +22 -40
  66. package/dist/admin/components/fields/text-field.svelte +7 -19
  67. package/dist/admin/components/fields/text-field.svelte.d.ts +5 -27
  68. package/dist/admin/components/fields/url-field-wrapper.svelte +8 -3
  69. package/dist/admin/components/fields/url-field.svelte +294 -128
  70. package/dist/admin/components/fields/url-field.svelte.d.ts +5 -27
  71. package/dist/admin/components/layout/layout-renderer.svelte +8 -6
  72. package/dist/admin/components/layout/nav-collections.svelte +2 -1
  73. package/dist/admin/components/layout/nav-forms.svelte +2 -1
  74. package/dist/admin/components/layout/nav-singletons.svelte +2 -1
  75. package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +221 -31
  76. package/dist/admin/components/tiptap/content-editor.svelte +13 -2
  77. package/dist/admin/components/tiptap/inline-block-node.d.ts +1 -0
  78. package/dist/admin/components/tiptap/inline-block-node.js +18 -1
  79. package/dist/admin/components/tiptap/slash-command.js +2 -3
  80. package/dist/admin/components/tiptap/standalone-form.d.ts +7 -0
  81. package/dist/admin/components/tiptap/standalone-form.js +31 -0
  82. package/dist/admin/components/tiptap/tiptap-editor.svelte +7 -0
  83. package/dist/admin/remote/entry.remote.d.ts +9 -1
  84. package/dist/admin/remote/entry.remote.js +30 -2
  85. package/dist/admin/styles/admin.css +10 -0
  86. package/dist/admin/utils/fieldCondition.d.ts +6 -0
  87. package/dist/admin/utils/fieldCondition.js +20 -0
  88. package/dist/cli/scaffold/admin.js +8 -0
  89. package/dist/components/ui/switch/index.d.ts +2 -0
  90. package/dist/components/ui/switch/index.js +4 -0
  91. package/dist/components/ui/switch/switch.svelte +26 -0
  92. package/dist/components/ui/switch/switch.svelte.d.ts +4 -0
  93. package/dist/core/cms.d.ts +2 -1
  94. package/dist/core/cms.js +2 -0
  95. package/dist/core/fields/fieldSchemaToTs.js +15 -3
  96. package/dist/core/fields/formFieldSchemaToTs.js +22 -6
  97. package/dist/core/fields/urlUtils.d.ts +14 -0
  98. package/dist/core/fields/urlUtils.js +21 -0
  99. package/dist/core/server/entries/operations/get.js +2 -1
  100. package/dist/core/server/entries/operations/update.d.ts +1 -0
  101. package/dist/core/server/entries/operations/update.js +5 -1
  102. package/dist/core/server/fields/populateEntry.js +43 -0
  103. package/dist/core/server/fields/resolveImageFields.js +33 -1
  104. package/dist/core/server/fields/resolveRelationFields.js +46 -0
  105. package/dist/core/server/fields/resolveRichtextLinks.js +15 -1
  106. package/dist/core/server/fields/resolveUrlFields.js +65 -0
  107. package/dist/core/server/generator/formFieldSchemaToString.js +40 -9
  108. package/dist/core/server/generator/formFields.js +2 -0
  109. package/dist/core/server/generator/generator.js +25 -1
  110. package/dist/db-postgres/schema/entry.d.ts +17 -0
  111. package/dist/db-postgres/schema/entry.js +4 -2
  112. package/dist/schemas/field/url.d.ts +2 -0
  113. package/dist/schemas/field/url.js +4 -2
  114. package/dist/server/auth.d.ts +6 -6
  115. package/dist/sveltekit/server/handle.js +1 -0
  116. package/dist/types/cms.d.ts +7 -0
  117. package/dist/types/collections.d.ts +2 -0
  118. package/dist/types/entries.d.ts +7 -1
  119. package/dist/types/fields.d.ts +9 -0
  120. package/dist/types/formFields.d.ts +15 -2
  121. package/dist/types/index.d.ts +2 -1
  122. package/dist/types/index.js +1 -0
  123. package/dist/updates/0.5.3/index.d.ts +2 -0
  124. package/dist/updates/0.5.3/index.js +19 -0
  125. package/dist/updates/0.5.4/index.d.ts +2 -0
  126. package/dist/updates/0.5.4/index.js +15 -0
  127. package/dist/updates/0.5.5/index.d.ts +2 -0
  128. package/dist/updates/0.5.5/index.js +20 -0
  129. package/dist/updates/index.js +4 -1
  130. package/package.json +7 -1
  131. package/dist/admin/components/fields/standalone-field-renderer.svelte +0 -148
  132. package/dist/admin/components/fields/standalone-field-renderer.svelte.d.ts +0 -9
@@ -1,16 +1,6 @@
1
- <script lang="ts" module>
2
- type T = Record<string, unknown>;
3
- </script>
4
-
5
- <script lang="ts" generics="T extends Record<string, unknown>">
1
+ <script lang="ts">
6
2
  import type { RelationFieldData, RelationField } from '../../../types/fields.js';
7
3
  import type { CollectionConfig } from '../../../types/collections.js';
8
- import {
9
- formFieldProxy,
10
- type FormFieldProxy,
11
- type FormPathLeaves,
12
- type SuperForm
13
- } from 'sveltekit-superforms';
14
4
  import { getRemotes } from '../../../sveltekit/index.js';
15
5
  import { buttonVariants } from '../../../components/ui/button/button.svelte';
16
6
  import { getCollectionEntryLabel } from '../../utils/entryLabel.js';
@@ -43,27 +33,24 @@
43
33
 
44
34
  type Props = {
45
35
  field: RelationField;
46
- form: SuperForm<T>;
47
- path: FormPathLeaves<T, RelationFieldData>;
36
+ value: RelationFieldData;
48
37
  };
49
38
 
50
- let { field, form, path, ...props }: Props = $props();
51
-
52
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<RelationFieldData>;
39
+ let { field, value = $bindable(), ...props }: Props = $props();
53
40
 
54
41
  const multiple = $derived(field.multiple === true);
55
42
 
56
43
  // Ensure value is array when multiple
57
44
  onMount(() => {
58
- if (multiple && !Array.isArray($value)) {
59
- $value = $value ? [$value] : [];
45
+ if (multiple && !Array.isArray(value)) {
46
+ value = value ? [value] : [];
60
47
  }
61
48
  });
62
49
 
63
50
  // Helper to get current array value safely
64
51
  function getArrayValue(): string[] {
65
- if (Array.isArray($value)) return $value;
66
- return $value ? [$value] : [];
52
+ if (Array.isArray(value)) return value;
53
+ return value ? [value] : [];
67
54
  }
68
55
 
69
56
  function isSelected(id: string): boolean {
@@ -73,14 +60,14 @@
73
60
  function toggleItem(id: string) {
74
61
  const arr = getArrayValue();
75
62
  if (arr.includes(id)) {
76
- $value = arr.filter((v) => v !== id);
63
+ value = arr.filter((v) => v !== id);
77
64
  } else {
78
- $value = [...arr, id];
65
+ value = [...arr, id];
79
66
  }
80
67
  }
81
68
 
82
69
  function removeItem(id: string) {
83
- $value = getArrayValue().filter((v) => v !== id);
70
+ value = getArrayValue().filter((v) => v !== id);
84
71
  }
85
72
 
86
73
  type RelationOption = { label: string; value: string };
@@ -95,16 +82,19 @@
95
82
 
96
83
  untrack(() => {
97
84
  loading = true;
98
- Promise.all([
99
- remotes.getCollection(collection),
100
- remotes.getEntries({ slug: collection, language: currentLang })
101
- ]).then(([collectionConfig, entries]) => {
102
- const options = entries.map((entry) => ({
103
- label: getCollectionEntryLabel(entry, collectionConfig),
104
- value: entry.id
105
- }));
106
- relationData = { collectionConfig, options };
107
- loading = false;
85
+ remotes.getCollection(collection).then((collectionConfig) => {
86
+ const entriesParams: Record<string, unknown> = { slug: collection, language: currentLang };
87
+ if (collectionConfig.orderable) {
88
+ entriesParams.orderBy = { column: 'sortOrder', direction: 'asc' };
89
+ }
90
+ remotes.getEntries(entriesParams).then((entries) => {
91
+ const options = entries.map((entry) => ({
92
+ label: getCollectionEntryLabel(entry, collectionConfig),
93
+ value: entry.id
94
+ }));
95
+ relationData = { collectionConfig, options };
96
+ loading = false;
97
+ });
108
98
  });
109
99
  });
110
100
  });
@@ -154,7 +144,6 @@
154
144
  {/if}
155
145
  <Selector class="opacity-50" />
156
146
  </Popover.Trigger>
157
- <input hidden value={JSON.stringify(getArrayValue())} name={path} />
158
147
 
159
148
  <Popover.Content class="w-[200px] p-0">
160
149
  <Command.Root>
@@ -199,7 +188,7 @@
199
188
  const dropIndex = parseInt(state.targetContainer ?? '');
200
189
 
201
190
  if (!isNaN(dragIndex) && !isNaN(dropIndex)) {
202
- $value = [...arrayMove(getArrayValue(), dragIndex, dropIndex)];
191
+ value = [...arrayMove(getArrayValue(), dragIndex, dropIndex)];
203
192
  }
204
193
  }
205
194
  }
@@ -231,7 +220,7 @@
231
220
  </div>
232
221
  {/if}
233
222
  {:else}
234
- <!-- Single-select mode (unchanged) -->
223
+ <!-- Single-select mode -->
235
224
  <Popover.Root bind:open>
236
225
  <Popover.Trigger
237
226
  id={triggerId}
@@ -243,11 +232,10 @@
243
232
  role="combobox"
244
233
  {...props}
245
234
  >
246
- {options.find((f) => f.value === $value)?.label ??
235
+ {options.find((f) => f.value === value)?.label ??
247
236
  `${lang[interfaceLanguage.current].select} ${getLocalizedLabel(collectionConfig.labels?.singular, interfaceLanguage.current) || collectionConfig.slug}`}
248
237
  <Selector class="opacity-50" />
249
238
  </Popover.Trigger>
250
- <input hidden value={$value} name={path} />
251
239
 
252
240
  <Popover.Content class="w-[200px] p-0">
253
241
  <Command.Root>
@@ -265,12 +253,12 @@
265
253
  <Command.Item
266
254
  value={option.label}
267
255
  onSelect={() => {
268
- $value = option.value;
256
+ value = option.value;
269
257
  closeAndFocusTrigger(triggerId);
270
258
  }}
271
259
  >
272
260
  {option.label}
273
- <Check class={cn('ml-auto', option.value !== $value && 'text-transparent')} />
261
+ <Check class={cn('ml-auto', option.value !== value && 'text-transparent')} />
274
262
  </Command.Item>
275
263
  {/each}
276
264
  </Command.Group>
@@ -1,30 +1,8 @@
1
1
  import type { RelationFieldData, RelationField } from '../../../types/fields.js';
2
- import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
3
- declare function $$render<T extends Record<string, unknown>>(): {
4
- props: {
5
- field: RelationField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, RelationFieldData>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
2
+ type Props = {
3
+ field: RelationField;
4
+ value: RelationFieldData;
13
5
  };
14
- declare class __sveltets_Render<T extends Record<string, unknown>> {
15
- props(): ReturnType<typeof $$render<T>>['props'];
16
- events(): ReturnType<typeof $$render<T>>['events'];
17
- slots(): ReturnType<typeof $$render<T>>['slots'];
18
- bindings(): "";
19
- exports(): {};
20
- }
21
- interface $$IsomorphicComponent {
22
- new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
23
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
24
- } & ReturnType<__sveltets_Render<T>['exports']>;
25
- <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
26
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
27
- }
28
- declare const RelationField: $$IsomorphicComponent;
29
- type RelationField<T extends Record<string, unknown>> = InstanceType<typeof RelationField<T>>;
6
+ declare const RelationField: import("svelte").Component<Props, {}, "value">;
7
+ type RelationField = ReturnType<typeof RelationField>;
30
8
  export default RelationField;
@@ -1,26 +1,13 @@
1
- <script lang="ts" module>
2
- type T = Record<string, unknown>;
3
- </script>
4
-
5
- <script lang="ts" generics="T extends Record<string, unknown>">
6
- import {
7
- formFieldProxy,
8
- type FormFieldProxy,
9
- type FormPathLeaves,
10
- type SuperForm
11
- } from 'sveltekit-superforms';
1
+ <script lang="ts">
12
2
  import Tiptap from '../tiptap.svelte';
13
3
  import type { RichtextField } from '../../../types/fields.js';
14
4
 
15
5
  type Props = {
16
6
  field: RichtextField;
17
- form: SuperForm<T>;
18
- path: FormPathLeaves<T, string | undefined>;
7
+ value: string | undefined;
19
8
  };
20
9
 
21
- let { field, form, path, ...props }: Props = $props();
22
-
23
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<string | undefined>;
10
+ let { field, value = $bindable(), ...props }: Props = $props();
24
11
  </script>
25
12
 
26
- <Tiptap bind:value={$value} />
13
+ <Tiptap bind:value />
@@ -1,30 +1,8 @@
1
- import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
1
  import type { RichtextField } from '../../../types/fields.js';
3
- declare function $$render<T extends Record<string, unknown>>(): {
4
- props: {
5
- field: RichtextField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, string | undefined>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
2
+ type Props = {
3
+ field: RichtextField;
4
+ value: string | undefined;
13
5
  };
14
- declare class __sveltets_Render<T extends Record<string, unknown>> {
15
- props(): ReturnType<typeof $$render<T>>['props'];
16
- events(): ReturnType<typeof $$render<T>>['events'];
17
- slots(): ReturnType<typeof $$render<T>>['slots'];
18
- bindings(): "";
19
- exports(): {};
20
- }
21
- interface $$IsomorphicComponent {
22
- new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
23
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
24
- } & ReturnType<__sveltets_Render<T>['exports']>;
25
- <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
26
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
27
- }
28
- declare const RichtextField: $$IsomorphicComponent;
29
- type RichtextField<T extends Record<string, unknown>> = InstanceType<typeof RichtextField<T>>;
6
+ declare const RichtextField: import("svelte").Component<Props, {}, "value">;
7
+ type RichtextField = ReturnType<typeof RichtextField>;
30
8
  export default RichtextField;
@@ -1,49 +1,37 @@
1
- <script lang="ts" module>
2
- type T = Record<string, unknown>;
3
- </script>
4
-
5
- <script lang="ts" generics="T extends Record<string, unknown>">
1
+ <script lang="ts">
6
2
  import * as Select from '../../../components/ui/select/index.js';
7
3
  import type { SelectField } from '../../../types/fields.js';
8
4
  import { onMount } from 'svelte';
9
- import {
10
- formFieldProxy,
11
- type FormFieldProxy,
12
- type FormPathLeaves,
13
- type SuperForm
14
- } from 'sveltekit-superforms';
15
5
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
16
6
  import { getLocalizedLabel } from '../../utils/collectionLabel.js';
17
7
 
18
8
  type Props = {
19
9
  field: SelectField;
20
- form: SuperForm<T>;
21
- path: FormPathLeaves<T, string | string[] | undefined>;
10
+ value: string | string[] | undefined;
22
11
  };
23
12
 
24
- let { field, form, path, ...props }: Props = $props();
13
+ let { field, value = $bindable(), ...props }: Props = $props();
25
14
 
26
15
  const interfaceLanguage = useInterfaceLanguage();
27
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<string | string[] | undefined>;
28
16
 
29
17
  // Get display label for current value(s)
30
18
  function getDisplayLabel(): string {
31
- if (!$value) return '';
32
- if (field.multiple && Array.isArray($value)) {
33
- return $value
19
+ if (!value) return '';
20
+ if (field.multiple && Array.isArray(value)) {
21
+ return value
34
22
  .map((v) => {
35
23
  const opt = field.options.find((o) => o.value === v);
36
24
  return opt ? getLocalizedLabel(opt.label, interfaceLanguage.current) : v;
37
25
  })
38
26
  .join(', ');
39
27
  }
40
- const option = field.options.find((o) => o.value === $value);
41
- return option ? getLocalizedLabel(option.label, interfaceLanguage.current) : ($value as string);
28
+ const option = field.options.find((o) => o.value === value);
29
+ return option ? getLocalizedLabel(option.label, interfaceLanguage.current) : (value as string);
42
30
  }
43
31
 
44
32
  onMount(() => {
45
- if ($value === undefined) {
46
- $value = field.multiple ? [] : '';
33
+ if (value === undefined) {
34
+ value = field.multiple ? [] : '';
47
35
  }
48
36
  });
49
37
  </script>
@@ -51,11 +39,10 @@
51
39
  {#if field.multiple}
52
40
  <Select.Root
53
41
  type="multiple"
54
- bind:value={$value as string[]}
55
- name={path}
42
+ bind:value={value as string[]}
56
43
  >
57
44
  <Select.Trigger {...props} class="w-full">
58
- {#if Array.isArray($value) && $value.length > 0}
45
+ {#if Array.isArray(value) && value.length > 0}
59
46
  {getDisplayLabel()}
60
47
  {:else}
61
48
  <span class="text-muted-foreground">Select...</span>
@@ -70,11 +57,10 @@
70
57
  {:else}
71
58
  <Select.Root
72
59
  type="single"
73
- bind:value={$value as string}
74
- name={path}
60
+ bind:value={value as string}
75
61
  >
76
62
  <Select.Trigger {...props} class="w-full">
77
- {#if $value}
63
+ {#if value}
78
64
  {getDisplayLabel()}
79
65
  {:else}
80
66
  <span class="text-muted-foreground">Select...</span>
@@ -1,30 +1,8 @@
1
1
  import type { SelectField } from '../../../types/fields.js';
2
- import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
3
- declare function $$render<T extends Record<string, unknown>>(): {
4
- props: {
5
- field: SelectField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, string | string[] | undefined>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
2
+ type Props = {
3
+ field: SelectField;
4
+ value: string | string[] | undefined;
13
5
  };
14
- declare class __sveltets_Render<T extends Record<string, unknown>> {
15
- props(): ReturnType<typeof $$render<T>>['props'];
16
- events(): ReturnType<typeof $$render<T>>['events'];
17
- slots(): ReturnType<typeof $$render<T>>['slots'];
18
- bindings(): "";
19
- exports(): {};
20
- }
21
- interface $$IsomorphicComponent {
22
- new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
23
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
24
- } & ReturnType<__sveltets_Render<T>['exports']>;
25
- <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
26
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
27
- }
28
- declare const SelectField: $$IsomorphicComponent;
29
- type SelectField<T extends Record<string, unknown>> = InstanceType<typeof SelectField<T>>;
6
+ declare const SelectField: import("svelte").Component<Props, {}, "value">;
7
+ type SelectField = ReturnType<typeof SelectField>;
30
8
  export default SelectField;
@@ -1,12 +1,5 @@
1
- <script lang="ts" module>
2
- type T = Record<string, unknown>;
3
- </script>
4
-
5
- <script lang="ts" generics="T extends Record<string, unknown>">
6
- import {
7
- type FormPathLeaves,
8
- type SuperForm
9
- } from 'sveltekit-superforms';
1
+ <script lang="ts">
2
+ import type { SuperForm } from 'sveltekit-superforms';
10
3
  import FieldRenderer from './field-renderer.svelte';
11
4
  import { joinPath } from '../../utils/objectPath.js';
12
5
  import { getAtPath, setAtPath } from '../../utils/objectPath.js';
@@ -28,8 +21,8 @@
28
21
 
29
22
  type Props = {
30
23
  field: SeoField;
31
- form: SuperForm<T>;
32
- path: FormPathLeaves<T, SeoFieldData | undefined>;
24
+ form: SuperForm<Record<string, unknown>>;
25
+ path: string;
33
26
  };
34
27
 
35
28
  let { field, form, path, ...props }: Props = $props();
@@ -261,7 +254,7 @@
261
254
  <div>
262
255
  <FieldRenderer
263
256
  field={f}
264
- form={form as SuperForm<Record<string, unknown>>}
257
+ {form}
265
258
  path={joinPath(path, f.slug)}
266
259
  />
267
260
  {#if f.slug === 'title'}
@@ -1,30 +1,10 @@
1
- import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
- import type { SeoField, SeoFieldData } from '../../../types/fields.js';
3
- declare function $$render<T extends Record<string, unknown>>(): {
4
- props: {
5
- field: SeoField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, SeoFieldData | undefined>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
1
+ import type { SuperForm } from 'sveltekit-superforms';
2
+ import type { SeoField } from '../../../types/fields.js';
3
+ type Props = {
4
+ field: SeoField;
5
+ form: SuperForm<Record<string, unknown>>;
6
+ path: string;
13
7
  };
14
- declare class __sveltets_Render<T extends Record<string, unknown>> {
15
- props(): ReturnType<typeof $$render<T>>['props'];
16
- events(): ReturnType<typeof $$render<T>>['events'];
17
- slots(): ReturnType<typeof $$render<T>>['slots'];
18
- bindings(): "";
19
- exports(): {};
20
- }
21
- interface $$IsomorphicComponent {
22
- new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
23
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
24
- } & ReturnType<__sveltets_Render<T>['exports']>;
25
- <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
26
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
27
- }
28
- declare const SeoField: $$IsomorphicComponent;
29
- type SeoField<T extends Record<string, unknown>> = InstanceType<typeof SeoField<T>>;
8
+ declare const SeoField: import("svelte").Component<Props, {}, "">;
9
+ type SeoField = ReturnType<typeof SeoField>;
30
10
  export default SeoField;
@@ -1,16 +1,6 @@
1
- <script lang="ts" module>
2
- type T = Record<string, unknown>;
3
- </script>
4
-
5
- <script lang="ts" generics="T extends Record<string, unknown>">
1
+ <script lang="ts">
6
2
  import Button from '../../../components/ui/button/button.svelte';
7
3
  import Input from '../../../components/ui/input/input.svelte';
8
- import {
9
- formFieldProxy,
10
- type FormFieldProxy,
11
- type FormPathLeaves,
12
- type SuperForm
13
- } from 'sveltekit-superforms';
14
4
  import type { ArrayField, UrlFieldData } from '../../../types/fields.js';
15
5
  import { onMount } from 'svelte';
16
6
  import CirclePlus from '@tabler/icons-svelte/icons/circle-plus';
@@ -23,21 +13,18 @@
23
13
 
24
14
  type Props = {
25
15
  field: ArrayField;
26
- form: SuperForm<T>;
27
- path: FormPathLeaves<T>;
16
+ value: unknown[] | undefined;
28
17
  };
29
18
 
30
- let { field, form, path, ...props }: Props = $props();
31
-
32
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<unknown[] | undefined>;
19
+ let { field, value = $bindable(), ...props }: Props = $props();
33
20
 
34
21
  onMount(() => {
35
- if (!$value || !Array.isArray($value)) {
36
- $value = [];
22
+ if (!value || !Array.isArray(value)) {
23
+ value = [];
37
24
  }
38
25
  });
39
26
 
40
- const atMax = $derived(field.maxItems !== undefined && ($value?.length ?? 0) >= field.maxItems);
27
+ const atMax = $derived(field.maxItems !== undefined && (value?.length ?? 0) >= field.maxItems);
41
28
 
42
29
  // --- Text ---
43
30
  let textInput = $state('');
@@ -47,9 +34,9 @@
47
34
  if (field.localized) {
48
35
  const item: Record<string, string> = {};
49
36
  item[contentLanguage.current] = textInput.trim();
50
- $value = [...($value ?? []), item];
37
+ value = [...(value ?? []), item];
51
38
  } else {
52
- $value = [...($value ?? []), textInput.trim()];
39
+ value = [...(value ?? []), textInput.trim()];
53
40
  }
54
41
  textInput = '';
55
42
  }
@@ -67,7 +54,7 @@
67
54
  function addNumberItem() {
68
55
  const num = Number(numberInput);
69
56
  if (numberInput === '' || isNaN(num) || atMax) return;
70
- $value = [...($value ?? []), num];
57
+ value = [...(value ?? []), num];
71
58
  numberInput = '';
72
59
  }
73
60
 
@@ -82,13 +69,13 @@
82
69
  function addUrlItem() {
83
70
  if (atMax) return;
84
71
  const item: UrlFieldData = { url: {}, text: {}, newTab: false };
85
- $value = [...($value ?? []), item];
72
+ value = [...(value ?? []), item];
86
73
  }
87
74
 
88
75
  // --- Common ---
89
76
  function removeItem(index: number) {
90
- if (!$value) return;
91
- $value = $value.filter((_, i) => i !== index);
77
+ if (!value) return;
78
+ value = value.filter((_, i) => i !== index);
92
79
  }
93
80
 
94
81
  function getTextDisplay(item: unknown): string {
@@ -104,9 +91,9 @@
104
91
  {#if field.of === 'text'}
105
92
  <!-- Tag chips for text items -->
106
93
  <div class="space-y-3">
107
- {#if $value && $value.length > 0}
94
+ {#if value && value.length > 0}
108
95
  <div class="flex flex-wrap gap-2">
109
- {#each $value as item, index}
96
+ {#each value as item, index}
110
97
  <span
111
98
  class="bg-[#EEEAF8] text-[#1A1A2E] inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium"
112
99
  >
@@ -122,9 +109,9 @@
122
109
  if (typeof item === 'object' && item !== null) {
123
110
  const rec = { ...(item as Record<string, string>) };
124
111
  rec[contentLanguage.current] = val;
125
- const arr = [...($value ?? [])];
112
+ const arr = [...(value ?? [])];
126
113
  arr[index] = rec;
127
- $value = arr;
114
+ value = arr;
128
115
  }
129
116
  }}
130
117
  />
@@ -161,7 +148,7 @@
161
148
 
162
149
  {#if field.maxItems !== undefined}
163
150
  <p class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}">
164
- {$value?.length ?? 0} / {field.maxItems}
151
+ {value?.length ?? 0} / {field.maxItems}
165
152
  </p>
166
153
  {/if}
167
154
  </div>
@@ -169,9 +156,9 @@
169
156
  {:else if field.of === 'number'}
170
157
  <!-- Tag chips for number items -->
171
158
  <div class="space-y-3">
172
- {#if $value && $value.length > 0}
159
+ {#if value && value.length > 0}
173
160
  <div class="flex flex-wrap gap-2">
174
- {#each $value as item, index}
161
+ {#each value as item, index}
175
162
  <span
176
163
  class="bg-[#EEEAF8] text-[#1A1A2E] inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium tabular-nums"
177
164
  >
@@ -206,7 +193,7 @@
206
193
 
207
194
  {#if field.maxItems !== undefined}
208
195
  <p class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}">
209
- {$value?.length ?? 0} / {field.maxItems}
196
+ {value?.length ?? 0} / {field.maxItems}
210
197
  </p>
211
198
  {/if}
212
199
  </div>
@@ -214,9 +201,9 @@
214
201
  {:else if field.of === 'url'}
215
202
  <!-- Compact list for URL items -->
216
203
  <div class="space-y-3">
217
- {#if $value && $value.length > 0}
204
+ {#if value && value.length > 0}
218
205
  <div class="space-y-2">
219
- {#each $value as item, index}
206
+ {#each value as item, index}
220
207
  {@const urlItem = item as UrlFieldData}
221
208
  <div class="flex items-start gap-2 rounded-xl border border-[#E2DFF0] bg-[#F4F2FA] p-3">
222
209
  <div class="flex-1 space-y-2">
@@ -227,9 +214,9 @@
227
214
  oninput={(e) => {
228
215
  const val = e.currentTarget.value;
229
216
  const updated = { ...urlItem, url: { ...(urlItem.url ?? {}), [contentLanguage.current]: val } };
230
- const arr = [...($value ?? [])];
217
+ const arr = [...(value ?? [])];
231
218
  arr[index] = updated;
232
- $value = arr;
219
+ value = arr;
233
220
  }}
234
221
  />
235
222
  <div class="flex items-center gap-2">
@@ -241,9 +228,9 @@
241
228
  oninput={(e) => {
242
229
  const val = e.currentTarget.value;
243
230
  const updated = { ...urlItem, text: { ...(urlItem.text ?? {}), [contentLanguage.current]: val } };
244
- const arr = [...($value ?? [])];
231
+ const arr = [...(value ?? [])];
245
232
  arr[index] = updated;
246
- $value = arr;
233
+ value = arr;
247
234
  }}
248
235
  />
249
236
  <label class="flex items-center gap-1.5 text-xs text-[#555566] whitespace-nowrap">
@@ -252,9 +239,9 @@
252
239
  checked={urlItem.newTab ?? false}
253
240
  onchange={(e) => {
254
241
  const updated = { ...urlItem, newTab: e.currentTarget.checked };
255
- const arr = [...($value ?? [])];
242
+ const arr = [...(value ?? [])];
256
243
  arr[index] = updated;
257
- $value = arr;
244
+ value = arr;
258
245
  }}
259
246
  class="accent-[#5B4A9E]"
260
247
  />
@@ -282,7 +269,7 @@
282
269
 
283
270
  {#if field.maxItems !== undefined}
284
271
  <p class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}">
285
- {$value?.length ?? 0} / {field.maxItems}
272
+ {value?.length ?? 0} / {field.maxItems}
286
273
  </p>
287
274
  {/if}
288
275
  </div>