@lattice-php/lattice 0.24.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/action/components/action-form.js +37 -5
  2. package/dist/action/components/action-form.js.map +1 -1
  3. package/dist/action/components/action-group.js +1 -1
  4. package/dist/action/components/action-group.js.map +1 -1
  5. package/dist/action/components/action.js +3 -2
  6. package/dist/action/components/action.js.map +1 -1
  7. package/dist/action/hooks/use-action.js +2 -1
  8. package/dist/action/hooks/use-action.js.map +1 -1
  9. package/dist/appearance/index.d.ts +1 -1
  10. package/dist/appearance/index.js +8 -8
  11. package/dist/appearance/index.js.map +1 -1
  12. package/dist/chat/components/prompt-input.js +1 -2
  13. package/dist/chat/components/prompt-input.js.map +1 -1
  14. package/dist/create-app.js +2 -2
  15. package/dist/create-app.js.map +1 -1
  16. package/dist/form/components/base/submit-button.d.ts +4 -3
  17. package/dist/form/components/base/submit-button.js +2 -1
  18. package/dist/form/components/base/submit-button.js.map +1 -1
  19. package/dist/form/components/fields/date-picker-field.js +3 -3
  20. package/dist/form/components/fields/date-picker-field.js.map +1 -1
  21. package/dist/form/components/fields/number-input.js +1 -1
  22. package/dist/form/components/fields/number-input.js.map +1 -1
  23. package/dist/form/components/fields/rich-editor-field.js +1 -1
  24. package/dist/form/components/fields/rich-editor-field.js.map +1 -1
  25. package/dist/form/components/fields/row-action-menu.js +3 -3
  26. package/dist/form/components/fields/row-action-menu.js.map +1 -1
  27. package/dist/form/components/fields/row-actions.d.ts +1 -1
  28. package/dist/form/components/fields/row-actions.js +4 -4
  29. package/dist/form/components/fields/row-actions.js.map +1 -1
  30. package/dist/form/components/fields/toggle.js +1 -1
  31. package/dist/form/components/fields/toggle.js.map +1 -1
  32. package/dist/form/components/form.js +15 -5
  33. package/dist/form/components/form.js.map +1 -1
  34. package/dist/form/components/index.d.ts +1 -0
  35. package/dist/form/components/index.js +2 -1
  36. package/dist/form/components/wizard.d.ts +3 -0
  37. package/dist/form/components/wizard.js +148 -0
  38. package/dist/form/components/wizard.js.map +1 -0
  39. package/dist/form/embed.d.ts +1 -1
  40. package/dist/form/embed.js +2 -2
  41. package/dist/form/hooks/context.d.ts +7 -2
  42. package/dist/form/hooks/context.js +4 -1
  43. package/dist/form/hooks/context.js.map +1 -1
  44. package/dist/form/index.js +2 -1
  45. package/dist/form/lib/field-errors.d.ts +2 -0
  46. package/dist/form/lib/field-errors.js +5 -1
  47. package/dist/form/lib/field-errors.js.map +1 -1
  48. package/dist/form/lib/field-props.d.ts +6 -0
  49. package/dist/form/lib/field-props.js +7 -1
  50. package/dist/form/lib/field-props.js.map +1 -1
  51. package/dist/form/lib/prefill-targets.js +2 -3
  52. package/dist/form/lib/prefill-targets.js.map +1 -1
  53. package/dist/form/lib/wizard-steps.d.ts +5 -0
  54. package/dist/form/lib/wizard-steps.js +44 -0
  55. package/dist/form/lib/wizard-steps.js.map +1 -0
  56. package/dist/form/plugin.js +4 -1
  57. package/dist/form/plugin.js.map +1 -1
  58. package/dist/i18n/translatable.d.ts +1 -0
  59. package/dist/i18n/translatable.js +4 -1
  60. package/dist/i18n/translatable.js.map +1 -1
  61. package/dist/index.d.ts +2 -2
  62. package/dist/index.js +2 -2
  63. package/dist/lattice.css +183 -115
  64. package/dist/layout/components/callouts.js +3 -2
  65. package/dist/layout/components/callouts.js.map +1 -1
  66. package/dist/notifications/components/notification-item.js +10 -5
  67. package/dist/notifications/components/notification-item.js.map +1 -1
  68. package/dist/notifications/components/notifications.js +2 -4
  69. package/dist/notifications/components/notifications.js.map +1 -1
  70. package/dist/table/components/bulk-bar.js +2 -0
  71. package/dist/table/components/bulk-bar.js.map +1 -1
  72. package/dist/table/components/cells/badge-cell.js +3 -6
  73. package/dist/table/components/cells/badge-cell.js.map +1 -1
  74. package/dist/table/components/cells/text-cell.js +6 -9
  75. package/dist/table/components/cells/text-cell.js.map +1 -1
  76. package/dist/table/components/column-filter-control.js +2 -2
  77. package/dist/table/components/column-filter-control.js.map +1 -1
  78. package/dist/table/components/filter-bar.js +1 -1
  79. package/dist/table/components/filter-bar.js.map +1 -1
  80. package/dist/table/components/filter-controls.js +4 -1
  81. package/dist/table/components/filter-controls.js.map +1 -1
  82. package/dist/table/components/pagination.js +6 -6
  83. package/dist/table/components/pagination.js.map +1 -1
  84. package/dist/table/lib/bulk.d.ts +3 -2
  85. package/dist/table/lib/bulk.js +2 -1
  86. package/dist/table/lib/bulk.js.map +1 -1
  87. package/dist/toast/callout.js +6 -3
  88. package/dist/toast/callout.js.map +1 -1
  89. package/dist/toast/toast.js +3 -1
  90. package/dist/toast/toast.js.map +1 -1
  91. package/dist/toast/toaster.js +2 -2
  92. package/dist/toast/toaster.js.map +1 -1
  93. package/dist/toast/variant-styles.js +15 -1
  94. package/dist/toast/variant-styles.js.map +1 -1
  95. package/dist/types/generated.d.ts +31 -16
  96. package/dist/ui/action-menu-context.d.ts +1 -1
  97. package/dist/ui/action-menu-context.js +1 -1
  98. package/dist/ui/action-menu-context.js.map +1 -1
  99. package/dist/ui/affix-group.js +1 -1
  100. package/dist/ui/affix-group.js.map +1 -1
  101. package/dist/ui/badge.d.ts +4 -7
  102. package/dist/ui/badge.js +11 -17
  103. package/dist/ui/badge.js.map +1 -1
  104. package/dist/ui/button.d.ts +6 -5
  105. package/dist/ui/button.js +154 -15
  106. package/dist/ui/button.js.map +1 -1
  107. package/dist/ui/chart-view.js +9 -7
  108. package/dist/ui/chart-view.js.map +1 -1
  109. package/dist/ui/checkbox.js +1 -1
  110. package/dist/ui/checkbox.js.map +1 -1
  111. package/dist/ui/confirm-dialog.d.ts +4 -3
  112. package/dist/ui/confirm-dialog.js +3 -2
  113. package/dist/ui/confirm-dialog.js.map +1 -1
  114. package/dist/ui/control.d.ts +1 -1
  115. package/dist/ui/control.js +1 -1
  116. package/dist/ui/control.js.map +1 -1
  117. package/dist/ui/dialog.js +1 -1
  118. package/dist/ui/dialog.js.map +1 -1
  119. package/dist/ui/dropdown-menu.d.ts +2 -2
  120. package/dist/ui/dropdown-menu.js +2 -2
  121. package/dist/ui/dropdown-menu.js.map +1 -1
  122. package/dist/ui/icon-button.d.ts +3 -3
  123. package/dist/ui/icon-button.js +6 -6
  124. package/dist/ui/icon-button.js.map +1 -1
  125. package/dist/ui/image-preview.js +1 -1
  126. package/dist/ui/image-preview.js.map +1 -1
  127. package/dist/ui/index.d.ts +2 -2
  128. package/dist/ui/index.js +2 -2
  129. package/dist/ui/info-tooltip.js +1 -1
  130. package/dist/ui/info-tooltip.js.map +1 -1
  131. package/dist/ui/input-otp.js +1 -1
  132. package/dist/ui/input-otp.js.map +1 -1
  133. package/dist/ui/label.js +1 -1
  134. package/dist/ui/label.js.map +1 -1
  135. package/dist/ui/password-input.js +1 -1
  136. package/dist/ui/password-input.js.map +1 -1
  137. package/dist/ui/progress.js +2 -2
  138. package/dist/ui/progress.js.map +1 -1
  139. package/dist/ui/text.js +1 -1
  140. package/dist/ui/tooltip.js +1 -1
  141. package/dist/ui/tooltip.js.map +1 -1
  142. package/dist/vite-typescript-refresh.d.ts +9 -0
  143. package/dist/vite-typescript-refresh.js +47 -0
  144. package/dist/vite-typescript-refresh.js.map +1 -0
  145. package/dist/vite.d.ts +22 -1
  146. package/dist/vite.js +60 -7
  147. package/dist/vite.js.map +1 -1
  148. package/dist-standalone/chunks/{chart-view-DEwGTt9d.js → chart-view-8xEKTUJV.js} +1 -1
  149. package/dist-standalone/chunks/{date-picker-field-CCQ9nWx0.js → date-picker-field-cdhxtVSG.js} +1 -1
  150. package/dist-standalone/chunks/{rich-editor-field-B9Nv1qia.js → rich-editor-field-47ov3Bny.js} +1 -1
  151. package/dist-standalone/lattice.css +1 -1
  152. package/dist-standalone/lattice.js +15 -15
  153. package/dist-standalone/manifest.json +5 -5
  154. package/package.json +1 -1
@@ -17,5 +17,6 @@ import { TextareaComponent } from "./components/fields/textarea.js";
17
17
  import { TextInputComponent } from "./components/fields/text-input.js";
18
18
  import { TimeInputComponent } from "./components/fields/time-input.js";
19
19
  import { ToggleComponent } from "./components/fields/toggle.js";
20
+ import { WizardComponent, WizardStepComponent } from "./components/wizard.js";
20
21
  import { formComponents } from "./plugin.js";
21
- export { BuilderComponent, CheckboxComponent, ChoiceComponent, ColorPickerFieldComponent, DateInputComponent, DateTimeInputComponent, FileUploadComponent, FormComponent, FormValuesProvider, HiddenInputComponent, NumberInputComponent, OtpInputComponent, PasswordInputComponent, RepeaterComponent, SelectComponent, TextInputComponent, TextareaComponent, TimeInputComponent, ToggleComponent, formComponents };
22
+ export { BuilderComponent, CheckboxComponent, ChoiceComponent, ColorPickerFieldComponent, DateInputComponent, DateTimeInputComponent, FileUploadComponent, FormComponent, FormValuesProvider, HiddenInputComponent, NumberInputComponent, OtpInputComponent, PasswordInputComponent, RepeaterComponent, SelectComponent, TextInputComponent, TextareaComponent, TimeInputComponent, ToggleComponent, WizardComponent, WizardStepComponent, formComponents };
@@ -1,3 +1,5 @@
1
1
  export type FieldErrors = Record<string, string | undefined>;
2
+ /** Whether an error-bag key targets the named field itself or a path nested under it. */
3
+ export declare function errorKeyBelongsTo(key: string, name: string): boolean;
2
4
  /** Reduce a Laravel 422 error bag (arrays of messages) to the first per field. */
3
5
  export declare function firstErrors(errors: Record<string, string[] | string> | undefined): FieldErrors;
@@ -1,4 +1,8 @@
1
1
  //#region resources/js/form/lib/field-errors.ts
2
+ /** Whether an error-bag key targets the named field itself or a path nested under it. */
3
+ function errorKeyBelongsTo(key, name) {
4
+ return key === name || key.startsWith(`${name}.`);
5
+ }
2
6
  /** Reduce a Laravel 422 error bag (arrays of messages) to the first per field. */
3
7
  function firstErrors(errors) {
4
8
  const result = {};
@@ -6,6 +10,6 @@ function firstErrors(errors) {
6
10
  return result;
7
11
  }
8
12
  //#endregion
9
- export { firstErrors };
13
+ export { errorKeyBelongsTo, firstErrors };
10
14
 
11
15
  //# sourceMappingURL=field-errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-errors.js","names":[],"sources":["../../../resources/js/form/lib/field-errors.ts"],"sourcesContent":["export type FieldErrors = Record<string, string | undefined>;\n\n/** Reduce a Laravel 422 error bag (arrays of messages) to the first per field. */\nexport function firstErrors(errors: Record<string, string[] | string> | undefined): FieldErrors {\n const result: FieldErrors = {};\n\n for (const [key, value] of Object.entries(errors ?? {})) {\n result[key] = Array.isArray(value) ? value[0] : value;\n }\n\n return result;\n}\n"],"mappings":";;AAGA,SAAgB,YAAY,QAAoE;CAC9F,MAAM,SAAsB,CAAC;CAE7B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,CAAC,CAAC,GACpD,OAAO,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;CAGlD,OAAO;AACT"}
1
+ {"version":3,"file":"field-errors.js","names":[],"sources":["../../../resources/js/form/lib/field-errors.ts"],"sourcesContent":["export type FieldErrors = Record<string, string | undefined>;\n\n/** Whether an error-bag key targets the named field itself or a path nested under it. */\nexport function errorKeyBelongsTo(key: string, name: string): boolean {\n return key === name || key.startsWith(`${name}.`);\n}\n\n/** Reduce a Laravel 422 error bag (arrays of messages) to the first per field. */\nexport function firstErrors(errors: Record<string, string[] | string> | undefined): FieldErrors {\n const result: FieldErrors = {};\n\n for (const [key, value] of Object.entries(errors ?? {})) {\n result[key] = Array.isArray(value) ? value[0] : value;\n }\n\n return result;\n}\n"],"mappings":";;AAGA,SAAgB,kBAAkB,KAAa,MAAuB;CACpE,OAAO,QAAQ,QAAQ,IAAI,WAAW,GAAG,KAAK,EAAE;AAClD;;AAGA,SAAgB,YAAY,QAAoE;CAC9F,MAAM,SAAsB,CAAC;CAE7B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,CAAC,CAAC,GACpD,OAAO,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;CAGlD,OAAO;AACT"}
@@ -8,6 +8,12 @@ import { ComponentPropsMap } from '../../types/generated.js';
8
8
  * a generated field type (every field bakes the base in) rather than hand-written.
9
9
  */
10
10
  type FieldProps = Partial<Pick<ComponentPropsMap["field.text-input"], "conditions" | "dependsOnAny" | "dependsOnKeys" | "disabled" | "editablePrefill" | "helperText" | "label" | "name" | "prefillRefreshOn" | "prefillResetOn" | "readOnly" | "required" | "tooltip" | "value">>;
11
+ /**
12
+ * Field types whose value is a collection of rows. Schema walkers must not
13
+ * descend into their child schemas as top-level fields; children live under
14
+ * `name.<index>.` paths instead.
15
+ */
16
+ export declare const ROW_FIELD_TYPES: Set<string>;
11
17
  export declare function fieldProps(node: Node): FieldProps;
12
18
  export declare function walkFields(nodes: Node[] | undefined, visit: (props: FieldProps, node: Node) => void): void;
13
19
  export {};
@@ -1,4 +1,10 @@
1
1
  //#region resources/js/form/lib/field-props.ts
2
+ /**
3
+ * Field types whose value is a collection of rows. Schema walkers must not
4
+ * descend into their child schemas as top-level fields; children live under
5
+ * `name.<index>.` paths instead.
6
+ */
7
+ var ROW_FIELD_TYPES = new Set(["field.builder", "field.repeater"]);
2
8
  function fieldProps(node) {
3
9
  return node.props;
4
10
  }
@@ -9,6 +15,6 @@ function walkFields(nodes, visit) {
9
15
  }
10
16
  }
11
17
  //#endregion
12
- export { fieldProps, walkFields };
18
+ export { ROW_FIELD_TYPES, fieldProps, walkFields };
13
19
 
14
20
  //# sourceMappingURL=field-props.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-props.js","names":[],"sources":["../../../resources/js/form/lib/field-props.ts"],"sourcesContent":["import type { Node } from \"@lattice-php/lattice/core/types\";\nimport type { ComponentPropsMap } from \"@lattice-php/lattice/types/generated\";\n\n/**\n * The props every form-field node shares (the PHP Field base). Nodes flow through\n * the form framework loosely typed via the generic schema, so this is the typed\n * lens the shared hooks read them through. Everything is optional because the\n * lens is also applied to non-field nodes while walking the schema. Derived from\n * a generated field type (every field bakes the base in) rather than hand-written.\n */\ntype FieldProps = Partial<\n Pick<\n ComponentPropsMap[\"field.text-input\"],\n | \"conditions\"\n | \"dependsOnAny\"\n | \"dependsOnKeys\"\n | \"disabled\"\n | \"editablePrefill\"\n | \"helperText\"\n | \"label\"\n | \"name\"\n | \"prefillRefreshOn\"\n | \"prefillResetOn\"\n | \"readOnly\"\n | \"required\"\n | \"tooltip\"\n | \"value\"\n >\n>;\n\nexport function fieldProps(node: Node): FieldProps {\n return node.props as FieldProps;\n}\n\nexport function walkFields(\n nodes: Node[] | undefined,\n visit: (props: FieldProps, node: Node) => void,\n): void {\n for (const child of nodes ?? []) {\n visit(fieldProps(child), child);\n walkFields(child.schema, visit);\n }\n}\n"],"mappings":";AA8BA,SAAgB,WAAW,MAAwB;CACjD,OAAO,KAAK;AACd;AAEA,SAAgB,WACd,OACA,OACM;CACN,KAAK,MAAM,SAAS,SAAS,CAAC,GAAG;EAC/B,MAAM,WAAW,KAAK,GAAG,KAAK;EAC9B,WAAW,MAAM,QAAQ,KAAK;CAChC;AACF"}
1
+ {"version":3,"file":"field-props.js","names":[],"sources":["../../../resources/js/form/lib/field-props.ts"],"sourcesContent":["import type { Node } from \"@lattice-php/lattice/core/types\";\nimport type { ComponentPropsMap } from \"@lattice-php/lattice/types/generated\";\n\n/**\n * The props every form-field node shares (the PHP Field base). Nodes flow through\n * the form framework loosely typed via the generic schema, so this is the typed\n * lens the shared hooks read them through. Everything is optional because the\n * lens is also applied to non-field nodes while walking the schema. Derived from\n * a generated field type (every field bakes the base in) rather than hand-written.\n */\ntype FieldProps = Partial<\n Pick<\n ComponentPropsMap[\"field.text-input\"],\n | \"conditions\"\n | \"dependsOnAny\"\n | \"dependsOnKeys\"\n | \"disabled\"\n | \"editablePrefill\"\n | \"helperText\"\n | \"label\"\n | \"name\"\n | \"prefillRefreshOn\"\n | \"prefillResetOn\"\n | \"readOnly\"\n | \"required\"\n | \"tooltip\"\n | \"value\"\n >\n>;\n\n/**\n * Field types whose value is a collection of rows. Schema walkers must not\n * descend into their child schemas as top-level fields; children live under\n * `name.<index>.` paths instead.\n */\nexport const ROW_FIELD_TYPES = new Set([\"field.builder\", \"field.repeater\"]);\n\nexport function fieldProps(node: Node): FieldProps {\n return node.props as FieldProps;\n}\n\nexport function walkFields(\n nodes: Node[] | undefined,\n visit: (props: FieldProps, node: Node) => void,\n): void {\n for (const child of nodes ?? []) {\n visit(fieldProps(child), child);\n walkFields(child.schema, visit);\n }\n}\n"],"mappings":";;;;;;AAmCA,IAAa,kBAAkB,IAAI,IAAI,CAAC,iBAAiB,gBAAgB,CAAC;AAE1E,SAAgB,WAAW,MAAwB;CACjD,OAAO,KAAK;AACd;AAEA,SAAgB,WACd,OACA,OACM;CACN,KAAK,MAAM,SAAS,SAAS,CAAC,GAAG;EAC/B,MAAM,WAAW,KAAK,GAAG,KAAK;EAC9B,WAAW,MAAM,QAAQ,KAAK;CAChC;AACF"}
@@ -1,9 +1,8 @@
1
- import { fieldProps } from "./field-props.js";
1
+ import { ROW_FIELD_TYPES, fieldProps } from "./field-props.js";
2
2
  import { appendPath, getPath } from "./form-path.js";
3
3
  import { buildOverrideKey, rowIdFrom } from "./override-keys.js";
4
4
  import { rowSchemaFor } from "../components/fields/row-templates.js";
5
5
  //#region resources/js/form/lib/prefill-targets.ts
6
- var ROW_COLLECTION_TYPES = new Set(["field.builder", "field.repeater"]);
7
6
  function mapDep(dep, rowPath) {
8
7
  if (dep.startsWith("@")) return dep.slice(1);
9
8
  return rowPath === null ? dep : appendPath(rowPath, dep);
@@ -23,7 +22,7 @@ function collectPrefillTargets(nodes, values) {
23
22
  const targets = [];
24
23
  const walk = (list, rowPath = null, identityRowPath = null, identityCollectionPath = null, index = 0, row = {}) => {
25
24
  for (const node of list ?? []) {
26
- if (ROW_COLLECTION_TYPES.has(node.type)) {
25
+ if (ROW_FIELD_TYPES.has(node.type)) {
27
26
  const name = fieldProps(node).name;
28
27
  if (name) {
29
28
  const childCollectionPath = appendPath(rowPath, name);
@@ -1 +1 @@
1
- {"version":3,"file":"prefill-targets.js","names":[],"sources":["../../../resources/js/form/lib/prefill-targets.ts"],"sourcesContent":["import type { Node } from \"@lattice-php/lattice/core/types\";\nimport { fieldProps } from \"./field-props\";\nimport { rowSchemaFor } from \"@lattice-php/lattice/form/components/fields/row-templates\";\nimport { appendPath, getPath } from \"./form-path\";\nimport { buildOverrideKey, rowIdFrom } from \"./override-keys\";\n\ntype PrefillTarget = {\n path: string;\n overrideKey: string;\n resetOn: string[];\n refreshOn: string[];\n};\n\ntype PrefillSnapshot = {\n targets: PrefillTarget[];\n values: Record<string, unknown>;\n};\n\nconst ROW_COLLECTION_TYPES = new Set([\"field.builder\", \"field.repeater\"]);\n\nexport { getPath } from \"./form-path\";\n\nfunction mapDep(dep: string, rowPath: string | null): string {\n if (dep.startsWith(\"@\")) {\n return dep.slice(1);\n }\n\n return rowPath === null ? dep : appendPath(rowPath, dep);\n}\n\nfunction targetFor(\n node: Node,\n rowPath: string | null,\n identityCollectionPath: string | null,\n index = 0,\n row: Record<string, unknown> = {},\n): PrefillTarget | null {\n const props = fieldProps(node);\n\n if (!props.editablePrefill || !props.name) {\n return null;\n }\n\n const rowId = rowIdFrom(row);\n\n return {\n path: rowPath === null ? props.name : appendPath(rowPath, props.name),\n overrideKey:\n identityCollectionPath === null\n ? props.name\n : buildOverrideKey(identityCollectionPath, rowId, index, props.name),\n resetOn: (props.prefillResetOn ?? []).map((dep) => mapDep(dep, rowPath)),\n refreshOn: (props.prefillRefreshOn ?? []).map((dep) => mapDep(dep, rowPath)),\n };\n}\n\nexport function collectPrefillTargets(\n nodes: Node[] | undefined,\n values: Record<string, unknown>,\n): PrefillTarget[] {\n const targets: PrefillTarget[] = [];\n\n const walk = (\n list: Node[] | undefined,\n rowPath: string | null = null,\n identityRowPath: string | null = null,\n identityCollectionPath: string | null = null,\n index = 0,\n row: Record<string, unknown> = {},\n ): void => {\n for (const node of list ?? []) {\n if (ROW_COLLECTION_TYPES.has(node.type)) {\n const name = fieldProps(node).name;\n if (name) {\n const childCollectionPath = appendPath(rowPath, name);\n const childIdentityCollectionPath = appendPath(identityRowPath, name);\n const storedRows = getPath(values, childCollectionPath);\n const rows = Array.isArray(storedRows)\n ? (storedRows as Array<Record<string, unknown>>)\n : [];\n rows.forEach((childRow, childIndex) => {\n walk(\n rowSchemaFor(node, childRow),\n appendPath(childCollectionPath, childIndex),\n appendPath(childIdentityCollectionPath, rowIdFrom(childRow) ?? childIndex),\n childIdentityCollectionPath,\n childIndex,\n childRow,\n );\n });\n }\n\n continue;\n }\n\n const target = targetFor(node, rowPath, identityCollectionPath, index, row);\n if (target) {\n targets.push(target);\n }\n\n walk(node.schema, rowPath, identityRowPath, identityCollectionPath, index, row);\n }\n };\n\n walk(nodes);\n\n return targets;\n}\n\nexport function pathsToClear(previous: PrefillSnapshot, next: PrefillSnapshot): string[] {\n const previousByKey = new Map(\n previous.targets.map((target) => [target.overrideKey, target] as const),\n );\n\n return next.targets\n .filter((target) => {\n const previousTarget = previousByKey.get(target.overrideKey);\n\n return target.resetOn.some((dep, index) => {\n const previousDep = previousTarget?.resetOn[index] ?? dep;\n\n return !Object.is(getPath(previous.values, previousDep), getPath(next.values, dep));\n });\n })\n .map((target) => target.overrideKey);\n}\n\nexport function seededOverrides(\n targets: PrefillTarget[],\n values: Record<string, unknown>,\n): string[] {\n return targets\n .filter((target) => {\n const value = getPath(values, target.path);\n\n return value !== undefined && value !== null && value !== \"\";\n })\n .map((target) => target.overrideKey);\n}\n\nexport function pruneOverrides(overrides: Set<string>, targets: PrefillTarget[]): Set<string> {\n const liveKeys = new Set(targets.map((target) => target.overrideKey));\n\n return new Set([...overrides].filter((key) => liveKeys.has(key)));\n}\n"],"mappings":";;;;;AAkBA,IAAM,uBAAuB,IAAI,IAAI,CAAC,iBAAiB,gBAAgB,CAAC;AAIxE,SAAS,OAAO,KAAa,SAAgC;CAC3D,IAAI,IAAI,WAAW,GAAG,GACpB,OAAO,IAAI,MAAM,CAAC;CAGpB,OAAO,YAAY,OAAO,MAAM,WAAW,SAAS,GAAG;AACzD;AAEA,SAAS,UACP,MACA,SACA,wBACA,QAAQ,GACR,MAA+B,CAAC,GACV;CACtB,MAAM,QAAQ,WAAW,IAAI;CAE7B,IAAI,CAAC,MAAM,mBAAmB,CAAC,MAAM,MACnC,OAAO;CAGT,MAAM,QAAQ,UAAU,GAAG;CAE3B,OAAO;EACL,MAAM,YAAY,OAAO,MAAM,OAAO,WAAW,SAAS,MAAM,IAAI;EACpE,aACE,2BAA2B,OACvB,MAAM,OACN,iBAAiB,wBAAwB,OAAO,OAAO,MAAM,IAAI;EACvE,UAAU,MAAM,kBAAkB,CAAC,GAAG,KAAK,QAAQ,OAAO,KAAK,OAAO,CAAC;EACvE,YAAY,MAAM,oBAAoB,CAAC,GAAG,KAAK,QAAQ,OAAO,KAAK,OAAO,CAAC;CAC7E;AACF;AAEA,SAAgB,sBACd,OACA,QACiB;CACjB,MAAM,UAA2B,CAAC;CAElC,MAAM,QACJ,MACA,UAAyB,MACzB,kBAAiC,MACjC,yBAAwC,MACxC,QAAQ,GACR,MAA+B,CAAC,MACvB;EACT,KAAK,MAAM,QAAQ,QAAQ,CAAC,GAAG;GAC7B,IAAI,qBAAqB,IAAI,KAAK,IAAI,GAAG;IACvC,MAAM,OAAO,WAAW,IAAI,EAAE;IAC9B,IAAI,MAAM;KACR,MAAM,sBAAsB,WAAW,SAAS,IAAI;KACpD,MAAM,8BAA8B,WAAW,iBAAiB,IAAI;KACpE,MAAM,aAAa,QAAQ,QAAQ,mBAAmB;KAItD,CAHa,MAAM,QAAQ,UAAU,IAChC,aACD,CAAC,GACA,SAAS,UAAU,eAAe;MACrC,KACE,aAAa,MAAM,QAAQ,GAC3B,WAAW,qBAAqB,UAAU,GAC1C,WAAW,6BAA6B,UAAU,QAAQ,KAAK,UAAU,GACzE,6BACA,YACA,QACF;KACF,CAAC;IACH;IAEA;GACF;GAEA,MAAM,SAAS,UAAU,MAAM,SAAS,wBAAwB,OAAO,GAAG;GAC1E,IAAI,QACF,QAAQ,KAAK,MAAM;GAGrB,KAAK,KAAK,QAAQ,SAAS,iBAAiB,wBAAwB,OAAO,GAAG;EAChF;CACF;CAEA,KAAK,KAAK;CAEV,OAAO;AACT;AAEA,SAAgB,aAAa,UAA2B,MAAiC;CACvF,MAAM,gBAAgB,IAAI,IACxB,SAAS,QAAQ,KAAK,WAAW,CAAC,OAAO,aAAa,MAAM,CAAU,CACxE;CAEA,OAAO,KAAK,QACT,QAAQ,WAAW;EAClB,MAAM,iBAAiB,cAAc,IAAI,OAAO,WAAW;EAE3D,OAAO,OAAO,QAAQ,MAAM,KAAK,UAAU;GACzC,MAAM,cAAc,gBAAgB,QAAQ,UAAU;GAEtD,OAAO,CAAC,OAAO,GAAG,QAAQ,SAAS,QAAQ,WAAW,GAAG,QAAQ,KAAK,QAAQ,GAAG,CAAC;EACpF,CAAC;CACH,CAAC,EACA,KAAK,WAAW,OAAO,WAAW;AACvC;AAEA,SAAgB,gBACd,SACA,QACU;CACV,OAAO,QACJ,QAAQ,WAAW;EAClB,MAAM,QAAQ,QAAQ,QAAQ,OAAO,IAAI;EAEzC,OAAO,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU;CAC5D,CAAC,EACA,KAAK,WAAW,OAAO,WAAW;AACvC;AAEA,SAAgB,eAAe,WAAwB,SAAuC;CAC5F,MAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,WAAW,OAAO,WAAW,CAAC;CAEpE,OAAO,IAAI,IAAI,CAAC,GAAG,SAAS,EAAE,QAAQ,QAAQ,SAAS,IAAI,GAAG,CAAC,CAAC;AAClE"}
1
+ {"version":3,"file":"prefill-targets.js","names":[],"sources":["../../../resources/js/form/lib/prefill-targets.ts"],"sourcesContent":["import type { Node } from \"@lattice-php/lattice/core/types\";\nimport { fieldProps, ROW_FIELD_TYPES } from \"./field-props\";\nimport { rowSchemaFor } from \"@lattice-php/lattice/form/components/fields/row-templates\";\nimport { appendPath, getPath } from \"./form-path\";\nimport { buildOverrideKey, rowIdFrom } from \"./override-keys\";\n\ntype PrefillTarget = {\n path: string;\n overrideKey: string;\n resetOn: string[];\n refreshOn: string[];\n};\n\ntype PrefillSnapshot = {\n targets: PrefillTarget[];\n values: Record<string, unknown>;\n};\n\nexport { getPath } from \"./form-path\";\n\nfunction mapDep(dep: string, rowPath: string | null): string {\n if (dep.startsWith(\"@\")) {\n return dep.slice(1);\n }\n\n return rowPath === null ? dep : appendPath(rowPath, dep);\n}\n\nfunction targetFor(\n node: Node,\n rowPath: string | null,\n identityCollectionPath: string | null,\n index = 0,\n row: Record<string, unknown> = {},\n): PrefillTarget | null {\n const props = fieldProps(node);\n\n if (!props.editablePrefill || !props.name) {\n return null;\n }\n\n const rowId = rowIdFrom(row);\n\n return {\n path: rowPath === null ? props.name : appendPath(rowPath, props.name),\n overrideKey:\n identityCollectionPath === null\n ? props.name\n : buildOverrideKey(identityCollectionPath, rowId, index, props.name),\n resetOn: (props.prefillResetOn ?? []).map((dep) => mapDep(dep, rowPath)),\n refreshOn: (props.prefillRefreshOn ?? []).map((dep) => mapDep(dep, rowPath)),\n };\n}\n\nexport function collectPrefillTargets(\n nodes: Node[] | undefined,\n values: Record<string, unknown>,\n): PrefillTarget[] {\n const targets: PrefillTarget[] = [];\n\n const walk = (\n list: Node[] | undefined,\n rowPath: string | null = null,\n identityRowPath: string | null = null,\n identityCollectionPath: string | null = null,\n index = 0,\n row: Record<string, unknown> = {},\n ): void => {\n for (const node of list ?? []) {\n if (ROW_FIELD_TYPES.has(node.type)) {\n const name = fieldProps(node).name;\n if (name) {\n const childCollectionPath = appendPath(rowPath, name);\n const childIdentityCollectionPath = appendPath(identityRowPath, name);\n const storedRows = getPath(values, childCollectionPath);\n const rows = Array.isArray(storedRows)\n ? (storedRows as Array<Record<string, unknown>>)\n : [];\n rows.forEach((childRow, childIndex) => {\n walk(\n rowSchemaFor(node, childRow),\n appendPath(childCollectionPath, childIndex),\n appendPath(childIdentityCollectionPath, rowIdFrom(childRow) ?? childIndex),\n childIdentityCollectionPath,\n childIndex,\n childRow,\n );\n });\n }\n\n continue;\n }\n\n const target = targetFor(node, rowPath, identityCollectionPath, index, row);\n if (target) {\n targets.push(target);\n }\n\n walk(node.schema, rowPath, identityRowPath, identityCollectionPath, index, row);\n }\n };\n\n walk(nodes);\n\n return targets;\n}\n\nexport function pathsToClear(previous: PrefillSnapshot, next: PrefillSnapshot): string[] {\n const previousByKey = new Map(\n previous.targets.map((target) => [target.overrideKey, target] as const),\n );\n\n return next.targets\n .filter((target) => {\n const previousTarget = previousByKey.get(target.overrideKey);\n\n return target.resetOn.some((dep, index) => {\n const previousDep = previousTarget?.resetOn[index] ?? dep;\n\n return !Object.is(getPath(previous.values, previousDep), getPath(next.values, dep));\n });\n })\n .map((target) => target.overrideKey);\n}\n\nexport function seededOverrides(\n targets: PrefillTarget[],\n values: Record<string, unknown>,\n): string[] {\n return targets\n .filter((target) => {\n const value = getPath(values, target.path);\n\n return value !== undefined && value !== null && value !== \"\";\n })\n .map((target) => target.overrideKey);\n}\n\nexport function pruneOverrides(overrides: Set<string>, targets: PrefillTarget[]): Set<string> {\n const liveKeys = new Set(targets.map((target) => target.overrideKey));\n\n return new Set([...overrides].filter((key) => liveKeys.has(key)));\n}\n"],"mappings":";;;;;AAoBA,SAAS,OAAO,KAAa,SAAgC;CAC3D,IAAI,IAAI,WAAW,GAAG,GACpB,OAAO,IAAI,MAAM,CAAC;CAGpB,OAAO,YAAY,OAAO,MAAM,WAAW,SAAS,GAAG;AACzD;AAEA,SAAS,UACP,MACA,SACA,wBACA,QAAQ,GACR,MAA+B,CAAC,GACV;CACtB,MAAM,QAAQ,WAAW,IAAI;CAE7B,IAAI,CAAC,MAAM,mBAAmB,CAAC,MAAM,MACnC,OAAO;CAGT,MAAM,QAAQ,UAAU,GAAG;CAE3B,OAAO;EACL,MAAM,YAAY,OAAO,MAAM,OAAO,WAAW,SAAS,MAAM,IAAI;EACpE,aACE,2BAA2B,OACvB,MAAM,OACN,iBAAiB,wBAAwB,OAAO,OAAO,MAAM,IAAI;EACvE,UAAU,MAAM,kBAAkB,CAAC,GAAG,KAAK,QAAQ,OAAO,KAAK,OAAO,CAAC;EACvE,YAAY,MAAM,oBAAoB,CAAC,GAAG,KAAK,QAAQ,OAAO,KAAK,OAAO,CAAC;CAC7E;AACF;AAEA,SAAgB,sBACd,OACA,QACiB;CACjB,MAAM,UAA2B,CAAC;CAElC,MAAM,QACJ,MACA,UAAyB,MACzB,kBAAiC,MACjC,yBAAwC,MACxC,QAAQ,GACR,MAA+B,CAAC,MACvB;EACT,KAAK,MAAM,QAAQ,QAAQ,CAAC,GAAG;GAC7B,IAAI,gBAAgB,IAAI,KAAK,IAAI,GAAG;IAClC,MAAM,OAAO,WAAW,IAAI,EAAE;IAC9B,IAAI,MAAM;KACR,MAAM,sBAAsB,WAAW,SAAS,IAAI;KACpD,MAAM,8BAA8B,WAAW,iBAAiB,IAAI;KACpE,MAAM,aAAa,QAAQ,QAAQ,mBAAmB;KAItD,CAHa,MAAM,QAAQ,UAAU,IAChC,aACD,CAAC,GACA,SAAS,UAAU,eAAe;MACrC,KACE,aAAa,MAAM,QAAQ,GAC3B,WAAW,qBAAqB,UAAU,GAC1C,WAAW,6BAA6B,UAAU,QAAQ,KAAK,UAAU,GACzE,6BACA,YACA,QACF;KACF,CAAC;IACH;IAEA;GACF;GAEA,MAAM,SAAS,UAAU,MAAM,SAAS,wBAAwB,OAAO,GAAG;GAC1E,IAAI,QACF,QAAQ,KAAK,MAAM;GAGrB,KAAK,KAAK,QAAQ,SAAS,iBAAiB,wBAAwB,OAAO,GAAG;EAChF;CACF;CAEA,KAAK,KAAK;CAEV,OAAO;AACT;AAEA,SAAgB,aAAa,UAA2B,MAAiC;CACvF,MAAM,gBAAgB,IAAI,IACxB,SAAS,QAAQ,KAAK,WAAW,CAAC,OAAO,aAAa,MAAM,CAAU,CACxE;CAEA,OAAO,KAAK,QACT,QAAQ,WAAW;EAClB,MAAM,iBAAiB,cAAc,IAAI,OAAO,WAAW;EAE3D,OAAO,OAAO,QAAQ,MAAM,KAAK,UAAU;GACzC,MAAM,cAAc,gBAAgB,QAAQ,UAAU;GAEtD,OAAO,CAAC,OAAO,GAAG,QAAQ,SAAS,QAAQ,WAAW,GAAG,QAAQ,KAAK,QAAQ,GAAG,CAAC;EACpF,CAAC;CACH,CAAC,EACA,KAAK,WAAW,OAAO,WAAW;AACvC;AAEA,SAAgB,gBACd,SACA,QACU;CACV,OAAO,QACJ,QAAQ,WAAW;EAClB,MAAM,QAAQ,QAAQ,QAAQ,OAAO,IAAI;EAEzC,OAAO,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU;CAC5D,CAAC,EACA,KAAK,WAAW,OAAO,WAAW;AACvC;AAEA,SAAgB,eAAe,WAAwB,SAAuC;CAC5F,MAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,WAAW,OAAO,WAAW,CAAC;CAEpE,OAAO,IAAI,IAAI,CAAC,GAAG,SAAS,EAAE,QAAQ,QAAQ,SAAS,IAAI,GAAG,CAAC,CAAC;AAClE"}
@@ -0,0 +1,5 @@
1
+ import { Node } from '../../core/types.js';
2
+ export declare function stepFieldNames(step: Node): string[];
3
+ export declare function stepValidationPaths(step: Node): string[];
4
+ export declare function stepsWithErrors(stepNames: string[][], errors: Record<string, string | undefined>): Set<number>;
5
+ export declare function firstErroredStep(stepNames: string[][], errors: Record<string, string | undefined>): number | null;
@@ -0,0 +1,44 @@
1
+ import { ROW_FIELD_TYPES, fieldProps } from "./field-props.js";
2
+ import { errorKeyBelongsTo } from "./field-errors.js";
3
+ //#region resources/js/form/lib/wizard-steps.ts
4
+ function stepFieldNames(step) {
5
+ const names = [];
6
+ const collect = (node) => {
7
+ const name = fieldProps(node).name;
8
+ if (name) names.push(name);
9
+ if (name && ROW_FIELD_TYPES.has(node.type)) return;
10
+ for (const child of node.schema ?? []) collect(child);
11
+ };
12
+ for (const child of step.schema ?? []) collect(child);
13
+ return names;
14
+ }
15
+ function stepValidationPaths(step) {
16
+ const paths = [];
17
+ const expand = (node) => {
18
+ const name = fieldProps(node).name;
19
+ if (name) paths.push(name, `${name}.*`);
20
+ if (name && ROW_FIELD_TYPES.has(node.type)) {
21
+ for (const child of stepFieldNames(node)) paths.push(`${name}.*.${child}`);
22
+ return;
23
+ }
24
+ for (const child of node.schema ?? []) expand(child);
25
+ };
26
+ for (const child of step.schema ?? []) expand(child);
27
+ return paths;
28
+ }
29
+ function stepsWithErrors(stepNames, errors) {
30
+ const keys = Object.keys(errors).filter((key) => Boolean(errors[key]));
31
+ const owners = /* @__PURE__ */ new Set();
32
+ stepNames.forEach((names, index) => {
33
+ if (keys.some((key) => names.some((name) => errorKeyBelongsTo(key, name)))) owners.add(index);
34
+ });
35
+ return owners;
36
+ }
37
+ function firstErroredStep(stepNames, errors) {
38
+ const owners = stepsWithErrors(stepNames, errors);
39
+ return owners.size > 0 ? Math.min(...owners) : null;
40
+ }
41
+ //#endregion
42
+ export { firstErroredStep, stepFieldNames, stepValidationPaths, stepsWithErrors };
43
+
44
+ //# sourceMappingURL=wizard-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard-steps.js","names":[],"sources":["../../../resources/js/form/lib/wizard-steps.ts"],"sourcesContent":["import type { Node } from \"@lattice-php/lattice/core/types\";\nimport { errorKeyBelongsTo } from \"./field-errors\";\nimport { fieldProps, ROW_FIELD_TYPES } from \"./field-props\";\n\nexport function stepFieldNames(step: Node): string[] {\n const names: string[] = [];\n\n const collect = (node: Node): void => {\n const name = fieldProps(node).name;\n\n if (name) {\n names.push(name);\n }\n if (name && ROW_FIELD_TYPES.has(node.type)) {\n return;\n }\n for (const child of node.schema ?? []) {\n collect(child);\n }\n };\n\n for (const child of step.schema ?? []) {\n collect(child);\n }\n\n return names;\n}\n\nexport function stepValidationPaths(step: Node): string[] {\n const paths: string[] = [];\n\n const expand = (node: Node): void => {\n const name = fieldProps(node).name;\n\n if (name) {\n paths.push(name, `${name}.*`);\n }\n\n if (name && ROW_FIELD_TYPES.has(node.type)) {\n for (const child of stepFieldNames(node)) {\n paths.push(`${name}.*.${child}`);\n }\n\n return;\n }\n\n for (const child of node.schema ?? []) {\n expand(child);\n }\n };\n\n for (const child of step.schema ?? []) {\n expand(child);\n }\n\n return paths;\n}\n\nexport function stepsWithErrors(\n stepNames: string[][],\n errors: Record<string, string | undefined>,\n): Set<number> {\n const keys = Object.keys(errors).filter((key) => Boolean(errors[key]));\n const owners = new Set<number>();\n\n stepNames.forEach((names, index) => {\n const owns = keys.some((key) => names.some((name) => errorKeyBelongsTo(key, name)));\n\n if (owns) {\n owners.add(index);\n }\n });\n\n return owners;\n}\n\nexport function firstErroredStep(\n stepNames: string[][],\n errors: Record<string, string | undefined>,\n): number | null {\n const owners = stepsWithErrors(stepNames, errors);\n\n return owners.size > 0 ? Math.min(...owners) : null;\n}\n"],"mappings":";;;AAIA,SAAgB,eAAe,MAAsB;CACnD,MAAM,QAAkB,CAAC;CAEzB,MAAM,WAAW,SAAqB;EACpC,MAAM,OAAO,WAAW,IAAI,EAAE;EAE9B,IAAI,MACF,MAAM,KAAK,IAAI;EAEjB,IAAI,QAAQ,gBAAgB,IAAI,KAAK,IAAI,GACvC;EAEF,KAAK,MAAM,SAAS,KAAK,UAAU,CAAC,GAClC,QAAQ,KAAK;CAEjB;CAEA,KAAK,MAAM,SAAS,KAAK,UAAU,CAAC,GAClC,QAAQ,KAAK;CAGf,OAAO;AACT;AAEA,SAAgB,oBAAoB,MAAsB;CACxD,MAAM,QAAkB,CAAC;CAEzB,MAAM,UAAU,SAAqB;EACnC,MAAM,OAAO,WAAW,IAAI,EAAE;EAE9B,IAAI,MACF,MAAM,KAAK,MAAM,GAAG,KAAK,GAAG;EAG9B,IAAI,QAAQ,gBAAgB,IAAI,KAAK,IAAI,GAAG;GAC1C,KAAK,MAAM,SAAS,eAAe,IAAI,GACrC,MAAM,KAAK,GAAG,KAAK,KAAK,OAAO;GAGjC;EACF;EAEA,KAAK,MAAM,SAAS,KAAK,UAAU,CAAC,GAClC,OAAO,KAAK;CAEhB;CAEA,KAAK,MAAM,SAAS,KAAK,UAAU,CAAC,GAClC,OAAO,KAAK;CAGd,OAAO;AACT;AAEA,SAAgB,gBACd,WACA,QACa;CACb,MAAM,OAAO,OAAO,KAAK,MAAM,EAAE,QAAQ,QAAQ,QAAQ,OAAO,IAAI,CAAC;CACrE,MAAM,yBAAS,IAAI,IAAY;CAE/B,UAAU,SAAS,OAAO,UAAU;EAGlC,IAFa,KAAK,MAAM,QAAQ,MAAM,MAAM,SAAS,kBAAkB,KAAK,IAAI,CAAC,CAE7E,GACF,OAAO,IAAI,KAAK;CAEpB,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,iBACd,WACA,QACe;CACf,MAAM,SAAS,gBAAgB,WAAW,MAAM;CAEhD,OAAO,OAAO,OAAO,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;AACjD"}
@@ -17,6 +17,7 @@ import { TextareaComponent } from "./components/fields/textarea.js";
17
17
  import { TextInputComponent } from "./components/fields/text-input.js";
18
18
  import { TimeInputComponent } from "./components/fields/time-input.js";
19
19
  import { ToggleComponent } from "./components/fields/toggle.js";
20
+ import { WizardComponent, WizardStepComponent } from "./components/wizard.js";
20
21
  import { RichEditorComponent } from "./components/fields/rich-editor.js";
21
22
  //#region resources/js/form/plugin.ts
22
23
  var formComponents = createPlugin({
@@ -39,7 +40,9 @@ var formComponents = createPlugin({
39
40
  "field.textarea": eagerComponent(TextareaComponent),
40
41
  "field.text-input": eagerComponent(TextInputComponent),
41
42
  "field.time-input": eagerComponent(TimeInputComponent),
42
- "field.toggle": eagerComponent(ToggleComponent)
43
+ "field.toggle": eagerComponent(ToggleComponent),
44
+ wizard: eagerComponent(WizardComponent),
45
+ "wizard-step": eagerComponent(WizardStepComponent)
43
46
  },
44
47
  name: "lattice/form"
45
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/form/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport type { FormNodeType } from \"@lattice-php/lattice/types/generated\";\nimport {\n BuilderComponent,\n CheckboxComponent,\n ChoiceComponent,\n ColorPickerFieldComponent,\n DateInputComponent,\n DateTimeInputComponent,\n FileUploadComponent,\n FormComponent,\n HiddenInputComponent,\n NumberInputComponent,\n OtpInputComponent,\n PasswordInputComponent,\n RepeaterComponent,\n SelectComponent,\n TextareaComponent,\n TextInputComponent,\n TimeInputComponent,\n ToggleComponent,\n} from \"./components\";\nimport { RichEditorComponent } from \"./components/fields/rich-editor\";\n\nexport const formComponents = createPlugin({\n components: {\n form: eagerComponent(FormComponent),\n \"field.builder\": eagerComponent(BuilderComponent),\n \"field.checkbox\": eagerComponent(CheckboxComponent),\n \"field.choice\": eagerComponent(ChoiceComponent),\n \"field.color-picker\": eagerComponent(ColorPickerFieldComponent),\n \"field.date-input\": eagerComponent(DateInputComponent),\n \"field.date-time-input\": eagerComponent(DateTimeInputComponent),\n \"field.file-upload\": eagerComponent(FileUploadComponent),\n \"field.hidden-input\": eagerComponent(HiddenInputComponent),\n \"field.number-input\": eagerComponent(NumberInputComponent),\n \"field.otp\": eagerComponent(OtpInputComponent),\n \"field.password-input\": eagerComponent(PasswordInputComponent),\n \"field.repeater\": eagerComponent(RepeaterComponent),\n \"field.rich-editor\": eagerComponent(RichEditorComponent),\n \"field.select\": eagerComponent(SelectComponent),\n \"field.textarea\": eagerComponent(TextareaComponent),\n \"field.text-input\": eagerComponent(TextInputComponent),\n \"field.time-input\": eagerComponent(TimeInputComponent),\n \"field.toggle\": eagerComponent(ToggleComponent),\n } satisfies ComponentRegistryFor<FormNodeType>,\n name: \"lattice/form\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,IAAa,iBAAiB,aAAa;CACzC,YAAY;EACV,MAAM,eAAe,aAAa;EAClC,iBAAiB,eAAe,gBAAgB;EAChD,kBAAkB,eAAe,iBAAiB;EAClD,gBAAgB,eAAe,eAAe;EAC9C,sBAAsB,eAAe,yBAAyB;EAC9D,oBAAoB,eAAe,kBAAkB;EACrD,yBAAyB,eAAe,sBAAsB;EAC9D,qBAAqB,eAAe,mBAAmB;EACvD,sBAAsB,eAAe,oBAAoB;EACzD,sBAAsB,eAAe,oBAAoB;EACzD,aAAa,eAAe,iBAAiB;EAC7C,wBAAwB,eAAe,sBAAsB;EAC7D,kBAAkB,eAAe,iBAAiB;EAClD,qBAAqB,eAAe,mBAAmB;EACvD,gBAAgB,eAAe,eAAe;EAC9C,kBAAkB,eAAe,iBAAiB;EAClD,oBAAoB,eAAe,kBAAkB;EACrD,oBAAoB,eAAe,kBAAkB;EACrD,gBAAgB,eAAe,eAAe;CAChD;CACA,MAAM;AACR,CAAC"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/form/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport type { FormNodeType } from \"@lattice-php/lattice/types/generated\";\nimport {\n BuilderComponent,\n CheckboxComponent,\n ChoiceComponent,\n ColorPickerFieldComponent,\n DateInputComponent,\n DateTimeInputComponent,\n FileUploadComponent,\n FormComponent,\n HiddenInputComponent,\n NumberInputComponent,\n OtpInputComponent,\n PasswordInputComponent,\n RepeaterComponent,\n SelectComponent,\n TextareaComponent,\n TextInputComponent,\n TimeInputComponent,\n ToggleComponent,\n WizardComponent,\n WizardStepComponent,\n} from \"./components\";\nimport { RichEditorComponent } from \"./components/fields/rich-editor\";\n\nexport const formComponents = createPlugin({\n components: {\n form: eagerComponent(FormComponent),\n \"field.builder\": eagerComponent(BuilderComponent),\n \"field.checkbox\": eagerComponent(CheckboxComponent),\n \"field.choice\": eagerComponent(ChoiceComponent),\n \"field.color-picker\": eagerComponent(ColorPickerFieldComponent),\n \"field.date-input\": eagerComponent(DateInputComponent),\n \"field.date-time-input\": eagerComponent(DateTimeInputComponent),\n \"field.file-upload\": eagerComponent(FileUploadComponent),\n \"field.hidden-input\": eagerComponent(HiddenInputComponent),\n \"field.number-input\": eagerComponent(NumberInputComponent),\n \"field.otp\": eagerComponent(OtpInputComponent),\n \"field.password-input\": eagerComponent(PasswordInputComponent),\n \"field.repeater\": eagerComponent(RepeaterComponent),\n \"field.rich-editor\": eagerComponent(RichEditorComponent),\n \"field.select\": eagerComponent(SelectComponent),\n \"field.textarea\": eagerComponent(TextareaComponent),\n \"field.text-input\": eagerComponent(TextInputComponent),\n \"field.time-input\": eagerComponent(TimeInputComponent),\n \"field.toggle\": eagerComponent(ToggleComponent),\n wizard: eagerComponent(WizardComponent),\n \"wizard-step\": eagerComponent(WizardStepComponent),\n } satisfies ComponentRegistryFor<FormNodeType>,\n name: \"lattice/form\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,iBAAiB,aAAa;CACzC,YAAY;EACV,MAAM,eAAe,aAAa;EAClC,iBAAiB,eAAe,gBAAgB;EAChD,kBAAkB,eAAe,iBAAiB;EAClD,gBAAgB,eAAe,eAAe;EAC9C,sBAAsB,eAAe,yBAAyB;EAC9D,oBAAoB,eAAe,kBAAkB;EACrD,yBAAyB,eAAe,sBAAsB;EAC9D,qBAAqB,eAAe,mBAAmB;EACvD,sBAAsB,eAAe,oBAAoB;EACzD,sBAAsB,eAAe,oBAAoB;EACzD,aAAa,eAAe,iBAAiB;EAC7C,wBAAwB,eAAe,sBAAsB;EAC7D,kBAAkB,eAAe,iBAAiB;EAClD,qBAAqB,eAAe,mBAAmB;EACvD,gBAAgB,eAAe,eAAe;EAC9C,kBAAkB,eAAe,iBAAiB;EAClD,oBAAoB,eAAe,kBAAkB;EACrD,oBAAoB,eAAe,kBAAkB;EACrD,gBAAgB,eAAe,eAAe;EAC9C,QAAQ,eAAe,eAAe;EACtC,eAAe,eAAe,mBAAmB;CACnD;CACA,MAAM;AACR,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { Translatable } from '../types/generated.js';
2
2
  export type Translate = (key: string, defaultValue?: string, options?: Record<string, unknown>) => string;
3
3
  export declare function isTranslatable(value: unknown): value is Translatable;
4
+ export declare function resolveText(value: string | Translatable | null, t: Translate): string | null;
4
5
  export declare function resolveTranslatable(value: Translatable, payload: Record<string, unknown>, t: Translate): string;
@@ -7,6 +7,9 @@ function readPath(payload, path) {
7
7
  if (typeof node === "object" && node !== null) return node[segment];
8
8
  }, payload);
9
9
  }
10
+ function resolveText(value, t) {
11
+ return isTranslatable(value) ? resolveTranslatable(value, {}, t) : value;
12
+ }
10
13
  function resolveTranslatable(value, payload, t) {
11
14
  const fromPayload = {};
12
15
  for (const [name, path] of Object.entries(value.payload)) {
@@ -19,6 +22,6 @@ function resolveTranslatable(value, payload, t) {
19
22
  });
20
23
  }
21
24
  //#endregion
22
- export { isTranslatable, resolveTranslatable };
25
+ export { isTranslatable, resolveText, resolveTranslatable };
23
26
 
24
27
  //# sourceMappingURL=translatable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"translatable.js","names":[],"sources":["../../resources/js/i18n/translatable.ts"],"sourcesContent":["import type { Translatable } from \"@lattice-php/lattice/types/generated\";\n\nexport type Translate = (\n key: string,\n defaultValue?: string,\n options?: Record<string, unknown>,\n) => string;\n\nexport function isTranslatable(value: unknown): value is Translatable {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { key?: unknown }).key === \"string\"\n );\n}\n\nfunction readPath(payload: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce<unknown>((node, segment) => {\n if (typeof node === \"object\" && node !== null) {\n return (node as Record<string, unknown>)[segment];\n }\n\n return undefined;\n }, payload);\n}\n\nexport function resolveTranslatable(\n value: Translatable,\n payload: Record<string, unknown>,\n t: Translate,\n): string {\n const fromPayload: Record<string, unknown> = {};\n\n for (const [name, path] of Object.entries(value.payload)) {\n const read = readPath(payload, path);\n fromPayload[name] = read === undefined ? \"\" : read;\n }\n\n return t(value.key, value.key, { ...value.replacements, ...fromPayload });\n}\n"],"mappings":";AAQA,SAAgB,eAAe,OAAuC;CACpE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA4B,QAAQ;AAEhD;AAEA,SAAS,SAAS,SAAkC,MAAuB;CACzE,OAAO,KAAK,MAAM,GAAG,EAAE,QAAiB,MAAM,YAAY;EACxD,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC,OAAQ,KAAiC;CAI7C,GAAG,OAAO;AACZ;AAEA,SAAgB,oBACd,OACA,SACA,GACQ;CACR,MAAM,cAAuC,CAAC;CAE9C,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,MAAM,OAAO,GAAG;EACxD,MAAM,OAAO,SAAS,SAAS,IAAI;EACnC,YAAY,QAAQ,SAAS,KAAA,IAAY,KAAK;CAChD;CAEA,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK;EAAE,GAAG,MAAM;EAAc,GAAG;CAAY,CAAC;AAC1E"}
1
+ {"version":3,"file":"translatable.js","names":[],"sources":["../../resources/js/i18n/translatable.ts"],"sourcesContent":["import type { Translatable } from \"@lattice-php/lattice/types/generated\";\n\nexport type Translate = (\n key: string,\n defaultValue?: string,\n options?: Record<string, unknown>,\n) => string;\n\nexport function isTranslatable(value: unknown): value is Translatable {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { key?: unknown }).key === \"string\"\n );\n}\n\nfunction readPath(payload: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce<unknown>((node, segment) => {\n if (typeof node === \"object\" && node !== null) {\n return (node as Record<string, unknown>)[segment];\n }\n\n return undefined;\n }, payload);\n}\n\nexport function resolveText(value: string | Translatable | null, t: Translate): string | null {\n return isTranslatable(value) ? resolveTranslatable(value, {}, t) : value;\n}\n\nexport function resolveTranslatable(\n value: Translatable,\n payload: Record<string, unknown>,\n t: Translate,\n): string {\n const fromPayload: Record<string, unknown> = {};\n\n for (const [name, path] of Object.entries(value.payload)) {\n const read = readPath(payload, path);\n fromPayload[name] = read === undefined ? \"\" : read;\n }\n\n return t(value.key, value.key, { ...value.replacements, ...fromPayload });\n}\n"],"mappings":";AAQA,SAAgB,eAAe,OAAuC;CACpE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA4B,QAAQ;AAEhD;AAEA,SAAS,SAAS,SAAkC,MAAuB;CACzE,OAAO,KAAK,MAAM,GAAG,EAAE,QAAiB,MAAM,YAAY;EACxD,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC,OAAQ,KAAiC;CAI7C,GAAG,OAAO;AACZ;AAEA,SAAgB,YAAY,OAAqC,GAA6B;CAC5F,OAAO,eAAe,KAAK,IAAI,oBAAoB,OAAO,CAAC,GAAG,CAAC,IAAI;AACrE;AAEA,SAAgB,oBACd,OACA,SACA,GACQ;CACR,MAAM,cAAuC,CAAC;CAE9C,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,MAAM,OAAO,GAAG;EACxD,MAAM,OAAO,SAAS,SAAS,IAAI;EACnC,YAAY,QAAQ,SAAS,KAAA,IAAY,KAAK;CAChD;CAEA,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK;EAAE,GAAG,MAAM;EAAc,GAAG;CAAY,CAAC;AAC1E"}
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { getActionEffects, isActionEffect, dispatchEffects, dispatchActionError,
5
5
  export { useEffectDispatcher } from './effects/use-effect-dispatcher.js';
6
6
  export { builtinEffectHandlers, effectHandler, mergeEffectHandlers } from './effects/registry.js';
7
7
  export { registerRichEditorExtension } from './form/rich-editor/registry.js';
8
- export { initializeTheme, updateAppearance, useAppearance } from './appearance/index.js';
8
+ export { initializeAppearance, updateAppearance, useAppearance } from './appearance/index.js';
9
9
  export { copyToClipboard } from './clipboard/index.js';
10
10
  export { createLatticeApp, type CreateLatticeAppI18nOptions, type CreateLatticeAppOptions, } from './create-app.js';
11
11
  export { EventBridge } from './event-bridge.js';
@@ -22,7 +22,7 @@ export { Renderer } from './core/renderer.js';
22
22
  export { LATTICE_REF_HEADER, withRefHeader } from './core/component-ref.js';
23
23
  export { withHeaders } from './core/headers.js';
24
24
  export { LATTICE_EVENT } from './core/event-names.js';
25
- export type { ButtonVariant } from './ui/button.js';
25
+ export type { Emphasis } from './ui/button.js';
26
26
  export type { ReloadComponentEvent } from './core/event-names.js';
27
27
  export type { ComponentProps, KnownPageContainer, LayoutPayload, Node, NodeProps, NodeType, PageContainer, PageBreadcrumb, PagePayload, ComponentPropsOf, RendererComponent, RendererComponentModule, RendererComponentProps, Schema, UnknownComponent, } from './core/types.js';
28
28
  export { RealtimeListeners } from './realtime/listeners.js';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { initializeTheme, updateAppearance, useAppearance } from "./appearance/index.js";
1
+ import { initializeAppearance, updateAppearance, useAppearance } from "./appearance/index.js";
2
2
  import { createPlugin, createRegistry, eagerComponent, extendRegistry, lazyComponent } from "./core/registry.js";
3
3
  import { useColumnRegistry, useComponentRegistry } from "./core/registry-context.js";
4
4
  import { LATTICE_EVENT } from "./core/event-names.js";
@@ -29,4 +29,4 @@ import { registry } from "./registry.js";
29
29
  import { createLatticeApp } from "./create-app.js";
30
30
  import { registerRichEditorExtension } from "./form/rich-editor/registry.js";
31
31
  import { Provider } from "./provider.js";
32
- export { Callouts, EventBridge, Icon, IconRenderer, IconRendererProvider, LATTICE_EVENT, LATTICE_REF_HEADER, OutletContext, Provider, RealtimeListeners, Renderer, SchemaLayout, CollapsedContext as SidebarCollapsedContext, SpriteProvider, Toaster, builtinEffectHandlers, chatComponents, columnCell, copyToClipboard, createLatticeApp, createLayoutResolver, createPageResolver, createPlugin, createRegistry, dispatchActionError, dispatchEffects, eagerComponent, effectHandler, extendRegistry, getActionEffects, initializeTheme, isActionEffect, layoutComponents, lazyComponent, mergeEffectHandlers, onCallout, onToast, pageComponentName, registerRichEditorExtension, registry, updateAppearance, useAppearance, useChat, useColumnRegistry, useComponentRegistry, useEffectDispatcher, useCollapsed as useSidebarCollapsed, withHeaders, withRefHeader, withVisitHeaders };
32
+ export { Callouts, EventBridge, Icon, IconRenderer, IconRendererProvider, LATTICE_EVENT, LATTICE_REF_HEADER, OutletContext, Provider, RealtimeListeners, Renderer, SchemaLayout, CollapsedContext as SidebarCollapsedContext, SpriteProvider, Toaster, builtinEffectHandlers, chatComponents, columnCell, copyToClipboard, createLatticeApp, createLayoutResolver, createPageResolver, createPlugin, createRegistry, dispatchActionError, dispatchEffects, eagerComponent, effectHandler, extendRegistry, getActionEffects, initializeAppearance, isActionEffect, layoutComponents, lazyComponent, mergeEffectHandlers, onCallout, onToast, pageComponentName, registerRichEditorExtension, registry, updateAppearance, useAppearance, useChat, useColumnRegistry, useComponentRegistry, useEffectDispatcher, useCollapsed as useSidebarCollapsed, withHeaders, withRefHeader, withVisitHeaders };