@bigbinary/neeto-atoms 1.0.8 → 1.0.9

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 (176) hide show
  1. package/dist/ColorPicker-D-7QGnf9.js +277 -0
  2. package/dist/ColorPicker-D-7QGnf9.js.map +1 -0
  3. package/dist/{DataTable-BKe9K5XP.js → DataTable-DWR9gX9d.js} +11 -3
  4. package/dist/{DataTable-BKe9K5XP.js.map → DataTable-DWR9gX9d.js.map} +1 -1
  5. package/dist/TranslationProvider-Ba9rn47H.js +96 -0
  6. package/dist/TranslationProvider-Ba9rn47H.js.map +1 -0
  7. package/dist/cjs/{ColorPicker-DN8aynGh.js → ColorPicker-DEELmqH8.js} +7 -10
  8. package/dist/cjs/ColorPicker-DEELmqH8.js.map +1 -0
  9. package/dist/cjs/{DataTable-BQt_mXDX.js → DataTable-CWs96k8n.js} +11 -3
  10. package/dist/cjs/{DataTable-BQt_mXDX.js.map → DataTable-CWs96k8n.js.map} +1 -1
  11. package/dist/cjs/TranslationProvider-DBZHXmzX.js +103 -0
  12. package/dist/cjs/TranslationProvider-DBZHXmzX.js.map +1 -0
  13. package/dist/cjs/components/Alert.js +7 -3
  14. package/dist/cjs/components/Alert.js.map +1 -1
  15. package/dist/cjs/components/Avatar.js +75 -0
  16. package/dist/cjs/components/Avatar.js.map +1 -0
  17. package/dist/cjs/components/Badge.js +3 -1
  18. package/dist/cjs/components/Badge.js.map +1 -1
  19. package/dist/cjs/components/Button.js +1 -0
  20. package/dist/cjs/components/Button.js.map +1 -1
  21. package/dist/cjs/components/Callout.js +73 -0
  22. package/dist/cjs/components/Callout.js.map +1 -0
  23. package/dist/cjs/components/ColorPicker.js +3 -1
  24. package/dist/cjs/components/ColorPicker.js.map +1 -1
  25. package/dist/cjs/components/DataTable.js +2 -1
  26. package/dist/cjs/components/DataTable.js.map +1 -1
  27. package/dist/cjs/components/Dialog.js +3 -2
  28. package/dist/cjs/components/Dialog.js.map +1 -1
  29. package/dist/cjs/components/DropdownMenu.js +3 -1
  30. package/dist/cjs/components/DropdownMenu.js.map +1 -1
  31. package/dist/cjs/components/Empty.js +59 -0
  32. package/dist/cjs/components/Empty.js.map +1 -0
  33. package/dist/cjs/components/Kbd.js +63 -0
  34. package/dist/cjs/components/Kbd.js.map +1 -0
  35. package/dist/cjs/components/Label.js +91 -0
  36. package/dist/cjs/components/Label.js.map +1 -0
  37. package/dist/cjs/components/MultiSelectDropdown.js +1 -0
  38. package/dist/cjs/components/MultiSelectDropdown.js.map +1 -1
  39. package/dist/cjs/components/Progress.js +22 -0
  40. package/dist/cjs/components/Progress.js.map +1 -0
  41. package/dist/cjs/components/SelectTriggerContent.js +11 -7
  42. package/dist/cjs/components/SelectTriggerContent.js.map +1 -1
  43. package/dist/cjs/components/Sheet.js +3 -2
  44. package/dist/cjs/components/Sheet.js.map +1 -1
  45. package/dist/cjs/components/Slider.js +45 -0
  46. package/dist/cjs/components/Slider.js.map +1 -0
  47. package/dist/cjs/components/Spinner.js +27 -0
  48. package/dist/cjs/components/Spinner.js.map +1 -0
  49. package/dist/cjs/components/Stepper.js +39 -0
  50. package/dist/cjs/components/Stepper.js.map +1 -0
  51. package/dist/cjs/components/TranslationProvider.js +12 -0
  52. package/dist/cjs/components/TranslationProvider.js.map +1 -0
  53. package/dist/cjs/{dialog-CF2GBHOG.js → dialog-Bvyrshz3.js} +4 -2
  54. package/dist/cjs/dialog-Bvyrshz3.js.map +1 -0
  55. package/dist/cjs/index.js +44 -10
  56. package/dist/cjs/index.js.map +1 -1
  57. package/dist/cjs/primitives/Breadcrumb.js +5 -2
  58. package/dist/cjs/primitives/Breadcrumb.js.map +1 -1
  59. package/dist/cjs/primitives/Carousel.js +5 -2
  60. package/dist/cjs/primitives/Carousel.js.map +1 -1
  61. package/dist/cjs/primitives/Command.js +6 -2
  62. package/dist/cjs/primitives/Command.js.map +1 -1
  63. package/dist/cjs/primitives/Dialog.js +2 -1
  64. package/dist/cjs/primitives/Dialog.js.map +1 -1
  65. package/dist/cjs/primitives/Pagination.js +11 -5
  66. package/dist/cjs/primitives/Pagination.js.map +1 -1
  67. package/dist/cjs/primitives/Sheet.js +2 -1
  68. package/dist/cjs/primitives/Sheet.js.map +1 -1
  69. package/dist/cjs/primitives/Sidebar.js +8 -4
  70. package/dist/cjs/primitives/Sidebar.js.map +1 -1
  71. package/dist/cjs/primitives/Sonner.js +7 -42
  72. package/dist/cjs/primitives/Sonner.js.map +1 -1
  73. package/dist/cjs/primitives/Spinner.js +3 -1
  74. package/dist/cjs/primitives/Spinner.js.map +1 -1
  75. package/dist/cjs/primitives/index.js +4 -2
  76. package/dist/cjs/primitives/index.js.map +1 -1
  77. package/dist/cjs/{sheet-CkCrHmVA.js → sheet-BZHMKVH1.js} +4 -2
  78. package/dist/cjs/sheet-BZHMKVH1.js.map +1 -0
  79. package/dist/cjs/triangle-alert-ZUMRpmzW.js +43 -0
  80. package/dist/cjs/triangle-alert-ZUMRpmzW.js.map +1 -0
  81. package/dist/components/Alert.js +7 -3
  82. package/dist/components/Alert.js.map +1 -1
  83. package/dist/components/Avatar.d.ts +31 -0
  84. package/dist/components/Avatar.js +73 -0
  85. package/dist/components/Avatar.js.map +1 -0
  86. package/dist/components/Badge.js +3 -1
  87. package/dist/components/Badge.js.map +1 -1
  88. package/dist/components/Button.js +1 -0
  89. package/dist/components/Button.js.map +1 -1
  90. package/dist/components/Callout.d.ts +17 -0
  91. package/dist/components/Callout.js +71 -0
  92. package/dist/components/Callout.js.map +1 -0
  93. package/dist/components/ColorPicker.js +3 -1
  94. package/dist/components/ColorPicker.js.map +1 -1
  95. package/dist/components/DataTable/components/EmptyState.d.ts +1 -1
  96. package/dist/components/DataTable.js +2 -1
  97. package/dist/components/DataTable.js.map +1 -1
  98. package/dist/components/Dialog.js +3 -2
  99. package/dist/components/Dialog.js.map +1 -1
  100. package/dist/components/DropdownMenu.js +3 -1
  101. package/dist/components/DropdownMenu.js.map +1 -1
  102. package/dist/components/Empty.d.ts +27 -0
  103. package/dist/components/Empty.js +57 -0
  104. package/dist/components/Empty.js.map +1 -0
  105. package/dist/components/Kbd.d.ts +15 -0
  106. package/dist/components/Kbd.js +61 -0
  107. package/dist/components/Kbd.js.map +1 -0
  108. package/dist/components/Label.d.ts +40 -0
  109. package/dist/components/Label.js +89 -0
  110. package/dist/components/Label.js.map +1 -0
  111. package/dist/components/MultiSelectDropdown.js +1 -0
  112. package/dist/components/MultiSelectDropdown.js.map +1 -1
  113. package/dist/components/Progress.d.ts +12 -0
  114. package/dist/components/Progress.js +20 -0
  115. package/dist/components/Progress.js.map +1 -0
  116. package/dist/components/SelectTriggerContent.js +11 -7
  117. package/dist/components/SelectTriggerContent.js.map +1 -1
  118. package/dist/components/Sheet.js +3 -2
  119. package/dist/components/Sheet.js.map +1 -1
  120. package/dist/components/Slider.d.ts +19 -0
  121. package/dist/components/Slider.js +43 -0
  122. package/dist/components/Slider.js.map +1 -0
  123. package/dist/components/Spinner.d.ts +10 -0
  124. package/dist/components/Spinner.js +25 -0
  125. package/dist/components/Spinner.js.map +1 -0
  126. package/dist/components/Stepper.d.ts +18 -0
  127. package/dist/components/Stepper.js +33 -0
  128. package/dist/components/Stepper.js.map +1 -0
  129. package/dist/components/TranslationProvider/TranslationProvider.d.ts +6 -0
  130. package/dist/components/TranslationProvider/i18n.d.ts +1 -0
  131. package/dist/components/TranslationProvider/index.d.ts +2 -0
  132. package/dist/components/TranslationProvider/types.d.ts +7 -0
  133. package/dist/components/TranslationProvider.js +6 -0
  134. package/dist/components/TranslationProvider.js.map +1 -0
  135. package/dist/components/Typography.d.ts +1 -1
  136. package/dist/{dialog-Civ9r6wD.js → dialog-CrB6N_2a.js} +4 -2
  137. package/dist/dialog-CrB6N_2a.js.map +1 -0
  138. package/dist/index.d.ts +21 -0
  139. package/dist/index.js +33 -10
  140. package/dist/index.js.map +1 -1
  141. package/dist/primitives/Breadcrumb.js +5 -2
  142. package/dist/primitives/Breadcrumb.js.map +1 -1
  143. package/dist/primitives/Carousel.js +5 -2
  144. package/dist/primitives/Carousel.js.map +1 -1
  145. package/dist/primitives/Command.js +6 -2
  146. package/dist/primitives/Command.js.map +1 -1
  147. package/dist/primitives/Dialog.js +2 -1
  148. package/dist/primitives/Dialog.js.map +1 -1
  149. package/dist/primitives/Pagination.js +11 -5
  150. package/dist/primitives/Pagination.js.map +1 -1
  151. package/dist/primitives/Sheet.js +2 -1
  152. package/dist/primitives/Sheet.js.map +1 -1
  153. package/dist/primitives/Sidebar.js +8 -4
  154. package/dist/primitives/Sidebar.js.map +1 -1
  155. package/dist/primitives/Sonner.js +5 -40
  156. package/dist/primitives/Sonner.js.map +1 -1
  157. package/dist/primitives/Spinner.js +3 -1
  158. package/dist/primitives/Spinner.js.map +1 -1
  159. package/dist/primitives/index.js +4 -2
  160. package/dist/primitives/index.js.map +1 -1
  161. package/dist/shadcn/components/command.d.ts +1 -1
  162. package/dist/shadcn/components/pagination.d.ts +2 -2
  163. package/dist/shadcn/components/typography.d.ts +2 -2
  164. package/dist/{sheet-COcn22fC.js → sheet-C763FqIh.js} +4 -2
  165. package/dist/sheet-C763FqIh.js.map +1 -0
  166. package/dist/translations/index.d.ts +66 -0
  167. package/dist/triangle-alert-PXnNWQy_.js +40 -0
  168. package/dist/triangle-alert-PXnNWQy_.js.map +1 -0
  169. package/package.json +38 -34
  170. package/dist/ColorPicker-BPvxDGDM.js +0 -276
  171. package/dist/ColorPicker-BPvxDGDM.js.map +0 -1
  172. package/dist/cjs/ColorPicker-DN8aynGh.js.map +0 -1
  173. package/dist/cjs/dialog-CF2GBHOG.js.map +0 -1
  174. package/dist/cjs/sheet-CkCrHmVA.js.map +0 -1
  175. package/dist/dialog-Civ9r6wD.js.map +0 -1
  176. package/dist/sheet-COcn22fC.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.js","sources":["../../src/components/Alert.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useRef,\n type ReactNode,\n type RefObject,\n} from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"src/primitives/Dialog\";\nimport { Button } from \"src/components/Button\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype AlertStyle = \"danger\" | \"warning\";\ntype AlertSize = \"small\" | \"medium\" | \"large\";\ntype InitialFocusElement = \"submit\" | \"cancel\";\n\n/** Radix Dialog.Content props we forward via ...otherProps. */\ntype DialogContentProps = React.ComponentProps<typeof DialogContent>;\n\nexport interface AlertProps extends Omit<\n DialogContentProps,\n | \"children\"\n | \"role\"\n | \"showCloseButton\"\n | \"className\"\n | \"style\"\n | \"onEscapeKeyDown\"\n | \"onInteractOutside\"\n> {\n /** Size of the alert dialog. */\n size?: AlertSize;\n /** Whether the alert is open. */\n isOpen?: boolean;\n /** Whether the submit action is in progress. */\n isSubmitting?: boolean;\n /** Additional CSS class names applied to the dialog content. */\n className?: string;\n /** Close on pressing the Esc key. */\n closeOnEsc?: boolean;\n /** Show the close button. */\n closeButton?: boolean;\n /** Additional CSS class names applied to the backdrop/overlay. */\n backdropClassName?: string;\n /** Close on clicking outside the dialog. */\n closeOnOutsideClick?: boolean;\n /** Callback invoked when the alert is closed. */\n onClose?: () => void;\n /** Callback invoked when the submit button is clicked. */\n onSubmit?: () => void;\n /** Title text of the alert. */\n title?: string;\n /** Message content of the alert. */\n message?: ReactNode;\n /** Label for the submit button. */\n submitButtonLabel?: string;\n /** Label for the cancel button. */\n cancelButtonLabel?: string;\n /** Hide the cancel button. */\n hideCancelButton?: boolean;\n /** Visual style of the submit button. */\n style?: AlertStyle;\n /** Ref of the element to receive focus when the alert opens. */\n initialFocusRef?: RefObject<HTMLElement | null>;\n /** Which built-in button receives focus on open: \"submit\" or \"cancel\". */\n initialFocusElement?: InitialFocusElement;\n /** Radix Dialog `modal` prop — controls modal vs non-modal behaviour. */\n modal?: boolean;\n /** Radix Dialog `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Size mapping\n// ---------------------------------------------------------------------------\n\nconst SIZE_CLASS_MAP: Record<AlertSize, string> = {\n small: \"sm:max-w-xs\",\n medium: \"sm:max-w-sm\",\n large: \"sm:max-w-md\",\n};\n\n// ---------------------------------------------------------------------------\n// Style to variant mapping\n// ---------------------------------------------------------------------------\n\nconst STYLE_VARIANT_MAP: Record<AlertStyle, \"destructive\" | \"default\"> = {\n danger: \"destructive\",\n warning: \"default\",\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Alert = forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n size = \"medium\",\n isOpen = false,\n isSubmitting = false,\n className,\n closeOnEsc = true,\n closeButton = true,\n backdropClassName,\n closeOnOutsideClick = true,\n onClose = () => {},\n onSubmit = () => {},\n title = \"\",\n message = \"\",\n submitButtonLabel = \"Continue\",\n cancelButtonLabel = \"Cancel\",\n hideCancelButton = false,\n style = \"danger\",\n initialFocusRef,\n initialFocusElement,\n modal,\n defaultOpen,\n // Radix content handlers — we intercept and merge\n onOpenAutoFocus: onOpenAutoFocusProp,\n onCloseAutoFocus: onCloseAutoFocusProp,\n ...otherProps\n },\n ref\n ) => {\n const baseId = useId();\n const titleId = `alert-title-${baseId}`;\n const messageId = `alert-message-${baseId}`;\n const submitButtonRef = useRef<HTMLButtonElement>(null);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n\n const handleOpenChange = (open: boolean) => {\n if (!open) onClose();\n };\n\n const handleInteractOutside = (e: Event) => {\n if (!closeOnOutsideClick) e.preventDefault();\n };\n\n const handleEscapeKeyDown = (e: KeyboardEvent) => {\n if (!closeOnEsc) e.preventDefault();\n };\n\n const handleOpenAutoFocus = (e: Event) => {\n // Custom focus ref takes highest priority\n if (initialFocusRef?.current) {\n e.preventDefault();\n initialFocusRef.current.focus();\n } else if (initialFocusElement === \"submit\" && submitButtonRef.current) {\n e.preventDefault();\n submitButtonRef.current.focus();\n } else if (initialFocusElement === \"cancel\" && cancelButtonRef.current) {\n e.preventDefault();\n cancelButtonRef.current.focus();\n }\n onOpenAutoFocusProp?.(e);\n };\n\n const handleCloseAutoFocus = (e: Event) => {\n onCloseAutoFocusProp?.(e);\n };\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n defaultOpen={defaultOpen}\n >\n <DialogContent\n ref={ref}\n role=\"alertdialog\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={message ? messageId : undefined}\n showCloseButton={closeButton}\n overlayClassName={backdropClassName}\n onInteractOutside={handleInteractOutside}\n onEscapeKeyDown={handleEscapeKeyDown}\n onOpenAutoFocus={handleOpenAutoFocus}\n onCloseAutoFocus={handleCloseAutoFocus}\n className={cn(SIZE_CLASS_MAP[size], className)}\n data-testid=\"alert-box\"\n {...otherProps}\n >\n <DialogHeader>\n <DialogTitle id={titleId} data-testid=\"alert-title\">\n {title}\n </DialogTitle>\n {message && (\n <DialogDescription id={messageId} data-testid=\"alert-message\">\n {message}\n </DialogDescription>\n )}\n </DialogHeader>\n <DialogFooter>\n {!hideCancelButton && (\n <Button\n ref={cancelButtonRef}\n variant=\"outline\"\n label={cancelButtonLabel}\n onClick={onClose}\n data-testid=\"alert-cancel-button\"\n />\n )}\n <Button\n ref={submitButtonRef}\n variant={STYLE_VARIANT_MAP[style]}\n label={submitButtonLabel}\n loading={isSubmitting}\n disabled={isSubmitting || !isOpen}\n onClick={onSubmit}\n data-testid=\"alert-submit-button\"\n />\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n }\n);\n\nAlert.displayName = \"Alert\";\n\nexport { Alert };\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"Alert.js","sources":["../../src/components/Alert.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useRef,\n type ReactNode,\n type RefObject,\n} from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"src/primitives/Dialog\";\nimport { Button } from \"src/components/Button\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype AlertStyle = \"danger\" | \"warning\";\ntype AlertSize = \"small\" | \"medium\" | \"large\";\ntype InitialFocusElement = \"submit\" | \"cancel\";\n\n/** Radix Dialog.Content props we forward via ...otherProps. */\ntype DialogContentProps = React.ComponentProps<typeof DialogContent>;\n\nexport interface AlertProps extends Omit<\n DialogContentProps,\n | \"children\"\n | \"role\"\n | \"showCloseButton\"\n | \"className\"\n | \"style\"\n | \"onEscapeKeyDown\"\n | \"onInteractOutside\"\n> {\n /** Size of the alert dialog. */\n size?: AlertSize;\n /** Whether the alert is open. */\n isOpen?: boolean;\n /** Whether the submit action is in progress. */\n isSubmitting?: boolean;\n /** Additional CSS class names applied to the dialog content. */\n className?: string;\n /** Close on pressing the Esc key. */\n closeOnEsc?: boolean;\n /** Show the close button. */\n closeButton?: boolean;\n /** Additional CSS class names applied to the backdrop/overlay. */\n backdropClassName?: string;\n /** Close on clicking outside the dialog. */\n closeOnOutsideClick?: boolean;\n /** Callback invoked when the alert is closed. */\n onClose?: () => void;\n /** Callback invoked when the submit button is clicked. */\n onSubmit?: () => void;\n /** Title text of the alert. */\n title?: string;\n /** Message content of the alert. */\n message?: ReactNode;\n /** Label for the submit button. */\n submitButtonLabel?: string;\n /** Label for the cancel button. */\n cancelButtonLabel?: string;\n /** Hide the cancel button. */\n hideCancelButton?: boolean;\n /** Visual style of the submit button. */\n style?: AlertStyle;\n /** Ref of the element to receive focus when the alert opens. */\n initialFocusRef?: RefObject<HTMLElement | null>;\n /** Which built-in button receives focus on open: \"submit\" or \"cancel\". */\n initialFocusElement?: InitialFocusElement;\n /** Radix Dialog `modal` prop — controls modal vs non-modal behaviour. */\n modal?: boolean;\n /** Radix Dialog `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Size mapping\n// ---------------------------------------------------------------------------\n\nconst SIZE_CLASS_MAP: Record<AlertSize, string> = {\n small: \"sm:max-w-xs\",\n medium: \"sm:max-w-sm\",\n large: \"sm:max-w-md\",\n};\n\n// ---------------------------------------------------------------------------\n// Style to variant mapping\n// ---------------------------------------------------------------------------\n\nconst STYLE_VARIANT_MAP: Record<AlertStyle, \"destructive\" | \"default\"> = {\n danger: \"destructive\",\n warning: \"default\",\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Alert = forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n size = \"medium\",\n isOpen = false,\n isSubmitting = false,\n className,\n closeOnEsc = true,\n closeButton = true,\n backdropClassName,\n closeOnOutsideClick = true,\n onClose = () => {},\n onSubmit = () => {},\n title = \"\",\n message = \"\",\n submitButtonLabel: submitButtonLabelProp,\n cancelButtonLabel: cancelButtonLabelProp,\n hideCancelButton = false,\n style = \"danger\",\n initialFocusRef,\n initialFocusElement,\n modal,\n defaultOpen,\n // Radix content handlers — we intercept and merge\n onOpenAutoFocus: onOpenAutoFocusProp,\n onCloseAutoFocus: onCloseAutoFocusProp,\n ...otherProps\n },\n ref\n ) => {\n const { t } = useTranslation();\n const submitButtonLabel =\n submitButtonLabelProp ?? t(\"neetoatoms.alert.continue\", \"Continue\");\n const cancelButtonLabel =\n cancelButtonLabelProp ?? t(\"neetoatoms.alert.cancel\", \"Cancel\");\n const baseId = useId();\n const titleId = `alert-title-${baseId}`;\n const messageId = `alert-message-${baseId}`;\n const submitButtonRef = useRef<HTMLButtonElement>(null);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n\n const handleOpenChange = (open: boolean) => {\n if (!open) onClose();\n };\n\n const handleInteractOutside = (e: Event) => {\n if (!closeOnOutsideClick) e.preventDefault();\n };\n\n const handleEscapeKeyDown = (e: KeyboardEvent) => {\n if (!closeOnEsc) e.preventDefault();\n };\n\n const handleOpenAutoFocus = (e: Event) => {\n // Custom focus ref takes highest priority\n if (initialFocusRef?.current) {\n e.preventDefault();\n initialFocusRef.current.focus();\n } else if (initialFocusElement === \"submit\" && submitButtonRef.current) {\n e.preventDefault();\n submitButtonRef.current.focus();\n } else if (initialFocusElement === \"cancel\" && cancelButtonRef.current) {\n e.preventDefault();\n cancelButtonRef.current.focus();\n }\n onOpenAutoFocusProp?.(e);\n };\n\n const handleCloseAutoFocus = (e: Event) => {\n onCloseAutoFocusProp?.(e);\n };\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n defaultOpen={defaultOpen}\n >\n <DialogContent\n ref={ref}\n role=\"alertdialog\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={message ? messageId : undefined}\n showCloseButton={closeButton}\n overlayClassName={backdropClassName}\n onInteractOutside={handleInteractOutside}\n onEscapeKeyDown={handleEscapeKeyDown}\n onOpenAutoFocus={handleOpenAutoFocus}\n onCloseAutoFocus={handleCloseAutoFocus}\n className={cn(SIZE_CLASS_MAP[size], className)}\n data-testid=\"alert-box\"\n {...otherProps}\n >\n <DialogHeader>\n <DialogTitle\n id={titleId}\n data-testid=\"alert-title\"\n className=\"text-2xl font-semibold\"\n >\n {title}\n </DialogTitle>\n {message && (\n <DialogDescription id={messageId} data-testid=\"alert-message\">\n {message}\n </DialogDescription>\n )}\n </DialogHeader>\n <DialogFooter>\n {!hideCancelButton && (\n <Button\n ref={cancelButtonRef}\n variant=\"outline\"\n label={cancelButtonLabel}\n onClick={onClose}\n data-testid=\"alert-cancel-button\"\n />\n )}\n <Button\n ref={submitButtonRef}\n variant={STYLE_VARIANT_MAP[style]}\n label={submitButtonLabel}\n loading={isSubmitting}\n disabled={isSubmitting || !isOpen}\n onClick={onSubmit}\n data-testid=\"alert-submit-button\"\n />\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n }\n);\n\nAlert.displayName = \"Alert\";\n\nexport { Alert };\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import { Avatar as PrimitiveAvatar } from "src/primitives/Avatar";
3
+ type AvatarSize = "sm" | "default" | "lg" | "xl";
4
+ interface AvatarTooltipProps {
5
+ /** Tooltip content. Defaults to user.name if showTooltip is true. */
6
+ content?: React.ReactNode;
7
+ /** Tooltip position. */
8
+ position?: string;
9
+ }
10
+ export interface AvatarProps extends Omit<React.ComponentProps<typeof PrimitiveAvatar>, "size"> {
11
+ /** User data for the avatar. */
12
+ user?: {
13
+ name?: string;
14
+ imageUrl?: string;
15
+ };
16
+ /** Status indicator displayed as a colored badge. */
17
+ status?: "online" | "idle" | "offline" | null;
18
+ /** Show the user's name in a tooltip on hover. */
19
+ showTooltip?: boolean;
20
+ /** Tooltip configuration. Overrides showTooltip content. */
21
+ tooltipProps?: AvatarTooltipProps;
22
+ /** Size of the avatar. */
23
+ size?: AvatarSize;
24
+ /** Additional CSS class names. */
25
+ className?: string;
26
+ }
27
+ declare const AvatarNamespace: React.ForwardRefExoticComponent<Omit<AvatarProps, "ref"> & React.RefAttributes<HTMLSpanElement>> & {
28
+ Group: (props: React.ComponentProps<typeof import("../shadcn/components/avatar").AvatarGroup>) => import("react/jsx-runtime").JSX.Element;
29
+ GroupCount: (props: React.ComponentProps<typeof import("../shadcn/components/avatar").AvatarGroupCount>) => import("react/jsx-runtime").JSX.Element;
30
+ };
31
+ export { AvatarNamespace as Avatar };
@@ -0,0 +1,73 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { c as cn } from '../utils-DdHUxIdC.js';
4
+ import { Avatar as Avatar$1, AvatarImage, AvatarFallback, AvatarBadge, AvatarGroupCount, AvatarGroup } from '../primitives/Avatar.js';
5
+ import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '../primitives/Tooltip.js';
6
+ import '../index-CiyxEyB0.js';
7
+ import '../index-CSUSJzOJ.js';
8
+ import '../index-DOzu5J1s.js';
9
+ import '../index-DhnfW8wQ.js';
10
+ import 'react-dom';
11
+ import '../index-BtkPdosV.js';
12
+ import '../index-DZXbzIgC.js';
13
+ import '../index-CSMSzzKM.js';
14
+ import '../tooltip-DzjIJacP.js';
15
+ import '../index-DNzunGHb.js';
16
+ import '../index-BNPynZWM.js';
17
+ import '../index-zW4GjM5L.js';
18
+ import '../index-ByEpUy7w.js';
19
+ import '../floating-ui.react-dom-CcGbtPEK.js';
20
+ import '../index-BYZaLNq1.js';
21
+ import '../index-fV_U4ZJM.js';
22
+ import '../index-yFgkK_AM.js';
23
+ import '../index-Cor698lu.js';
24
+ import '../index-CSggBaQF.js';
25
+
26
+ // ---------------------------------------------------------------------------
27
+ // Helpers
28
+ // ---------------------------------------------------------------------------
29
+ const STATUS_COLOR_MAP = {
30
+ online: "bg-emerald-500 dark:bg-emerald-400",
31
+ idle: "bg-amber-500 dark:bg-amber-400",
32
+ offline: "bg-gray-400 dark:bg-gray-500",
33
+ };
34
+ const SIDE_MAP = {
35
+ top: "top",
36
+ bottom: "bottom",
37
+ left: "left",
38
+ right: "right",
39
+ auto: "bottom",
40
+ };
41
+ const XL_CLASSES = "data-[size=lg]:size-16 [&>[data-slot=avatar-badge]]:size-4 [&>[data-slot=avatar-fallback]]:text-lg";
42
+ function getInitials(name) {
43
+ if (!name)
44
+ return "";
45
+ return name
46
+ .split(/\s+/)
47
+ .slice(0, 2)
48
+ .map(word => word.charAt(0).toUpperCase())
49
+ .join("");
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Component
53
+ // ---------------------------------------------------------------------------
54
+ const Avatar = forwardRef(({ user, status, showTooltip = false, tooltipProps, size = "default", className, ...otherProps }, ref) => {
55
+ const initials = getInitials(user?.name);
56
+ const isXl = size === "xl";
57
+ const primitiveSize = isXl ? "lg" : size;
58
+ const avatarElement = (jsxs(Avatar$1, { ref: ref, size: primitiveSize, className: cn(isXl && XL_CLASSES, className), ...otherProps, children: [user?.imageUrl && (jsx(AvatarImage, { src: user.imageUrl, alt: user?.name ?? "" })), jsx(AvatarFallback, { children: initials }), status && jsx(AvatarBadge, { className: cn(STATUS_COLOR_MAP[status]) })] }));
59
+ const tooltipContent = tooltipProps?.content ?? (showTooltip ? user?.name : null);
60
+ if (tooltipContent) {
61
+ const side = SIDE_MAP[tooltipProps?.position ?? "auto"] ?? "bottom";
62
+ return (jsx(TooltipProvider, { delayDuration: 0, children: jsxs(Tooltip, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx("span", { className: "inline-flex", children: avatarElement }) }), jsx(TooltipContent, { side: side, children: tooltipContent })] }) }));
63
+ }
64
+ return avatarElement;
65
+ });
66
+ Avatar.displayName = "Avatar";
67
+ const AvatarNamespace = Object.assign(Avatar, {
68
+ Group: AvatarGroup,
69
+ GroupCount: AvatarGroupCount,
70
+ });
71
+
72
+ export { AvatarNamespace as Avatar };
73
+ //# sourceMappingURL=Avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.js","sources":["../../src/components/Avatar.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Avatar as PrimitiveAvatar,\n AvatarImage,\n AvatarFallback,\n AvatarBadge,\n AvatarGroup,\n AvatarGroupCount,\n} from \"src/primitives/Avatar\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype AvatarSize = \"sm\" | \"default\" | \"lg\" | \"xl\";\n\ninterface AvatarTooltipProps {\n /** Tooltip content. Defaults to user.name if showTooltip is true. */\n content?: React.ReactNode;\n /** Tooltip position. */\n position?: string;\n}\n\nexport interface AvatarProps extends Omit<\n React.ComponentProps<typeof PrimitiveAvatar>,\n \"size\"\n> {\n /** User data for the avatar. */\n user?: { name?: string; imageUrl?: string };\n /** Status indicator displayed as a colored badge. */\n status?: \"online\" | \"idle\" | \"offline\" | null;\n /** Show the user's name in a tooltip on hover. */\n showTooltip?: boolean;\n /** Tooltip configuration. Overrides showTooltip content. */\n tooltipProps?: AvatarTooltipProps;\n /** Size of the avatar. */\n size?: AvatarSize;\n /** Additional CSS class names. */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst STATUS_COLOR_MAP: Record<string, string> = {\n online: \"bg-emerald-500 dark:bg-emerald-400\",\n idle: \"bg-amber-500 dark:bg-amber-400\",\n offline: \"bg-gray-400 dark:bg-gray-500\",\n};\n\nconst SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n auto: \"bottom\",\n};\n\nconst XL_CLASSES =\n \"data-[size=lg]:size-16 [&>[data-slot=avatar-badge]]:size-4 [&>[data-slot=avatar-fallback]]:text-lg\";\n\nfunction getInitials(name?: string): string {\n if (!name) return \"\";\n\n return name\n .split(/\\s+/)\n .slice(0, 2)\n .map(word => word.charAt(0).toUpperCase())\n .join(\"\");\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n (\n {\n user,\n status,\n showTooltip = false,\n tooltipProps,\n size = \"default\",\n className,\n ...otherProps\n },\n ref\n ) => {\n const initials = getInitials(user?.name);\n const isXl = size === \"xl\";\n const primitiveSize = isXl ? \"lg\" : size;\n\n const avatarElement = (\n <PrimitiveAvatar\n ref={ref}\n size={primitiveSize}\n className={cn(isXl && XL_CLASSES, className)}\n {...otherProps}\n >\n {user?.imageUrl && (\n <AvatarImage src={user.imageUrl} alt={user?.name ?? \"\"} />\n )}\n <AvatarFallback>{initials}</AvatarFallback>\n {status && <AvatarBadge className={cn(STATUS_COLOR_MAP[status])} />}\n </PrimitiveAvatar>\n );\n\n const tooltipContent =\n tooltipProps?.content ?? (showTooltip ? user?.name : null);\n\n if (tooltipContent) {\n const side = SIDE_MAP[tooltipProps?.position ?? \"auto\"] ?? \"bottom\";\n\n return (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex\">{avatarElement}</span>\n </TooltipTrigger>\n <TooltipContent side={side}>{tooltipContent}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return avatarElement;\n }\n);\n\nAvatar.displayName = \"Avatar\";\n\nconst AvatarNamespace = Object.assign(Avatar, {\n Group: AvatarGroup,\n GroupCount: AvatarGroupCount,\n});\n\nexport { AvatarNamespace as Avatar };\n"],"names":["_jsxs","PrimitiveAvatar","_jsx"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { forwardRef } from 'react';
3
+ import { useTranslation } from 'react-i18next';
3
4
  import { c as cn } from '../utils-DdHUxIdC.js';
4
5
  import { r as renderIcon } from '../renderIcon-tlvMyboj.js';
5
6
  import { Badge as Badge$1 } from '../primitives/Badge.js';
@@ -55,13 +56,14 @@ const INDICATOR_COLORS = {
55
56
  // Component
56
57
  // ---------------------------------------------------------------------------
57
58
  const Badge = forwardRef(({ variant = "default", size = "default", label, icon, iconPosition = "left", indicator, onDismiss, disabled = false, className, asChild = false, children, ...otherProps }, ref) => {
59
+ const { t } = useTranslation();
58
60
  if (asChild) {
59
61
  return (jsx(Badge$1, { ref: ref, asChild: true, variant: variant, size: size, className: className, ...otherProps, children: children }));
60
62
  }
61
63
  const renderLabel = label || children;
62
64
  const iconElement = icon ? renderIcon(icon) : null;
63
65
  const hasDismiss = !!onDismiss && !disabled;
64
- return (jsxs(Badge$1, { ref: ref, variant: variant, size: size, className: cn(disabled && "opacity-50 pointer-events-none", icon && iconPosition === "left" && SIZE_CONFIG[size].iconPl, icon && iconPosition === "right" && SIZE_CONFIG[size].iconPr, hasDismiss && SIZE_CONFIG[size].dismissPr, className), ...otherProps, children: [indicator && (jsx("span", { "aria-hidden": "true", className: cn("size-1.5 shrink-0 rounded-full", INDICATOR_COLORS[indicator]) })), iconPosition === "left" && iconElement, renderLabel, iconPosition === "right" && iconElement, onDismiss && !disabled && (jsx("button", { type: "button", "aria-label": "Dismiss", onClick: onDismiss, className: cn("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", SIZE_CONFIG[size].btnSize), children: jsx(X, { className: SIZE_CONFIG[size].iconSize }) }))] }));
66
+ return (jsxs(Badge$1, { ref: ref, variant: variant, size: size, className: cn(disabled && "opacity-50 pointer-events-none", icon && iconPosition === "left" && SIZE_CONFIG[size].iconPl, icon && iconPosition === "right" && SIZE_CONFIG[size].iconPr, hasDismiss && SIZE_CONFIG[size].dismissPr, className), ...otherProps, children: [indicator && (jsx("span", { "aria-hidden": "true", className: cn("size-1.5 shrink-0 rounded-full", INDICATOR_COLORS[indicator]) })), iconPosition === "left" && iconElement, renderLabel, iconPosition === "right" && iconElement, onDismiss && !disabled && (jsx("button", { type: "button", "aria-label": t("neetoatoms.badge.dismiss", "Dismiss"), onClick: onDismiss, className: cn("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", SIZE_CONFIG[size].btnSize), children: jsx(X, { className: SIZE_CONFIG[size].iconSize }) }))] }));
65
67
  });
66
68
  Badge.displayName = "Badge";
67
69
 
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.js","sources":["../../src/components/Badge.tsx"],"sourcesContent":["import React, { forwardRef, type ReactNode } from \"react\";\n\nimport { X } from \"lucide-react\";\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\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\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 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 /** 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\n// ---------------------------------------------------------------------------\n// Size config\n// ---------------------------------------------------------------------------\n\nconst 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\n// ---------------------------------------------------------------------------\n// Indicator colors\n// ---------------------------------------------------------------------------\n\nconst 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\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n variant = \"default\",\n size = \"default\",\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 if (asChild) {\n return (\n <PrimitiveBadge\n ref={ref}\n asChild\n variant={variant}\n size={size}\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 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=\"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":["_jsx","PrimitiveBadge","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"Badge.js","sources":["../../src/components/Badge.tsx"],"sourcesContent":["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\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\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 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 /** 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\n// ---------------------------------------------------------------------------\n// Size config\n// ---------------------------------------------------------------------------\n\nconst 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\n// ---------------------------------------------------------------------------\n// Indicator colors\n// ---------------------------------------------------------------------------\n\nconst 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\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n variant = \"default\",\n size = \"default\",\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 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 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":["_jsx","PrimitiveBadge","_jsxs"],"mappings":"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"}
@@ -9,6 +9,7 @@ import '../button-COIbN8dg.js';
9
9
  import '../index-D7Zy7P05.js';
10
10
  import '../index-CfriMyrd.js';
11
11
  import '../index-BtkPdosV.js';
12
+ import 'react-i18next';
12
13
  import '../loader-circle-DycHUAWN.js';
13
14
  import '../createLucideIcon-C8ycilSN.js';
14
15
  import '../tooltip-DzjIJacP.js';
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["import React, { forwardRef, type ReactNode, type MouseEvent } from \"react\";\n\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\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ButtonVariant =\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"outline\"\n | \"ghost\"\n | \"link\";\n\ntype ButtonSize =\n | \"default\"\n | \"xs\"\n | \"sm\"\n | \"lg\"\n | \"icon\"\n | \"icon-xs\"\n | \"icon-sm\"\n | \"icon-lg\";\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 {\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 /** Children rendered inside the button (fallback for `label`). */\n children?: ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Mappings\n// ---------------------------------------------------------------------------\n\nconst 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\nconst 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\nconst TOOLTIP_SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\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\n// ---------------------------------------------------------------------------\n// Component\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 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 </span>\n </>\n );\n\n // --- Merged className ---\n const mergedClassName = cn(\n fullWidth && \"w-full\",\n loading && \"relative pointer-events-none\",\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 <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={to}\n onClick={handleClick}\n >\n {buttonContent}\n </a>\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":["_jsxs","_Fragment","_jsx","PrimitiveButton"],"mappings":"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"}
1
+ {"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["import React, { forwardRef, type ReactNode, type MouseEvent } from \"react\";\n\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\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ButtonVariant =\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"outline\"\n | \"ghost\"\n | \"link\";\n\ntype ButtonSize =\n | \"default\"\n | \"xs\"\n | \"sm\"\n | \"lg\"\n | \"icon\"\n | \"icon-xs\"\n | \"icon-sm\"\n | \"icon-lg\";\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 {\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 /** Children rendered inside the button (fallback for `label`). */\n children?: ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Mappings\n// ---------------------------------------------------------------------------\n\nconst 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\nconst 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\nconst TOOLTIP_SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\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\n// ---------------------------------------------------------------------------\n// Component\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 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 </span>\n </>\n );\n\n // --- Merged className ---\n const mergedClassName = cn(\n fullWidth && \"w-full\",\n loading && \"relative pointer-events-none\",\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 <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={to}\n onClick={handleClick}\n >\n {buttonContent}\n </a>\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":["_jsxs","_Fragment","_jsx","PrimitiveButton"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import { Alert as PrimitiveAlert } from "src/primitives/Alert";
3
+ import { type IconProp } from "src/lib/renderIcon";
4
+ type CalloutVariant = "info" | "warning" | "danger" | "success";
5
+ type PrimitiveAlertProps = React.ComponentProps<typeof PrimitiveAlert>;
6
+ export interface CalloutProps extends Omit<PrimitiveAlertProps, "variant"> {
7
+ /** Visual style of the callout. */
8
+ variant?: CalloutVariant;
9
+ /** Custom icon. Defaults to a variant-specific icon. */
10
+ icon?: IconProp;
11
+ /** Optional title rendered as AlertTitle. */
12
+ title?: string;
13
+ /** Content rendered as AlertDescription. */
14
+ children?: React.ReactNode;
15
+ }
16
+ declare const Callout: React.ForwardRefExoticComponent<Omit<CalloutProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
17
+ export { Callout };
@@ -0,0 +1,71 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { Alert, AlertTitle, AlertDescription } from '../primitives/Alert.js';
4
+ import { c as cn } from '../utils-DdHUxIdC.js';
5
+ import { r as renderIcon } from '../renderIcon-tlvMyboj.js';
6
+ import { c as createLucideIcon } from '../createLucideIcon-C8ycilSN.js';
7
+ import { T as TriangleAlert, I as Info } from '../triangle-alert-PXnNWQy_.js';
8
+ import '../index-D7Zy7P05.js';
9
+
10
+ /**
11
+ * @license lucide-react v0.577.0 - ISC
12
+ *
13
+ * This source code is licensed under the ISC license.
14
+ * See the LICENSE file in the root directory of this source tree.
15
+ */
16
+
17
+
18
+ const __iconNode$1 = [
19
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
20
+ ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
21
+ ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
22
+ ];
23
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1);
24
+
25
+ /**
26
+ * @license lucide-react v0.577.0 - ISC
27
+ *
28
+ * This source code is licensed under the ISC license.
29
+ * See the LICENSE file in the root directory of this source tree.
30
+ */
31
+
32
+
33
+ const __iconNode = [
34
+ ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
35
+ ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
36
+ ];
37
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode);
38
+
39
+ // ---------------------------------------------------------------------------
40
+ // Variant config
41
+ // ---------------------------------------------------------------------------
42
+ const VARIANT_CONFIG = {
43
+ info: {
44
+ container: "border-0 bg-info text-info-foreground",
45
+ icon: Info,
46
+ },
47
+ warning: {
48
+ container: "border-0 bg-warning text-warning-foreground",
49
+ icon: TriangleAlert,
50
+ },
51
+ danger: {
52
+ container: "border-0 bg-error text-error-foreground",
53
+ icon: CircleAlert,
54
+ },
55
+ success: {
56
+ container: "border-0 bg-success text-success-foreground",
57
+ icon: CircleCheckBig,
58
+ },
59
+ };
60
+ // ---------------------------------------------------------------------------
61
+ // Component
62
+ // ---------------------------------------------------------------------------
63
+ const Callout = forwardRef(({ variant = "info", icon, title, children, className, ...otherProps }, ref) => {
64
+ const config = VARIANT_CONFIG[variant];
65
+ const resolvedIcon = icon ?? config.icon;
66
+ return (jsxs(Alert, { ref: ref, className: cn(config.container, className), ...otherProps, children: [renderIcon(resolvedIcon, "size-4 shrink-0"), title && jsx(AlertTitle, { children: title }), children && (jsx(AlertDescription, { className: "text-current/80", children: children }))] }));
67
+ });
68
+ Callout.displayName = "Callout";
69
+
70
+ export { Callout };
71
+ //# sourceMappingURL=Callout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.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.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, { 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\";\nimport {\n InfoIcon,\n AlertTriangleIcon,\n AlertCircleIcon,\n CheckCircleIcon,\n} from \"lucide-react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype 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\n// ---------------------------------------------------------------------------\n// Variant config\n// ---------------------------------------------------------------------------\n\nconst VARIANT_CONFIG: Record<\n CalloutVariant,\n {\n container: string;\n icon: React.ComponentType<{ className?: string }>;\n }\n> = {\n info: {\n container: \"border-0 bg-info text-info-foreground\",\n icon: InfoIcon,\n },\n warning: {\n container: \"border-0 bg-warning text-warning-foreground\",\n icon: AlertTriangleIcon,\n },\n danger: {\n container: \"border-0 bg-error text-error-foreground\",\n icon: AlertCircleIcon,\n },\n success: {\n container: \"border-0 bg-success text-success-foreground\",\n icon: CheckCircleIcon,\n },\n};\n\n// ---------------------------------------------------------------------------\n// Component\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>{title}</AlertTitle>}\n {children && (\n <AlertDescription className=\"text-current/80\">\n {children}\n </AlertDescription>\n )}\n </PrimitiveAlert>\n );\n }\n);\n\nCallout.displayName = \"Callout\";\n\nexport { Callout };\n"],"names":["__iconNode","InfoIcon","AlertTriangleIcon","AlertCircleIcon","CheckCircleIcon","_jsxs","PrimitiveAlert","_jsx"],"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;;ACsBvE;AACA;AACA;AAEA,MAAM,cAAc,GAMhB;AACF,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,uCAAuC;AAClD,QAAA,IAAI,EAAEC,IAAQ;AACf,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,SAAS,EAAE,6CAA6C;AACxD,QAAA,IAAI,EAAEC,aAAiB;AACxB,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,SAAS,EAAE,yCAAyC;AACpD,QAAA,IAAI,EAAEC,WAAe;AACtB,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,SAAS,EAAE,6CAA6C;AACxD,QAAA,IAAI,EAAEC,cAAe;AACtB,KAAA;CACF;AAED;AACA;AACA;AAEA,MAAM,OAAO,GAAG,UAAU,CACxB,CACE,EAAE,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,EACrE,GAAG,KACD;AACF,IAAA,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC;AACtC,IAAA,MAAM,YAAY,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI;IAExC,QACEC,KAACC,KAAc,EAAA,EACb,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,KACtC,UAAU,EAAA,QAAA,EAAA,CAEb,UAAU,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAC3C,KAAK,IAAIC,GAAA,CAAC,UAAU,cAAE,KAAK,EAAA,CAAc,EACzC,QAAQ,KACPA,IAAC,gBAAgB,EAAA,EAAC,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAC1C,QAAQ,EAAA,CACQ,CACpB,CAAA,EAAA,CACc;AAErB,CAAC;AAGH,OAAO,CAAC,WAAW,GAAG,SAAS;;;;","x_google_ignoreList":[0,1]}
@@ -1,6 +1,8 @@
1
- export { C as ColorPicker } from '../ColorPicker-BPvxDGDM.js';
1
+ export { C as ColorPicker } from '../ColorPicker-D-7QGnf9.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
4
+ import 'react-i18next';
5
+ import 'react-colorful';
4
6
  import '../primitives/Button.js';
5
7
  import '../button-COIbN8dg.js';
6
8
  import '../index-D7Zy7P05.js';
@@ -1 +1 @@
1
- {"version":3,"file":"ColorPicker.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ColorPicker.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -3,5 +3,5 @@ interface EmptyStateProps {
3
3
  colSpan: number;
4
4
  message?: string | React.ReactNode;
5
5
  }
6
- export declare const EmptyState: ({ colSpan, message, }: EmptyStateProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const EmptyState: ({ colSpan, message }: EmptyStateProps) => import("react/jsx-runtime").JSX.Element;
7
7
  export {};
@@ -1,8 +1,9 @@
1
- export { D as DataTable, u as useColumnOrdering, a as useColumnPinning, b as useColumnVisibility, c as useTablePagination, d as useTableSelection, e as useTableSort } from '../DataTable-BKe9K5XP.js';
1
+ export { D as DataTable, u as useColumnOrdering, a as useColumnPinning, b as useColumnVisibility, c as useTablePagination, d as useTableSelection, e as useTableSort } from '../DataTable-DWR9gX9d.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
4
4
  import '../primitives/Table.js';
5
5
  import '../utils-DdHUxIdC.js';
6
+ import 'react-i18next';
6
7
  import '../primitives/Checkbox.js';
7
8
  import '../check-Cpkv29p1.js';
8
9
  import '../createLucideIcon-C8ycilSN.js';
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"DataTable.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -6,7 +6,8 @@ import '../button-COIbN8dg.js';
6
6
  import '../index-D7Zy7P05.js';
7
7
  import '../index-CfriMyrd.js';
8
8
  import '../index-BtkPdosV.js';
9
- import '../dialog-Civ9r6wD.js';
9
+ import '../dialog-CrB6N_2a.js';
10
+ import 'react-i18next';
10
11
  import '../x-_o2T3n6D.js';
11
12
  import '../createLucideIcon-C8ycilSN.js';
12
13
  import '../index-9HvIbmnI.js';
@@ -38,7 +39,7 @@ const DialogBody = forwardRef(({ children, className, dataTestid, ...otherProps
38
39
  DialogBody.displayName = "Dialog.Body";
39
40
  const DialogFooter = forwardRef(({ children, className, dataTestid, ...otherProps }, ref) => (jsx(DialogFooter$1, { ref: ref, className: cn(className), "data-testid": dataTestid ?? "dialog-footer", ...otherProps, children: children })));
40
41
  DialogFooter.displayName = "Dialog.Footer";
41
- const DialogTitle = forwardRef(({ children, className, ...otherProps }, ref) => (jsx(DialogTitle$1, { ref: ref, className: cn(className), ...otherProps, children: children })));
42
+ const DialogTitle = forwardRef(({ children, className, ...otherProps }, ref) => (jsx(DialogTitle$1, { ref: ref, className: cn("text-2xl font-semibold", className), ...otherProps, children: children })));
42
43
  DialogTitle.displayName = "Dialog.Title";
43
44
  // ---------------------------------------------------------------------------
44
45
  // Component
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","sources":["../../src/components/Dialog.tsx"],"sourcesContent":["import React, { forwardRef, type ReactNode, type RefObject } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Dialog as PrimitiveDialog,\n DialogContent as PrimitiveDialogContent,\n DialogDescription,\n DialogFooter as PrimitiveDialogFooter,\n DialogHeader as PrimitiveDialogHeader,\n DialogTitle as PrimitiveDialogTitle,\n} from \"src/primitives/Dialog\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype DialogSize = \"small\" | \"medium\" | \"large\" | \"fullScreen\";\n\n/** Radix Dialog.Content props we forward via ...otherProps. */\ntype DialogContentProps = React.ComponentProps<typeof PrimitiveDialogContent>;\n\nexport interface DialogProps extends Omit<\n DialogContentProps,\n | \"children\"\n | \"className\"\n | \"showCloseButton\"\n | \"onEscapeKeyDown\"\n | \"onInteractOutside\"\n> {\n /** Size of the dialog. */\n size?: DialogSize;\n /** Whether the dialog is open. */\n isOpen?: boolean;\n /** Callback invoked when the dialog is closed. */\n onClose?: () => void;\n /** Content rendered inside the dialog. */\n children?: ReactNode;\n /** Additional CSS class names applied to the dialog content. */\n className?: string;\n /** Close on pressing the Esc key. */\n closeOnEsc?: boolean;\n /** Show the close button. */\n closeButton?: boolean;\n /** Additional CSS class names applied to the backdrop/overlay. */\n backdropClassName?: string;\n /** Close on clicking outside the dialog. */\n closeOnOutsideClick?: boolean;\n /** Ref of the element to receive focus when the dialog opens. */\n initialFocusRef?: RefObject<HTMLElement | null>;\n /** Ref of the element to receive focus when the dialog closes. */\n finalFocusRef?: RefObject<HTMLElement | null>;\n /** Whether to block body scroll when the dialog is mounted. Maps to Radix `modal` prop. */\n blockScrollOnMount?: boolean;\n /** Force children to re-render even when the dialog is closed. */\n forceRender?: boolean;\n /** Radix Dialog `modal` prop — takes precedence over blockScrollOnMount. */\n modal?: boolean;\n /** Radix Dialog `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Size mapping\n// ---------------------------------------------------------------------------\n\nconst SIZE_CLASS_MAP: Record<DialogSize, string> = {\n small: \"sm:max-w-sm\",\n medium: \"sm:max-w-md\",\n large: \"sm:max-w-lg\",\n fullScreen: \"h-screen w-screen max-w-none rounded-none sm:max-w-none\",\n};\n\n// ---------------------------------------------------------------------------\n// Subcomponents\n// ---------------------------------------------------------------------------\n\ninterface DialogSubcomponentProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n /** Custom data-testid attribute. */\n dataTestid?: string;\n}\n\nconst DialogHeader = forwardRef<\n HTMLDivElement,\n DialogSubcomponentProps & { description?: string }\n>(({ children, className, description, dataTestid, ...otherProps }, ref) => (\n <PrimitiveDialogHeader\n ref={ref}\n className={cn(className)}\n data-testid={dataTestid ?? \"dialog-header\"}\n {...otherProps}\n >\n {children}\n {description && <DialogDescription>{description}</DialogDescription>}\n </PrimitiveDialogHeader>\n));\nDialogHeader.displayName = \"Dialog.Header\";\n\nconst DialogBody = forwardRef<HTMLDivElement, DialogSubcomponentProps>(\n ({ children, className, dataTestid, ...otherProps }, ref) => (\n <div\n ref={ref}\n data-slot=\"dialog-body\"\n data-testid={dataTestid ?? \"dialog-body\"}\n className={cn(\"text-sm text-foreground\", className)}\n {...otherProps}\n >\n {children}\n </div>\n )\n);\nDialogBody.displayName = \"Dialog.Body\";\n\nconst DialogFooter = forwardRef<HTMLDivElement, DialogSubcomponentProps>(\n ({ children, className, dataTestid, ...otherProps }, ref) => (\n <PrimitiveDialogFooter\n ref={ref}\n className={cn(className)}\n data-testid={dataTestid ?? \"dialog-footer\"}\n {...otherProps}\n >\n {children}\n </PrimitiveDialogFooter>\n )\n);\nDialogFooter.displayName = \"Dialog.Footer\";\n\nconst DialogTitle = forwardRef<\n HTMLHeadingElement,\n React.ComponentProps<typeof PrimitiveDialogTitle>\n>(({ children, className, ...otherProps }, ref) => (\n <PrimitiveDialogTitle ref={ref} className={cn(className)} {...otherProps}>\n {children}\n </PrimitiveDialogTitle>\n));\nDialogTitle.displayName = \"Dialog.Title\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Dialog = forwardRef<HTMLDivElement, DialogProps>(\n (\n {\n size = \"medium\",\n isOpen = false,\n onClose = () => {},\n children,\n className,\n closeOnEsc = true,\n closeButton = true,\n backdropClassName,\n closeOnOutsideClick = true,\n initialFocusRef,\n finalFocusRef,\n blockScrollOnMount = true,\n forceRender = false,\n modal: modalProp,\n defaultOpen,\n // Radix content handlers — intercept and merge\n onOpenAutoFocus: onOpenAutoFocusProp,\n onCloseAutoFocus: onCloseAutoFocusProp,\n ...otherContentProps\n },\n ref\n ) => {\n const handleOpenChange = (open: boolean) => {\n if (!open) onClose();\n };\n\n const handleInteractOutside = (e: Event) => {\n if (!closeOnOutsideClick) e.preventDefault();\n };\n\n const handleEscapeKeyDown = (e: KeyboardEvent) => {\n if (!closeOnEsc) e.preventDefault();\n };\n\n const handleOpenAutoFocus = (e: Event) => {\n if (initialFocusRef?.current) {\n e.preventDefault();\n initialFocusRef.current.focus();\n }\n onOpenAutoFocusProp?.(e);\n };\n\n const handleCloseAutoFocus = (e: Event) => {\n if (finalFocusRef?.current) {\n e.preventDefault();\n finalFocusRef.current.focus();\n }\n onCloseAutoFocusProp?.(e);\n };\n\n // `modal` prop takes precedence; fall back to blockScrollOnMount\n const resolvedModal = modalProp ?? blockScrollOnMount;\n\n return (\n <PrimitiveDialog\n open={isOpen}\n onOpenChange={handleOpenChange}\n modal={resolvedModal}\n defaultOpen={defaultOpen}\n >\n <PrimitiveDialogContent\n ref={ref}\n aria-modal\n showCloseButton={closeButton}\n forceMount={forceRender || undefined}\n overlayClassName={backdropClassName}\n onInteractOutside={handleInteractOutside}\n onEscapeKeyDown={handleEscapeKeyDown}\n onOpenAutoFocus={handleOpenAutoFocus}\n onCloseAutoFocus={handleCloseAutoFocus}\n className={cn(SIZE_CLASS_MAP[size], className)}\n data-testid=\"dialog-wrapper\"\n {...otherContentProps}\n >\n {children}\n </PrimitiveDialogContent>\n </PrimitiveDialog>\n );\n }\n) as React.ForwardRefExoticComponent<\n DialogProps & React.RefAttributes<HTMLDivElement>\n> & {\n Header: typeof DialogHeader;\n Body: typeof DialogBody;\n Footer: typeof DialogFooter;\n Title: typeof DialogTitle;\n};\n\nDialog.displayName = \"Dialog\";\nDialog.Header = DialogHeader;\nDialog.Body = DialogBody;\nDialog.Footer = DialogFooter;\nDialog.Title = DialogTitle;\n\nexport { Dialog };\n"],"names":["_jsxs","PrimitiveDialogHeader","_jsx","PrimitiveDialogFooter","PrimitiveDialogTitle","PrimitiveDialog","PrimitiveDialogContent"],"mappings":"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"}
1
+ {"version":3,"file":"Dialog.js","sources":["../../src/components/Dialog.tsx"],"sourcesContent":["import React, { forwardRef, type ReactNode, type RefObject } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Dialog as PrimitiveDialog,\n DialogContent as PrimitiveDialogContent,\n DialogDescription,\n DialogFooter as PrimitiveDialogFooter,\n DialogHeader as PrimitiveDialogHeader,\n DialogTitle as PrimitiveDialogTitle,\n} from \"src/primitives/Dialog\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype DialogSize = \"small\" | \"medium\" | \"large\" | \"fullScreen\";\n\n/** Radix Dialog.Content props we forward via ...otherProps. */\ntype DialogContentProps = React.ComponentProps<typeof PrimitiveDialogContent>;\n\nexport interface DialogProps extends Omit<\n DialogContentProps,\n | \"children\"\n | \"className\"\n | \"showCloseButton\"\n | \"onEscapeKeyDown\"\n | \"onInteractOutside\"\n> {\n /** Size of the dialog. */\n size?: DialogSize;\n /** Whether the dialog is open. */\n isOpen?: boolean;\n /** Callback invoked when the dialog is closed. */\n onClose?: () => void;\n /** Content rendered inside the dialog. */\n children?: ReactNode;\n /** Additional CSS class names applied to the dialog content. */\n className?: string;\n /** Close on pressing the Esc key. */\n closeOnEsc?: boolean;\n /** Show the close button. */\n closeButton?: boolean;\n /** Additional CSS class names applied to the backdrop/overlay. */\n backdropClassName?: string;\n /** Close on clicking outside the dialog. */\n closeOnOutsideClick?: boolean;\n /** Ref of the element to receive focus when the dialog opens. */\n initialFocusRef?: RefObject<HTMLElement | null>;\n /** Ref of the element to receive focus when the dialog closes. */\n finalFocusRef?: RefObject<HTMLElement | null>;\n /** Whether to block body scroll when the dialog is mounted. Maps to Radix `modal` prop. */\n blockScrollOnMount?: boolean;\n /** Force children to re-render even when the dialog is closed. */\n forceRender?: boolean;\n /** Radix Dialog `modal` prop — takes precedence over blockScrollOnMount. */\n modal?: boolean;\n /** Radix Dialog `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Size mapping\n// ---------------------------------------------------------------------------\n\nconst SIZE_CLASS_MAP: Record<DialogSize, string> = {\n small: \"sm:max-w-sm\",\n medium: \"sm:max-w-md\",\n large: \"sm:max-w-lg\",\n fullScreen: \"h-screen w-screen max-w-none rounded-none sm:max-w-none\",\n};\n\n// ---------------------------------------------------------------------------\n// Subcomponents\n// ---------------------------------------------------------------------------\n\ninterface DialogSubcomponentProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n /** Custom data-testid attribute. */\n dataTestid?: string;\n}\n\nconst DialogHeader = forwardRef<\n HTMLDivElement,\n DialogSubcomponentProps & { description?: string }\n>(({ children, className, description, dataTestid, ...otherProps }, ref) => (\n <PrimitiveDialogHeader\n ref={ref}\n className={cn(className)}\n data-testid={dataTestid ?? \"dialog-header\"}\n {...otherProps}\n >\n {children}\n {description && <DialogDescription>{description}</DialogDescription>}\n </PrimitiveDialogHeader>\n));\nDialogHeader.displayName = \"Dialog.Header\";\n\nconst DialogBody = forwardRef<HTMLDivElement, DialogSubcomponentProps>(\n ({ children, className, dataTestid, ...otherProps }, ref) => (\n <div\n ref={ref}\n data-slot=\"dialog-body\"\n data-testid={dataTestid ?? \"dialog-body\"}\n className={cn(\"text-sm text-foreground\", className)}\n {...otherProps}\n >\n {children}\n </div>\n )\n);\nDialogBody.displayName = \"Dialog.Body\";\n\nconst DialogFooter = forwardRef<HTMLDivElement, DialogSubcomponentProps>(\n ({ children, className, dataTestid, ...otherProps }, ref) => (\n <PrimitiveDialogFooter\n ref={ref}\n className={cn(className)}\n data-testid={dataTestid ?? \"dialog-footer\"}\n {...otherProps}\n >\n {children}\n </PrimitiveDialogFooter>\n )\n);\nDialogFooter.displayName = \"Dialog.Footer\";\n\nconst DialogTitle = forwardRef<\n HTMLHeadingElement,\n React.ComponentProps<typeof PrimitiveDialogTitle>\n>(({ children, className, ...otherProps }, ref) => (\n <PrimitiveDialogTitle\n ref={ref}\n className={cn(\"text-2xl font-semibold\", className)}\n {...otherProps}\n >\n {children}\n </PrimitiveDialogTitle>\n));\nDialogTitle.displayName = \"Dialog.Title\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Dialog = forwardRef<HTMLDivElement, DialogProps>(\n (\n {\n size = \"medium\",\n isOpen = false,\n onClose = () => {},\n children,\n className,\n closeOnEsc = true,\n closeButton = true,\n backdropClassName,\n closeOnOutsideClick = true,\n initialFocusRef,\n finalFocusRef,\n blockScrollOnMount = true,\n forceRender = false,\n modal: modalProp,\n defaultOpen,\n // Radix content handlers — intercept and merge\n onOpenAutoFocus: onOpenAutoFocusProp,\n onCloseAutoFocus: onCloseAutoFocusProp,\n ...otherContentProps\n },\n ref\n ) => {\n const handleOpenChange = (open: boolean) => {\n if (!open) onClose();\n };\n\n const handleInteractOutside = (e: Event) => {\n if (!closeOnOutsideClick) e.preventDefault();\n };\n\n const handleEscapeKeyDown = (e: KeyboardEvent) => {\n if (!closeOnEsc) e.preventDefault();\n };\n\n const handleOpenAutoFocus = (e: Event) => {\n if (initialFocusRef?.current) {\n e.preventDefault();\n initialFocusRef.current.focus();\n }\n onOpenAutoFocusProp?.(e);\n };\n\n const handleCloseAutoFocus = (e: Event) => {\n if (finalFocusRef?.current) {\n e.preventDefault();\n finalFocusRef.current.focus();\n }\n onCloseAutoFocusProp?.(e);\n };\n\n // `modal` prop takes precedence; fall back to blockScrollOnMount\n const resolvedModal = modalProp ?? blockScrollOnMount;\n\n return (\n <PrimitiveDialog\n open={isOpen}\n onOpenChange={handleOpenChange}\n modal={resolvedModal}\n defaultOpen={defaultOpen}\n >\n <PrimitiveDialogContent\n ref={ref}\n aria-modal\n showCloseButton={closeButton}\n forceMount={forceRender || undefined}\n overlayClassName={backdropClassName}\n onInteractOutside={handleInteractOutside}\n onEscapeKeyDown={handleEscapeKeyDown}\n onOpenAutoFocus={handleOpenAutoFocus}\n onCloseAutoFocus={handleCloseAutoFocus}\n className={cn(SIZE_CLASS_MAP[size], className)}\n data-testid=\"dialog-wrapper\"\n {...otherContentProps}\n >\n {children}\n </PrimitiveDialogContent>\n </PrimitiveDialog>\n );\n }\n) as React.ForwardRefExoticComponent<\n DialogProps & React.RefAttributes<HTMLDivElement>\n> & {\n Header: typeof DialogHeader;\n Body: typeof DialogBody;\n Footer: typeof DialogFooter;\n Title: typeof DialogTitle;\n};\n\nDialog.displayName = \"Dialog\";\nDialog.Header = DialogHeader;\nDialog.Body = DialogBody;\nDialog.Footer = DialogFooter;\nDialog.Title = DialogTitle;\n\nexport { Dialog };\n"],"names":["_jsxs","PrimitiveDialogHeader","_jsx","PrimitiveDialogFooter","PrimitiveDialogTitle","PrimitiveDialog","PrimitiveDialogContent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA;AACA;AACA;AAEA,MAAM,cAAc,GAA+B;AACjD,IAAA,KAAK,EAAE,aAAa;AACpB,IAAA,MAAM,EAAE,aAAa;AACrB,IAAA,KAAK,EAAE,aAAa;AACpB,IAAA,UAAU,EAAE,yDAAyD;CACtE;AAaD,MAAM,YAAY,GAAG,UAAU,CAG7B,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,MACrEA,IAAA,CAACC,cAAqB,EAAA,EACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAA,aAAA,EACX,UAAU,IAAI,eAAe,EAAA,GACtC,UAAU,aAEb,QAAQ,EACR,WAAW,IAAIC,GAAA,CAAC,iBAAiB,EAAA,EAAA,QAAA,EAAE,WAAW,EAAA,CAAqB,CAAA,EAAA,CAC9C,CACzB,CAAC;AACF,YAAY,CAAC,WAAW,GAAG,eAAe;AAE1C,MAAM,UAAU,GAAG,UAAU,CAC3B,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,MACtDA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EAAA,WAAA,EACE,aAAa,EAAA,aAAA,EACV,UAAU,IAAI,aAAa,EACxC,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,EAAA,GAC/C,UAAU,YAEb,QAAQ,EAAA,CACL,CACP,CACF;AACD,UAAU,CAAC,WAAW,GAAG,aAAa;AAEtC,MAAM,YAAY,GAAG,UAAU,CAC7B,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,MACtDA,GAAA,CAACC,cAAqB,EAAA,EACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,iBACX,UAAU,IAAI,eAAe,EAAA,GACtC,UAAU,YAEb,QAAQ,EAAA,CACa,CACzB,CACF;AACD,YAAY,CAAC,WAAW,GAAG,eAAe;AAE1C,MAAM,WAAW,GAAG,UAAU,CAG5B,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,MAC5CD,GAAA,CAACE,aAAoB,EAAA,EACnB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,SAAS,CAAC,KAC9C,UAAU,EAAA,QAAA,EAEb,QAAQ,EAAA,CACY,CACxB,CAAC;AACF,WAAW,CAAC,WAAW,GAAG,cAAc;AAExC;AACA;AACA;AAEA,MAAM,MAAM,GAAG,UAAU,CACvB,CACE,EACE,IAAI,GAAG,QAAQ,EACf,MAAM,GAAG,KAAK,EACd,OAAO,GAAG,MAAK,EAAE,CAAC,EAClB,QAAQ,EACR,SAAS,EACT,UAAU,GAAG,IAAI,EACjB,WAAW,GAAG,IAAI,EAClB,iBAAiB,EACjB,mBAAmB,GAAG,IAAI,EAC1B,eAAe,EACf,aAAa,EACb,kBAAkB,GAAG,IAAI,EACzB,WAAW,GAAG,KAAK,EACnB,KAAK,EAAE,SAAS,EAChB,WAAW;AACX;AACA,eAAe,EAAE,mBAAmB,EACpC,gBAAgB,EAAE,oBAAoB,EACtC,GAAG,iBAAiB,EACrB,EACD,GAAG,KACD;AACF,IAAA,MAAM,gBAAgB,GAAG,CAAC,IAAa,KAAI;AACzC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;AACtB,IAAA,CAAC;AAED,IAAA,MAAM,qBAAqB,GAAG,CAAC,CAAQ,KAAI;AACzC,QAAA,IAAI,CAAC,mBAAmB;YAAE,CAAC,CAAC,cAAc,EAAE;AAC9C,IAAA,CAAC;AAED,IAAA,MAAM,mBAAmB,GAAG,CAAC,CAAgB,KAAI;AAC/C,QAAA,IAAI,CAAC,UAAU;YAAE,CAAC,CAAC,cAAc,EAAE;AACrC,IAAA,CAAC;AAED,IAAA,MAAM,mBAAmB,GAAG,CAAC,CAAQ,KAAI;AACvC,QAAA,IAAI,eAAe,EAAE,OAAO,EAAE;YAC5B,CAAC,CAAC,cAAc,EAAE;AAClB,YAAA,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE;QACjC;AACA,QAAA,mBAAmB,GAAG,CAAC,CAAC;AAC1B,IAAA,CAAC;AAED,IAAA,MAAM,oBAAoB,GAAG,CAAC,CAAQ,KAAI;AACxC,QAAA,IAAI,aAAa,EAAE,OAAO,EAAE;YAC1B,CAAC,CAAC,cAAc,EAAE;AAClB,YAAA,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE;QAC/B;AACA,QAAA,oBAAoB,GAAG,CAAC,CAAC;AAC3B,IAAA,CAAC;;AAGD,IAAA,MAAM,aAAa,GAAG,SAAS,IAAI,kBAAkB;AAErD,IAAA,QACEF,GAAA,CAACG,QAAe,EAAA,EACd,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,gBAAgB,EAC9B,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,EAAA,QAAA,EAExBH,IAACI,aAAsB,EAAA,EACrB,GAAG,EAAE,GAAG,EAAA,YAAA,EAAA,IAAA,EAER,eAAe,EAAE,WAAW,EAC5B,UAAU,EAAE,WAAW,IAAI,SAAS,EACpC,gBAAgB,EAAE,iBAAiB,EACnC,iBAAiB,EAAE,qBAAqB,EACxC,eAAe,EAAE,mBAAmB,EACpC,eAAe,EAAE,mBAAmB,EACpC,gBAAgB,EAAE,oBAAoB,EACtC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,EAAA,aAAA,EAClC,gBAAgB,KACxB,iBAAiB,EAAA,QAAA,EAEpB,QAAQ,EAAA,CACc,EAAA,CACT;AAEtB,CAAC;AAUH,MAAM,CAAC,WAAW,GAAG,QAAQ;AAC7B,MAAM,CAAC,MAAM,GAAG,YAAY;AAC5B,MAAM,CAAC,IAAI,GAAG,UAAU;AACxB,MAAM,CAAC,MAAM,GAAG,YAAY;AAC5B,MAAM,CAAC,KAAK,GAAG,WAAW;;;;"}
@@ -1,6 +1,7 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { forwardRef, createContext, useState, useCallback, useContext, useMemo } from 'react';
3
3
  import { DropdownMenuTrigger, DropdownMenu as DropdownMenu$1, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuLabel, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent } from '../primitives/DropdownMenu.js';
4
+ import { useTranslation } from 'react-i18next';
4
5
  import { c as cn } from '../utils-DdHUxIdC.js';
5
6
  import { r as renderIcon } from '../renderIcon-tlvMyboj.js';
6
7
  import { Button } from '../primitives/Button.js';
@@ -89,9 +90,10 @@ const CHEVRON_SIZE_MAP = {
89
90
  };
90
91
 
91
92
  const SplitTrigger = forwardRef(({ label, icon, buttonStyle, buttonSize, buttonProps, disabled, isOpen, onClick, actionButtonRef, className, ...otherProps }, ref) => {
93
+ const { t } = useTranslation();
92
94
  const variant = BUTTON_STYLE_MAP[buttonStyle];
93
95
  const size = BUTTON_SIZE_MAP[buttonSize];
94
- return (jsxs(ButtonGroup, { ref: ref, className: cn("neeto-ui-action-dropdown", className), ...otherProps, children: [jsxs(Button, { ref: actionButtonRef, type: "button", variant: variant, size: size, disabled: disabled, onClick: onClick, "data-testid": "action-dropdown-btn", ...buttonProps, children: [icon && renderIcon(icon, "size-4"), label && jsx("span", { children: label })] }), jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: jsx(Button, { type: "button", variant: variant, size: size, disabled: disabled, "aria-label": "Open dropdown menu", className: "px-1.5", children: jsx(ChevronDown, { "aria-hidden": "true", className: cn(CHEVRON_SIZE_MAP[buttonSize], "shrink-0 transition-transform duration-200", isOpen && "rotate-180") }) }) })] }));
96
+ return (jsxs(ButtonGroup, { ref: ref, className: cn("neeto-ui-action-dropdown", className), ...otherProps, children: [jsxs(Button, { ref: actionButtonRef, type: "button", variant: variant, size: size, disabled: disabled, onClick: onClick, "data-testid": "action-dropdown-btn", ...buttonProps, children: [icon && renderIcon(icon, "size-4"), label && jsx("span", { children: label })] }), jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: jsx(Button, { type: "button", variant: variant, size: size, disabled: disabled, "aria-label": t("neetoatoms.dropdownMenu.openMenu", "Open dropdown menu"), className: "px-1.5", children: jsx(ChevronDown, { "aria-hidden": "true", className: cn(CHEVRON_SIZE_MAP[buttonSize], "shrink-0 transition-transform duration-200", isOpen && "rotate-180") }) }) })] }));
95
97
  });
96
98
  SplitTrigger.displayName = "Dropdown.SplitTrigger";
97
99