@bigbinary/neeto-atoms 1.0.57 → 1.0.59

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 (173) hide show
  1. package/dist/Badge-DC6zxOwS.js.map +1 -1
  2. package/dist/Button-DV9xCqlc.js.map +1 -1
  3. package/dist/Callout-NVYmCwJL.js.map +1 -1
  4. package/dist/{Checkbox-C_Rd2-8Z.js → Checkbox-m4rEnxUz.js} +3 -2
  5. package/dist/Checkbox-m4rEnxUz.js.map +1 -0
  6. package/dist/{DatePicker-DGf2BiNq.js → DatePicker-kulToqfM.js} +243 -12
  7. package/dist/DatePicker-kulToqfM.js.map +1 -0
  8. package/dist/Empty-Bfido_mq.js.map +1 -1
  9. package/dist/HelpIcon-Cm3ZgoCx.js +73 -0
  10. package/dist/HelpIcon-Cm3ZgoCx.js.map +1 -0
  11. package/dist/Label-mrNM2drW.js +17 -0
  12. package/dist/Label-mrNM2drW.js.map +1 -0
  13. package/dist/{RadioGroup-BTemSonO.js → RadioGroup-BRAVPPc3.js} +3 -2
  14. package/dist/RadioGroup-BRAVPPc3.js.map +1 -0
  15. package/dist/{Switch-OAB7pfNn.js → Switch-b4ZAjhRy.js} +7 -4
  16. package/dist/Switch-b4ZAjhRy.js.map +1 -0
  17. package/dist/Tabs-DTbbJITd.js.map +1 -1
  18. package/dist/cjs/Badge-Dz_Kb49L.js.map +1 -1
  19. package/dist/cjs/Button-8VH9p9RB.js.map +1 -1
  20. package/dist/cjs/Callout-CYIrflF1.js.map +1 -1
  21. package/dist/cjs/{Checkbox-CxqWOvFN.js → Checkbox-CymHP7QE.js} +3 -2
  22. package/dist/cjs/Checkbox-CymHP7QE.js.map +1 -0
  23. package/dist/cjs/{DatePicker-Bg2LywGY.js → DatePicker-BZd4rM2R.js} +242 -11
  24. package/dist/cjs/DatePicker-BZd4rM2R.js.map +1 -0
  25. package/dist/cjs/Empty-aQaWK0p4.js.map +1 -1
  26. package/dist/cjs/HelpIcon-CIkKt2uy.js +75 -0
  27. package/dist/cjs/HelpIcon-CIkKt2uy.js.map +1 -0
  28. package/dist/cjs/Label-Dt7K54Ly.js +19 -0
  29. package/dist/cjs/Label-Dt7K54Ly.js.map +1 -0
  30. package/dist/cjs/{RadioGroup-CkKlLHnR.js → RadioGroup-6mpFVQr8.js} +3 -2
  31. package/dist/cjs/RadioGroup-6mpFVQr8.js.map +1 -0
  32. package/dist/cjs/{Switch-BTkncHw2.js → Switch-bY6bZw78.js} +7 -4
  33. package/dist/cjs/Switch-bY6bZw78.js.map +1 -0
  34. package/dist/cjs/Tabs-YPRmLtUM.js.map +1 -1
  35. package/dist/cjs/components/Checkbox.js +23 -1
  36. package/dist/cjs/components/Checkbox.js.map +1 -1
  37. package/dist/cjs/components/DatePicker.js +15 -2
  38. package/dist/cjs/components/DatePicker.js.map +1 -1
  39. package/dist/cjs/components/DropdownMenu.js.map +1 -1
  40. package/dist/cjs/components/Input.js +32 -5
  41. package/dist/cjs/components/Input.js.map +1 -1
  42. package/dist/cjs/components/Label.js +9 -8
  43. package/dist/cjs/components/Label.js.map +1 -1
  44. package/dist/cjs/components/MultiEmailInput.js +32 -4
  45. package/dist/cjs/components/MultiEmailInput.js.map +1 -1
  46. package/dist/cjs/components/RadioGroup.js +22 -1
  47. package/dist/cjs/components/RadioGroup.js.map +1 -1
  48. package/dist/cjs/components/Select.js +32 -10
  49. package/dist/cjs/components/Select.js.map +1 -1
  50. package/dist/cjs/components/Slider.js +24 -0
  51. package/dist/cjs/components/Slider.js.map +1 -1
  52. package/dist/cjs/components/Switch.js +33 -7
  53. package/dist/cjs/components/Switch.js.map +1 -1
  54. package/dist/cjs/components/Textarea.js +32 -3
  55. package/dist/cjs/components/Textarea.js.map +1 -1
  56. package/dist/cjs/components/TimePicker.js +17 -4
  57. package/dist/cjs/components/TimePicker.js.map +1 -1
  58. package/dist/cjs/components/TreeSelect.js +17 -2
  59. package/dist/cjs/components/TreeSelect.js.map +1 -1
  60. package/dist/cjs/components/index.js +15 -14
  61. package/dist/cjs/components/index.js.map +1 -1
  62. package/dist/cjs/formik/Checkbox.js +23 -1
  63. package/dist/cjs/formik/Checkbox.js.map +1 -1
  64. package/dist/cjs/formik/Input.js +32 -5
  65. package/dist/cjs/formik/Input.js.map +1 -1
  66. package/dist/cjs/formik/MultiEmailInput.js +32 -4
  67. package/dist/cjs/formik/MultiEmailInput.js.map +1 -1
  68. package/dist/cjs/formik/RadioGroup.js +22 -1
  69. package/dist/cjs/formik/RadioGroup.js.map +1 -1
  70. package/dist/cjs/formik/Select.js +32 -10
  71. package/dist/cjs/formik/Select.js.map +1 -1
  72. package/dist/cjs/formik/Slider.js +24 -0
  73. package/dist/cjs/formik/Slider.js.map +1 -1
  74. package/dist/cjs/formik/Switch.js +33 -7
  75. package/dist/cjs/formik/Switch.js.map +1 -1
  76. package/dist/cjs/formik/Textarea.js +32 -3
  77. package/dist/cjs/formik/Textarea.js.map +1 -1
  78. package/dist/cjs/formik/TreeSelect.js +17 -2
  79. package/dist/cjs/formik/TreeSelect.js.map +1 -1
  80. package/dist/cjs/formik/index.js +35 -31
  81. package/dist/cjs/formik/index.js.map +1 -1
  82. package/dist/cjs/index.js +15 -14
  83. package/dist/cjs/index.js.map +1 -1
  84. package/dist/cjs/primitives/Field.js +34 -2
  85. package/dist/cjs/primitives/Field.js.map +1 -1
  86. package/dist/cjs/primitives/index.js +6 -0
  87. package/dist/cjs/primitives/index.js.map +1 -1
  88. package/dist/cjs/renderIcon-BRrpZu9a.js.map +1 -1
  89. package/dist/components/Badge/Badge.d.ts +1 -1
  90. package/dist/components/Button/Button.d.ts +1 -1
  91. package/dist/components/Callout/Callout.d.ts +1 -1
  92. package/dist/components/Checkbox/Checkbox.d.ts +3 -0
  93. package/dist/components/Checkbox.js +23 -1
  94. package/dist/components/Checkbox.js.map +1 -1
  95. package/dist/components/DatePicker/MonthPicker.d.ts +16 -0
  96. package/dist/components/DatePicker/YearPicker.d.ts +14 -0
  97. package/dist/components/DatePicker/types.d.ts +16 -0
  98. package/dist/components/DatePicker/utils.d.ts +7 -0
  99. package/dist/components/DatePicker.js +15 -2
  100. package/dist/components/DatePicker.js.map +1 -1
  101. package/dist/components/DropdownMenu/SubMenu.d.ts +1 -1
  102. package/dist/components/DropdownMenu/types.d.ts +1 -1
  103. package/dist/components/DropdownMenu.js.map +1 -1
  104. package/dist/components/Empty/Empty.d.ts +1 -1
  105. package/dist/components/Input.js +32 -5
  106. package/dist/components/Input.js.map +1 -1
  107. package/dist/components/Label/Label.d.ts +2 -28
  108. package/dist/components/Label.js +9 -8
  109. package/dist/components/Label.js.map +1 -1
  110. package/dist/components/MultiEmailInput.js +32 -4
  111. package/dist/components/MultiEmailInput.js.map +1 -1
  112. package/dist/components/RadioGroup/RadioGroup.d.ts +3 -0
  113. package/dist/components/RadioGroup.js +22 -1
  114. package/dist/components/RadioGroup.js.map +1 -1
  115. package/dist/components/Select.js +32 -10
  116. package/dist/components/Select.js.map +1 -1
  117. package/dist/components/Slider.js +24 -0
  118. package/dist/components/Slider.js.map +1 -1
  119. package/dist/components/Switch/Switch.d.ts +3 -0
  120. package/dist/components/Switch.js +33 -7
  121. package/dist/components/Switch.js.map +1 -1
  122. package/dist/components/Tabs/Tabs.d.ts +1 -1
  123. package/dist/components/Textarea.js +32 -3
  124. package/dist/components/Textarea.js.map +1 -1
  125. package/dist/components/TimePicker.js +17 -4
  126. package/dist/components/TimePicker.js.map +1 -1
  127. package/dist/components/TreeSelect.js +17 -2
  128. package/dist/components/TreeSelect.js.map +1 -1
  129. package/dist/components/index.js +6 -5
  130. package/dist/components/index.js.map +1 -1
  131. package/dist/formik/Checkbox.js +23 -1
  132. package/dist/formik/Checkbox.js.map +1 -1
  133. package/dist/formik/Input.js +32 -5
  134. package/dist/formik/Input.js.map +1 -1
  135. package/dist/formik/MultiEmailInput.js +32 -4
  136. package/dist/formik/MultiEmailInput.js.map +1 -1
  137. package/dist/formik/RadioGroup.js +22 -1
  138. package/dist/formik/RadioGroup.js.map +1 -1
  139. package/dist/formik/Select.js +32 -10
  140. package/dist/formik/Select.js.map +1 -1
  141. package/dist/formik/Slider.js +24 -0
  142. package/dist/formik/Slider.js.map +1 -1
  143. package/dist/formik/Switch.js +33 -7
  144. package/dist/formik/Switch.js.map +1 -1
  145. package/dist/formik/Textarea.js +32 -3
  146. package/dist/formik/Textarea.js.map +1 -1
  147. package/dist/formik/TreeSelect.js +17 -2
  148. package/dist/formik/TreeSelect.js.map +1 -1
  149. package/dist/formik/index.js +35 -31
  150. package/dist/formik/index.js.map +1 -1
  151. package/dist/index.js +6 -5
  152. package/dist/index.js.map +1 -1
  153. package/dist/primitives/Field.d.ts +6 -1
  154. package/dist/primitives/Field.js +34 -2
  155. package/dist/primitives/Field.js.map +1 -1
  156. package/dist/primitives/index.js +6 -0
  157. package/dist/primitives/index.js.map +1 -1
  158. package/dist/renderIcon-C6twJSqH.js.map +1 -1
  159. package/dist/shared/HelpIcon.d.ts +30 -0
  160. package/package.json +1 -1
  161. package/dist/Checkbox-C_Rd2-8Z.js.map +0 -1
  162. package/dist/DatePicker-DGf2BiNq.js.map +0 -1
  163. package/dist/Label-DndePzSD.js +0 -87
  164. package/dist/Label-DndePzSD.js.map +0 -1
  165. package/dist/RadioGroup-BTemSonO.js.map +0 -1
  166. package/dist/Switch-OAB7pfNn.js.map +0 -1
  167. package/dist/cjs/Checkbox-CxqWOvFN.js.map +0 -1
  168. package/dist/cjs/DatePicker-Bg2LywGY.js.map +0 -1
  169. package/dist/cjs/Label-vpiQQn2A.js +0 -89
  170. package/dist/cjs/Label-vpiQQn2A.js.map +0 -1
  171. package/dist/cjs/RadioGroup-CkKlLHnR.js.map +0 -1
  172. package/dist/cjs/Switch-BTkncHw2.js.map +0 -1
  173. /package/dist/{lib → shared}/renderIcon.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Badge-DC6zxOwS.js","sources":["../src/components/Badge/constants.ts","../src/components/Badge/Badge.tsx"],"sourcesContent":["import type { IndicatorVariant } from \"./Badge\";\n\nexport const SIZE_CONFIG = {\n sm: {\n iconPl: \"pl-1\",\n iconPr: \"pr-1\",\n dismissPr: \"pr-0.5\",\n btnSize: \"size-3\",\n iconSize: \"size-2\",\n },\n default: {\n iconPl: \"pl-1.5\",\n iconPr: \"pr-1.5\",\n dismissPr: \"pr-1\",\n btnSize: \"size-3.5\",\n iconSize: \"size-2.5\",\n },\n lg: {\n iconPl: \"pl-2\",\n iconPr: \"pr-2\",\n dismissPr: \"pr-1\",\n btnSize: \"size-4.5\",\n iconSize: \"size-3\",\n },\n};\n\nexport const INDICATOR_COLORS: Record<IndicatorVariant, string> = {\n default: \"bg-primary\",\n secondary: \"bg-muted-foreground\",\n destructive: \"bg-destructive\",\n blue: \"bg-blue-600\",\n green: \"bg-green-600\",\n amber: \"bg-amber-400\",\n red: \"bg-red-600\",\n purple: \"bg-purple-700\",\n pink: \"bg-pink-600\",\n teal: \"bg-teal-600\",\n gray: \"bg-gray-400\",\n};\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { X } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport { Badge as PrimitiveBadge } from \"src/primitives/Badge\";\n\nimport { SIZE_CONFIG, INDICATOR_COLORS } from \"./constants\";\n\ntype BadgeVariant =\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"outline\"\n | \"ghost\"\n | \"link\"\n | \"gray\"\n | \"gray-subtle\"\n | \"blue\"\n | \"blue-subtle\"\n | \"purple\"\n | \"purple-subtle\"\n | \"amber\"\n | \"amber-subtle\"\n | \"red\"\n | \"red-subtle\"\n | \"pink\"\n | \"pink-subtle\"\n | \"green\"\n | \"green-subtle\"\n | \"teal\"\n | \"teal-subtle\";\n\ntype BadgeSize = \"sm\" | \"default\" | \"lg\";\n\ntype BadgeShape = \"pill\" | \"rounded\";\n\nexport type IndicatorVariant =\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"blue\"\n | \"green\"\n | \"amber\"\n | \"red\"\n | \"purple\"\n | \"pink\"\n | \"teal\"\n | \"gray\";\n\nexport interface BadgeProps extends Omit<\n React.ComponentProps<\"span\">,\n \"children\"\n> {\n /** Visual variant of the badge. */\n variant?: BadgeVariant;\n /** Size of the badge. */\n size?: BadgeSize;\n /** Corner shape: `pill` (fully rounded, default) or `rounded` (4px). */\n shape?: BadgeShape;\n /** Text label rendered inside the badge. */\n label?: string;\n /** Icon component, element, or class-name string. */\n icon?: IconProp;\n /** Placement of the icon relative to the label. */\n iconPosition?: \"left\" | \"right\";\n /** Colored status indicator dot. */\n indicator?: IndicatorVariant;\n /** Callback when the badge is dismissed. Renders a dismiss button when provided. */\n onDismiss?: () => void;\n /** Disables the badge and hides the dismiss button. */\n disabled?: boolean;\n /** Render as a custom element (polymorphic via Radix Slot). */\n asChild?: boolean;\n /** Children rendered inside the badge (fallback for `label`). */\n children?: ReactNode;\n}\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n variant = \"default\",\n size = \"default\",\n shape = \"pill\",\n label,\n icon,\n iconPosition = \"left\",\n indicator,\n onDismiss,\n disabled = false,\n className,\n asChild = false,\n children,\n ...otherProps\n },\n ref\n ) => {\n const { t } = useTranslation();\n\n if (asChild) {\n return (\n <PrimitiveBadge\n ref={ref}\n asChild\n variant={variant}\n size={size}\n shape={shape}\n className={className}\n {...otherProps}\n >\n {children}\n </PrimitiveBadge>\n );\n }\n\n const renderLabel = label || children;\n const iconElement = icon ? renderIcon(icon) : null;\n\n const hasDismiss = !!onDismiss && !disabled;\n\n return (\n <PrimitiveBadge\n ref={ref}\n variant={variant}\n size={size}\n shape={shape}\n className={cn(\n disabled && \"opacity-50 pointer-events-none\",\n icon && iconPosition === \"left\" && SIZE_CONFIG[size].iconPl,\n icon && iconPosition === \"right\" && SIZE_CONFIG[size].iconPr,\n hasDismiss && SIZE_CONFIG[size].dismissPr,\n className\n )}\n {...otherProps}\n >\n {indicator && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"size-1.5 shrink-0 rounded-full\",\n INDICATOR_COLORS[indicator]\n )}\n />\n )}\n {iconPosition === \"left\" && iconElement}\n {renderLabel}\n {iconPosition === \"right\" && iconElement}\n {onDismiss && !disabled && (\n <button\n type=\"button\"\n aria-label={t(\"neetoatoms.badge.dismiss\", \"Dismiss\")}\n onClick={onDismiss}\n className={cn(\n \"inline-flex shrink-0 items-center justify-center rounded-full bg-current/15 transition-[background-color,opacity] hover:bg-current/25 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n SIZE_CONFIG[size].btnSize\n )}\n >\n <X className={SIZE_CONFIG[size].iconSize} />\n </button>\n )}\n </PrimitiveBadge>\n );\n }\n);\n\nBadge.displayName = \"Badge\";\n\nexport { Badge };\n"],"names":["PrimitiveBadge"],"mappings":"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"}
1
+ {"version":3,"file":"Badge-DC6zxOwS.js","sources":["../src/components/Badge/constants.ts","../src/components/Badge/Badge.tsx"],"sourcesContent":["import type { IndicatorVariant } from \"./Badge\";\n\nexport const SIZE_CONFIG = {\n sm: {\n iconPl: \"pl-1\",\n iconPr: \"pr-1\",\n dismissPr: \"pr-0.5\",\n btnSize: \"size-3\",\n iconSize: \"size-2\",\n },\n default: {\n iconPl: \"pl-1.5\",\n iconPr: \"pr-1.5\",\n dismissPr: \"pr-1\",\n btnSize: \"size-3.5\",\n iconSize: \"size-2.5\",\n },\n lg: {\n iconPl: \"pl-2\",\n iconPr: \"pr-2\",\n dismissPr: \"pr-1\",\n btnSize: \"size-4.5\",\n iconSize: \"size-3\",\n },\n};\n\nexport const INDICATOR_COLORS: Record<IndicatorVariant, string> = {\n default: \"bg-primary\",\n secondary: \"bg-muted-foreground\",\n destructive: \"bg-destructive\",\n blue: \"bg-blue-600\",\n green: \"bg-green-600\",\n amber: \"bg-amber-400\",\n red: \"bg-red-600\",\n purple: \"bg-purple-700\",\n pink: \"bg-pink-600\",\n teal: \"bg-teal-600\",\n gray: \"bg-gray-400\",\n};\n","import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { X } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/shared/renderIcon\";\nimport { Badge as PrimitiveBadge } from \"src/primitives/Badge\";\n\nimport { SIZE_CONFIG, INDICATOR_COLORS } from \"./constants\";\n\ntype BadgeVariant =\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"outline\"\n | \"ghost\"\n | \"link\"\n | \"gray\"\n | \"gray-subtle\"\n | \"blue\"\n | \"blue-subtle\"\n | \"purple\"\n | \"purple-subtle\"\n | \"amber\"\n | \"amber-subtle\"\n | \"red\"\n | \"red-subtle\"\n | \"pink\"\n | \"pink-subtle\"\n | \"green\"\n | \"green-subtle\"\n | \"teal\"\n | \"teal-subtle\";\n\ntype BadgeSize = \"sm\" | \"default\" | \"lg\";\n\ntype BadgeShape = \"pill\" | \"rounded\";\n\nexport type IndicatorVariant =\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"blue\"\n | \"green\"\n | \"amber\"\n | \"red\"\n | \"purple\"\n | \"pink\"\n | \"teal\"\n | \"gray\";\n\nexport interface BadgeProps extends Omit<\n React.ComponentProps<\"span\">,\n \"children\"\n> {\n /** Visual variant of the badge. */\n variant?: BadgeVariant;\n /** Size of the badge. */\n size?: BadgeSize;\n /** Corner shape: `pill` (fully rounded, default) or `rounded` (4px). */\n shape?: BadgeShape;\n /** Text label rendered inside the badge. */\n label?: string;\n /** Icon component, element, or class-name string. */\n icon?: IconProp;\n /** Placement of the icon relative to the label. */\n iconPosition?: \"left\" | \"right\";\n /** Colored status indicator dot. */\n indicator?: IndicatorVariant;\n /** Callback when the badge is dismissed. Renders a dismiss button when provided. */\n onDismiss?: () => void;\n /** Disables the badge and hides the dismiss button. */\n disabled?: boolean;\n /** Render as a custom element (polymorphic via Radix Slot). */\n asChild?: boolean;\n /** Children rendered inside the badge (fallback for `label`). */\n children?: ReactNode;\n}\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n variant = \"default\",\n size = \"default\",\n shape = \"pill\",\n label,\n icon,\n iconPosition = \"left\",\n indicator,\n onDismiss,\n disabled = false,\n className,\n asChild = false,\n children,\n ...otherProps\n },\n ref\n ) => {\n const { t } = useTranslation();\n\n if (asChild) {\n return (\n <PrimitiveBadge\n ref={ref}\n asChild\n variant={variant}\n size={size}\n shape={shape}\n className={className}\n {...otherProps}\n >\n {children}\n </PrimitiveBadge>\n );\n }\n\n const renderLabel = label || children;\n const iconElement = icon ? renderIcon(icon) : null;\n\n const hasDismiss = !!onDismiss && !disabled;\n\n return (\n <PrimitiveBadge\n ref={ref}\n variant={variant}\n size={size}\n shape={shape}\n className={cn(\n disabled && \"opacity-50 pointer-events-none\",\n icon && iconPosition === \"left\" && SIZE_CONFIG[size].iconPl,\n icon && iconPosition === \"right\" && SIZE_CONFIG[size].iconPr,\n hasDismiss && SIZE_CONFIG[size].dismissPr,\n className\n )}\n {...otherProps}\n >\n {indicator && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"size-1.5 shrink-0 rounded-full\",\n INDICATOR_COLORS[indicator]\n )}\n />\n )}\n {iconPosition === \"left\" && iconElement}\n {renderLabel}\n {iconPosition === \"right\" && iconElement}\n {onDismiss && !disabled && (\n <button\n type=\"button\"\n aria-label={t(\"neetoatoms.badge.dismiss\", \"Dismiss\")}\n onClick={onDismiss}\n className={cn(\n \"inline-flex shrink-0 items-center justify-center rounded-full bg-current/15 transition-[background-color,opacity] hover:bg-current/25 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n SIZE_CONFIG[size].btnSize\n )}\n >\n <X className={SIZE_CONFIG[size].iconSize} />\n </button>\n )}\n </PrimitiveBadge>\n );\n }\n);\n\nBadge.displayName = \"Badge\";\n\nexport { Badge };\n"],"names":["PrimitiveBadge"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Button-DV9xCqlc.js","sources":["../src/components/Button/constants.ts","../src/components/Button/Button.tsx"],"sourcesContent":["type ButtonSize =\n | \"default\"\n | \"xs\"\n | \"sm\"\n | \"lg\"\n | \"icon\"\n | \"icon-xs\"\n | \"icon-sm\"\n | \"icon-lg\";\n\nexport const ICON_ONLY_SIZE_MAP: Partial<Record<ButtonSize, ButtonSize>> = {\n xs: \"icon-xs\",\n sm: \"icon-sm\",\n default: \"icon\",\n lg: \"icon-lg\",\n};\n\nexport const SPINNER_SIZE_MAP: Record<ButtonSize, string> = {\n xs: \"size-3\",\n sm: \"size-3.5\",\n default: \"size-3.5\",\n lg: \"size-4\",\n icon: \"size-3.5\",\n \"icon-xs\": \"size-3\",\n \"icon-sm\": \"size-3.5\",\n \"icon-lg\": \"size-4\",\n};\n\n// Map NeetoUI tooltip `position` values to Radix side values\nexport const TOOLTIP_SIDE_MAP: Record<\n string,\n \"top\" | \"right\" | \"bottom\" | \"left\"\n> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n};\n","import React, { forwardRef, type ReactNode, type MouseEvent } from \"react\";\n\nimport { Link } from \"react-router-dom\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport { Spinner } from \"src/primitives/Spinner\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\nimport {\n ICON_ONLY_SIZE_MAP,\n SPINNER_SIZE_MAP,\n TOOLTIP_SIDE_MAP,\n} from \"./constants\";\n\nexport const BUTTON_VARIANTS = [\n \"default\",\n \"secondary\",\n \"destructive\",\n \"destructive-soft\",\n \"outline\",\n \"ghost\",\n \"link\",\n] as const;\n\nexport const BUTTON_SIZES = [\n \"default\",\n \"xs\",\n \"sm\",\n \"lg\",\n \"icon\",\n \"icon-xs\",\n \"icon-sm\",\n \"icon-lg\",\n] as const;\n\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\nexport type ButtonSize = (typeof BUTTON_SIZES)[number];\n\ntype IconPosition = \"left\" | \"right\";\n\ntype ButtonType = \"button\" | \"reset\" | \"submit\";\n\ninterface ButtonTooltipProps {\n content?: ReactNode;\n position?: string;\n disabled?: boolean;\n}\n\nexport interface ButtonProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"disabled\" | \"className\" | \"children\" | \"onClick\"\n> {\n /** Visual variant of the button. */\n variant?: ButtonVariant;\n /** Size of the button. */\n size?: ButtonSize;\n /** Text label rendered inside the button. */\n label?: string;\n /** Icon component, element, or class-name string. */\n icon?: IconProp;\n /** Placement of the icon relative to the label. */\n iconPosition?: IconPosition;\n /** Show a loading spinner and prevent clicks. */\n loading?: boolean;\n /** Disable the button. */\n disabled?: boolean;\n /** Click handler. */\n onClick?: (e: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;\n /** Internal route (react-router `Link`). */\n to?: string;\n /** External URL (renders an anchor tag). */\n href?: string;\n /** HTML button type attribute. */\n type?: ButtonType;\n /** Stretch the button to fill its container. */\n fullWidth?: boolean;\n /** Additional CSS class names. */\n className?: string;\n /** Props forwarded to a wrapping Tooltip. */\n tooltipProps?: ButtonTooltipProps | null;\n /** Render as a custom element (polymorphic). */\n asChild?: boolean;\n /**\n * Content rendered after the label and any right-side icon (e.g., a trailing\n * chevron, badge, or shortcut indicator). Auto-wrapped with\n * `data-icon=\"inline-end\"` so the button's compact end-padding kicks in.\n */\n trailing?: ReactNode;\n /** Children rendered inside the button (fallback for `label`). */\n children?: ReactNode;\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = \"default\",\n size = \"default\",\n label,\n icon = null,\n iconPosition = \"right\",\n loading = false,\n disabled = false,\n onClick,\n to,\n href,\n type = \"button\",\n fullWidth = false,\n className,\n tooltipProps = null,\n asChild = false,\n trailing,\n children,\n ...otherProps\n },\n ref\n ) => {\n const isIconSize = size.startsWith(\"icon\");\n const renderLabel = isIconSize ? null : label || children;\n const isIconOnly = !renderLabel && !!icon;\n const resolvedSize = isIconOnly ? (ICON_ONLY_SIZE_MAP[size] ?? size) : size;\n\n // --- Loading / disabled state ---\n const isDisabled = disabled || loading;\n\n // --- Click handler ---\n const handleClick = (\n e: MouseEvent<HTMLButtonElement | HTMLAnchorElement>\n ) => {\n if (loading || disabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n // --- Icon elements ---\n const iconElement = icon ? renderIcon(icon) : null;\n\n // --- Build the inner content ---\n const buttonContent = (\n <>\n {loading && (\n <span className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner\n aria-hidden=\"true\"\n className={SPINNER_SIZE_MAP[resolvedSize]}\n />\n </span>\n )}\n <span\n className={cn(\n \"inline-flex items-center gap-1.5\",\n loading && \"invisible\"\n )}\n >\n {iconPosition === \"left\" && iconElement && (\n <span data-icon=\"inline-start\">{iconElement}</span>\n )}\n {renderLabel && <span>{renderLabel}</span>}\n {iconPosition === \"right\" && iconElement && (\n <span data-icon=\"inline-end\">{iconElement}</span>\n )}\n {trailing && <span data-icon=\"inline-end\">{trailing}</span>}\n </span>\n </>\n );\n\n // --- Merged className ---\n const mergedClassName = cn(\n fullWidth && \"w-full\",\n loading && \"relative pointer-events-none\",\n variant === \"link\" && \"[table_&]:max-w-full [table_&]:whitespace-normal\",\n className\n );\n\n // --- Determine render element ---\n let buttonElement: ReactNode;\n\n if (asChild) {\n buttonElement = (\n <PrimitiveButton\n ref={ref}\n asChild\n variant={variant}\n size={resolvedSize}\n className={mergedClassName}\n disabled={isDisabled}\n {...otherProps}\n >\n {children}\n </PrimitiveButton>\n );\n } else if (!disabled && to) {\n buttonElement = (\n <PrimitiveButton\n asChild\n variant={variant}\n size={resolvedSize}\n className={mergedClassName}\n disabled={isDisabled}\n {...otherProps}\n >\n <Link\n innerRef={ref as React.Ref<HTMLAnchorElement>}\n to={to}\n onClick={handleClick}\n >\n {buttonContent}\n </Link>\n </PrimitiveButton>\n );\n } else if (!disabled && href) {\n buttonElement = (\n <PrimitiveButton\n asChild\n variant={variant}\n size={resolvedSize}\n className={mergedClassName}\n disabled={isDisabled}\n {...otherProps}\n >\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n onClick={handleClick}\n >\n {buttonContent}\n </a>\n </PrimitiveButton>\n );\n } else {\n buttonElement = (\n <PrimitiveButton\n ref={ref}\n type={type}\n variant={variant}\n size={resolvedSize}\n className={mergedClassName}\n disabled={isDisabled}\n onClick={handleClick}\n {...otherProps}\n >\n {buttonContent}\n </PrimitiveButton>\n );\n }\n\n // --- Tooltip wrapper ---\n if (tooltipProps) {\n const { content, position, disabled: tooltipDisabled } = tooltipProps;\n\n if (tooltipDisabled || !content) {\n return <>{buttonElement}</>;\n }\n\n const side = position ? TOOLTIP_SIDE_MAP[position] : undefined;\n\n // Wrap disabled buttons in a span so tooltip still triggers\n const triggerContent = isDisabled ? (\n <span className=\"inline-flex\">{buttonElement}</span>\n ) : (\n buttonElement\n );\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{triggerContent}</TooltipTrigger>\n <TooltipContent side={side}>{content}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return <>{buttonElement}</>;\n }\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\n"],"names":["PrimitiveButton"],"mappings":"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"}
1
+ {"version":3,"file":"Button-DV9xCqlc.js","sources":["../src/components/Button/constants.ts","../src/components/Button/Button.tsx"],"sourcesContent":["type ButtonSize =\n | \"default\"\n | \"xs\"\n | \"sm\"\n | \"lg\"\n | \"icon\"\n | \"icon-xs\"\n | \"icon-sm\"\n | \"icon-lg\";\n\nexport const ICON_ONLY_SIZE_MAP: Partial<Record<ButtonSize, ButtonSize>> = {\n xs: \"icon-xs\",\n sm: \"icon-sm\",\n default: \"icon\",\n lg: \"icon-lg\",\n};\n\nexport const SPINNER_SIZE_MAP: Record<ButtonSize, string> = {\n xs: \"size-3\",\n sm: \"size-3.5\",\n default: \"size-3.5\",\n lg: \"size-4\",\n icon: \"size-3.5\",\n \"icon-xs\": \"size-3\",\n \"icon-sm\": \"size-3.5\",\n \"icon-lg\": \"size-4\",\n};\n\n// Map NeetoUI tooltip `position` values to Radix side values\nexport const TOOLTIP_SIDE_MAP: Record<\n string,\n \"top\" | \"right\" | \"bottom\" | \"left\"\n> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n};\n","import React, { forwardRef, type ReactNode, type MouseEvent } from \"react\";\n\nimport { Link } from \"react-router-dom\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/shared/renderIcon\";\nimport { Button as PrimitiveButton } from \"src/primitives/Button\";\nimport { Spinner } from \"src/primitives/Spinner\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\nimport {\n ICON_ONLY_SIZE_MAP,\n SPINNER_SIZE_MAP,\n TOOLTIP_SIDE_MAP,\n} from \"./constants\";\n\nexport const BUTTON_VARIANTS = [\n \"default\",\n \"secondary\",\n \"destructive\",\n \"destructive-soft\",\n \"outline\",\n \"ghost\",\n \"link\",\n] as const;\n\nexport const BUTTON_SIZES = [\n \"default\",\n \"xs\",\n \"sm\",\n \"lg\",\n \"icon\",\n \"icon-xs\",\n \"icon-sm\",\n \"icon-lg\",\n] as const;\n\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\nexport type ButtonSize = (typeof BUTTON_SIZES)[number];\n\ntype IconPosition = \"left\" | \"right\";\n\ntype ButtonType = \"button\" | \"reset\" | \"submit\";\n\ninterface ButtonTooltipProps {\n content?: ReactNode;\n position?: string;\n disabled?: boolean;\n}\n\nexport interface ButtonProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"disabled\" | \"className\" | \"children\" | \"onClick\"\n> {\n /** Visual variant of the button. */\n variant?: ButtonVariant;\n /** Size of the button. */\n size?: ButtonSize;\n /** Text label rendered inside the button. */\n label?: string;\n /** Icon component, element, or class-name string. */\n icon?: IconProp;\n /** Placement of the icon relative to the label. */\n iconPosition?: IconPosition;\n /** Show a loading spinner and prevent clicks. */\n loading?: boolean;\n /** Disable the button. */\n disabled?: boolean;\n /** Click handler. */\n onClick?: (e: MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;\n /** Internal route (react-router `Link`). */\n to?: string;\n /** External URL (renders an anchor tag). */\n href?: string;\n /** HTML button type attribute. */\n type?: ButtonType;\n /** Stretch the button to fill its container. */\n fullWidth?: boolean;\n /** Additional CSS class names. */\n className?: string;\n /** Props forwarded to a wrapping Tooltip. */\n tooltipProps?: ButtonTooltipProps | null;\n /** Render as a custom element (polymorphic). */\n asChild?: boolean;\n /**\n * Content rendered after the label and any right-side icon (e.g., a trailing\n * chevron, badge, or shortcut indicator). Auto-wrapped with\n * `data-icon=\"inline-end\"` so the button's compact end-padding kicks in.\n */\n trailing?: ReactNode;\n /** Children rendered inside the button (fallback for `label`). */\n children?: ReactNode;\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = \"default\",\n size = \"default\",\n label,\n icon = null,\n iconPosition = \"right\",\n loading = false,\n disabled = false,\n onClick,\n to,\n href,\n type = \"button\",\n fullWidth = false,\n className,\n tooltipProps = null,\n asChild = false,\n trailing,\n children,\n ...otherProps\n },\n ref\n ) => {\n const isIconSize = size.startsWith(\"icon\");\n const renderLabel = isIconSize ? null : label || children;\n const isIconOnly = !renderLabel && !!icon;\n const resolvedSize = isIconOnly ? (ICON_ONLY_SIZE_MAP[size] ?? size) : size;\n\n // --- Loading / disabled state ---\n const isDisabled = disabled || loading;\n\n // --- Click handler ---\n const handleClick = (\n e: MouseEvent<HTMLButtonElement | HTMLAnchorElement>\n ) => {\n if (loading || disabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n // --- Icon elements ---\n const iconElement = icon ? renderIcon(icon) : null;\n\n // --- Build the inner content ---\n const buttonContent = (\n <>\n {loading && (\n <span className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner\n aria-hidden=\"true\"\n className={SPINNER_SIZE_MAP[resolvedSize]}\n />\n </span>\n )}\n <span\n className={cn(\n \"inline-flex items-center gap-1.5\",\n loading && \"invisible\"\n )}\n >\n {iconPosition === \"left\" && iconElement && (\n <span data-icon=\"inline-start\">{iconElement}</span>\n )}\n {renderLabel && <span>{renderLabel}</span>}\n {iconPosition === \"right\" && iconElement && (\n <span data-icon=\"inline-end\">{iconElement}</span>\n )}\n {trailing && <span data-icon=\"inline-end\">{trailing}</span>}\n </span>\n </>\n );\n\n // --- Merged className ---\n const mergedClassName = cn(\n fullWidth && \"w-full\",\n loading && \"relative pointer-events-none\",\n variant === \"link\" && \"[table_&]:max-w-full [table_&]:whitespace-normal\",\n className\n );\n\n // --- Determine render element ---\n let buttonElement: ReactNode;\n\n if (asChild) {\n buttonElement = (\n <PrimitiveButton\n ref={ref}\n asChild\n variant={variant}\n size={resolvedSize}\n className={mergedClassName}\n disabled={isDisabled}\n {...otherProps}\n >\n {children}\n </PrimitiveButton>\n );\n } else if (!disabled && to) {\n buttonElement = (\n <PrimitiveButton\n asChild\n variant={variant}\n size={resolvedSize}\n className={mergedClassName}\n disabled={isDisabled}\n {...otherProps}\n >\n <Link\n innerRef={ref as React.Ref<HTMLAnchorElement>}\n to={to}\n onClick={handleClick}\n >\n {buttonContent}\n </Link>\n </PrimitiveButton>\n );\n } else if (!disabled && href) {\n buttonElement = (\n <PrimitiveButton\n asChild\n variant={variant}\n size={resolvedSize}\n className={mergedClassName}\n disabled={isDisabled}\n {...otherProps}\n >\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n onClick={handleClick}\n >\n {buttonContent}\n </a>\n </PrimitiveButton>\n );\n } else {\n buttonElement = (\n <PrimitiveButton\n ref={ref}\n type={type}\n variant={variant}\n size={resolvedSize}\n className={mergedClassName}\n disabled={isDisabled}\n onClick={handleClick}\n {...otherProps}\n >\n {buttonContent}\n </PrimitiveButton>\n );\n }\n\n // --- Tooltip wrapper ---\n if (tooltipProps) {\n const { content, position, disabled: tooltipDisabled } = tooltipProps;\n\n if (tooltipDisabled || !content) {\n return <>{buttonElement}</>;\n }\n\n const side = position ? TOOLTIP_SIDE_MAP[position] : undefined;\n\n // Wrap disabled buttons in a span so tooltip still triggers\n const triggerContent = isDisabled ? (\n <span className=\"inline-flex\">{buttonElement}</span>\n ) : (\n buttonElement\n );\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{triggerContent}</TooltipTrigger>\n <TooltipContent side={side}>{content}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return <>{buttonElement}</>;\n }\n);\n\nButton.displayName = \"Button\";\n\nexport { Button };\n"],"names":["PrimitiveButton"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Callout-NVYmCwJL.js","sources":["../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../node_modules/lucide-react/dist/esm/icons/circle-check-big.js","../src/components/Callout/constants.ts","../src/components/Callout/Callout.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst CircleCheckBig = createLucideIcon(\"circle-check-big\", __iconNode);\n\nexport { __iconNode, CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n","import React from \"react\";\n\nimport {\n InfoIcon,\n AlertTriangleIcon,\n AlertCircleIcon,\n CheckCircleIcon,\n} from \"lucide-react\";\n\nimport type { CalloutVariant } from \"./Callout\";\n\nexport const VARIANT_CONFIG: Record<\n CalloutVariant,\n {\n container: string;\n icon: React.ComponentType<{ className?: string }>;\n }\n> = {\n info: {\n container: \"border border-info-border bg-info text-info-foreground\",\n icon: InfoIcon,\n },\n warning: {\n container:\n \"border border-warning-border bg-warning text-warning-foreground\",\n icon: AlertTriangleIcon,\n },\n danger: {\n container: \"border border-error-border bg-error text-error-foreground\",\n icon: AlertCircleIcon,\n },\n success: {\n container:\n \"border border-success-border bg-success text-success-foreground\",\n icon: CheckCircleIcon,\n },\n};\n","import React, { forwardRef } from \"react\";\n\nimport {\n Alert as PrimitiveAlert,\n AlertTitle,\n AlertDescription,\n} from \"src/primitives/Alert\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\n\nimport { VARIANT_CONFIG } from \"./constants\";\n\nexport type CalloutVariant = \"info\" | \"warning\" | \"danger\" | \"success\";\n\ntype PrimitiveAlertProps = React.ComponentProps<typeof PrimitiveAlert>;\n\nexport interface CalloutProps extends Omit<PrimitiveAlertProps, \"variant\"> {\n /** Visual style of the callout. */\n variant?: CalloutVariant;\n /** Custom icon. Defaults to a variant-specific icon. */\n icon?: IconProp;\n /** Optional title rendered as AlertTitle. */\n title?: string;\n /** Content rendered as AlertDescription. */\n children?: React.ReactNode;\n}\n\nconst Callout = forwardRef<HTMLDivElement, CalloutProps>(\n (\n { variant = \"info\", icon, title, children, className, ...otherProps },\n ref\n ) => {\n const config = VARIANT_CONFIG[variant];\n const resolvedIcon = icon ?? config.icon;\n\n return (\n <PrimitiveAlert\n ref={ref}\n className={cn(config.container, className)}\n {...otherProps}\n >\n {renderIcon(resolvedIcon, \"size-4 shrink-0\")}\n {title && <AlertTitle className=\"font-semibold\">{title}</AlertTitle>}\n {children && (\n <AlertDescription className=\"text-current\">\n {children}\n </AlertDescription>\n )}\n </PrimitiveAlert>\n );\n }\n);\n\nCallout.displayName = \"Callout\";\n\nexport { Callout };\n"],"names":["__iconNode","InfoIcon","AlertTriangleIcon","AlertCircleIcon","CheckCircleIcon","PrimitiveAlert"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAMA,YAAU,GAAG;AACnB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5D,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACpE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE;AACvE,CAAC;AACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAEA,YAAU,CAAC;;ACdhE;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAM,UAAU,GAAG;AACnB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,iCAAiC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACnE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,QAAQ,EAAE;AACjD,CAAC;AACD,MAAM,cAAc,GAAG,gBAAgB,CAAC,kBAAkB,EAAE,UAAU,CAAC;;ACFhE,MAAM,cAAA,GAMT;AAAA,EACF,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,wDAAA;AAAA,IACX,IAAA,EAAMC;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EACE,iEAAA;AAAA,IACF,IAAA,EAAMC;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,2DAAA;AAAA,IACX,IAAA,EAAMC;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EACE,iEAAA;AAAA,IACF,IAAA,EAAMC;AAAA;AAEV,CAAA;;ACTA,MAAM,OAAA,GAAU,UAAA;AAAA,EACd,CACE,EAAE,OAAA,GAAU,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,GAAG,UAAA,EAAW,EACpE,GAAA,KACG;AACH,IAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AACrC,IAAA,MAAM,YAAA,GAAe,QAAQ,MAAA,CAAO,IAAA;AAEpC,IAAA,uBACE,IAAA;AAAA,MAACC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,MAAA,CAAO,SAAA,EAAW,SAAS,CAAA;AAAA,QACxC,GAAG,UAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,UAAA,CAAW,cAAc,iBAAiB,CAAA;AAAA,UAC1C,KAAA,oBAAS,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,iBAAiB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACtD,QAAA,oBACC,GAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,gBACzB,QAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;;;;","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"Callout-NVYmCwJL.js","sources":["../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../node_modules/lucide-react/dist/esm/icons/circle-check-big.js","../src/components/Callout/constants.ts","../src/components/Callout/Callout.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst CircleCheckBig = createLucideIcon(\"circle-check-big\", __iconNode);\n\nexport { __iconNode, CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n","import React from \"react\";\n\nimport {\n InfoIcon,\n AlertTriangleIcon,\n AlertCircleIcon,\n CheckCircleIcon,\n} from \"lucide-react\";\n\nimport type { CalloutVariant } from \"./Callout\";\n\nexport const VARIANT_CONFIG: Record<\n CalloutVariant,\n {\n container: string;\n icon: React.ComponentType<{ className?: string }>;\n }\n> = {\n info: {\n container: \"border border-info-border bg-info text-info-foreground\",\n icon: InfoIcon,\n },\n warning: {\n container:\n \"border border-warning-border bg-warning text-warning-foreground\",\n icon: AlertTriangleIcon,\n },\n danger: {\n container: \"border border-error-border bg-error text-error-foreground\",\n icon: AlertCircleIcon,\n },\n success: {\n container:\n \"border border-success-border bg-success text-success-foreground\",\n icon: CheckCircleIcon,\n },\n};\n","import React, { forwardRef } from \"react\";\n\nimport {\n Alert as PrimitiveAlert,\n AlertTitle,\n AlertDescription,\n} from \"src/primitives/Alert\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/shared/renderIcon\";\n\nimport { VARIANT_CONFIG } from \"./constants\";\n\nexport type CalloutVariant = \"info\" | \"warning\" | \"danger\" | \"success\";\n\ntype PrimitiveAlertProps = React.ComponentProps<typeof PrimitiveAlert>;\n\nexport interface CalloutProps extends Omit<PrimitiveAlertProps, \"variant\"> {\n /** Visual style of the callout. */\n variant?: CalloutVariant;\n /** Custom icon. Defaults to a variant-specific icon. */\n icon?: IconProp;\n /** Optional title rendered as AlertTitle. */\n title?: string;\n /** Content rendered as AlertDescription. */\n children?: React.ReactNode;\n}\n\nconst Callout = forwardRef<HTMLDivElement, CalloutProps>(\n (\n { variant = \"info\", icon, title, children, className, ...otherProps },\n ref\n ) => {\n const config = VARIANT_CONFIG[variant];\n const resolvedIcon = icon ?? config.icon;\n\n return (\n <PrimitiveAlert\n ref={ref}\n className={cn(config.container, className)}\n {...otherProps}\n >\n {renderIcon(resolvedIcon, \"size-4 shrink-0\")}\n {title && <AlertTitle className=\"font-semibold\">{title}</AlertTitle>}\n {children && (\n <AlertDescription className=\"text-current\">\n {children}\n </AlertDescription>\n )}\n </PrimitiveAlert>\n );\n }\n);\n\nCallout.displayName = \"Callout\";\n\nexport { Callout };\n"],"names":["__iconNode","InfoIcon","AlertTriangleIcon","AlertCircleIcon","CheckCircleIcon","PrimitiveAlert"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAMA,YAAU,GAAG;AACnB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5D,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACpE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE;AACvE,CAAC;AACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAEA,YAAU,CAAC;;ACdhE;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAM,UAAU,GAAG;AACnB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,iCAAiC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACnE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,QAAQ,EAAE;AACjD,CAAC;AACD,MAAM,cAAc,GAAG,gBAAgB,CAAC,kBAAkB,EAAE,UAAU,CAAC;;ACFhE,MAAM,cAAA,GAMT;AAAA,EACF,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,wDAAA;AAAA,IACX,IAAA,EAAMC;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EACE,iEAAA;AAAA,IACF,IAAA,EAAMC;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,2DAAA;AAAA,IACX,IAAA,EAAMC;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EACE,iEAAA;AAAA,IACF,IAAA,EAAMC;AAAA;AAEV,CAAA;;ACTA,MAAM,OAAA,GAAU,UAAA;AAAA,EACd,CACE,EAAE,OAAA,GAAU,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,GAAG,UAAA,EAAW,EACpE,GAAA,KACG;AACH,IAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AACrC,IAAA,MAAM,YAAA,GAAe,QAAQ,MAAA,CAAO,IAAA;AAEpC,IAAA,uBACE,IAAA;AAAA,MAACC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,MAAA,CAAO,SAAA,EAAW,SAAS,CAAA;AAAA,QACxC,GAAG,UAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,UAAA,CAAW,cAAc,iBAAiB,CAAA;AAAA,UAC1C,KAAA,oBAAS,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,iBAAiB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACtD,QAAA,oBACC,GAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,gBACzB,QAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;;;;","x_google_ignoreList":[0,1]}
@@ -12,6 +12,7 @@ const Checkbox = forwardRef(
12
12
  required = false,
13
13
  disabled = false,
14
14
  className,
15
+ labelProps,
15
16
  ...otherProps
16
17
  }, ref) => {
17
18
  const generatedId = useId();
@@ -56,7 +57,7 @@ const Checkbox = forwardRef(
56
57
  }
57
58
  ),
58
59
  /* @__PURE__ */ jsxs(FieldContent, { children: [
59
- label && /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: id, children: [
60
+ label && /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: id, ...labelProps, children: [
60
61
  label,
61
62
  required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
62
63
  ] }),
@@ -72,4 +73,4 @@ const Checkbox = forwardRef(
72
73
  Checkbox.displayName = "Checkbox";
73
74
 
74
75
  export { Checkbox as C };
75
- //# sourceMappingURL=Checkbox-C_Rd2-8Z.js.map
76
+ //# sourceMappingURL=Checkbox-m4rEnxUz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox-m4rEnxUz.js","sources":["../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import React, { forwardRef, useId } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { Checkbox as PrimitiveCheckbox } from \"src/primitives/Checkbox\";\nimport {\n Field,\n FieldContent,\n FieldLabel,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\n\nexport interface CheckboxProps extends React.ComponentProps<\n typeof PrimitiveCheckbox\n> {\n /** Text displayed next to the checkbox. */\n label?: string;\n /** Error message displayed below the checkbox. */\n error?: string;\n /** Helper text displayed below the label. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Shows a required indicator next to the label. */\n required?: boolean;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** Props forwarded to the Label element. */\n labelProps?: React.ComponentProps<typeof FieldLabel>;\n}\n\nconst Checkbox = forwardRef<\n React.ComponentRef<typeof PrimitiveCheckbox>,\n CheckboxProps\n>(\n (\n {\n label,\n error,\n helpText,\n required = false,\n disabled = false,\n className,\n labelProps,\n ...otherProps\n },\n ref\n ) => {\n const generatedId = useId();\n const id = otherProps.id ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const hasField = !!(label || error || helpText);\n\n if (!hasField) {\n return (\n <PrimitiveCheckbox\n ref={ref}\n id={id}\n disabled={disabled}\n aria-invalid={!!error || undefined}\n aria-required={required || undefined}\n aria-describedby={ariaDescribedBy}\n className={className}\n {...otherProps}\n />\n );\n }\n\n return (\n <div\n className={cn(\"flex flex-col gap-1\", className)}\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n >\n <Field orientation=\"horizontal\">\n <PrimitiveCheckbox\n ref={ref}\n id={id}\n disabled={disabled}\n aria-invalid={!!error || undefined}\n aria-required={required || undefined}\n aria-describedby={ariaDescribedBy}\n {...otherProps}\n />\n <FieldContent>\n {label && (\n <FieldLabel htmlFor={id} {...labelProps}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n {error && <FieldError id={errorId}>{error}</FieldError>}\n </div>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox };\n"],"names":["PrimitiveCheckbox"],"mappings":";;;;;;AA6BA,MAAM,QAAA,GAAW,UAAA;AAAA,EAIf,CACE;AAAA,IACE,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,IAAA,MAAM,EAAA,GAAK,WAAW,EAAA,IAAM,WAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,SAAS,EAAE,CAAA,CAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,YAAY,EAAE,CAAA,CAAA;AAEjC,IAAA,MAAM,eAAA,GACJ,CAAC,KAAA,GAAQ,OAAA,GAAU,MAAM,QAAA,GAAW,UAAA,GAAa,IAAI,CAAA,CAClD,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAElB,IAAA,MAAM,QAAA,GAAW,CAAC,EAAE,KAAA,IAAS,KAAA,IAAS,QAAA,CAAA;AAEtC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,uBACE,GAAA;AAAA,QAACA,UAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,EAAA;AAAA,UACA,QAAA;AAAA,UACA,cAAA,EAAc,CAAC,CAAC,KAAA,IAAS,MAAA;AAAA,UACzB,iBAAe,QAAA,IAAY,MAAA;AAAA,UAC3B,kBAAA,EAAkB,eAAA;AAAA,UAClB,SAAA;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,IAEJ;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,QAC9C,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,cAAA,EAAc,CAAC,CAAC,KAAA,IAAS,MAAA;AAAA,QAEzB,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAM,aAAY,YAAA,EACjB,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAACA,UAAA;AAAA,cAAA;AAAA,gBACC,GAAA;AAAA,gBACA,EAAA;AAAA,gBACA,QAAA;AAAA,gBACA,cAAA,EAAc,CAAC,CAAC,KAAA,IAAS,MAAA;AAAA,gBACzB,iBAAe,QAAA,IAAY,MAAA;AAAA,gBAC3B,kBAAA,EAAkB,eAAA;AAAA,gBACjB,GAAG;AAAA;AAAA,aACN;AAAA,iCACC,YAAA,EAAA,EACE,QAAA,EAAA;AAAA,cAAA,KAAA,oBACC,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,EAAA,EAAK,GAAG,UAAA,EAC1B,QAAA,EAAA;AAAA,gBAAA,KAAA;AAAA,gBACA,4BACC,GAAA,CAAC,MAAA,EAAA,EAAK,eAAY,MAAA,EAAO,SAAA,EAAU,oBAAmB,QAAA,EAAA,GAAA,EAEtD;AAAA,eAAA,EAEJ,CAAA;AAAA,cAED,QAAA,oBACC,GAAA,CAAC,gBAAA,EAAA,EAAiB,EAAA,EAAI,YAAa,QAAA,EAAA,QAAA,EAAS;AAAA,aAAA,EAEhD;AAAA,WAAA,EACF,CAAA;AAAA,UACC,KAAA,oBAAS,GAAA,CAAC,UAAA,EAAA,EAAW,EAAA,EAAI,SAAU,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KAC5C;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { forwardRef, useId, useRef, useState, useMemo, useCallback, useEffect } from 'react';
3
3
  import { Calendar as Calendar$1 } from './primitives/Calendar.js';
4
- import { Popover, PopoverAnchor, PopoverContent } from './primitives/Popover.js';
4
+ import { Popover, PopoverTrigger, PopoverAnchor, PopoverContent } from './primitives/Popover.js';
5
5
  import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from './primitives/Field.js';
6
6
  import { c as cn } from './utils-BJnb9o5c.js';
7
7
  import { u as useControlledOpen, l as isFixedWidthFormat, m as buildRangeMaskTemplate, d as buildMaskTemplate, b as useOutsideClickClose, e as useCursorRestore, T as TimePickerPanel, j as applyMask, n as dateToTimeValue } from './TimePickerPanel--KDX5QwS.js';
@@ -9,6 +9,8 @@ import pureDayjs from 'dayjs';
9
9
  import customParseFormat from 'dayjs/plugin/customParseFormat';
10
10
  import { dayjs } from '@bigbinary/neeto-commons-frontend/utils';
11
11
  import { Button } from './primitives/Button.js';
12
+ import { C as ChevronLeft } from './chevron-left-BDoT8E2-.js';
13
+ import { C as ChevronRight } from './chevron-right-DQnrO-ek.js';
12
14
  import { c as createLucideIcon } from './createLucideIcon-C8ycilSN.js';
13
15
  import { X } from './x-_o2T3n6D.js';
14
16
 
@@ -142,6 +144,43 @@ const parseRangeText = (text, displayFormat, maskEnabled, singleDateLen) => {
142
144
  const to = parseDate(parts[1], displayFormat);
143
145
  return from && to ? [from, to] : null;
144
146
  };
147
+ const startOfWeek = (date, weekStartsOn = 0) => {
148
+ const d = new Date(date);
149
+ const diff = (d.getDay() - weekStartsOn + 7) % 7;
150
+ d.setDate(d.getDate() - diff);
151
+ d.setHours(0, 0, 0, 0);
152
+ return d;
153
+ };
154
+ const weekDaysFrom = (start) => Array.from({ length: 7 }, (_, i) => {
155
+ const d = new Date(start);
156
+ d.setDate(start.getDate() + i);
157
+ return d;
158
+ });
159
+ const isMonthDisabled = (monthDate, minDate, maxDate) => {
160
+ const monthStart = new Date(monthDate.getFullYear(), monthDate.getMonth(), 1);
161
+ const monthEnd = new Date(
162
+ monthDate.getFullYear(),
163
+ monthDate.getMonth() + 1,
164
+ 0,
165
+ 23,
166
+ 59,
167
+ 59,
168
+ 999
169
+ );
170
+ if (maxDate && monthStart > maxDate) return true;
171
+ if (minDate && monthEnd < minDate) return true;
172
+ return false;
173
+ };
174
+ const isYearDisabled = (yearDate, minDate, maxDate) => {
175
+ const yearStart = new Date(yearDate.getFullYear(), 0, 1);
176
+ const yearEnd = new Date(yearDate.getFullYear(), 11, 31, 23, 59, 59, 999);
177
+ if (maxDate && yearStart > maxDate) return true;
178
+ if (minDate && yearEnd < minDate) return true;
179
+ return false;
180
+ };
181
+ const buildMonth = (year, month) => new Date(year, month, 1);
182
+ const isSameMonth = (a, b) => !!a && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
183
+ const decadeStartFor = (year) => Math.floor(year / 10) * 10;
145
184
 
146
185
  const TIMEZONE_OPTIONS = [
147
186
  { label: "Local", value: "" },
@@ -204,6 +243,130 @@ const DatePickerFooter = ({
204
243
  };
205
244
  DatePickerFooter.displayName = "DatePickerFooter";
206
245
 
246
+ const MonthPicker = ({
247
+ value,
248
+ displayedYear,
249
+ onYearChange,
250
+ onSelect,
251
+ isDisabled,
252
+ locale
253
+ }) => {
254
+ const months = Array.from(
255
+ { length: 12 },
256
+ (_, m) => buildMonth(displayedYear, m)
257
+ );
258
+ const monthName = (date) => date.toLocaleString(locale, { month: "short" });
259
+ return /* @__PURE__ */ jsxs("div", { className: "bg-background flex w-[16rem] flex-col gap-3 p-2", children: [
260
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
261
+ /* @__PURE__ */ jsx(
262
+ Button,
263
+ {
264
+ "aria-label": "Previous year",
265
+ size: "icon",
266
+ variant: "ghost",
267
+ onClick: () => onYearChange(displayedYear - 1),
268
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4 rtl:rotate-180" })
269
+ }
270
+ ),
271
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: displayedYear }),
272
+ /* @__PURE__ */ jsx(
273
+ Button,
274
+ {
275
+ "aria-label": "Next year",
276
+ size: "icon",
277
+ variant: "ghost",
278
+ onClick: () => onYearChange(displayedYear + 1),
279
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 rtl:rotate-180" })
280
+ }
281
+ )
282
+ ] }),
283
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2", children: months.map((monthDate) => {
284
+ const disabled = isDisabled?.(monthDate) ?? false;
285
+ const selected = isSameMonth(value, monthDate);
286
+ return /* @__PURE__ */ jsx(
287
+ "button",
288
+ {
289
+ "aria-pressed": selected,
290
+ className: cn(
291
+ "rounded-md py-2 text-sm transition-colors",
292
+ "hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50",
293
+ selected && "bg-primary text-primary-foreground hover:bg-primary"
294
+ ),
295
+ disabled,
296
+ type: "button",
297
+ onClick: () => onSelect(monthDate),
298
+ children: monthName(monthDate)
299
+ },
300
+ monthDate.getMonth()
301
+ );
302
+ }) })
303
+ ] });
304
+ };
305
+
306
+ const YearPicker = ({
307
+ value,
308
+ displayedYear,
309
+ onYearChange,
310
+ onSelect,
311
+ isDisabled
312
+ }) => {
313
+ const decadeStart = decadeStartFor(displayedYear);
314
+ const years = Array.from({ length: 12 }, (_, i) => decadeStart - 1 + i);
315
+ const selectedYear = value?.getFullYear();
316
+ return /* @__PURE__ */ jsxs("div", { className: "bg-background flex w-[16rem] flex-col gap-3 p-2", children: [
317
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
318
+ /* @__PURE__ */ jsx(
319
+ Button,
320
+ {
321
+ "aria-label": "Previous decade",
322
+ size: "icon",
323
+ variant: "ghost",
324
+ onClick: () => onYearChange(decadeStart - 10),
325
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4 rtl:rotate-180" })
326
+ }
327
+ ),
328
+ /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium", children: [
329
+ decadeStart,
330
+ "-",
331
+ decadeStart + 9
332
+ ] }),
333
+ /* @__PURE__ */ jsx(
334
+ Button,
335
+ {
336
+ "aria-label": "Next decade",
337
+ size: "icon",
338
+ variant: "ghost",
339
+ onClick: () => onYearChange(decadeStart + 10),
340
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 rtl:rotate-180" })
341
+ }
342
+ )
343
+ ] }),
344
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2", children: years.map((year) => {
345
+ const yearDate = new Date(year, 0, 1);
346
+ const disabled = isDisabled?.(yearDate) ?? false;
347
+ const selected = selectedYear === year;
348
+ const outsideDecade = year < decadeStart || year > decadeStart + 9;
349
+ return /* @__PURE__ */ jsx(
350
+ "button",
351
+ {
352
+ "aria-pressed": selected,
353
+ className: cn(
354
+ "rounded-md py-2 text-sm transition-colors",
355
+ "hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50",
356
+ outsideDecade && "text-muted-foreground",
357
+ selected && "bg-primary text-primary-foreground hover:bg-primary"
358
+ ),
359
+ disabled,
360
+ type: "button",
361
+ onClick: () => onSelect(yearDate),
362
+ children: year
363
+ },
364
+ year
365
+ );
366
+ }) })
367
+ ] });
368
+ };
369
+
207
370
  const DatePicker = forwardRef(
208
371
  ({
209
372
  value,
@@ -218,6 +381,7 @@ const DatePicker = forwardRef(
218
381
  showSeconds = false,
219
382
  minDate,
220
383
  maxDate,
384
+ disabledDate,
221
385
  placeholder,
222
386
  label,
223
387
  error,
@@ -233,7 +397,12 @@ const DatePicker = forwardRef(
233
397
  open: openProp,
234
398
  onOpenChange,
235
399
  className,
236
- labelProps
400
+ labelProps,
401
+ picker = "date",
402
+ side = "bottom",
403
+ align = "start",
404
+ trigger,
405
+ weekStartsOn = 0
237
406
  }, ref) => {
238
407
  const generatedId = useId();
239
408
  const errorId = `error_${generatedId}`;
@@ -276,13 +445,14 @@ const DatePicker = forwardRef(
276
445
  );
277
446
  const calendarDisabled = useCallback(
278
447
  (date) => {
279
- if (minDate && date < new Date(minDate.setHours(0, 0, 0, 0)))
448
+ if (disabledDate?.(date)) return true;
449
+ if (minDate && date < new Date(new Date(minDate).setHours(0, 0, 0, 0)))
280
450
  return true;
281
- if (maxDate && date > new Date(maxDate.setHours(23, 59, 59, 999)))
451
+ if (maxDate && date > new Date(new Date(maxDate).setHours(23, 59, 59, 999)))
282
452
  return true;
283
453
  return false;
284
454
  },
285
- [minDate, maxDate]
455
+ [minDate, maxDate, disabledDate]
286
456
  );
287
457
  const getDisplayText = useCallback(() => {
288
458
  if (type !== "range") {
@@ -500,16 +670,49 @@ const DatePicker = forwardRef(
500
670
  if (!open) setInputText(getDisplayText());
501
671
  }, [getDisplayText, open]);
502
672
  useCursorRestore([{ inputRef, cursorRef: cursorPosRef }]);
673
+ useEffect(() => {
674
+ if (!open || type !== "date") return;
675
+ const dateVal = currentValue;
676
+ if (dateVal instanceof Date) setCalendarMonth(dateVal);
677
+ }, [open]);
503
678
  const hasField = !!(label || error || helpText);
504
679
  const showFooter = showTime || needConfirm || !!onTimezoneChange;
505
680
  const todayDate = toBrowserLocalDate(/* @__PURE__ */ new Date());
681
+ const handleGridPickerSelect = (date) => {
682
+ commitValue(date);
683
+ setOpen(false);
684
+ };
685
+ const handleSingleDateSelectWithPicker = (selected) => {
686
+ if (!selected) return handleDateSelect(void 0);
687
+ handleDateSelect(
688
+ picker === "week" ? startOfWeek(selected, weekStartsOn) : selected
689
+ );
690
+ };
691
+ const weekHighlightProps = (() => {
692
+ if (picker !== "week" || type !== "date" || !currentValue) return {};
693
+ const weekStart = startOfWeek(currentValue, weekStartsOn);
694
+ const weekDays = weekDaysFrom(weekStart);
695
+ return {
696
+ modifiers: {
697
+ weekStart: [weekDays[0]],
698
+ weekMiddle: weekDays.slice(1, 6),
699
+ weekEnd: [weekDays[6]]
700
+ },
701
+ modifiersClassNames: {
702
+ weekStart: "!bg-primary !text-primary-foreground !rounded-e-none hover:!bg-primary",
703
+ weekMiddle: "!bg-primary !text-primary-foreground !rounded-none hover:!bg-primary",
704
+ weekEnd: "!bg-primary !text-primary-foreground !rounded-s-none hover:!bg-primary"
705
+ }
706
+ };
707
+ })();
708
+ const weekRowHoverClassName = picker === "week" ? "[&_button]:!transition-none [&:hover_button]:!bg-primary [&:hover_button]:!text-primary-foreground [&:hover_button]:!rounded-none [&:hover_button]:cursor-pointer" : void 0;
506
709
  const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null].filter(Boolean).join(" ") || void 0;
507
710
  const calendarSelected = () => {
508
711
  if (showTime || needConfirm) return pendingDate ?? void 0;
509
712
  return currentValue ?? void 0;
510
713
  };
511
- const triggerContent = /* @__PURE__ */ jsxs(Popover, { open, children: [
512
- /* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
714
+ const triggerContent = /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: trigger ? setOpen : void 0, children: [
715
+ trigger ? /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: trigger }) : /* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
513
716
  "div",
514
717
  {
515
718
  ref: containerRef,
@@ -525,7 +728,10 @@ const DatePicker = forwardRef(
525
728
  /* @__PURE__ */ jsx(
526
729
  Calendar,
527
730
  {
528
- className: cn("shrink-0 text-muted-foreground", sizeConfig.icon)
731
+ className: cn(
732
+ "shrink-0 text-muted-foreground",
733
+ sizeConfig.icon
734
+ )
529
735
  }
530
736
  ),
531
737
  /* @__PURE__ */ jsx(
@@ -576,14 +782,35 @@ const DatePicker = forwardRef(
576
782
  {
577
783
  id: popoverContentId,
578
784
  className: "w-auto p-0",
579
- align: "start",
785
+ align,
786
+ side,
580
787
  onOpenAutoFocus: (e) => e.preventDefault(),
581
788
  onCloseAutoFocus: (e) => e.preventDefault(),
582
789
  onPointerDownOutside: (e) => e.preventDefault(),
583
790
  onInteractOutside: (e) => e.preventDefault(),
584
791
  children: [
585
792
  /* @__PURE__ */ jsxs("div", { className: cn("flex", showTime && "flex-row"), children: [
586
- type === "date" ? /* @__PURE__ */ jsx(
793
+ type === "date" && picker === "month" ? /* @__PURE__ */ jsx(
794
+ MonthPicker,
795
+ {
796
+ value: currentValue ?? null,
797
+ displayedYear: calendarMonth.getFullYear(),
798
+ onYearChange: (year) => setCalendarMonth(
799
+ new Date(year, calendarMonth.getMonth(), 1)
800
+ ),
801
+ onSelect: handleGridPickerSelect,
802
+ isDisabled: (date) => isMonthDisabled(date, minDate, maxDate)
803
+ }
804
+ ) : type === "date" && picker === "year" ? /* @__PURE__ */ jsx(
805
+ YearPicker,
806
+ {
807
+ value: currentValue ?? null,
808
+ displayedYear: calendarMonth.getFullYear(),
809
+ onYearChange: (year) => setCalendarMonth(new Date(year, 0, 1)),
810
+ onSelect: handleGridPickerSelect,
811
+ isDisabled: (date) => isYearDisabled(date, minDate, maxDate)
812
+ }
813
+ ) : type === "date" ? /* @__PURE__ */ jsx(
587
814
  Calendar$1,
588
815
  {
589
816
  mode: "single",
@@ -592,8 +819,11 @@ const DatePicker = forwardRef(
592
819
  month: calendarMonth,
593
820
  onMonthChange: setCalendarMonth,
594
821
  selected: calendarSelected(),
595
- onSelect: handleDateSelect,
822
+ onSelect: handleSingleDateSelectWithPicker,
596
823
  disabled: calendarDisabled,
824
+ weekStartsOn,
825
+ classNames: weekRowHoverClassName ? { week: cn("mt-2 flex w-full", weekRowHoverClassName) } : void 0,
826
+ ...weekHighlightProps,
597
827
  ...minDate && { fromDate: minDate },
598
828
  ...maxDate && { toDate: maxDate }
599
829
  }
@@ -604,6 +834,7 @@ const DatePicker = forwardRef(
604
834
  numberOfMonths: 2,
605
835
  captionLayout: "dropdown",
606
836
  today: todayDate,
837
+ weekStartsOn,
607
838
  className: "[&_[data-outside][data-selected=true]]:!bg-transparent [&_[data-outside][data-selected=true]]:after:!bg-transparent [&_[data-outside]_button]:!bg-transparent [&_[data-outside]_button]:!text-muted-foreground",
608
839
  month: calendarMonth,
609
840
  onMonthChange: setCalendarMonth,
@@ -677,4 +908,4 @@ const DatePicker = forwardRef(
677
908
  DatePicker.displayName = "DatePicker";
678
909
 
679
910
  export { DatePicker as D };
680
- //# sourceMappingURL=DatePicker-DGf2BiNq.js.map
911
+ //# sourceMappingURL=DatePicker-kulToqfM.js.map