{"version":3,"sources":["../../../../src/components/organisms/Form/Form.tsx"],"names":["zodResolver","jsx","jsxs","Typography","memo","Fragment","twMerge","useFormContext","useState","useEffect","renderers","useForm","createDefaultRenderers","FormProvider","Button"],"mappings":"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","file":"Form.cjs","sourcesContent":["import { z } from \"zod\";\nimport {\n  FormProvider,\n  useForm,\n  type FieldValues,\n  type SubmitHandler,\n  type DefaultValues,\n  type Resolver,\n  type UseFormReturn,\n  useFormContext,\n} from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Typography } from \"../../atoms/Typography/Typography\";\nimport {\n  createDefaultRenderers,\n  type FieldRef,\n  type Renderers,\n} from \"./renderers\";\nimport type { PathOf } from \"./paths\";\nimport {\n  Fragment,\n  memo,\n  useEffect,\n  useState,\n  type PropsWithChildren,\n} from \"react\";\nimport { Button, type ButtonProps } from \"../../atoms/Button\";\nimport { twMerge } from \"tailwind-merge\";\n\ntype Section<T extends FieldValues> = {\n  title?: string;\n  type: \"section\";\n  description?: string;\n  blocks: Block<T>[];\n  layout?: \"sidebar\" | \"inline\"; // sidebar: título/descripción a la izquierda, inline: dentro del card\n};\n\nexport type Block<T extends FieldValues> =\n  | FieldRef<T>\n  | Block<T>[]\n  | Section<T>\n  | { title: string }\n  | { type: \"step\"; title: string; content: Block<T>[] }\n  | { type: \"repeater\"; name: PathOf<T>; template: Block<T>[] };\n\nexport type Layout<T extends FieldValues> = Block<T>[];\ntype SchemaEq<T extends FieldValues> = z.ZodType<T>;\n\nexport type FormProps<TValues extends FieldValues> = {\n  schema: SchemaEq<TValues>;\n  layout: Layout<TValues>;\n  defaultValues?: DefaultValues<TValues>;\n  onSubmit?: SubmitHandler<TValues>;\n  mode?: \"onSubmit\" | \"onBlur\" | \"onChange\" | \"all\";\n  renderers?: Renderers<TValues>;\n  showDebugFormValues?: boolean;\n  submitButtonContainerClassName?: string;\n};\n\nfunction resolverFor<TValues extends FieldValues>(\n  schema: SchemaEq<TValues>\n): Resolver<TValues, unknown, TValues> {\n  return zodResolver(schema as z.ZodAny) as unknown as Resolver<\n    TValues,\n    unknown,\n    TValues\n  >;\n}\n\ntype RenderCtx<T extends FieldValues> = {\n  layout: Layout<T>;\n  methods: UseFormReturn<T>;\n  renderers: Renderers<T>;\n  submitButtonContainerClassName?: string;\n};\n\nfunction Row({\n  columns,\n  children,\n}: {\n  columns: number;\n  children: React.ReactNode;\n}) {\n  return (\n    <div\n      className=\"grid gap-4\"\n      style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n    >\n      {children}\n    </div>\n  );\n}\n\nfunction Cell({\n  span = 1,\n  children,\n}: {\n  span?: number;\n  children: React.ReactNode;\n}) {\n  return (\n    <div style={{ gridColumn: `span ${span} / span ${span}` }}>{children}</div>\n  );\n}\nfunction renderArrayBlocks<T extends FieldValues>({\n  blk,\n  key,\n  ctx,\n}: {\n  blk: Block<T>[];\n  ctx: RenderCtx<T>;\n  key: React.Key;\n}) {\n  const cols = blk.length || 1;\n  return (\n    <Row key={key} columns={cols}>\n      {blk.map((col, i) => {\n        const span = (col as FieldRef<T>)?.colSpan ?? 1;\n        const k = `${key}-c${i}`;\n        return (\n          <Cell span={span} key={k}>\n            {renderBlock(col, ctx, `${k}`)}\n          </Cell>\n        );\n      })}\n    </Row>\n  );\n}\nfunction Description({\n  title,\n  description,\n}: {\n  title?: string;\n  description?: string;\n}) {\n  return (\n    <div className=\"w-1/3 pr-12\">\n      {!!title && (\n        <Typography variant=\"body\" className=\"font-semibold\">\n          {title}\n        </Typography>\n      )}\n      {!!description && (\n        <Typography variant=\"body\" className=\"leading-none text-xs\">\n          {description}\n        </Typography>\n      )}\n    </div>\n  );\n}\n\nconst MemoizedDescription = memo(Description);\n\nfunction renderBlock<T extends FieldValues>(\n  blk: Block<T>,\n  ctx: RenderCtx<T>,\n  key: React.Key\n): React.ReactNode {\n  const { methods, renderers } = ctx;\n\n  if (Array.isArray(blk)) {\n    return renderArrayBlocks({ blk, ctx, key });\n  }\n\n  if (\"type\" in blk && blk.type === \"section\") {\n    const layout = blk.layout ?? \"sidebar\"; // default a sidebar para mantener compatibilidad\n\n    if (layout === \"inline\") {\n      // Layout inline: título y descripción dentro del card\n      return (\n        <div className=\"flex flex-col gap-y-6 shadow pb-10 px-8 pt-10 bg-white dark:bg-black/20 rounded-xs\" key={key}>\n          {(blk.title || blk.description) && (\n            <div className=\"mb-4\">\n              {!!blk.title && (\n                <Typography variant=\"body\" className=\"font-semibold mb-2\">\n                  {blk.title}\n                </Typography>\n              )}\n              {!!blk.description && (\n                <Typography variant=\"body\" className=\"leading-none text-xs text-gray-600 dark:text-gray-400\">\n                  {blk.description}\n                </Typography>\n              )}\n            </div>\n          )}\n          {blk.blocks.map((b, j) => (\n            <Fragment key={`${key}-s${j}`}>\n              {renderBlock(b, ctx, `${key}-s${j}`)}\n            </Fragment>\n          ))}\n        </div>\n      );\n    }\n\n    // Layout sidebar: título y descripción a la izquierda (comportamiento original)\n    return (\n      <div className=\"flex flex-row flex-1\" key={key}>\n        <MemoizedDescription title={blk.title} description={blk.description} />\n        <div className=\"flex flex-col gap-y-6 shadow pb-10 px-8 pt-10 bg-white dark:bg-black/20  rounded-xs w-7/12\">\n          {blk.blocks.map((b, j) => (\n            <Fragment key={`${key}-s${j}`}>\n              {renderBlock(b, ctx, `${key}-s${j}`)}\n            </Fragment>\n          ))}\n        </div>\n      </div>\n    );\n  }\n\n  if (\"title\" in blk) {\n    return (\n      <Typography variant=\"h2\" key={key}>\n        {blk.title}\n      </Typography>\n    );\n  }\n\n  const field = blk as FieldRef<T>;\n  const path = field.name as string;\n\n  switch (field.component) {\n    case \"multicheckbox\": {\n      const r = renderers.multicheckbox;\n      if (!r)\n        return (\n          <div key={key} className=\"text-red-600 text-sm\">\n            No renderer for \"multicheckbox\"\n          </div>\n        );\n      return <div key={key}>{r({ field, methods, path })}</div>;\n    }\n    case \"checkbox\": {\n      const r = renderers.checkbox;\n      if (!r)\n        return (\n          <div key={key} className=\"text-red-600 text-sm\">\n            No renderer for \"checkbox\"\n          </div>\n        );\n      return <div key={key}>{r({ field, methods, path })}</div>;\n    }\n    case \"input\": {\n      const r = renderers.input;\n      if (!r)\n        return (\n          <div key={key} className=\"text-red-600 text-sm\">\n            No renderer for \"input\"\n          </div>\n        );\n      return <div key={key}>{r({ field, methods, path })}</div>;\n    }\n    case \"textarea\": {\n      const r = renderers.textarea;\n      if (!r)\n        return (\n          <div key={key} className=\"text-red-600 text-sm\">\n            No renderer for \"textarea\"\n          </div>\n        );\n      return <div key={key}>{r({ field, methods, path })}</div>;\n    }\n    case \"combobox\": {\n      const r = renderers.combobox;\n      if (!r)\n        return (\n          <div key={key} className=\"text-red-600 text-sm\">\n            No renderer for \"combobox\"\n          </div>\n        );\n      return <div key={key}>{r({ field, methods, path })}</div>;\n    }\n  }\n}\n\nfunction keyForBlock<T extends FieldValues>(blk: Block<T>, i: number): string {\n  if (Array.isArray(blk)) return `row-${i}`;\n  if (\"type\" in blk && blk.type === \"section\")\n    return `section-${blk.title ?? i}`;\n  if (\"title\" in blk) return `title-${blk.title}-${i}`;\n  const f = blk as FieldRef<T>;\n  return `field-${f.name}-${i}`;\n}\n\nexport function RenderLayout<T extends FieldValues>(\n  props: PropsWithChildren<RenderCtx<T>>\n) {\n  const { layout, children, submitButtonContainerClassName } = props;\n  return (\n    <div className=\"gap-y-6 flex flex-col w-full ml\">\n      {layout.map((blk, i) => (\n        <Fragment key={keyForBlock(blk, i)}>\n          {renderBlock(blk, props, keyForBlock(blk, i))}\n        </Fragment>\n      ))}\n      <div className=\"flex flex-row flex-1\">\n        <div className=\"w-1/3\" />\n        <div\n          className={twMerge(\n            \"w-7/12 flex justify-end\",\n            submitButtonContainerClassName\n          )}\n        >\n          {children}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction FormValue() {\n  const { watch, getValues } = useFormContext();\n  const [state, setState] = useState<unknown>();\n\n  useEffect(() => {\n    const { unsubscribe } = watch(() => {\n      setState(getValues());\n    });\n    return () => unsubscribe();\n  }, [getValues, watch]);\n\n  return (\n    <pre className=\"mt-10 w-96 flex items-center justify-center text-wrap self-center\">\n      <code>{JSON.stringify(state, null, 2)}</code>\n    </pre>\n  );\n}\n\nexport function Form<TValues extends FieldValues>({\n  schema,\n  layout,\n  defaultValues,\n  onSubmit,\n  mode = \"onBlur\",\n  showDebugFormValues,\n  renderers,\n  submitButtonContainerClassName,\n  children,\n}: PropsWithChildren<FormProps<TValues>>) {\n  const methods = useForm<TValues, unknown, TValues>({\n    resolver: resolverFor(schema),\n    defaultValues,\n    mode,\n  });\n  const effectiveRenderers =\n    (renderers as Renderers<TValues>) ?? createDefaultRenderers<TValues>({});\n  return (\n    <FormProvider {...methods}>\n      <form onSubmit={methods.handleSubmit((vals) => onSubmit?.(vals))}>\n        <RenderLayout\n          layout={layout}\n          methods={methods}\n          children={children}\n          submitButtonContainerClassName={submitButtonContainerClassName}\n          renderers={effectiveRenderers}\n        />\n      </form>\n      {showDebugFormValues && <FormValue />}\n    </FormProvider>\n  );\n}\n\nexport function FormSubmitButton({ ...props }: ButtonProps) {\n  const { formState } = useFormContext();\n  return (\n    <Button {...props} disabled={!formState.isDirty || !formState.isValid} />\n  );\n}\n"]}