@customafk/lunas-ui 0.2.6 → 0.2.8

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 (150) hide show
  1. package/dist/{alert-DwdUOFaC.d.cts → alert-CA1RS1CG.d.cts} +5 -5
  2. package/dist/{alert-5MxGtf3j.d.mts → alert-DDL82_U3.d.mts} +5 -5
  3. package/dist/{badge-sL8O2yfv.d.mts → badge-Cg0e-djv.d.mts} +5 -5
  4. package/dist/{button-CEOQ3-82.d.cts → button-Bn54lPVz.d.cts} +3 -3
  5. package/dist/button-C6ybzxxj.mjs.map +1 -1
  6. package/dist/{button-BlQb81It.d.mts → button-C76drZpd.d.mts} +3 -3
  7. package/dist/button-CwDT3m4m.cjs.map +1 -1
  8. package/dist/data-display/statistic.d.mts +4 -4
  9. package/dist/{dialog-Bah7jLoO.d.cts → dialog-CNhwBcEl.d.cts} +12 -12
  10. package/dist/{dialog-DSg5IKmb.d.mts → dialog-D6ygAOSV.d.mts} +12 -12
  11. package/dist/dialogs/detail-dialog/components/sidebar.d.cts +1 -1
  12. package/dist/dialogs/detail-dialog/components/sidebar.d.mts +24 -24
  13. package/dist/features/descriptions/index.d.mts +1 -1
  14. package/dist/features/tables/index.cjs +1 -1
  15. package/dist/features/tables/index.d.cts +1 -1
  16. package/dist/features/tables/index.d.mts +1 -1
  17. package/dist/features/tables/index.mjs +1 -1
  18. package/dist/features/tanstack-form/index.d.cts +1 -1
  19. package/dist/features/tanstack-form/index.d.mts +1 -1
  20. package/dist/{index-Dktb6D35.d.mts → index-75nSAiSe.d.mts} +55 -55
  21. package/dist/{index-D4shnfqM.d.cts → index-aTMCQQms.d.cts} +55 -55
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.d.cts +5 -5
  24. package/dist/index.d.mts +6 -6
  25. package/dist/index.mjs +1 -1
  26. package/dist/{input-DAGzv97v.d.mts → input-D5dtkW6g.d.mts} +5 -5
  27. package/dist/{input-DPLvx5x8.d.cts → input-t2hpPP2K.d.cts} +3 -3
  28. package/dist/layouts/flex.d.cts +2 -2
  29. package/dist/layouts/flex.d.mts +4 -4
  30. package/dist/pages/FeatureDeveloping.d.cts +2 -2
  31. package/dist/pages/FeatureDeveloping.d.mts +2 -2
  32. package/dist/pages/FeatureFixing.d.cts +2 -2
  33. package/dist/pages/FeatureFixing.d.mts +2 -2
  34. package/dist/pages/NotAuthorized.d.mts +2 -2
  35. package/dist/pages/NotFound.d.mts +2 -2
  36. package/dist/tables-Cc3Wik4i.cjs +2 -0
  37. package/dist/tables-Cc3Wik4i.cjs.map +1 -0
  38. package/dist/tables-DrJKQPsT.mjs +2 -0
  39. package/dist/tables-DrJKQPsT.mjs.map +1 -0
  40. package/dist/tanstack-form-BmV2BXDz.cjs.map +1 -1
  41. package/dist/tanstack-form-CJ43hVb_.mjs.map +1 -1
  42. package/dist/typography/paragraph.d.cts +3 -3
  43. package/dist/typography/paragraph.d.mts +5 -5
  44. package/dist/typography/title.d.cts +2 -2
  45. package/dist/typography/title.d.mts +2 -2
  46. package/dist/ui/alert-dialog.d.cts +12 -12
  47. package/dist/ui/alert-dialog.d.mts +12 -12
  48. package/dist/ui/alert.d.cts +1 -1
  49. package/dist/ui/alert.d.mts +1 -1
  50. package/dist/ui/aspect-ratio.d.cts +2 -2
  51. package/dist/ui/aspect-ratio.d.mts +2 -2
  52. package/dist/ui/avatar.d.cts +4 -4
  53. package/dist/ui/avatar.d.mts +4 -4
  54. package/dist/ui/badge.d.mts +1 -1
  55. package/dist/ui/breadcrumb.d.cts +8 -8
  56. package/dist/ui/breadcrumb.d.mts +8 -8
  57. package/dist/ui/button-group.d.cts +4 -4
  58. package/dist/ui/button-group.d.mts +6 -6
  59. package/dist/ui/button.d.cts +1 -1
  60. package/dist/ui/button.d.mts +1 -1
  61. package/dist/ui/calendar.d.cts +4 -4
  62. package/dist/ui/calendar.d.mts +4 -4
  63. package/dist/ui/card.d.cts +8 -8
  64. package/dist/ui/card.d.mts +8 -8
  65. package/dist/ui/carousel.d.cts +1 -1
  66. package/dist/ui/carousel.d.mts +7 -7
  67. package/dist/ui/checkbox.d.cts +2 -2
  68. package/dist/ui/checkbox.d.mts +2 -2
  69. package/dist/ui/collapsible.d.mts +4 -4
  70. package/dist/ui/command.d.cts +11 -11
  71. package/dist/ui/command.d.mts +11 -11
  72. package/dist/ui/context-menu.d.cts +16 -16
  73. package/dist/ui/context-menu.d.mts +16 -16
  74. package/dist/ui/dialog.d.cts +1 -1
  75. package/dist/ui/dialog.d.mts +1 -1
  76. package/dist/ui/drawer.d.cts +11 -11
  77. package/dist/ui/drawer.d.mts +11 -11
  78. package/dist/ui/dropdown-menu.d.mts +16 -16
  79. package/dist/ui/empty.d.cts +9 -9
  80. package/dist/ui/empty.d.mts +7 -7
  81. package/dist/ui/field.d.cts +13 -13
  82. package/dist/ui/field.d.mts +24 -24
  83. package/dist/ui/file-uploader.d.cts +2 -2
  84. package/dist/ui/file-uploader.d.mts +2 -2
  85. package/dist/ui/form.d.cts +11 -11
  86. package/dist/ui/form.d.mts +11 -11
  87. package/dist/ui/hover-card.d.cts +4 -4
  88. package/dist/ui/hover-card.d.mts +4 -4
  89. package/dist/ui/input-otp.d.cts +5 -5
  90. package/dist/ui/input-otp.d.mts +5 -5
  91. package/dist/ui/input.d.cts +1 -1
  92. package/dist/ui/input.d.mts +1 -1
  93. package/dist/ui/inputs/search-input.d.cts +3 -3
  94. package/dist/ui/inputs/search-input.d.mts +3 -3
  95. package/dist/ui/item.d.cts +15 -15
  96. package/dist/ui/item.d.mts +15 -15
  97. package/dist/ui/label.d.cts +2 -2
  98. package/dist/ui/label.d.mts +2 -2
  99. package/dist/ui/menubar.d.cts +17 -17
  100. package/dist/ui/menubar.d.mts +17 -17
  101. package/dist/ui/multi-select.d.cts +2 -2
  102. package/dist/ui/multi-select.d.mts +3 -3
  103. package/dist/ui/navigation-menu.d.cts +11 -11
  104. package/dist/ui/navigation-menu.d.mts +11 -11
  105. package/dist/ui/pagination.d.cts +9 -9
  106. package/dist/ui/pagination.d.mts +9 -9
  107. package/dist/ui/popover.d.cts +6 -6
  108. package/dist/ui/popover.d.mts +6 -6
  109. package/dist/ui/progress.d.cts +2 -2
  110. package/dist/ui/progress.d.mts +2 -2
  111. package/dist/ui/radio-group.d.cts +3 -3
  112. package/dist/ui/radio-group.d.mts +3 -3
  113. package/dist/ui/resizable.d.cts +9 -9
  114. package/dist/ui/resizable.d.mts +9 -9
  115. package/dist/ui/scroll-area.d.cts +6 -6
  116. package/dist/ui/scroll-area.d.mts +6 -6
  117. package/dist/ui/select.d.cts +9 -9
  118. package/dist/ui/select.d.mts +9 -9
  119. package/dist/ui/separator.d.cts +2 -2
  120. package/dist/ui/separator.d.mts +2 -2
  121. package/dist/ui/sheet.d.cts +9 -9
  122. package/dist/ui/sheet.d.mts +9 -9
  123. package/dist/ui/sidebar.d.cts +28 -28
  124. package/dist/ui/sidebar.d.mts +28 -28
  125. package/dist/ui/skeleton.d.cts +2 -2
  126. package/dist/ui/skeleton.d.mts +2 -2
  127. package/dist/ui/slider.d.cts +2 -2
  128. package/dist/ui/slider.d.mts +2 -2
  129. package/dist/ui/sonner.d.cts +2 -2
  130. package/dist/ui/sonner.d.mts +2 -2
  131. package/dist/ui/spinner.d.cts +2 -2
  132. package/dist/ui/spinner.d.mts +2 -2
  133. package/dist/ui/switch.d.mts +2 -2
  134. package/dist/ui/table.d.cts +18 -18
  135. package/dist/ui/table.d.mts +18 -18
  136. package/dist/ui/tabs.d.cts +5 -5
  137. package/dist/ui/tabs.d.mts +5 -5
  138. package/dist/ui/textarea.d.cts +2 -2
  139. package/dist/ui/textarea.d.mts +2 -2
  140. package/dist/ui/toggle-group.d.cts +3 -3
  141. package/dist/ui/toggle-group.d.mts +3 -3
  142. package/dist/ui/toggle.d.cts +4 -4
  143. package/dist/ui/toggle.d.mts +4 -4
  144. package/dist/ui/tooltip.d.cts +5 -5
  145. package/dist/ui/tooltip.d.mts +5 -5
  146. package/package.json +1 -1
  147. package/dist/tables-CmOVrvXM.cjs +0 -2
  148. package/dist/tables-CmOVrvXM.cjs.map +0 -1
  149. package/dist/tables-cBo0_szt.mjs +0 -2
  150. package/dist/tables-cBo0_szt.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tanstack-form-BmV2BXDz.cjs","names":["Badge: React.FC<BadgeProps>","LabelPrimitive","InfoIcon","Tooltip","TooltipTrigger","HelpCircleIcon","TooltipContent","Separator","CheckboxField: React.FC<Props>","isSubmitting","Checkbox","ComboboxField: React.FC<ComboboxFieldProps>","Popover","PopoverTrigger","Button","PopoverContent","Command","CommandInput","CommandList","CommandGroup","CommandItem","label","CommandEmpty","DateField: React.FC<Props>","Popover","PopoverTrigger","Button","CalendarDaysIcon","PopoverContent","Calendar","EmailField: React.FC<Props>","isSubmitting","Input","AtSignIcon","XIcon","NumberInput: React.FC<TProps>","value","Input","NumberField: React.FC<NumberFieldProps>","isSubmitting","Loader2Icon","BanIcon","PasswordField: React.FC<Props>","isSubmitting","Input","EyeOffIcon","EyeIcon","RadioGroupField: React.FC<Props>","isSubmitting","RadioGroup","RadioGroupItem","SelectField: React.FC<Props>","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","PackagePlusIcon","SwitchPrimitive","SwitchField: React.FC<Props>","TextField: React.FC<Props>","isSubmitting","Input","XIcon","Loader2Icon","BanIcon","TextareaField: React.FC<Props>","isSubmitting","Textarea","Loader2Icon","BanIcon","TanStackActionSubmit: React.FC<{\n /** Button label text. Defaults to `'Submit'` when omitted. */\n label?: string;\n /** Additional CSS class names applied to the button element. */\n className?: string;\n}>","Button","TanStackActionsForm: React.FC<\n React.PropsWithChildren<{\n /**\n * Determines which submit button variant is rendered.\n * - `'create'` — shows an \"Add New\" button that resets the form on success.\n * - `'update'` — shows an \"Update\" button that resets the form on success.\n * Defaults to `'create'`.\n */\n type?: 'create' | 'update';\n }>\n>","Button","PlusIcon","ArrowDownToLine","SeparatorPrimitive","TanStackCardForm: React.FC<\n React.PropsWithChildren<{\n /** Bold heading text shown at the top of the card. */\n title: string;\n /** Optional secondary text rendered beneath the title. */\n description?: string;\n /** When provided, renders a danger \"Remove\" button in the card's top-right corner. */\n onDelete?: () => void | Promise<void>;\n }>\n>","Button","Trash2Icon","TanStackContainerForm: React.FC<React.PropsWithChildren>","CancelButton: React.FC<React.ComponentProps<'button'>>","Button","SubmitButton: React.FC<SubmitButtonProps>","Button","TanStackDialogForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the dialog title bar. */\n title: string;\n /** Custom label for the submit button. Defaults to the `SubmitButton` component's built-in label when omitted. */\n submitText?: string;\n /** Controlled open state of the dialog. */\n open?: boolean;\n /** Callback fired when the dialog open state changes; the form is reset on close. */\n onOpenChange?: (open: boolean) => void;\n }>\n>","open","Dialog","DialogPortal","DialogOverlay","DialogContent","DialogTitle","Separator","TanStackFieldGroup: React.FC<\n React.PropsWithChildren<{\n /** Primary label displayed above the field content. */\n label: string;\n /** Secondary descriptive text shown beneath the label. */\n description?: string;\n /** Supplementary helper note rendered below the field content. */\n helperText?: string;\n /** Layout orientation of the label-to-content axis. Defaults to `'responsive'`. */\n orientation?: 'horizontal' | 'vertical' | 'responsive';\n }>\n>","TanStackPopoverForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the panel header. */\n title: string;\n /** Controlled open state of the popover dialog. */\n open?: boolean;\n /** Additional CSS class names applied to the scrollable content area. */\n contentClassName?: string;\n /** Callback fired when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n }>\n>","DialogPrimitive","CloseButton","SectionHeader: React.FC<React.PropsWithChildren>","SectionMain: React.FC<React.PropsWithChildren>","TanStackSectionForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the section header bar. */\n title: string;\n }>\n>","TanStackTitleField: React.FC<{\n /** The heading text rendered as a legend element. */\n title: string;\n /** Optional supplementary text displayed beneath the title. */\n description?: string;\n /** Optional helper note shown below the description area. */\n helperText?: string;\n}>"],"sources":["../packages/components/features/tanstack-form/components/ui/badge.tsx","../packages/components/features/tanstack-form/components/ui/label.tsx","../packages/components/features/tanstack-form/components/ui/field.tsx","../packages/components/features/tanstack-form/components/fields/checkbox-field.tsx","../packages/components/features/tanstack-form/components/fields/combobox-field.tsx","../packages/components/features/tanstack-form/components/fields/date-field.tsx","../packages/components/features/tanstack-form/components/fields/email-field.tsx","../packages/components/ui/inputs/number-input.tsx","../packages/components/features/tanstack-form/components/fields/number-field.tsx","../packages/components/features/tanstack-form/components/fields/password-field.tsx","../packages/components/features/tanstack-form/components/fields/radio-group-field.tsx","../packages/components/features/tanstack-form/components/fields/select-field.tsx","../packages/components/features/tanstack-form/components/ui/switch.tsx","../packages/components/features/tanstack-form/components/fields/switch-field.tsx","../packages/components/features/tanstack-form/components/fields/text-field.tsx","../packages/components/features/tanstack-form/components/fields/textarea-field.tsx","../packages/components/features/tanstack-form/components/forms/action-submit.tsx","../packages/components/features/tanstack-form/components/forms/actions-form.tsx","../packages/components/features/tanstack-form/components/ui/separator.tsx","../packages/components/features/tanstack-form/components/forms/card-form.tsx","../packages/components/features/tanstack-form/components/forms/container-form.tsx","../packages/components/features/tanstack-form/components/ui/cancel-button.tsx","../packages/components/features/tanstack-form/components/ui/submit-button.tsx","../packages/components/features/tanstack-form/components/forms/dialog-form.tsx","../packages/components/features/tanstack-form/components/forms/group-field.tsx","../packages/components/features/tanstack-form/components/forms/popover-form.tsx","../packages/components/features/tanstack-form/components/forms/section-form.tsx","../packages/components/features/tanstack-form/components/forms/title-field.tsx","../packages/components/features/tanstack-form/tanstack-form.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\nconst badgeVariants = cva(['flex w-fit items-center justify-center rounded-full font-bold text-text-negative-strong'], {\n variants: {\n color: {\n default: 'bg-primary-strong',\n secondary: 'bg-secondary-strong',\n success: 'bg-success-strong',\n info: 'bg-info-strong',\n warning: 'bg-warning-strong',\n danger: 'border border-danger-strong bg-linear-to-b from-danger-strong/90 via-danger-strong to-danger-strong/90',\n },\n size: {\n xs: 'px-1.5 py-0.5 text-xs',\n sm: 'px-2 py-0.75 text-xs',\n md: 'px-2.5 py-0.75 text-sm',\n lg: 'px-3 py-1 text-sm',\n },\n },\n defaultVariants: {\n color: 'default',\n size: 'sm',\n },\n});\n\n/**\n * Props for the {@link Badge} component.\n */\ntype BadgeProps = React.PropsWithChildren<{\n /** Text content rendered inside the badge; takes precedence over `children` when both are provided. */\n label: string;\n /**\n * Color theme of the badge.\n * @default 'default'\n */\n color?: VariantProps<typeof badgeVariants>['color'];\n /**\n * Size variant controlling padding and font size.\n * @default 'sm'\n */\n size?: VariantProps<typeof badgeVariants>['size'];\n /** Additional Tailwind class names merged onto the root element. */\n className?: string;\n}>;\n\n/**\n * Pill-shaped status badge with configurable color and size, used primarily as the \"Required\" indicator inside form labels.\n *\n * @example\n * import { Badge } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Badge label=\"Required\" color=\"danger\" size=\"xs\" />\n */\nexport const Badge: React.FC<BadgeProps> = ({ label, color, size, className, children }) => {\n return (\n <div data-slot=\"required-indicator\" className={badgeVariants({ color, size, className })}>\n {label || children}\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Label as LabelPrimitive } from 'radix-ui';\nimport { Badge } from './badge';\n\n/**\n * Form field label that automatically renders a \"Required\" badge when the field is marked aria-required.\n *\n * @example\n * import { Label } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Label htmlFor=\"email\">Email address</Label>\n */\nfunction Label({ className, children, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n 'text-text-positive',\n 'flex w-full items-center justify-between',\n 'select-none font-medium text-sm/6 leading-none',\n 'group-data-[disabled=true]:pointer-events-none',\n 'group-data-[disabled=true]:opacity-50',\n 'peer-disabled:cursor-not-allowed',\n 'peer-disabled:opacity-50',\n 'aria-required:*:data-[slot=required-indicator]:inline-block',\n className\n )}\n {...props}\n >\n <span className=\"flex items-center gap-1\">{children}</span>\n <Badge label=\"Required\" color=\"danger\" size=\"xs\" className=\"hidden shrink-0\" />\n </LabelPrimitive.Root>\n );\n}\n\nexport { Label };\n","'use client';\n\nimport { memo, useMemo } from 'react';\n\nimport { HelpCircleIcon, InfoIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Separator } from '@/components/ui/separator';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Label } from './label';\n\nconst fieldVariants = cva('group/field flex w-full gap-2 data-[invalid=true]:text-danger *:data-[slot=field-content]:gap-0', {\n variants: {\n orientation: {\n vertical: ['flex-col *:w-full [&>.sr-only]:w-auto'],\n horizontal: [\n 'flex-row items-center',\n '*:data-[slot=field-label]:flex-auto',\n 'has-[>[data-slot=field-content]]:items-start',\n 'has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n responsive: [\n 'flex-col *:w-full [&>.sr-only]:w-auto',\n '@md/field-group:flex-row',\n '@md/field-group:items-center',\n '@md/field-group:gap-4',\n '@md/field-group:*:w-auto',\n '@md/field-group:*:data-[slot=field-content]:basis-1/2',\n '@md/field-group:*:data-[slot=field-content-main]:basis-1/2',\n '@md/field-group:*:data-[slot=field-label]:flex-auto',\n '@md/field-group:has-[>[data-slot=field-content]]:items-start',\n '@md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n});\n\n/**\n * Outermost `<fieldset>` wrapper that stacks multiple `Field` rows with consistent vertical spacing.\n *\n * @example\n * import { FieldSet } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldSet>\n * <Field><FieldLabel>Name</FieldLabel><FieldContent><input /></FieldContent></Field>\n * </FieldSet>\n */\nconst FieldSet = memo(({ className, ...props }: React.ComponentProps<'fieldset'>) => {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn('flex flex-col gap-6 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3', className)}\n {...props}\n />\n );\n});\nFieldSet.displayName = 'FieldSet';\n\n/**\n * Props for {@link FieldLegend}.\n */\ntype FieldLegendProps = React.ComponentProps<'legend'> & {\n /**\n * Visual weight of the legend text.\n * - `'legend'` — larger base-size text (section heading).\n * - `'label'` — smaller label-size text (matches field label weight).\n * @default 'legend'\n */\n variant?: 'legend' | 'label';\n};\n\n/**\n * `<legend>` element for a `<fieldset>`, styled as either a section heading or a compact label.\n *\n * @example\n * import { FieldSet, FieldLegend } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldSet>\n * <FieldLegend variant=\"legend\">Personal details</FieldLegend>\n * </FieldSet>\n */\nconst FieldLegend = memo(\n ({\n className,\n variant = 'legend',\n ...props\n }: FieldLegendProps) => {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn('mb-3 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base', className)}\n {...props}\n />\n );\n }\n);\nFieldLegend.displayName = 'FieldLegend';\n\n/**\n * Container `<div>` that groups a set of `Field` rows with container-query support for responsive layouts.\n *\n * @example\n * import { FieldGroup } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldGroup>\n * <Field>…</Field>\n * <Field>…</Field>\n * </FieldGroup>\n */\nconst FieldGroup = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n 'group/field-group @container/field-group',\n 'flex flex-col gap-7 pt-4',\n 'data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4',\n className\n )}\n {...props}\n />\n );\n});\nFieldGroup.displayName = 'FieldGroup';\n\n/**\n * Single form field row that arranges label, input, and meta elements with configurable orientation.\n *\n * @example\n * import { Field } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Field orientation=\"horizontal\">\n * <FieldLabel htmlFor=\"username\">Username</FieldLabel>\n * <FieldContent><input id=\"username\" /></FieldContent>\n * </Field>\n */\nconst Field = memo(({ className, orientation = 'vertical', ...props }: React.ComponentProps<'div'> & VariantProps<typeof fieldVariants>) => {\n return <div data-slot=\"field\" data-orientation={orientation} className={cn(fieldVariants({ orientation }), className)} {...props} />;\n});\nField.displayName = 'Field';\n\n/**\n * Flex column wrapper that houses the primary input control together with description and error slots.\n *\n * @example\n * import { FieldContent } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldContent>\n * <input type=\"text\" />\n * <FieldDescription>Enter your full name.</FieldDescription>\n * </FieldContent>\n */\nconst FieldContent = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return <div data-slot=\"field-content\" className={cn('group/field-content flex flex-col gap-1.5 leading-snug', className)} {...props} />;\n});\nFieldContent.displayName = 'FieldContent';\n\n/**\n * Positioned wrapper for the main input element that enables absolutely-placed adornments (icons, spinners).\n *\n * @example\n * import { FieldContentMain } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldContentMain>\n * <input type=\"text\" className=\"pr-8\" />\n * <SearchIcon className=\"absolute right-2 top-2\" />\n * </FieldContentMain>\n */\nconst FieldContentMain = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return <div data-slot=\"field-content-main\" className={cn('relative', className)} {...props} />;\n});\nFieldContentMain.displayName = 'FieldContentMain';\n\n/**\n * Styled `<label>` element for a `Field`, extending the base `Label` with field-group-aware spacing and border states.\n *\n * @example\n * import { FieldLabel } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldLabel htmlFor=\"email\" aria-required>Email</FieldLabel>\n */\nconst FieldLabel = memo(({ className, ...props }: React.ComponentProps<typeof Label>) => {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n 'group/field-label peer/field-label min-h-6 gap-1 font-medium leading-snug',\n 'has-[>[data-slot=field]]:w-full',\n 'has-[>[data-slot=field]]:flex-col',\n 'has-[>[data-slot=field]]:rounded-md',\n 'has-[>[data-slot=field]]:border',\n 'has-[>[data-slot=field]]:border-border',\n 'has-data-[state=checked]:border-primary',\n '*:data-[slot=field]:p-4 group-data-[disabled=true]/field:opacity-50',\n className\n )}\n {...props}\n />\n );\n});\nFieldLabel.displayName = 'FieldLabel';\n\n/**\n * Inline title element (non-`<label>`) for fields whose label cannot be a native `<label>`, such as custom checkbox groups.\n *\n * @example\n * import { FieldTitle } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldTitle>Notification preferences</FieldTitle>\n */\nconst FieldTitle = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return (\n <div\n data-slot=\"field-label\"\n className={cn('flex w-fit items-center gap-2 font-medium text-sm leading-snug group-data-[disabled=true]/field:opacity-50', className)}\n {...props}\n />\n );\n});\nFieldTitle.displayName = 'FieldTitle';\n\n/**\n * Supplementary hint text rendered below the input to guide the user, with support for inline anchor links.\n *\n * @example\n * import { FieldDescription } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldDescription>Must be at least 8 characters.</FieldDescription>\n */\nconst FieldDescription = memo(({ className, ...props }: React.ComponentProps<'p'>) => {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n // biome-ignore lint/security/noSecrets: true\n 'nth-last-2:-mt-1 font-normal text-text-positive-weak text-xs leading-normal last:mt-0 [&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4 [[data-variant=legend]+&]:-mt-1.5',\n className\n )}\n {...props}\n />\n );\n});\nFieldDescription.displayName = 'FieldDescription';\n\n/**\n * Props for {@link FieldNote}.\n */\ntype FieldNoteProps = React.ComponentProps<'div'> & {\n /**\n * When `false` the note is not rendered at all; useful for conditional display without wrapper conditionals.\n * @default true\n */\n isShow?: boolean;\n};\n\n/**\n * Highlighted informational callout box with an info icon, shown below a field to surface contextual guidance.\n *\n * @example\n * import { FieldNote } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldNote isShow={isDraftMode}>Changes are saved automatically in draft mode.</FieldNote>\n */\nconst FieldNote = memo(({ isShow = true, className, children, ...props }: FieldNoteProps) => {\n if (isShow === false) return null;\n return (\n <div\n data-slot=\"field-note\"\n className={cn(\n 'flex items-start gap-1.5 rounded border border-primary-muted/60 bg-primary-bg-subtle/80 px-2.5 py-2 text-text-positive-weak text-xs',\n className\n )}\n {...props}\n >\n <InfoIcon size={12} className=\"mt-0.5 shrink-0 text-primary/70\" />\n <span>{children}</span>\n </div>\n );\n});\nFieldNote.displayName = 'FieldNote';\n\n/**\n * Props for {@link FieldTooltip}.\n */\ntype FieldTooltipProps = {\n /** Text content displayed inside the tooltip when the help icon is hovered or focused. */\n tooltip: string;\n};\n\n/**\n * Small help-circle icon button that reveals a tooltip with additional field context on hover or focus.\n *\n * @example\n * import { FieldTooltip } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldLabel>\n * Password <FieldTooltip tooltip=\"Use at least one uppercase letter and one number.\" />\n * </FieldLabel>\n */\nconst FieldTooltip = memo(({ tooltip }: FieldTooltipProps) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"inline-flex cursor-default items-center text-text-positive-weak/70 hover:text-text-positive focus:outline-none\"\n >\n <HelpCircleIcon size={13} aria-hidden=\"true\" />\n <span className=\"sr-only\">More information</span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-xs text-balance\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n );\n});\nFieldTooltip.displayName = 'FieldTooltip';\n\n/**\n * Visual divider row that optionally displays a centered text label, used to separate logical sections within a `FieldGroup`.\n *\n * @example\n * import { FieldSeparator } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldSeparator>or</FieldSeparator>\n */\nconst FieldSeparator = memo(({ children, className, ...props }: React.PropsWithChildren<React.ComponentProps<'div'>>) => {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn('relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2', className)}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span className=\"relative mx-auto block w-fit bg-background px-2 text-text-positive-weak\" data-slot=\"field-separator-content\">\n {children}\n </span>\n )}\n </div>\n );\n});\nFieldSeparator.displayName = 'FieldSeparator';\n\n/**\n * Props for {@link FieldError}.\n */\ntype FieldErrorProps = React.ComponentProps<'div'> & {\n /**\n * Array of validation error objects, typically sourced from a form library's field-level error state.\n * Each entry may carry an optional `code` (e.g. `'invalid_type'`) and a human-readable `message`.\n * Rendered automatically when `children` is omitted.\n */\n errors?: Array<{ code?: string; message?: string } | undefined>;\n};\n\n/**\n * ARIA-live error region that renders field validation messages from either an explicit `errors` array or arbitrary `children`.\n *\n * @example\n * import { FieldError } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldError errors={field.state.meta.errors} />\n */\nconst FieldError = memo(\n ({\n className,\n children,\n errors,\n ...props\n }: FieldErrorProps) => {\n const content = useMemo(() => {\n if (children) {\n return children;\n }\n\n if (!errors) {\n return null;\n }\n\n if (errors?.length === 1 && errors[0]?.message) {\n return (\n <div className=\"flex flex-row items-center justify-start gap-x-0.5\">\n <p>{errors[0]?.code === 'invalid_type' ? 'Invalid format' : errors[0].message}</p>\n </div>\n );\n }\n\n return (\n <ul className=\"flex list-none flex-col\">\n {errors.map(error => {\n if (typeof error === 'string') return <li key={error}>{error}</li>;\n if (!error?.message) return null;\n return <li key={error.message}>{error.message}</li>;\n })}\n </ul>\n );\n }, [children, errors]);\n\n if (!content) {\n return null;\n }\n\n return (\n <div role=\"alert\" data-slot=\"field-error\" className={cn('w-full font-medium text-danger-strong text-xs', className)} {...props}>\n {content}\n </div>\n );\n }\n);\nFieldError.displayName = 'FieldError';\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldNote,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldContentMain,\n FieldTitle,\n FieldTooltip,\n};\n","'use client';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport type z from 'zod';\n\nimport type { TanStackFormCheckboxGroupFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport { Field, FieldContent, FieldContentMain, FieldDescription, FieldGroup, FieldLabel, FieldNote, FieldSeparator, FieldTooltip } from '../ui/field';\nimport { Checkbox } from '@/components/ui/checkbox';\n\n/**\n * Props for the CheckboxField component, derived from the TanStack Form checkbox group field schema.\n */\ntype Props = Pick<z.input<typeof TanStackFormCheckboxGroupFieldSchema>, 'label' | 'description' | 'orientation' | 'options' | 'helperText' | 'tooltip'>;\n\n/**\n * A TanStack Form-connected checkbox group field that manages an array of selected string values,\n * supporting multi-selection and submission-state disabling.\n *\n * @example\n * import { CheckboxField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"roles\">\n * {() => (\n * <CheckboxField\n * label=\"Roles\"\n * options={[\n * { value: 'admin', label: 'Admin' },\n * { value: 'editor', label: 'Editor' },\n * ]}\n * helperText=\"Select one or more roles\"\n * />\n * )}\n * </form.Field>\n */\nexport const CheckboxField: React.FC<Props> = ({ label, description, options, tooltip, helperText, orientation }) => {\n const field = useTanStackFieldContext<string[] | null>();\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation}>\n <FieldContent>\n <FieldLabel>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContent>\n <FieldContentMain>\n <FieldGroup className=\"flex flex-col gap-y-2\">\n {options.map(option => {\n return (\n <Field key={option.value} orientation=\"horizontal\">\n <Checkbox\n id={`${field.name}-${option.value}`}\n name={field.name}\n checked={field.state.value?.includes(option.value) ?? false}\n disabled={isSubmitting}\n onCheckedChange={checked => {\n if (checked && field.state.value !== null) {\n field.pushValue(option.value);\n } else if (checked && field.state.value === null) {\n field.setValue([option.value]);\n } else if (!checked && field.state.value !== null) {\n const index = field.state.value.indexOf(option.value);\n if (index > -1) field.removeValue(index);\n } else {\n field.setValue(null);\n }\n }}\n />\n <FieldLabel htmlFor={`${field.name}-${option.value}`} className=\"text-text-positive\">\n {option.label}\n </FieldLabel>\n </Field>\n );\n })}\n </FieldGroup>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Field, FieldContent, FieldContentMain, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldSeparator, FieldTooltip } from '../ui/field';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { useTanStackFieldContext } from '../../tanstack-form';\n\n/**\n * Props for the ComboboxField component.\n */\ntype ComboboxFieldProps = {\n /** Visible label rendered above the combobox trigger. */\n label: string;\n /** Optional supporting text displayed beneath the label. */\n description?: string;\n /** Placeholder shown inside the trigger button and the search input when no value is selected. */\n placeholder?: string;\n /** Tooltip content rendered next to the label via an icon button. */\n tooltip?: string;\n /** Layout orientation of the label/field pair. Defaults to `'responsive'`. */\n orientation?: 'horizontal' | 'vertical' | 'responsive';\n /** Array of selectable options, each with a string `value` and display `label`. */\n options: Array<{ value: string; label: string }>;\n};\n\n/**\n * A TanStack Form-connected searchable combobox field powered by Radix UI Popover\n * and a Command menu, allowing the user to filter and select a single string value.\n *\n * @example\n * import { ComboboxField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"city\">\n * {() => (\n * <ComboboxField\n * label=\"City\"\n * placeholder=\"Search city…\"\n * options={[\n * { value: 'tokyo', label: 'Tokyo' },\n * { value: 'hanoi', label: 'Hanoi' },\n * ]}\n * />\n * )}\n * </form.Field>\n */\nexport const ComboboxField: React.FC<ComboboxFieldProps> = ({ label, description, placeholder, tooltip, orientation = 'responsive', options }) => {\n const field = useTanStackFieldContext<string | null>();\n\n const _isInvalid = useMemo(() => {\n return field.state.meta.isTouched && !field.state.meta.isValid;\n }, [field.state.meta.isTouched, field.state.meta.isValid]);\n\n const _errors = useMemo(() => {\n return field.state.meta.errors;\n }, [field.state.meta.errors]);\n\n const selectedLabel = options.find(({ value }) => value === field.state.value)?.label;\n\n return (\n <FieldGroup className=\"px-4\">\n <Field orientation={orientation} data-invalid={_isInvalid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex justify-end\">\n <div className=\"flex w-full max-w-60 flex-col\">\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n className={cn(\n 'flex items-center justify-start rounded outline-border',\n 'hover:bg-transparent',\n 'focus:outline-1 focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak',\n 'data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak',\n !field.state.value && 'text-text-positive-muted'\n )}\n >\n {selectedLabel ? (\n <p className=\"flex min-w-0 flex-1 items-center gap-2 text-start\">{selectedLabel}</p>\n ) : (\n <p className=\"flex-1 text-start text-text-positive-muted\">{placeholder}</p>\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent align=\"end\" side=\"bottom\" className=\"flex w-fit rounded p-0\" onBlur={field.handleBlur}>\n <Command className=\"border-none\">\n <CommandInput placeholder={placeholder ?? 'Search…'} />\n <CommandList>\n <CommandGroup className=\"max-h-40 overflow-y-auto\">\n {options.map(({ value, label }) => (\n <CommandItem key={value} value={label} onSelect={() => field.handleChange(value)}>\n {label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n </Command>\n </PopoverContent>\n </Popover>\n\n <div className=\"mt-1 flex w-full flex-col items-end justify-end\">\n <FieldError errors={_errors} />\n </div>\n </div>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { CalendarDaysIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { endOfToday, endOfTomorrow, endOfYesterday, format, lastDayOfMonth, startOfMonth, subDays } from '@customafk/react-toolkit/date-fns';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\n\nimport type { TanStackFormDateFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport { Field, FieldContent, FieldContentMain, FieldDescription, FieldGroup, FieldLabel, FieldNote, FieldSeparator, FieldTooltip } from '../ui/field';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar } from '@/components/ui/calendar';\n\n/**\n * Props for the DateField component, derived from the TanStack Form date field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormDateFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'tooltip' | 'helperText' | 'orientation' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** Earliest selectable date; days before this are hidden in the calendar. */\n minDate?: Date;\n /** Latest selectable date; days after this are hidden in the calendar. */\n maxDate?: Date;\n};\n\n/**\n * A TanStack Form-connected date picker field combining a calendar popover with\n * quick-select presets (Today, Tomorrow, Yesterday, Last N Days, This/Last Month).\n *\n * @example\n * import { DateField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"dueDate\">\n * {() => (\n * <DateField\n * label=\"Due date\"\n * placeholder=\"Pick a date\"\n * minDate={new Date()}\n * required\n * />\n * )}\n * </form.Field>\n */\nexport const DateField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n orientation = 'responsive',\n tooltip,\n helperText,\n minDate,\n maxDate,\n required,\n}) => {\n const field = useTanStackFieldContext<Date | null>();\n\n const _isEmpty = useMemo(() => {\n if (required) return field.state.value === null;\n return false;\n }, [required, field.state.value]);\n\n const _isInvalid = useMemo(() => {\n return field.state.meta.isTouched && !field.state.meta.isValid;\n }, [field.state.meta.isTouched, field.state.meta.isValid]);\n\n return (\n <FieldGroup className=\"px-4\">\n <Field orientation={orientation} data-invalid={_isInvalid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex flex-col space-y-1\">\n <div className=\"flex w-full flex-col\">\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n className={cn(\n 'flex items-center justify-between rounded font-normal outline-border',\n 'hover:bg-transparent',\n 'focus:outline-1 focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak',\n 'data-[state=open]:text-text-positive-muted',\n 'data-[state=open]:outline-1',\n 'data-[state=open]:outline-primary-strong',\n 'data-[state=open]:ring-4',\n 'data-[state=open]:ring-primary-weak',\n field.state.value === null && 'text-text-positive-muted'\n )}\n >\n <p>{field.state.value === null ? placeholder || 'Select date' : format(field.state.value, 'PPPP')}</p>\n <CalendarDaysIcon strokeWidth={1} />\n </Button>\n </PopoverTrigger>\n\n <PopoverContent align=\"start\" side=\"bottom\" className=\"flex w-fit min-w-0 overflow-y-auto rounded p-0\" onBlur={field.handleBlur}>\n <div className=\"flex h-full flex-col space-y-2 border-r border-r-border p-2 [&>button]:justify-start [&>button]:text-sm\">\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(endOfToday());\n }}\n >\n Today\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(endOfTomorrow());\n }}\n >\n Tomorrow\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(endOfYesterday());\n }}\n >\n Yesterday\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(subDays(endOfToday(), 3));\n }}\n >\n Last 3 Days\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(subDays(endOfToday(), 7));\n }}\n >\n Last 7 Days\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(subDays(endOfToday(), 30));\n }}\n >\n Last 30 Days\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(startOfMonth(endOfToday()));\n }}\n >\n This Month\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(lastDayOfMonth(endOfToday()));\n }}\n >\n Last Month\n </Button>\n </div>\n <div className=\"flex flex-1 flex-col\">\n <div className=\"min-w-73 border-b border-b-border p-2\">\n <Calendar\n mode=\"single\"\n selected={field.state.value ?? undefined}\n hidden={{\n before: minDate ?? new Date(1900, 0, 1),\n after: maxDate ?? new Date(2100, 11, 31),\n }}\n onSelect={date => {\n if (!date) return;\n field.handleChange(date);\n }}\n />\n </div>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { AtSignIcon, XIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\nimport { useTanStackFieldContext } from '../../tanstack-form';\n\nimport type { TanStackFormEmailFieldSchema } from '../../schema';\n\n/**\n * Props for the EmailField component, derived from the TanStack Form email field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormEmailFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'orientation' | 'tooltip' | 'helperText' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** Maximum number of characters the user may enter. */\n maxLength?: number;\n};\n\n/**\n * A TanStack Form-connected email input field with an at-sign prefix icon,\n * optional clear button, and inline validation error display.\n *\n * @example\n * import { EmailField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"email\">\n * {() => (\n * <EmailField\n * label=\"Email address\"\n * placeholder=\"you@example.com\"\n * required\n * />\n * )}\n * </form.Field>\n */\nexport const EmailField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n tooltip,\n helperText,\n orientation = 'responsive',\n showErrorMessage = true,\n required = false,\n maxLength,\n}) => {\n const { form, name, state, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n\n const _invalid = state.meta.isDirty && state.meta.isTouched && !state.meta.isValid;\n const _isEmpty = required && state.value === null;\n const _showClear = !isSubmitting && !!state.value;\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n ({ target: { value } }) => {\n if (isSubmitting) return;\n if (maxLength && value.length > maxLength) return;\n handleChange(value || null);\n },\n [isSubmitting, maxLength, handleChange]\n );\n\n const onClear = useCallback(() => {\n if (isSubmitting) return;\n handleChange(null);\n }, [isSubmitting, handleChange]);\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field data-invalid={_invalid} orientation={orientation}>\n <FieldContent>\n <FieldLabel htmlFor={name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n <Input\n id={name}\n name={name}\n value={state.value === null ? '' : state.value}\n aria-invalid={_invalid}\n autoComplete=\"email\"\n placeholder={placeholder}\n className={cn('pl-9', _showClear && 'pr-9', isSubmitting && 'pointer-events-none bg-muted-muted opacity-60')}\n onBlur={handleBlur}\n onChange={onChange}\n />\n <div className=\"absolute top-0 left-0 flex size-9 items-center justify-center text-muted\">\n <AtSignIcon size={14} />\n </div>\n\n {_showClear && (\n <button\n type=\"button\"\n aria-label=\"Clear\"\n className=\"absolute inset-e-0 inset-y-0 top-3 flex h-fit w-8 cursor-pointer items-center justify-center rounded-e-md text-text-positive-weak outline-none transition-[color,box-shadow] hover:text-text-positive focus:text-text-positive-strong\"\n onClick={onClear}\n >\n <XIcon size={14} aria-hidden=\"true\" />\n </button>\n )}\n\n <div className=\"mt-1 flex w-full items-start justify-start\">\n {showErrorMessage && state.meta.isDirty && <FieldError errors={state.meta.errors} />}\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\n\nconst createValidationRegex = (allowNegative: boolean): RegExp => {\n return allowNegative ? /^-?\\d*\\.?\\d*$/ : /^\\d*\\.?\\d*$/;\n};\n\nconst formatNumberWithCommas = (num: number | string): string => {\n return Number(num).toLocaleString();\n};\n\nconst customRoundedValue = (value: number, precision: number, roundingRule: 'up' | 'down' | 'nearest' | 'none') => {\n if (roundingRule === 'none') return value;\n\n const factor = 10 ** precision;\n const scaledValue = value * factor;\n\n switch (roundingRule) {\n case 'up':\n return Math.ceil(scaledValue) / factor;\n case 'down':\n return Math.floor(scaledValue) / factor;\n case 'nearest': {\n if (scaledValue % 1 < 0.1) return Math.floor(scaledValue) / factor;\n if (scaledValue % 1 >= 0.59) return Math.ceil(scaledValue) / factor;\n return (Math.floor(scaledValue) + 0.5) / factor;\n }\n default: {\n return value;\n }\n }\n};\n\ntype TProps = React.HTMLAttributes<HTMLInputElement> & {\n /**\n * Description: Value for the text field\n *\n * Default: ''\n *\n * Usage: Value for the text field\n */\n value?: number | null | undefined;\n /**\n * Description: Disabled state of the text field\n *\n * Default: `false`\n *\n * Usage: Disabled state of the text field\n *\n * Note: If true, the text field will be disabled\n */\n disabled?: boolean;\n /**\n * Description: Readonly state of the text field\n *\n * Default: `false`\n *\n * Usage: Readonly state of the text field\n */\n readOnly?: boolean;\n /**\n * Description: Allow negative value for the text field\n *\n * Default: `false`\n *\n * Usage: Allow negative value for the text field\n */\n allowNegative?: boolean;\n /**\n * Description: Decimal point for the text field\n *\n * Default: `undefined`\n *\n * Usage: Ex: [12,3] => console.log(2323.23) // True\n *\n * Note: IF use this prop, `numberAfterDecimalPoint` will be ignored\n */\n decimal?: [number, number];\n /**\n * Description: Rounding rule for the text field\n *\n * Default: `nearest`\n *\n * Usage: Rounding rule for the text field\n * - 'up': Round up\n * - 'down': Round down\n * - 'nearest': Round to nearest\n * - 'none': No rounding\n *\n * E.g.\n * - Value: 2.135, precision: 2\n * - 'up' => 2.14\n * - 'down' => 2.13\n * - 'nearest' => 2.13\n * - 'none' => 2.135\n */\n roundingRule?: 'up' | 'down' | 'nearest' | 'none';\n /**\n * Description: Number of digits after the decimal point\n *\n * Default: `2`\n *\n * Usage: Number of digits after the decimal point\n */\n numberAfterDecimalPoint?: number;\n /**\n * Description: Placeholder for the text field\n *\n * Default: ''\n *\n * Usage: Placeholder for the text field\n */\n placeholder?: string;\n /**\n * Description: Unit text for the text field\n *\n * Default: ''\n *\n * E.g. 'kg', 'm', 'USD'...\n */\n unitText?: string;\n /**\n * Description: Invalid state of the text field\n *\n * Default: `false`\n *\n * Usage: Invalid state of the text field\n */\n invalid?: boolean;\n /**\n * Description: Precision for the text field\n *\n * Default: `undefined`\n * E.g.\n * - 2.13 => 2.1 when precision is 1\n * - 2.134 => 2.13 when precision is 2\n */\n precision?: number;\n /**\n * Description: Callback function for the value change\n * Usage: Callback function for the value change\n */\n wrapperClassName?: string;\n /**\n * Description: Callback function for the value change\n * Usage: Callback function for the value change\n */\n onValueChange?: (value: number | null) => void;\n /**\n * Description: Callback function for the blur event\n * Usage: Callback function for the blur event\n */\n onBlur?: () => void;\n};\n/**\n * ## Unit Text Field Component\n *\n * **Description**: This component is to display common text field with unit\n *\n * **Usage**: Text field with unit example: 1000 (kg), 100 (m), 1000 (USD)...\n */\nexport const NumberInput: React.FC<TProps> = ({\n disabled = false,\n readOnly = false,\n allowNegative = false,\n numberAfterDecimalPoint = 2,\n roundingRule = 'none',\n value = null,\n unitText,\n decimal,\n placeholder,\n precision,\n wrapperClassName,\n className,\n onChange,\n onValueChange,\n onFocus,\n onBlur,\n ...props\n}) => {\n const _unitRef = useRef<HTMLSpanElement>(null);\n const _inputRef = useRef<HTMLInputElement>(null);\n\n const [_value, _setValue] = useState<string | null>(value?.toString() ?? null);\n\n // Memoized values for validation and formatting\n const maxDecimalPlaces = useMemo(() => decimal?.[1] ?? numberAfterDecimalPoint, [decimal, numberAfterDecimalPoint]);\n const maxIntegerLength = useMemo(() => decimal && decimal[0] - decimal[1], [decimal]);\n const validationRegex = useMemo(() => createValidationRegex(allowNegative), [allowNegative]);\n\n // Validate decimal point is less than or equal to the limit\n const validateDecimalPoint = useCallback(\n (value: string) => {\n if (!maxDecimalPlaces || value === '-') return true;\n\n const [integerPart, decimalPart = ''] = value.split('.') as [string, string];\n const integerPartLength = integerPart.startsWith('-') ? integerPart.length - 1 : integerPart.length;\n const decimalPartLength = decimalPart.length;\n\n return decimalPartLength <= maxDecimalPlaces && integerPartLength <= (maxIntegerLength ?? Infinity);\n },\n [maxDecimalPlaces, maxIntegerLength]\n );\n const formattedValue = useCallback(\n (val: string) => {\n if (val === '0') return '0';\n if (!Number(val)) return null;\n\n const numValue = parseFloat(val);\n const effectivePrecision = Math.min(maxDecimalPlaces - 1, precision || 0);\n const roundedValue = customRoundedValue(numValue, effectivePrecision, roundingRule).toString();\n const [integerPart, decimalPart = ''] = roundedValue.split('.');\n const formattedInteger = formatNumberWithCommas(integerPart);\n return decimalPart ? `${formattedInteger}.${decimalPart}` : formattedInteger;\n },\n [maxDecimalPlaces, precision, roundingRule]\n );\n\n const handleZeroCase = useCallback(\n (value: string) => {\n // Check for zero\n const isZero = value === '0';\n // Check for negative zero patterns. E.g., '-0', '-0.0', '-0.000', '-0.'\n const isNegativeZero = value === '-' || /^-0+(\\.0+)?$/.test(value) || /^-0*\\.$/.test(value);\n if (isZero) {\n onValueChange?.(0);\n _setValue(value);\n return;\n }\n if (isNegativeZero) {\n _setValue(() => {\n onValueChange?.(0);\n return value;\n });\n return;\n }\n },\n [onValueChange]\n );\n const handleChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n e => {\n // Don't prevent default behavior of input change\n onChange?.(e);\n\n // Custom event handler for value change\n const { value: inputValue } = e.target;\n\n // Handle empty input\n if (inputValue === '' || inputValue === undefined) {\n onValueChange?.(null);\n _setValue(null);\n return;\n }\n\n // Handle zero and negative zero\n handleZeroCase(inputValue);\n\n // Validate input format\n if (!validationRegex.test(inputValue) || !validateDecimalPoint(inputValue)) return;\n\n const numericValue = parseFloat(inputValue) || 0;\n onValueChange?.(numericValue);\n _setValue(inputValue);\n },\n [validateDecimalPoint, onChange, onValueChange, handleZeroCase, validationRegex]\n );\n\n const handleFocus = useCallback<React.FocusEventHandler<HTMLInputElement>>(\n e => {\n if (readOnly) return;\n onFocus?.(e);\n _setValue(prev => (typeof prev === 'string' ? prev.replace(/,/g, '') : null)); // Remove commas for easier editing\n },\n [readOnly, onFocus]\n );\n\n const handleBlur = useCallback<React.FocusEventHandler<HTMLInputElement>>(\n e => {\n if (readOnly) return;\n onBlur?.(e);\n _setValue(prev => {\n if (prev === null) return null;\n const isZero = prev === '0' || prev === '-' || /^-0+(\\.0+)?$/.test(prev) || /^-0*\\.$/.test(prev);\n if (isZero) return '0';\n return typeof prev === 'string' ? formattedValue(prev) : null;\n });\n },\n [readOnly, formattedValue, onBlur]\n );\n\n // Set initial value\n useEffect(() => {\n const isFocused = document.activeElement === _inputRef.current;\n\n if (value === undefined || value === null || !validationRegex.test(value.toString()) || !validateDecimalPoint(value.toString())) {\n _setValue(null);\n return;\n }\n\n _setValue(prev => (isFocused ? prev : formattedValue(value.toString())));\n }, [formattedValue, value, validateDecimalPoint, validationRegex]);\n\n // Set padding right for the input field\n useEffect(() => {\n if (!_unitRef.current || !_inputRef.current || !unitText) return;\n const unitWidth = _unitRef.current.offsetWidth;\n _inputRef.current.style.setProperty('padding-right', `${(unitWidth + 10) / 16}rem`);\n }, [unitText]);\n\n return (\n <div className={cn('relative', wrapperClassName)}>\n <Input\n {...props}\n ref={_inputRef}\n value={_value || (readOnly ? '0' : '')}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n className={cn('text-end font-number text-sm slashed-zero lining-nums tabular-nums', readOnly && 'bg-muted text-muted-foreground', className)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n {unitText && (\n <span ref={_unitRef} className=\"-translate-y-1/2 pointer-events-none absolute top-1/2 right-2 text-muted-foreground text-sm\">\n {unitText}\n </span>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { BanIcon, Loader2Icon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { NumberInput } from '@/components/ui/inputs/number-input';\n\nimport type { TanStackFormNumberFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\n/**\n * Props for the NumberField component, derived from the TanStack Form number field schema.\n */\ntype NumberFieldProps = Pick<\n z.input<typeof TanStackFormNumberFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'orientation' | 'tooltip' | 'helperText' | 'rounding' | 'decimalPlaces' | 'percision' | 'unit' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** When true, the input accepts negative numbers. */\n allowNegative?: boolean;\n};\n\n/**\n * A TanStack Form-connected numeric input field supporting rounding rules,\n * decimal precision, unit labels, and submission-state feedback.\n *\n * @example\n * import { NumberField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"quantity\">\n * {() => (\n * <NumberField\n * label=\"Quantity\"\n * placeholder=\"0\"\n * unit=\"pcs\"\n * decimalPlaces={2}\n * required\n * />\n * )}\n * </form.Field>\n */\nexport const NumberField: React.FC<NumberFieldProps> = ({\n label,\n description,\n placeholder,\n\n tooltip,\n helperText,\n orientation = 'responsive',\n showErrorMessage = true,\n rounding,\n decimalPlaces,\n percision,\n unit,\n\n required,\n allowNegative,\n}) => {\n const field = useTanStackFieldContext<number | null>();\n\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n\n const _errors = field.state.meta.errors;\n const _isEmpty = required ? field.state.value === null : false;\n\n const onValueChange = useCallback(\n (value: number | null) => {\n if (isSubmitting) return;\n field.handleChange(value);\n },\n [isSubmitting, field.handleChange]\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={field.state.meta.isTouched && !field.state.meta.isValid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain>\n <div className=\"relative w-full\">\n <NumberInput\n id={field.name}\n value={field.state.value}\n aria-invalid={field.state.meta.isTouched && !field.state.meta.isValid && field.state.meta.isDirty}\n placeholder={placeholder}\n roundingRule={rounding}\n numberAfterDecimalPoint={decimalPlaces}\n precision={percision}\n unitText={unit}\n allowNegative={allowNegative}\n className={cn(isSubmitting && 'pointer-events-none bg-muted-muted opacity-60')}\n onBlur={field.handleBlur}\n onValueChange={onValueChange}\n />\n {isSubmitting && (\n <div className=\"absolute inset-s-2 inset-y-0 top-2.5 text-muted-weak [&>svg]:size-3.5\">\n <Loader2Icon className=\"animate-spin text-primary-strong\" />\n </div>\n )}\n {field.state.meta.isDirty && showErrorMessage && !!_errors.length && (\n <div className=\"absolute inset-s-2 inset-y-0 top-2.75 text-danger-strong [&>svg]:size-3.5\">\n <BanIcon />\n </div>\n )}\n <div className=\"mt-1 flex w-full flex-col items-end justify-end\">\n {field.state.meta.isDirty && showErrorMessage && <FieldError errors={_errors} />}\n </div>\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useCallback, useId, useState } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { EyeIcon, EyeOffIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { Input } from '@/components/ui/input';\n\nimport type { TanStackFormPasswordFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\n/**\n * Props for the PasswordField component, derived from the TanStack Form password field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormPasswordFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'orientation' | 'tooltip' | 'helperText' | 'showErrorMessage'\n>;\n\n/**\n * A TanStack Form-connected password input field with a show/hide toggle button\n * and inline validation error display.\n *\n * @example\n * import { PasswordField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"password\">\n * {() => (\n * <PasswordField\n * label=\"Password\"\n * placeholder=\"Enter your password\"\n * helperText=\"Must be at least 8 characters\"\n * />\n * )}\n * </form.Field>\n */\nexport const PasswordField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n orientation = 'responsive',\n tooltip,\n helperText,\n showErrorMessage = true,\n}) => {\n const id = useId();\n const { form, name, state, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n\n const [isVisible, setIsVisible] = useState<boolean>(false);\n\n const _invalid = state.meta.isDirty && state.meta.isTouched && !state.meta.isValid;\n\n const toggleVisibility = useCallback(() => setIsVisible(prev => !prev), []);\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n ({ target: { value } }) => {\n if (isSubmitting) return;\n handleChange(value || null);\n },\n [isSubmitting, handleChange]\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field data-invalid={_invalid} orientation={orientation}>\n <FieldContent>\n <FieldLabel htmlFor={id}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n <Input\n id={id}\n name={name}\n type={isVisible ? 'text' : 'password'}\n placeholder={placeholder}\n value={state.value ?? ''}\n aria-invalid={_invalid}\n autoComplete=\"new-password\"\n onBlur={handleBlur}\n onChange={onChange}\n />\n\n <button\n className=\"absolute inset-e-0 inset-y-0 flex size-9 items-center justify-center rounded-e-md text-muted outline-none transition-[color,box-shadow] focus:z-10 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n type=\"button\"\n onClick={toggleVisibility}\n aria-label={isVisible ? 'Hide password' : 'Show password'}\n aria-pressed={isVisible}\n aria-controls={id}\n >\n {isVisible ? <EyeOffIcon size={16} aria-hidden=\"true\" /> : <EyeIcon size={16} aria-hidden=\"true\" />}\n </button>\n\n <div className=\"mt-1 flex w-full items-start justify-start\">\n {showErrorMessage && state.meta.isDirty && <FieldError errors={state.meta.errors} />}\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport type { TanStackFormRadioGroupFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTitle,\n FieldTooltip,\n} from '../ui/field';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\n\ntype Props = Pick<z.input<typeof TanStackFormRadioGroupFieldSchema>, 'label' | 'description' | 'options' | 'orientation' | 'helperText' | 'tooltip'>;\n\nexport const RadioGroupField: React.FC<Props> = ({ label, description, orientation, options, tooltip, helperText }) => {\n const field = useTanStackFieldContext<string | null>();\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n\n return (\n <FieldGroup className=\"px-4\">\n <Field orientation={orientation} className=\"flex-col gap-2\">\n <FieldContent>\n <FieldLabel>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContent>\n\n <FieldContentMain>\n <RadioGroup value={field.state.value ?? ''} className=\"w-full\" onValueChange={field.handleChange}>\n {options.map(option => (\n <FieldLabel\n key={option.value}\n className={cn(\n 'h-fit',\n field.state.value === option.value && 'border-primary-weak! bg-primary-bg-subtle',\n isSubmitting && 'pointer-events-none bg-muted-muted opacity-60',\n field.state.value === option.value && isSubmitting && 'border-border-strong!'\n )}\n >\n <Field orientation=\"horizontal\" className=\"items-start gap-3 rounded p-2!\">\n <RadioGroupItem value={option.value} className=\"mt-0.5 shrink-0\" />\n <FieldContent className=\"gap-0.5!\">\n <FieldTitle>{option.label}</FieldTitle>\n <FieldDescription className=\"text-xs\">{option.description}</FieldDescription>\n </FieldContent>\n </Field>\n </FieldLabel>\n ))}\n </RadioGroup>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { PackagePlusIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport type { TanStackFormSelectFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\n\n/**\n * Props for the SelectField component, derived from the TanStack Form select field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormSelectFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'defaultValue' | 'options' | 'tooltip' | 'helperText' | 'orientation' | 'clearable'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n};\n\n/**\n * A TanStack Form-connected single-select dropdown field backed by Radix UI Select,\n * with an empty-state illustration when no options are provided.\n *\n * @example\n * import { SelectField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"country\">\n * {() => (\n * <SelectField\n * label=\"Country\"\n * placeholder=\"Select a country\"\n * options={[\n * { value: 'jp', label: 'Japan' },\n * { value: 'vn', label: 'Vietnam' },\n * ]}\n * required\n * />\n * )}\n * </form.Field>\n */\nexport const SelectField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n\n orientation = 'responsive',\n\n tooltip,\n options,\n helperText,\n required = false,\n}) => {\n const field = useTanStackFieldContext<string | null>();\n\n const _isInvalid = field.state.meta.isTouched && !field.state.meta.isValid;\n const _isEmpty = required && field.state.value === null;\n const _errors = field.state.meta.errors;\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_isInvalid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain className=\"flex flex-col\">\n <Select value={field.state.value ?? ''} onValueChange={field.handleChange}>\n <SelectTrigger aria-invalid={_isInvalid ? 'true' : undefined} onBlur={field.handleBlur}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {!!options.length &&\n options.map(option => {\n return (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n );\n })}\n {!options.length && (\n <div className=\"flex items-center justify-center gap-x-2 rounded border border-border bg-muted-muted px-4 py-6.5 text-center text-sm text-text-positive-weak\">\n <PackagePlusIcon strokeWidth={1} />\n No options available\n </div>\n )}\n </SelectContent>\n </Select>\n\n <div className=\"mt-1 flex w-full flex-col items-end justify-end\">\n <FieldError errors={_errors} />\n </div>\n\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Switch as SwitchPrimitive } from 'radix-ui';\n\n/**\n * Accessible toggle switch built on Radix UI, styled with primary-color checked state and smooth thumb transition.\n *\n * @example\n * import { Switch } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Switch defaultChecked onCheckedChange={(checked) => console.log(checked)} />\n */\nfunction Switch({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n 'peer',\n 'w-8 shrink-0 cursor-pointer items-center rounded-full shadow-xs transition-all',\n 'inline-flex h-5',\n 'focus-visible:border-primary-strong',\n 'focus-visible:ring-primary-weak',\n 'focus-visible:ring-4',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n\n '-outline-offset-1 inset-shadow-2xs outline-1',\n\n 'data-[state=checked]:bg-primary',\n 'data-[state=checked]:outline-primary-strong',\n\n 'data-[state=unchecked]:bg-muted-weak',\n 'data-[state=unchecked]:outline-border',\n\n 'data-[state=unchecked]:[&_span]:size-4',\n 'data-[state=unchecked]:[&_span]:translate-x-0.5',\n 'data-[state=unchecked]:[&_span]:rtl:-translate-x-0.5',\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n 'block size-4 bg-card shadow-xs',\n 'pointer-events-none rounded-full ring-0 transition-transform',\n 'data-[state=checked]:translate-x-[calc(100%-3px)]',\n 'data-[state=unchecked]:translate-x-0'\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","'use client';\n\nimport type z from 'zod';\n\nimport type { TanStackFormSwitchFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport { Field, FieldContent, FieldDescription, FieldGroup, FieldNote, FieldSeparator, FieldTitle } from '../ui/field';\nimport { Switch } from '../ui/switch';\n\n/**\n * Props for the SwitchField component, derived from the TanStack Form switch field schema.\n */\ntype Props = Pick<z.input<typeof TanStackFormSwitchFieldSchema>, 'label' | 'description' | 'helperText'>;\n\n/**\n * A TanStack Form-connected boolean toggle field rendered as a labelled switch,\n * positioned absolutely in the top-right corner of the field card.\n *\n * @example\n * import { SwitchField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"notifications\">\n * {() => (\n * <SwitchField\n * label=\"Enable notifications\"\n * description=\"Receive email alerts for important events\"\n * helperText=\"You can change this at any time\"\n * />\n * )}\n * </form.Field>\n */\nexport const SwitchField: React.FC<Props> = ({ label, description, helperText }) => {\n const field = useTanStackFieldContext<boolean | null>();\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation=\"vertical\" className=\"relative justify-between gap-y-1\">\n <FieldContent>\n <FieldTitle className=\"cursor-pointer\">\n <label htmlFor={field.name}>{label}</label>\n </FieldTitle>\n <FieldDescription>{description}</FieldDescription>\n <Switch\n id={field.name}\n checked={field.state.value ?? false}\n className=\"absolute top-1 right-1\"\n onBlur={field.handleBlur}\n onCheckedChange={field.handleChange}\n />\n </FieldContent>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useCallback, useId, useMemo, useRef } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { BanIcon, Loader2Icon, XIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '@/components/features/tanstack-form/components/ui/field';\nimport { useTanStackFieldContext } from '../../tanstack-form';\n\nimport type { TanStackFormTextFieldSchema } from '../../schema';\n\n/**\n * Props for the TextField component, derived from the TanStack Form text field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormTextFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'orientation' | 'counter' | 'tooltip' | 'helperText' | 'showClearButton' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** Maximum number of characters allowed; enforced when `counter` is true. */\n maxLength?: number;\n};\n\n/**\n * A TanStack Form-connected single-line text input field with optional character counter,\n * clear button, error display, and submission-state feedback.\n *\n * @example\n * import { TextField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"username\">\n * {() => (\n * <TextField\n * label=\"Username\"\n * placeholder=\"Enter username\"\n * counter\n * maxLength={50}\n * showClearButton\n * />\n * )}\n * </form.Field>\n */\nexport const TextField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n\n tooltip,\n helperText,\n counter = false,\n orientation = 'responsive',\n showClearButton = false,\n showErrorMessage = true,\n\n required = false,\n maxLength,\n}) => {\n const id = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const { form, name, state, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n\n const _showClearButton = showClearButton && !isSubmitting && !!state.value;\n\n const _count = state.value ? state.value.length : 0;\n\n const _countText = useMemo(() => {\n if (!counter) return '';\n const unit = `character${[0, 1].includes(_count) ? '' : 's'}`;\n if (counter && maxLength) return `${_count} / ${maxLength} character${!_count ? '' : 's'}`;\n return `${_count} ${unit}`;\n }, [_count, counter, maxLength]);\n\n const _invalid = state.meta.isDirty && state.meta.isTouched && !state.meta.isValid;\n const _isEmpty = required && state.value === null;\n\n const _isNearLimit = maxLength && _count >= maxLength * 0.8;\n const _isAtLimit = maxLength && _count >= maxLength;\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n ({ target: { value } }) => {\n if (isSubmitting) return;\n if (counter && maxLength && value.length > maxLength) return;\n handleChange(value || null);\n },\n [isSubmitting, counter, maxLength, handleChange]\n );\n\n const onClear = useCallback(() => {\n if (isSubmitting) return;\n handleChange(null);\n inputRef.current?.focus();\n }, [isSubmitting, handleChange]);\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={id}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n <Input\n ref={inputRef}\n id={id}\n name={name}\n value={state.value ?? ''}\n aria-invalid={_invalid}\n autoComplete=\"off\"\n placeholder={placeholder}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n className={cn('pr-6', isSubmitting && 'pointer-events-none bg-muted-muted opacity-60')}\n onBlur={handleBlur}\n onChange={onChange}\n />\n {_showClearButton && (\n <button\n type=\"button\"\n aria-label=\"Clear\"\n className=\"absolute inset-e-0 inset-y-0 top-3 flex h-fit w-8 cursor-pointer items-center justify-center rounded-e-md text-text-positive-weak outline-none transition-[color,box-shadow] hover:text-text-positive focus:text-text-positive-intense [&>svg]:size-3.5\"\n onClick={onClear}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n {isSubmitting && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-muted-weak\">\n <Loader2Icon size={14} className=\"animate-spin text-primary-strong\" />\n </div>\n )}\n {!_showClearButton && state.meta.isDirty && showErrorMessage && !!state.meta.errors.length && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-danger-strong\">\n <BanIcon aria-hidden=\"true\" size={14} />\n </div>\n )}\n <div className=\"my-1 flex w-full items-start justify-between gap-x-2\">\n {state.meta.isDirty && showErrorMessage ? <FieldError className=\"flex-1\" errors={state.meta.errors} /> : <div />}\n {!!counter && (\n <p\n className={cn(\n 'h-4 flex-0 text-nowrap text-end text-xs tabular-nums transition-colors',\n _isAtLimit ? 'font-medium text-danger-strong' : _isNearLimit ? 'text-warning-strong' : 'text-text-positive-weak'\n )}\n >\n {_countText}\n </p>\n )}\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { memo, useCallback, useId, useMemo } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { BanIcon, Loader2Icon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Textarea } from '@/components/ui/textarea';\n\nimport type { TanStackFormTextAreaFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\n/**\n * Props for the TextareaField component, derived from the TanStack Form textarea field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormTextAreaFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'counter' | 'tooltip' | 'helperText' | 'orientation' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** Maximum number of characters allowed; enforced when `counter` is true. */\n maxLength?: number;\n};\n\n/**\n * A TanStack Form-connected multi-line textarea field with optional character counter,\n * error display, and submission-state feedback. Wrapped in `React.memo` to prevent\n * unnecessary re-renders.\n *\n * @example\n * import { TextareaField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"bio\">\n * {() => (\n * <TextareaField\n * label=\"Bio\"\n * placeholder=\"Tell us about yourself…\"\n * counter\n * maxLength={200}\n * />\n * )}\n * </form.Field>\n */\nexport const TextareaField: React.FC<Props> = memo(\n ({\n label,\n description,\n placeholder,\n\n tooltip,\n helperText,\n counter = false,\n orientation = 'responsive',\n showErrorMessage = true,\n\n required = false,\n maxLength,\n }) => {\n const id = useId();\n const { form, state, name, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n\n const _count = state.value ? state.value.length : 0;\n\n const _countText = useMemo(() => {\n if (!counter) return '';\n const unit = `character${[0, 1].includes(_count) ? '' : 's'}`;\n if (counter && maxLength) return `${_count} / ${maxLength} character${!_count ? '' : 's'}`;\n return `${_count} ${unit}`;\n }, [_count, counter, maxLength]);\n\n const _invalid = state.meta.isDirty && state.meta.isTouched && !state.meta.isValid;\n const _isEmpty = required && state.value === null;\n const _errors = state.meta.errors;\n\n const _isNearLimit = maxLength && _count >= maxLength * 0.8;\n const _isAtLimit = maxLength && _count >= maxLength;\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLTextAreaElement>>(\n ({ target: { value } }) => {\n if (isSubmitting) return;\n if (counter && maxLength && value.length > maxLength) return;\n handleChange(value || null);\n },\n [isSubmitting, counter, maxLength, handleChange]\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={id}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n <Textarea\n id={id}\n name={name}\n value={state.value === null ? '' : state.value}\n aria-invalid={_invalid}\n autoCapitalize=\"none\"\n autoComplete=\"off\"\n placeholder={placeholder}\n className={cn(isSubmitting && 'pointer-events-none bg-muted-muted opacity-60')}\n onChange={onChange}\n onBlur={handleBlur}\n />\n {isSubmitting && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-muted-weak\">\n <Loader2Icon size={14} className=\"animate-spin text-primary-strong\" />\n </div>\n )}\n {state.meta.isDirty && showErrorMessage && !!_errors.length && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-danger-strong\">\n <BanIcon size={14} />\n </div>\n )}\n <div className=\"my-1 flex w-full items-start justify-between gap-x-2\">\n {state.meta.isDirty && showErrorMessage ? <FieldError className=\"flex-1\" errors={state.meta.errors} /> : <div />}\n {!!counter && (\n <p\n className={cn(\n 'h-4 flex-0 text-nowrap text-end text-xs tabular-nums transition-colors',\n _isAtLimit ? 'font-medium text-danger-strong' : _isNearLimit ? 'text-warning-strong' : 'text-text-positive-weak'\n )}\n >\n {_countText}\n </p>\n )}\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\nTextareaField.displayName = 'TextareaField';\n","import { useCallback } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\n\nimport { useTanStackFormContext } from '../../tanstack-form';\n\n/**\n * Renders a submit button wired to the current TanStack Form context, automatically handling loading and disabled states.\n *\n * @example\n * import { TanStackActionSubmit } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * // Inside a TanStack Form provider:\n * <TanStackActionSubmit label=\"Save Changes\" className=\"mt-4\" />\n */\nexport const TanStackActionSubmit: React.FC<{\n /** Button label text. Defaults to `'Submit'` when omitted. */\n label?: string;\n /** Additional CSS class names applied to the button element. */\n className?: string;\n}> = ({ label, className }) => {\n const form = useTanStackFormContext();\n\n const onSubmit = useCallback(async () => {\n await form.handleSubmit({ submitAction: 'submit' });\n if (!form.state.isSubmitSuccessful) return;\n form.reset();\n }, [form]);\n return (\n <form.Subscribe\n selector={state => ({\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit || state.isDefaultValue,\n isSubmitting: state.isSubmitting,\n })}\n children={({ disabled, isSubmitting }) => {\n return (\n <Button type=\"button\" size=\"md\" disabled={disabled} isLoading={isSubmitting} className={cn('min-h-8 min-w-32', className)} onClick={onSubmit}>\n {label ?? 'Submit'}\n </Button>\n );\n }}\n />\n );\n};\n","import { ArrowDownToLine, PlusIcon } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\n\nimport { useTanStackFormContext } from '../../tanstack-form';\n\n/**\n * Renders a form action bar with a Cancel button and a context-aware submit button (Add New or Update) driven by TanStack Form state.\n *\n * @example\n * import { TanStackActionsForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * // Inside a TanStack Form provider:\n * <TanStackActionsForm type=\"create\" />\n *\n * // For an update workflow:\n * <TanStackActionsForm type=\"update\" />\n */\nexport const TanStackActionsForm: React.FC<\n React.PropsWithChildren<{\n /**\n * Determines which submit button variant is rendered.\n * - `'create'` — shows an \"Add New\" button that resets the form on success.\n * - `'update'` — shows an \"Update\" button that resets the form on success.\n * Defaults to `'create'`.\n */\n type?: 'create' | 'update';\n }>\n> = ({ type = 'create' }) => {\n const form = useTanStackFormContext();\n return (\n <div className=\"flex h-8 items-center justify-between\">\n <form.Subscribe\n selector={state => ({\n disabled: state.isPristine || state.isSubmitting,\n })}\n children={({ disabled }) => {\n return (\n <Button color=\"muted\" variant=\"outline\" type=\"button\" size=\"md\" disabled={disabled} className=\"h-full min-w-32\" onClick={() => form.reset()}>\n Cancel\n </Button>\n );\n }}\n />\n {type === 'create' && (\n <form.Subscribe\n selector={state => ({\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit || state.isDefaultValue,\n isSubmitting: state.isSubmitting,\n })}\n children={({ disabled, isSubmitting }) => {\n return (\n <Button\n type=\"submit\"\n size=\"md\"\n disabled={disabled}\n isLoading={isSubmitting}\n className=\"h-full min-w-32\"\n onClick={async () => {\n await form.handleSubmit({ submitAction: 'create' });\n if (!form.state.isSubmitSuccessful) return;\n form.reset();\n }}\n >\n <PlusIcon />\n Add New\n </Button>\n );\n }}\n />\n )}\n {type === 'update' && (\n <form.Subscribe\n selector={state => ({\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit || state.isDefaultValue,\n isSubmitting: state.isSubmitting,\n })}\n children={({ disabled, isSubmitting }) => {\n return (\n <Button\n type=\"submit\"\n size=\"md\"\n disabled={disabled}\n isLoading={isSubmitting}\n className=\"h-full min-w-32\"\n onClick={async () => {\n await form.handleSubmit({ submitAction: 'update' });\n if (!form.state.isSubmitSuccessful) return;\n form.reset();\n }}\n >\n <ArrowDownToLine />\n Update\n </Button>\n );\n }}\n />\n )}\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Separator as SeparatorPrimitive } from 'radix-ui';\n\n/**\n * Thin decorative divider line that supports horizontal and vertical orientations via Radix UI Separator.\n *\n * @example\n * import { Separator } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Separator orientation=\"horizontal\" />\n */\nfunction Separator({ className, orientation = 'horizontal', decorative = true, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border-weak',\n 'data-[orientation=horizontal]:h-px',\n 'data-[orientation=horizontal]:w-full',\n 'data-[orientation=vertical]:h-full',\n 'data-[orientation=vertical]:w-px',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","'use client';\n\nimport { Trash2Icon } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\n\nimport { Separator } from '../ui/separator';\n\n/**\n * Renders a card-style form section with a header, optional description, a delete button, and a content area for fields.\n *\n * @example\n * import { TanStackCardForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackCardForm\n * title=\"Shipping Address\"\n * description=\"Where should we deliver your order?\"\n * onDelete={() => removeAddress(id)}\n * >\n * <TextField name=\"street\" />\n * </TanStackCardForm>\n */\nexport const TanStackCardForm: React.FC<\n React.PropsWithChildren<{\n /** Bold heading text shown at the top of the card. */\n title: string;\n /** Optional secondary text rendered beneath the title. */\n description?: string;\n /** When provided, renders a danger \"Remove\" button in the card's top-right corner. */\n onDelete?: () => void | Promise<void>;\n }>\n> = ({ title, description, onDelete, children }) => {\n return (\n <section data-slot=\"card-form\" className=\"relative flex flex-col rounded-md bg-card pb-4 shadow-card ring-1 ring-border\">\n <div data-slot=\"card-form-header\" className=\"flex flex-col space-y-0.5 px-4 py-3\">\n <p className=\"font-semibold text-base tracking-tight\">{title}</p>\n {!!description && <p className=\"text-text-positive-weak text-sm\">{description}</p>}\n </div>\n <Separator />\n <div data-slot=\"card-form-main\" className=\"flex flex-col py-4\">\n {children}\n </div>\n {!!onDelete && (\n <Button\n color=\"danger\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-2.5 right-3\"\n onClick={e => {\n onDelete?.();\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <Trash2Icon />\n Remove\n </Button>\n )}\n </section>\n );\n};\n","/**\n * Wraps a set of TanStack form sections in a vertically-stacked flex container.\n *\n * @example\n * import { TanStackContainerForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackContainerForm>\n * <TanStackSectionForm title=\"Personal Info\">\n * {/* fields *\\/}\n * </TanStackSectionForm>\n * </TanStackContainerForm>\n */\nexport const TanStackContainerForm: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <div data-slot=\"section-form\" className=\"flex flex-col space-y-4\">\n {children}\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\n\n/**\n * Secondary outline button used to dismiss or cancel a form without submitting, defaulting to the label \"Cancel\".\n *\n * @example\n * import { CancelButton } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <CancelButton onClick={() => router.back()} />\n */\nexport const CancelButton: React.FC<React.ComponentProps<'button'>> = ({ disabled, className, onClick, children }) => {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"muted\"\n disabled={disabled}\n className={cn('min-w-40', className)}\n onClick={onClick as React.MouseEventHandler<HTMLButtonElement>}\n >\n {children ?? 'Cancel'}\n </Button>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\n\n/**\n * Props for the {@link SubmitButton} component.\n */\ntype SubmitButtonProps = React.ComponentProps<'button'> & {\n /**\n * When `true` the button enters a loading state and is automatically disabled to prevent duplicate submissions.\n */\n isSubmitting?: boolean;\n /**\n * Label text rendered inside the button.\n * @default 'Submit'\n */\n submitText?: string;\n};\n\n/**\n * Primary form submission button that shows a loading indicator while the form is being submitted.\n *\n * @example\n * import { SubmitButton } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <SubmitButton isSubmitting={form.state.isSubmitting} submitText=\"Save changes\" />\n */\nexport const SubmitButton: React.FC<SubmitButtonProps> = ({ isSubmitting, submitText = 'Submit', disabled, className, onClick }) => {\n return (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n disabled={disabled || isSubmitting}\n className={cn('min-w-40', className)}\n onClick={onClick as React.MouseEventHandler<HTMLButtonElement>}\n >\n {submitText}\n </Button>\n );\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { Separator } from '@/components/ui/separator';\n\nimport { useTanStackFormContext } from '../../tanstack-form';\nimport { CancelButton } from '../ui/cancel-button';\nimport { SubmitButton } from '../ui/submit-button';\nimport { Dialog, DialogContent, DialogOverlay, DialogPortal, DialogTitle } from '@/components/ui/dialog';\n\n/**\n * Renders a modal dialog that wraps a TanStack Form with a title, scrollable content area, and built-in submit/cancel actions.\n *\n * @example\n * import { TanStackDialogForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackDialogForm\n * title=\"Create User\"\n * submitText=\"Create\"\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * >\n * <NameField />\n * <EmailField />\n * </TanStackDialogForm>\n */\nexport const TanStackDialogForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the dialog title bar. */\n title: string;\n /** Custom label for the submit button. Defaults to the `SubmitButton` component's built-in label when omitted. */\n submitText?: string;\n /** Controlled open state of the dialog. */\n open?: boolean;\n /** Callback fired when the dialog open state changes; the form is reset on close. */\n onOpenChange?: (open: boolean) => void;\n }>\n> = ({ title, submitText, open, onOpenChange, children }) => {\n const form = useTanStackFormContext();\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) form.reset();\n onOpenChange?.(open);\n },\n [form.reset, onOpenChange]\n );\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogContent className=\"flex size-full max-h-dvh max-w-dvw flex-col gap-0 overflow-y-auto p-0 shadow-dialog sm:h-auto sm:max-h-[85dvh] sm:max-w-2xl sm:rounded-md\">\n <div data-slot=\"dialog-header\" className=\"flex items-center justify-center gap-2 px-6 py-5 text-center sm:text-left\">\n <DialogTitle data-slot=\"dialog-title\" className=\"text-lg font-semibold tracking-tight\">\n {title}\n </DialogTitle>\n </div>\n <Separator />\n <div data-slot=\"dialog-content\" className=\"relative flex flex-col overflow-y-auto p-0 pt-4 max-sm:flex-1 sm:p-4\">\n {children}\n </div>\n <Separator />\n <div data-slot=\"dialog-footer\" className=\"flex flex-col-reverse items-center justify-end gap-2 px-6 py-4 sm:flex-row max-sm:[&>button]:w-full\">\n <form.Subscribe\n selector={state => ({ disabled: state.isSubmitting })}\n children={({ disabled }) => (\n <CancelButton\n disabled={disabled}\n onClick={() => {\n form.reset();\n handleOpenChange(false);\n }}\n />\n )}\n />\n <form.Subscribe\n selector={state => ({\n isSubmitting: state.isSubmitting,\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit,\n })}\n children={({ isSubmitting, disabled }) => (\n <SubmitButton isSubmitting={isSubmitting} disabled={disabled} submitText={submitText} onClick={() => form.handleSubmit()} />\n )}\n />\n </div>\n </DialogContent>\n </DialogPortal>\n </Dialog>\n );\n};\n","import {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n} from '@/components/features/tanstack-form/components/ui/field';\n\n/**\n * Renders a labeled field group with an optional description, helper text, and a bottom separator.\n *\n * @example\n * import { TanStackFieldGroup } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackFieldGroup\n * label=\"Contact Details\"\n * description=\"Enter your contact information.\"\n * helperText=\"All fields are required.\"\n * orientation=\"horizontal\"\n * >\n * <EmailField />\n * </TanStackFieldGroup>\n */\nexport const TanStackFieldGroup: React.FC<\n React.PropsWithChildren<{\n /** Primary label displayed above the field content. */\n label: string;\n /** Secondary descriptive text shown beneath the label. */\n description?: string;\n /** Supplementary helper note rendered below the field content. */\n helperText?: string;\n /** Layout orientation of the label-to-content axis. Defaults to `'responsive'`. */\n orientation?: 'horizontal' | 'vertical' | 'responsive';\n }>\n> = ({\n label,\n description,\n helperText,\n\n orientation = 'responsive',\n children,\n}) => {\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation}>\n <FieldContent>\n <FieldLabel>{label}</FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n {children}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { CloseButton } from '@/components/ui/buttons/close';\n\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport { useTanStackFormContext } from '../../tanstack-form';\nimport { CancelButton } from '../ui/cancel-button';\nimport { SubmitButton } from '../ui/submit-button';\n\n/**\n * Renders a slide-in side-panel dialog that wraps a TanStack form with built-in submit and cancel actions.\n *\n * @example\n * import { TanStackPopoverForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackPopoverForm\n * title=\"Edit Profile\"\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * >\n * <EmailField />\n * </TanStackPopoverForm>\n */\nexport const TanStackPopoverForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the panel header. */\n title: string;\n /** Controlled open state of the popover dialog. */\n open?: boolean;\n /** Additional CSS class names applied to the scrollable content area. */\n contentClassName?: string;\n /** Callback fired when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n }>\n> = ({ title, open, contentClassName, onOpenChange, children }) => {\n const form = useTanStackFormContext();\n\n return (\n <DialogPrimitive.Root data-slot=\"dialog\" open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal data-slot=\"dialog-portal\">\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-40 bg-black/40 backdrop-blur-sm',\n 'data-[state=open]:animate-in data-[state=open]:fade-in',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out'\n )}\n />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed top-4 right-4 z-50 h-[calc(100dvh-2rem)] min-w-sm max-w-xl rounded-md bg-background shadow-lg ring-1 ring-border',\n 'duration-300',\n 'data-[state=open]:animate-in data-[state=open]:slide-in-from-right data-[state=open]:fade-in',\n 'data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right data-[state=closed]:fade-out'\n )}\n >\n <section className=\"relative flex size-full flex-col\">\n <header className=\"flex h-14 shrink-0 items-center border-b border-border px-5\">\n <h2 className=\"font-semibold text-base tracking-tight text-text-positive\">{title}</h2>\n </header>\n\n <div className={cn('flex flex-1 flex-col overflow-y-auto py-4', contentClassName)}>{children}</div>\n\n <div className=\"flex shrink-0 flex-col gap-2 border-t border-border px-4 py-3\">\n <form.Subscribe\n selector={state => ({\n isSubmitting: state.isSubmitting,\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit,\n })}\n children={({ isSubmitting, disabled }) => (\n <SubmitButton isSubmitting={isSubmitting} disabled={disabled} className=\"w-full\" onClick={() => form.handleSubmit()} />\n )}\n />\n <form.Subscribe\n selector={state => ({ disabled: state.isPristine || state.isSubmitting })}\n children={({ disabled }) => (\n <CancelButton\n disabled={disabled}\n className=\"w-full\"\n onClick={() => {\n form.reset();\n onOpenChange?.(false);\n }}\n />\n )}\n />\n </div>\n\n <DialogPrimitive.Close asChild>\n <CloseButton className=\"absolute top-2.5 right-3\" />\n </DialogPrimitive.Close>\n </section>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n};\n","'use client';\n\nimport { Separator } from '../ui/separator';\n\n/**\n * Internal header sub-component for `TanStackSectionForm` that renders a styled section title.\n */\nconst SectionHeader: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <header data-slot=\"section-header\" className=\"flex items-center px-4 py-3 font-semibold text-base text-text-positive tracking-tight\">\n {children}\n </header>\n );\n};\n\n/**\n * Internal body sub-component for `TanStackSectionForm` that wraps field content with vertical padding.\n */\nconst SectionMain: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <main data-slot=\"section-main\" className=\"relative flex flex-col py-4\">\n {children}\n </main>\n );\n};\n\n/**\n * Renders a card-like form section with a titled header, separator, and a content area for form fields.\n *\n * @example\n * import { TanStackSectionForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackSectionForm title=\"Account Settings\">\n * <EmailField />\n * <PasswordField />\n * </TanStackSectionForm>\n */\nexport const TanStackSectionForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the section header bar. */\n title: string;\n }>\n> = ({ title, children }) => {\n return (\n <section data-slot=\"section-form\" className=\"flex flex-col rounded-md bg-background shadow-card ring-1 ring-border\">\n <SectionHeader>{title}</SectionHeader>\n <Separator />\n <SectionMain>{children}</SectionMain>\n </section>\n );\n};\n","import { Field, FieldContent, FieldDescription, FieldGroup, FieldLegend, FieldNote, FieldSeparator } from '../ui/field';\n\n/**\n * Renders a standalone section title with an optional description and helper note, followed by a separator.\n *\n * @example\n * import { TanStackTitleField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackTitleField\n * title=\"Billing Address\"\n * description=\"Provide the address associated with your payment method.\"\n * helperText=\"Must match your bank records.\"\n * />\n */\nexport const TanStackTitleField: React.FC<{\n /** The heading text rendered as a legend element. */\n title: string;\n /** Optional supplementary text displayed beneath the title. */\n description?: string;\n /** Optional helper note shown below the description area. */\n helperText?: string;\n}> = ({ title, description, helperText }) => {\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field className=\"gap-0\">\n <FieldContent>\n <FieldLegend className=\"mb-1\">{title}</FieldLegend>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","import { createFormHook, createFormHookContexts } from '@tanstack/react-form';\n\nimport { CheckboxField } from './components/fields/checkbox-field';\nimport { ComboboxField } from './components/fields/combobox-field';\nimport { DateField } from './components/fields/date-field';\nimport { EmailField } from './components/fields/email-field';\nimport { NumberField } from './components/fields/number-field';\nimport { PasswordField } from './components/fields/password-field';\nimport { RadioGroupField } from './components/fields/radio-group-field';\nimport { SelectField } from './components/fields/select-field';\nimport { SwitchField } from './components/fields/switch-field';\nimport { TextField } from './components/fields/text-field';\nimport { TextareaField } from './components/fields/textarea-field';\nimport { TanStackActionSubmit } from './components/forms/action-submit';\nimport { TanStackActionsForm } from './components/forms/actions-form';\nimport { TanStackCardForm } from './components/forms/card-form';\nimport { TanStackContainerForm } from './components/forms/container-form';\nimport { TanStackDialogForm } from './components/forms/dialog-form';\nimport { TanStackFieldGroup } from './components/forms/group-field';\nimport { TanStackPopoverForm } from './components/forms/popover-form';\nimport { TanStackSectionForm } from './components/forms/section-form';\nimport { TanStackTitleField } from './components/forms/title-field';\nimport { Field, FieldContent, FieldContentMain, FieldError, FieldGroup, FieldLabel, FieldSeparator } from './components/ui/field';\n\nconst { fieldContext, formContext, useFieldContext: useTanStackFieldContext, useFormContext: useTanStackFormContext } = createFormHookContexts();\n\n/**\n * Factory result from {@link createFormHook} pre-wired with all Lunas UI field and form components.\n *\n * ### `useTanStackForm`\n * Pre-configured TanStack Form hook that returns a type-safe form instance bound to all Lunas UI\n * field and form components.\n *\n * @example\n * import { useTanStackForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * const form = useTanStackForm({\n * defaultValues: { name: '', email: '' },\n * onSubmit: async ({ value }) => console.log(value),\n * });\n *\n * return (\n * <form.Provider>\n * <form.AppForm>\n * <form.AppField name=\"name\" children={(field) => <field.TextField label=\"Name\" />} />\n * <form.Subscribe selector={(s) => s.canSubmit}>\n * {(canSubmit) => <form.TanStackActionSubmit disabled={!canSubmit} />}\n * </form.Subscribe>\n * </form.AppForm>\n * </form.Provider>\n * );\n *\n * ### `withTanStackForm`\n * Higher-order component that wraps a sub-form component with access to the parent\n * `useTanStackForm` form context, enabling isolated field groups that still participate in the\n * top-level form state.\n *\n * @example\n * import { withTanStackForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * const AddressFields = withTanStackForm(\n * { street: '', city: '' } as const,\n * ({ form }) => (\n * <>\n * <form.AppField name=\"street\" children={(f) => <f.TextField label=\"Street\" />} />\n * <form.AppField name=\"city\" children={(f) => <f.TextField label=\"City\" />} />\n * </>\n * ),\n * );\n *\n * ### `withTanStackFieldGroup`\n * Higher-order component that creates a reusable field-group component sharing the enclosing\n * `useTanStackForm` context without requiring additional form providers.\n *\n * @example\n * import { withTanStackFieldGroup } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * const ContactGroup = withTanStackFieldGroup(({ form }) => (\n * <form.AppField name=\"phone\" children={(f) => <f.TextField label=\"Phone\" />} />\n * ));\n */\nconst {\n useAppForm: useTanStackForm,\n withForm: withTanStackForm,\n withFieldGroup: withTanStackFieldGroup,\n} = createFormHook({\n fieldContext,\n formContext,\n\n fieldComponents: {\n TextField,\n TextareaField,\n NumberField,\n EmailField,\n PasswordField,\n\n SelectField,\n ComboboxField,\n DateField,\n SwitchField,\n RadioGroupField,\n CheckboxField,\n\n FieldGroup,\n Field,\n FieldContent,\n FieldLabel,\n FieldContentMain,\n FieldSeparator,\n FieldError,\n },\n formComponents: {\n TanStackDialogForm,\n TanStackPopoverForm,\n TanStackContainerForm,\n TanStackSectionForm,\n TanStackCardForm,\n TanStackFieldGroup,\n TanStackTitleField,\n\n TanStackActionsForm,\n TanStackActionSubmit,\n },\n});\n\nexport {\n useTanStackForm,\n withTanStackForm,\n withTanStackFieldGroup,\n useTanStackFieldContext,\n useTanStackFormContext,\n FieldGroup,\n Field,\n FieldContent,\n FieldLabel,\n FieldContentMain,\n FieldSeparator,\n FieldError,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"tanstack-form-BmV2BXDz.cjs","names":["Badge: React.FC<BadgeProps>","LabelPrimitive","InfoIcon","Tooltip","TooltipTrigger","HelpCircleIcon","TooltipContent","Separator","CheckboxField: React.FC<Props>","isSubmitting","Checkbox","ComboboxField: React.FC<ComboboxFieldProps>","Popover","PopoverTrigger","Button","PopoverContent","Command","CommandInput","CommandList","CommandGroup","CommandItem","label","CommandEmpty","DateField: React.FC<Props>","Popover","PopoverTrigger","Button","CalendarDaysIcon","PopoverContent","Calendar","EmailField: React.FC<Props>","isSubmitting","Input","AtSignIcon","XIcon","NumberInput: React.FC<TProps>","value","Input","NumberField: React.FC<NumberFieldProps>","isSubmitting","Loader2Icon","BanIcon","PasswordField: React.FC<Props>","isSubmitting","Input","EyeOffIcon","EyeIcon","RadioGroupField: React.FC<Props>","isSubmitting","RadioGroup","RadioGroupItem","SelectField: React.FC<Props>","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","PackagePlusIcon","SwitchPrimitive","SwitchField: React.FC<Props>","TextField: React.FC<Props>","isSubmitting","Input","XIcon","Loader2Icon","BanIcon","TextareaField: React.FC<Props>","isSubmitting","Textarea","Loader2Icon","BanIcon","TanStackActionSubmit: React.FC<{\n /** Button label text. Defaults to `'Submit'` when omitted. */\n label?: string;\n /** Additional CSS class names applied to the button element. */\n className?: string;\n}>","Button","TanStackActionsForm: React.FC<\n React.PropsWithChildren<{\n /**\n * Determines which submit button variant is rendered.\n * - `'create'` — shows an \"Add New\" button that resets the form on success.\n * - `'update'` — shows an \"Update\" button that resets the form on success.\n * Defaults to `'create'`.\n */\n type?: 'create' | 'update';\n }>\n>","Button","PlusIcon","ArrowDownToLine","SeparatorPrimitive","TanStackCardForm: React.FC<\n React.PropsWithChildren<{\n /** Bold heading text shown at the top of the card. */\n title: string;\n /** Optional secondary text rendered beneath the title. */\n description?: string;\n /** When provided, renders a danger \"Remove\" button in the card's top-right corner. */\n onDelete?: () => void | Promise<void>;\n }>\n>","Button","Trash2Icon","TanStackContainerForm: React.FC<React.PropsWithChildren>","CancelButton: React.FC<React.ComponentProps<'button'>>","Button","SubmitButton: React.FC<SubmitButtonProps>","Button","TanStackDialogForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the dialog title bar. */\n title: string;\n /** Custom label for the submit button. Defaults to the `SubmitButton` component's built-in label when omitted. */\n submitText?: string;\n /** Controlled open state of the dialog. */\n open?: boolean;\n /** Callback fired when the dialog open state changes; the form is reset on close. */\n onOpenChange?: (open: boolean) => void;\n }>\n>","open","Dialog","DialogPortal","DialogOverlay","DialogContent","DialogTitle","Separator","TanStackFieldGroup: React.FC<\n React.PropsWithChildren<{\n /** Primary label displayed above the field content. */\n label: string;\n /** Secondary descriptive text shown beneath the label. */\n description?: string;\n /** Supplementary helper note rendered below the field content. */\n helperText?: string;\n /** Layout orientation of the label-to-content axis. Defaults to `'responsive'`. */\n orientation?: 'horizontal' | 'vertical' | 'responsive';\n }>\n>","TanStackPopoverForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the panel header. */\n title: string;\n /** Controlled open state of the popover dialog. */\n open?: boolean;\n /** Additional CSS class names applied to the scrollable content area. */\n contentClassName?: string;\n /** Callback fired when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n }>\n>","DialogPrimitive","CloseButton","SectionHeader: React.FC<React.PropsWithChildren>","SectionMain: React.FC<React.PropsWithChildren>","TanStackSectionForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the section header bar. */\n title: string;\n }>\n>","TanStackTitleField: React.FC<{\n /** The heading text rendered as a legend element. */\n title: string;\n /** Optional supplementary text displayed beneath the title. */\n description?: string;\n /** Optional helper note shown below the description area. */\n helperText?: string;\n}>"],"sources":["../packages/components/features/tanstack-form/components/ui/badge.tsx","../packages/components/features/tanstack-form/components/ui/label.tsx","../packages/components/features/tanstack-form/components/ui/field.tsx","../packages/components/features/tanstack-form/components/fields/checkbox-field.tsx","../packages/components/features/tanstack-form/components/fields/combobox-field.tsx","../packages/components/features/tanstack-form/components/fields/date-field.tsx","../packages/components/features/tanstack-form/components/fields/email-field.tsx","../packages/components/ui/inputs/number-input.tsx","../packages/components/features/tanstack-form/components/fields/number-field.tsx","../packages/components/features/tanstack-form/components/fields/password-field.tsx","../packages/components/features/tanstack-form/components/fields/radio-group-field.tsx","../packages/components/features/tanstack-form/components/fields/select-field.tsx","../packages/components/features/tanstack-form/components/ui/switch.tsx","../packages/components/features/tanstack-form/components/fields/switch-field.tsx","../packages/components/features/tanstack-form/components/fields/text-field.tsx","../packages/components/features/tanstack-form/components/fields/textarea-field.tsx","../packages/components/features/tanstack-form/components/forms/action-submit.tsx","../packages/components/features/tanstack-form/components/forms/actions-form.tsx","../packages/components/features/tanstack-form/components/ui/separator.tsx","../packages/components/features/tanstack-form/components/forms/card-form.tsx","../packages/components/features/tanstack-form/components/forms/container-form.tsx","../packages/components/features/tanstack-form/components/ui/cancel-button.tsx","../packages/components/features/tanstack-form/components/ui/submit-button.tsx","../packages/components/features/tanstack-form/components/forms/dialog-form.tsx","../packages/components/features/tanstack-form/components/forms/group-field.tsx","../packages/components/features/tanstack-form/components/forms/popover-form.tsx","../packages/components/features/tanstack-form/components/forms/section-form.tsx","../packages/components/features/tanstack-form/components/forms/title-field.tsx","../packages/components/features/tanstack-form/tanstack-form.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\nconst badgeVariants = cva(['flex w-fit items-center justify-center rounded-full font-bold text-text-negative-strong'], {\n variants: {\n color: {\n default: 'bg-primary-strong',\n secondary: 'bg-secondary-strong',\n success: 'bg-success-strong',\n info: 'bg-info-strong',\n warning: 'bg-warning-strong',\n danger: 'border border-danger-strong bg-linear-to-b from-danger-strong/90 via-danger-strong to-danger-strong/90',\n },\n size: {\n xs: 'px-1.5 py-0.5 text-xs',\n sm: 'px-2 py-0.75 text-xs',\n md: 'px-2.5 py-0.75 text-sm',\n lg: 'px-3 py-1 text-sm',\n },\n },\n defaultVariants: {\n color: 'default',\n size: 'sm',\n },\n});\n\n/**\n * Props for the {@link Badge} component.\n */\ntype BadgeProps = React.PropsWithChildren<{\n /** Text content rendered inside the badge; takes precedence over `children` when both are provided. */\n label: string;\n /**\n * Color theme of the badge.\n * @default 'default'\n */\n color?: VariantProps<typeof badgeVariants>['color'];\n /**\n * Size variant controlling padding and font size.\n * @default 'sm'\n */\n size?: VariantProps<typeof badgeVariants>['size'];\n /** Additional Tailwind class names merged onto the root element. */\n className?: string;\n}>;\n\n/**\n * Pill-shaped status badge with configurable color and size, used primarily as the \"Required\" indicator inside form labels.\n *\n * @example\n * import { Badge } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Badge label=\"Required\" color=\"danger\" size=\"xs\" />\n */\nexport const Badge: React.FC<BadgeProps> = ({ label, color, size, className, children }) => {\n return (\n <div data-slot=\"required-indicator\" className={badgeVariants({ color, size, className })}>\n {label || children}\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Label as LabelPrimitive } from 'radix-ui';\nimport { Badge } from './badge';\n\n/**\n * Form field label that automatically renders a \"Required\" badge when the field is marked aria-required.\n *\n * @example\n * import { Label } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Label htmlFor=\"email\">Email address</Label>\n */\nfunction Label({ className, children, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n 'text-text-positive',\n 'flex w-full items-center justify-between',\n 'select-none font-medium text-sm/6 leading-none',\n 'group-data-[disabled=true]:pointer-events-none',\n 'group-data-[disabled=true]:opacity-50',\n 'peer-disabled:cursor-not-allowed',\n 'peer-disabled:opacity-50',\n 'aria-required:*:data-[slot=required-indicator]:inline-block',\n className\n )}\n {...props}\n >\n <span className=\"flex items-center gap-1\">{children}</span>\n <Badge label=\"Required\" color=\"danger\" size=\"xs\" className=\"hidden shrink-0\" />\n </LabelPrimitive.Root>\n );\n}\n\nexport { Label };\n","'use client';\n\nimport { memo, useMemo } from 'react';\n\nimport { HelpCircleIcon, InfoIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Separator } from '@/components/ui/separator';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Label } from './label';\n\nconst fieldVariants = cva('group/field flex w-full gap-2 data-[invalid=true]:text-danger *:data-[slot=field-content]:gap-0', {\n variants: {\n orientation: {\n vertical: ['flex-col *:w-full [&>.sr-only]:w-auto'],\n horizontal: [\n 'flex-row items-center',\n '*:data-[slot=field-label]:flex-auto',\n 'has-[>[data-slot=field-content]]:items-start',\n 'has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n responsive: [\n 'flex-col *:w-full [&>.sr-only]:w-auto',\n '@md/field-group:flex-row',\n '@md/field-group:items-center',\n '@md/field-group:gap-4',\n '@md/field-group:*:w-auto',\n '@md/field-group:*:data-[slot=field-content]:basis-1/2',\n '@md/field-group:*:data-[slot=field-content-main]:basis-1/2',\n '@md/field-group:*:data-[slot=field-label]:flex-auto',\n '@md/field-group:has-[>[data-slot=field-content]]:items-start',\n '@md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n});\n\n/**\n * Outermost `<fieldset>` wrapper that stacks multiple `Field` rows with consistent vertical spacing.\n *\n * @example\n * import { FieldSet } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldSet>\n * <Field><FieldLabel>Name</FieldLabel><FieldContent><input /></FieldContent></Field>\n * </FieldSet>\n */\nconst FieldSet = memo(({ className, ...props }: React.ComponentProps<'fieldset'>) => {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn('flex flex-col gap-6 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3', className)}\n {...props}\n />\n );\n});\nFieldSet.displayName = 'FieldSet';\n\n/**\n * Props for {@link FieldLegend}.\n */\ntype FieldLegendProps = React.ComponentProps<'legend'> & {\n /**\n * Visual weight of the legend text.\n * - `'legend'` — larger base-size text (section heading).\n * - `'label'` — smaller label-size text (matches field label weight).\n * @default 'legend'\n */\n variant?: 'legend' | 'label';\n};\n\n/**\n * `<legend>` element for a `<fieldset>`, styled as either a section heading or a compact label.\n *\n * @example\n * import { FieldSet, FieldLegend } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldSet>\n * <FieldLegend variant=\"legend\">Personal details</FieldLegend>\n * </FieldSet>\n */\nconst FieldLegend = memo(({ className, variant = 'legend', ...props }: FieldLegendProps) => {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn('mb-3 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base', className)}\n {...props}\n />\n );\n});\nFieldLegend.displayName = 'FieldLegend';\n\n/**\n * Container `<div>` that groups a set of `Field` rows with container-query support for responsive layouts.\n *\n * @example\n * import { FieldGroup } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldGroup>\n * <Field>…</Field>\n * <Field>…</Field>\n * </FieldGroup>\n */\nconst FieldGroup = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n 'group/field-group @container/field-group',\n 'flex flex-col gap-7 pt-4',\n 'data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4',\n className\n )}\n {...props}\n />\n );\n});\nFieldGroup.displayName = 'FieldGroup';\n\n/**\n * Single form field row that arranges label, input, and meta elements with configurable orientation.\n *\n * @example\n * import { Field } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Field orientation=\"horizontal\">\n * <FieldLabel htmlFor=\"username\">Username</FieldLabel>\n * <FieldContent><input id=\"username\" /></FieldContent>\n * </Field>\n */\nconst Field = memo(({ className, orientation = 'vertical', ...props }: React.ComponentProps<'div'> & VariantProps<typeof fieldVariants>) => {\n return <div data-slot=\"field\" data-orientation={orientation} className={cn(fieldVariants({ orientation }), className)} {...props} />;\n});\nField.displayName = 'Field';\n\n/**\n * Flex column wrapper that houses the primary input control together with description and error slots.\n *\n * @example\n * import { FieldContent } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldContent>\n * <input type=\"text\" />\n * <FieldDescription>Enter your full name.</FieldDescription>\n * </FieldContent>\n */\nconst FieldContent = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return <div data-slot=\"field-content\" className={cn('group/field-content flex flex-col gap-1.5 leading-snug', className)} {...props} />;\n});\nFieldContent.displayName = 'FieldContent';\n\n/**\n * Positioned wrapper for the main input element that enables absolutely-placed adornments (icons, spinners).\n *\n * @example\n * import { FieldContentMain } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldContentMain>\n * <input type=\"text\" className=\"pr-8\" />\n * <SearchIcon className=\"absolute right-2 top-2\" />\n * </FieldContentMain>\n */\nconst FieldContentMain = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return <div data-slot=\"field-content-main\" className={cn('relative', className)} {...props} />;\n});\nFieldContentMain.displayName = 'FieldContentMain';\n\n/**\n * Styled `<label>` element for a `Field`, extending the base `Label` with field-group-aware spacing and border states.\n *\n * @example\n * import { FieldLabel } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldLabel htmlFor=\"email\" aria-required>Email</FieldLabel>\n */\nconst FieldLabel = memo(({ className, ...props }: React.ComponentProps<typeof Label>) => {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n 'group/field-label peer/field-label min-h-6 gap-1 font-medium leading-snug',\n 'has-[>[data-slot=field]]:w-full',\n 'has-[>[data-slot=field]]:flex-col',\n 'has-[>[data-slot=field]]:rounded-md',\n 'has-[>[data-slot=field]]:border',\n 'has-[>[data-slot=field]]:border-border',\n 'has-data-[state=checked]:border-primary',\n '*:data-[slot=field]:p-4 group-data-[disabled=true]/field:opacity-50',\n className\n )}\n {...props}\n />\n );\n});\nFieldLabel.displayName = 'FieldLabel';\n\n/**\n * Inline title element (non-`<label>`) for fields whose label cannot be a native `<label>`, such as custom checkbox groups.\n *\n * @example\n * import { FieldTitle } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldTitle>Notification preferences</FieldTitle>\n */\nconst FieldTitle = memo(({ className, ...props }: React.ComponentProps<'div'>) => {\n return (\n <div\n data-slot=\"field-label\"\n className={cn('flex w-fit items-center gap-2 font-medium text-sm leading-snug group-data-[disabled=true]/field:opacity-50', className)}\n {...props}\n />\n );\n});\nFieldTitle.displayName = 'FieldTitle';\n\n/**\n * Supplementary hint text rendered below the input to guide the user, with support for inline anchor links.\n *\n * @example\n * import { FieldDescription } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldDescription>Must be at least 8 characters.</FieldDescription>\n */\nconst FieldDescription = memo(({ className, ...props }: React.ComponentProps<'p'>) => {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n // biome-ignore lint/security/noSecrets: true\n 'nth-last-2:-mt-1 font-normal text-text-positive-weak text-xs leading-normal last:mt-0 [&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4 [[data-variant=legend]+&]:-mt-1.5',\n className\n )}\n {...props}\n />\n );\n});\nFieldDescription.displayName = 'FieldDescription';\n\n/**\n * Props for {@link FieldNote}.\n */\ntype FieldNoteProps = React.ComponentProps<'div'> & {\n /**\n * When `false` the note is not rendered at all; useful for conditional display without wrapper conditionals.\n * @default true\n */\n isShow?: boolean;\n};\n\n/**\n * Highlighted informational callout box with an info icon, shown below a field to surface contextual guidance.\n *\n * @example\n * import { FieldNote } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldNote isShow={isDraftMode}>Changes are saved automatically in draft mode.</FieldNote>\n */\nconst FieldNote = memo(({ isShow = true, className, children, ...props }: FieldNoteProps) => {\n if (isShow === false) return null;\n return (\n <div\n data-slot=\"field-note\"\n className={cn(\n 'flex items-start gap-1.5 rounded border border-primary-muted/60 bg-primary-bg-subtle/80 px-2.5 py-2 text-text-positive-weak text-xs',\n className\n )}\n {...props}\n >\n <InfoIcon size={12} className=\"mt-0.5 shrink-0 text-primary/70\" />\n <span>{children}</span>\n </div>\n );\n});\nFieldNote.displayName = 'FieldNote';\n\n/**\n * Props for {@link FieldTooltip}.\n */\ntype FieldTooltipProps = {\n /** Text content displayed inside the tooltip when the help icon is hovered or focused. */\n tooltip: string;\n};\n\n/**\n * Small help-circle icon button that reveals a tooltip with additional field context on hover or focus.\n *\n * @example\n * import { FieldTooltip } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldLabel>\n * Password <FieldTooltip tooltip=\"Use at least one uppercase letter and one number.\" />\n * </FieldLabel>\n */\nconst FieldTooltip = memo(({ tooltip }: FieldTooltipProps) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"inline-flex cursor-default items-center text-text-positive-weak/70 hover:text-text-positive focus:outline-none\"\n >\n <HelpCircleIcon size={13} aria-hidden=\"true\" />\n <span className=\"sr-only\">More information</span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-xs text-balance\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n );\n});\nFieldTooltip.displayName = 'FieldTooltip';\n\n/**\n * Visual divider row that optionally displays a centered text label, used to separate logical sections within a `FieldGroup`.\n *\n * @example\n * import { FieldSeparator } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldSeparator>or</FieldSeparator>\n */\nconst FieldSeparator = memo(({ children, className, ...props }: React.PropsWithChildren<React.ComponentProps<'div'>>) => {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn('relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2', className)}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span className=\"relative mx-auto block w-fit bg-background px-2 text-text-positive-weak\" data-slot=\"field-separator-content\">\n {children}\n </span>\n )}\n </div>\n );\n});\nFieldSeparator.displayName = 'FieldSeparator';\n\n/**\n * Props for {@link FieldError}.\n */\ntype FieldErrorProps = React.ComponentProps<'div'> & {\n /**\n * Array of validation error objects, typically sourced from a form library's field-level error state.\n * Each entry may carry an optional `code` (e.g. `'invalid_type'`) and a human-readable `message`.\n * Rendered automatically when `children` is omitted.\n */\n errors?: Array<{ code?: string; message?: string } | undefined>;\n};\n\n/**\n * ARIA-live error region that renders field validation messages from either an explicit `errors` array or arbitrary `children`.\n *\n * @example\n * import { FieldError } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <FieldError errors={field.state.meta.errors} />\n */\nconst FieldError = memo(({ className, children, errors, ...props }: FieldErrorProps) => {\n const content = useMemo(() => {\n if (children) {\n return children;\n }\n\n if (!errors) {\n return null;\n }\n\n if (errors?.length === 1 && errors[0]?.message) {\n return (\n <div className=\"flex flex-row items-center justify-start gap-x-0.5\">\n <p>{errors[0]?.code === 'invalid_type' ? 'Invalid format' : errors[0].message}</p>\n </div>\n );\n }\n\n return (\n <ul className=\"flex list-none flex-col\">\n {errors.map(error => {\n if (typeof error === 'string') return <li key={error}>{error}</li>;\n if (!error?.message) return null;\n return <li key={error.message}>{error.message}</li>;\n })}\n </ul>\n );\n }, [children, errors]);\n\n if (!content) {\n return null;\n }\n\n return (\n <div role=\"alert\" data-slot=\"field-error\" className={cn('w-full font-medium text-danger-strong text-xs', className)} {...props}>\n {content}\n </div>\n );\n});\nFieldError.displayName = 'FieldError';\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldNote,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldContentMain,\n FieldTitle,\n FieldTooltip,\n};\n","'use client';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport type z from 'zod';\n\nimport type { TanStackFormCheckboxGroupFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport { Field, FieldContent, FieldContentMain, FieldDescription, FieldGroup, FieldLabel, FieldNote, FieldSeparator, FieldTooltip } from '../ui/field';\nimport { Checkbox } from '@/components/ui/checkbox';\n\n/**\n * Props for the CheckboxField component, derived from the TanStack Form checkbox group field schema.\n */\ntype Props = Pick<z.input<typeof TanStackFormCheckboxGroupFieldSchema>, 'label' | 'description' | 'orientation' | 'options' | 'helperText' | 'tooltip'>;\n\n/**\n * A TanStack Form-connected checkbox group field that manages an array of selected string values,\n * supporting multi-selection and submission-state disabling.\n *\n * @example\n * import { CheckboxField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"roles\">\n * {() => (\n * <CheckboxField\n * label=\"Roles\"\n * options={[\n * { value: 'admin', label: 'Admin' },\n * { value: 'editor', label: 'Editor' },\n * ]}\n * helperText=\"Select one or more roles\"\n * />\n * )}\n * </form.Field>\n */\nexport const CheckboxField: React.FC<Props> = ({ label, description, options, tooltip, helperText, orientation }) => {\n const field = useTanStackFieldContext<string[] | null>();\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation}>\n <FieldContent>\n <FieldLabel>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContent>\n <FieldContentMain>\n <FieldGroup className=\"flex flex-col gap-y-2\">\n {options.map(option => {\n return (\n <Field key={option.value} orientation=\"horizontal\">\n <Checkbox\n id={`${field.name}-${option.value}`}\n name={field.name}\n checked={field.state.value?.includes(option.value) ?? false}\n disabled={isSubmitting}\n onCheckedChange={checked => {\n if (checked && field.state.value !== null) {\n field.pushValue(option.value);\n } else if (checked && field.state.value === null) {\n field.setValue([option.value]);\n } else if (!checked && field.state.value !== null) {\n const index = field.state.value.indexOf(option.value);\n if (index > -1) field.removeValue(index);\n } else {\n field.setValue(null);\n }\n }}\n />\n <FieldLabel htmlFor={`${field.name}-${option.value}`} className=\"text-text-positive\">\n {option.label}\n </FieldLabel>\n </Field>\n );\n })}\n </FieldGroup>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Field, FieldContent, FieldContentMain, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldSeparator, FieldTooltip } from '../ui/field';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { useTanStackFieldContext } from '../../tanstack-form';\n\n/**\n * Props for the ComboboxField component.\n */\ntype ComboboxFieldProps = {\n /** Visible label rendered above the combobox trigger. */\n label: string;\n /** Optional supporting text displayed beneath the label. */\n description?: string;\n /** Placeholder shown inside the trigger button and the search input when no value is selected. */\n placeholder?: string;\n /** Tooltip content rendered next to the label via an icon button. */\n tooltip?: string;\n /** Layout orientation of the label/field pair. Defaults to `'responsive'`. */\n orientation?: 'horizontal' | 'vertical' | 'responsive';\n /** Array of selectable options, each with a string `value` and display `label`. */\n options: Array<{ value: string; label: string }>;\n};\n\n/**\n * A TanStack Form-connected searchable combobox field powered by Radix UI Popover\n * and a Command menu, allowing the user to filter and select a single string value.\n *\n * @example\n * import { ComboboxField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"city\">\n * {() => (\n * <ComboboxField\n * label=\"City\"\n * placeholder=\"Search city…\"\n * options={[\n * { value: 'tokyo', label: 'Tokyo' },\n * { value: 'hanoi', label: 'Hanoi' },\n * ]}\n * />\n * )}\n * </form.Field>\n */\nexport const ComboboxField: React.FC<ComboboxFieldProps> = ({ label, description, placeholder, tooltip, orientation = 'responsive', options }) => {\n const field = useTanStackFieldContext<string | null>();\n\n const _isInvalid = useMemo(() => {\n return field.state.meta.isTouched && !field.state.meta.isValid;\n }, [field.state.meta.isTouched, field.state.meta.isValid]);\n\n const _errors = useMemo(() => {\n return field.state.meta.errors;\n }, [field.state.meta.errors]);\n\n const selectedLabel = options.find(({ value }) => value === field.state.value)?.label;\n\n return (\n <FieldGroup className=\"px-4\">\n <Field orientation={orientation} data-invalid={_isInvalid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex justify-end\">\n <div className=\"flex w-full max-w-60 flex-col\">\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n className={cn(\n 'flex items-center justify-start rounded outline-border',\n 'hover:bg-transparent',\n 'focus:outline-1 focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak',\n 'data-[state=open]:text-text-positive-muted data-[state=open]:outline-1 data-[state=open]:outline-primary-strong data-[state=open]:ring-4 data-[state=open]:ring-primary-weak',\n !field.state.value && 'text-text-positive-muted'\n )}\n >\n {selectedLabel ? (\n <p className=\"flex min-w-0 flex-1 items-center gap-2 text-start\">{selectedLabel}</p>\n ) : (\n <p className=\"flex-1 text-start text-text-positive-muted\">{placeholder}</p>\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent align=\"end\" side=\"bottom\" className=\"flex w-fit rounded p-0\" onBlur={field.handleBlur}>\n <Command className=\"border-none\">\n <CommandInput placeholder={placeholder ?? 'Search…'} />\n <CommandList>\n <CommandGroup className=\"max-h-40 overflow-y-auto\">\n {options.map(({ value, label }) => (\n <CommandItem key={value} value={label} onSelect={() => field.handleChange(value)}>\n {label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n </Command>\n </PopoverContent>\n </Popover>\n\n <div className=\"mt-1 flex w-full flex-col items-end justify-end\">\n <FieldError errors={_errors} />\n </div>\n </div>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { CalendarDaysIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { endOfToday, endOfTomorrow, endOfYesterday, format, lastDayOfMonth, startOfMonth, subDays } from '@customafk/react-toolkit/date-fns';\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\n\nimport type { TanStackFormDateFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport { Field, FieldContent, FieldContentMain, FieldDescription, FieldGroup, FieldLabel, FieldNote, FieldSeparator, FieldTooltip } from '../ui/field';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar } from '@/components/ui/calendar';\n\n/**\n * Props for the DateField component, derived from the TanStack Form date field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormDateFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'tooltip' | 'helperText' | 'orientation' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** Earliest selectable date; days before this are hidden in the calendar. */\n minDate?: Date;\n /** Latest selectable date; days after this are hidden in the calendar. */\n maxDate?: Date;\n};\n\n/**\n * A TanStack Form-connected date picker field combining a calendar popover with\n * quick-select presets (Today, Tomorrow, Yesterday, Last N Days, This/Last Month).\n *\n * @example\n * import { DateField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"dueDate\">\n * {() => (\n * <DateField\n * label=\"Due date\"\n * placeholder=\"Pick a date\"\n * minDate={new Date()}\n * required\n * />\n * )}\n * </form.Field>\n */\nexport const DateField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n orientation = 'responsive',\n tooltip,\n helperText,\n minDate,\n maxDate,\n required,\n}) => {\n const field = useTanStackFieldContext<Date | null>();\n\n const _isEmpty = useMemo(() => {\n if (required) return field.state.value === null;\n return false;\n }, [required, field.state.value]);\n\n const _isInvalid = useMemo(() => {\n return field.state.meta.isTouched && !field.state.meta.isValid;\n }, [field.state.meta.isTouched, field.state.meta.isValid]);\n\n return (\n <FieldGroup className=\"px-4\">\n <Field orientation={orientation} data-invalid={_isInvalid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain className=\"flex flex-col space-y-1\">\n <div className=\"flex w-full flex-col\">\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n color=\"muted\"\n size=\"lg\"\n className={cn(\n 'flex items-center justify-between rounded font-normal outline-border',\n 'hover:bg-transparent',\n 'focus:outline-1 focus:outline-primary-strong focus:ring-4 focus:ring-primary-weak',\n 'data-[state=open]:text-text-positive-muted',\n 'data-[state=open]:outline-1',\n 'data-[state=open]:outline-primary-strong',\n 'data-[state=open]:ring-4',\n 'data-[state=open]:ring-primary-weak',\n field.state.value === null && 'text-text-positive-muted'\n )}\n >\n <p>{field.state.value === null ? placeholder || 'Select date' : format(field.state.value, 'PPPP')}</p>\n <CalendarDaysIcon strokeWidth={1} />\n </Button>\n </PopoverTrigger>\n\n <PopoverContent align=\"start\" side=\"bottom\" className=\"flex w-fit min-w-0 overflow-y-auto rounded p-0\" onBlur={field.handleBlur}>\n <div className=\"flex h-full flex-col space-y-2 border-r border-r-border p-2 [&>button]:justify-start [&>button]:text-sm\">\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(endOfToday());\n }}\n >\n Today\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(endOfTomorrow());\n }}\n >\n Tomorrow\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(endOfYesterday());\n }}\n >\n Yesterday\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(subDays(endOfToday(), 3));\n }}\n >\n Last 3 Days\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(subDays(endOfToday(), 7));\n }}\n >\n Last 7 Days\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(subDays(endOfToday(), 30));\n }}\n >\n Last 30 Days\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(startOfMonth(endOfToday()));\n }}\n >\n This Month\n </Button>\n\n <Button\n variant=\"ghost\"\n color=\"muted\"\n className=\"w-32\"\n onClick={() => {\n field.handleChange(lastDayOfMonth(endOfToday()));\n }}\n >\n Last Month\n </Button>\n </div>\n <div className=\"flex flex-1 flex-col\">\n <div className=\"min-w-73 border-b border-b-border p-2\">\n <Calendar\n mode=\"single\"\n selected={field.state.value ?? undefined}\n hidden={{\n before: minDate ?? new Date(1900, 0, 1),\n after: maxDate ?? new Date(2100, 11, 31),\n }}\n onSelect={date => {\n if (!date) return;\n field.handleChange(date);\n }}\n />\n </div>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { AtSignIcon, XIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\nimport { useTanStackFieldContext } from '../../tanstack-form';\n\nimport type { TanStackFormEmailFieldSchema } from '../../schema';\n\n/**\n * Props for the EmailField component, derived from the TanStack Form email field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormEmailFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'orientation' | 'tooltip' | 'helperText' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** Maximum number of characters the user may enter. */\n maxLength?: number;\n};\n\n/**\n * A TanStack Form-connected email input field with an at-sign prefix icon,\n * optional clear button, and inline validation error display.\n *\n * @example\n * import { EmailField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"email\">\n * {() => (\n * <EmailField\n * label=\"Email address\"\n * placeholder=\"you@example.com\"\n * required\n * />\n * )}\n * </form.Field>\n */\nexport const EmailField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n tooltip,\n helperText,\n orientation = 'responsive',\n showErrorMessage = true,\n required = false,\n maxLength,\n}) => {\n const { form, name, state, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n\n const _invalid = state.meta.isDirty && state.meta.isTouched && !state.meta.isValid;\n const _isEmpty = required && state.value === null;\n const _showClear = !isSubmitting && !!state.value;\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n ({ target: { value } }) => {\n if (isSubmitting) return;\n if (maxLength && value.length > maxLength) return;\n handleChange(value || null);\n },\n [isSubmitting, maxLength, handleChange]\n );\n\n const onClear = useCallback(() => {\n if (isSubmitting) return;\n handleChange(null);\n }, [isSubmitting, handleChange]);\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field data-invalid={_invalid} orientation={orientation}>\n <FieldContent>\n <FieldLabel htmlFor={name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n <Input\n id={name}\n name={name}\n value={state.value === null ? '' : state.value}\n aria-invalid={_invalid}\n autoComplete=\"email\"\n placeholder={placeholder}\n className={cn('pl-9', _showClear && 'pr-9', isSubmitting && 'pointer-events-none bg-muted-muted opacity-60')}\n onBlur={handleBlur}\n onChange={onChange}\n />\n <div className=\"absolute top-0 left-0 flex size-9 items-center justify-center text-muted\">\n <AtSignIcon size={14} />\n </div>\n\n {_showClear && (\n <button\n type=\"button\"\n aria-label=\"Clear\"\n className=\"absolute inset-e-0 inset-y-0 top-3 flex h-fit w-8 cursor-pointer items-center justify-center rounded-e-md text-text-positive-weak outline-none transition-[color,box-shadow] hover:text-text-positive focus:text-text-positive-strong\"\n onClick={onClear}\n >\n <XIcon size={14} aria-hidden=\"true\" />\n </button>\n )}\n\n <div className=\"mt-1 flex w-full items-start justify-start\">\n {showErrorMessage && state.meta.isDirty && <FieldError errors={state.meta.errors} />}\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\n\nconst createValidationRegex = (allowNegative: boolean): RegExp => {\n return allowNegative ? /^-?\\d*\\.?\\d*$/ : /^\\d*\\.?\\d*$/;\n};\n\nconst formatNumberWithCommas = (num: number | string): string => {\n return Number(num).toLocaleString();\n};\n\nconst customRoundedValue = (value: number, precision: number, roundingRule: 'up' | 'down' | 'nearest' | 'none') => {\n if (roundingRule === 'none') return value;\n\n const factor = 10 ** precision;\n const scaledValue = value * factor;\n\n switch (roundingRule) {\n case 'up':\n return Math.ceil(scaledValue) / factor;\n case 'down':\n return Math.floor(scaledValue) / factor;\n case 'nearest': {\n if (scaledValue % 1 < 0.1) return Math.floor(scaledValue) / factor;\n if (scaledValue % 1 >= 0.59) return Math.ceil(scaledValue) / factor;\n return (Math.floor(scaledValue) + 0.5) / factor;\n }\n default: {\n return value;\n }\n }\n};\n\ntype TProps = React.HTMLAttributes<HTMLInputElement> & {\n /**\n * Description: Value for the text field\n *\n * Default: ''\n *\n * Usage: Value for the text field\n */\n value?: number | null | undefined;\n /**\n * Description: Disabled state of the text field\n *\n * Default: `false`\n *\n * Usage: Disabled state of the text field\n *\n * Note: If true, the text field will be disabled\n */\n disabled?: boolean;\n /**\n * Description: Readonly state of the text field\n *\n * Default: `false`\n *\n * Usage: Readonly state of the text field\n */\n readOnly?: boolean;\n /**\n * Description: Allow negative value for the text field\n *\n * Default: `false`\n *\n * Usage: Allow negative value for the text field\n */\n allowNegative?: boolean;\n /**\n * Description: Decimal point for the text field\n *\n * Default: `undefined`\n *\n * Usage: Ex: [12,3] => console.log(2323.23) // True\n *\n * Note: IF use this prop, `numberAfterDecimalPoint` will be ignored\n */\n decimal?: [number, number];\n /**\n * Description: Rounding rule for the text field\n *\n * Default: `nearest`\n *\n * Usage: Rounding rule for the text field\n * - 'up': Round up\n * - 'down': Round down\n * - 'nearest': Round to nearest\n * - 'none': No rounding\n *\n * E.g.\n * - Value: 2.135, precision: 2\n * - 'up' => 2.14\n * - 'down' => 2.13\n * - 'nearest' => 2.13\n * - 'none' => 2.135\n */\n roundingRule?: 'up' | 'down' | 'nearest' | 'none';\n /**\n * Description: Number of digits after the decimal point\n *\n * Default: `2`\n *\n * Usage: Number of digits after the decimal point\n */\n numberAfterDecimalPoint?: number;\n /**\n * Description: Placeholder for the text field\n *\n * Default: ''\n *\n * Usage: Placeholder for the text field\n */\n placeholder?: string;\n /**\n * Description: Unit text for the text field\n *\n * Default: ''\n *\n * E.g. 'kg', 'm', 'USD'...\n */\n unitText?: string;\n /**\n * Description: Invalid state of the text field\n *\n * Default: `false`\n *\n * Usage: Invalid state of the text field\n */\n invalid?: boolean;\n /**\n * Description: Precision for the text field\n *\n * Default: `undefined`\n * E.g.\n * - 2.13 => 2.1 when precision is 1\n * - 2.134 => 2.13 when precision is 2\n */\n precision?: number;\n /**\n * Description: Callback function for the value change\n * Usage: Callback function for the value change\n */\n wrapperClassName?: string;\n /**\n * Description: Callback function for the value change\n * Usage: Callback function for the value change\n */\n onValueChange?: (value: number | null) => void;\n /**\n * Description: Callback function for the blur event\n * Usage: Callback function for the blur event\n */\n onBlur?: () => void;\n};\n/**\n * ## Unit Text Field Component\n *\n * **Description**: This component is to display common text field with unit\n *\n * **Usage**: Text field with unit example: 1000 (kg), 100 (m), 1000 (USD)...\n */\nexport const NumberInput: React.FC<TProps> = ({\n disabled = false,\n readOnly = false,\n allowNegative = false,\n numberAfterDecimalPoint = 2,\n roundingRule = 'none',\n value = null,\n unitText,\n decimal,\n placeholder,\n precision,\n wrapperClassName,\n className,\n onChange,\n onValueChange,\n onFocus,\n onBlur,\n ...props\n}) => {\n const _unitRef = useRef<HTMLSpanElement>(null);\n const _inputRef = useRef<HTMLInputElement>(null);\n\n const [_value, _setValue] = useState<string | null>(value?.toString() ?? null);\n\n // Memoized values for validation and formatting\n const maxDecimalPlaces = useMemo(() => decimal?.[1] ?? numberAfterDecimalPoint, [decimal, numberAfterDecimalPoint]);\n const maxIntegerLength = useMemo(() => decimal && decimal[0] - decimal[1], [decimal]);\n const validationRegex = useMemo(() => createValidationRegex(allowNegative), [allowNegative]);\n\n // Validate decimal point is less than or equal to the limit\n const validateDecimalPoint = useCallback(\n (value: string) => {\n if (!maxDecimalPlaces || value === '-') return true;\n\n const [integerPart, decimalPart = ''] = value.split('.') as [string, string];\n const integerPartLength = integerPart.startsWith('-') ? integerPart.length - 1 : integerPart.length;\n const decimalPartLength = decimalPart.length;\n\n return decimalPartLength <= maxDecimalPlaces && integerPartLength <= (maxIntegerLength ?? Infinity);\n },\n [maxDecimalPlaces, maxIntegerLength]\n );\n const formattedValue = useCallback(\n (val: string) => {\n if (val === '0') return '0';\n if (!Number(val)) return null;\n\n const numValue = parseFloat(val);\n const effectivePrecision = Math.min(maxDecimalPlaces - 1, precision || 0);\n const roundedValue = customRoundedValue(numValue, effectivePrecision, roundingRule).toString();\n const [integerPart, decimalPart = ''] = roundedValue.split('.');\n const formattedInteger = formatNumberWithCommas(integerPart);\n return decimalPart ? `${formattedInteger}.${decimalPart}` : formattedInteger;\n },\n [maxDecimalPlaces, precision, roundingRule]\n );\n\n const handleZeroCase = useCallback(\n (value: string) => {\n // Check for zero\n const isZero = value === '0';\n // Check for negative zero patterns. E.g., '-0', '-0.0', '-0.000', '-0.'\n const isNegativeZero = value === '-' || /^-0+(\\.0+)?$/.test(value) || /^-0*\\.$/.test(value);\n if (isZero) {\n onValueChange?.(0);\n _setValue(value);\n return;\n }\n if (isNegativeZero) {\n _setValue(() => {\n onValueChange?.(0);\n return value;\n });\n return;\n }\n },\n [onValueChange]\n );\n const handleChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n e => {\n // Don't prevent default behavior of input change\n onChange?.(e);\n\n // Custom event handler for value change\n const { value: inputValue } = e.target;\n\n // Handle empty input\n if (inputValue === '' || inputValue === undefined) {\n onValueChange?.(null);\n _setValue(null);\n return;\n }\n\n // Handle zero and negative zero\n handleZeroCase(inputValue);\n\n // Validate input format\n if (!validationRegex.test(inputValue) || !validateDecimalPoint(inputValue)) return;\n\n const numericValue = parseFloat(inputValue) || 0;\n onValueChange?.(numericValue);\n _setValue(inputValue);\n },\n [validateDecimalPoint, onChange, onValueChange, handleZeroCase, validationRegex]\n );\n\n const handleFocus = useCallback<React.FocusEventHandler<HTMLInputElement>>(\n e => {\n if (readOnly) return;\n onFocus?.(e);\n _setValue(prev => (typeof prev === 'string' ? prev.replace(/,/g, '') : null)); // Remove commas for easier editing\n },\n [readOnly, onFocus]\n );\n\n const handleBlur = useCallback<React.FocusEventHandler<HTMLInputElement>>(\n e => {\n if (readOnly) return;\n onBlur?.(e);\n _setValue(prev => {\n if (prev === null) return null;\n const isZero = prev === '0' || prev === '-' || /^-0+(\\.0+)?$/.test(prev) || /^-0*\\.$/.test(prev);\n if (isZero) return '0';\n return typeof prev === 'string' ? formattedValue(prev) : null;\n });\n },\n [readOnly, formattedValue, onBlur]\n );\n\n // Set initial value\n useEffect(() => {\n const isFocused = document.activeElement === _inputRef.current;\n\n if (value === undefined || value === null || !validationRegex.test(value.toString()) || !validateDecimalPoint(value.toString())) {\n _setValue(null);\n return;\n }\n\n _setValue(prev => (isFocused ? prev : formattedValue(value.toString())));\n }, [formattedValue, value, validateDecimalPoint, validationRegex]);\n\n // Set padding right for the input field\n useEffect(() => {\n if (!_unitRef.current || !_inputRef.current || !unitText) return;\n const unitWidth = _unitRef.current.offsetWidth;\n _inputRef.current.style.setProperty('padding-right', `${(unitWidth + 10) / 16}rem`);\n }, [unitText]);\n\n return (\n <div className={cn('relative', wrapperClassName)}>\n <Input\n {...props}\n ref={_inputRef}\n value={_value || (readOnly ? '0' : '')}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n className={cn('text-end font-number text-sm slashed-zero lining-nums tabular-nums', readOnly && 'bg-muted text-muted-foreground', className)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n {unitText && (\n <span ref={_unitRef} className=\"-translate-y-1/2 pointer-events-none absolute top-1/2 right-2 text-muted-foreground text-sm\">\n {unitText}\n </span>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { BanIcon, Loader2Icon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { NumberInput } from '@/components/ui/inputs/number-input';\n\nimport type { TanStackFormNumberFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\n/**\n * Props for the NumberField component, derived from the TanStack Form number field schema.\n */\ntype NumberFieldProps = Pick<\n z.input<typeof TanStackFormNumberFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'orientation' | 'tooltip' | 'helperText' | 'rounding' | 'decimalPlaces' | 'percision' | 'unit' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** When true, the input accepts negative numbers. */\n allowNegative?: boolean;\n};\n\n/**\n * A TanStack Form-connected numeric input field supporting rounding rules,\n * decimal precision, unit labels, and submission-state feedback.\n *\n * @example\n * import { NumberField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"quantity\">\n * {() => (\n * <NumberField\n * label=\"Quantity\"\n * placeholder=\"0\"\n * unit=\"pcs\"\n * decimalPlaces={2}\n * required\n * />\n * )}\n * </form.Field>\n */\nexport const NumberField: React.FC<NumberFieldProps> = ({\n label,\n description,\n placeholder,\n\n tooltip,\n helperText,\n orientation = 'responsive',\n showErrorMessage = true,\n rounding,\n decimalPlaces,\n percision,\n unit,\n\n required,\n allowNegative,\n}) => {\n const field = useTanStackFieldContext<number | null>();\n\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n\n const _errors = field.state.meta.errors;\n const _isEmpty = required ? field.state.value === null : false;\n\n const onValueChange = useCallback(\n (value: number | null) => {\n if (isSubmitting) return;\n field.handleChange(value);\n },\n [isSubmitting, field.handleChange]\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={field.state.meta.isTouched && !field.state.meta.isValid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n\n <FieldContentMain>\n <div className=\"relative w-full\">\n <NumberInput\n id={field.name}\n value={field.state.value}\n aria-invalid={field.state.meta.isTouched && !field.state.meta.isValid && field.state.meta.isDirty}\n placeholder={placeholder}\n roundingRule={rounding}\n numberAfterDecimalPoint={decimalPlaces}\n precision={percision}\n unitText={unit}\n allowNegative={allowNegative}\n className={cn(isSubmitting && 'pointer-events-none bg-muted-muted opacity-60')}\n onBlur={field.handleBlur}\n onValueChange={onValueChange}\n />\n {isSubmitting && (\n <div className=\"absolute inset-s-2 inset-y-0 top-2.5 text-muted-weak [&>svg]:size-3.5\">\n <Loader2Icon className=\"animate-spin text-primary-strong\" />\n </div>\n )}\n {field.state.meta.isDirty && showErrorMessage && !!_errors.length && (\n <div className=\"absolute inset-s-2 inset-y-0 top-2.75 text-danger-strong [&>svg]:size-3.5\">\n <BanIcon />\n </div>\n )}\n <div className=\"mt-1 flex w-full flex-col items-end justify-end\">\n {field.state.meta.isDirty && showErrorMessage && <FieldError errors={_errors} />}\n </div>\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useCallback, useId, useState } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { EyeIcon, EyeOffIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { Input } from '@/components/ui/input';\n\nimport type { TanStackFormPasswordFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\n/**\n * Props for the PasswordField component, derived from the TanStack Form password field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormPasswordFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'orientation' | 'tooltip' | 'helperText' | 'showErrorMessage'\n>;\n\n/**\n * A TanStack Form-connected password input field with a show/hide toggle button\n * and inline validation error display.\n *\n * @example\n * import { PasswordField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"password\">\n * {() => (\n * <PasswordField\n * label=\"Password\"\n * placeholder=\"Enter your password\"\n * helperText=\"Must be at least 8 characters\"\n * />\n * )}\n * </form.Field>\n */\nexport const PasswordField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n orientation = 'responsive',\n tooltip,\n helperText,\n showErrorMessage = true,\n}) => {\n const id = useId();\n const { form, name, state, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n\n const [isVisible, setIsVisible] = useState<boolean>(false);\n\n const _invalid = state.meta.isDirty && state.meta.isTouched && !state.meta.isValid;\n\n const toggleVisibility = useCallback(() => setIsVisible(prev => !prev), []);\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n ({ target: { value } }) => {\n if (isSubmitting) return;\n handleChange(value || null);\n },\n [isSubmitting, handleChange]\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field data-invalid={_invalid} orientation={orientation}>\n <FieldContent>\n <FieldLabel htmlFor={id}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n <Input\n id={id}\n name={name}\n type={isVisible ? 'text' : 'password'}\n placeholder={placeholder}\n value={state.value ?? ''}\n aria-invalid={_invalid}\n autoComplete=\"new-password\"\n onBlur={handleBlur}\n onChange={onChange}\n />\n\n <button\n className=\"absolute inset-e-0 inset-y-0 flex size-9 items-center justify-center rounded-e-md text-muted outline-none transition-[color,box-shadow] focus:z-10 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n type=\"button\"\n onClick={toggleVisibility}\n aria-label={isVisible ? 'Hide password' : 'Show password'}\n aria-pressed={isVisible}\n aria-controls={id}\n >\n {isVisible ? <EyeOffIcon size={16} aria-hidden=\"true\" /> : <EyeIcon size={16} aria-hidden=\"true\" />}\n </button>\n\n <div className=\"mt-1 flex w-full items-start justify-start\">\n {showErrorMessage && state.meta.isDirty && <FieldError errors={state.meta.errors} />}\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport type { TanStackFormRadioGroupFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTitle,\n FieldTooltip,\n} from '../ui/field';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\n\ntype Props = Pick<z.input<typeof TanStackFormRadioGroupFieldSchema>, 'label' | 'description' | 'options' | 'orientation' | 'helperText' | 'tooltip'>;\n\nexport const RadioGroupField: React.FC<Props> = ({ label, description, orientation, options, tooltip, helperText }) => {\n const field = useTanStackFieldContext<string | null>();\n const isSubmitting = useStore(field.form.store, ({ isSubmitting }) => isSubmitting);\n\n return (\n <FieldGroup className=\"px-4\">\n <Field orientation={orientation} className=\"flex-col gap-2\">\n <FieldContent>\n <FieldLabel>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContent>\n\n <FieldContentMain>\n <RadioGroup value={field.state.value ?? ''} className=\"w-full\" onValueChange={field.handleChange}>\n {options.map(option => (\n <FieldLabel\n key={option.value}\n className={cn(\n 'h-fit',\n field.state.value === option.value && 'border-primary-weak! bg-primary-bg-subtle',\n isSubmitting && 'pointer-events-none bg-muted-muted opacity-60',\n field.state.value === option.value && isSubmitting && 'border-border-strong!'\n )}\n >\n <Field orientation=\"horizontal\" className=\"items-start gap-3 rounded p-2!\">\n <RadioGroupItem value={option.value} className=\"mt-0.5 shrink-0\" />\n <FieldContent className=\"gap-0.5!\">\n <FieldTitle>{option.label}</FieldTitle>\n <FieldDescription className=\"text-xs\">{option.description}</FieldDescription>\n </FieldContent>\n </Field>\n </FieldLabel>\n ))}\n </RadioGroup>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { PackagePlusIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport type { TanStackFormSelectFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\n\n/**\n * Props for the SelectField component, derived from the TanStack Form select field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormSelectFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'defaultValue' | 'options' | 'tooltip' | 'helperText' | 'orientation' | 'clearable'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n};\n\n/**\n * A TanStack Form-connected single-select dropdown field backed by Radix UI Select,\n * with an empty-state illustration when no options are provided.\n *\n * @example\n * import { SelectField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"country\">\n * {() => (\n * <SelectField\n * label=\"Country\"\n * placeholder=\"Select a country\"\n * options={[\n * { value: 'jp', label: 'Japan' },\n * { value: 'vn', label: 'Vietnam' },\n * ]}\n * required\n * />\n * )}\n * </form.Field>\n */\nexport const SelectField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n\n orientation = 'responsive',\n\n tooltip,\n options,\n helperText,\n required = false,\n}) => {\n const field = useTanStackFieldContext<string | null>();\n\n const _isInvalid = field.state.meta.isTouched && !field.state.meta.isValid;\n const _isEmpty = required && field.state.value === null;\n const _errors = field.state.meta.errors;\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_isInvalid}>\n <FieldContent>\n <FieldLabel htmlFor={field.name} aria-required={_isEmpty}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain className=\"flex flex-col\">\n <Select value={field.state.value ?? ''} onValueChange={field.handleChange}>\n <SelectTrigger aria-invalid={_isInvalid ? 'true' : undefined} onBlur={field.handleBlur}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {!!options.length &&\n options.map(option => {\n return (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n );\n })}\n {!options.length && (\n <div className=\"flex items-center justify-center gap-x-2 rounded border border-border bg-muted-muted px-4 py-6.5 text-center text-sm text-text-positive-weak\">\n <PackagePlusIcon strokeWidth={1} />\n No options available\n </div>\n )}\n </SelectContent>\n </Select>\n\n <div className=\"mt-1 flex w-full flex-col items-end justify-end\">\n <FieldError errors={_errors} />\n </div>\n\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Switch as SwitchPrimitive } from 'radix-ui';\n\n/**\n * Accessible toggle switch built on Radix UI, styled with primary-color checked state and smooth thumb transition.\n *\n * @example\n * import { Switch } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Switch defaultChecked onCheckedChange={(checked) => console.log(checked)} />\n */\nfunction Switch({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n 'peer',\n 'w-8 shrink-0 cursor-pointer items-center rounded-full shadow-xs transition-all',\n 'inline-flex h-5',\n 'focus-visible:border-primary-strong',\n 'focus-visible:ring-primary-weak',\n 'focus-visible:ring-4',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n\n '-outline-offset-1 inset-shadow-2xs outline-1',\n\n 'data-[state=checked]:bg-primary',\n 'data-[state=checked]:outline-primary-strong',\n\n 'data-[state=unchecked]:bg-muted-weak',\n 'data-[state=unchecked]:outline-border',\n\n 'data-[state=unchecked]:[&_span]:size-4',\n 'data-[state=unchecked]:[&_span]:translate-x-0.5',\n 'data-[state=unchecked]:[&_span]:rtl:-translate-x-0.5',\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n 'block size-4 bg-card shadow-xs',\n 'pointer-events-none rounded-full ring-0 transition-transform',\n 'data-[state=checked]:translate-x-[calc(100%-3px)]',\n 'data-[state=unchecked]:translate-x-0'\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","'use client';\n\nimport type z from 'zod';\n\nimport type { TanStackFormSwitchFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport { Field, FieldContent, FieldDescription, FieldGroup, FieldNote, FieldSeparator, FieldTitle } from '../ui/field';\nimport { Switch } from '../ui/switch';\n\n/**\n * Props for the SwitchField component, derived from the TanStack Form switch field schema.\n */\ntype Props = Pick<z.input<typeof TanStackFormSwitchFieldSchema>, 'label' | 'description' | 'helperText'>;\n\n/**\n * A TanStack Form-connected boolean toggle field rendered as a labelled switch,\n * positioned absolutely in the top-right corner of the field card.\n *\n * @example\n * import { SwitchField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"notifications\">\n * {() => (\n * <SwitchField\n * label=\"Enable notifications\"\n * description=\"Receive email alerts for important events\"\n * helperText=\"You can change this at any time\"\n * />\n * )}\n * </form.Field>\n */\nexport const SwitchField: React.FC<Props> = ({ label, description, helperText }) => {\n const field = useTanStackFieldContext<boolean | null>();\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation=\"vertical\" className=\"relative justify-between gap-y-1\">\n <FieldContent>\n <FieldTitle className=\"cursor-pointer\">\n <label htmlFor={field.name}>{label}</label>\n </FieldTitle>\n <FieldDescription>{description}</FieldDescription>\n <Switch\n id={field.name}\n checked={field.state.value ?? false}\n className=\"absolute top-1 right-1\"\n onBlur={field.handleBlur}\n onCheckedChange={field.handleChange}\n />\n </FieldContent>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { useCallback, useId, useMemo, useRef } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { BanIcon, Loader2Icon, XIcon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Input } from '@/components/ui/input';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '@/components/features/tanstack-form/components/ui/field';\nimport { useTanStackFieldContext } from '../../tanstack-form';\n\nimport type { TanStackFormTextFieldSchema } from '../../schema';\n\n/**\n * Props for the TextField component, derived from the TanStack Form text field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormTextFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'orientation' | 'counter' | 'tooltip' | 'helperText' | 'showClearButton' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** Maximum number of characters allowed; enforced when `counter` is true. */\n maxLength?: number;\n};\n\n/**\n * A TanStack Form-connected single-line text input field with optional character counter,\n * clear button, error display, and submission-state feedback.\n *\n * @example\n * import { TextField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"username\">\n * {() => (\n * <TextField\n * label=\"Username\"\n * placeholder=\"Enter username\"\n * counter\n * maxLength={50}\n * showClearButton\n * />\n * )}\n * </form.Field>\n */\nexport const TextField: React.FC<Props> = ({\n label,\n description,\n placeholder,\n\n tooltip,\n helperText,\n counter = false,\n orientation = 'responsive',\n showClearButton = false,\n showErrorMessage = true,\n\n required = false,\n maxLength,\n}) => {\n const id = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const { form, name, state, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n\n const _showClearButton = showClearButton && !isSubmitting && !!state.value;\n\n const _count = state.value ? state.value.length : 0;\n\n const _countText = useMemo(() => {\n if (!counter) return '';\n const unit = `character${[0, 1].includes(_count) ? '' : 's'}`;\n if (counter && maxLength) return `${_count} / ${maxLength} character${!_count ? '' : 's'}`;\n return `${_count} ${unit}`;\n }, [_count, counter, maxLength]);\n\n const _invalid = state.meta.isDirty && state.meta.isTouched && !state.meta.isValid;\n const _isEmpty = required && state.value === null;\n\n const _isNearLimit = maxLength && _count >= maxLength * 0.8;\n const _isAtLimit = maxLength && _count >= maxLength;\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n ({ target: { value } }) => {\n if (isSubmitting) return;\n if (counter && maxLength && value.length > maxLength) return;\n handleChange(value || null);\n },\n [isSubmitting, counter, maxLength, handleChange]\n );\n\n const onClear = useCallback(() => {\n if (isSubmitting) return;\n handleChange(null);\n inputRef.current?.focus();\n }, [isSubmitting, handleChange]);\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={id}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n <Input\n ref={inputRef}\n id={id}\n name={name}\n value={state.value ?? ''}\n aria-invalid={_invalid}\n autoComplete=\"off\"\n placeholder={placeholder}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n className={cn('pr-6', isSubmitting && 'pointer-events-none bg-muted-muted opacity-60')}\n onBlur={handleBlur}\n onChange={onChange}\n />\n {_showClearButton && (\n <button\n type=\"button\"\n aria-label=\"Clear\"\n className=\"absolute inset-e-0 inset-y-0 top-3 flex h-fit w-8 cursor-pointer items-center justify-center rounded-e-md text-text-positive-weak outline-none transition-[color,box-shadow] hover:text-text-positive focus:text-text-positive-intense [&>svg]:size-3.5\"\n onClick={onClear}\n >\n <XIcon aria-hidden=\"true\" />\n </button>\n )}\n {isSubmitting && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-muted-weak\">\n <Loader2Icon size={14} className=\"animate-spin text-primary-strong\" />\n </div>\n )}\n {!_showClearButton && state.meta.isDirty && showErrorMessage && !!state.meta.errors.length && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-danger-strong\">\n <BanIcon aria-hidden=\"true\" size={14} />\n </div>\n )}\n <div className=\"my-1 flex w-full items-start justify-between gap-x-2\">\n {state.meta.isDirty && showErrorMessage ? <FieldError className=\"flex-1\" errors={state.meta.errors} /> : <div />}\n {!!counter && (\n <p\n className={cn(\n 'h-4 flex-0 text-nowrap text-end text-xs tabular-nums transition-colors',\n _isAtLimit ? 'font-medium text-danger-strong' : _isNearLimit ? 'text-warning-strong' : 'text-text-positive-weak'\n )}\n >\n {_countText}\n </p>\n )}\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { memo, useCallback, useId, useMemo } from 'react';\n\nimport { useStore } from '@tanstack/react-form';\n\nimport { BanIcon, Loader2Icon } from 'lucide-react';\nimport type z from 'zod';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Textarea } from '@/components/ui/textarea';\n\nimport type { TanStackFormTextAreaFieldSchema } from '../../schema';\nimport { useTanStackFieldContext } from '../../tanstack-form';\nimport {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n FieldTooltip,\n} from '../ui/field';\n\n/**\n * Props for the TextareaField component, derived from the TanStack Form textarea field schema.\n */\ntype Props = Pick<\n z.input<typeof TanStackFormTextAreaFieldSchema>,\n 'label' | 'description' | 'placeholder' | 'counter' | 'tooltip' | 'helperText' | 'orientation' | 'showErrorMessage'\n> & {\n /** Marks the field as required; triggers an empty-state indicator when the value is null. */\n required?: boolean;\n /** Maximum number of characters allowed; enforced when `counter` is true. */\n maxLength?: number;\n};\n\n/**\n * A TanStack Form-connected multi-line textarea field with optional character counter,\n * error display, and submission-state feedback. Wrapped in `React.memo` to prevent\n * unnecessary re-renders.\n *\n * @example\n * import { TextareaField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <form.Field name=\"bio\">\n * {() => (\n * <TextareaField\n * label=\"Bio\"\n * placeholder=\"Tell us about yourself…\"\n * counter\n * maxLength={200}\n * />\n * )}\n * </form.Field>\n */\nexport const TextareaField: React.FC<Props> = memo(\n ({\n label,\n description,\n placeholder,\n\n tooltip,\n helperText,\n counter = false,\n orientation = 'responsive',\n showErrorMessage = true,\n\n required = false,\n maxLength,\n }) => {\n const id = useId();\n const { form, state, name, handleBlur, handleChange } = useTanStackFieldContext<string | null>();\n\n const isSubmitting = useStore(form.store, ({ isSubmitting }) => isSubmitting);\n\n const _count = state.value ? state.value.length : 0;\n\n const _countText = useMemo(() => {\n if (!counter) return '';\n const unit = `character${[0, 1].includes(_count) ? '' : 's'}`;\n if (counter && maxLength) return `${_count} / ${maxLength} character${!_count ? '' : 's'}`;\n return `${_count} ${unit}`;\n }, [_count, counter, maxLength]);\n\n const _invalid = state.meta.isDirty && state.meta.isTouched && !state.meta.isValid;\n const _isEmpty = required && state.value === null;\n const _errors = state.meta.errors;\n\n const _isNearLimit = maxLength && _count >= maxLength * 0.8;\n const _isAtLimit = maxLength && _count >= maxLength;\n\n const onChange = useCallback<React.ChangeEventHandler<HTMLTextAreaElement>>(\n ({ target: { value } }) => {\n if (isSubmitting) return;\n if (counter && maxLength && value.length > maxLength) return;\n handleChange(value || null);\n },\n [isSubmitting, counter, maxLength, handleChange]\n );\n\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation} data-invalid={_invalid}>\n <FieldContent>\n <FieldLabel aria-required={_isEmpty} htmlFor={id}>\n {label}\n {tooltip && <FieldTooltip tooltip={tooltip} />}\n </FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n <Textarea\n id={id}\n name={name}\n value={state.value === null ? '' : state.value}\n aria-invalid={_invalid}\n autoCapitalize=\"none\"\n autoComplete=\"off\"\n placeholder={placeholder}\n className={cn(isSubmitting && 'pointer-events-none bg-muted-muted opacity-60')}\n onChange={onChange}\n onBlur={handleBlur}\n />\n {isSubmitting && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-muted-weak\">\n <Loader2Icon size={14} className=\"animate-spin text-primary-strong\" />\n </div>\n )}\n {state.meta.isDirty && showErrorMessage && !!_errors.length && (\n <div className=\"absolute inset-e-2 inset-y-0 top-2.5 text-danger-strong\">\n <BanIcon size={14} />\n </div>\n )}\n <div className=\"my-1 flex w-full items-start justify-between gap-x-2\">\n {state.meta.isDirty && showErrorMessage ? <FieldError className=\"flex-1\" errors={state.meta.errors} /> : <div />}\n {!!counter && (\n <p\n className={cn(\n 'h-4 flex-0 text-nowrap text-end text-xs tabular-nums transition-colors',\n _isAtLimit ? 'font-medium text-danger-strong' : _isNearLimit ? 'text-warning-strong' : 'text-text-positive-weak'\n )}\n >\n {_countText}\n </p>\n )}\n </div>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n }\n);\nTextareaField.displayName = 'TextareaField';\n","import { useCallback } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\n\nimport { useTanStackFormContext } from '../../tanstack-form';\n\n/**\n * Renders a submit button wired to the current TanStack Form context, automatically handling loading and disabled states.\n *\n * @example\n * import { TanStackActionSubmit } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * // Inside a TanStack Form provider:\n * <TanStackActionSubmit label=\"Save Changes\" className=\"mt-4\" />\n */\nexport const TanStackActionSubmit: React.FC<{\n /** Button label text. Defaults to `'Submit'` when omitted. */\n label?: string;\n /** Additional CSS class names applied to the button element. */\n className?: string;\n}> = ({ label, className }) => {\n const form = useTanStackFormContext();\n\n const onSubmit = useCallback(async () => {\n await form.handleSubmit({ submitAction: 'submit' });\n if (!form.state.isSubmitSuccessful) return;\n form.reset();\n }, [form]);\n return (\n <form.Subscribe\n selector={state => ({\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit || state.isDefaultValue,\n isSubmitting: state.isSubmitting,\n })}\n children={({ disabled, isSubmitting }) => {\n return (\n <Button type=\"button\" size=\"md\" disabled={disabled} isLoading={isSubmitting} className={cn('min-h-8 min-w-32', className)} onClick={onSubmit}>\n {label ?? 'Submit'}\n </Button>\n );\n }}\n />\n );\n};\n","import { ArrowDownToLine, PlusIcon } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\n\nimport { useTanStackFormContext } from '../../tanstack-form';\n\n/**\n * Renders a form action bar with a Cancel button and a context-aware submit button (Add New or Update) driven by TanStack Form state.\n *\n * @example\n * import { TanStackActionsForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * // Inside a TanStack Form provider:\n * <TanStackActionsForm type=\"create\" />\n *\n * // For an update workflow:\n * <TanStackActionsForm type=\"update\" />\n */\nexport const TanStackActionsForm: React.FC<\n React.PropsWithChildren<{\n /**\n * Determines which submit button variant is rendered.\n * - `'create'` — shows an \"Add New\" button that resets the form on success.\n * - `'update'` — shows an \"Update\" button that resets the form on success.\n * Defaults to `'create'`.\n */\n type?: 'create' | 'update';\n }>\n> = ({ type = 'create' }) => {\n const form = useTanStackFormContext();\n return (\n <div className=\"flex h-8 items-center justify-between\">\n <form.Subscribe\n selector={state => ({\n disabled: state.isPristine || state.isSubmitting,\n })}\n children={({ disabled }) => {\n return (\n <Button color=\"muted\" variant=\"outline\" type=\"button\" size=\"md\" disabled={disabled} className=\"h-full min-w-32\" onClick={() => form.reset()}>\n Cancel\n </Button>\n );\n }}\n />\n {type === 'create' && (\n <form.Subscribe\n selector={state => ({\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit || state.isDefaultValue,\n isSubmitting: state.isSubmitting,\n })}\n children={({ disabled, isSubmitting }) => {\n return (\n <Button\n type=\"submit\"\n size=\"md\"\n disabled={disabled}\n isLoading={isSubmitting}\n className=\"h-full min-w-32\"\n onClick={async () => {\n await form.handleSubmit({ submitAction: 'create' });\n if (!form.state.isSubmitSuccessful) return;\n form.reset();\n }}\n >\n <PlusIcon />\n Add New\n </Button>\n );\n }}\n />\n )}\n {type === 'update' && (\n <form.Subscribe\n selector={state => ({\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit || state.isDefaultValue,\n isSubmitting: state.isSubmitting,\n })}\n children={({ disabled, isSubmitting }) => {\n return (\n <Button\n type=\"submit\"\n size=\"md\"\n disabled={disabled}\n isLoading={isSubmitting}\n className=\"h-full min-w-32\"\n onClick={async () => {\n await form.handleSubmit({ submitAction: 'update' });\n if (!form.state.isSubmitSuccessful) return;\n form.reset();\n }}\n >\n <ArrowDownToLine />\n Update\n </Button>\n );\n }}\n />\n )}\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Separator as SeparatorPrimitive } from 'radix-ui';\n\n/**\n * Thin decorative divider line that supports horizontal and vertical orientations via Radix UI Separator.\n *\n * @example\n * import { Separator } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <Separator orientation=\"horizontal\" />\n */\nfunction Separator({ className, orientation = 'horizontal', decorative = true, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border-weak',\n 'data-[orientation=horizontal]:h-px',\n 'data-[orientation=horizontal]:w-full',\n 'data-[orientation=vertical]:h-full',\n 'data-[orientation=vertical]:w-px',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","'use client';\n\nimport { Trash2Icon } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\n\nimport { Separator } from '../ui/separator';\n\n/**\n * Renders a card-style form section with a header, optional description, a delete button, and a content area for fields.\n *\n * @example\n * import { TanStackCardForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackCardForm\n * title=\"Shipping Address\"\n * description=\"Where should we deliver your order?\"\n * onDelete={() => removeAddress(id)}\n * >\n * <TextField name=\"street\" />\n * </TanStackCardForm>\n */\nexport const TanStackCardForm: React.FC<\n React.PropsWithChildren<{\n /** Bold heading text shown at the top of the card. */\n title: string;\n /** Optional secondary text rendered beneath the title. */\n description?: string;\n /** When provided, renders a danger \"Remove\" button in the card's top-right corner. */\n onDelete?: () => void | Promise<void>;\n }>\n> = ({ title, description, onDelete, children }) => {\n return (\n <section data-slot=\"card-form\" className=\"relative flex flex-col rounded-md bg-card pb-4 shadow-card ring-1 ring-border\">\n <div data-slot=\"card-form-header\" className=\"flex flex-col space-y-0.5 px-4 py-3\">\n <p className=\"font-semibold text-base tracking-tight\">{title}</p>\n {!!description && <p className=\"text-text-positive-weak text-sm\">{description}</p>}\n </div>\n <Separator />\n <div data-slot=\"card-form-main\" className=\"flex flex-col py-4\">\n {children}\n </div>\n {!!onDelete && (\n <Button\n color=\"danger\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-2.5 right-3\"\n onClick={e => {\n onDelete?.();\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <Trash2Icon />\n Remove\n </Button>\n )}\n </section>\n );\n};\n","/**\n * Wraps a set of TanStack form sections in a vertically-stacked flex container.\n *\n * @example\n * import { TanStackContainerForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackContainerForm>\n * <TanStackSectionForm title=\"Personal Info\">\n * {/* fields *\\/}\n * </TanStackSectionForm>\n * </TanStackContainerForm>\n */\nexport const TanStackContainerForm: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <div data-slot=\"section-form\" className=\"flex flex-col space-y-4\">\n {children}\n </div>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\n\n/**\n * Secondary outline button used to dismiss or cancel a form without submitting, defaulting to the label \"Cancel\".\n *\n * @example\n * import { CancelButton } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <CancelButton onClick={() => router.back()} />\n */\nexport const CancelButton: React.FC<React.ComponentProps<'button'>> = ({ disabled, className, onClick, children }) => {\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"muted\"\n disabled={disabled}\n className={cn('min-w-40', className)}\n onClick={onClick as React.MouseEventHandler<HTMLButtonElement>}\n >\n {children ?? 'Cancel'}\n </Button>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\n\n/**\n * Props for the {@link SubmitButton} component.\n */\ntype SubmitButtonProps = React.ComponentProps<'button'> & {\n /**\n * When `true` the button enters a loading state and is automatically disabled to prevent duplicate submissions.\n */\n isSubmitting?: boolean;\n /**\n * Label text rendered inside the button.\n * @default 'Submit'\n */\n submitText?: string;\n};\n\n/**\n * Primary form submission button that shows a loading indicator while the form is being submitted.\n *\n * @example\n * import { SubmitButton } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <SubmitButton isSubmitting={form.state.isSubmitting} submitText=\"Save changes\" />\n */\nexport const SubmitButton: React.FC<SubmitButtonProps> = ({ isSubmitting, submitText = 'Submit', disabled, className, onClick }) => {\n return (\n <Button\n type=\"button\"\n isLoading={isSubmitting}\n disabled={disabled || isSubmitting}\n className={cn('min-w-40', className)}\n onClick={onClick as React.MouseEventHandler<HTMLButtonElement>}\n >\n {submitText}\n </Button>\n );\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { Separator } from '@/components/ui/separator';\n\nimport { useTanStackFormContext } from '../../tanstack-form';\nimport { CancelButton } from '../ui/cancel-button';\nimport { SubmitButton } from '../ui/submit-button';\nimport { Dialog, DialogContent, DialogOverlay, DialogPortal, DialogTitle } from '@/components/ui/dialog';\n\n/**\n * Renders a modal dialog that wraps a TanStack Form with a title, scrollable content area, and built-in submit/cancel actions.\n *\n * @example\n * import { TanStackDialogForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackDialogForm\n * title=\"Create User\"\n * submitText=\"Create\"\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * >\n * <NameField />\n * <EmailField />\n * </TanStackDialogForm>\n */\nexport const TanStackDialogForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the dialog title bar. */\n title: string;\n /** Custom label for the submit button. Defaults to the `SubmitButton` component's built-in label when omitted. */\n submitText?: string;\n /** Controlled open state of the dialog. */\n open?: boolean;\n /** Callback fired when the dialog open state changes; the form is reset on close. */\n onOpenChange?: (open: boolean) => void;\n }>\n> = ({ title, submitText, open, onOpenChange, children }) => {\n const form = useTanStackFormContext();\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) form.reset();\n onOpenChange?.(open);\n },\n [form.reset, onOpenChange]\n );\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogContent className=\"flex size-full max-h-dvh max-w-dvw flex-col gap-0 overflow-y-auto p-0 shadow-dialog sm:h-auto sm:max-h-[85dvh] sm:max-w-2xl sm:rounded-md\">\n <div data-slot=\"dialog-header\" className=\"flex items-center justify-center gap-2 px-6 py-5 text-center sm:text-left\">\n <DialogTitle data-slot=\"dialog-title\" className=\"text-lg font-semibold tracking-tight\">\n {title}\n </DialogTitle>\n </div>\n <Separator />\n <div data-slot=\"dialog-content\" className=\"relative flex flex-col overflow-y-auto p-0 pt-4 max-sm:flex-1 sm:p-4\">\n {children}\n </div>\n <Separator />\n <div data-slot=\"dialog-footer\" className=\"flex flex-col-reverse items-center justify-end gap-2 px-6 py-4 sm:flex-row max-sm:[&>button]:w-full\">\n <form.Subscribe\n selector={state => ({ disabled: state.isSubmitting })}\n children={({ disabled }) => (\n <CancelButton\n disabled={disabled}\n onClick={() => {\n form.reset();\n handleOpenChange(false);\n }}\n />\n )}\n />\n <form.Subscribe\n selector={state => ({\n isSubmitting: state.isSubmitting,\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit,\n })}\n children={({ isSubmitting, disabled }) => (\n <SubmitButton isSubmitting={isSubmitting} disabled={disabled} submitText={submitText} onClick={() => form.handleSubmit()} />\n )}\n />\n </div>\n </DialogContent>\n </DialogPortal>\n </Dialog>\n );\n};\n","import {\n Field,\n FieldContent,\n FieldContentMain,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldNote,\n FieldSeparator,\n} from '@/components/features/tanstack-form/components/ui/field';\n\n/**\n * Renders a labeled field group with an optional description, helper text, and a bottom separator.\n *\n * @example\n * import { TanStackFieldGroup } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackFieldGroup\n * label=\"Contact Details\"\n * description=\"Enter your contact information.\"\n * helperText=\"All fields are required.\"\n * orientation=\"horizontal\"\n * >\n * <EmailField />\n * </TanStackFieldGroup>\n */\nexport const TanStackFieldGroup: React.FC<\n React.PropsWithChildren<{\n /** Primary label displayed above the field content. */\n label: string;\n /** Secondary descriptive text shown beneath the label. */\n description?: string;\n /** Supplementary helper note rendered below the field content. */\n helperText?: string;\n /** Layout orientation of the label-to-content axis. Defaults to `'responsive'`. */\n orientation?: 'horizontal' | 'vertical' | 'responsive';\n }>\n> = ({\n label,\n description,\n helperText,\n\n orientation = 'responsive',\n children,\n}) => {\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field orientation={orientation}>\n <FieldContent>\n <FieldLabel>{label}</FieldLabel>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldContentMain>\n {children}\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </FieldContentMain>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","'use client';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { CloseButton } from '@/components/ui/buttons/close';\n\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport { useTanStackFormContext } from '../../tanstack-form';\nimport { CancelButton } from '../ui/cancel-button';\nimport { SubmitButton } from '../ui/submit-button';\n\n/**\n * Renders a slide-in side-panel dialog that wraps a TanStack form with built-in submit and cancel actions.\n *\n * @example\n * import { TanStackPopoverForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackPopoverForm\n * title=\"Edit Profile\"\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * >\n * <EmailField />\n * </TanStackPopoverForm>\n */\nexport const TanStackPopoverForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the panel header. */\n title: string;\n /** Controlled open state of the popover dialog. */\n open?: boolean;\n /** Additional CSS class names applied to the scrollable content area. */\n contentClassName?: string;\n /** Callback fired when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n }>\n> = ({ title, open, contentClassName, onOpenChange, children }) => {\n const form = useTanStackFormContext();\n\n return (\n <DialogPrimitive.Root data-slot=\"dialog\" open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal data-slot=\"dialog-portal\">\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-40 bg-black/40 backdrop-blur-sm',\n 'data-[state=open]:animate-in data-[state=open]:fade-in',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out'\n )}\n />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed top-4 right-4 z-50 h-[calc(100dvh-2rem)] min-w-sm max-w-xl rounded-md bg-background shadow-lg ring-1 ring-border',\n 'duration-300',\n 'data-[state=open]:animate-in data-[state=open]:slide-in-from-right data-[state=open]:fade-in',\n 'data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right data-[state=closed]:fade-out'\n )}\n >\n <section className=\"relative flex size-full flex-col\">\n <header className=\"flex h-14 shrink-0 items-center border-b border-border px-5\">\n <h2 className=\"font-semibold text-base tracking-tight text-text-positive\">{title}</h2>\n </header>\n\n <div className={cn('flex flex-1 flex-col overflow-y-auto py-4', contentClassName)}>{children}</div>\n\n <div className=\"flex shrink-0 flex-col gap-2 border-t border-border px-4 py-3\">\n <form.Subscribe\n selector={state => ({\n isSubmitting: state.isSubmitting,\n disabled: state.isPristine || !state.isValid || state.isValidating || state.isSubmitting || !state.canSubmit,\n })}\n children={({ isSubmitting, disabled }) => (\n <SubmitButton isSubmitting={isSubmitting} disabled={disabled} className=\"w-full\" onClick={() => form.handleSubmit()} />\n )}\n />\n <form.Subscribe\n selector={state => ({ disabled: state.isPristine || state.isSubmitting })}\n children={({ disabled }) => (\n <CancelButton\n disabled={disabled}\n className=\"w-full\"\n onClick={() => {\n form.reset();\n onOpenChange?.(false);\n }}\n />\n )}\n />\n </div>\n\n <DialogPrimitive.Close asChild>\n <CloseButton className=\"absolute top-2.5 right-3\" />\n </DialogPrimitive.Close>\n </section>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n};\n","'use client';\n\nimport { Separator } from '../ui/separator';\n\n/**\n * Internal header sub-component for `TanStackSectionForm` that renders a styled section title.\n */\nconst SectionHeader: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <header data-slot=\"section-header\" className=\"flex items-center px-4 py-3 font-semibold text-base text-text-positive tracking-tight\">\n {children}\n </header>\n );\n};\n\n/**\n * Internal body sub-component for `TanStackSectionForm` that wraps field content with vertical padding.\n */\nconst SectionMain: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <main data-slot=\"section-main\" className=\"relative flex flex-col py-4\">\n {children}\n </main>\n );\n};\n\n/**\n * Renders a card-like form section with a titled header, separator, and a content area for form fields.\n *\n * @example\n * import { TanStackSectionForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackSectionForm title=\"Account Settings\">\n * <EmailField />\n * <PasswordField />\n * </TanStackSectionForm>\n */\nexport const TanStackSectionForm: React.FC<\n React.PropsWithChildren<{\n /** Heading text displayed in the section header bar. */\n title: string;\n }>\n> = ({ title, children }) => {\n return (\n <section data-slot=\"section-form\" className=\"flex flex-col rounded-md bg-background shadow-card ring-1 ring-border\">\n <SectionHeader>{title}</SectionHeader>\n <Separator />\n <SectionMain>{children}</SectionMain>\n </section>\n );\n};\n","import { Field, FieldContent, FieldDescription, FieldGroup, FieldLegend, FieldNote, FieldSeparator } from '../ui/field';\n\n/**\n * Renders a standalone section title with an optional description and helper note, followed by a separator.\n *\n * @example\n * import { TanStackTitleField } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * <TanStackTitleField\n * title=\"Billing Address\"\n * description=\"Provide the address associated with your payment method.\"\n * helperText=\"Must match your bank records.\"\n * />\n */\nexport const TanStackTitleField: React.FC<{\n /** The heading text rendered as a legend element. */\n title: string;\n /** Optional supplementary text displayed beneath the title. */\n description?: string;\n /** Optional helper note shown below the description area. */\n helperText?: string;\n}> = ({ title, description, helperText }) => {\n return (\n <FieldGroup className=\"gap-y-4 px-4\">\n <Field className=\"gap-0\">\n <FieldContent>\n <FieldLegend className=\"mb-1\">{title}</FieldLegend>\n <FieldDescription>{description}</FieldDescription>\n </FieldContent>\n <FieldNote isShow={!!helperText}>{helperText}</FieldNote>\n </Field>\n <FieldSeparator />\n </FieldGroup>\n );\n};\n","import { createFormHook, createFormHookContexts } from '@tanstack/react-form';\n\nimport { CheckboxField } from './components/fields/checkbox-field';\nimport { ComboboxField } from './components/fields/combobox-field';\nimport { DateField } from './components/fields/date-field';\nimport { EmailField } from './components/fields/email-field';\nimport { NumberField } from './components/fields/number-field';\nimport { PasswordField } from './components/fields/password-field';\nimport { RadioGroupField } from './components/fields/radio-group-field';\nimport { SelectField } from './components/fields/select-field';\nimport { SwitchField } from './components/fields/switch-field';\nimport { TextField } from './components/fields/text-field';\nimport { TextareaField } from './components/fields/textarea-field';\nimport { TanStackActionSubmit } from './components/forms/action-submit';\nimport { TanStackActionsForm } from './components/forms/actions-form';\nimport { TanStackCardForm } from './components/forms/card-form';\nimport { TanStackContainerForm } from './components/forms/container-form';\nimport { TanStackDialogForm } from './components/forms/dialog-form';\nimport { TanStackFieldGroup } from './components/forms/group-field';\nimport { TanStackPopoverForm } from './components/forms/popover-form';\nimport { TanStackSectionForm } from './components/forms/section-form';\nimport { TanStackTitleField } from './components/forms/title-field';\nimport { Field, FieldContent, FieldContentMain, FieldError, FieldGroup, FieldLabel, FieldSeparator } from './components/ui/field';\n\nconst { fieldContext, formContext, useFieldContext: useTanStackFieldContext, useFormContext: useTanStackFormContext } = createFormHookContexts();\n\n/**\n * Factory result from {@link createFormHook} pre-wired with all Lunas UI field and form components.\n *\n * ### `useTanStackForm`\n * Pre-configured TanStack Form hook that returns a type-safe form instance bound to all Lunas UI\n * field and form components.\n *\n * @example\n * import { useTanStackForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * const form = useTanStackForm({\n * defaultValues: { name: '', email: '' },\n * onSubmit: async ({ value }) => console.log(value),\n * });\n *\n * return (\n * <form.Provider>\n * <form.AppForm>\n * <form.AppField name=\"name\" children={(field) => <field.TextField label=\"Name\" />} />\n * <form.Subscribe selector={(s) => s.canSubmit}>\n * {(canSubmit) => <form.TanStackActionSubmit disabled={!canSubmit} />}\n * </form.Subscribe>\n * </form.AppForm>\n * </form.Provider>\n * );\n *\n * ### `withTanStackForm`\n * Higher-order component that wraps a sub-form component with access to the parent\n * `useTanStackForm` form context, enabling isolated field groups that still participate in the\n * top-level form state.\n *\n * @example\n * import { withTanStackForm } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * const AddressFields = withTanStackForm(\n * { street: '', city: '' } as const,\n * ({ form }) => (\n * <>\n * <form.AppField name=\"street\" children={(f) => <f.TextField label=\"Street\" />} />\n * <form.AppField name=\"city\" children={(f) => <f.TextField label=\"City\" />} />\n * </>\n * ),\n * );\n *\n * ### `withTanStackFieldGroup`\n * Higher-order component that creates a reusable field-group component sharing the enclosing\n * `useTanStackForm` context without requiring additional form providers.\n *\n * @example\n * import { withTanStackFieldGroup } from '@customafk/lunas-ui/features/tanstack-form';\n *\n * const ContactGroup = withTanStackFieldGroup(({ form }) => (\n * <form.AppField name=\"phone\" children={(f) => <f.TextField label=\"Phone\" />} />\n * ));\n */\nconst {\n useAppForm: useTanStackForm,\n withForm: withTanStackForm,\n withFieldGroup: withTanStackFieldGroup,\n} = createFormHook({\n fieldContext,\n formContext,\n\n fieldComponents: {\n TextField,\n TextareaField,\n NumberField,\n EmailField,\n PasswordField,\n\n SelectField,\n ComboboxField,\n DateField,\n SwitchField,\n RadioGroupField,\n CheckboxField,\n\n FieldGroup,\n Field,\n FieldContent,\n FieldLabel,\n FieldContentMain,\n FieldSeparator,\n FieldError,\n },\n formComponents: {\n TanStackDialogForm,\n TanStackPopoverForm,\n TanStackContainerForm,\n TanStackSectionForm,\n TanStackCardForm,\n TanStackFieldGroup,\n TanStackTitleField,\n\n TanStackActionsForm,\n TanStackActionSubmit,\n },\n});\n\nexport {\n useTanStackForm,\n withTanStackForm,\n withTanStackFieldGroup,\n useTanStackFieldContext,\n useTanStackFormContext,\n FieldGroup,\n Field,\n FieldContent,\n FieldLabel,\n FieldContentMain,\n FieldSeparator,\n FieldError,\n};\n"],"mappings":"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"}