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,31 +1,9 @@
1
- import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
1
  import type { ContentField } from '../../../types/fields.js';
3
2
  import type { StructuredContentDoc } from '../../../types/structured-content.js';
4
- declare function $$render<T extends Record<string, unknown>>(): {
5
- props: {
6
- field: ContentField;
7
- form: SuperForm<T>;
8
- path: FormPathLeaves<T, StructuredContentDoc | undefined>;
9
- };
10
- exports: {};
11
- bindings: "";
12
- slots: {};
13
- events: {};
3
+ type Props = {
4
+ field: ContentField;
5
+ value: StructuredContentDoc | undefined;
14
6
  };
15
- declare class __sveltets_Render<T extends Record<string, unknown>> {
16
- props(): ReturnType<typeof $$render<T>>['props'];
17
- events(): ReturnType<typeof $$render<T>>['events'];
18
- slots(): ReturnType<typeof $$render<T>>['slots'];
19
- bindings(): "";
20
- exports(): {};
21
- }
22
- interface $$IsomorphicComponent {
23
- 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']>> & {
24
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
25
- } & ReturnType<__sveltets_Render<T>['exports']>;
26
- <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
27
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
28
- }
29
- declare const ContentField: $$IsomorphicComponent;
30
- type ContentField<T extends Record<string, unknown>> = InstanceType<typeof ContentField<T>>;
7
+ declare const ContentField: import("svelte").Component<Props, {}, "value">;
8
+ type ContentField = ReturnType<typeof ContentField>;
31
9
  export default ContentField;
@@ -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>">
1
+ <script lang="ts">
6
2
  import Input from '../../../components/ui/input/input.svelte';
7
3
  import type { DateField } 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
 
16
6
  type Props = {
17
7
  field: DateField;
18
- form: SuperForm<T>;
19
- path: FormPathLeaves<T, string | undefined>;
8
+ value: string | undefined;
20
9
  };
21
10
 
22
- let { field, form, path, ...props }: Props = $props();
23
-
24
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<string | undefined>;
11
+ let { field, value = $bindable(), ...props }: Props = $props();
25
12
 
26
13
  // Convert ISO date to YYYY-MM-DD for input
27
14
  function toInputFormat(iso: string | undefined): string {
@@ -35,21 +22,21 @@
35
22
  return `${local}T00:00:00.000Z`;
36
23
  }
37
24
 
38
- let localValue = $state(toInputFormat($value));
25
+ let localValue = $state(toInputFormat(value));
39
26
 
40
27
  $effect(() => {
41
- localValue = toInputFormat($value);
28
+ localValue = toInputFormat(value);
42
29
  });
43
30
 
44
31
  function handleInput(e: Event) {
45
32
  const target = e.target as HTMLInputElement;
46
33
  localValue = target.value;
47
- $value = target.value ? toIso(target.value) : '';
34
+ value = target.value ? toIso(target.value) : '';
48
35
  }
49
36
 
50
37
  onMount(() => {
51
- if ($value === undefined) {
52
- $value = '';
38
+ if (value === undefined) {
39
+ value = '';
53
40
  }
54
41
  });
55
42
  </script>
@@ -1,30 +1,8 @@
1
1
  import type { DateField } 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: DateField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, string | undefined>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
2
+ type Props = {
3
+ field: DateField;
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 DateField: $$IsomorphicComponent;
29
- type DateField<T extends Record<string, unknown>> = InstanceType<typeof DateField<T>>;
6
+ declare const DateField: import("svelte").Component<Props, {}, "value">;
7
+ type DateField = ReturnType<typeof DateField>;
30
8
  export default DateField;
@@ -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>">
1
+ <script lang="ts">
6
2
  import Input from '../../../components/ui/input/input.svelte';
7
3
  import type { DateTimeField } 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
 
16
6
  type Props = {
17
7
  field: DateTimeField;
18
- form: SuperForm<T>;
19
- path: FormPathLeaves<T, string | undefined>;
8
+ value: string | undefined;
20
9
  };
21
10
 
22
- let { field, form, path, ...props }: Props = $props();
23
-
24
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<string | undefined>;
11
+ let { field, value = $bindable(), ...props }: Props = $props();
25
12
 
26
13
  // Convert ISO datetime to datetime-local format (YYYY-MM-DDTHH:mm)
27
14
  function toDatetimeLocal(iso: string | undefined): string {
@@ -37,21 +24,21 @@
37
24
  return new Date(local).toISOString();
38
25
  }
39
26
 
40
- let localValue = $state(toDatetimeLocal($value));
27
+ let localValue = $state(toDatetimeLocal(value));
41
28
 
42
29
  $effect(() => {
43
- localValue = toDatetimeLocal($value);
30
+ localValue = toDatetimeLocal(value);
44
31
  });
45
32
 
46
33
  function handleInput(e: Event) {
47
34
  const target = e.target as HTMLInputElement;
48
35
  localValue = target.value;
49
- $value = target.value ? toIso(target.value) : '';
36
+ value = target.value ? toIso(target.value) : '';
50
37
  }
51
38
 
52
39
  onMount(() => {
53
- if ($value === undefined) {
54
- $value = '';
40
+ if (value === undefined) {
41
+ value = '';
55
42
  }
56
43
  });
57
44
  </script>
@@ -1,30 +1,8 @@
1
1
  import type { DateTimeField } 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: DateTimeField;
6
- form: SuperForm<T>;
7
- path: FormPathLeaves<T, string | undefined>;
8
- };
9
- exports: {};
10
- bindings: "";
11
- slots: {};
12
- events: {};
2
+ type Props = {
3
+ field: DateTimeField;
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 DatetimeField: $$IsomorphicComponent;
29
- type DatetimeField<T extends Record<string, unknown>> = InstanceType<typeof DatetimeField<T>>;
6
+ declare const DatetimeField: import("svelte").Component<Props, {}, "value">;
7
+ type DatetimeField = ReturnType<typeof DatetimeField>;
30
8
  export default DatetimeField;
@@ -1,8 +1,7 @@
1
1
  <script lang="ts">
2
2
  import * as Form from '../../../components/ui/form/index.js';
3
+ import { formFieldProxy, type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
3
4
 
4
- import type { FormPathLeaves, SuperForm } from 'sveltekit-superforms';
5
- import SlugField from './slug-field.svelte';
6
5
  import type { Field, FieldType } from '../../../types/fields.js';
7
6
  import TextFieldWrapper from './text-field-wrapper.svelte';
8
7
  import RequiredLabel from './required-label.svelte';
@@ -32,6 +31,10 @@
32
31
 
33
32
  const interfaceLanguage = useInterfaceLanguage();
34
33
 
34
+ // Bridge: SuperForm store → $bindable for leaf components
35
+ // Cast to any: runtime types enforced by child components via $bindable
36
+ const { value } = formFieldProxy(form, path) as { value: import('svelte/store').Writable<any> };
37
+
35
38
  const fieldsWithNoDescription: FieldType[] = ['boolean', 'object', 'blocks', 'seo'];
36
39
  const fieldsWithNoLabel: FieldType[] = ['boolean', 'object', 'blocks', 'seo'];
37
40
 
@@ -74,7 +77,7 @@
74
77
  {#if field.required}<span class="text-destructive ml-0.5">*</span>{/if}
75
78
  </Form.Legend>
76
79
 
77
- <RadioField {field} {form} {path} {...props} />
80
+ <RadioField {field} bind:value={$value} {...props} />
78
81
 
79
82
  {#if field.description}
80
83
  <Form.Description>{getLocalizedLabel(field.description, interfaceLanguage.current)}</Form.Description>
@@ -88,7 +91,7 @@
88
91
  {#if field.required}<span class="text-destructive ml-0.5">*</span>{/if}
89
92
  </Form.Legend>
90
93
 
91
- <CheckboxesField {field} {form} {path} {...props} />
94
+ <CheckboxesField {field} bind:value={$value} {...props} />
92
95
 
93
96
  {#if field.description}
94
97
  <Form.Description>{getLocalizedLabel(field.description, interfaceLanguage.current)}</Form.Description>
@@ -116,35 +119,45 @@
116
119
  {/if}
117
120
 
118
121
  {#if field.type === 'image'}
119
- <LazyField loader={() => import('./image-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-24" />
122
+ {#await import('./image-field.svelte') then { default: ImageField }}
123
+ <ImageField {field} bind:value={$value} />
124
+ {/await}
120
125
  {:else if field.type === 'media'}
121
- <LazyField loader={() => import('./media-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-24" />
126
+ {#await import('./media-field.svelte') then { default: MediaField }}
127
+ <MediaField {field} bind:value={$value} />
128
+ {/await}
122
129
  {:else if field.type === 'file'}
123
- <LazyField loader={() => import('./file-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-12" />
130
+ {#await import('./file-field.svelte') then { default: FileField }}
131
+ <FileField {field} bind:value={$value} />
132
+ {/await}
124
133
  {:else if field.type === 'blocks'}
125
- <LazyField loader={() => import('./blocks-field.svelte')} props={{ field, form, path, focusedPath, flashingPath, depth, ...props }} skeletonClass="h-20" />
134
+ <LazyField loader={() => import('./blocks-field.svelte')} props={{ field, form, path, focusedPath, flashingPath, depth }} skeletonClass="h-20" />
126
135
  {:else if field.type === 'array'}
127
- <LazyField loader={() => import('./simple-array-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-12" />
136
+ {#await import('./simple-array-field.svelte') then { default: ArrayField }}
137
+ <ArrayField {field} bind:value={$value} />
138
+ {/await}
128
139
  {:else if field.type === 'object'}
129
- <LazyField loader={() => import('./object-field.svelte')} props={{ field, form, path, objectFieldType, focusedPath, flashingPath, depth, ...props }} skeletonClass="h-20" />
140
+ <LazyField loader={() => import('./object-field.svelte')} props={{ field, form, path, objectFieldType, focusedPath, flashingPath, depth }} skeletonClass="h-20" />
130
141
  {:else if field.type === 'slug'}
131
- <SlugField {field} {form} {path} {...props} />
142
+ <LazyField loader={() => import('./slug-field.svelte')} props={{ field, form, path }} skeletonClass="h-10" />
132
143
  {:else if field.type === 'boolean'}
133
- <BooleanField {field} {form} {path} {...props} />
144
+ <BooleanField {field} bind:value={$value} />
134
145
  {:else if field.type === 'number'}
135
- <NumberField {field} {form} {path} {...props} />
146
+ <NumberField {field} bind:value={$value} />
136
147
  {:else if field.type === 'seo'}
137
- <LazyField loader={() => import('./seo-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-16" />
148
+ <LazyField loader={() => import('./seo-field.svelte')} props={{ field, form, path }} skeletonClass="h-16" />
138
149
  {:else if field.type === 'url'}
139
- <UrlFieldWrapper {field} {form} {path} {...props} />
150
+ <UrlFieldWrapper {field} {form} {path} />
140
151
  {:else if field.type === 'relation'}
141
- <LazyField loader={() => import('./relation-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-16" />
152
+ {#await import('./relation-field.svelte') then { default: RelationField }}
153
+ <RelationField {field} bind:value={$value} />
154
+ {/await}
142
155
  {:else if field.type === 'date'}
143
- <DateField {field} {form} {path} {...props} />
156
+ <DateField {field} bind:value={$value} />
144
157
  {:else if field.type === 'datetime'}
145
- <DateTimeField {field} {form} {path} {...props} />
158
+ <DateTimeField {field} bind:value={$value} />
146
159
  {:else if field.type === 'select'}
147
- <SelectField {field} {form} {path} {...props} />
160
+ <SelectField {field} bind:value={$value} />
148
161
  {:else}
149
162
  <p>Nieobsługiwany typ pola: {field.type}</p>
150
163
  {/if}
@@ -1,4 +1,4 @@
1
- import type { FormPathLeaves, SuperForm } from 'sveltekit-superforms';
1
+ import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
2
  import type { Field } from '../../../types/fields.js';
3
3
  type Props = {
4
4
  objectFieldType?: 'default' | 'inline';
@@ -0,0 +1,21 @@
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 { formFieldProxy, type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
7
+ import type { Component } from 'svelte';
8
+
9
+ type Props = {
10
+ form: SuperForm<T>;
11
+ path: FormPathLeaves<T>;
12
+ component: Component<any>;
13
+ [key: string]: unknown;
14
+ };
15
+
16
+ let { form, path, component: Comp, ...rest }: Props = $props();
17
+
18
+ const { value } = formFieldProxy(form, path);
19
+ </script>
20
+
21
+ <Comp bind:value={$value} {...rest} />
@@ -0,0 +1,31 @@
1
+ import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
+ import type { Component } from 'svelte';
3
+ declare function $$render<T extends Record<string, unknown>>(): {
4
+ props: {
5
+ [key: string]: unknown;
6
+ form: SuperForm<T>;
7
+ path: FormPathLeaves<T>;
8
+ component: Component<any>;
9
+ };
10
+ exports: {};
11
+ bindings: "";
12
+ slots: {};
13
+ events: {};
14
+ };
15
+ declare class __sveltets_Render<T extends Record<string, unknown>> {
16
+ props(): ReturnType<typeof $$render<T>>['props'];
17
+ events(): ReturnType<typeof $$render<T>>['events'];
18
+ slots(): ReturnType<typeof $$render<T>>['slots'];
19
+ bindings(): "";
20
+ exports(): {};
21
+ }
22
+ interface $$IsomorphicComponent {
23
+ 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']>> & {
24
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
25
+ } & ReturnType<__sveltets_Render<T>['exports']>;
26
+ <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
27
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
28
+ }
29
+ declare const FieldValueBridge: $$IsomorphicComponent;
30
+ type FieldValueBridge<T extends Record<string, unknown>> = InstanceType<typeof FieldValueBridge<T>>;
31
+ export default FieldValueBridge;
@@ -4,6 +4,7 @@
4
4
  import { cn } from '../../../utils.js';
5
5
  import FieldRenderer from './field-renderer.svelte';
6
6
  import type { Field } from '../../../types/fields.js';
7
+ import { evaluateCondition } from '../../utils/fieldCondition.js';
7
8
  import { normalizePath } from '../../utils/objectPath.js';
8
9
  import { tick } from 'svelte';
9
10
 
@@ -118,15 +119,17 @@
118
119
  onclick={handleClick}
119
120
  >
120
121
  {#each fields as field (field.slug)}
121
- {@const showFlash = isFlashing(field.slug)}
122
- <div
123
- data-field-path={field.slug}
124
- class={cn(
125
- 'rounded-lg transition-all duration-500',
126
- showFlash && 'ring-2 ring-primary ring-offset-2 bg-primary/5 animate-in fade-in'
127
- )}
128
- >
129
- <FieldRenderer {field} {form} path={field.slug} {focusedPath} {flashingPath} />
130
- </div>
122
+ {#if evaluateCondition(field.showWhen, (slug) => $formData[slug])}
123
+ {@const showFlash = isFlashing(field.slug)}
124
+ <div
125
+ data-field-path={field.slug}
126
+ class={cn(
127
+ 'rounded-lg transition-all duration-500',
128
+ showFlash && 'ring-2 ring-primary ring-offset-2 bg-primary/5 animate-in fade-in'
129
+ )}
130
+ >
131
+ <FieldRenderer {field} {form} path={field.slug} {focusedPath} {flashingPath} />
132
+ </div>
133
+ {/if}
131
134
  {/each}
132
135
  </form>
@@ -1,15 +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>">
1
+ <script lang="ts">
6
2
  import * as Dialog from '../../../components/ui/dialog/index.js';
7
- import {
8
- formFieldProxy,
9
- type FormFieldProxy,
10
- type FormPathLeaves,
11
- type SuperForm
12
- } from 'sveltekit-superforms';
13
3
  import { onMount } from 'svelte';
14
4
  import FilePreview from '../media/file-preview.svelte';
15
5
  import { buttonVariants } from '../../../components/ui/button/button.svelte';
@@ -19,36 +9,31 @@
19
9
 
20
10
  type Props = {
21
11
  field: FileField;
22
- form: SuperForm<T>;
23
- path: FormPathLeaves<T, string | string[] | undefined>;
12
+ value: string | string[] | undefined;
24
13
  };
25
14
 
26
- let { field, form, path, ...props }: Props = $props();
27
-
28
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<
29
- string | string[] | undefined
30
- >;
15
+ let { field, value = $bindable(), ...props }: Props = $props();
31
16
 
32
17
  onMount(() => {
33
- if ($value === undefined) {
34
- $value = field.multiple ? [] : '';
18
+ if (value === undefined) {
19
+ value = field.multiple ? [] : '';
35
20
  }
36
21
  });
37
22
  </script>
38
23
 
39
- {#if $value !== undefined}
24
+ {#if value !== undefined}
40
25
  <Dialog.Root>
41
26
  <Dialog.Trigger type="button" class={buttonVariants({ variant: 'outline' })}
42
27
  >Select File</Dialog.Trigger
43
28
  >
44
29
  <Dialog.Content class="max-h-[80vh] w-[80vw] !max-w-none overflow-y-scroll">
45
- <MediaLibrary bind:selected={$value} multiple={field.multiple} accept={field.accept} />
30
+ <MediaLibrary bind:selected={value} multiple={field.multiple} accept={field.accept} />
46
31
  </Dialog.Content>
47
32
  </Dialog.Root>
48
33
 
49
34
  <div class="flex flex-wrap gap-2">
50
- {#if field.multiple && Array.isArray($value)}
51
- {#each $value as item}
35
+ {#if field.multiple && Array.isArray(value)}
36
+ {#each value as item}
52
37
  {#if z.string().uuid().safeParse(item).success}
53
38
  <FilePreview
54
39
  id={item}
@@ -56,10 +41,10 @@
56
41
  />
57
42
  {/if}
58
43
  {/each}
59
- {:else if typeof $value === 'string'}
60
- {#if z.string().uuid().safeParse($value).success}
44
+ {:else if typeof value === 'string'}
45
+ {#if z.string().uuid().safeParse(value).success}
61
46
  <FilePreview
62
- id={$value}
47
+ id={value}
63
48
  class="aspect-square w-full max-w-[100px] object-cover object-center"
64
49
  />
65
50
  {/if}
@@ -1,30 +1,8 @@
1
- import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
1
  import type { FileField } from '../../../types/fields.js';
3
- declare function $$render<T extends Record<string, unknown>>(): {
4
- props: {
5
- field: FileField;
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: FileField;
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 FileField: $$IsomorphicComponent;
29
- type FileField<T extends Record<string, unknown>> = InstanceType<typeof FileField<T>>;
6
+ declare const FileField: import("svelte").Component<Props, {}, "value">;
7
+ type FileField = ReturnType<typeof FileField>;
30
8
  export default FileField;
@@ -1,15 +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>">
1
+ <script lang="ts">
6
2
  import * as Dialog from '../../../components/ui/dialog/index.js';
7
- import {
8
- formFieldProxy,
9
- type FormFieldProxy,
10
- type FormPathLeaves,
11
- type SuperForm
12
- } from 'sveltekit-superforms';
13
3
  import { onMount } from 'svelte';
14
4
  import Button from '../../../components/ui/button/button.svelte';
15
5
  import type { ImageField } from '../../../types/fields.js';
@@ -42,31 +32,26 @@
42
32
 
43
33
  type Props = {
44
34
  field: ImageField;
45
- form: SuperForm<T>;
46
- path: FormPathLeaves<T, string | string[] | undefined>;
35
+ value: string | string[] | undefined;
47
36
  };
48
37
 
49
- let { field, form, path, ...props }: Props = $props();
50
-
51
- const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<
52
- string | string[] | undefined
53
- >;
38
+ let { field, value = $bindable(), ...props }: Props = $props();
54
39
 
55
40
  onMount(() => {
56
- if ($value === undefined) {
57
- $value = field.multiple ? [] : '';
41
+ if (value === undefined) {
42
+ value = field.multiple ? [] : '';
58
43
  }
59
44
  });
60
45
  </script>
61
46
 
62
- {#if $value !== undefined}
47
+ {#if value !== undefined}
63
48
  <Dialog.Root>
64
49
  <Dialog.Trigger>
65
50
  {#snippet child({ props })}
66
- {#if $value && ((typeof $value === 'string' && $value !== '') || (Array.isArray($value) && $value.length > 0))}
51
+ {#if value && ((typeof value === 'string' && value !== '') || (Array.isArray(value) && value.length > 0))}
67
52
  <div class="group/dialog-trigger relative aspect-square max-w-64 overflow-hidden rounded-2xl border">
68
- {#if typeof $value === 'string'}
69
- {#await remotes.getFileById($value)}
53
+ {#if typeof value === 'string'}
54
+ {#await remotes.getFileById(value)}
70
55
  <div class="animate-pulse bg-muted w-full h-full rounded-xl"></div>
71
56
  {:then file}
72
57
  {#if file}
@@ -83,8 +68,8 @@
83
68
  </button>
84
69
  {/if}
85
70
  {/await}
86
- {:else if Array.isArray($value) && $value.length > 0}
87
- {@const valueArr = $value}
71
+ {:else if Array.isArray(value) && value.length > 0}
72
+ {@const valueArr = value}
88
73
  {#await remotes.getMediaFiles({ data: { ids: valueArr } })}
89
74
  <div class="animate-pulse bg-muted w-full h-full rounded-xl"></div>
90
75
  {:then files}
@@ -151,7 +136,7 @@
151
136
  class="h-8"
152
137
  onclick={(e) => {
153
138
  e.stopPropagation();
154
- $value = field.multiple ? [] : '';
139
+ value = field.multiple ? [] : '';
155
140
  }}
156
141
  >
157
142
  <X class="h-4 w-4" />
@@ -176,7 +161,7 @@
176
161
  {/snippet}
177
162
  </Dialog.Trigger>
178
163
  <Dialog.Content class="h-[85vh] w-full max-w-6xl! sm:max-w-6xl! overflow-hidden p-0 flex flex-col">
179
- <MediaSelector bind:selected={$value} multiple={field.multiple} accept="image/*" />
164
+ <MediaSelector bind:selected={value} multiple={field.multiple} accept="image/*" />
180
165
  </Dialog.Content>
181
166
  </Dialog.Root>
182
167