@jameskabz/nextcraft-ui 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/craft/components.cjs +64 -1779
  2. package/dist/craft/components.cjs.map +1 -1
  3. package/dist/craft/components.js +31 -42
  4. package/dist/craft/components.js.map +1 -1
  5. package/dist/craft/forms.cjs +6 -1347
  6. package/dist/craft/forms.cjs.map +1 -1
  7. package/dist/craft/forms.js +3 -8
  8. package/dist/craft/forms.js.map +1 -1
  9. package/dist/craft/layout.cjs +20 -374
  10. package/dist/craft/layout.cjs.map +1 -1
  11. package/dist/craft/layout.js +10 -14
  12. package/dist/craft/layout.js.map +1 -1
  13. package/dist/craft/table.cjs +8 -632
  14. package/dist/craft/table.cjs.map +1 -1
  15. package/dist/craft/table.js +4 -8
  16. package/dist/craft/table.js.map +1 -1
  17. package/dist/craft/theme.cjs +5 -137
  18. package/dist/craft/theme.cjs.map +1 -1
  19. package/dist/craft/theme.js +2 -6
  20. package/dist/craft/theme.js.map +1 -1
  21. package/dist/index.cjs +103 -3426
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.js +50 -70
  24. package/dist/index.js.map +1 -1
  25. package/dist/styles.css +0 -31
  26. package/package.json +6 -1
  27. package/dist/chunk-6F7FN2ZF.js +0 -671
  28. package/dist/chunk-6F7FN2ZF.js.map +0 -1
  29. package/dist/chunk-7Q4Z47HT.js +0 -657
  30. package/dist/chunk-7Q4Z47HT.js.map +0 -1
  31. package/dist/chunk-7SKDTIEK.js +0 -49
  32. package/dist/chunk-7SKDTIEK.js.map +0 -1
  33. package/dist/chunk-FEFH5O5K.js +0 -49
  34. package/dist/chunk-FEFH5O5K.js.map +0 -1
  35. package/dist/chunk-M2EKVXB6.js +0 -127
  36. package/dist/chunk-M2EKVXB6.js.map +0 -1
  37. package/dist/chunk-SBLIF6UU.js +0 -1029
  38. package/dist/chunk-SBLIF6UU.js.map +0 -1
  39. package/dist/chunk-VQ6T3HIX.js +0 -9
  40. package/dist/chunk-VQ6T3HIX.js.map +0 -1
  41. package/dist/chunk-YVZL4GET.js +0 -328
  42. package/dist/chunk-YVZL4GET.js.map +0 -1
  43. package/dist/chunk-ZRV4Y374.js +0 -582
  44. package/dist/chunk-ZRV4Y374.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/craft/forms.ts","../../src/components/craft-form.tsx","../../src/utils/cn.ts","../../src/components/craft-modal.tsx","../../src/components/craft-button.tsx","../../src/components/craft-submit-button.tsx","../../src/components/craft-form-builder.tsx","../../src/components/craft-form-field.tsx","../../src/components/craft-input.tsx","../../src/components/craft-textarea.tsx","../../src/components/craft-select.tsx","../../src/components/craft-checkbox.tsx","../../src/components/craft-switch.tsx","../../src/components/craft-date-picker.tsx","../../src/components/craft-number-input.tsx","../../src/components/craft-currency-input.tsx"],"sourcesContent":["export { CraftForm } from \"@/components/craft-form\";\nexport type { CraftFormProps } from \"@/components/craft-form\";\n\nexport { CraftFormBuilder } from \"@/components/craft-form-builder\";\nexport type { CraftFormBuilderProps, CraftFormBuilderField } from \"@/components/craft-form-builder\";\n\nexport { CraftFormField } from \"@/components/craft-form-field\";\nexport type { CraftFormFieldProps, CraftFormFieldOption, CraftFormFieldType } from \"@/components/craft-form-field\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FormProvider, type FieldValues, type UseFormReturn } 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\";\n\nexport type CraftFormProps<TValues extends FieldValues> = {\n form: UseFormReturn<TValues>;\n onSubmit: (values: TValues) => void | Promise<void>;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: React.ReactNode;\n title?: React.ReactNode;\n description?: React.ReactNode;\n submitLabel?: React.ReactNode;\n cancelLabel?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n disableSubmitWhenInvalid?: boolean;\n closeOnSubmit?: boolean;\n formClassName?: string;\n};\n\nexport function CraftForm<TValues extends FieldValues>({\n form,\n onSubmit,\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n title,\n description,\n submitLabel = \"Save\",\n cancelLabel = \"Cancel\",\n tone,\n className,\n children,\n footer,\n disableSubmitWhenInvalid = true,\n closeOnSubmit = true,\n formClassName,\n}: CraftFormProps<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 formId = React.useId();\n\n const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\n if (closeOnSubmit) setOpen(false);\n });\n\n const footerContent = footer ?? (\n <div className=\"flex flex-wrap items-center justify-end gap-3\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={() => setOpen(false)}>\n {cancelLabel}\n </CraftButton>\n <CraftSubmitButton\n form={formId}\n disableWhenInvalid={disableSubmitWhenInvalid}\n >\n {submitLabel}\n </CraftSubmitButton>\n </div>\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={footerContent}\n >\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={cn(\"space-y-5\", formClassName)}\n >\n {children}\n </form>\n </CraftModal>\n </FormProvider>\n );\n}\n","export function cn(...values: Array<string | false | null | undefined>): string {\n return values.filter(Boolean).join(\" \");\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nconst FOCUSABLE_SELECTORS = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nfunction useFocusTrap(active: boolean) {\n const ref = React.useRef<HTMLDivElement | null>(null);\n\n React.useEffect(() => {\n if (!active || !ref.current) return;\n const root = ref.current;\n const getFocusable = () =>\n Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTORS));\n\n const focusables = getFocusable();\n if (focusables.length) {\n focusables[0].focus();\n } else {\n root.focus();\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\") return;\n const items = getFocusable();\n if (!items.length) return;\n const first = items[0];\n const last = items[items.length - 1];\n const activeEl = document.activeElement as HTMLElement | null;\n\n if (event.shiftKey && activeEl === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && activeEl === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n root.addEventListener(\"keydown\", handleKeyDown);\n return () => root.removeEventListener(\"keydown\", handleKeyDown);\n }, [active]);\n\n return ref;\n}\n\nexport type CraftModalProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n tone?: ThemeName;\n title?: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n footer?: React.ReactNode;\n className?: string;\n};\n\nexport function CraftModal({\n open,\n defaultOpen = false,\n onOpenChange,\n tone,\n title,\n description,\n children,\n trigger,\n footer,\n className,\n}: CraftModalProps) {\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) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n React.useEffect(() => {\n if (!isOpen) return;\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [isOpen, setOpen]);\n\n const ref = useFocusTrap(isOpen);\n\n const content = isOpen ? (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center px-4 py-8\">\n <div\n className=\"absolute inset-0 backdrop-blur-sm\"\n onClick={() => setOpen(false)}\n />\n <div\n ref={ref}\n tabIndex={-1}\n className={cn(\n \"relative z-10 w-full max-w-7xl rounded-3xl border border-[rgb(var(--nc-border)/0.45)] p-6 text-[rgb(var(--nc-fg))] shadow-[0_20px_60px_rgba(0,0,0,0.45)] backdrop-blur-2xl\",\n \"max-h-[calc(100vh-1rem)] overflow-y-auto\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"space-y-1\">\n {title && <h3 className=\"text-2xl font-semibold\">{title}</h3>}\n {description && <p className=\"text-[rgb(var(--nc-fg-muted))]\">{description}</p>}\n </div>\n <button\n className=\"rounded-full border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-2 text-[rgb(var(--nc-fg-soft))] transition hover:text-[rgb(var(--nc-fg))]\"\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n >\n <svg viewBox=\"0 0 20 20\" className=\"h-4 w-4\" fill=\"currentColor\">\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n </svg>\n </button>\n </div>\n <div className=\"mt-5 space-y-4\">{children}</div>\n {footer && <div className=\"mt-6\">{footer}</div>}\n </div>\n </div>\n ) : null;\n\n return (\n <>\n {trigger && (\n <span\n onClick={() => setOpen(true)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") setOpen(true);\n }}\n role=\"button\"\n tabIndex={0}\n className=\"inline-flex\"\n >\n {trigger}\n </span>\n )}\n {typeof document !== \"undefined\" && content\n ? createPortal(content, document.body)\n : content}\n </>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\ntype CraftButtonVariant = \"solid\" | \"ghost\" | \"outline\" | \"gradient\";\ntype CraftButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport type CraftButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: CraftButtonVariant;\n size?: CraftButtonSize;\n glow?: boolean;\n tone?: ThemeName;\n};\n\nconst sizeClasses: Record<CraftButtonSize, string> = {\n sm: \"h-9 px-4 text-xs\",\n md: \"h-11 px-6 text-sm\",\n lg: \"h-13 px-8 text-base\",\n};\n\nconst variantClasses: Record<CraftButtonVariant, string> = {\n solid:\n \"bg-gradient-to-br from-[rgb(var(--nc-accent-1))] via-[rgb(var(--nc-accent-2))] to-[rgb(var(--nc-accent-3))] text-white shadow-[0_12px_30px_rgb(var(--nc-accent-1)/0.45)] hover:shadow-[0_16px_36px_rgb(var(--nc-accent-1)/0.6)] hover:scale-[1.02] active:scale-[0.98]\",\n ghost:\n \"bg-[color:rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg))] hover:bg-[color:rgb(var(--nc-surface)/0.18)] backdrop-blur-sm border border-[rgb(var(--nc-border)/0.35)] hover:border-[color:rgb(var(--nc-border)/0.5)]\",\n outline:\n \"bg-transparent text-[color:rgb(var(--nc-accent-1))] border-2 border-[color:rgb(var(--nc-accent-1)/0.5)] hover:border-[color:rgb(var(--nc-accent-1))] hover:bg-[color:rgb(var(--nc-accent-1)/0.1)]\",\n gradient:\n \"bg-gradient-to-r from-[rgb(var(--nc-accent-1))] via-[rgb(var(--nc-accent-2))] to-[rgb(var(--nc-accent-3))] text-white shadow-[0_12px_30px_rgb(var(--nc-accent-2)/0.45)] hover:shadow-[0_16px_36px_rgb(var(--nc-accent-2)/0.6)] hover:scale-[1.02] active:scale-[0.98]\",\n};\n\nexport function CraftButton({\n className,\n variant = \"solid\",\n size = \"md\",\n glow = true,\n tone,\n disabled,\n ...props\n}: CraftButtonProps) {\n return (\n <button\n className={cn(\n \"relative inline-flex items-center justify-center gap-2 rounded-xl font-semibold tracking-wide transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[rgb(var(--nc-accent-1)/0.6)] focus-visible:ring-offset-2 focus-visible:ring-offset-slate-900 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100\",\n sizeClasses[size],\n variantClasses[variant],\n glow && (variant === \"solid\" || variant === \"gradient\")\n ? \"before:absolute before:-inset-1 before:rounded-xl before:bg-linear-to-r before:from-[rgb(var(--nc-accent-1)/0.2)] before:via-[rgb(var(--nc-accent-2)/0.2)] before:to-[rgb(var(--nc-accent-3)/0.2)] before:blur-xl before:-z-10 before:opacity-0 hover:before:opacity-100 before:transition-opacity\"\n : \"\",\n className\n )}\n data-nc-theme={tone}\n disabled={disabled}\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useFormContext } from \"react-hook-form\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftSubmitButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n tone?: ThemeName;\n loading?: boolean;\n loadingLabel?: React.ReactNode;\n disableWhenInvalid?: boolean;\n};\n\nexport function CraftSubmitButton({\n className,\n tone,\n loading,\n loadingLabel = \"Submitting...\",\n disableWhenInvalid = true,\n disabled,\n children,\n ...props\n}: CraftSubmitButtonProps) {\n const form = useFormContext();\n const isSubmitting = loading ?? form?.formState?.isSubmitting ?? false;\n const isValid = form?.formState?.isValid ?? true;\n const isDisabled =\n disabled || isSubmitting || (disableWhenInvalid && !isValid);\n\n return (\n <button\n type=\"submit\"\n className={cn(\n \"relative inline-flex items-center justify-center gap-2 rounded-xl px-6 py-2 text-sm font-semibold\",\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1))] via-[rgb(var(--nc-accent-2))] to-[rgb(var(--nc-accent-3))]\",\n \"text-white shadow-[0_12px_30px_rgb(var(--nc-accent-1)/0.35)]\",\n \"transition-all duration-200\",\n \"hover:shadow-[0_16px_36px_rgb(var(--nc-accent-1)/0.5)] hover:scale-[1.02] active:scale-[0.98]\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[rgb(var(--nc-accent-1)/0.6)]\",\n \"disabled:opacity-60 disabled:cursor-not-allowed disabled:hover:scale-100\",\n className\n )}\n data-nc-theme={tone}\n disabled={isDisabled}\n {...props}\n >\n {isSubmitting && (\n <span className=\"inline-flex h-4 w-4 animate-spin rounded-full border-2 border-white/60 border-t-white\" />\n )}\n <span>{isSubmitting ? loadingLabel : children}</span>\n </button>\n );\n}\n","\"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}","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Controller,\n type FieldValues,\n type Path,\n type RegisterOptions,\n useFormContext,\n} from \"react-hook-form\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftInput } from \"@/components/craft-input\";\nimport { CraftTextarea } from \"@/components/craft-textarea\";\nimport { CraftSelect } from \"@/components/craft-select\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftSwitch } from \"@/components/craft-switch\";\nimport { CraftDatePicker } from \"@/components/craft-date-picker\";\nimport { CraftNumberInput } from \"@/components/craft-number-input\";\nimport { CraftCurrencyInput } from \"@/components/craft-currency-input\";\n\nexport type CraftFormFieldOption = {\n label: React.ReactNode;\n value: string;\n disabled?: boolean;\n};\n\nexport type CraftFormFieldType =\n | \"text\"\n | \"number\"\n | \"password\"\n | \"textarea\"\n | \"select\"\n | \"checkbox\"\n | \"slider\"\n | \"date\"\n | \"color\"\n | \"email\"\n | \"tel\"\n | \"url\"\n | \"time\"\n | \"datetime-local\"\n | \"month\"\n | \"week\"\n | \"file\"\n | \"multifile\"\n | \"radio\"\n | \"switch\"\n | \"range\"\n | \"search\"\n | \"hidden\"\n | \"multiselect\"\n | \"currency\";\n\nexport type CraftFormFieldProps<TValues extends FieldValues = FieldValues> = {\n name: Path<TValues>;\n label?: React.ReactNode;\n description?: React.ReactNode;\n type?: CraftFormFieldType;\n options?: CraftFormFieldOption[];\n placeholder?: string;\n tone?: ThemeName;\n className?: string;\n inputClassName?: string;\n labelClassName?: string;\n descriptionClassName?: string;\n rules?: RegisterOptions<TValues>;\n disabled?: boolean;\n fieldProps?: Record<string, unknown>;\n};\n\nfunction getFieldError(errors: unknown, name: string) {\n if (!errors || typeof errors !== \"object\") return undefined;\n const segments = name.split(\".\");\n let current: unknown = errors;\n for (const segment of segments) {\n if (!current || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nconst baseInputClass =\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)] focus:outline-none focus:ring-4 transition-all duration-300 disabled:opacity-50 disabled:cursor-not-allowed border-[rgb(var(--nc-border)/0.35)] focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)] px-5 py-3 text-base placeholder:text-[rgb(var(--nc-fg-soft))]\";\n\nexport function CraftFormField<TValues extends FieldValues = FieldValues>({\n name,\n label,\n description,\n type = \"text\",\n options = [],\n placeholder,\n tone,\n className,\n inputClassName,\n labelClassName,\n descriptionClassName,\n rules,\n disabled,\n fieldProps,\n}: CraftFormFieldProps<TValues>) {\n const { register, control, formState } = useFormContext<TValues>();\n const error = getFieldError(formState.errors, name);\n const errorMessage =\n typeof (error as { message?: unknown })?.message === \"string\"\n ? (error as { message: string }).message\n : undefined;\n\n if (type === \"hidden\") {\n return <input type=\"hidden\" {...register(name, rules)} />;\n }\n\n const labelNode = label ? (\n <label\n htmlFor={name}\n className={cn(\n \"text-sm font-semibold text-[rgb(var(--nc-fg))]\",\n labelClassName\n )}\n >\n {label}\n </label>\n ) : null;\n\n const descriptionNode = description ? (\n <p\n className={cn(\n \"text-xs text-[rgb(var(--nc-fg-muted))]\",\n descriptionClassName\n )}\n >\n {description}\n </p>\n ) : null;\n\n const errorNode = errorMessage ? (\n <p className=\"text-xs text-[rgb(var(--nc-accent-3))]\">{errorMessage}</p>\n ) : null;\n\n const renderInput = () => {\n if (type === \"textarea\") {\n return (\n <CraftTextarea\n id={name}\n placeholder={placeholder}\n tone={tone}\n className={inputClassName}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"select\" || type === \"multiselect\") {\n return (\n <CraftSelect\n id={name}\n tone={tone}\n className={inputClassName}\n multiple={type === \"multiselect\"}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </CraftSelect>\n );\n }\n\n if (type === \"checkbox\") {\n return (\n <CraftCheckbox\n tone={tone}\n label={label}\n description={description}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"switch\") {\n return (\n <CraftSwitch\n tone={tone}\n label={label}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"date\") {\n return (\n <Controller\n control={control}\n name={name}\n rules={rules}\n render={({ field }) => (\n <CraftDatePicker\n value={field.value ?? \"\"}\n onChange={field.onChange}\n tone={tone}\n placeholder={placeholder}\n {...(fieldProps as Record<string, unknown>)}\n />\n )}\n />\n );\n }\n\n if (type === \"number\") {\n return (\n <CraftNumberInput\n id={name}\n tone={tone}\n placeholder={placeholder}\n className={inputClassName}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"currency\") {\n return (\n <CraftCurrencyInput\n id={name}\n tone={tone}\n placeholder={placeholder}\n className={inputClassName}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"radio\") {\n return (\n <div className=\"grid gap-3\">\n {options.map((option) => (\n <label\n key={option.value}\n className={cn(\n \"flex items-center gap-3 rounded-2xl border border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)] px-4 py-3 text-sm text-[rgb(var(--nc-fg))]\",\n \"transition-all duration-200\",\n \"focus-within:ring-2 focus-within:ring-[rgb(var(--nc-accent-1)/0.5)]\",\n option.disabled ? \"opacity-60\" : \"cursor-pointer\"\n )}\n data-nc-theme={tone}\n >\n <input\n type=\"radio\"\n value={option.value}\n disabled={option.disabled || disabled}\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n <span>{option.label}</span>\n </label>\n ))}\n </div>\n );\n }\n\n if (type === \"range\" || type === \"slider\") {\n return (\n <input\n id={name}\n type=\"range\"\n className={cn(\n \"w-full accent-[rgb(var(--nc-accent-1))]\",\n inputClassName\n )}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"file\" || type === \"multifile\") {\n return (\n <input\n id={name}\n type=\"file\"\n multiple={type === \"multifile\"}\n className={cn(\n baseInputClass,\n \"file:mr-4 file:rounded-xl file:border-0 file:bg-[rgb(var(--nc-surface)/0.35)] file:px-4 file:py-2 file:text-sm file:font-semibold file:text-[rgb(var(--nc-fg))]\",\n inputClassName\n )}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n const inputType =\n type === \"search\" ||\n type === \"password\" ||\n type === \"email\" ||\n type === \"tel\" ||\n type === \"url\" ||\n type === \"time\" ||\n type === \"datetime-local\" ||\n type === \"month\" ||\n type === \"week\" ||\n type === \"color\"\n ? type\n : \"text\";\n\n return (\n <CraftInput\n id={name}\n type={inputType}\n placeholder={placeholder}\n tone={tone}\n className={inputClassName}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n };\n\n const showLabel = type !== \"checkbox\" && type !== \"switch\";\n const showDescriptionAbove = type !== \"checkbox\" && type !== \"switch\";\n const showDescriptionBelow = type === \"switch\";\n\n return (\n <div className={cn(\"space-y-2\", className)} data-nc-theme={tone}>\n {showLabel ? labelNode : null}\n {showDescriptionAbove ? descriptionNode : null}\n {renderInput()}\n {showDescriptionBelow ? descriptionNode : null}\n {errorNode}\n </div>\n );\n}\n","\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\n// ============================================================================\n// CRAFT INPUT\n// ============================================================================\n\ntype CraftInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport type CraftInputProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> & {\n tone?: ThemeName;\n inputSize?: CraftInputSize;\n glow?: boolean;\n icon?: React.ReactNode;\n};\n\nconst inputSizeClasses: Record<CraftInputSize, string> = {\n sm: \"h-10 px-4 text-sm\",\n md: \"h-12 px-5 text-base\",\n lg: \"h-14 px-6 text-lg\",\n};\n\nexport const CraftInput = React.forwardRef<HTMLInputElement, CraftInputProps>(\n (\n { className, tone, inputSize = \"md\", glow = true, icon, ...props },\n ref\n ) => {\n return (\n <div className=\"relative w-full\" data-nc-theme={tone}>\n {icon && (\n <div className=\"absolute left-4 top-1/2 -translate-y-1/2 text-[rgb(var(--nc-fg-soft))]\">\n {icon}\n </div>\n )}\n <input\n ref={ref}\n className={cn(\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl\",\n \"shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]\",\n \"focus:outline-none focus:ring-4\",\n \"transition-all duration-300\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n inputSizeClasses[inputSize],\n \"border-[rgb(var(--nc-border)/0.35)]\",\n \"focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]\",\n \"placeholder:text-[rgb(var(--nc-fg-soft))]\",\n glow ? \"focus:shadow-[0_0_30px_-5px_var(--glow-color)]\" : \"\",\n icon ? \"pl-12\" : \"\",\n className\n )}\n style={{\n \"--glow-color\": \"rgb(var(--nc-accent-1) / 0.5)\",\n } as React.CSSProperties}\n {...props}\n />\n </div>\n );\n }\n);\n\nCraftInput.displayName = \"CraftInput\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftTextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n tone?: ThemeName;\n};\n\nexport const CraftTextarea = React.forwardRef<HTMLTextAreaElement, CraftTextareaProps>(\n ({ className, tone, rows = 4, ...props }, ref) => {\n return (\n <div className=\"relative w-full\" data-nc-theme={tone}>\n <textarea\n ref={ref}\n rows={rows}\n className={cn(\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl\",\n \"shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]\",\n \"focus:outline-none focus:ring-4\",\n \"transition-all duration-300\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"border-[rgb(var(--nc-border)/0.35)]\",\n \"focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]\",\n \"placeholder:text-[rgb(var(--nc-fg-soft))]\",\n \"px-5 py-3 text-base\",\n className\n )}\n style={{\n \"--glow-color\": \"rgb(var(--nc-accent-1) / 0.5)\",\n } as React.CSSProperties}\n {...props}\n />\n </div>\n );\n }\n);\n\nCraftTextarea.displayName = \"CraftTextarea\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftSelectProps = React.SelectHTMLAttributes<HTMLSelectElement> & {\n tone?: ThemeName;\n};\n\nexport const CraftSelect = React.forwardRef<HTMLSelectElement, CraftSelectProps>(\n ({ className, tone, children, ...props }, ref) => {\n return (\n <div className=\"relative w-full\" data-nc-theme={tone}>\n <select\n ref={ref}\n className={cn(\n \"w-full appearance-none rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl\",\n \"shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]\",\n \"focus:outline-none focus:ring-4\",\n \"transition-all duration-300\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"border-[rgb(var(--nc-border)/0.35)]\",\n \"focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]\",\n \"px-5 py-3 pr-10 text-base\",\n className\n )}\n {...props}\n >\n {children}\n </select>\n <svg\n className=\"pointer-events-none absolute right-4 top-1/2 h-4 w-4 -translate-y-1/2 text-[rgb(var(--nc-fg-soft))]\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.7a.75.75 0 111.06 1.06l-4.24 4.24a.75.75 0 01-1.06 0L5.21 8.29a.75.75 0 01.02-1.08z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n );\n }\n);\n\nCraftSelect.displayName = \"CraftSelect\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCheckboxProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\"\n> & {\n tone?: ThemeName;\n label?: React.ReactNode;\n description?: React.ReactNode;\n};\n\nexport const CraftCheckbox = React.forwardRef<HTMLInputElement, CraftCheckboxProps>(\n ({ className, tone, label, description, ...props }, ref) => {\n return (\n <label\n className={cn(\n \"flex items-start 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 <span className=\"relative mt-0.5\">\n <input\n ref={ref}\n type=\"checkbox\"\n className=\"peer sr-only\"\n {...props}\n />\n <span\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded-md border-2\",\n \"border-[rgb(var(--nc-border)/0.45)] bg-[rgb(var(--nc-surface)/0.08)]\",\n \"transition-all duration-200\",\n \"peer-checked:border-[rgb(var(--nc-accent-1))] peer-checked:bg-[rgb(var(--nc-accent-1)/0.25)]\",\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-[rgb(var(--nc-accent-1)/0.5)]\"\n )}\n >\n <svg\n className=\"h-3 w-3 text-[rgb(var(--nc-fg))] opacity-0 transition-opacity peer-checked:opacity-100\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.704 5.29a1 1 0 010 1.415l-7.2 7.2a1 1 0 01-1.415 0l-3.2-3.2a1 1 0 111.415-1.415l2.492 2.493 6.493-6.493a1 1 0 011.415 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n </span>\n <span className=\"space-y-1\">\n {label && <span className=\"block font-medium text-[rgb(var(--nc-fg))]\">{label}</span>}\n {description && (\n <span className=\"block text-xs text-[rgb(var(--nc-fg-muted))]\">{description}</span>\n )}\n </span>\n </label>\n );\n }\n);\n\nCraftCheckbox.displayName = \"CraftCheckbox\";\n","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)]\"\n )}\n >\n <span\n className={cn(\n \"absolute left-0.5 top-0.5 h-4 w-4 rounded-full bg-[rgb(var(--nc-surface-muted)/0.9)]\",\n \"transition-all duration-200\",\n \"peer-checked:translate-x-5 peer-checked:bg-[rgb(var(--nc-surface-muted))]\"\n )}\n />\n </span>\n {label && <span>{label}</span>}\n </label>\n );\n }\n);\n\nCraftSwitch.displayName = \"CraftSwitch\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftDatePickerProps = {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n tone?: ThemeName;\n min?: string;\n max?: string;\n placeholder?: string;\n className?: string;\n};\n\nconst WEEK_DAYS = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\n\nfunction formatDate(date: Date) {\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nfunction parseDate(value?: string) {\n if (!value) return null;\n const [year, month, day] = value.split(\"-\").map(Number);\n if (!year || !month || !day) return null;\n return new Date(year, month - 1, day);\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction isOutsideRange(date: Date, min?: string, max?: string) {\n const minDate = parseDate(min);\n const maxDate = parseDate(max);\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n}\n\nexport function CraftDatePicker({\n value,\n defaultValue,\n onChange,\n tone,\n min,\n max,\n placeholder = \"Select date\",\n className,\n}: CraftDatePickerProps) {\n const [open, setOpen] = React.useState(false);\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue ?? \"\");\n const isControlled = value !== undefined;\n const selectedValue = isControlled ? value ?? \"\" : uncontrolledValue;\n const selectedDate = parseDate(selectedValue);\n\n const initialMonth = selectedDate ?? new Date();\n const [viewDate, setViewDate] = React.useState<Date>(initialMonth);\n\n React.useEffect(() => {\n if (selectedDate) setViewDate(selectedDate);\n }, [selectedDate]);\n\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n\n React.useEffect(() => {\n if (!open) return;\n const handleClick = (event: MouseEvent) => {\n if (!wrapperRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [open]);\n\n const setValue = React.useCallback(\n (next: string) => {\n if (!isControlled) setUncontrolledValue(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n const monthStart = new Date(viewDate.getFullYear(), viewDate.getMonth(), 1);\n const monthEnd = new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 0);\n const startDay = monthStart.getDay();\n const daysInMonth = monthEnd.getDate();\n const cells = Array.from({ length: startDay + daysInMonth }, (_, i) => {\n const dayNumber = i - startDay + 1;\n if (dayNumber < 1) return null;\n return new Date(viewDate.getFullYear(), viewDate.getMonth(), dayNumber);\n });\n\n const handleDaySelect = (date: Date) => {\n if (isOutsideRange(date, min, max)) return;\n const next = formatDate(date);\n setValue(next);\n setOpen(false);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!open) return;\n if (!selectedDate) return;\n const next = new Date(selectedDate);\n if (event.key === \"ArrowRight\") next.setDate(next.getDate() + 1);\n if (event.key === \"ArrowLeft\") next.setDate(next.getDate() - 1);\n if (event.key === \"ArrowDown\") next.setDate(next.getDate() + 7);\n if (event.key === \"ArrowUp\") next.setDate(next.getDate() - 7);\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleDaySelect(selectedDate);\n return;\n }\n if (next.getTime() !== selectedDate.getTime()) {\n event.preventDefault();\n if (!isOutsideRange(next, min, max)) {\n setValue(formatDate(next));\n setViewDate(next);\n }\n }\n };\n\n return (\n <div className=\"relative w-full\" data-nc-theme={tone} ref={wrapperRef}>\n <button\n type=\"button\"\n onClick={() => setOpen((prev) => !prev)}\n className={cn(\n \"flex w-full items-center justify-between rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] px-5 py-3 text-left text-base text-[rgb(var(--nc-fg))] backdrop-blur-xl\",\n \"shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]\",\n \"transition-all duration-300\",\n \"border-[rgb(var(--nc-border)/0.35)]\",\n \"focus:outline-none focus:ring-4 focus:ring-[rgb(var(--nc-accent-1)/0.3)]\",\n className\n )}\n >\n <span className={selectedValue ? \"text-[rgb(var(--nc-fg))]\" : \"text-[rgb(var(--nc-fg-soft))]\"}>\n {selectedValue || placeholder}\n </span>\n <svg className=\"h-4 w-4 text-[rgb(var(--nc-fg-soft))]\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M6 2a1 1 0 011 1v1h6V3a1 1 0 112 0v1h1a2 2 0 012 2v10a2 2 0 01-2 2H4a2 2 0 01-2-2V6a2 2 0 012-2h1V3a1 1 0 011-1zm10 6H4v8h12V8z\" />\n </svg>\n </button>\n\n {open && (\n <div\n className={cn(\n \"absolute left-0 top-full z-20 mt-3 w-full rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/1.52)] p-4 text-[rgb(var(--nc-fg))] shadow-[0_20px_60px_rgba(0,0,0,0.55)] backdrop-blur-10xl\"\n )}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n className=\"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-1 text-sm text-[rgb(var(--nc-fg))]\"\n onClick={() =>\n setViewDate(\n new Date(viewDate.getFullYear(), viewDate.getMonth() - 1, 1)\n )\n }\n >\n Prev\n </button>\n <div className=\"text-sm font-semibold\">\n {viewDate.toLocaleString(undefined, { month: \"long\", year: \"numeric\" })}\n </div>\n <button\n type=\"button\"\n className=\"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-1 text-sm text-[rgb(var(--nc-fg))]\"\n onClick={() =>\n setViewDate(\n new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 1)\n )\n }\n >\n Next\n </button>\n </div>\n\n <div className=\"mt-4 grid grid-cols-7 gap-2 text-xs text-[rgb(var(--nc-fg-muted))]\">\n {WEEK_DAYS.map((day) => (\n <div key={day} className=\"text-center\">\n {day}\n </div>\n ))}\n </div>\n\n <div className=\"mt-2 grid grid-cols-7 gap-2\">\n {cells.map((date, index) => {\n if (!date) return <div key={`empty-${index}`} />;\n const disabled = isOutsideRange(date, min, max);\n const selected = selectedDate && isSameDay(date, selectedDate);\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n onClick={() => handleDaySelect(date)}\n disabled={disabled}\n className={cn(\n \"rounded-lg py-2 text-sm transition-all\",\n selected\n ? \"bg-[rgb(var(--nc-accent-1)/0.3)] text-[rgb(var(--nc-fg))]\"\n : \"text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.12)]\",\n disabled && \"opacity-40 hover:bg-transparent\"\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftNumberInputProps = React.InputHTMLAttributes<HTMLInputElement> & {\n tone?: ThemeName;\n};\n\nexport const CraftNumberInput = React.forwardRef<\n HTMLInputElement,\n CraftNumberInputProps\n>(({ className, tone, ...props }, ref) => {\n return (\n <div className=\"relative w-full\" data-nc-theme={tone}>\n <input\n ref={ref}\n type=\"number\"\n className={cn(\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl\",\n \"shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]\",\n \"focus:outline-none focus:ring-4\",\n \"transition-all duration-300\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"border-[rgb(var(--nc-border)/0.35)]\",\n \"focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]\",\n \"px-5 py-3 text-base\",\n className\n )}\n {...props}\n />\n </div>\n );\n});\n\nCraftNumberInput.displayName = \"CraftNumberInput\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCurrencyInputProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\"\n> & {\n tone?: ThemeName;\n currencySymbol?: string;\n};\n\nexport const CraftCurrencyInput = React.forwardRef<\n HTMLInputElement,\n CraftCurrencyInputProps\n>(({ className, tone, currencySymbol = \"$\", ...props }, ref) => {\n return (\n <div className=\"relative w-full\" data-nc-theme={tone}>\n <span className=\"pointer-events-none absolute left-4 top-1/2 -translate-y-1/2 text-[rgb(var(--nc-fg-soft))]\">\n {currencySymbol}\n </span>\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"decimal\"\n className={cn(\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl\",\n \"shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]\",\n \"focus:outline-none focus:ring-4\",\n \"transition-all duration-300\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"border-[rgb(var(--nc-border)/0.35)]\",\n \"focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]\",\n \"placeholder:text-[rgb(var(--nc-fg-soft))]\",\n \"px-5 py-3 pl-9 text-base\",\n className\n )}\n {...props}\n />\n </div>\n );\n});\n\nCraftCurrencyInput.displayName = \"CraftCurrencyInput\";\n"],"mappings":"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","names":["React","import_react_hook_form","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_react_hook_form","import_react_hook_form","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_a"]}
1
+ {"version":3,"sources":["../../src/craft/forms.ts"],"sourcesContent":["export { CraftForm } from \"@/components/craft-form\";\nexport type { CraftFormProps } from \"@/components/craft-form\";\n\nexport { CraftFormBuilder } from \"@/components/craft-form-builder\";\nexport type { CraftFormBuilderProps, CraftFormBuilderField } from \"@/components/craft-form-builder\";\n\nexport { CraftFormField } from \"@/components/craft-form-field\";\nexport type { CraftFormFieldProps, CraftFormFieldOption, CraftFormFieldType } from \"@/components/craft-form-field\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA0B;AAG1B,gCAAiC;AAGjC,8BAA+B;","names":[]}
@@ -1,11 +1,6 @@
1
- import {
2
- CraftForm,
3
- CraftFormBuilder,
4
- CraftFormField
5
- } from "../chunk-7Q4Z47HT.js";
6
- import "../chunk-6F7FN2ZF.js";
7
- import "../chunk-7SKDTIEK.js";
8
- import "../chunk-VQ6T3HIX.js";
1
+ import { CraftForm } from "@/components/craft-form";
2
+ import { CraftFormBuilder } from "@/components/craft-form-builder";
3
+ import { CraftFormField } from "@/components/craft-form-field";
9
4
  export {
10
5
  CraftForm,
11
6
  CraftFormBuilder,
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../src/craft/forms.ts"],"sourcesContent":["export { CraftForm } from \"@/components/craft-form\";\nexport type { CraftFormProps } from \"@/components/craft-form\";\n\nexport { CraftFormBuilder } from \"@/components/craft-form-builder\";\nexport type { CraftFormBuilderProps, CraftFormBuilderField } from \"@/components/craft-form-builder\";\n\nexport { CraftFormField } from \"@/components/craft-form-field\";\nexport type { CraftFormFieldProps, CraftFormFieldOption, CraftFormFieldType } from \"@/components/craft-form-field\";\n"],"mappings":"AAAA,SAAS,iBAAiB;AAG1B,SAAS,wBAAwB;AAGjC,SAAS,sBAAsB;","names":[]}
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,383 +15,31 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/craft/layout.ts
31
19
  var layout_exports = {};
32
20
  __export(layout_exports, {
33
- AppShell: () => AppShell,
34
- AppTemplate: () => AppTemplate,
35
- AuthLayout: () => AuthLayout,
36
- Breadcrumbs: () => Breadcrumbs,
37
- Container: () => Container,
38
- Grid: () => Grid,
39
- PageHeader: () => PageHeader,
40
- Sidebar: () => Sidebar,
41
- TopNav: () => TopNav,
42
- layoutConfigSchema: () => layoutConfigSchema
21
+ AppShell: () => import_app_shell.AppShell,
22
+ AppTemplate: () => import_app_template.AppTemplate,
23
+ AuthLayout: () => import_auth_layout.AuthLayout,
24
+ Breadcrumbs: () => import_breadcrumbs.Breadcrumbs,
25
+ Container: () => import_container.Container,
26
+ Grid: () => import_grid.Grid,
27
+ PageHeader: () => import_page_header.PageHeader,
28
+ Sidebar: () => import_sidebar.Sidebar,
29
+ TopNav: () => import_top_nav.TopNav,
30
+ layoutConfigSchema: () => import_layout_config.layoutConfigSchema
43
31
  });
44
32
  module.exports = __toCommonJS(layout_exports);
45
-
46
- // src/utils/cn.ts
47
- function cn(...values) {
48
- return values.filter(Boolean).join(" ");
49
- }
50
-
51
- // src/components/layout/app-shell.tsx
52
- var import_jsx_runtime = require("react/jsx-runtime");
53
- function AppShell({ className, sidebar, topNav, children, ...props }) {
54
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
55
- "div",
56
- {
57
- className: cn(
58
- "grid min-h-screen grid-cols-1 gap-6 bg-background p-6 lg:grid-cols-[260px_1fr]",
59
- className
60
- ),
61
- ...props,
62
- children: [
63
- sidebar && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-full lg:sticky lg:top-6 lg:self-start lg:max-h-[calc(100vh-3rem)] lg:overflow-y-auto", children: sidebar }),
64
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-6", children: [
65
- topNav && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "lg:sticky lg:top-6 lg:z-20", children: topNav }),
66
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("main", { className: "flex-1", children })
67
- ] })
68
- ]
69
- }
70
- );
71
- }
72
-
73
- // src/components/layout/app-template.tsx
74
- var React2 = __toESM(require("react"), 1);
75
-
76
- // src/components/craft-icon.tsx
77
- var React = __toESM(require("react"), 1);
78
- var import_dynamic = require("lucide-react/dynamic");
79
- var import_jsx_runtime2 = require("react/jsx-runtime");
80
- var CraftIconContext = React.createContext(null);
81
- function CraftIcon({
82
- name,
83
- className,
84
- "aria-label": ariaLabel,
85
- icons,
86
- useLucide = true
87
- }) {
88
- const contextRegistry = React.useContext(CraftIconContext);
89
- const registry = icons != null ? icons : contextRegistry;
90
- const icon = registry == null ? void 0 : registry[name];
91
- if (!icon) {
92
- if (!useLucide) return null;
93
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
94
- import_dynamic.DynamicIcon,
95
- {
96
- name,
97
- className,
98
- "aria-hidden": ariaLabel ? void 0 : true,
99
- "aria-label": ariaLabel
100
- }
101
- );
102
- }
103
- if (React.isValidElement(icon)) {
104
- return React.cloneElement(icon, {
105
- className: cn(icon.props.className, className),
106
- "aria-hidden": ariaLabel ? void 0 : true,
107
- "aria-label": ariaLabel
108
- });
109
- }
110
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className, "aria-label": ariaLabel, children: icon });
111
- }
112
-
113
- // src/components/layout/breadcrumbs.tsx
114
- var import_jsx_runtime3 = require("react/jsx-runtime");
115
- function Breadcrumbs({ className, items, ...props }) {
116
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("nav", { className: cn("flex items-center text-sm text-[rgb(var(--nc-fg-muted))]", className), ...props, children: items.map((item, index) => {
117
- const content = item.href ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: item.href, className: "transition hover:text-[rgb(var(--nc-fg))]", children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-[rgb(var(--nc-fg))]", children: item.label });
118
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "flex items-center", children: [
119
- content,
120
- index < items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "mx-2 text-[rgb(var(--nc-fg-soft))]", children: "/" })
121
- ] }, `${item.label}-${index}`);
122
- }) });
123
- }
124
-
125
- // src/components/layout/sidebar.tsx
126
- var import_jsx_runtime4 = require("react/jsx-runtime");
127
- function Sidebar({ className, title, items, footer, ...props }) {
128
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
129
- "aside",
130
- {
131
- className: cn(
132
- "flex h-full w-full flex-col gap-6 rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.08)] p-6 text-[rgb(var(--nc-fg))] backdrop-blur-xl",
133
- className
134
- ),
135
- ...props,
136
- children: [
137
- title && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "text-lg font-semibold", children: title }),
138
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("nav", { className: "flex flex-col gap-2", children: items.map((item, index) => {
139
- var _a;
140
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
141
- "a",
142
- {
143
- href: (_a = item.href) != null ? _a : "#",
144
- className: cn(
145
- "flex items-center gap-3 rounded-2xl px-3 py-2 text-sm transition",
146
- item.active ? "bg-[rgb(var(--nc-accent-1)/0.25)] text-[rgb(var(--nc-fg))]" : "text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.12)] hover:text-[rgb(var(--nc-fg))]"
147
- ),
148
- children: [
149
- item.icon,
150
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: item.label })
151
- ]
152
- },
153
- `${item.label}-${index}`
154
- );
155
- }) }),
156
- footer && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mt-auto pt-4", children: footer })
157
- ]
158
- }
159
- );
160
- }
161
-
162
- // src/components/layout/top-nav.tsx
163
- var import_jsx_runtime5 = require("react/jsx-runtime");
164
- function TopNav({ className, title, actions, breadcrumb, ...props }) {
165
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
166
- "header",
167
- {
168
- className: cn(
169
- "flex flex-wrap items-center justify-between gap-4 rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.08)] px-6 py-4 text-[rgb(var(--nc-fg))] backdrop-blur-xl",
170
- className
171
- ),
172
- ...props,
173
- children: [
174
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-1", children: [
175
- breadcrumb,
176
- title && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "text-xl font-semibold", children: title })
177
- ] }),
178
- actions && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "flex flex-wrap gap-3", children: actions })
179
- ]
180
- }
181
- );
182
- }
183
-
184
- // src/components/layout/app-template.tsx
185
- var import_jsx_runtime6 = require("react/jsx-runtime");
186
- function AppTemplate({
187
- config,
188
- headerActions,
189
- headerBreadcrumb,
190
- sidebarFooter,
191
- resolveIcon,
192
- icons,
193
- activePath,
194
- getActivePath,
195
- lucideFallback = true,
196
- children
197
- }) {
198
- const sidebarConfig = config.sidebar;
199
- const headerConfig = config.header;
200
- const resolvedActivePath = activePath != null ? activePath : getActivePath == null ? void 0 : getActivePath();
201
- const buildIcon = React2.useCallback(
202
- (name) => {
203
- if (!name) return void 0;
204
- if (resolveIcon) return resolveIcon(name);
205
- if (icons == null ? void 0 : icons[name]) return icons[name];
206
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CraftIcon, { name, useLucide: lucideFallback });
207
- },
208
- [icons, lucideFallback, resolveIcon]
209
- );
210
- const sidebarItems = sidebarConfig ? sidebarConfig.items.map((item) => {
211
- var _a;
212
- return {
213
- label: item.label,
214
- href: item.href,
215
- active: (_a = item.active) != null ? _a : resolvedActivePath && item.href ? item.href === resolvedActivePath : false,
216
- icon: buildIcon(item.icon)
217
- };
218
- }) : null;
219
- const breadcrumbNode = headerBreadcrumb != null ? headerBreadcrumb : (headerConfig == null ? void 0 : headerConfig.breadcrumb) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Breadcrumbs, { items: headerConfig.breadcrumb }) : null;
220
- const sidebarFooterNode = sidebarFooter != null ? sidebarFooter : (sidebarConfig == null ? void 0 : sidebarConfig.footerText) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "text-xs text-[rgb(var(--nc-fg-muted))]", children: sidebarConfig.footerText }) : null;
221
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
222
- AppShell,
223
- {
224
- sidebar: sidebarConfig && sidebarItems ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
225
- Sidebar,
226
- {
227
- title: sidebarConfig.title,
228
- items: sidebarItems,
229
- footer: sidebarFooterNode
230
- }
231
- ) : void 0,
232
- topNav: headerConfig ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
233
- TopNav,
234
- {
235
- title: headerConfig.title,
236
- breadcrumb: breadcrumbNode,
237
- actions: headerActions
238
- }
239
- ) : void 0,
240
- children
241
- }
242
- );
243
- }
244
-
245
- // src/components/layout/page-header.tsx
246
- var import_jsx_runtime7 = require("react/jsx-runtime");
247
- function PageHeader({
248
- className,
249
- title,
250
- description,
251
- actions,
252
- ...props
253
- }) {
254
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
255
- "div",
256
- {
257
- className: cn("flex flex-wrap items-start justify-between gap-6", className),
258
- ...props,
259
- children: [
260
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "space-y-2", children: [
261
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h1", { className: "text-3xl font-bold text-[rgb(var(--nc-fg))]", children: title }),
262
- description && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-[rgb(var(--nc-fg-muted))]", children: description })
263
- ] }),
264
- actions && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "flex flex-wrap gap-3", children: actions })
265
- ]
266
- }
267
- );
268
- }
269
-
270
- // src/components/layout/auth-layout.tsx
271
- var import_jsx_runtime8 = require("react/jsx-runtime");
272
- function AuthLayout({
273
- className,
274
- title,
275
- description,
276
- footer,
277
- graphic,
278
- children,
279
- ...props
280
- }) {
281
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
282
- "div",
283
- {
284
- className: cn(
285
- "grid min-h-screen grid-cols-1 bg-background",
286
- "lg:grid-cols-[1.1fr_0.9fr]",
287
- className
288
- ),
289
- ...props,
290
- children: [
291
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "flex flex-col justify-center px-6 py-16 sm:px-12", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "mx-auto w-full max-w-md space-y-6", children: [
292
- (title || description) && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "space-y-2", children: [
293
- title && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h1", { className: "text-3xl font-bold text-[rgb(var(--nc-fg))]", children: title }),
294
- description && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-[rgb(var(--nc-fg-muted))]", children: description })
295
- ] }),
296
- children,
297
- footer && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: footer })
298
- ] }) }),
299
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "hidden items-center justify-center border-l border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.08)] p-12 text-[rgb(var(--nc-fg))] lg:flex", children: graphic != null ? graphic : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "max-w-sm space-y-4 text-center", children: [
300
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h2", { className: "text-2xl font-semibold", children: "Crafted experiences" }),
301
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-[rgb(var(--nc-fg-muted))]", children: "Build authentication flows that feel premium and cohesive." })
302
- ] }) })
303
- ]
304
- }
305
- );
306
- }
307
-
308
- // src/components/layout/container.tsx
309
- var import_jsx_runtime9 = require("react/jsx-runtime");
310
- var sizeClasses = {
311
- sm: "max-w-3xl",
312
- md: "max-w-5xl",
313
- lg: "max-w-6xl",
314
- xl: "max-w-7xl"
315
- };
316
- function Container({ className, size = "lg", ...props }) {
317
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
318
- "div",
319
- {
320
- className: cn("mx-auto w-full px-4 sm:px-6 lg:px-8", sizeClasses[size], className),
321
- ...props
322
- }
323
- );
324
- }
325
-
326
- // src/components/layout/grid.tsx
327
- var import_jsx_runtime10 = require("react/jsx-runtime");
328
- var colClasses = {
329
- 1: "grid-cols-1",
330
- 2: "grid-cols-1 md:grid-cols-2",
331
- 3: "grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
332
- 4: "grid-cols-1 md:grid-cols-2 lg:grid-cols-4",
333
- 5: "grid-cols-1 md:grid-cols-2 lg:grid-cols-5",
334
- 6: "grid-cols-1 md:grid-cols-3 lg:grid-cols-6"
335
- };
336
- var gapClasses = {
337
- sm: "gap-4",
338
- md: "gap-6",
339
- lg: "gap-8",
340
- xl: "gap-10"
341
- };
342
- function Grid({ className, columns = 3, gap = "md", ...props }) {
343
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: cn("grid", colClasses[columns], gapClasses[gap], className), ...props });
344
- }
345
-
346
- // src/components/layout/layout-config.ts
347
- var layoutConfigSchema = {
348
- $schema: "https://json-schema.org/draft/2020-12/schema",
349
- title: "Nextcraft UI Layout Config",
350
- type: "object",
351
- additionalProperties: false,
352
- properties: {
353
- sidebar: {
354
- type: "object",
355
- additionalProperties: false,
356
- properties: {
357
- title: { type: "string" },
358
- footerText: { type: "string" },
359
- items: {
360
- type: "array",
361
- items: {
362
- type: "object",
363
- additionalProperties: false,
364
- properties: {
365
- label: { type: "string" },
366
- href: { type: "string" },
367
- icon: { type: "string" },
368
- active: { type: "boolean" }
369
- },
370
- required: ["label"]
371
- }
372
- }
373
- },
374
- required: ["items"]
375
- },
376
- header: {
377
- type: "object",
378
- additionalProperties: false,
379
- properties: {
380
- title: { type: "string" },
381
- breadcrumb: {
382
- type: "array",
383
- items: {
384
- type: "object",
385
- additionalProperties: false,
386
- properties: {
387
- label: { type: "string" },
388
- href: { type: "string" }
389
- },
390
- required: ["label"]
391
- }
392
- }
393
- }
394
- }
395
- }
396
- };
33
+ var import_app_shell = require("@/components/layout/app-shell");
34
+ var import_app_template = require("@/components/layout/app-template");
35
+ var import_sidebar = require("@/components/layout/sidebar");
36
+ var import_top_nav = require("@/components/layout/top-nav");
37
+ var import_page_header = require("@/components/layout/page-header");
38
+ var import_breadcrumbs = require("@/components/layout/breadcrumbs");
39
+ var import_auth_layout = require("@/components/layout/auth-layout");
40
+ var import_container = require("@/components/layout/container");
41
+ var import_grid = require("@/components/layout/grid");
42
+ var import_layout_config = require("@/components/layout/layout-config");
397
43
  // Annotate the CommonJS export names for ESM import in node:
398
44
  0 && (module.exports = {
399
45
  AppShell,