94 lines
3.4 KiB
TypeScript
94 lines
3.4 KiB
TypeScript
/**
|
|
* Static palette definition for the form-builder. Each entry exposes a
|
|
* factory that returns a fresh `FormField` shape (matching the
|
|
* `@toolctrl/form-widget` zod schema) so the canvas can append without
|
|
* having to deep-clone a frozen prototype.
|
|
*
|
|
* The palette deliberately exposes a superset of `FormFieldType` —
|
|
* `heading` + `paragraph` are presentational items the renderer treats
|
|
* as `text` fields with `helpText` carrying the body. They keep parity
|
|
* with the original spec ("Heading, Paragraph" callouts in the
|
|
* drag-drop UX) without expanding the storage schema.
|
|
*/
|
|
import { HONEYPOT_FIELD_KEY } from "@toolctrl/form-widget";
|
|
import type { PaletteItem } from "./types";
|
|
|
|
export const paletteDefaultLanguage = "en";
|
|
|
|
function defaultLabelKey(type: string): string {
|
|
return `settings.forms.builder.defaults.${type}.label`;
|
|
}
|
|
|
|
function defaultOptionLabelKey(value: string): string {
|
|
return `settings.forms.builder.defaults.options.${value}`;
|
|
}
|
|
|
|
export const paletteItems: PaletteItem[] = [
|
|
{
|
|
type: "text",
|
|
labelKey: "settings.forms.builder.palette.text.label",
|
|
helpKey: "settings.forms.builder.palette.text.help",
|
|
defaults: () => ({ key: "text_field", type: "text", label: defaultLabelKey("text"), required: false }),
|
|
},
|
|
{
|
|
type: "email",
|
|
labelKey: "settings.forms.builder.palette.email.label",
|
|
helpKey: "settings.forms.builder.palette.email.help",
|
|
defaults: () => ({ key: "email", type: "email", label: defaultLabelKey("email"), required: true }),
|
|
},
|
|
{
|
|
type: "textarea",
|
|
labelKey: "settings.forms.builder.palette.textarea.label",
|
|
helpKey: "settings.forms.builder.palette.textarea.help",
|
|
defaults: () => ({ key: "message", type: "textarea", label: defaultLabelKey("textarea"), required: false }),
|
|
},
|
|
{
|
|
type: "select",
|
|
labelKey: "settings.forms.builder.palette.select.label",
|
|
helpKey: "settings.forms.builder.palette.select.help",
|
|
defaults: () => ({
|
|
key: "choice",
|
|
type: "select",
|
|
label: defaultLabelKey("select"),
|
|
required: false,
|
|
options: [
|
|
{ value: "option_a", label: defaultOptionLabelKey("option_a") },
|
|
{ value: "option_b", label: defaultOptionLabelKey("option_b") },
|
|
],
|
|
}),
|
|
},
|
|
{
|
|
type: "checkbox",
|
|
labelKey: "settings.forms.builder.palette.checkbox.label",
|
|
helpKey: "settings.forms.builder.palette.checkbox.help",
|
|
defaults: () => ({ key: "consent", type: "checkbox", label: defaultLabelKey("checkbox"), required: false }),
|
|
},
|
|
{
|
|
type: "radio",
|
|
labelKey: "settings.forms.builder.palette.radio.label",
|
|
helpKey: "settings.forms.builder.palette.radio.help",
|
|
defaults: () => ({
|
|
key: "pick",
|
|
type: "radio",
|
|
label: defaultLabelKey("radio"),
|
|
required: false,
|
|
options: [
|
|
{ value: "option_a", label: defaultOptionLabelKey("option_a") },
|
|
{ value: "option_b", label: defaultOptionLabelKey("option_b") },
|
|
],
|
|
}),
|
|
},
|
|
{
|
|
type: "number",
|
|
labelKey: "settings.forms.builder.palette.number.label",
|
|
helpKey: "settings.forms.builder.palette.number.help",
|
|
defaults: () => ({ key: "amount", type: "number", label: defaultLabelKey("number"), required: false }),
|
|
},
|
|
{
|
|
type: "honeypot",
|
|
labelKey: "settings.forms.builder.palette.honeypot.label",
|
|
helpKey: "settings.forms.builder.palette.honeypot.help",
|
|
defaults: () => ({ key: HONEYPOT_FIELD_KEY, type: "honeypot", label: defaultLabelKey("honeypot"), required: false }),
|
|
},
|
|
];
|