includio-cms 0.5.2 → 0.5.3

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 (93) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/ROADMAP.md +13 -0
  3. package/dist/admin/client/entry/entry-form.svelte +1 -0
  4. package/dist/admin/client/entry/entry.svelte +130 -123
  5. package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +92 -9
  6. package/dist/admin/components/fields/blocks-field.svelte +142 -112
  7. package/dist/admin/components/fields/blocks-field.svelte.d.ts +10 -30
  8. package/dist/admin/components/fields/boolean-field.svelte +28 -38
  9. package/dist/admin/components/fields/boolean-field.svelte.d.ts +5 -27
  10. package/dist/admin/components/fields/checkboxes-field.svelte +12 -24
  11. package/dist/admin/components/fields/checkboxes-field.svelte.d.ts +5 -27
  12. package/dist/admin/components/fields/content-field.svelte +4 -17
  13. package/dist/admin/components/fields/content-field.svelte.d.ts +5 -27
  14. package/dist/admin/components/fields/date-field.svelte +8 -21
  15. package/dist/admin/components/fields/date-field.svelte.d.ts +5 -27
  16. package/dist/admin/components/fields/datetime-field.svelte +8 -21
  17. package/dist/admin/components/fields/datetime-field.svelte.d.ts +5 -27
  18. package/dist/admin/components/fields/field-renderer.svelte +32 -19
  19. package/dist/admin/components/fields/field-renderer.svelte.d.ts +1 -1
  20. package/dist/admin/components/fields/field-value-bridge.svelte +21 -0
  21. package/dist/admin/components/fields/field-value-bridge.svelte.d.ts +31 -0
  22. package/dist/admin/components/fields/fields-form.svelte +13 -10
  23. package/dist/admin/components/fields/file-field.svelte +12 -27
  24. package/dist/admin/components/fields/file-field.svelte.d.ts +5 -27
  25. package/dist/admin/components/fields/image-field.svelte +13 -28
  26. package/dist/admin/components/fields/image-field.svelte.d.ts +5 -27
  27. package/dist/admin/components/fields/media-field.svelte +15 -30
  28. package/dist/admin/components/fields/media-field.svelte.d.ts +5 -27
  29. package/dist/admin/components/fields/number-field.svelte +6 -20
  30. package/dist/admin/components/fields/number-field.svelte.d.ts +5 -27
  31. package/dist/admin/components/fields/object-field.svelte +26 -29
  32. package/dist/admin/components/fields/object-field.svelte.d.ts +11 -31
  33. package/dist/admin/components/fields/radio-field.svelte +8 -20
  34. package/dist/admin/components/fields/radio-field.svelte.d.ts +5 -27
  35. package/dist/admin/components/fields/relation-field.svelte +15 -30
  36. package/dist/admin/components/fields/relation-field.svelte.d.ts +5 -27
  37. package/dist/admin/components/fields/richtext-field.svelte +4 -17
  38. package/dist/admin/components/fields/richtext-field.svelte.d.ts +5 -27
  39. package/dist/admin/components/fields/select-field.svelte +14 -28
  40. package/dist/admin/components/fields/select-field.svelte.d.ts +5 -27
  41. package/dist/admin/components/fields/seo-field.svelte +5 -12
  42. package/dist/admin/components/fields/seo-field.svelte.d.ts +8 -28
  43. package/dist/admin/components/fields/simple-array-field.svelte +29 -42
  44. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +5 -27
  45. package/dist/admin/components/fields/slug-field.svelte +6 -11
  46. package/dist/admin/components/fields/slug-field.svelte.d.ts +6 -26
  47. package/dist/admin/components/fields/text-field-wrapper.svelte +22 -40
  48. package/dist/admin/components/fields/text-field.svelte +7 -19
  49. package/dist/admin/components/fields/text-field.svelte.d.ts +5 -27
  50. package/dist/admin/components/fields/url-field-wrapper.svelte +8 -3
  51. package/dist/admin/components/fields/url-field.svelte +294 -128
  52. package/dist/admin/components/fields/url-field.svelte.d.ts +5 -27
  53. package/dist/admin/components/layout/layout-renderer.svelte +8 -6
  54. package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +221 -31
  55. package/dist/admin/components/tiptap/content-editor.svelte +13 -2
  56. package/dist/admin/components/tiptap/inline-block-node.d.ts +1 -0
  57. package/dist/admin/components/tiptap/inline-block-node.js +18 -1
  58. package/dist/admin/components/tiptap/slash-command.js +2 -3
  59. package/dist/admin/components/tiptap/standalone-form.d.ts +7 -0
  60. package/dist/admin/components/tiptap/standalone-form.js +31 -0
  61. package/dist/admin/components/tiptap/tiptap-editor.svelte +7 -0
  62. package/dist/admin/remote/entry.remote.js +16 -0
  63. package/dist/admin/styles/admin.css +10 -0
  64. package/dist/admin/utils/fieldCondition.d.ts +6 -0
  65. package/dist/admin/utils/fieldCondition.js +20 -0
  66. package/dist/components/ui/switch/index.d.ts +2 -0
  67. package/dist/components/ui/switch/index.js +4 -0
  68. package/dist/components/ui/switch/switch.svelte +26 -0
  69. package/dist/components/ui/switch/switch.svelte.d.ts +4 -0
  70. package/dist/core/fields/fieldSchemaToTs.js +15 -3
  71. package/dist/core/fields/formFieldSchemaToTs.js +22 -6
  72. package/dist/core/fields/urlUtils.d.ts +14 -0
  73. package/dist/core/fields/urlUtils.js +21 -0
  74. package/dist/core/server/fields/populateEntry.js +43 -0
  75. package/dist/core/server/fields/resolveImageFields.js +33 -1
  76. package/dist/core/server/fields/resolveRelationFields.js +46 -0
  77. package/dist/core/server/fields/resolveRichtextLinks.js +15 -1
  78. package/dist/core/server/fields/resolveUrlFields.js +65 -0
  79. package/dist/core/server/generator/formFieldSchemaToString.js +40 -9
  80. package/dist/core/server/generator/formFields.js +2 -0
  81. package/dist/core/server/generator/generator.js +25 -1
  82. package/dist/schemas/field/url.d.ts +2 -0
  83. package/dist/schemas/field/url.js +4 -2
  84. package/dist/types/fields.d.ts +9 -0
  85. package/dist/types/formFields.d.ts +15 -2
  86. package/dist/types/index.d.ts +1 -0
  87. package/dist/types/index.js +1 -0
  88. package/dist/updates/0.5.3/index.d.ts +2 -0
  89. package/dist/updates/0.5.3/index.js +19 -0
  90. package/dist/updates/index.js +2 -1
  91. package/package.json +2 -1
  92. package/dist/admin/components/fields/standalone-field-renderer.svelte +0 -148
  93. package/dist/admin/components/fields/standalone-field-renderer.svelte.d.ts +0 -9
@@ -1,13 +1,8 @@
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 Accordion from '../../../components/ui/accordion/index.js';
7
3
  import Button from '../../../components/ui/button/button.svelte';
8
- import SuperDebug, {
4
+ import {
9
5
  formFieldProxy,
10
- type FormFieldProxy,
11
6
  type FormPathLeaves,
12
7
  type SuperForm
13
8
  } from 'sveltekit-superforms';
@@ -19,7 +14,6 @@
19
14
  } from '../../../types/fields.js';
20
15
  import FieldRenderer from './field-renderer.svelte';
21
16
  import { onMount, tick } from 'svelte';
22
- import * as Form from '../../../components/ui/form/index.js';
23
17
  import CirclePlus from '@tabler/icons-svelte/icons/circle-plus';
24
18
  import Badge from '../../../components/ui/badge/badge.svelte';
25
19
  import * as DropdownMenu from '../../../components/ui/dropdown-menu/index.js';
@@ -47,25 +41,31 @@
47
41
 
48
42
  type Props = {
49
43
  field: BlocksField;
50
- form: SuperForm<T>;
51
- path: FormPathLeaves<T, ObjectFieldData[] | undefined>;
44
+ form: SuperForm<Record<string, unknown>>;
45
+ path: FormPathLeaves<Record<string, unknown>>;
52
46
  focusedPath?: string | null;
53
47
  flashingPath?: string | null;
54
48
  depth?: number;
55
49
  };
56
50
 
57
- let { field, form, path, focusedPath = null, flashingPath = null, depth = 0, ...props }: Props = $props();
51
+ let {
52
+ field,
53
+ form,
54
+ path,
55
+ focusedPath = null,
56
+ flashingPath = null,
57
+ depth = 0,
58
+ ...props
59
+ }: Props = $props();
58
60
 
59
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<
60
- ObjectFieldData[] | undefined
61
- >;
61
+ const { value } = formFieldProxy(form, path) as { value: import('svelte/store').Writable<ObjectFieldData[] | undefined> };
62
62
 
63
63
  onMount(() => {
64
64
  if (!$value) {
65
65
  $value = [];
66
66
  }
67
67
 
68
- $value = $value.reduce((acc, item) => {
68
+ $value = $value.reduce((acc: ObjectFieldData[], item: ObjectFieldData) => {
69
69
  if (!item.slug) return acc;
70
70
  if (field.of.find((o) => o.slug === item.slug) === undefined) return acc;
71
71
  acc.push(item);
@@ -215,9 +215,9 @@
215
215
 
216
216
  const isFixedLength = $derived(
217
217
  field.minItems !== undefined &&
218
- field.maxItems !== undefined &&
219
- field.minItems === field.maxItems &&
220
- field.minItems > 0
218
+ field.maxItems !== undefined &&
219
+ field.minItems === field.maxItems &&
220
+ field.minItems > 0
221
221
  );
222
222
  const fixedCount = $derived(isFixedLength ? field.minItems! : 0);
223
223
 
@@ -226,11 +226,15 @@
226
226
 
227
227
  <div class="flex items-center justify-between gap-4">
228
228
  <div class="flex items-center gap-2">
229
- <RequiredLabel required={field.minItems !== undefined && field.minItems > 0} class="text-lg">{getLocalizedLabel(field.label, interfaceLanguage.current)}</RequiredLabel>
229
+ <RequiredLabel required={field.minItems !== undefined && field.minItems > 0} class="text-lg"
230
+ >{getLocalizedLabel(field.label, interfaceLanguage.current)}</RequiredLabel
231
+ >
230
232
  {#if isFixedLength}
231
- <span class="text-xs text-muted-foreground">{fixedCount} elementów</span>
233
+ <span class="text-muted-foreground text-xs">{fixedCount} elementów</span>
232
234
  {:else if field.maxItems !== undefined}
233
- <span class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}">{$value?.length ?? 0} / {field.maxItems}</span>
235
+ <span class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}"
236
+ >{$value?.length ?? 0} / {field.maxItems}</span
237
+ >
234
238
  {/if}
235
239
  </div>
236
240
 
@@ -281,105 +285,119 @@
281
285
  dndState.targetContainer = null;
282
286
  dndState.targetElement = null;
283
287
 
284
- setTimeout(() => { dropProcessing = false; }, 50);
288
+ setTimeout(() => {
289
+ dropProcessing = false;
290
+ }, 50);
285
291
  }
286
292
  }
287
293
  }}
288
294
  animate:flip={{ duration: 200 }}
289
295
  >
290
- {#key index}
291
- {#if $value[index].data && $value[index].slug}
292
- {@const item = $value[index]}
293
- {@const objectField = field.of.find((option) => option.slug === item.slug)}
294
-
295
- {#if objectField}
296
- <Accordion.Item value={index.toString()} class="border-0" data-depth={depth + 1}>
297
- <Accordion.Trigger
298
- class="items-center border px-4 text-base font-normal data-[state=open]:rounded-b-none"
299
- >
300
- <div class="flex grow items-center justify-between gap-4">
301
- <div class="flex items-center gap-4">
302
- {#if !isFixedLength || fixedCount > 1}
303
- <!-- svelte-ignore a11y_no_static_element_interactions -->
304
- <div
305
- use:draggable={{ container: index.toString(), dragData: { id: item._id } }}
306
- class="cursor-grab text-muted-foreground hover:text-foreground"
307
- onmousedown={(e) => e.stopPropagation()}
308
- onclick={(e) => e.stopPropagation()}
309
- >
310
- <GripVertical class="h-4 w-4" />
296
+ {#key index}
297
+ {#if $value[index].data && $value[index].slug}
298
+ {@const item = $value[index]}
299
+ {@const objectField = field.of.find((option) => option.slug === item.slug)}
300
+
301
+ {#if objectField}
302
+ <Accordion.Item value={index.toString()} class="border-0" data-depth={depth + 1}>
303
+ <Accordion.Trigger
304
+ class="items-center border px-4 text-base font-normal data-[state=open]:rounded-b-none"
305
+ >
306
+ <div class="flex grow items-center justify-between gap-4">
307
+ <div class="flex items-center gap-4">
308
+ {#if !isFixedLength || fixedCount > 1}
309
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
310
+ <div
311
+ use:draggable={{
312
+ container: index.toString(),
313
+ dragData: { id: item._id }
314
+ }}
315
+ class="text-muted-foreground hover:text-foreground cursor-grab"
316
+ onmousedown={(e) => e.stopPropagation()}
317
+ onclick={(e) => e.stopPropagation()}
318
+ >
319
+ <GripVertical class="h-4 w-4" />
320
+ </div>
321
+ {/if}
322
+ <span>{index < 10 ? '0' : ''}{index + 1}</span>
323
+ <Badge variant="outline"
324
+ >{getLocalizedLabel(objectField.label, interfaceLanguage.current) ||
325
+ objectField.slug}</Badge
326
+ >
327
+ <span>{getAccordionLabel($value[index])}</span>
311
328
  </div>
329
+
330
+ {#if !(isFixedLength && fixedCount <= 1)}
331
+ <DropdownMenu.Root>
332
+ <DropdownMenu.Trigger
333
+ class="data-[state=open]:bg-muted text-muted-foreground flex size-8"
334
+ >
335
+ {#snippet child({ props })}
336
+ <Button variant="ghost" size="icon" {...props}>
337
+ <DotsVerticalIcon />
338
+ <span class="sr-only">Open menu</span>
339
+ </Button>
340
+ {/snippet}
341
+ </DropdownMenu.Trigger>
342
+ <DropdownMenu.Content align="end" class="w-32">
343
+ {#if !isFixedLength}
344
+ <DropdownMenu.Item
345
+ onclick={() => duplicateItem(index)}
346
+ disabled={atMax}
347
+ >
348
+ Duplicate
349
+ </DropdownMenu.Item>
350
+ {/if}
351
+ <DropdownMenu.Item
352
+ onclick={() => moveItemUp(index)}
353
+ disabled={index === 0}
354
+ >
355
+ Move up
356
+ </DropdownMenu.Item>
357
+ <DropdownMenu.Item
358
+ onclick={() => moveItemDown(index)}
359
+ disabled={$value && index === $value.length - 1}
360
+ >
361
+ Move down
362
+ </DropdownMenu.Item>
363
+ {#if !isFixedLength}
364
+ <DropdownMenu.Item
365
+ variant="destructive"
366
+ onclick={() => removeItem(index)}
367
+ >
368
+ Delete
369
+ </DropdownMenu.Item>
370
+ {/if}
371
+ </DropdownMenu.Content>
372
+ </DropdownMenu.Root>
312
373
  {/if}
313
- <span>{index < 10 ? '0' : ''}{index + 1}</span>
314
- <Badge variant="outline">{getLocalizedLabel(objectField.label, interfaceLanguage.current) || objectField.slug}</Badge>
315
- <span>{getAccordionLabel($value[index])}</span>
316
374
  </div>
317
-
318
- {#if !(isFixedLength && fixedCount <= 1)}
319
- <DropdownMenu.Root>
320
- <DropdownMenu.Trigger
321
- class="data-[state=open]:bg-muted text-muted-foreground flex size-8"
322
- >
323
- {#snippet child({ props })}
324
- <Button variant="ghost" size="icon" {...props}>
325
- <DotsVerticalIcon />
326
- <span class="sr-only">Open menu</span>
327
- </Button>
328
- {/snippet}
329
- </DropdownMenu.Trigger>
330
- <DropdownMenu.Content align="end" class="w-32">
331
- {#if !isFixedLength}
332
- <DropdownMenu.Item onclick={() => duplicateItem(index)} disabled={atMax}>
333
- Duplicate
334
- </DropdownMenu.Item>
335
- {/if}
336
- <DropdownMenu.Item onclick={() => moveItemUp(index)} disabled={index === 0}>
337
- Move up
338
- </DropdownMenu.Item>
339
- <DropdownMenu.Item
340
- onclick={() => moveItemDown(index)}
341
- disabled={$value && index === $value.length - 1}
342
- >
343
- Move down
344
- </DropdownMenu.Item>
345
- {#if !isFixedLength}
346
- <DropdownMenu.Item variant="destructive" onclick={() => removeItem(index)}>
347
- Delete
348
- </DropdownMenu.Item>
349
- {/if}
350
- </DropdownMenu.Content>
351
- </DropdownMenu.Root>
352
- {/if}
353
- </div>
354
- </Accordion.Trigger>
355
- <Accordion.Content
356
- class="space-y-4 rounded-b-md border border-t-0"
357
- style="padding: {Math.max(4, 16 - depth * 3)}px;"
358
- >
359
- {@const itemPath = joinPath(path, index)}
360
- <div data-field-path={itemPath}>
361
- <FieldRenderer
362
- objectFieldType="inline"
363
- field={objectField}
364
- form={form as SuperForm<Record<string, unknown>>}
365
- path={itemPath as FormPathLeaves<T, ObjectFieldData>}
366
- {focusedPath}
367
- {flashingPath}
368
- depth={depth + 1}
369
- />
370
- </div>
371
- </Accordion.Content>
372
- </Accordion.Item>
375
+ </Accordion.Trigger>
376
+ <Accordion.Content class="space-y-4 rounded-b-md border border-t-0 p-4">
377
+ {@const itemPath = joinPath(path, index)}
378
+ <div data-field-path={itemPath}>
379
+ <FieldRenderer
380
+ objectFieldType="inline"
381
+ field={objectField}
382
+ {form}
383
+ path={itemPath}
384
+ {focusedPath}
385
+ {flashingPath}
386
+ depth={depth + 1}
387
+ />
388
+ </div>
389
+ </Accordion.Content>
390
+ </Accordion.Item>
391
+ {:else}
392
+ <p class="text-red-500">
393
+ Invalid field configuration. Unknown slug:
394
+ {$value[index].slug}
395
+ </p>
396
+ {/if}
373
397
  {:else}
374
- <p class="text-red-500">
375
- Invalid field configuration. Unknown slug:
376
- {$value[index].slug}
377
- </p>
398
+ <p class="text-red-500">Invalid field configuration. Index: {index}</p>
378
399
  {/if}
379
- {:else}
380
- <p class="text-red-500">Invalid field configuration. Index: {index}</p>
381
- {/if}
382
- {/key}
400
+ {/key}
383
401
  </div>
384
402
  {/each}
385
403
  {/if}
@@ -388,7 +406,13 @@
388
406
  {#if !isFixedLength}
389
407
  {#if field.displayMode === 'blocks'}
390
408
  <div class="mt-4">
391
- <Button size="sm" type="button" variant="outline" disabled={atMax} onclick={() => (blockPickerOpen = true)}>
409
+ <Button
410
+ size="sm"
411
+ type="button"
412
+ variant="outline"
413
+ disabled={atMax}
414
+ onclick={() => (blockPickerOpen = true)}
415
+ >
392
416
  <CirclePlus />
393
417
  Add Block
394
418
  </Button>
@@ -401,7 +425,13 @@
401
425
  {:else}
402
426
  <div class="mt-4 flex flex-wrap gap-2">
403
427
  {#each field.of as option}
404
- <Button size="sm" type="button" variant="outline" disabled={atMax} onclick={() => addItem(option)}>
428
+ <Button
429
+ size="sm"
430
+ type="button"
431
+ variant="outline"
432
+ disabled={atMax}
433
+ onclick={() => addItem(option)}
434
+ >
405
435
  <CirclePlus />
406
436
  {getLocalizedLabel(option.label, interfaceLanguage.current) || option.slug}
407
437
  </Button>
@@ -1,33 +1,13 @@
1
1
  import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
- import type { BlocksField, ObjectFieldData } from '../../../types/fields.js';
3
- declare function $$render<T extends Record<string, unknown>>(): {
4
- props: {
5
- field: BlocksField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, ObjectFieldData[] | undefined>;
8
- focusedPath?: string | null;
9
- flashingPath?: string | null;
10
- depth?: number;
11
- };
12
- exports: {};
13
- bindings: "";
14
- slots: {};
15
- events: {};
2
+ import type { BlocksField } from '../../../types/fields.js';
3
+ type Props = {
4
+ field: BlocksField;
5
+ form: SuperForm<Record<string, unknown>>;
6
+ path: FormPathLeaves<Record<string, unknown>>;
7
+ focusedPath?: string | null;
8
+ flashingPath?: string | null;
9
+ depth?: number;
16
10
  };
17
- declare class __sveltets_Render<T extends Record<string, unknown>> {
18
- props(): ReturnType<typeof $$render<T>>['props'];
19
- events(): ReturnType<typeof $$render<T>>['events'];
20
- slots(): ReturnType<typeof $$render<T>>['slots'];
21
- bindings(): "";
22
- exports(): {};
23
- }
24
- interface $$IsomorphicComponent {
25
- 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']>> & {
26
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
27
- } & ReturnType<__sveltets_Render<T>['exports']>;
28
- <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
29
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
30
- }
31
- declare const BlocksField: $$IsomorphicComponent;
32
- type BlocksField<T extends Record<string, unknown>> = InstanceType<typeof BlocksField<T>>;
11
+ declare const BlocksField: import("svelte").Component<Props, {}, "">;
12
+ type BlocksField = ReturnType<typeof BlocksField>;
33
13
  export default BlocksField;
@@ -1,58 +1,48 @@
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 { onMount } from 'svelte';
13
- import type { BooleanField, ImageField } from '../../../types/fields.js';
14
- import * as Form from '../../../components/ui/form/index.js';
15
- import Checkbox from '../../../components/ui/checkbox/checkbox.svelte';
3
+ import type { BooleanField } from '../../../types/fields.js';
4
+ import { Switch } from '../../../components/ui/switch/index.js';
16
5
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
17
6
  import { getLocalizedLabel } from '../../utils/collectionLabel.js';
18
7
 
19
8
  type Props = {
20
9
  field: BooleanField;
21
- form: SuperForm<T>;
22
- path: FormPathLeaves<T, boolean | undefined>;
10
+ value: boolean | undefined;
23
11
  };
24
12
 
25
- let { field, form, path, ...props }: Props = $props();
13
+ let { field, value = $bindable(), ...props }: Props = $props();
26
14
 
27
15
  const interfaceLanguage = useInterfaceLanguage();
28
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<boolean | undefined>;
29
16
 
30
17
  onMount(() => {
31
- if ($value === undefined) {
32
- $value = field.defaultValue ?? false;
18
+ if (value === undefined) {
19
+ value = field.defaultValue ?? false;
33
20
  }
34
21
  });
22
+
23
+ const label = $derived(
24
+ getLocalizedLabel(field.label, interfaceLanguage.current) || field.slug
25
+ );
26
+ const description = $derived(
27
+ field.description
28
+ ? getLocalizedLabel(field.description, interfaceLanguage.current)
29
+ : undefined
30
+ );
35
31
  </script>
36
32
 
37
- {#if $value !== undefined}
38
- <Form.Label
39
- class="hover:bg-accent/50 flex items-start gap-3 rounded-lg border p-3 has-[[aria-checked=true]]:border-blue-600 has-[[aria-checked=true]]:bg-blue-50 dark:has-[[aria-checked=true]]:border-blue-900 dark:has-[[aria-checked=true]]:bg-blue-950"
40
- >
41
- <Checkbox
42
- {...props}
43
- bind:checked={$value}
44
- class="data-[state=checked]:border-blue-600 data-[state=checked]:bg-blue-600 data-[state=checked]:text-white dark:data-[state=checked]:border-blue-700 dark:data-[state=checked]:bg-blue-700"
45
- />
46
- <div class="grid gap-1.5 font-normal">
47
- <p class="text-sm leading-none font-medium">
48
- {getLocalizedLabel(field.label, interfaceLanguage.current) || field.slug}
33
+ {#if value !== undefined}
34
+ <div class="flex items-center justify-between py-1.5">
35
+ <div class="flex flex-col gap-0.5">
36
+ <span class="text-[13px] font-medium leading-none">
37
+ {label}
49
38
  {#if field.required}<span class="text-destructive ml-0.5">*</span>{/if}
50
- </p>
51
- {#if field.description}
52
- <p class="text-muted-foreground text-sm">
53
- {getLocalizedLabel(field.description, interfaceLanguage.current)}
54
- </p>
39
+ </span>
40
+ {#if description}
41
+ <span class="text-muted-foreground text-[11px]">
42
+ {description}
43
+ </span>
55
44
  {/if}
56
45
  </div>
57
- </Form.Label>
46
+ <Switch bind:checked={value} aria-label={label} />
47
+ </div>
58
48
  {/if}
@@ -1,30 +1,8 @@
1
- import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
1
  import type { BooleanField } from '../../../types/fields.js';
3
- declare function $$render<T extends Record<string, unknown>>(): {
4
- props: {
5
- field: BooleanField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, boolean | undefined>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
2
+ type Props = {
3
+ field: BooleanField;
4
+ value: boolean | 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 BooleanField: $$IsomorphicComponent;
29
- type BooleanField<T extends Record<string, unknown>> = InstanceType<typeof BooleanField<T>>;
6
+ declare const BooleanField: import("svelte").Component<Props, {}, "value">;
7
+ type BooleanField = ReturnType<typeof BooleanField>;
30
8
  export default BooleanField;
@@ -1,14 +1,4 @@
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 { onMount } from 'svelte';
13
3
  import type { CheckboxesField } from '../../../types/fields.js';
14
4
  import * as Form from '../../../components/ui/form/index.js';
@@ -18,39 +8,37 @@
18
8
 
19
9
  type Props = {
20
10
  field: CheckboxesField;
21
- form: SuperForm<T>;
22
- path: FormPathLeaves<T, string[] | undefined>;
11
+ value: string[] | undefined;
23
12
  };
24
13
 
25
- let { field, form, path, ...props }: Props = $props();
14
+ let { field, value = $bindable(), ...props }: Props = $props();
26
15
 
27
16
  const interfaceLanguage = useInterfaceLanguage();
28
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<string[] | undefined>;
29
17
 
30
18
  function isChecked(optionValue: string): boolean {
31
- return Array.isArray($value) && $value.includes(optionValue);
19
+ return Array.isArray(value) && value.includes(optionValue);
32
20
  }
33
21
 
34
22
  function toggle(optionValue: string) {
35
- if (!Array.isArray($value)) {
36
- $value = [optionValue];
23
+ if (!Array.isArray(value)) {
24
+ value = [optionValue];
37
25
  return;
38
26
  }
39
- if ($value.includes(optionValue)) {
40
- $value = $value.filter((v) => v !== optionValue);
27
+ if (value.includes(optionValue)) {
28
+ value = value.filter((v) => v !== optionValue);
41
29
  } else {
42
- $value = [...$value, optionValue];
30
+ value = [...value, optionValue];
43
31
  }
44
32
  }
45
33
 
46
34
  onMount(() => {
47
- if ($value === undefined) {
48
- $value = [];
35
+ if (value === undefined) {
36
+ value = [];
49
37
  }
50
38
  });
51
39
  </script>
52
40
 
53
- {#if $value !== undefined}
41
+ {#if value !== undefined}
54
42
  <div class="flex flex-col space-y-2">
55
43
  {#each field.options as option}
56
44
  <div class="flex items-center space-x-3">
@@ -1,30 +1,8 @@
1
- import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
1
  import type { CheckboxesField } from '../../../types/fields.js';
3
- declare function $$render<T extends Record<string, unknown>>(): {
4
- props: {
5
- field: CheckboxesField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, string[] | undefined>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
2
+ type Props = {
3
+ field: CheckboxesField;
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 CheckboxesField: $$IsomorphicComponent;
29
- type CheckboxesField<T extends Record<string, unknown>> = InstanceType<typeof CheckboxesField<T>>;
6
+ declare const CheckboxesField: import("svelte").Component<Props, {}, "value">;
7
+ type CheckboxesField = ReturnType<typeof CheckboxesField>;
30
8
  export default CheckboxesField;
@@ -1,27 +1,14 @@
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 ContentEditor from '../tiptap/content-editor.svelte';
13
3
  import type { ContentField } from '../../../types/fields.js';
14
4
  import type { StructuredContentDoc } from '../../../types/structured-content.js';
15
5
 
16
6
  type Props = {
17
7
  field: ContentField;
18
- form: SuperForm<T>;
19
- path: FormPathLeaves<T, StructuredContentDoc | undefined>;
8
+ value: StructuredContentDoc | undefined;
20
9
  };
21
10
 
22
- let { field, form, path, ...props }: Props = $props();
23
-
24
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<StructuredContentDoc | undefined>;
11
+ let { field, value = $bindable(), ...props }: Props = $props();
25
12
  </script>
26
13
 
27
- <ContentEditor bind:value={$value} inlineBlocks={field.inlineBlocks} />
14
+ <ContentEditor bind:value inlineBlocks={field.inlineBlocks} />