@jameskabz/nextcraft-ui 0.6.14 → 0.6.16
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.
- package/dist/components/{craft-form-builder.cjs → craft-form-modal.cjs} +7 -7
- package/dist/components/craft-form-modal.cjs.map +1 -0
- package/dist/components/{craft-form-builder.d.cts → craft-form-modal.d.cts} +5 -5
- package/dist/components/{craft-form-builder.d.ts → craft-form-modal.d.ts} +5 -5
- package/dist/components/{craft-form-builder.js → craft-form-modal.js} +3 -3
- package/dist/components/craft-form-modal.js.map +1 -0
- package/dist/components/craft-switch.cjs +4 -11
- package/dist/components/craft-switch.cjs.map +1 -1
- package/dist/components/craft-switch.js +4 -11
- package/dist/components/craft-switch.js.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/styles.css +81 -20
- package/package.json +1 -1
- package/dist/components/craft-form-builder.cjs.map +0 -1
- package/dist/components/craft-form-builder.js.map +0 -1
|
@@ -27,11 +27,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
27
|
mod
|
|
28
28
|
));
|
|
29
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
-
var
|
|
31
|
-
__export(
|
|
32
|
-
|
|
30
|
+
var craft_form_modal_exports = {};
|
|
31
|
+
__export(craft_form_modal_exports, {
|
|
32
|
+
CraftFormModal: () => CraftFormModal
|
|
33
33
|
});
|
|
34
|
-
module.exports = __toCommonJS(
|
|
34
|
+
module.exports = __toCommonJS(craft_form_modal_exports);
|
|
35
35
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
36
|
var React = __toESM(require("react"), 1);
|
|
37
37
|
var import_react_hook_form = require("react-hook-form");
|
|
@@ -171,7 +171,7 @@ function buildRules(field, getValues) {
|
|
|
171
171
|
}
|
|
172
172
|
return rules;
|
|
173
173
|
}
|
|
174
|
-
function
|
|
174
|
+
function CraftFormModal({
|
|
175
175
|
title = "Form",
|
|
176
176
|
description,
|
|
177
177
|
fields,
|
|
@@ -325,6 +325,6 @@ function CraftFormBuilder({
|
|
|
325
325
|
}
|
|
326
326
|
// Annotate the CommonJS export names for ESM import in node:
|
|
327
327
|
0 && (module.exports = {
|
|
328
|
-
|
|
328
|
+
CraftFormModal
|
|
329
329
|
});
|
|
330
|
-
//# sourceMappingURL=craft-form-
|
|
330
|
+
//# sourceMappingURL=craft-form-modal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-form-modal.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n FormProvider,\n type DefaultValues,\n type FieldValues,\n type Path,\n type RegisterOptions,\n useForm,\n} from \"react-hook-form\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftSubmitButton } from \"@/components/craft-submit-button\";\nimport {\n CraftFormField,\n type CraftFormFieldOption,\n type CraftFormFieldType,\n} from \"@/components/craft-form-field\";\n\nexport type CraftFormModalField<TValues extends FieldValues> = {\n name: Path<TValues>;\n label?: React.ReactNode;\n description?: React.ReactNode;\n type: CraftFormFieldType;\n placeholder?: string;\n options?: CraftFormFieldOption[];\n required?: boolean;\n disabled?: boolean;\n rules?: RegisterOptions<TValues>;\n defaultValue?: unknown;\n min?: number;\n max?: number;\n step?: number;\n rows?: number;\n accept?: string;\n minFiles?: number;\n maxFiles?: number;\n helpText?: React.ReactNode;\n fieldProps?: Record<string, unknown>;\n validate?: (value: unknown, values: TValues) => string | boolean | undefined;\n};\n\nexport type CraftFormModalProps<TValues extends FieldValues> = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n fields: Array<CraftFormModalField<TValues>>;\n initialData?: Partial<TValues> | null;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: React.ReactNode;\n submitLabel?: React.ReactNode;\n cancelLabel?: React.ReactNode;\n resetLabel?: React.ReactNode;\n showReset?: boolean;\n showCancel?: boolean;\n tone?: ThemeName;\n className?: string;\n formClassName?: string;\n loading?: boolean;\n disableSubmitWhenInvalid?: boolean;\n closeOnSubmit?: boolean;\n closeOnCancel?: boolean;\n onSubmit: (values: TValues) => void | Promise<void>;\n onReset?: () => void;\n onCancel?: () => void;\n customValidation?: (values: TValues) => Partial<Record<Path<TValues>, string>>;\n};\n\nfunction defaultValueForField<TValues extends FieldValues>(\n field: CraftFormModalField<TValues>\n) {\n if (field.defaultValue !== undefined) return field.defaultValue;\n switch (field.type) {\n case \"checkbox\":\n case \"switch\":\n return false;\n case \"number\":\n case \"slider\":\n case \"range\":\n return field.min ?? 0;\n case \"multifile\":\n return [];\n case \"file\":\n return null;\n case \"multiselect\":\n return [];\n case \"radio\":\n return field.options?.[0]?.value ?? \"\";\n default:\n return \"\";\n }\n}\n\nfunction buildDefaultValues<TValues extends FieldValues>(\n fields: Array<CraftFormModalField<TValues>>,\n initialData?: Partial<TValues> | null\n): DefaultValues<TValues> {\n const values = {} as Record<string, unknown>;\n fields.forEach((field) => {\n const initialValue = initialData?.[field.name as keyof TValues];\n if (initialValue !== undefined && initialValue !== null) {\n values[field.name] = initialValue;\n } else {\n values[field.name] = defaultValueForField(field);\n }\n });\n return values as DefaultValues<TValues>;\n}\n\nfunction buildRules<TValues extends FieldValues>(\n field: CraftFormModalField<TValues>,\n getValues: () => TValues\n): RegisterOptions<TValues> {\n const rules: RegisterOptions<TValues> = { ...field.rules };\n const mergeValidate = (\n current: RegisterOptions<TValues>[\"validate\"],\n next: (value: unknown) => string | boolean | undefined\n ) => {\n if (!current) return next;\n if (typeof current === \"function\") {\n return (value: unknown): string | boolean | undefined => {\n const result = (current as (value: unknown, values: TValues) => string | boolean | undefined)(\n value,\n getValues()\n );\n if (result !== true) return result as string | undefined;\n return next(value);\n };\n }\n if (typeof current === \"object\") {\n return (value: unknown): string | boolean | undefined => {\n const entries = Object.entries(current);\n for (const [, validator] of entries) {\n const result = (validator as (value: unknown, values: TValues) => string | boolean | undefined)(\n value,\n getValues()\n );\n if (result !== true) return result as string | undefined;\n }\n return next(value);\n };\n }\n return next;\n };\n\n if (field.required && field.type !== \"hidden\") {\n if (field.type === \"checkbox\" || field.type === \"switch\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n value ? true : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"multiselect\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n Array.isArray(value) && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"file\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n value instanceof FileList && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"multifile\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n Array.isArray(value) && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else {\n rules.required = `${String(field.label ?? field.name)} is required`;\n }\n }\n\n if (field.min !== undefined) {\n rules.min = { value: field.min, message: `Min ${field.min}` };\n }\n if (field.max !== undefined) {\n rules.max = { value: field.max, message: `Max ${field.max}` };\n }\n\n if (field.type === \"email\") {\n rules.pattern = {\n value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Please enter a valid email address\",\n };\n }\n\n if (field.type === \"url\") {\n rules.pattern = {\n value: /^https?:\\/\\/.+/,\n message: \"Please enter a valid URL\",\n };\n }\n\n if (field.validate) {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n field.validate?.(value, getValues())\n );\n }\n\n return rules;\n}\n\nexport function CraftFormModal<TValues extends FieldValues>({\n title = \"Form\",\n description,\n fields,\n initialData = null,\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n submitLabel = \"Submit\",\n cancelLabel = \"Cancel\",\n resetLabel = \"Reset\",\n showReset = true,\n showCancel = true,\n tone,\n className,\n formClassName,\n loading = false,\n disableSubmitWhenInvalid = true,\n closeOnSubmit = true,\n closeOnCancel = true,\n onSubmit,\n onReset,\n onCancel,\n customValidation,\n}: CraftFormModalProps<TValues>) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const isControlled = typeof open === \"boolean\";\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const defaultValues = React.useMemo(\n () => buildDefaultValues(fields, initialData),\n [fields, initialData]\n );\n\n const form = useForm<TValues>({\n mode: \"onChange\",\n defaultValues,\n });\n\n const formId = React.useId();\n\n React.useEffect(() => {\n form.reset(defaultValues);\n }, [defaultValues, form]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (customValidation) {\n const customErrors = customValidation(values);\n if (customErrors && Object.keys(customErrors).length > 0) {\n Object.entries(customErrors).forEach(([key, message]) => {\n if (message) {\n form.setError(key as Path<TValues>, {\n type: \"custom\",\n message: String(message),\n });\n }\n });\n return;\n }\n }\n\n await onSubmit(values);\n if (closeOnSubmit) setOpen(false);\n });\n\n const handleReset = () => {\n form.reset(defaultValues);\n onReset?.();\n };\n\n const handleCancel = () => {\n onCancel?.();\n if (closeOnCancel) setOpen(false);\n };\n\n return (\n <FormProvider {...form}>\n <CraftModal\n open={isOpen}\n onOpenChange={setOpen}\n trigger={trigger}\n title={title}\n description={description}\n tone={tone}\n className={className}\n footer={\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {showReset && (\n <CraftButton\n type=\"button\"\n variant=\"outline\"\n onClick={handleReset}\n disabled={loading}\n >\n {resetLabel}\n </CraftButton>\n )}\n {showCancel && (\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n onClick={handleCancel}\n disabled={loading}\n >\n {cancelLabel}\n </CraftButton>\n )}\n <CraftSubmitButton\n loading={loading}\n disableWhenInvalid={disableSubmitWhenInvalid}\n form={formId}\n >\n {submitLabel}\n </CraftSubmitButton>\n </div>\n }\n >\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={cn(\"space-y-5\", formClassName)}\n >\n {fields.map((field) => (\n <div key={field.name} className=\"space-y-2\">\n {field.helpText && (\n <p className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {field.helpText}\n </p>\n )}\n <CraftFormField\n name={field.name}\n label={field.label}\n description={field.description}\n type={field.type}\n placeholder={field.placeholder}\n options={field.options}\n tone={tone}\n disabled={field.disabled || loading}\n rules={buildRules(field, form.getValues)}\n fieldProps={{\n min: field.min,\n max: field.max,\n step: field.step,\n rows: field.rows,\n accept: field.accept,\n multiple: field.type === \"multifile\",\n ...field.fieldProps,\n }}\n />\n </div>\n ))}\n </form>\n </CraftModal>\n </FormProvider>\n );\n}\n"],"mappings":"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","names":["_a"]}
|
|
@@ -4,7 +4,7 @@ import { FieldValues, Path, RegisterOptions } from 'react-hook-form';
|
|
|
4
4
|
import { ThemeName } from '../theme/theme-context.cjs';
|
|
5
5
|
import { CraftFormFieldType, CraftFormFieldOption } from './craft-form-field.cjs';
|
|
6
6
|
|
|
7
|
-
type
|
|
7
|
+
type CraftFormModalField<TValues extends FieldValues> = {
|
|
8
8
|
name: Path<TValues>;
|
|
9
9
|
label?: React.ReactNode;
|
|
10
10
|
description?: React.ReactNode;
|
|
@@ -26,10 +26,10 @@ type CraftFormBuilderField<TValues extends FieldValues> = {
|
|
|
26
26
|
fieldProps?: Record<string, unknown>;
|
|
27
27
|
validate?: (value: unknown, values: TValues) => string | boolean | undefined;
|
|
28
28
|
};
|
|
29
|
-
type
|
|
29
|
+
type CraftFormModalProps<TValues extends FieldValues> = {
|
|
30
30
|
title?: React.ReactNode;
|
|
31
31
|
description?: React.ReactNode;
|
|
32
|
-
fields: Array<
|
|
32
|
+
fields: Array<CraftFormModalField<TValues>>;
|
|
33
33
|
initialData?: Partial<TValues> | null;
|
|
34
34
|
open?: boolean;
|
|
35
35
|
defaultOpen?: boolean;
|
|
@@ -52,6 +52,6 @@ type CraftFormBuilderProps<TValues extends FieldValues> = {
|
|
|
52
52
|
onCancel?: () => void;
|
|
53
53
|
customValidation?: (values: TValues) => Partial<Record<Path<TValues>, string>>;
|
|
54
54
|
};
|
|
55
|
-
declare function
|
|
55
|
+
declare function CraftFormModal<TValues extends FieldValues>({ title, description, fields, initialData, open, defaultOpen, onOpenChange, trigger, submitLabel, cancelLabel, resetLabel, showReset, showCancel, tone, className, formClassName, loading, disableSubmitWhenInvalid, closeOnSubmit, closeOnCancel, onSubmit, onReset, onCancel, customValidation, }: CraftFormModalProps<TValues>): react_jsx_runtime.JSX.Element;
|
|
56
56
|
|
|
57
|
-
export {
|
|
57
|
+
export { CraftFormModal, type CraftFormModalField, type CraftFormModalProps };
|
|
@@ -4,7 +4,7 @@ import { FieldValues, Path, RegisterOptions } from 'react-hook-form';
|
|
|
4
4
|
import { ThemeName } from '../theme/theme-context.js';
|
|
5
5
|
import { CraftFormFieldType, CraftFormFieldOption } from './craft-form-field.js';
|
|
6
6
|
|
|
7
|
-
type
|
|
7
|
+
type CraftFormModalField<TValues extends FieldValues> = {
|
|
8
8
|
name: Path<TValues>;
|
|
9
9
|
label?: React.ReactNode;
|
|
10
10
|
description?: React.ReactNode;
|
|
@@ -26,10 +26,10 @@ type CraftFormBuilderField<TValues extends FieldValues> = {
|
|
|
26
26
|
fieldProps?: Record<string, unknown>;
|
|
27
27
|
validate?: (value: unknown, values: TValues) => string | boolean | undefined;
|
|
28
28
|
};
|
|
29
|
-
type
|
|
29
|
+
type CraftFormModalProps<TValues extends FieldValues> = {
|
|
30
30
|
title?: React.ReactNode;
|
|
31
31
|
description?: React.ReactNode;
|
|
32
|
-
fields: Array<
|
|
32
|
+
fields: Array<CraftFormModalField<TValues>>;
|
|
33
33
|
initialData?: Partial<TValues> | null;
|
|
34
34
|
open?: boolean;
|
|
35
35
|
defaultOpen?: boolean;
|
|
@@ -52,6 +52,6 @@ type CraftFormBuilderProps<TValues extends FieldValues> = {
|
|
|
52
52
|
onCancel?: () => void;
|
|
53
53
|
customValidation?: (values: TValues) => Partial<Record<Path<TValues>, string>>;
|
|
54
54
|
};
|
|
55
|
-
declare function
|
|
55
|
+
declare function CraftFormModal<TValues extends FieldValues>({ title, description, fields, initialData, open, defaultOpen, onOpenChange, trigger, submitLabel, cancelLabel, resetLabel, showReset, showCancel, tone, className, formClassName, loading, disableSubmitWhenInvalid, closeOnSubmit, closeOnCancel, onSubmit, onReset, onCancel, customValidation, }: CraftFormModalProps<TValues>): react_jsx_runtime.JSX.Element;
|
|
56
56
|
|
|
57
|
-
export {
|
|
57
|
+
export { CraftFormModal, type CraftFormModalField, type CraftFormModalProps };
|
|
@@ -143,7 +143,7 @@ function buildRules(field, getValues) {
|
|
|
143
143
|
}
|
|
144
144
|
return rules;
|
|
145
145
|
}
|
|
146
|
-
function
|
|
146
|
+
function CraftFormModal({
|
|
147
147
|
title = "Form",
|
|
148
148
|
description,
|
|
149
149
|
fields,
|
|
@@ -296,6 +296,6 @@ function CraftFormBuilder({
|
|
|
296
296
|
) });
|
|
297
297
|
}
|
|
298
298
|
export {
|
|
299
|
-
|
|
299
|
+
CraftFormModal
|
|
300
300
|
};
|
|
301
|
-
//# sourceMappingURL=craft-form-
|
|
301
|
+
//# sourceMappingURL=craft-form-modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-form-modal.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n FormProvider,\n type DefaultValues,\n type FieldValues,\n type Path,\n type RegisterOptions,\n useForm,\n} from \"react-hook-form\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftSubmitButton } from \"@/components/craft-submit-button\";\nimport {\n CraftFormField,\n type CraftFormFieldOption,\n type CraftFormFieldType,\n} from \"@/components/craft-form-field\";\n\nexport type CraftFormModalField<TValues extends FieldValues> = {\n name: Path<TValues>;\n label?: React.ReactNode;\n description?: React.ReactNode;\n type: CraftFormFieldType;\n placeholder?: string;\n options?: CraftFormFieldOption[];\n required?: boolean;\n disabled?: boolean;\n rules?: RegisterOptions<TValues>;\n defaultValue?: unknown;\n min?: number;\n max?: number;\n step?: number;\n rows?: number;\n accept?: string;\n minFiles?: number;\n maxFiles?: number;\n helpText?: React.ReactNode;\n fieldProps?: Record<string, unknown>;\n validate?: (value: unknown, values: TValues) => string | boolean | undefined;\n};\n\nexport type CraftFormModalProps<TValues extends FieldValues> = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n fields: Array<CraftFormModalField<TValues>>;\n initialData?: Partial<TValues> | null;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: React.ReactNode;\n submitLabel?: React.ReactNode;\n cancelLabel?: React.ReactNode;\n resetLabel?: React.ReactNode;\n showReset?: boolean;\n showCancel?: boolean;\n tone?: ThemeName;\n className?: string;\n formClassName?: string;\n loading?: boolean;\n disableSubmitWhenInvalid?: boolean;\n closeOnSubmit?: boolean;\n closeOnCancel?: boolean;\n onSubmit: (values: TValues) => void | Promise<void>;\n onReset?: () => void;\n onCancel?: () => void;\n customValidation?: (values: TValues) => Partial<Record<Path<TValues>, string>>;\n};\n\nfunction defaultValueForField<TValues extends FieldValues>(\n field: CraftFormModalField<TValues>\n) {\n if (field.defaultValue !== undefined) return field.defaultValue;\n switch (field.type) {\n case \"checkbox\":\n case \"switch\":\n return false;\n case \"number\":\n case \"slider\":\n case \"range\":\n return field.min ?? 0;\n case \"multifile\":\n return [];\n case \"file\":\n return null;\n case \"multiselect\":\n return [];\n case \"radio\":\n return field.options?.[0]?.value ?? \"\";\n default:\n return \"\";\n }\n}\n\nfunction buildDefaultValues<TValues extends FieldValues>(\n fields: Array<CraftFormModalField<TValues>>,\n initialData?: Partial<TValues> | null\n): DefaultValues<TValues> {\n const values = {} as Record<string, unknown>;\n fields.forEach((field) => {\n const initialValue = initialData?.[field.name as keyof TValues];\n if (initialValue !== undefined && initialValue !== null) {\n values[field.name] = initialValue;\n } else {\n values[field.name] = defaultValueForField(field);\n }\n });\n return values as DefaultValues<TValues>;\n}\n\nfunction buildRules<TValues extends FieldValues>(\n field: CraftFormModalField<TValues>,\n getValues: () => TValues\n): RegisterOptions<TValues> {\n const rules: RegisterOptions<TValues> = { ...field.rules };\n const mergeValidate = (\n current: RegisterOptions<TValues>[\"validate\"],\n next: (value: unknown) => string | boolean | undefined\n ) => {\n if (!current) return next;\n if (typeof current === \"function\") {\n return (value: unknown): string | boolean | undefined => {\n const result = (current as (value: unknown, values: TValues) => string | boolean | undefined)(\n value,\n getValues()\n );\n if (result !== true) return result as string | undefined;\n return next(value);\n };\n }\n if (typeof current === \"object\") {\n return (value: unknown): string | boolean | undefined => {\n const entries = Object.entries(current);\n for (const [, validator] of entries) {\n const result = (validator as (value: unknown, values: TValues) => string | boolean | undefined)(\n value,\n getValues()\n );\n if (result !== true) return result as string | undefined;\n }\n return next(value);\n };\n }\n return next;\n };\n\n if (field.required && field.type !== \"hidden\") {\n if (field.type === \"checkbox\" || field.type === \"switch\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n value ? true : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"multiselect\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n Array.isArray(value) && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"file\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n value instanceof FileList && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"multifile\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n Array.isArray(value) && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else {\n rules.required = `${String(field.label ?? field.name)} is required`;\n }\n }\n\n if (field.min !== undefined) {\n rules.min = { value: field.min, message: `Min ${field.min}` };\n }\n if (field.max !== undefined) {\n rules.max = { value: field.max, message: `Max ${field.max}` };\n }\n\n if (field.type === \"email\") {\n rules.pattern = {\n value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Please enter a valid email address\",\n };\n }\n\n if (field.type === \"url\") {\n rules.pattern = {\n value: /^https?:\\/\\/.+/,\n message: \"Please enter a valid URL\",\n };\n }\n\n if (field.validate) {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n field.validate?.(value, getValues())\n );\n }\n\n return rules;\n}\n\nexport function CraftFormModal<TValues extends FieldValues>({\n title = \"Form\",\n description,\n fields,\n initialData = null,\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n submitLabel = \"Submit\",\n cancelLabel = \"Cancel\",\n resetLabel = \"Reset\",\n showReset = true,\n showCancel = true,\n tone,\n className,\n formClassName,\n loading = false,\n disableSubmitWhenInvalid = true,\n closeOnSubmit = true,\n closeOnCancel = true,\n onSubmit,\n onReset,\n onCancel,\n customValidation,\n}: CraftFormModalProps<TValues>) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const isControlled = typeof open === \"boolean\";\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const defaultValues = React.useMemo(\n () => buildDefaultValues(fields, initialData),\n [fields, initialData]\n );\n\n const form = useForm<TValues>({\n mode: \"onChange\",\n defaultValues,\n });\n\n const formId = React.useId();\n\n React.useEffect(() => {\n form.reset(defaultValues);\n }, [defaultValues, form]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (customValidation) {\n const customErrors = customValidation(values);\n if (customErrors && Object.keys(customErrors).length > 0) {\n Object.entries(customErrors).forEach(([key, message]) => {\n if (message) {\n form.setError(key as Path<TValues>, {\n type: \"custom\",\n message: String(message),\n });\n }\n });\n return;\n }\n }\n\n await onSubmit(values);\n if (closeOnSubmit) setOpen(false);\n });\n\n const handleReset = () => {\n form.reset(defaultValues);\n onReset?.();\n };\n\n const handleCancel = () => {\n onCancel?.();\n if (closeOnCancel) setOpen(false);\n };\n\n return (\n <FormProvider {...form}>\n <CraftModal\n open={isOpen}\n onOpenChange={setOpen}\n trigger={trigger}\n title={title}\n description={description}\n tone={tone}\n className={className}\n footer={\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {showReset && (\n <CraftButton\n type=\"button\"\n variant=\"outline\"\n onClick={handleReset}\n disabled={loading}\n >\n {resetLabel}\n </CraftButton>\n )}\n {showCancel && (\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n onClick={handleCancel}\n disabled={loading}\n >\n {cancelLabel}\n </CraftButton>\n )}\n <CraftSubmitButton\n loading={loading}\n disableWhenInvalid={disableSubmitWhenInvalid}\n form={formId}\n >\n {submitLabel}\n </CraftSubmitButton>\n </div>\n }\n >\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={cn(\"space-y-5\", formClassName)}\n >\n {fields.map((field) => (\n <div key={field.name} className=\"space-y-2\">\n {field.helpText && (\n <p className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {field.helpText}\n </p>\n )}\n <CraftFormField\n name={field.name}\n label={field.label}\n description={field.description}\n type={field.type}\n placeholder={field.placeholder}\n options={field.options}\n tone={tone}\n disabled={field.disabled || loading}\n rules={buildRules(field, form.getValues)}\n fieldProps={{\n min: field.min,\n max: field.max,\n step: field.step,\n rows: field.rows,\n accept: field.accept,\n multiple: field.type === \"multifile\",\n ...field.fieldProps,\n }}\n />\n </div>\n ))}\n </form>\n </CraftModal>\n </FormProvider>\n );\n}\n"],"mappings":"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","names":["_a"]}
|
|
@@ -52,19 +52,12 @@ const CraftSwitch = React.forwardRef(
|
|
|
52
52
|
{
|
|
53
53
|
className: (0, import_cn.cn)(
|
|
54
54
|
"relative h-6 w-11 rounded-full border-2 border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)]",
|
|
55
|
+
"before:absolute before:left-0.5 before:top-0.5 before:h-4 before:w-4 before:rounded-full before:bg-[rgb(var(--nc-fg)/0.92)] before:shadow-[0_1px_2px_rgba(0,0,0,0.4)]",
|
|
56
|
+
"before:transition-all before:duration-200 before:content-['']",
|
|
55
57
|
"transition-all duration-200",
|
|
56
58
|
"peer-focus-visible:ring-2 peer-focus-visible:ring-[rgb(var(--nc-accent-1)/0.5)]",
|
|
57
|
-
"peer-checked:border-[rgb(var(--nc-accent-1)/0.6)] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]"
|
|
58
|
-
|
|
59
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
|
-
"span",
|
|
61
|
-
{
|
|
62
|
-
className: (0, import_cn.cn)(
|
|
63
|
-
"absolute left-0.5 top-0.5 h-4 w-4 rounded-full bg-[rgb(var(--nc-surface-muted)/0.9)]",
|
|
64
|
-
"transition-all duration-200",
|
|
65
|
-
"peer-checked:translate-x-5 peer-checked:bg-[rgb(var(--nc-surface-muted))]"
|
|
66
|
-
)
|
|
67
|
-
}
|
|
59
|
+
"peer-checked:border-[rgb(var(--nc-accent-1)/0.6)] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]",
|
|
60
|
+
"peer-checked:before:translate-x-5 peer-checked:before:bg-[rgb(var(--nc-fg))]"
|
|
68
61
|
)
|
|
69
62
|
}
|
|
70
63
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-switch.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftSwitchProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\"\n> & {\n tone?: ThemeName;\n label?: React.ReactNode;\n};\n\nexport const CraftSwitch = React.forwardRef<HTMLInputElement, CraftSwitchProps>(\n ({ className, tone, label, ...props }, ref) => {\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-3 text-sm text-[rgb(var(--nc-fg))]\",\n props.disabled ? \"opacity-60\" : \"cursor-pointer\",\n className\n )}\n data-nc-theme={tone}\n >\n <input ref={ref} type=\"checkbox\" className=\"peer sr-only\" {...props} />\n <span\n className={cn(\n \"relative h-6 w-11 rounded-full border-2 border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)]\",\n \"transition-all duration-200\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-[rgb(var(--nc-accent-1)/0.5)]\",\n \"peer-checked:border-[rgb(var(--nc-accent-1)/0.6)] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]\"
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-switch.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftSwitchProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\"\n> & {\n tone?: ThemeName;\n label?: React.ReactNode;\n};\n\nexport const CraftSwitch = React.forwardRef<HTMLInputElement, CraftSwitchProps>(\n ({ className, tone, label, ...props }, ref) => {\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-3 text-sm text-[rgb(var(--nc-fg))]\",\n props.disabled ? \"opacity-60\" : \"cursor-pointer\",\n className\n )}\n data-nc-theme={tone}\n >\n <input ref={ref} type=\"checkbox\" className=\"peer sr-only\" {...props} />\n <span\n className={cn(\n \"relative h-6 w-11 rounded-full border-2 border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)]\",\n \"before:absolute before:left-0.5 before:top-0.5 before:h-4 before:w-4 before:rounded-full before:bg-[rgb(var(--nc-fg)/0.92)] before:shadow-[0_1px_2px_rgba(0,0,0,0.4)]\",\n \"before:transition-all before:duration-200 before:content-['']\",\n \"transition-all duration-200\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-[rgb(var(--nc-accent-1)/0.5)]\",\n \"peer-checked:border-[rgb(var(--nc-accent-1)/0.6)] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]\",\n \"peer-checked:before:translate-x-5 peer-checked:before:bg-[rgb(var(--nc-fg))]\"\n )}\n >\n </span>\n {label && <span>{label}</span>}\n </label>\n );\n }\n);\n\nCraftSwitch.displayName = \"CraftSwitch\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBM;AAhBN,YAAuB;AAEvB,gBAAmB;AAWZ,MAAM,cAAc,MAAM;AAAA,EAC/B,CAAC,EAAE,WAAW,MAAM,OAAO,GAAG,MAAM,GAAG,QAAQ;AAC7C,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,UACT;AAAA,UACA,MAAM,WAAW,eAAe;AAAA,UAChC;AAAA,QACF;AAAA,QACA,iBAAe;AAAA,QAEf;AAAA,sDAAC,WAAM,KAAU,MAAK,YAAW,WAAU,gBAAgB,GAAG,OAAO;AAAA,UACrE;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,UAEF;AAAA,UACC,SAAS,4CAAC,UAAM,iBAAM;AAAA;AAAA;AAAA,IACzB;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;","names":[]}
|
|
@@ -19,19 +19,12 @@ const CraftSwitch = React.forwardRef(
|
|
|
19
19
|
{
|
|
20
20
|
className: cn(
|
|
21
21
|
"relative h-6 w-11 rounded-full border-2 border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)]",
|
|
22
|
+
"before:absolute before:left-0.5 before:top-0.5 before:h-4 before:w-4 before:rounded-full before:bg-[rgb(var(--nc-fg)/0.92)] before:shadow-[0_1px_2px_rgba(0,0,0,0.4)]",
|
|
23
|
+
"before:transition-all before:duration-200 before:content-['']",
|
|
22
24
|
"transition-all duration-200",
|
|
23
25
|
"peer-focus-visible:ring-2 peer-focus-visible:ring-[rgb(var(--nc-accent-1)/0.5)]",
|
|
24
|
-
"peer-checked:border-[rgb(var(--nc-accent-1)/0.6)] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]"
|
|
25
|
-
|
|
26
|
-
children: /* @__PURE__ */ jsx(
|
|
27
|
-
"span",
|
|
28
|
-
{
|
|
29
|
-
className: cn(
|
|
30
|
-
"absolute left-0.5 top-0.5 h-4 w-4 rounded-full bg-[rgb(var(--nc-surface-muted)/0.9)]",
|
|
31
|
-
"transition-all duration-200",
|
|
32
|
-
"peer-checked:translate-x-5 peer-checked:bg-[rgb(var(--nc-surface-muted))]"
|
|
33
|
-
)
|
|
34
|
-
}
|
|
26
|
+
"peer-checked:border-[rgb(var(--nc-accent-1)/0.6)] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]",
|
|
27
|
+
"peer-checked:before:translate-x-5 peer-checked:before:bg-[rgb(var(--nc-fg))]"
|
|
35
28
|
)
|
|
36
29
|
}
|
|
37
30
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-switch.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftSwitchProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\"\n> & {\n tone?: ThemeName;\n label?: React.ReactNode;\n};\n\nexport const CraftSwitch = React.forwardRef<HTMLInputElement, CraftSwitchProps>(\n ({ className, tone, label, ...props }, ref) => {\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-3 text-sm text-[rgb(var(--nc-fg))]\",\n props.disabled ? \"opacity-60\" : \"cursor-pointer\",\n className\n )}\n data-nc-theme={tone}\n >\n <input ref={ref} type=\"checkbox\" className=\"peer sr-only\" {...props} />\n <span\n className={cn(\n \"relative h-6 w-11 rounded-full border-2 border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)]\",\n \"transition-all duration-200\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-[rgb(var(--nc-accent-1)/0.5)]\",\n \"peer-checked:border-[rgb(var(--nc-accent-1)/0.6)] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]\"
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-switch.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftSwitchProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\"\n> & {\n tone?: ThemeName;\n label?: React.ReactNode;\n};\n\nexport const CraftSwitch = React.forwardRef<HTMLInputElement, CraftSwitchProps>(\n ({ className, tone, label, ...props }, ref) => {\n return (\n <label\n className={cn(\n \"inline-flex items-center gap-3 text-sm text-[rgb(var(--nc-fg))]\",\n props.disabled ? \"opacity-60\" : \"cursor-pointer\",\n className\n )}\n data-nc-theme={tone}\n >\n <input ref={ref} type=\"checkbox\" className=\"peer sr-only\" {...props} />\n <span\n className={cn(\n \"relative h-6 w-11 rounded-full border-2 border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)]\",\n \"before:absolute before:left-0.5 before:top-0.5 before:h-4 before:w-4 before:rounded-full before:bg-[rgb(var(--nc-fg)/0.92)] before:shadow-[0_1px_2px_rgba(0,0,0,0.4)]\",\n \"before:transition-all before:duration-200 before:content-['']\",\n \"transition-all duration-200\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-[rgb(var(--nc-accent-1)/0.5)]\",\n \"peer-checked:border-[rgb(var(--nc-accent-1)/0.6)] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]\",\n \"peer-checked:before:translate-x-5 peer-checked:before:bg-[rgb(var(--nc-fg))]\"\n )}\n >\n </span>\n {label && <span>{label}</span>}\n </label>\n );\n }\n);\n\nCraftSwitch.displayName = \"CraftSwitch\";\n"],"mappings":"AAgBM,SAQE,KARF;AAhBN,YAAY,WAAW;AAEvB,SAAS,UAAU;AAWZ,MAAM,cAAc,MAAM;AAAA,EAC/B,CAAC,EAAE,WAAW,MAAM,OAAO,GAAG,MAAM,GAAG,QAAQ;AAC7C,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,MAAM,WAAW,eAAe;AAAA,UAChC;AAAA,QACF;AAAA,QACA,iBAAe;AAAA,QAEf;AAAA,8BAAC,WAAM,KAAU,MAAK,YAAW,WAAU,gBAAgB,GAAG,OAAO;AAAA,UACrE;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,UAEF;AAAA,UACC,SAAS,oBAAC,UAAM,iBAAM;AAAA;AAAA;AAAA,IACzB;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -40,8 +40,8 @@ __export(index_exports, {
|
|
|
40
40
|
CraftErrorState: () => import_craft_error_state.CraftErrorState,
|
|
41
41
|
CraftFilterBar: () => import_craft_filter_bar.CraftFilterBar,
|
|
42
42
|
CraftForm: () => import_craft_form.CraftForm,
|
|
43
|
-
CraftFormBuilder: () => import_craft_form_builder.CraftFormBuilder,
|
|
44
43
|
CraftFormField: () => import_craft_form_field.CraftFormField,
|
|
44
|
+
CraftFormModal: () => import_craft_form_modal.CraftFormModal,
|
|
45
45
|
CraftIcon: () => import_craft_icon.CraftIcon,
|
|
46
46
|
CraftIconProvider: () => import_craft_icon.CraftIconProvider,
|
|
47
47
|
CraftInput: () => import_craft_input.CraftInput,
|
|
@@ -102,7 +102,7 @@ var import_craft_icon = require("./components/craft-icon");
|
|
|
102
102
|
var import_craft_number_input = require("./components/craft-number-input");
|
|
103
103
|
var import_craft_currency_input = require("./components/craft-currency-input");
|
|
104
104
|
var import_craft_form = require("./components/craft-form");
|
|
105
|
-
var
|
|
105
|
+
var import_craft_form_modal = require("./components/craft-form-modal");
|
|
106
106
|
var import_craft_form_field = require("./components/craft-form-field");
|
|
107
107
|
var import_craft_submit_button = require("./components/craft-submit-button");
|
|
108
108
|
var import_craft_confirm_dialog = require("./components/craft-confirm-dialog");
|
|
@@ -147,8 +147,8 @@ var import_theme_context = require("./theme/theme-context");
|
|
|
147
147
|
CraftErrorState,
|
|
148
148
|
CraftFilterBar,
|
|
149
149
|
CraftForm,
|
|
150
|
-
CraftFormBuilder,
|
|
151
150
|
CraftFormField,
|
|
151
|
+
CraftFormModal,
|
|
152
152
|
CraftIcon,
|
|
153
153
|
CraftIconProvider,
|
|
154
154
|
CraftInput,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { CraftButton } from \"./components/craft-button\";\nexport type { CraftButtonProps } from \"./components/craft-button\";\n\nexport { GlassCard } from \"./components/glass-card\";\nexport type { GlassCardProps } from \"./components/glass-card\";\n\nexport { CraftInput } from \"./components/craft-input\";\nexport type { CraftInputProps } from \"./components/craft-input\";\n\nexport { CraftTextarea } from \"./components/craft-textarea\";\nexport type { CraftTextareaProps } from \"./components/craft-textarea\";\n\nexport { CraftSelect } from \"./components/craft-select\";\nexport type { CraftSelectProps } from \"./components/craft-select\";\n\nexport { CraftCheckbox } from \"./components/craft-checkbox\";\nexport type { CraftCheckboxProps } from \"./components/craft-checkbox\";\n\nexport { CraftSwitch } from \"./components/craft-switch\";\nexport type { CraftSwitchProps } from \"./components/craft-switch\";\n\nexport { CraftBadge } from \"./components/craft-badge\";\nexport type { CraftBadgeProps } from \"./components/craft-badge\";\n\nexport { CraftAlert } from \"./components/craft-alert\";\nexport type { CraftAlertProps } from \"./components/craft-alert\";\n\nexport { CraftErrorState } from \"./components/craft-error-state\";\nexport type { CraftErrorStateProps } from \"./components/craft-error-state\";\n\nexport { CraftLoadingState } from \"./components/craft-loading-state\";\nexport type { CraftLoadingStateProps } from \"./components/craft-loading-state\";\n\nexport { CraftCard } from \"./components/craft-card\";\nexport type { CraftCardProps } from \"./components/craft-card\";\n\nexport { CraftModal } from \"./components/craft-modal\";\nexport type { CraftModalProps } from \"./components/craft-modal\";\n\nexport { CraftDrawer } from \"./components/craft-drawer\";\nexport type { CraftDrawerProps } from \"./components/craft-drawer\";\n\nexport { CraftTabs } from \"./components/craft-tabs\";\nexport type { CraftTabsProps } from \"./components/craft-tabs\";\n\nexport { CraftTooltip } from \"./components/craft-tooltip\";\nexport type { CraftTooltipProps } from \"./components/craft-tooltip\";\n\nexport { CraftToastHost, useCraftToast } from \"./components/craft-toast\";\nexport type { CraftToast, CraftToastHostProps } from \"./components/craft-toast\";\n\nexport { CraftSkeleton } from \"./components/craft-skeleton\";\nexport type { CraftSkeletonProps } from \"./components/craft-skeleton\";\n\nexport { CraftEmptyState } from \"./components/craft-empty-state\";\nexport type { CraftEmptyStateProps } from \"./components/craft-empty-state\";\n\nexport { CraftPopover } from \"./components/craft-popover\";\nexport type { CraftPopoverProps } from \"./components/craft-popover\";\n\nexport { CraftDropdownMenu } from \"./components/craft-dropdown-menu\";\nexport type { CraftDropdownMenuProps, CraftDropdownItem } from \"./components/craft-dropdown-menu\";\n\nexport { CraftCommandPalette } from \"./components/craft-command-palette\";\nexport type { CraftCommandPaletteProps, CraftCommandItem } from \"./components/craft-command-palette\";\n\nexport { CraftLink } from \"./components/craft-link\";\nexport type { CraftLinkProps } from \"./components/craft-link\";\n\nexport { CraftStatCard } from \"./components/craft-stat-card\";\nexport type { CraftStatCardProps } from \"./components/craft-stat-card\";\n\nexport { CraftDatePicker } from \"./components/craft-date-picker\";\nexport type { CraftDatePickerProps } from \"./components/craft-date-picker\";\n\nexport { CraftIcon, CraftIconProvider } from \"./components/craft-icon\";\nexport type {\n CraftIconProps,\n CraftIconProviderProps,\n CraftIconRegistry,\n} from \"./components/craft-icon\";\n\nexport { CraftNumberInput } from \"./components/craft-number-input\";\nexport type { CraftNumberInputProps } from \"./components/craft-number-input\";\n\nexport { CraftCurrencyInput } from \"./components/craft-currency-input\";\nexport type { CraftCurrencyInputProps } from \"./components/craft-currency-input\";\n\nexport { CraftForm } from \"./components/craft-form\";\nexport type { CraftFormProps } from \"./components/craft-form\";\n\nexport {
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { CraftButton } from \"./components/craft-button\";\nexport type { CraftButtonProps } from \"./components/craft-button\";\n\nexport { GlassCard } from \"./components/glass-card\";\nexport type { GlassCardProps } from \"./components/glass-card\";\n\nexport { CraftInput } from \"./components/craft-input\";\nexport type { CraftInputProps } from \"./components/craft-input\";\n\nexport { CraftTextarea } from \"./components/craft-textarea\";\nexport type { CraftTextareaProps } from \"./components/craft-textarea\";\n\nexport { CraftSelect } from \"./components/craft-select\";\nexport type { CraftSelectProps } from \"./components/craft-select\";\n\nexport { CraftCheckbox } from \"./components/craft-checkbox\";\nexport type { CraftCheckboxProps } from \"./components/craft-checkbox\";\n\nexport { CraftSwitch } from \"./components/craft-switch\";\nexport type { CraftSwitchProps } from \"./components/craft-switch\";\n\nexport { CraftBadge } from \"./components/craft-badge\";\nexport type { CraftBadgeProps } from \"./components/craft-badge\";\n\nexport { CraftAlert } from \"./components/craft-alert\";\nexport type { CraftAlertProps } from \"./components/craft-alert\";\n\nexport { CraftErrorState } from \"./components/craft-error-state\";\nexport type { CraftErrorStateProps } from \"./components/craft-error-state\";\n\nexport { CraftLoadingState } from \"./components/craft-loading-state\";\nexport type { CraftLoadingStateProps } from \"./components/craft-loading-state\";\n\nexport { CraftCard } from \"./components/craft-card\";\nexport type { CraftCardProps } from \"./components/craft-card\";\n\nexport { CraftModal } from \"./components/craft-modal\";\nexport type { CraftModalProps } from \"./components/craft-modal\";\n\nexport { CraftDrawer } from \"./components/craft-drawer\";\nexport type { CraftDrawerProps } from \"./components/craft-drawer\";\n\nexport { CraftTabs } from \"./components/craft-tabs\";\nexport type { CraftTabsProps } from \"./components/craft-tabs\";\n\nexport { CraftTooltip } from \"./components/craft-tooltip\";\nexport type { CraftTooltipProps } from \"./components/craft-tooltip\";\n\nexport { CraftToastHost, useCraftToast } from \"./components/craft-toast\";\nexport type { CraftToast, CraftToastHostProps } from \"./components/craft-toast\";\n\nexport { CraftSkeleton } from \"./components/craft-skeleton\";\nexport type { CraftSkeletonProps } from \"./components/craft-skeleton\";\n\nexport { CraftEmptyState } from \"./components/craft-empty-state\";\nexport type { CraftEmptyStateProps } from \"./components/craft-empty-state\";\n\nexport { CraftPopover } from \"./components/craft-popover\";\nexport type { CraftPopoverProps } from \"./components/craft-popover\";\n\nexport { CraftDropdownMenu } from \"./components/craft-dropdown-menu\";\nexport type { CraftDropdownMenuProps, CraftDropdownItem } from \"./components/craft-dropdown-menu\";\n\nexport { CraftCommandPalette } from \"./components/craft-command-palette\";\nexport type { CraftCommandPaletteProps, CraftCommandItem } from \"./components/craft-command-palette\";\n\nexport { CraftLink } from \"./components/craft-link\";\nexport type { CraftLinkProps } from \"./components/craft-link\";\n\nexport { CraftStatCard } from \"./components/craft-stat-card\";\nexport type { CraftStatCardProps } from \"./components/craft-stat-card\";\n\nexport { CraftDatePicker } from \"./components/craft-date-picker\";\nexport type { CraftDatePickerProps } from \"./components/craft-date-picker\";\n\nexport { CraftIcon, CraftIconProvider } from \"./components/craft-icon\";\nexport type {\n CraftIconProps,\n CraftIconProviderProps,\n CraftIconRegistry,\n} from \"./components/craft-icon\";\n\nexport { CraftNumberInput } from \"./components/craft-number-input\";\nexport type { CraftNumberInputProps } from \"./components/craft-number-input\";\n\nexport { CraftCurrencyInput } from \"./components/craft-currency-input\";\nexport type { CraftCurrencyInputProps } from \"./components/craft-currency-input\";\n\nexport { CraftForm } from \"./components/craft-form\";\nexport type { CraftFormProps } from \"./components/craft-form\";\n\nexport { CraftFormModal } from \"./components/craft-form-modal\";\nexport type { CraftFormModalProps, CraftFormModalField } from \"./components/craft-form-modal\";\n\nexport { CraftFormField } from \"./components/craft-form-field\";\nexport type { CraftFormFieldProps, CraftFormFieldOption, CraftFormFieldType } from \"./components/craft-form-field\";\n\nexport { CraftSubmitButton } from \"./components/craft-submit-button\";\nexport type { CraftSubmitButtonProps } from \"./components/craft-submit-button\";\n\nexport { CraftConfirmDialog } from \"./components/craft-confirm-dialog\";\nexport type { CraftConfirmDialogProps } from \"./components/craft-confirm-dialog\";\n\nexport { CraftCreateEditDrawer } from \"./components/craft-create-edit-drawer\";\nexport type { CraftCreateEditDrawerProps } from \"./components/craft-create-edit-drawer\";\n\nexport { CraftFilterBar } from \"./components/craft-filter-bar\";\nexport type { CraftFilterBarProps } from \"./components/craft-filter-bar\";\n\nexport { CraftTableToolbar } from \"./components/craft-table-toolbar\";\nexport type { CraftTableToolbarProps } from \"./components/craft-table-toolbar\";\n\nexport { CraftDataTable } from \"./components/craft-data-table\";\nexport type { CraftDataTableProps, CraftDataTableColumn, CraftDataTableSort } from \"./components/craft-data-table\";\n\nexport { CraftPagination } from \"./components/craft-pagination\";\nexport type { CraftPaginationProps } from \"./components/craft-pagination\";\n\nexport { AppShell } from \"./components/layout/app-shell\";\nexport type { AppShellProps } from \"./components/layout/app-shell\";\n\nexport { AppTemplate } from \"./components/layout/app-template\";\nexport type { AppTemplateProps } from \"./components/layout/app-template\";\n\nexport type {\n LayoutConfig,\n LayoutSidebarItem,\n LayoutBreadcrumbItem,\n LayoutIconName,\n} from \"./components/layout/layout-config\";\nexport { layoutConfigSchema } from \"./components/layout/layout-config\";\n\nexport { Sidebar } from \"./components/layout/sidebar\";\nexport type { SidebarProps, SidebarItem } from \"./components/layout/sidebar\";\n\nexport { TopNav } from \"./components/layout/top-nav\";\nexport type { TopNavProps } from \"./components/layout/top-nav\";\n\nexport { PageHeader } from \"./components/layout/page-header\";\nexport type { PageHeaderProps } from \"./components/layout/page-header\";\n\nexport { Breadcrumbs } from \"./components/layout/breadcrumbs\";\nexport type { BreadcrumbsProps, BreadcrumbItem } from \"./components/layout/breadcrumbs\";\n\nexport { AuthLayout } from \"./components/layout/auth-layout\";\nexport type { AuthLayoutProps } from \"./components/layout/auth-layout\";\n\nexport { Container } from \"./components/layout/container\";\nexport type { ContainerProps } from \"./components/layout/container\";\n\nexport { Grid } from \"./components/layout/grid\";\nexport type { GridProps } from \"./components/layout/grid\";\n\nexport { ThemeSwitcher } from \"./components/theme-switcher\";\nexport type { ThemeSwitcherProps } from \"./components/theme-switcher\";\n\nexport { ThemeProvider, useTheme } from \"./theme/theme-context\";\nexport type { ThemeName, ThemeMode } from \"./theme/theme-context\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA4B;AAG5B,wBAA0B;AAG1B,yBAA2B;AAG3B,4BAA8B;AAG9B,0BAA4B;AAG5B,4BAA8B;AAG9B,0BAA4B;AAG5B,yBAA2B;AAG3B,yBAA2B;AAG3B,+BAAgC;AAGhC,iCAAkC;AAGlC,wBAA0B;AAG1B,yBAA2B;AAG3B,0BAA4B;AAG5B,wBAA0B;AAG1B,2BAA6B;AAG7B,yBAA8C;AAG9C,4BAA8B;AAG9B,+BAAgC;AAGhC,2BAA6B;AAG7B,iCAAkC;AAGlC,mCAAoC;AAGpC,wBAA0B;AAG1B,6BAA8B;AAG9B,+BAAgC;AAGhC,wBAA6C;AAO7C,gCAAiC;AAGjC,kCAAmC;AAGnC,wBAA0B;AAG1B,8BAA+B;AAG/B,8BAA+B;AAG/B,iCAAkC;AAGlC,kCAAmC;AAGnC,sCAAsC;AAGtC,8BAA+B;AAG/B,iCAAkC;AAGlC,8BAA+B;AAG/B,8BAAgC;AAGhC,uBAAyB;AAGzB,0BAA4B;AAS5B,2BAAmC;AAEnC,qBAAwB;AAGxB,qBAAuB;AAGvB,yBAA2B;AAG3B,yBAA4B;AAG5B,yBAA2B;AAG3B,uBAA0B;AAG1B,kBAAqB;AAGrB,4BAA8B;AAG9B,2BAAwC;","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -27,7 +27,7 @@ export { CraftIcon, CraftIconProps, CraftIconProvider, CraftIconProviderProps, C
|
|
|
27
27
|
export { CraftNumberInput, CraftNumberInputProps } from './components/craft-number-input.cjs';
|
|
28
28
|
export { CraftCurrencyInput, CraftCurrencyInputProps } from './components/craft-currency-input.cjs';
|
|
29
29
|
export { CraftForm, CraftFormProps } from './components/craft-form.cjs';
|
|
30
|
-
export {
|
|
30
|
+
export { CraftFormModal, CraftFormModalField, CraftFormModalProps } from './components/craft-form-modal.cjs';
|
|
31
31
|
export { CraftFormField, CraftFormFieldOption, CraftFormFieldProps, CraftFormFieldType } from './components/craft-form-field.cjs';
|
|
32
32
|
export { CraftSubmitButton, CraftSubmitButtonProps } from './components/craft-submit-button.cjs';
|
|
33
33
|
export { CraftConfirmDialog, CraftConfirmDialogProps } from './components/craft-confirm-dialog.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export { CraftIcon, CraftIconProps, CraftIconProvider, CraftIconProviderProps, C
|
|
|
27
27
|
export { CraftNumberInput, CraftNumberInputProps } from './components/craft-number-input.js';
|
|
28
28
|
export { CraftCurrencyInput, CraftCurrencyInputProps } from './components/craft-currency-input.js';
|
|
29
29
|
export { CraftForm, CraftFormProps } from './components/craft-form.js';
|
|
30
|
-
export {
|
|
30
|
+
export { CraftFormModal, CraftFormModalField, CraftFormModalProps } from './components/craft-form-modal.js';
|
|
31
31
|
export { CraftFormField, CraftFormFieldOption, CraftFormFieldProps, CraftFormFieldType } from './components/craft-form-field.js';
|
|
32
32
|
export { CraftSubmitButton, CraftSubmitButtonProps } from './components/craft-submit-button.js';
|
|
33
33
|
export { CraftConfirmDialog, CraftConfirmDialogProps } from './components/craft-confirm-dialog.js';
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,7 @@ import { CraftIcon, CraftIconProvider } from "./components/craft-icon";
|
|
|
27
27
|
import { CraftNumberInput } from "./components/craft-number-input";
|
|
28
28
|
import { CraftCurrencyInput } from "./components/craft-currency-input";
|
|
29
29
|
import { CraftForm } from "./components/craft-form";
|
|
30
|
-
import {
|
|
30
|
+
import { CraftFormModal } from "./components/craft-form-modal";
|
|
31
31
|
import { CraftFormField } from "./components/craft-form-field";
|
|
32
32
|
import { CraftSubmitButton } from "./components/craft-submit-button";
|
|
33
33
|
import { CraftConfirmDialog } from "./components/craft-confirm-dialog";
|
|
@@ -71,8 +71,8 @@ export {
|
|
|
71
71
|
CraftErrorState,
|
|
72
72
|
CraftFilterBar,
|
|
73
73
|
CraftForm,
|
|
74
|
-
CraftFormBuilder,
|
|
75
74
|
CraftFormField,
|
|
75
|
+
CraftFormModal,
|
|
76
76
|
CraftIcon,
|
|
77
77
|
CraftIconProvider,
|
|
78
78
|
CraftInput,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { CraftButton } from \"./components/craft-button\";\nexport type { CraftButtonProps } from \"./components/craft-button\";\n\nexport { GlassCard } from \"./components/glass-card\";\nexport type { GlassCardProps } from \"./components/glass-card\";\n\nexport { CraftInput } from \"./components/craft-input\";\nexport type { CraftInputProps } from \"./components/craft-input\";\n\nexport { CraftTextarea } from \"./components/craft-textarea\";\nexport type { CraftTextareaProps } from \"./components/craft-textarea\";\n\nexport { CraftSelect } from \"./components/craft-select\";\nexport type { CraftSelectProps } from \"./components/craft-select\";\n\nexport { CraftCheckbox } from \"./components/craft-checkbox\";\nexport type { CraftCheckboxProps } from \"./components/craft-checkbox\";\n\nexport { CraftSwitch } from \"./components/craft-switch\";\nexport type { CraftSwitchProps } from \"./components/craft-switch\";\n\nexport { CraftBadge } from \"./components/craft-badge\";\nexport type { CraftBadgeProps } from \"./components/craft-badge\";\n\nexport { CraftAlert } from \"./components/craft-alert\";\nexport type { CraftAlertProps } from \"./components/craft-alert\";\n\nexport { CraftErrorState } from \"./components/craft-error-state\";\nexport type { CraftErrorStateProps } from \"./components/craft-error-state\";\n\nexport { CraftLoadingState } from \"./components/craft-loading-state\";\nexport type { CraftLoadingStateProps } from \"./components/craft-loading-state\";\n\nexport { CraftCard } from \"./components/craft-card\";\nexport type { CraftCardProps } from \"./components/craft-card\";\n\nexport { CraftModal } from \"./components/craft-modal\";\nexport type { CraftModalProps } from \"./components/craft-modal\";\n\nexport { CraftDrawer } from \"./components/craft-drawer\";\nexport type { CraftDrawerProps } from \"./components/craft-drawer\";\n\nexport { CraftTabs } from \"./components/craft-tabs\";\nexport type { CraftTabsProps } from \"./components/craft-tabs\";\n\nexport { CraftTooltip } from \"./components/craft-tooltip\";\nexport type { CraftTooltipProps } from \"./components/craft-tooltip\";\n\nexport { CraftToastHost, useCraftToast } from \"./components/craft-toast\";\nexport type { CraftToast, CraftToastHostProps } from \"./components/craft-toast\";\n\nexport { CraftSkeleton } from \"./components/craft-skeleton\";\nexport type { CraftSkeletonProps } from \"./components/craft-skeleton\";\n\nexport { CraftEmptyState } from \"./components/craft-empty-state\";\nexport type { CraftEmptyStateProps } from \"./components/craft-empty-state\";\n\nexport { CraftPopover } from \"./components/craft-popover\";\nexport type { CraftPopoverProps } from \"./components/craft-popover\";\n\nexport { CraftDropdownMenu } from \"./components/craft-dropdown-menu\";\nexport type { CraftDropdownMenuProps, CraftDropdownItem } from \"./components/craft-dropdown-menu\";\n\nexport { CraftCommandPalette } from \"./components/craft-command-palette\";\nexport type { CraftCommandPaletteProps, CraftCommandItem } from \"./components/craft-command-palette\";\n\nexport { CraftLink } from \"./components/craft-link\";\nexport type { CraftLinkProps } from \"./components/craft-link\";\n\nexport { CraftStatCard } from \"./components/craft-stat-card\";\nexport type { CraftStatCardProps } from \"./components/craft-stat-card\";\n\nexport { CraftDatePicker } from \"./components/craft-date-picker\";\nexport type { CraftDatePickerProps } from \"./components/craft-date-picker\";\n\nexport { CraftIcon, CraftIconProvider } from \"./components/craft-icon\";\nexport type {\n CraftIconProps,\n CraftIconProviderProps,\n CraftIconRegistry,\n} from \"./components/craft-icon\";\n\nexport { CraftNumberInput } from \"./components/craft-number-input\";\nexport type { CraftNumberInputProps } from \"./components/craft-number-input\";\n\nexport { CraftCurrencyInput } from \"./components/craft-currency-input\";\nexport type { CraftCurrencyInputProps } from \"./components/craft-currency-input\";\n\nexport { CraftForm } from \"./components/craft-form\";\nexport type { CraftFormProps } from \"./components/craft-form\";\n\nexport {
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { CraftButton } from \"./components/craft-button\";\nexport type { CraftButtonProps } from \"./components/craft-button\";\n\nexport { GlassCard } from \"./components/glass-card\";\nexport type { GlassCardProps } from \"./components/glass-card\";\n\nexport { CraftInput } from \"./components/craft-input\";\nexport type { CraftInputProps } from \"./components/craft-input\";\n\nexport { CraftTextarea } from \"./components/craft-textarea\";\nexport type { CraftTextareaProps } from \"./components/craft-textarea\";\n\nexport { CraftSelect } from \"./components/craft-select\";\nexport type { CraftSelectProps } from \"./components/craft-select\";\n\nexport { CraftCheckbox } from \"./components/craft-checkbox\";\nexport type { CraftCheckboxProps } from \"./components/craft-checkbox\";\n\nexport { CraftSwitch } from \"./components/craft-switch\";\nexport type { CraftSwitchProps } from \"./components/craft-switch\";\n\nexport { CraftBadge } from \"./components/craft-badge\";\nexport type { CraftBadgeProps } from \"./components/craft-badge\";\n\nexport { CraftAlert } from \"./components/craft-alert\";\nexport type { CraftAlertProps } from \"./components/craft-alert\";\n\nexport { CraftErrorState } from \"./components/craft-error-state\";\nexport type { CraftErrorStateProps } from \"./components/craft-error-state\";\n\nexport { CraftLoadingState } from \"./components/craft-loading-state\";\nexport type { CraftLoadingStateProps } from \"./components/craft-loading-state\";\n\nexport { CraftCard } from \"./components/craft-card\";\nexport type { CraftCardProps } from \"./components/craft-card\";\n\nexport { CraftModal } from \"./components/craft-modal\";\nexport type { CraftModalProps } from \"./components/craft-modal\";\n\nexport { CraftDrawer } from \"./components/craft-drawer\";\nexport type { CraftDrawerProps } from \"./components/craft-drawer\";\n\nexport { CraftTabs } from \"./components/craft-tabs\";\nexport type { CraftTabsProps } from \"./components/craft-tabs\";\n\nexport { CraftTooltip } from \"./components/craft-tooltip\";\nexport type { CraftTooltipProps } from \"./components/craft-tooltip\";\n\nexport { CraftToastHost, useCraftToast } from \"./components/craft-toast\";\nexport type { CraftToast, CraftToastHostProps } from \"./components/craft-toast\";\n\nexport { CraftSkeleton } from \"./components/craft-skeleton\";\nexport type { CraftSkeletonProps } from \"./components/craft-skeleton\";\n\nexport { CraftEmptyState } from \"./components/craft-empty-state\";\nexport type { CraftEmptyStateProps } from \"./components/craft-empty-state\";\n\nexport { CraftPopover } from \"./components/craft-popover\";\nexport type { CraftPopoverProps } from \"./components/craft-popover\";\n\nexport { CraftDropdownMenu } from \"./components/craft-dropdown-menu\";\nexport type { CraftDropdownMenuProps, CraftDropdownItem } from \"./components/craft-dropdown-menu\";\n\nexport { CraftCommandPalette } from \"./components/craft-command-palette\";\nexport type { CraftCommandPaletteProps, CraftCommandItem } from \"./components/craft-command-palette\";\n\nexport { CraftLink } from \"./components/craft-link\";\nexport type { CraftLinkProps } from \"./components/craft-link\";\n\nexport { CraftStatCard } from \"./components/craft-stat-card\";\nexport type { CraftStatCardProps } from \"./components/craft-stat-card\";\n\nexport { CraftDatePicker } from \"./components/craft-date-picker\";\nexport type { CraftDatePickerProps } from \"./components/craft-date-picker\";\n\nexport { CraftIcon, CraftIconProvider } from \"./components/craft-icon\";\nexport type {\n CraftIconProps,\n CraftIconProviderProps,\n CraftIconRegistry,\n} from \"./components/craft-icon\";\n\nexport { CraftNumberInput } from \"./components/craft-number-input\";\nexport type { CraftNumberInputProps } from \"./components/craft-number-input\";\n\nexport { CraftCurrencyInput } from \"./components/craft-currency-input\";\nexport type { CraftCurrencyInputProps } from \"./components/craft-currency-input\";\n\nexport { CraftForm } from \"./components/craft-form\";\nexport type { CraftFormProps } from \"./components/craft-form\";\n\nexport { CraftFormModal } from \"./components/craft-form-modal\";\nexport type { CraftFormModalProps, CraftFormModalField } from \"./components/craft-form-modal\";\n\nexport { CraftFormField } from \"./components/craft-form-field\";\nexport type { CraftFormFieldProps, CraftFormFieldOption, CraftFormFieldType } from \"./components/craft-form-field\";\n\nexport { CraftSubmitButton } from \"./components/craft-submit-button\";\nexport type { CraftSubmitButtonProps } from \"./components/craft-submit-button\";\n\nexport { CraftConfirmDialog } from \"./components/craft-confirm-dialog\";\nexport type { CraftConfirmDialogProps } from \"./components/craft-confirm-dialog\";\n\nexport { CraftCreateEditDrawer } from \"./components/craft-create-edit-drawer\";\nexport type { CraftCreateEditDrawerProps } from \"./components/craft-create-edit-drawer\";\n\nexport { CraftFilterBar } from \"./components/craft-filter-bar\";\nexport type { CraftFilterBarProps } from \"./components/craft-filter-bar\";\n\nexport { CraftTableToolbar } from \"./components/craft-table-toolbar\";\nexport type { CraftTableToolbarProps } from \"./components/craft-table-toolbar\";\n\nexport { CraftDataTable } from \"./components/craft-data-table\";\nexport type { CraftDataTableProps, CraftDataTableColumn, CraftDataTableSort } from \"./components/craft-data-table\";\n\nexport { CraftPagination } from \"./components/craft-pagination\";\nexport type { CraftPaginationProps } from \"./components/craft-pagination\";\n\nexport { AppShell } from \"./components/layout/app-shell\";\nexport type { AppShellProps } from \"./components/layout/app-shell\";\n\nexport { AppTemplate } from \"./components/layout/app-template\";\nexport type { AppTemplateProps } from \"./components/layout/app-template\";\n\nexport type {\n LayoutConfig,\n LayoutSidebarItem,\n LayoutBreadcrumbItem,\n LayoutIconName,\n} from \"./components/layout/layout-config\";\nexport { layoutConfigSchema } from \"./components/layout/layout-config\";\n\nexport { Sidebar } from \"./components/layout/sidebar\";\nexport type { SidebarProps, SidebarItem } from \"./components/layout/sidebar\";\n\nexport { TopNav } from \"./components/layout/top-nav\";\nexport type { TopNavProps } from \"./components/layout/top-nav\";\n\nexport { PageHeader } from \"./components/layout/page-header\";\nexport type { PageHeaderProps } from \"./components/layout/page-header\";\n\nexport { Breadcrumbs } from \"./components/layout/breadcrumbs\";\nexport type { BreadcrumbsProps, BreadcrumbItem } from \"./components/layout/breadcrumbs\";\n\nexport { AuthLayout } from \"./components/layout/auth-layout\";\nexport type { AuthLayoutProps } from \"./components/layout/auth-layout\";\n\nexport { Container } from \"./components/layout/container\";\nexport type { ContainerProps } from \"./components/layout/container\";\n\nexport { Grid } from \"./components/layout/grid\";\nexport type { GridProps } from \"./components/layout/grid\";\n\nexport { ThemeSwitcher } from \"./components/theme-switcher\";\nexport type { ThemeSwitcherProps } from \"./components/theme-switcher\";\n\nexport { ThemeProvider, useTheme } from \"./theme/theme-context\";\nexport type { ThemeName, ThemeMode } from \"./theme/theme-context\";\n"],"mappings":"AAAA,SAAS,mBAAmB;AAG5B,SAAS,iBAAiB;AAG1B,SAAS,kBAAkB;AAG3B,SAAS,qBAAqB;AAG9B,SAAS,mBAAmB;AAG5B,SAAS,qBAAqB;AAG9B,SAAS,mBAAmB;AAG5B,SAAS,kBAAkB;AAG3B,SAAS,kBAAkB;AAG3B,SAAS,uBAAuB;AAGhC,SAAS,yBAAyB;AAGlC,SAAS,iBAAiB;AAG1B,SAAS,kBAAkB;AAG3B,SAAS,mBAAmB;AAG5B,SAAS,iBAAiB;AAG1B,SAAS,oBAAoB;AAG7B,SAAS,gBAAgB,qBAAqB;AAG9C,SAAS,qBAAqB;AAG9B,SAAS,uBAAuB;AAGhC,SAAS,oBAAoB;AAG7B,SAAS,yBAAyB;AAGlC,SAAS,2BAA2B;AAGpC,SAAS,iBAAiB;AAG1B,SAAS,qBAAqB;AAG9B,SAAS,uBAAuB;AAGhC,SAAS,WAAW,yBAAyB;AAO7C,SAAS,wBAAwB;AAGjC,SAAS,0BAA0B;AAGnC,SAAS,iBAAiB;AAG1B,SAAS,sBAAsB;AAG/B,SAAS,sBAAsB;AAG/B,SAAS,yBAAyB;AAGlC,SAAS,0BAA0B;AAGnC,SAAS,6BAA6B;AAGtC,SAAS,sBAAsB;AAG/B,SAAS,yBAAyB;AAGlC,SAAS,sBAAsB;AAG/B,SAAS,uBAAuB;AAGhC,SAAS,gBAAgB;AAGzB,SAAS,mBAAmB;AAS5B,SAAS,0BAA0B;AAEnC,SAAS,eAAe;AAGxB,SAAS,cAAc;AAGvB,SAAS,kBAAkB;AAG3B,SAAS,mBAAmB;AAG5B,SAAS,kBAAkB;AAG3B,SAAS,iBAAiB;AAG1B,SAAS,YAAY;AAGrB,SAAS,qBAAqB;AAG9B,SAAS,eAAe,gBAAgB;","names":[]}
|
package/dist/styles.css
CHANGED
|
@@ -238,9 +238,6 @@
|
|
|
238
238
|
.top-0 {
|
|
239
239
|
top: calc(var(--spacing) * 0);
|
|
240
240
|
}
|
|
241
|
-
.top-0\.5 {
|
|
242
|
-
top: calc(var(--spacing) * 0.5);
|
|
243
|
-
}
|
|
244
241
|
.top-1\/2 {
|
|
245
242
|
top: calc(1/2 * 100%);
|
|
246
243
|
}
|
|
@@ -271,9 +268,6 @@
|
|
|
271
268
|
.left-0 {
|
|
272
269
|
left: calc(var(--spacing) * 0);
|
|
273
270
|
}
|
|
274
|
-
.left-0\.5 {
|
|
275
|
-
left: calc(var(--spacing) * 0.5);
|
|
276
|
-
}
|
|
277
271
|
.left-1\/2 {
|
|
278
272
|
left: calc(1/2 * 100%);
|
|
279
273
|
}
|
|
@@ -826,9 +820,6 @@
|
|
|
826
820
|
.bg-\[rgb\(var\(--nc-surface\)\/1\.52\)\] {
|
|
827
821
|
background-color: rgb(var(--nc-surface)/1.52);
|
|
828
822
|
}
|
|
829
|
-
.bg-\[rgb\(var\(--nc-surface-muted\)\/0\.9\)\] {
|
|
830
|
-
background-color: rgb(var(--nc-surface-muted)/0.9);
|
|
831
|
-
}
|
|
832
823
|
.bg-background {
|
|
833
824
|
background-color: var(--background);
|
|
834
825
|
}
|
|
@@ -1280,12 +1271,6 @@
|
|
|
1280
1271
|
--tw-outline-style: none;
|
|
1281
1272
|
outline-style: none;
|
|
1282
1273
|
}
|
|
1283
|
-
.peer-checked\:translate-x-5 {
|
|
1284
|
-
&:is(:where(.peer):checked ~ *) {
|
|
1285
|
-
--tw-translate-x: calc(var(--spacing) * 5);
|
|
1286
|
-
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
1287
|
-
}
|
|
1288
|
-
}
|
|
1289
1274
|
.peer-checked\:border-\[rgb\(var\(--nc-accent-1\)\)\] {
|
|
1290
1275
|
&:is(:where(.peer):checked ~ *) {
|
|
1291
1276
|
border-color: rgb(var(--nc-accent-1));
|
|
@@ -1301,11 +1286,6 @@
|
|
|
1301
1286
|
background-color: rgb(var(--nc-accent-1)/0.25);
|
|
1302
1287
|
}
|
|
1303
1288
|
}
|
|
1304
|
-
.peer-checked\:bg-\[rgb\(var\(--nc-surface-muted\)\)\] {
|
|
1305
|
-
&:is(:where(.peer):checked ~ *) {
|
|
1306
|
-
background-color: rgb(var(--nc-surface-muted));
|
|
1307
|
-
}
|
|
1308
|
-
}
|
|
1309
1289
|
.peer-checked\:opacity-100 {
|
|
1310
1290
|
&:is(:where(.peer):checked ~ *) {
|
|
1311
1291
|
opacity: 100%;
|
|
@@ -1393,18 +1373,54 @@
|
|
|
1393
1373
|
inset: calc(var(--spacing) * 0);
|
|
1394
1374
|
}
|
|
1395
1375
|
}
|
|
1376
|
+
.before\:top-0\.5 {
|
|
1377
|
+
&::before {
|
|
1378
|
+
content: var(--tw-content);
|
|
1379
|
+
top: calc(var(--spacing) * 0.5);
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
.before\:left-0\.5 {
|
|
1383
|
+
&::before {
|
|
1384
|
+
content: var(--tw-content);
|
|
1385
|
+
left: calc(var(--spacing) * 0.5);
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1396
1388
|
.before\:-z-10 {
|
|
1397
1389
|
&::before {
|
|
1398
1390
|
content: var(--tw-content);
|
|
1399
1391
|
z-index: calc(10 * -1);
|
|
1400
1392
|
}
|
|
1401
1393
|
}
|
|
1394
|
+
.before\:h-4 {
|
|
1395
|
+
&::before {
|
|
1396
|
+
content: var(--tw-content);
|
|
1397
|
+
height: calc(var(--spacing) * 4);
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
.before\:w-4 {
|
|
1401
|
+
&::before {
|
|
1402
|
+
content: var(--tw-content);
|
|
1403
|
+
width: calc(var(--spacing) * 4);
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
.before\:rounded-full {
|
|
1407
|
+
&::before {
|
|
1408
|
+
content: var(--tw-content);
|
|
1409
|
+
border-radius: calc(infinity * 1px);
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1402
1412
|
.before\:rounded-xl {
|
|
1403
1413
|
&::before {
|
|
1404
1414
|
content: var(--tw-content);
|
|
1405
1415
|
border-radius: var(--radius-xl);
|
|
1406
1416
|
}
|
|
1407
1417
|
}
|
|
1418
|
+
.before\:bg-\[rgb\(var\(--nc-fg\)\/0\.92\)\] {
|
|
1419
|
+
&::before {
|
|
1420
|
+
content: var(--tw-content);
|
|
1421
|
+
background-color: rgb(var(--nc-fg)/0.92);
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1408
1424
|
.before\:bg-linear-to-br {
|
|
1409
1425
|
&::before {
|
|
1410
1426
|
content: var(--tw-content);
|
|
@@ -1470,6 +1486,13 @@
|
|
|
1470
1486
|
opacity: 0%;
|
|
1471
1487
|
}
|
|
1472
1488
|
}
|
|
1489
|
+
.before\:shadow-\[0_1px_2px_rgba\(0\,0\,0\,0\.4\)\] {
|
|
1490
|
+
&::before {
|
|
1491
|
+
content: var(--tw-content);
|
|
1492
|
+
--tw-shadow: 0 1px 2px var(--tw-shadow-color, rgba(0,0,0,0.4));
|
|
1493
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1473
1496
|
.before\:blur-xl {
|
|
1474
1497
|
&::before {
|
|
1475
1498
|
content: var(--tw-content);
|
|
@@ -1477,6 +1500,14 @@
|
|
|
1477
1500
|
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
1478
1501
|
}
|
|
1479
1502
|
}
|
|
1503
|
+
.before\:transition-all {
|
|
1504
|
+
&::before {
|
|
1505
|
+
content: var(--tw-content);
|
|
1506
|
+
transition-property: all;
|
|
1507
|
+
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
|
|
1508
|
+
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
|
1509
|
+
}
|
|
1510
|
+
}
|
|
1480
1511
|
.before\:transition-opacity {
|
|
1481
1512
|
&::before {
|
|
1482
1513
|
content: var(--tw-content);
|
|
@@ -1485,6 +1516,13 @@
|
|
|
1485
1516
|
transition-duration: var(--tw-duration, var(--default-transition-duration));
|
|
1486
1517
|
}
|
|
1487
1518
|
}
|
|
1519
|
+
.before\:duration-200 {
|
|
1520
|
+
&::before {
|
|
1521
|
+
content: var(--tw-content);
|
|
1522
|
+
--tw-duration: 200ms;
|
|
1523
|
+
transition-duration: 200ms;
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1488
1526
|
.before\:duration-300 {
|
|
1489
1527
|
&::before {
|
|
1490
1528
|
content: var(--tw-content);
|
|
@@ -1492,6 +1530,29 @@
|
|
|
1492
1530
|
transition-duration: 300ms;
|
|
1493
1531
|
}
|
|
1494
1532
|
}
|
|
1533
|
+
.before\:content-\[\'\'\] {
|
|
1534
|
+
&::before {
|
|
1535
|
+
--tw-content: '';
|
|
1536
|
+
content: var(--tw-content);
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
.peer-checked\:before\:translate-x-5 {
|
|
1540
|
+
&:is(:where(.peer):checked ~ *) {
|
|
1541
|
+
&::before {
|
|
1542
|
+
content: var(--tw-content);
|
|
1543
|
+
--tw-translate-x: calc(var(--spacing) * 5);
|
|
1544
|
+
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
.peer-checked\:before\:bg-\[rgb\(var\(--nc-fg\)\)\] {
|
|
1549
|
+
&:is(:where(.peer):checked ~ *) {
|
|
1550
|
+
&::before {
|
|
1551
|
+
content: var(--tw-content);
|
|
1552
|
+
background-color: rgb(var(--nc-fg));
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1495
1556
|
.after\:absolute {
|
|
1496
1557
|
&::after {
|
|
1497
1558
|
content: var(--tw-content);
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-form-builder.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n FormProvider,\n type DefaultValues,\n type FieldValues,\n type Path,\n type RegisterOptions,\n useForm,\n} from \"react-hook-form\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftSubmitButton } from \"@/components/craft-submit-button\";\nimport {\n CraftFormField,\n type CraftFormFieldOption,\n type CraftFormFieldType,\n} from \"@/components/craft-form-field\";\n\nexport type CraftFormBuilderField<TValues extends FieldValues> = {\n name: Path<TValues>;\n label?: React.ReactNode;\n description?: React.ReactNode;\n type: CraftFormFieldType;\n placeholder?: string;\n options?: CraftFormFieldOption[];\n required?: boolean;\n disabled?: boolean;\n rules?: RegisterOptions<TValues>;\n defaultValue?: unknown;\n min?: number;\n max?: number;\n step?: number;\n rows?: number;\n accept?: string;\n minFiles?: number;\n maxFiles?: number;\n helpText?: React.ReactNode;\n fieldProps?: Record<string, unknown>;\n validate?: (value: unknown, values: TValues) => string | boolean | undefined;\n};\n\nexport type CraftFormBuilderProps<TValues extends FieldValues> = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n fields: Array<CraftFormBuilderField<TValues>>;\n initialData?: Partial<TValues> | null;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: React.ReactNode;\n submitLabel?: React.ReactNode;\n cancelLabel?: React.ReactNode;\n resetLabel?: React.ReactNode;\n showReset?: boolean;\n showCancel?: boolean;\n tone?: ThemeName;\n className?: string;\n formClassName?: string;\n loading?: boolean;\n disableSubmitWhenInvalid?: boolean;\n closeOnSubmit?: boolean;\n closeOnCancel?: boolean;\n onSubmit: (values: TValues) => void | Promise<void>;\n onReset?: () => void;\n onCancel?: () => void;\n customValidation?: (values: TValues) => Partial<Record<Path<TValues>, string>>;\n};\n\nfunction defaultValueForField<TValues extends FieldValues>(\n field: CraftFormBuilderField<TValues>\n) {\n if (field.defaultValue !== undefined) return field.defaultValue;\n switch (field.type) {\n case \"checkbox\":\n case \"switch\":\n return false;\n case \"number\":\n case \"slider\":\n case \"range\":\n return field.min ?? 0;\n case \"multifile\":\n return [];\n case \"file\":\n return null;\n case \"multiselect\":\n return [];\n case \"radio\":\n return field.options?.[0]?.value ?? \"\";\n default:\n return \"\";\n }\n}\n\nfunction buildDefaultValues<TValues extends FieldValues>(\n fields: Array<CraftFormBuilderField<TValues>>,\n initialData?: Partial<TValues> | null\n): DefaultValues<TValues> {\n const values = {} as Record<string, unknown>;\n fields.forEach((field) => {\n const initialValue = initialData?.[field.name as keyof TValues];\n if (initialValue !== undefined && initialValue !== null) {\n values[field.name] = initialValue;\n } else {\n values[field.name] = defaultValueForField(field);\n }\n });\n return values as DefaultValues<TValues>;\n}\n\nfunction buildRules<TValues extends FieldValues>(\n field: CraftFormBuilderField<TValues>,\n getValues: () => TValues\n): RegisterOptions<TValues> {\n const rules: RegisterOptions<TValues> = { ...field.rules };\n const mergeValidate = (\n current: RegisterOptions<TValues>[\"validate\"],\n next: (value: unknown) => string | boolean | undefined\n ) => {\n if (!current) return next;\n if (typeof current === \"function\") {\n return (value: unknown): string | boolean | undefined => {\n const result = (current as (value: unknown, values: TValues) => string | boolean | undefined)(\n value,\n getValues()\n );\n if (result !== true) return result as string | undefined;\n return next(value);\n };\n }\n if (typeof current === \"object\") {\n return (value: unknown): string | boolean | undefined => {\n const entries = Object.entries(current);\n for (const [, validator] of entries) {\n const result = (validator as (value: unknown, values: TValues) => string | boolean | undefined)(\n value,\n getValues()\n );\n if (result !== true) return result as string | undefined;\n }\n return next(value);\n };\n }\n return next;\n };\n\n if (field.required && field.type !== \"hidden\") {\n if (field.type === \"checkbox\" || field.type === \"switch\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n value ? true : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"multiselect\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n Array.isArray(value) && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"file\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n value instanceof FileList && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"multifile\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n Array.isArray(value) && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else {\n rules.required = `${String(field.label ?? field.name)} is required`;\n }\n }\n\n if (field.min !== undefined) {\n rules.min = { value: field.min, message: `Min ${field.min}` };\n }\n if (field.max !== undefined) {\n rules.max = { value: field.max, message: `Max ${field.max}` };\n }\n\n if (field.type === \"email\") {\n rules.pattern = {\n value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Please enter a valid email address\",\n };\n }\n\n if (field.type === \"url\") {\n rules.pattern = {\n value: /^https?:\\/\\/.+/,\n message: \"Please enter a valid URL\",\n };\n }\n\n if (field.validate) {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n field.validate?.(value, getValues())\n );\n }\n\n return rules;\n}\n\nexport function CraftFormBuilder<TValues extends FieldValues>({\n title = \"Form\",\n description,\n fields,\n initialData = null,\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n submitLabel = \"Submit\",\n cancelLabel = \"Cancel\",\n resetLabel = \"Reset\",\n showReset = true,\n showCancel = true,\n tone,\n className,\n formClassName,\n loading = false,\n disableSubmitWhenInvalid = true,\n closeOnSubmit = true,\n closeOnCancel = true,\n onSubmit,\n onReset,\n onCancel,\n customValidation,\n}: CraftFormBuilderProps<TValues>) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const isControlled = typeof open === \"boolean\";\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const defaultValues = React.useMemo(\n () => buildDefaultValues(fields, initialData),\n [fields, initialData]\n );\n\n const form = useForm<TValues>({\n mode: \"onChange\",\n defaultValues,\n });\n\n const formId = React.useId();\n\n React.useEffect(() => {\n form.reset(defaultValues);\n }, [defaultValues, form]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (customValidation) {\n const customErrors = customValidation(values);\n if (customErrors && Object.keys(customErrors).length > 0) {\n Object.entries(customErrors).forEach(([key, message]) => {\n if (message) {\n form.setError(key as Path<TValues>, {\n type: \"custom\",\n message: String(message),\n });\n }\n });\n return;\n }\n }\n\n await onSubmit(values);\n if (closeOnSubmit) setOpen(false);\n });\n\n const handleReset = () => {\n form.reset(defaultValues);\n onReset?.();\n };\n\n const handleCancel = () => {\n onCancel?.();\n if (closeOnCancel) setOpen(false);\n };\n\n return (\n <FormProvider {...form}>\n <CraftModal\n open={isOpen}\n onOpenChange={setOpen}\n trigger={trigger}\n title={title}\n description={description}\n tone={tone}\n className={className}\n footer={\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {showReset && (\n <CraftButton\n type=\"button\"\n variant=\"outline\"\n onClick={handleReset}\n disabled={loading}\n >\n {resetLabel}\n </CraftButton>\n )}\n {showCancel && (\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n onClick={handleCancel}\n disabled={loading}\n >\n {cancelLabel}\n </CraftButton>\n )}\n <CraftSubmitButton\n loading={loading}\n disableWhenInvalid={disableSubmitWhenInvalid}\n form={formId}\n >\n {submitLabel}\n </CraftSubmitButton>\n </div>\n }\n >\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={cn(\"space-y-5\", formClassName)}\n >\n {fields.map((field) => (\n <div key={field.name} className=\"space-y-2\">\n {field.helpText && (\n <p className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {field.helpText}\n </p>\n )}\n <CraftFormField\n name={field.name}\n label={field.label}\n description={field.description}\n type={field.type}\n placeholder={field.placeholder}\n options={field.options}\n tone={tone}\n disabled={field.disabled || loading}\n rules={buildRules(field, form.getValues)}\n fieldProps={{\n min: field.min,\n max: field.max,\n step: field.step,\n rows: field.rows,\n accept: field.accept,\n multiple: field.type === \"multifile\",\n ...field.fieldProps,\n }}\n />\n </div>\n ))}\n </form>\n </CraftModal>\n </FormProvider>\n );\n}"],"mappings":"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","names":["_a"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-form-builder.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n FormProvider,\n type DefaultValues,\n type FieldValues,\n type Path,\n type RegisterOptions,\n useForm,\n} from \"react-hook-form\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftSubmitButton } from \"@/components/craft-submit-button\";\nimport {\n CraftFormField,\n type CraftFormFieldOption,\n type CraftFormFieldType,\n} from \"@/components/craft-form-field\";\n\nexport type CraftFormBuilderField<TValues extends FieldValues> = {\n name: Path<TValues>;\n label?: React.ReactNode;\n description?: React.ReactNode;\n type: CraftFormFieldType;\n placeholder?: string;\n options?: CraftFormFieldOption[];\n required?: boolean;\n disabled?: boolean;\n rules?: RegisterOptions<TValues>;\n defaultValue?: unknown;\n min?: number;\n max?: number;\n step?: number;\n rows?: number;\n accept?: string;\n minFiles?: number;\n maxFiles?: number;\n helpText?: React.ReactNode;\n fieldProps?: Record<string, unknown>;\n validate?: (value: unknown, values: TValues) => string | boolean | undefined;\n};\n\nexport type CraftFormBuilderProps<TValues extends FieldValues> = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n fields: Array<CraftFormBuilderField<TValues>>;\n initialData?: Partial<TValues> | null;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: React.ReactNode;\n submitLabel?: React.ReactNode;\n cancelLabel?: React.ReactNode;\n resetLabel?: React.ReactNode;\n showReset?: boolean;\n showCancel?: boolean;\n tone?: ThemeName;\n className?: string;\n formClassName?: string;\n loading?: boolean;\n disableSubmitWhenInvalid?: boolean;\n closeOnSubmit?: boolean;\n closeOnCancel?: boolean;\n onSubmit: (values: TValues) => void | Promise<void>;\n onReset?: () => void;\n onCancel?: () => void;\n customValidation?: (values: TValues) => Partial<Record<Path<TValues>, string>>;\n};\n\nfunction defaultValueForField<TValues extends FieldValues>(\n field: CraftFormBuilderField<TValues>\n) {\n if (field.defaultValue !== undefined) return field.defaultValue;\n switch (field.type) {\n case \"checkbox\":\n case \"switch\":\n return false;\n case \"number\":\n case \"slider\":\n case \"range\":\n return field.min ?? 0;\n case \"multifile\":\n return [];\n case \"file\":\n return null;\n case \"multiselect\":\n return [];\n case \"radio\":\n return field.options?.[0]?.value ?? \"\";\n default:\n return \"\";\n }\n}\n\nfunction buildDefaultValues<TValues extends FieldValues>(\n fields: Array<CraftFormBuilderField<TValues>>,\n initialData?: Partial<TValues> | null\n): DefaultValues<TValues> {\n const values = {} as Record<string, unknown>;\n fields.forEach((field) => {\n const initialValue = initialData?.[field.name as keyof TValues];\n if (initialValue !== undefined && initialValue !== null) {\n values[field.name] = initialValue;\n } else {\n values[field.name] = defaultValueForField(field);\n }\n });\n return values as DefaultValues<TValues>;\n}\n\nfunction buildRules<TValues extends FieldValues>(\n field: CraftFormBuilderField<TValues>,\n getValues: () => TValues\n): RegisterOptions<TValues> {\n const rules: RegisterOptions<TValues> = { ...field.rules };\n const mergeValidate = (\n current: RegisterOptions<TValues>[\"validate\"],\n next: (value: unknown) => string | boolean | undefined\n ) => {\n if (!current) return next;\n if (typeof current === \"function\") {\n return (value: unknown): string | boolean | undefined => {\n const result = (current as (value: unknown, values: TValues) => string | boolean | undefined)(\n value,\n getValues()\n );\n if (result !== true) return result as string | undefined;\n return next(value);\n };\n }\n if (typeof current === \"object\") {\n return (value: unknown): string | boolean | undefined => {\n const entries = Object.entries(current);\n for (const [, validator] of entries) {\n const result = (validator as (value: unknown, values: TValues) => string | boolean | undefined)(\n value,\n getValues()\n );\n if (result !== true) return result as string | undefined;\n }\n return next(value);\n };\n }\n return next;\n };\n\n if (field.required && field.type !== \"hidden\") {\n if (field.type === \"checkbox\" || field.type === \"switch\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n value ? true : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"multiselect\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n Array.isArray(value) && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"file\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n value instanceof FileList && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else if (field.type === \"multifile\") {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n Array.isArray(value) && value.length > 0\n ? true\n : `${String(field.label ?? field.name)} is required`\n );\n } else {\n rules.required = `${String(field.label ?? field.name)} is required`;\n }\n }\n\n if (field.min !== undefined) {\n rules.min = { value: field.min, message: `Min ${field.min}` };\n }\n if (field.max !== undefined) {\n rules.max = { value: field.max, message: `Max ${field.max}` };\n }\n\n if (field.type === \"email\") {\n rules.pattern = {\n value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n message: \"Please enter a valid email address\",\n };\n }\n\n if (field.type === \"url\") {\n rules.pattern = {\n value: /^https?:\\/\\/.+/,\n message: \"Please enter a valid URL\",\n };\n }\n\n if (field.validate) {\n rules.validate = mergeValidate(\n rules.validate,\n (value: unknown): string | boolean | undefined =>\n field.validate?.(value, getValues())\n );\n }\n\n return rules;\n}\n\nexport function CraftFormBuilder<TValues extends FieldValues>({\n title = \"Form\",\n description,\n fields,\n initialData = null,\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n submitLabel = \"Submit\",\n cancelLabel = \"Cancel\",\n resetLabel = \"Reset\",\n showReset = true,\n showCancel = true,\n tone,\n className,\n formClassName,\n loading = false,\n disableSubmitWhenInvalid = true,\n closeOnSubmit = true,\n closeOnCancel = true,\n onSubmit,\n onReset,\n onCancel,\n customValidation,\n}: CraftFormBuilderProps<TValues>) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const isControlled = typeof open === \"boolean\";\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const defaultValues = React.useMemo(\n () => buildDefaultValues(fields, initialData),\n [fields, initialData]\n );\n\n const form = useForm<TValues>({\n mode: \"onChange\",\n defaultValues,\n });\n\n const formId = React.useId();\n\n React.useEffect(() => {\n form.reset(defaultValues);\n }, [defaultValues, form]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (customValidation) {\n const customErrors = customValidation(values);\n if (customErrors && Object.keys(customErrors).length > 0) {\n Object.entries(customErrors).forEach(([key, message]) => {\n if (message) {\n form.setError(key as Path<TValues>, {\n type: \"custom\",\n message: String(message),\n });\n }\n });\n return;\n }\n }\n\n await onSubmit(values);\n if (closeOnSubmit) setOpen(false);\n });\n\n const handleReset = () => {\n form.reset(defaultValues);\n onReset?.();\n };\n\n const handleCancel = () => {\n onCancel?.();\n if (closeOnCancel) setOpen(false);\n };\n\n return (\n <FormProvider {...form}>\n <CraftModal\n open={isOpen}\n onOpenChange={setOpen}\n trigger={trigger}\n title={title}\n description={description}\n tone={tone}\n className={className}\n footer={\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n {showReset && (\n <CraftButton\n type=\"button\"\n variant=\"outline\"\n onClick={handleReset}\n disabled={loading}\n >\n {resetLabel}\n </CraftButton>\n )}\n {showCancel && (\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n onClick={handleCancel}\n disabled={loading}\n >\n {cancelLabel}\n </CraftButton>\n )}\n <CraftSubmitButton\n loading={loading}\n disableWhenInvalid={disableSubmitWhenInvalid}\n form={formId}\n >\n {submitLabel}\n </CraftSubmitButton>\n </div>\n }\n >\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={cn(\"space-y-5\", formClassName)}\n >\n {fields.map((field) => (\n <div key={field.name} className=\"space-y-2\">\n {field.helpText && (\n <p className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {field.helpText}\n </p>\n )}\n <CraftFormField\n name={field.name}\n label={field.label}\n description={field.description}\n type={field.type}\n placeholder={field.placeholder}\n options={field.options}\n tone={tone}\n disabled={field.disabled || loading}\n rules={buildRules(field, form.getValues)}\n fieldProps={{\n min: field.min,\n max: field.max,\n step: field.step,\n rows: field.rows,\n accept: field.accept,\n multiple: field.type === \"multifile\",\n ...field.fieldProps,\n }}\n />\n </div>\n ))}\n </form>\n </CraftModal>\n </FormProvider>\n );\n}"],"mappings":"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","names":["_a"]}
|