@humain/ui 2.2.4 → 2.2.5

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 (87) hide show
  1. package/dist/index11.js +4 -4
  2. package/dist/index11.js.map +1 -1
  3. package/dist/index110.js +4 -4
  4. package/dist/index110.js.map +1 -1
  5. package/dist/index134.js +4 -4
  6. package/dist/index134.js.map +1 -1
  7. package/dist/index135.js +2 -2
  8. package/dist/index135.js.map +1 -1
  9. package/dist/index151.js +3 -3
  10. package/dist/index151.js.map +1 -1
  11. package/dist/index152.js +1 -1
  12. package/dist/index152.js.map +1 -1
  13. package/dist/index155.js +1 -1
  14. package/dist/index155.js.map +1 -1
  15. package/dist/index188.js +4 -4
  16. package/dist/index188.js.map +1 -1
  17. package/dist/index201.js +1 -1
  18. package/dist/index201.js.map +1 -1
  19. package/dist/index228.js +1 -1
  20. package/dist/index228.js.map +1 -1
  21. package/dist/index24.js +1 -1
  22. package/dist/index24.js.map +1 -1
  23. package/dist/index25.js +4 -4
  24. package/dist/index25.js.map +1 -1
  25. package/dist/index39.js +2 -2
  26. package/dist/index39.js.map +1 -1
  27. package/dist/index5.js +8 -8
  28. package/dist/index5.js.map +1 -1
  29. package/dist/styles.css +1 -1
  30. package/dist/wc/AIScrollButton.js +8 -8
  31. package/dist/wc/AIScrollButton.js.map +1 -1
  32. package/dist/wc/Badge.js +9 -9
  33. package/dist/wc/Badge.js.map +1 -1
  34. package/dist/wc/Checkbox.js +22 -22
  35. package/dist/wc/Checkbox.js.map +1 -1
  36. package/dist/wc/Pagination.js +4 -4
  37. package/dist/wc/Pagination.js.map +1 -1
  38. package/dist/wc/Switch.js +23 -23
  39. package/dist/wc/Switch.js.map +1 -1
  40. package/dist/wc/Tabs.js +110 -110
  41. package/dist/wc/Tabs.js.map +1 -1
  42. package/dist/wc/Tooltip.js +28 -28
  43. package/dist/wc/Tooltip.js.map +1 -1
  44. package/dist/wc/button.js +33 -33
  45. package/dist/wc/button.js.map +1 -1
  46. package/dist/wc/hf-alert.js +10 -10
  47. package/dist/wc/hf-alert.js.map +1 -1
  48. package/dist/wc/hf-nav-account-menu.js +8 -8
  49. package/dist/wc/hf-nav-account-menu.js.map +1 -1
  50. package/dist/wc/hf-steps.js +8 -8
  51. package/dist/wc/hf-steps.js.map +1 -1
  52. package/dist/wc/markdown-renderer.js +4 -4
  53. package/dist/wc/markdown-renderer.js.map +1 -1
  54. package/dist/wc/selection-group.js +6 -6
  55. package/dist/wc/selection-group.js.map +1 -1
  56. package/dist/wc-react/AIScrollButton.js +18 -18
  57. package/dist/wc-react/AIScrollButton.js.map +1 -1
  58. package/dist/wc-react/Badge.js +16 -16
  59. package/dist/wc-react/Badge.js.map +1 -1
  60. package/dist/wc-react/Checkbox.js +14 -14
  61. package/dist/wc-react/Checkbox.js.map +1 -1
  62. package/dist/wc-react/Pagination.js +130 -130
  63. package/dist/wc-react/Pagination.js.map +1 -1
  64. package/dist/wc-react/Switch.js +2 -2
  65. package/dist/wc-react/Switch.js.map +1 -1
  66. package/dist/wc-react/Tabs.js +38 -38
  67. package/dist/wc-react/Tabs.js.map +1 -1
  68. package/dist/wc-react/Tooltip.js +22 -22
  69. package/dist/wc-react/Tooltip.js.map +1 -1
  70. package/dist/wc-react/button.js +8 -8
  71. package/dist/wc-react/button.js.map +1 -1
  72. package/dist/wc-react/hf-alert.js +28 -28
  73. package/dist/wc-react/hf-alert.js.map +1 -1
  74. package/dist/wc-react/hf-nav-account-menu.js +7 -7
  75. package/dist/wc-react/hf-nav-account-menu.js.map +1 -1
  76. package/dist/wc-react/hf-steps.js +16 -16
  77. package/dist/wc-react/hf-steps.js.map +1 -1
  78. package/dist/wc-react/markdown-renderer.js +4 -4
  79. package/dist/wc-react/markdown-renderer.js.map +1 -1
  80. package/dist/wc-react/selection-group.js +1 -1
  81. package/dist/wc-react/selection-group.js.map +1 -1
  82. package/package.json +1 -1
  83. package/skills/humain-ui/SKILL.md +1 -1
  84. package/skills/humain-ui-wc/SKILL.md +1 -1
  85. package/skills/humain-ui-wc.skill +0 -0
  86. package/skills/humain-ui.skill +0 -0
  87. package/src/tokens.css +10 -2
@@ -1,10 +1,10 @@
1
1
  import { a as j } from "./rolldown-runtime.js";
2
2
  import { i as k, t as I } from "./vendor/react.js";
3
- import { n as y } from "./utils.js";
3
+ import { n as w } from "./utils.js";
4
4
  import { t as V } from "./arrow-down.js";
5
5
  import { t as _ } from "./dist.js";
6
6
  import { t as N } from "./button.js";
7
- import { t as w } from "./react.js";
7
+ import { t as y } from "./react.js";
8
8
  import { t as H } from "./AnimatePresence.js";
9
9
  var e = /* @__PURE__ */ j(k(), 1), d = I(), T = _("fixed flex items-center justify-center shadow-lg transition-all", {
10
10
  variants: {
@@ -107,7 +107,7 @@ function D({ scrollRef: c, containerRef: n, threshold: m = 50, onClick: o, visib
107
107
  const a = l ?? t, s = () => {
108
108
  o ? o() : c?.current ? c.current.scrollIntoView({ behavior: "smooth" }) : n?.current && (n.current.scrollTop = n.current.scrollHeight);
109
109
  }, g = E(f);
110
- return /* @__PURE__ */ (0, d.jsx)(H, { children: a && /* @__PURE__ */ (0, d.jsxs)(w.div, {
110
+ return /* @__PURE__ */ (0, d.jsx)(H, { children: a && /* @__PURE__ */ (0, d.jsxs)(y.div, {
111
111
  "data-slot": "ai-scroll-button",
112
112
  initial: {
113
113
  opacity: 0,
@@ -133,7 +133,7 @@ function D({ scrollRef: c, containerRef: n, threshold: m = 50, onClick: o, visib
133
133
  1
134
134
  ]
135
135
  },
136
- className: y(T({
136
+ className: w(T({
137
137
  variant: b,
138
138
  size: f,
139
139
  position: p
@@ -145,8 +145,8 @@ function D({ scrollRef: c, containerRef: n, threshold: m = 50, onClick: o, visib
145
145
  onClick: s,
146
146
  className: "size-full rounded-full",
147
147
  "aria-label": h,
148
- children: /* @__PURE__ */ (0, d.jsx)(V, { className: y(g, b === "primary" ? "text-primary-foreground" : "text-muted-foreground") })
149
- }), i !== void 0 && i > 0 && /* @__PURE__ */ (0, d.jsx)(w.div, {
148
+ children: /* @__PURE__ */ (0, d.jsx)(V, { className: w(g, b === "primary" ? "text-primary-foreground" : "text-muted-foreground") })
149
+ }), i !== void 0 && i > 0 && /* @__PURE__ */ (0, d.jsx)(y.div, {
150
150
  initial: { scale: 0 },
151
151
  animate: { scale: 1 },
152
152
  transition: {
@@ -154,7 +154,7 @@ function D({ scrollRef: c, containerRef: n, threshold: m = 50, onClick: o, visib
154
154
  stiffness: 500,
155
155
  damping: 30
156
156
  },
157
- className: "absolute -top-1 -end-1 flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full bg-destructive text-primary-foreground text-xs font-medium motion-reduce:transition-none",
157
+ className: "absolute -top-1 -end-1 flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full bg-destructive text-destructive-foreground text-xs font-medium motion-reduce:transition-none",
158
158
  "aria-label": `${i > 99 ? "99+" : i} new messages`,
159
159
  children: i > 99 ? "99+" : i
160
160
  })]
@@ -163,7 +163,7 @@ function D({ scrollRef: c, containerRef: n, threshold: m = 50, onClick: o, visib
163
163
  D.displayName = "AIScrollButton";
164
164
  var L = e.forwardRef(({ className: c }, n) => /* @__PURE__ */ (0, d.jsx)("div", {
165
165
  ref: n,
166
- className: y("h-px w-full", c),
166
+ className: w("h-px w-full", c),
167
167
  "aria-hidden": !0
168
168
  }));
169
169
  L.displayName = "AIScrollAnchor";
@@ -1 +1 @@
1
- {"version":3,"file":"AIScrollButton.js","names":[],"sources":["../../src/components/organisms/ai/AIScrollButton/AIScrollButton.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { ArrowDown } from 'lucide-react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport * as React from 'react';\nimport { Button } from '@/components/atoms/buttons/Button';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst scrollButtonVariants = cva(\n 'fixed flex items-center justify-center shadow-lg transition-all',\n {\n variants: {\n variant: {\n default: 'bg-background hover:bg-muted border border-border',\n primary: 'bg-primary/10 hover:bg-primary/90 text-primary-foreground',\n ghost:\n 'bg-card/80 hover:bg-background supports-backdrop-filter:backdrop-blur-sm border border-border',\n },\n size: {\n sm: 'size-8 rounded-full',\n md: 'size-10 rounded-full',\n lg: 'size-12 rounded-xl',\n },\n position: {\n 'bottom-center':\n 'bottom-4 start-1/2 -translate-x-1/2 rtl:translate-x-1/2',\n 'bottom-right': 'bottom-4 end-4',\n 'bottom-left': 'bottom-4 start-4',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n position: 'bottom-center',\n },\n },\n);\n\n// =============================================================================\n// useScrollToBottom Hook\n// =============================================================================\n\nexport interface UseScrollToBottomOptions {\n /** Threshold in pixels from bottom to consider \"at bottom\" */\n threshold?: number;\n /** Scroll behavior */\n behavior?: ScrollBehavior;\n /** Enable auto-scroll mode: tracks whether auto-scroll should fire on content changes */\n autoScroll?: boolean;\n}\n\nexport interface UseScrollToBottomReturn {\n /** Whether the user is at the bottom of the container */\n isAtBottom: boolean;\n /** Scroll to bottom function */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n /** Ref to attach to the scrollable container */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Ref to attach to the scroll anchor element */\n anchorRef: React.RefObject<HTMLDivElement | null>;\n /** Whether auto-scroll should fire (only meaningful when autoScroll option is true) */\n shouldAutoScroll: boolean;\n /** Call when user scrolls manually to disable auto-scroll (re-enables when user scrolls back to bottom) */\n handleUserScroll: () => void;\n /** Trigger an auto-scroll if shouldAutoScroll is true (uses requestAnimationFrame) */\n triggerAutoScroll: () => void;\n}\n\nexport function useScrollToBottom({\n threshold = 50,\n behavior = 'smooth',\n autoScroll: autoScrollEnabled = false,\n}: UseScrollToBottomOptions = {}): UseScrollToBottomReturn {\n const containerRef = React.useRef<HTMLDivElement>(null);\n const anchorRef = React.useRef<HTMLDivElement>(null);\n const [isAtBottom, setIsAtBottom] = React.useState(true);\n const [shouldAutoScroll, setShouldAutoScroll] = React.useState(true);\n\n const scrollToBottom = React.useCallback(\n (overrideBehavior?: ScrollBehavior) => {\n const scrollBehavior = overrideBehavior ?? behavior;\n if (anchorRef.current) {\n anchorRef.current.scrollIntoView({ behavior: scrollBehavior });\n } else if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n },\n [behavior],\n );\n\n const checkIsAtBottom = React.useCallback(() => {\n const container = containerRef.current;\n if (!container) return true;\n const { scrollTop, scrollHeight, clientHeight } = container;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n return distanceFromBottom <= threshold;\n }, [threshold]);\n\n React.useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n const atBottom = checkIsAtBottom();\n setIsAtBottom((prev) => (prev === atBottom ? prev : atBottom));\n if (autoScrollEnabled && atBottom) {\n setShouldAutoScroll((prev) => prev || true);\n }\n };\n\n handleScroll();\n\n container.addEventListener('scroll', handleScroll, { passive: true });\n return () => container.removeEventListener('scroll', handleScroll);\n }, [checkIsAtBottom, autoScrollEnabled]);\n\n React.useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const OwnerResizeObserver =\n container.ownerDocument.defaultView?.ResizeObserver;\n if (!OwnerResizeObserver) return;\n\n const resizeObserver = new OwnerResizeObserver(() => {\n const atBottom = checkIsAtBottom();\n setIsAtBottom((prev) => (prev === atBottom ? prev : atBottom));\n });\n\n resizeObserver.observe(container);\n return () => resizeObserver.disconnect();\n }, [checkIsAtBottom]);\n\n const handleUserScroll = React.useCallback(() => {\n if (!checkIsAtBottom()) {\n setShouldAutoScroll(false);\n }\n }, [checkIsAtBottom]);\n\n const triggerAutoScroll = React.useCallback(() => {\n if (autoScrollEnabled && shouldAutoScroll) {\n const ownerWindow =\n anchorRef.current?.ownerDocument.defaultView ??\n containerRef.current?.ownerDocument.defaultView;\n ownerWindow?.requestAnimationFrame(() => {\n scrollToBottom('smooth');\n });\n }\n }, [autoScrollEnabled, shouldAutoScroll, scrollToBottom]);\n\n return {\n isAtBottom,\n scrollToBottom,\n containerRef,\n anchorRef,\n shouldAutoScroll,\n handleUserScroll,\n triggerAutoScroll,\n };\n}\n\n// =============================================================================\n// Main AIScrollButton Component\n// =============================================================================\n\nexport interface AIScrollButtonProps\n extends VariantProps<typeof scrollButtonVariants> {\n /** Target scroll element ref */\n scrollRef?: React.RefObject<HTMLElement | null>;\n /** Scrollable container ref */\n containerRef?: React.RefObject<HTMLElement | null>;\n /** Threshold in pixels from bottom to show button */\n threshold?: number;\n /** Click handler (defaults to scrolling to bottom) */\n onClick?: () => void;\n /** Whether to show the button (controlled) */\n visible?: boolean;\n /** Label for accessibility */\n label?: string;\n /** Show unread count badge */\n unreadCount?: number;\n /** Additional class name */\n className?: string;\n}\n\nfunction getIconSize(size: AIScrollButtonProps['size']): string {\n switch (size) {\n case 'sm':\n return 'size-4';\n case 'lg':\n return 'size-6';\n default:\n return 'size-5';\n }\n}\n\nfunction AIScrollButton({\n scrollRef,\n containerRef,\n threshold = 50,\n onClick,\n visible: controlledVisible,\n variant,\n size,\n position,\n label = 'Scroll to bottom',\n unreadCount,\n className,\n}: AIScrollButtonProps) {\n const [internalVisible, setInternalVisible] = React.useState(false);\n\n // Track scroll position if containerRef is provided and no controlled visibility\n React.useEffect(() => {\n if (controlledVisible !== undefined) return;\n\n const container = containerRef?.current;\n if (!container) return;\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = container;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n setInternalVisible(distanceFromBottom > threshold);\n };\n\n handleScroll();\n container.addEventListener('scroll', handleScroll, { passive: true });\n return () => container.removeEventListener('scroll', handleScroll);\n }, [containerRef, threshold, controlledVisible]);\n\n const isVisible = controlledVisible ?? internalVisible;\n\n const handleClick = () => {\n if (onClick) {\n onClick();\n } else if (scrollRef?.current) {\n scrollRef.current.scrollIntoView({ behavior: 'smooth' });\n } else if (containerRef?.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n };\n\n const iconSize = getIconSize(size);\n\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n data-slot=\"ai-scroll-button\"\n initial={{ opacity: 0, y: 20, scale: 0.9 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.9 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n className={cn(\n scrollButtonVariants({ variant, size, position }),\n 'motion-reduce:transition-none',\n className,\n )}\n >\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"icon\"\n onClick={handleClick}\n className=\"size-full rounded-full\"\n aria-label={label}\n >\n <ArrowDown\n className={cn(\n iconSize,\n variant === 'primary'\n ? 'text-primary-foreground'\n : 'text-muted-foreground',\n )}\n />\n </Button>\n\n {/* Unread count badge */}\n {unreadCount !== undefined && unreadCount > 0 && (\n <motion.div\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n transition={{ type: 'spring', stiffness: 500, damping: 30 }}\n className=\"absolute -top-1 -end-1 flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full bg-destructive text-primary-foreground text-xs font-medium motion-reduce:transition-none\"\n aria-label={`${unreadCount > 99 ? '99+' : unreadCount} new messages`}\n >\n {unreadCount > 99 ? '99+' : unreadCount}\n </motion.div>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nAIScrollButton.displayName = 'AIScrollButton';\n\n// =============================================================================\n// Scroll Anchor Component\n// =============================================================================\n\nexport interface AIScrollAnchorProps {\n /** Ref to expose for scrolling */\n ref?: React.Ref<HTMLDivElement>;\n /** Additional class name */\n className?: string;\n}\n\nconst AIScrollAnchor = React.forwardRef<HTMLDivElement, AIScrollAnchorProps>(\n ({ className }, ref) => {\n return (\n <div ref={ref} className={cn('h-px w-full', className)} aria-hidden />\n );\n },\n);\n\nAIScrollAnchor.displayName = 'AIScrollAnchor';\n\nexport { AIScrollAnchor, AIScrollButton, scrollButtonVariants };\n"],"mappings":"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"}
1
+ {"version":3,"file":"AIScrollButton.js","names":[],"sources":["../../src/components/organisms/ai/AIScrollButton/AIScrollButton.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { ArrowDown } from 'lucide-react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport * as React from 'react';\nimport { Button } from '@/components/atoms/buttons/Button';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst scrollButtonVariants = cva(\n 'fixed flex items-center justify-center shadow-lg transition-all',\n {\n variants: {\n variant: {\n default: 'bg-background hover:bg-muted border border-border',\n primary: 'bg-primary/10 hover:bg-primary/90 text-primary-foreground',\n ghost:\n 'bg-card/80 hover:bg-background supports-backdrop-filter:backdrop-blur-sm border border-border',\n },\n size: {\n sm: 'size-8 rounded-full',\n md: 'size-10 rounded-full',\n lg: 'size-12 rounded-xl',\n },\n position: {\n 'bottom-center':\n 'bottom-4 start-1/2 -translate-x-1/2 rtl:translate-x-1/2',\n 'bottom-right': 'bottom-4 end-4',\n 'bottom-left': 'bottom-4 start-4',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n position: 'bottom-center',\n },\n },\n);\n\n// =============================================================================\n// useScrollToBottom Hook\n// =============================================================================\n\nexport interface UseScrollToBottomOptions {\n /** Threshold in pixels from bottom to consider \"at bottom\" */\n threshold?: number;\n /** Scroll behavior */\n behavior?: ScrollBehavior;\n /** Enable auto-scroll mode: tracks whether auto-scroll should fire on content changes */\n autoScroll?: boolean;\n}\n\nexport interface UseScrollToBottomReturn {\n /** Whether the user is at the bottom of the container */\n isAtBottom: boolean;\n /** Scroll to bottom function */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n /** Ref to attach to the scrollable container */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Ref to attach to the scroll anchor element */\n anchorRef: React.RefObject<HTMLDivElement | null>;\n /** Whether auto-scroll should fire (only meaningful when autoScroll option is true) */\n shouldAutoScroll: boolean;\n /** Call when user scrolls manually to disable auto-scroll (re-enables when user scrolls back to bottom) */\n handleUserScroll: () => void;\n /** Trigger an auto-scroll if shouldAutoScroll is true (uses requestAnimationFrame) */\n triggerAutoScroll: () => void;\n}\n\nexport function useScrollToBottom({\n threshold = 50,\n behavior = 'smooth',\n autoScroll: autoScrollEnabled = false,\n}: UseScrollToBottomOptions = {}): UseScrollToBottomReturn {\n const containerRef = React.useRef<HTMLDivElement>(null);\n const anchorRef = React.useRef<HTMLDivElement>(null);\n const [isAtBottom, setIsAtBottom] = React.useState(true);\n const [shouldAutoScroll, setShouldAutoScroll] = React.useState(true);\n\n const scrollToBottom = React.useCallback(\n (overrideBehavior?: ScrollBehavior) => {\n const scrollBehavior = overrideBehavior ?? behavior;\n if (anchorRef.current) {\n anchorRef.current.scrollIntoView({ behavior: scrollBehavior });\n } else if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n },\n [behavior],\n );\n\n const checkIsAtBottom = React.useCallback(() => {\n const container = containerRef.current;\n if (!container) return true;\n const { scrollTop, scrollHeight, clientHeight } = container;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n return distanceFromBottom <= threshold;\n }, [threshold]);\n\n React.useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n const atBottom = checkIsAtBottom();\n setIsAtBottom((prev) => (prev === atBottom ? prev : atBottom));\n if (autoScrollEnabled && atBottom) {\n setShouldAutoScroll((prev) => prev || true);\n }\n };\n\n handleScroll();\n\n container.addEventListener('scroll', handleScroll, { passive: true });\n return () => container.removeEventListener('scroll', handleScroll);\n }, [checkIsAtBottom, autoScrollEnabled]);\n\n React.useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const OwnerResizeObserver =\n container.ownerDocument.defaultView?.ResizeObserver;\n if (!OwnerResizeObserver) return;\n\n const resizeObserver = new OwnerResizeObserver(() => {\n const atBottom = checkIsAtBottom();\n setIsAtBottom((prev) => (prev === atBottom ? prev : atBottom));\n });\n\n resizeObserver.observe(container);\n return () => resizeObserver.disconnect();\n }, [checkIsAtBottom]);\n\n const handleUserScroll = React.useCallback(() => {\n if (!checkIsAtBottom()) {\n setShouldAutoScroll(false);\n }\n }, [checkIsAtBottom]);\n\n const triggerAutoScroll = React.useCallback(() => {\n if (autoScrollEnabled && shouldAutoScroll) {\n const ownerWindow =\n anchorRef.current?.ownerDocument.defaultView ??\n containerRef.current?.ownerDocument.defaultView;\n ownerWindow?.requestAnimationFrame(() => {\n scrollToBottom('smooth');\n });\n }\n }, [autoScrollEnabled, shouldAutoScroll, scrollToBottom]);\n\n return {\n isAtBottom,\n scrollToBottom,\n containerRef,\n anchorRef,\n shouldAutoScroll,\n handleUserScroll,\n triggerAutoScroll,\n };\n}\n\n// =============================================================================\n// Main AIScrollButton Component\n// =============================================================================\n\nexport interface AIScrollButtonProps\n extends VariantProps<typeof scrollButtonVariants> {\n /** Target scroll element ref */\n scrollRef?: React.RefObject<HTMLElement | null>;\n /** Scrollable container ref */\n containerRef?: React.RefObject<HTMLElement | null>;\n /** Threshold in pixels from bottom to show button */\n threshold?: number;\n /** Click handler (defaults to scrolling to bottom) */\n onClick?: () => void;\n /** Whether to show the button (controlled) */\n visible?: boolean;\n /** Label for accessibility */\n label?: string;\n /** Show unread count badge */\n unreadCount?: number;\n /** Additional class name */\n className?: string;\n}\n\nfunction getIconSize(size: AIScrollButtonProps['size']): string {\n switch (size) {\n case 'sm':\n return 'size-4';\n case 'lg':\n return 'size-6';\n default:\n return 'size-5';\n }\n}\n\nfunction AIScrollButton({\n scrollRef,\n containerRef,\n threshold = 50,\n onClick,\n visible: controlledVisible,\n variant,\n size,\n position,\n label = 'Scroll to bottom',\n unreadCount,\n className,\n}: AIScrollButtonProps) {\n const [internalVisible, setInternalVisible] = React.useState(false);\n\n // Track scroll position if containerRef is provided and no controlled visibility\n React.useEffect(() => {\n if (controlledVisible !== undefined) return;\n\n const container = containerRef?.current;\n if (!container) return;\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = container;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n setInternalVisible(distanceFromBottom > threshold);\n };\n\n handleScroll();\n container.addEventListener('scroll', handleScroll, { passive: true });\n return () => container.removeEventListener('scroll', handleScroll);\n }, [containerRef, threshold, controlledVisible]);\n\n const isVisible = controlledVisible ?? internalVisible;\n\n const handleClick = () => {\n if (onClick) {\n onClick();\n } else if (scrollRef?.current) {\n scrollRef.current.scrollIntoView({ behavior: 'smooth' });\n } else if (containerRef?.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n };\n\n const iconSize = getIconSize(size);\n\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n data-slot=\"ai-scroll-button\"\n initial={{ opacity: 0, y: 20, scale: 0.9 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.9 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n className={cn(\n scrollButtonVariants({ variant, size, position }),\n 'motion-reduce:transition-none',\n className,\n )}\n >\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"icon\"\n onClick={handleClick}\n className=\"size-full rounded-full\"\n aria-label={label}\n >\n <ArrowDown\n className={cn(\n iconSize,\n variant === 'primary'\n ? 'text-primary-foreground'\n : 'text-muted-foreground',\n )}\n />\n </Button>\n\n {/* Unread count badge */}\n {unreadCount !== undefined && unreadCount > 0 && (\n <motion.div\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n transition={{ type: 'spring', stiffness: 500, damping: 30 }}\n className=\"absolute -top-1 -end-1 flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full bg-destructive text-destructive-foreground text-xs font-medium motion-reduce:transition-none\"\n aria-label={`${unreadCount > 99 ? '99+' : unreadCount} new messages`}\n >\n {unreadCount > 99 ? '99+' : unreadCount}\n </motion.div>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nAIScrollButton.displayName = 'AIScrollButton';\n\n// =============================================================================\n// Scroll Anchor Component\n// =============================================================================\n\nexport interface AIScrollAnchorProps {\n /** Ref to expose for scrolling */\n ref?: React.Ref<HTMLDivElement>;\n /** Additional class name */\n className?: string;\n}\n\nconst AIScrollAnchor = React.forwardRef<HTMLDivElement, AIScrollAnchorProps>(\n ({ className }, ref) => {\n return (\n <div ref={ref} className={cn('h-px w-full', className)} aria-hidden />\n );\n },\n);\n\nAIScrollAnchor.displayName = 'AIScrollAnchor';\n\nexport { AIScrollAnchor, AIScrollButton, scrollButtonVariants };\n"],"mappings":"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"}
package/dist/wc/Badge.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { a as h } from "./rolldown-runtime.js";
2
2
  import { i as N, t as w } from "./vendor/react.js";
3
- import { n as s } from "./utils.js";
3
+ import { n as a } from "./utils.js";
4
4
  import { t as k } from "./x.js";
5
5
  import { t as j } from "./dist.js";
6
6
  var z = /* @__PURE__ */ h(N(), 1), r = w(), _ = j("inline-flex items-center justify-center gap-1.5 font-medium transition-colors whitespace-nowrap shrink-0 [&>svg]:pointer-events-none [&>svg]:shrink-0", {
@@ -55,22 +55,22 @@ var z = /* @__PURE__ */ h(N(), 1), r = w(), _ = j("inline-flex items-center just
55
55
  {
56
56
  variant: "solid",
57
57
  color: "info",
58
- className: "bg-info text-primary-foreground hover:bg-info/90"
58
+ className: "bg-info text-info-foreground hover:bg-info/90"
59
59
  },
60
60
  {
61
61
  variant: "solid",
62
62
  color: "success",
63
- className: "bg-success text-primary-foreground hover:bg-success/90"
63
+ className: "bg-success text-success-foreground hover:bg-success/90"
64
64
  },
65
65
  {
66
66
  variant: "solid",
67
67
  color: "warning",
68
- className: "bg-warning text-primary-foreground hover:bg-warning/90"
68
+ className: "bg-warning text-warning-foreground hover:bg-warning/90"
69
69
  },
70
70
  {
71
71
  variant: "solid",
72
72
  color: "destructive",
73
- className: "bg-destructive text-primary-foreground hover:bg-destructive/90"
73
+ className: "bg-destructive text-destructive-foreground hover:bg-destructive/90"
74
74
  },
75
75
  {
76
76
  variant: "soft",
@@ -269,7 +269,7 @@ var z = /* @__PURE__ */ h(N(), 1), r = w(), _ = j("inline-flex items-center just
269
269
  size: "sm",
270
270
  shape: "round"
271
271
  }
272
- }), a = {
272
+ }), s = {
273
273
  primary: "bg-primary",
274
274
  secondary: "bg-muted-foreground",
275
275
  info: "bg-info",
@@ -280,14 +280,14 @@ var z = /* @__PURE__ */ h(N(), 1), r = w(), _ = j("inline-flex items-center just
280
280
  }, C = ({ color: e = "secondary" }) => /* @__PURE__ */ (0, r.jsxs)("span", {
281
281
  className: "relative flex size-2 shrink-0",
282
282
  "aria-hidden": "true",
283
- children: [/* @__PURE__ */ (0, r.jsx)("span", { className: s("absolute inline-flex size-full animate-ping rounded-full opacity-40 motion-reduce:animate-none", a[e] ?? a.secondary) }), /* @__PURE__ */ (0, r.jsx)("span", { className: s("relative inline-flex size-2 rounded-full", a[e] ?? a.secondary) })]
283
+ children: [/* @__PURE__ */ (0, r.jsx)("span", { className: a("absolute inline-flex size-full animate-ping rounded-full opacity-40 motion-reduce:animate-none", s[e] ?? s.secondary) }), /* @__PURE__ */ (0, r.jsx)("span", { className: a("relative inline-flex size-2 rounded-full", s[e] ?? s.secondary) })]
284
284
  }), B = (0, z.forwardRef)(({ children: e, leadingIcon: n, trailingIcon: i, avatar: t, iconOnly: d = !1, closable: c = !1, closeLabel: l = "Remove", onClose: u, className: v, variant: f = "soft", color: g = "secondary", size: p = "sm", shape: m = "round", ...b }, y) => {
285
- const o = f === "dot", x = s((t || n || o) && "ps-1.5", (i || c) && "pe-1", d && "px-1.5");
285
+ const o = f === "dot", x = a((t || n || o) && "ps-1.5", (i || c) && "pe-1", d && "px-1.5");
286
286
  return /* @__PURE__ */ (0, r.jsxs)("span", {
287
287
  ref: y,
288
288
  "data-slot": "badge",
289
289
  ...o && { role: "status" },
290
- className: s(_({
290
+ className: a(_({
291
291
  variant: f,
292
292
  color: g,
293
293
  size: p,
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.js","names":[],"sources":["../../src/components/atoms/display/Badge/Badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport { forwardRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center gap-1.5 font-medium transition-colors whitespace-nowrap shrink-0 [&>svg]:pointer-events-none [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n solid: '',\n soft: '',\n outline: 'border',\n white:\n 'bg-opacity-white-80 transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-current/50',\n dot: 'bg-transparent text-muted-foreground',\n },\n color: {\n primary: '',\n secondary: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n gray: '',\n cyan: '',\n teal: '',\n green: '',\n blue: '',\n indigo: '',\n purple: '',\n pink: '',\n orange: '',\n yellow: '',\n },\n size: {\n xs: 'h-[18px] px-1.5 py-0.5 text-[10px] [&>svg]:size-2.5',\n sm: 'h-5 px-2 py-0.5 text-xs [&>svg]:size-3',\n md: 'h-[22px] px-2.5 py-1 text-xs [&>svg]:size-3.5',\n lg: 'h-[26px] px-3 py-1.5 text-sm [&>svg]:size-4',\n },\n shape: {\n round: 'rounded-full',\n rounded: 'rounded-sm',\n },\n },\n compoundVariants: [\n // Solid variants\n {\n variant: 'solid',\n color: 'primary',\n className: 'bg-primary text-primary-foreground hover:bg-primary/90',\n },\n {\n variant: 'solid',\n color: 'secondary',\n className:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/90',\n },\n {\n variant: 'solid',\n color: 'info',\n className: 'bg-info text-primary-foreground hover:bg-info/90',\n },\n {\n variant: 'solid',\n color: 'success',\n className: 'bg-success text-primary-foreground hover:bg-success/90',\n },\n {\n variant: 'solid',\n color: 'warning',\n className: 'bg-warning text-primary-foreground hover:bg-warning/90',\n },\n {\n variant: 'solid',\n color: 'destructive',\n className:\n 'bg-destructive text-primary-foreground hover:bg-destructive/90',\n },\n\n // Soft variants\n {\n variant: 'soft',\n color: 'primary',\n className:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n },\n {\n variant: 'soft',\n color: 'secondary',\n className:\n 'bg-soft-secondary text-soft-secondary-foreground hover:bg-opacity-secondary-20 dark:bg-soft-secondary dark:text-soft-secondary-foreground',\n },\n {\n variant: 'soft',\n color: 'info',\n className:\n 'bg-soft-info text-soft-info-foreground hover:bg-opacity-info-20 dark:bg-soft-info dark:text-soft-info-foreground',\n },\n {\n variant: 'soft',\n color: 'success',\n className:\n 'bg-soft-success text-soft-success-foreground hover:bg-opacity-success-20 dark:bg-soft-success dark:text-soft-success-foreground',\n },\n {\n variant: 'soft',\n color: 'warning',\n className:\n 'bg-soft-warning text-soft-warning-foreground hover:bg-opacity-warning-20 dark:bg-soft-warning dark:text-soft-warning-foreground',\n },\n {\n variant: 'soft',\n color: 'destructive',\n className:\n 'bg-soft-destructive text-soft-destructive-foreground hover:bg-opacity-destructive-20 dark:bg-soft-destructive dark:text-soft-destructive-foreground',\n },\n {\n variant: 'soft',\n color: 'gray',\n className:\n 'bg-soft-gray text-soft-gray-foreground hover:bg-opacity-neutral-20 dark:bg-soft-gray dark:text-soft-gray-foreground',\n },\n {\n variant: 'soft',\n color: 'cyan',\n className:\n 'bg-soft-cyan text-soft-cyan-foreground hover:bg-opacity-info-20 dark:bg-soft-cyan dark:text-soft-cyan-foreground',\n },\n {\n variant: 'soft',\n color: 'teal',\n className:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n },\n {\n variant: 'soft',\n color: 'green',\n className:\n 'bg-soft-green text-soft-green-foreground hover:bg-opacity-success-20 dark:bg-soft-green dark:text-soft-green-foreground',\n },\n {\n variant: 'soft',\n color: 'blue',\n className:\n 'bg-soft-blue text-soft-blue-foreground hover:bg-opacity-info-20 dark:bg-soft-blue dark:text-soft-blue-foreground',\n },\n {\n variant: 'soft',\n color: 'indigo',\n className:\n 'bg-soft-indigo text-soft-indigo-foreground hover:bg-opacity-info-20 dark:bg-soft-indigo dark:text-soft-indigo-foreground',\n },\n {\n variant: 'soft',\n color: 'purple',\n className:\n 'bg-soft-purple text-soft-purple-foreground hover:bg-opacity-primary-20 dark:bg-soft-purple dark:text-soft-purple-foreground',\n },\n {\n variant: 'soft',\n color: 'pink',\n className:\n 'bg-soft-pink text-soft-pink-foreground hover:bg-opacity-destructive-20 dark:bg-soft-pink dark:text-soft-pink-foreground',\n },\n {\n variant: 'soft',\n color: 'orange',\n className:\n 'bg-soft-orange text-soft-orange-foreground hover:bg-opacity-warning-20 dark:bg-soft-orange dark:text-soft-orange-foreground',\n },\n {\n variant: 'soft',\n color: 'yellow',\n className:\n 'bg-soft-yellow text-soft-yellow-foreground hover:bg-opacity-warning-20 dark:bg-soft-yellow dark:text-soft-yellow-foreground',\n },\n\n // Outline variants\n {\n variant: 'outline',\n color: 'primary',\n className: 'border-primary text-primary hover:bg-primary/10',\n },\n {\n variant: 'outline',\n color: 'secondary',\n className:\n 'border-border text-secondary-foreground hover:bg-secondary/50',\n },\n {\n variant: 'outline',\n color: 'info',\n className: 'border-info text-info hover:bg-info/10',\n },\n {\n variant: 'outline',\n color: 'success',\n className: 'border-success text-success hover:bg-success/10',\n },\n {\n variant: 'outline',\n color: 'warning',\n className: 'border-warning text-warning hover:bg-warning/10',\n },\n {\n variant: 'outline',\n color: 'destructive',\n className:\n 'border-destructive text-destructive hover:bg-destructive/10',\n },\n\n // White variants\n {\n variant: 'white',\n color: 'primary',\n className: 'text-primary',\n },\n {\n variant: 'white',\n color: 'secondary',\n className: 'text-secondary-foreground',\n },\n {\n variant: 'white',\n color: 'info',\n className: 'text-info',\n },\n {\n variant: 'white',\n color: 'success',\n className: 'text-success',\n },\n {\n variant: 'white',\n color: 'warning',\n className: 'text-warning',\n },\n {\n variant: 'white',\n color: 'destructive',\n className: 'text-destructive',\n },\n {\n variant: 'white',\n color: 'gray',\n className: 'text-soft-gray-foreground',\n },\n {\n variant: 'white',\n color: 'cyan',\n className: 'text-soft-cyan-foreground',\n },\n {\n variant: 'white',\n color: 'teal',\n className: 'text-primary',\n },\n {\n variant: 'white',\n color: 'green',\n className: 'text-soft-green-foreground',\n },\n {\n variant: 'white',\n color: 'blue',\n className: 'text-soft-blue-foreground',\n },\n {\n variant: 'white',\n color: 'indigo',\n className: 'text-soft-indigo-foreground',\n },\n {\n variant: 'white',\n color: 'purple',\n className: 'text-soft-purple-foreground',\n },\n {\n variant: 'white',\n color: 'pink',\n className: 'text-soft-pink-foreground',\n },\n {\n variant: 'white',\n color: 'orange',\n className: 'text-soft-orange-foreground',\n },\n {\n variant: 'white',\n color: 'yellow',\n className: 'text-soft-yellow-foreground',\n },\n ],\n defaultVariants: {\n variant: 'soft',\n color: 'secondary',\n size: 'sm',\n shape: 'round',\n },\n },\n);\n\ntype BadgeColor = NonNullable<VariantProps<typeof badgeVariants>['color']>;\n\n// Dot color mapping for the dot variant\nconst dotColorClasses: Partial<Record<BadgeColor, string>> = {\n primary: 'bg-primary',\n secondary: 'bg-muted-foreground',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n cyan: 'bg-soft-cyan-foreground',\n};\n\nexport interface BadgeProps\n extends Omit<React.ComponentProps<'span'>, 'color'>,\n VariantProps<typeof badgeVariants> {\n /** Leading icon displayed before the text */\n leadingIcon?: React.ReactNode;\n /** Trailing icon displayed after the text */\n trailingIcon?: React.ReactNode;\n /** Avatar element to display before the text */\n avatar?: React.ReactNode;\n /** For icon-only badges - no text, just an icon */\n iconOnly?: boolean;\n /** Shows a close button and enables onClose callback */\n closable?: boolean;\n /** Accessible label for the close button */\n closeLabel?: string;\n /** Callback when close button is clicked */\n onClose?: () => void;\n}\n\n/**\n * Dot indicator for the dot variant\n */\nconst BadgeDot = ({ color = 'secondary' }: { color?: BadgeColor }) => (\n <span className=\"relative flex size-2 shrink-0\" aria-hidden=\"true\">\n <span\n className={cn(\n 'absolute inline-flex size-full animate-ping rounded-full opacity-40 motion-reduce:animate-none',\n dotColorClasses[color] ?? dotColorClasses.secondary,\n )}\n />\n <span\n className={cn(\n 'relative inline-flex size-2 rounded-full',\n dotColorClasses[color] ?? dotColorClasses.secondary,\n )}\n />\n </span>\n);\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n children,\n leadingIcon,\n trailingIcon,\n avatar,\n iconOnly = false,\n closable = false,\n closeLabel = 'Remove',\n onClose,\n className,\n variant = 'soft',\n color = 'secondary',\n size = 'sm',\n shape = 'round',\n ...props\n },\n ref,\n ) => {\n const isDot = variant === 'dot';\n\n // Adjust padding for different configurations\n const paddingClasses = cn(\n // Leading content - reduce left padding\n (avatar || leadingIcon || isDot) && 'ps-1.5',\n // Trailing content - reduce right padding\n (trailingIcon || closable) && 'pe-1',\n // Icon only - equal padding\n iconOnly && 'px-1.5',\n );\n\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n {...(isDot && { role: 'status' })}\n className={cn(\n badgeVariants({ variant, color, size, shape }),\n paddingClasses,\n className,\n )}\n {...props}\n >\n {isDot && <BadgeDot color={color ?? 'secondary'} />}\n\n {avatar && !isDot && (\n <span className=\"shrink-0 -ms-0.5 [&>*]:size-4 [&>*]:rounded-full\">\n {avatar}\n </span>\n )}\n\n {leadingIcon && !avatar && !isDot && leadingIcon}\n\n {children}\n\n {trailingIcon && !closable && trailingIcon}\n\n {closable && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"group/close relative shrink-0 rounded-full hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 -me-0.5 p-0.5 before:absolute before:-inset-3.5 before:content-['']\"\n aria-label={closeLabel}\n >\n <X className=\"size-3 transition-transform duration-150 ease-out group-hover/close:rotate-90 motion-reduce:transition-none\" />\n </button>\n )}\n </span>\n );\n },\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge, BadgeDot, badgeVariants };\n"],"mappings":"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"}
1
+ {"version":3,"file":"Badge.js","names":[],"sources":["../../src/components/atoms/display/Badge/Badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport { forwardRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center gap-1.5 font-medium transition-colors whitespace-nowrap shrink-0 [&>svg]:pointer-events-none [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n solid: '',\n soft: '',\n outline: 'border',\n white:\n 'bg-opacity-white-80 transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-current/50',\n dot: 'bg-transparent text-muted-foreground',\n },\n color: {\n primary: '',\n secondary: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n gray: '',\n cyan: '',\n teal: '',\n green: '',\n blue: '',\n indigo: '',\n purple: '',\n pink: '',\n orange: '',\n yellow: '',\n },\n size: {\n xs: 'h-[18px] px-1.5 py-0.5 text-[10px] [&>svg]:size-2.5',\n sm: 'h-5 px-2 py-0.5 text-xs [&>svg]:size-3',\n md: 'h-[22px] px-2.5 py-1 text-xs [&>svg]:size-3.5',\n lg: 'h-[26px] px-3 py-1.5 text-sm [&>svg]:size-4',\n },\n shape: {\n round: 'rounded-full',\n rounded: 'rounded-sm',\n },\n },\n compoundVariants: [\n // Solid variants\n {\n variant: 'solid',\n color: 'primary',\n className: 'bg-primary text-primary-foreground hover:bg-primary/90',\n },\n {\n variant: 'solid',\n color: 'secondary',\n className:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/90',\n },\n {\n variant: 'solid',\n color: 'info',\n className: 'bg-info text-info-foreground hover:bg-info/90',\n },\n {\n variant: 'solid',\n color: 'success',\n className: 'bg-success text-success-foreground hover:bg-success/90',\n },\n {\n variant: 'solid',\n color: 'warning',\n className: 'bg-warning text-warning-foreground hover:bg-warning/90',\n },\n {\n variant: 'solid',\n color: 'destructive',\n className:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n },\n\n // Soft variants\n {\n variant: 'soft',\n color: 'primary',\n className:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n },\n {\n variant: 'soft',\n color: 'secondary',\n className:\n 'bg-soft-secondary text-soft-secondary-foreground hover:bg-opacity-secondary-20 dark:bg-soft-secondary dark:text-soft-secondary-foreground',\n },\n {\n variant: 'soft',\n color: 'info',\n className:\n 'bg-soft-info text-soft-info-foreground hover:bg-opacity-info-20 dark:bg-soft-info dark:text-soft-info-foreground',\n },\n {\n variant: 'soft',\n color: 'success',\n className:\n 'bg-soft-success text-soft-success-foreground hover:bg-opacity-success-20 dark:bg-soft-success dark:text-soft-success-foreground',\n },\n {\n variant: 'soft',\n color: 'warning',\n className:\n 'bg-soft-warning text-soft-warning-foreground hover:bg-opacity-warning-20 dark:bg-soft-warning dark:text-soft-warning-foreground',\n },\n {\n variant: 'soft',\n color: 'destructive',\n className:\n 'bg-soft-destructive text-soft-destructive-foreground hover:bg-opacity-destructive-20 dark:bg-soft-destructive dark:text-soft-destructive-foreground',\n },\n {\n variant: 'soft',\n color: 'gray',\n className:\n 'bg-soft-gray text-soft-gray-foreground hover:bg-opacity-neutral-20 dark:bg-soft-gray dark:text-soft-gray-foreground',\n },\n {\n variant: 'soft',\n color: 'cyan',\n className:\n 'bg-soft-cyan text-soft-cyan-foreground hover:bg-opacity-info-20 dark:bg-soft-cyan dark:text-soft-cyan-foreground',\n },\n {\n variant: 'soft',\n color: 'teal',\n className:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n },\n {\n variant: 'soft',\n color: 'green',\n className:\n 'bg-soft-green text-soft-green-foreground hover:bg-opacity-success-20 dark:bg-soft-green dark:text-soft-green-foreground',\n },\n {\n variant: 'soft',\n color: 'blue',\n className:\n 'bg-soft-blue text-soft-blue-foreground hover:bg-opacity-info-20 dark:bg-soft-blue dark:text-soft-blue-foreground',\n },\n {\n variant: 'soft',\n color: 'indigo',\n className:\n 'bg-soft-indigo text-soft-indigo-foreground hover:bg-opacity-info-20 dark:bg-soft-indigo dark:text-soft-indigo-foreground',\n },\n {\n variant: 'soft',\n color: 'purple',\n className:\n 'bg-soft-purple text-soft-purple-foreground hover:bg-opacity-primary-20 dark:bg-soft-purple dark:text-soft-purple-foreground',\n },\n {\n variant: 'soft',\n color: 'pink',\n className:\n 'bg-soft-pink text-soft-pink-foreground hover:bg-opacity-destructive-20 dark:bg-soft-pink dark:text-soft-pink-foreground',\n },\n {\n variant: 'soft',\n color: 'orange',\n className:\n 'bg-soft-orange text-soft-orange-foreground hover:bg-opacity-warning-20 dark:bg-soft-orange dark:text-soft-orange-foreground',\n },\n {\n variant: 'soft',\n color: 'yellow',\n className:\n 'bg-soft-yellow text-soft-yellow-foreground hover:bg-opacity-warning-20 dark:bg-soft-yellow dark:text-soft-yellow-foreground',\n },\n\n // Outline variants\n {\n variant: 'outline',\n color: 'primary',\n className: 'border-primary text-primary hover:bg-primary/10',\n },\n {\n variant: 'outline',\n color: 'secondary',\n className:\n 'border-border text-secondary-foreground hover:bg-secondary/50',\n },\n {\n variant: 'outline',\n color: 'info',\n className: 'border-info text-info hover:bg-info/10',\n },\n {\n variant: 'outline',\n color: 'success',\n className: 'border-success text-success hover:bg-success/10',\n },\n {\n variant: 'outline',\n color: 'warning',\n className: 'border-warning text-warning hover:bg-warning/10',\n },\n {\n variant: 'outline',\n color: 'destructive',\n className:\n 'border-destructive text-destructive hover:bg-destructive/10',\n },\n\n // White variants\n {\n variant: 'white',\n color: 'primary',\n className: 'text-primary',\n },\n {\n variant: 'white',\n color: 'secondary',\n className: 'text-secondary-foreground',\n },\n {\n variant: 'white',\n color: 'info',\n className: 'text-info',\n },\n {\n variant: 'white',\n color: 'success',\n className: 'text-success',\n },\n {\n variant: 'white',\n color: 'warning',\n className: 'text-warning',\n },\n {\n variant: 'white',\n color: 'destructive',\n className: 'text-destructive',\n },\n {\n variant: 'white',\n color: 'gray',\n className: 'text-soft-gray-foreground',\n },\n {\n variant: 'white',\n color: 'cyan',\n className: 'text-soft-cyan-foreground',\n },\n {\n variant: 'white',\n color: 'teal',\n className: 'text-primary',\n },\n {\n variant: 'white',\n color: 'green',\n className: 'text-soft-green-foreground',\n },\n {\n variant: 'white',\n color: 'blue',\n className: 'text-soft-blue-foreground',\n },\n {\n variant: 'white',\n color: 'indigo',\n className: 'text-soft-indigo-foreground',\n },\n {\n variant: 'white',\n color: 'purple',\n className: 'text-soft-purple-foreground',\n },\n {\n variant: 'white',\n color: 'pink',\n className: 'text-soft-pink-foreground',\n },\n {\n variant: 'white',\n color: 'orange',\n className: 'text-soft-orange-foreground',\n },\n {\n variant: 'white',\n color: 'yellow',\n className: 'text-soft-yellow-foreground',\n },\n ],\n defaultVariants: {\n variant: 'soft',\n color: 'secondary',\n size: 'sm',\n shape: 'round',\n },\n },\n);\n\ntype BadgeColor = NonNullable<VariantProps<typeof badgeVariants>['color']>;\n\n// Dot color mapping for the dot variant\nconst dotColorClasses: Partial<Record<BadgeColor, string>> = {\n primary: 'bg-primary',\n secondary: 'bg-muted-foreground',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n cyan: 'bg-soft-cyan-foreground',\n};\n\nexport interface BadgeProps\n extends Omit<React.ComponentProps<'span'>, 'color'>,\n VariantProps<typeof badgeVariants> {\n /** Leading icon displayed before the text */\n leadingIcon?: React.ReactNode;\n /** Trailing icon displayed after the text */\n trailingIcon?: React.ReactNode;\n /** Avatar element to display before the text */\n avatar?: React.ReactNode;\n /** For icon-only badges - no text, just an icon */\n iconOnly?: boolean;\n /** Shows a close button and enables onClose callback */\n closable?: boolean;\n /** Accessible label for the close button */\n closeLabel?: string;\n /** Callback when close button is clicked */\n onClose?: () => void;\n}\n\n/**\n * Dot indicator for the dot variant\n */\nconst BadgeDot = ({ color = 'secondary' }: { color?: BadgeColor }) => (\n <span className=\"relative flex size-2 shrink-0\" aria-hidden=\"true\">\n <span\n className={cn(\n 'absolute inline-flex size-full animate-ping rounded-full opacity-40 motion-reduce:animate-none',\n dotColorClasses[color] ?? dotColorClasses.secondary,\n )}\n />\n <span\n className={cn(\n 'relative inline-flex size-2 rounded-full',\n dotColorClasses[color] ?? dotColorClasses.secondary,\n )}\n />\n </span>\n);\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n children,\n leadingIcon,\n trailingIcon,\n avatar,\n iconOnly = false,\n closable = false,\n closeLabel = 'Remove',\n onClose,\n className,\n variant = 'soft',\n color = 'secondary',\n size = 'sm',\n shape = 'round',\n ...props\n },\n ref,\n ) => {\n const isDot = variant === 'dot';\n\n // Adjust padding for different configurations\n const paddingClasses = cn(\n // Leading content - reduce left padding\n (avatar || leadingIcon || isDot) && 'ps-1.5',\n // Trailing content - reduce right padding\n (trailingIcon || closable) && 'pe-1',\n // Icon only - equal padding\n iconOnly && 'px-1.5',\n );\n\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n {...(isDot && { role: 'status' })}\n className={cn(\n badgeVariants({ variant, color, size, shape }),\n paddingClasses,\n className,\n )}\n {...props}\n >\n {isDot && <BadgeDot color={color ?? 'secondary'} />}\n\n {avatar && !isDot && (\n <span className=\"shrink-0 -ms-0.5 [&>*]:size-4 [&>*]:rounded-full\">\n {avatar}\n </span>\n )}\n\n {leadingIcon && !avatar && !isDot && leadingIcon}\n\n {children}\n\n {trailingIcon && !closable && trailingIcon}\n\n {closable && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"group/close relative shrink-0 rounded-full hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 -me-0.5 p-0.5 before:absolute before:-inset-3.5 before:content-['']\"\n aria-label={closeLabel}\n >\n <X className=\"size-3 transition-transform duration-150 ease-out group-hover/close:rotate-90 motion-reduce:transition-none\" />\n </button>\n )}\n </span>\n );\n },\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge, BadgeDot, badgeVariants };\n"],"mappings":"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"}
@@ -46,22 +46,22 @@ var l = /* @__PURE__ */ _(y(), 1), e = j(), S = N("relative flex shrink-0 items-
46
46
  {
47
47
  variant: "info",
48
48
  checked: !0,
49
- className: "border-info bg-info text-primary-foreground hover:bg-info/90"
49
+ className: "border-info bg-info text-info-foreground hover:bg-info/90"
50
50
  },
51
51
  {
52
52
  variant: "success",
53
53
  checked: !0,
54
- className: "border-success bg-success text-primary-foreground hover:bg-success/90"
54
+ className: "border-success bg-success text-success-foreground hover:bg-success/90"
55
55
  },
56
56
  {
57
57
  variant: "warning",
58
58
  checked: !0,
59
- className: "border-warning bg-warning text-primary-foreground hover:bg-warning/90"
59
+ className: "border-warning bg-warning text-warning-foreground hover:bg-warning/90"
60
60
  },
61
61
  {
62
62
  variant: "destructive",
63
63
  checked: !0,
64
- className: "border-destructive bg-destructive text-primary-foreground hover:bg-destructive/90"
64
+ className: "border-destructive bg-destructive text-destructive-foreground hover:bg-destructive/90"
65
65
  }
66
66
  ],
67
67
  defaultVariants: {
@@ -73,42 +73,42 @@ var l = /* @__PURE__ */ _(y(), 1), e = j(), S = N("relative flex shrink-0 items-
73
73
  sm: "size-3",
74
74
  md: "size-3.5",
75
75
  lg: "size-4"
76
- }, f = l.forwardRef(({ className: m, variant: i, size: a = "sm", checked: n, defaultChecked: h = !1, onCheckedChange: o, ...t }, c) => {
77
- const [u, d] = l.useState(h), s = n !== void 0, r = s ? n : u, b = O()?.state === "destructive", p = i ?? (b ? "destructive" : "primary"), k = l.useCallback((v) => {
78
- s || d(v), o?.(v);
79
- }, [s, o]);
76
+ }, f = l.forwardRef(({ className: u, variant: i, size: s = "sm", checked: n, defaultChecked: h = !1, onCheckedChange: o, ...t }, c) => {
77
+ const [m, d] = l.useState(h), a = n !== void 0, r = a ? n : m, b = O()?.state === "destructive", v = i ?? (b ? "destructive" : "primary"), k = l.useCallback((p) => {
78
+ a || d(p), o?.(p);
79
+ }, [a, o]);
80
80
  return /* @__PURE__ */ (0, e.jsx)(q, {
81
81
  ref: c,
82
82
  "data-slot": "checkbox",
83
- "data-size": a,
84
- "data-variant": p,
83
+ "data-size": s,
84
+ "data-variant": v,
85
85
  checked: r,
86
86
  onCheckedChange: k,
87
87
  className: x(S({
88
- variant: p,
89
- size: a,
88
+ variant: v,
89
+ size: s,
90
90
  checked: r
91
- }), 'before:content-[""] before:absolute before:-inset-[4px] before:rounded-[inherit]', "focus-visible:ring-4 focus-visible:ring-bg-secondary focus-visible:shadow-[0_0_0_2px_var(--card),0_0_0_4px_var(--border)]", "dark:focus-visible:ring-bg-tertiary dark:focus-visible:shadow-[0_0_0_2px_var(--card),0_0_0_4px_var(--border)]", r && "delight-check-bounce", m),
91
+ }), 'before:content-[""] before:absolute before:-inset-[4px] before:rounded-[inherit]', "focus-visible:ring-4 focus-visible:ring-bg-secondary focus-visible:shadow-[0_0_0_2px_var(--card),0_0_0_4px_var(--border)]", "dark:focus-visible:ring-bg-tertiary dark:focus-visible:shadow-[0_0_0_2px_var(--card),0_0_0_4px_var(--border)]", r && "delight-check-bounce", u),
92
92
  ...t,
93
93
  children: /* @__PURE__ */ (0, e.jsx)(P, {
94
94
  "data-slot": "checkbox-indicator",
95
95
  className: "flex items-center justify-center text-current",
96
96
  children: t.indeterminate ? /* @__PURE__ */ (0, e.jsx)(C, {
97
- className: x(g[a], "animate-[scale-in_150ms_ease-out] motion-reduce:animate-none"),
97
+ className: x(g[s], "animate-[scale-in_150ms_ease-out] motion-reduce:animate-none"),
98
98
  strokeWidth: 3
99
- }) : /* @__PURE__ */ (0, e.jsx)(R, { className: g[a] })
99
+ }) : /* @__PURE__ */ (0, e.jsx)(R, { className: g[s] })
100
100
  })
101
101
  });
102
102
  });
103
103
  f.displayName = "CheckboxControl";
104
- var B = l.forwardRef((m, i) => {
105
- const [a, n] = F(m), { ref: h, ...o } = n;
106
- if (!z(a)) return /* @__PURE__ */ (0, e.jsx)(f, {
104
+ var B = l.forwardRef((u, i) => {
105
+ const [s, n] = F(u), { ref: h, ...o } = n;
106
+ if (!z(s)) return /* @__PURE__ */ (0, e.jsx)(f, {
107
107
  ref: i,
108
108
  ...o,
109
- required: a.required
109
+ required: s.required
110
110
  });
111
- const { label: t, required: c, labelIcon: u, tooltip: d, description: s, error: r, fieldClassName: b } = a;
111
+ const { label: t, required: c, labelIcon: m, tooltip: d, description: a, error: r, fieldClassName: b } = s;
112
112
  return /* @__PURE__ */ (0, e.jsxs)(M, {
113
113
  layout: "inline",
114
114
  state: r ? "destructive" : void 0,
@@ -122,10 +122,10 @@ var B = l.forwardRef((m, i) => {
122
122
  }),
123
123
  t && /* @__PURE__ */ (0, e.jsxs)(D, {
124
124
  required: c,
125
- labelIcon: u,
125
+ labelIcon: m,
126
126
  children: [t, d && /* @__PURE__ */ (0, e.jsx)(w, { content: d })]
127
127
  }),
128
- (r || s) && /* @__PURE__ */ (0, e.jsxs)(I, { children: [r && /* @__PURE__ */ (0, e.jsx)(V, { children: r }), !r && s && /* @__PURE__ */ (0, e.jsx)(E, { children: s })] })
128
+ (r || a) && /* @__PURE__ */ (0, e.jsxs)(I, { children: [r && /* @__PURE__ */ (0, e.jsx)(V, { children: r }), !r && a && /* @__PURE__ */ (0, e.jsx)(E, { children: a })] })
129
129
  ]
130
130
  });
131
131
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.js","names":[],"sources":["../../src/components/atoms/forms/Checkbox/Checkbox.tsx"],"sourcesContent":["'use client';\n\nimport { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox';\nimport { cva } from 'class-variance-authority';\nimport { Minus } from 'lucide-react';\nimport * as React from 'react';\nimport {\n type FieldProps,\n FieldTooltip,\n hasFieldProps,\n splitFieldProps,\n} from '@/components/atoms/forms/_shared';\nimport {\n Field,\n FieldBottom,\n FieldDescription,\n FieldError,\n FieldLabel,\n useFieldContextOptional,\n} from '@/components/ui/form-field';\nimport { DrawCheck } from '@/components/ui/selection-group';\nimport { cn } from '@/lib/utils';\n\n// ============================================\n// CVA Variants\n// ============================================\n\nconst checkboxVariants = cva(\n // Base styles\n 'relative flex shrink-0 items-center justify-center border shadow-xs transition-[border-color,background-color,color,box-shadow] duration-200 ease-out motion-reduce:transition-none focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n {\n variants: {\n variant: {\n primary: '',\n secondary: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n },\n size: {\n sm: 'size-4 rounded-[4px]',\n md: 'size-5 rounded-[5px]',\n lg: 'size-6 rounded-[6px]',\n },\n checked: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n // ===== UNCHECKED (all variants) =====\n {\n checked: false,\n className:\n 'bg-background border-border hover:border-primary hover:bg-primary/10',\n },\n // ===== PRIMARY CHECKED =====\n {\n variant: 'primary',\n checked: true,\n className:\n 'border-primary bg-primary text-primary-foreground hover:bg-primary/90',\n },\n // ===== SECONDARY CHECKED (outline style) =====\n {\n variant: 'secondary',\n checked: true,\n className: 'border-border bg-background text-foreground hover:bg-muted',\n },\n // ===== INFO CHECKED =====\n {\n variant: 'info',\n checked: true,\n className:\n 'border-info bg-info text-primary-foreground hover:bg-info/90',\n },\n // ===== SUCCESS CHECKED =====\n {\n variant: 'success',\n checked: true,\n className:\n 'border-success bg-success text-primary-foreground hover:bg-success/90',\n },\n // ===== WARNING CHECKED =====\n {\n variant: 'warning',\n checked: true,\n className:\n 'border-warning bg-warning text-primary-foreground hover:bg-warning/90',\n },\n // ===== DESTRUCTIVE CHECKED =====\n {\n variant: 'destructive',\n checked: true,\n className:\n 'border-destructive bg-destructive text-primary-foreground hover:bg-destructive/90',\n },\n ],\n defaultVariants: {\n variant: 'primary',\n size: 'sm',\n checked: false,\n },\n },\n);\n\n// ============================================\n// Types\n// ============================================\n\ntype CheckboxVariant =\n | 'primary'\n | 'secondary'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive';\ntype CheckboxSize = 'sm' | 'md' | 'lg';\n\n/**\n * Checkbox is a pure atom component that renders ONLY the checkbox element.\n * It does NOT render label, description, or error.\n *\n * Supports 6 color variants and 3 sizes matching Figma design.\n * When used inside a Field with an error, automatically uses destructive variant.\n *\n * @example\n * ```tsx\n * // Simple checkbox\n * <Checkbox />\n *\n * // With variant and size\n * <Checkbox variant=\"success\" size=\"lg\" />\n *\n * // Auto-destructive when Field has error\n * <Field error=\"Required\">\n * <Checkbox /> // automatically uses destructive variant\n * </Field>\n * ```\n */\ntype CheckboxControlProps = Omit<\n CheckboxPrimitive.Root.Props,\n 'onCheckedChange'\n> & {\n /** Color variant for the checkbox */\n variant?: CheckboxVariant;\n /** Size variant for the checkbox */\n size?: CheckboxSize;\n /** Controlled checked state. When provided, component is controlled. */\n checked?: boolean;\n /** Initial checked state for uncontrolled mode */\n defaultChecked?: boolean;\n /** Callback when checked state changes */\n onCheckedChange?: (checked: boolean) => void;\n};\n\nexport interface CheckboxProps\n extends CheckboxControlProps,\n Omit<FieldProps, 'topRight' | 'bottomRight'> {}\n\nexport type { CheckboxSize, CheckboxVariant };\n\n// ============================================\n// Size configuration\n// ============================================\n\nconst iconClasses = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n};\n\n// ============================================\n// Checkbox (pure atom)\n// ============================================\n\nconst CheckboxControl = React.forwardRef<\n HTMLButtonElement,\n CheckboxControlProps\n>(\n (\n {\n className,\n variant: variantProp,\n size = 'sm',\n checked: controlledChecked,\n defaultChecked = false,\n onCheckedChange,\n ...props\n },\n ref,\n ) => {\n // Internal state for uncontrolled mode\n const [internalChecked, setInternalChecked] =\n React.useState(defaultChecked);\n\n // Use controlled value if provided, otherwise use internal state\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n // Field context integration - auto-destructive on error\n const fieldContext = useFieldContextOptional();\n const hasFieldError = fieldContext?.state === 'destructive';\n const variant = variantProp ?? (hasFieldError ? 'destructive' : 'primary');\n\n const handleCheckedChange = React.useCallback(\n (newChecked: boolean) => {\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onCheckedChange?.(newChecked);\n },\n [isControlled, onCheckedChange],\n );\n\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n data-size={size}\n data-variant={variant}\n checked={checked}\n onCheckedChange={handleCheckedChange}\n className={cn(\n checkboxVariants({ variant, size, checked }),\n // Touch target expansion (ensures ≥24px hit area)\n 'before:content-[\"\"] before:absolute before:-inset-[4px] before:rounded-[inherit]',\n // Focus state - double ring effect\n 'focus-visible:ring-4 focus-visible:ring-bg-secondary focus-visible:shadow-[0_0_0_2px_var(--card),0_0_0_4px_var(--border)]',\n 'dark:focus-visible:ring-bg-tertiary dark:focus-visible:shadow-[0_0_0_2px_var(--card),0_0_0_4px_var(--border)]',\n checked && 'delight-check-bounce',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current\"\n >\n {props.indeterminate ? (\n <Minus\n className={cn(\n iconClasses[size],\n 'animate-[scale-in_150ms_ease-out] motion-reduce:animate-none',\n )}\n strokeWidth={3}\n />\n ) : (\n <DrawCheck className={iconClasses[size]} />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n },\n);\n\nCheckboxControl.displayName = 'CheckboxControl';\n\n// =============================================================================\n// Checkbox — public API with smart field mode (inline layout)\n// =============================================================================\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n (props, forwardedRef) => {\n const [fieldPropsObj, controlProps] = splitFieldProps(props);\n const { ref: _ref, ...cp } = controlProps as CheckboxControlProps & {\n ref?: unknown;\n };\n\n if (!hasFieldProps(fieldPropsObj)) {\n return (\n <CheckboxControl\n ref={forwardedRef}\n {...cp}\n required={fieldPropsObj.required}\n />\n );\n }\n\n const {\n label,\n required,\n labelIcon,\n tooltip,\n description,\n error,\n fieldClassName,\n } = fieldPropsObj;\n\n return (\n <Field\n layout=\"inline\"\n state={error ? 'destructive' : undefined}\n disabled={cp.disabled}\n className={fieldClassName}\n >\n <CheckboxControl ref={forwardedRef} {...cp} required={required} />\n {label && (\n <FieldLabel required={required} labelIcon={labelIcon}>\n {label}\n {tooltip && <FieldTooltip content={tooltip} />}\n </FieldLabel>\n )}\n {(error || description) && (\n <FieldBottom>\n {error && <FieldError>{error}</FieldError>}\n {!error && description && (\n <FieldDescription>{description}</FieldDescription>\n )}\n </FieldBottom>\n )}\n </Field>\n );\n },\n);\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };\n"],"mappings":"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"}
1
+ {"version":3,"file":"Checkbox.js","names":[],"sources":["../../src/components/atoms/forms/Checkbox/Checkbox.tsx"],"sourcesContent":["'use client';\n\nimport { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox';\nimport { cva } from 'class-variance-authority';\nimport { Minus } from 'lucide-react';\nimport * as React from 'react';\nimport {\n type FieldProps,\n FieldTooltip,\n hasFieldProps,\n splitFieldProps,\n} from '@/components/atoms/forms/_shared';\nimport {\n Field,\n FieldBottom,\n FieldDescription,\n FieldError,\n FieldLabel,\n useFieldContextOptional,\n} from '@/components/ui/form-field';\nimport { DrawCheck } from '@/components/ui/selection-group';\nimport { cn } from '@/lib/utils';\n\n// ============================================\n// CVA Variants\n// ============================================\n\nconst checkboxVariants = cva(\n // Base styles\n 'relative flex shrink-0 items-center justify-center border shadow-xs transition-[border-color,background-color,color,box-shadow] duration-200 ease-out motion-reduce:transition-none focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n {\n variants: {\n variant: {\n primary: '',\n secondary: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n },\n size: {\n sm: 'size-4 rounded-[4px]',\n md: 'size-5 rounded-[5px]',\n lg: 'size-6 rounded-[6px]',\n },\n checked: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n // ===== UNCHECKED (all variants) =====\n {\n checked: false,\n className:\n 'bg-background border-border hover:border-primary hover:bg-primary/10',\n },\n // ===== PRIMARY CHECKED =====\n {\n variant: 'primary',\n checked: true,\n className:\n 'border-primary bg-primary text-primary-foreground hover:bg-primary/90',\n },\n // ===== SECONDARY CHECKED (outline style) =====\n {\n variant: 'secondary',\n checked: true,\n className: 'border-border bg-background text-foreground hover:bg-muted',\n },\n // ===== INFO CHECKED =====\n {\n variant: 'info',\n checked: true,\n className: 'border-info bg-info text-info-foreground hover:bg-info/90',\n },\n // ===== SUCCESS CHECKED =====\n {\n variant: 'success',\n checked: true,\n className:\n 'border-success bg-success text-success-foreground hover:bg-success/90',\n },\n // ===== WARNING CHECKED =====\n {\n variant: 'warning',\n checked: true,\n className:\n 'border-warning bg-warning text-warning-foreground hover:bg-warning/90',\n },\n // ===== DESTRUCTIVE CHECKED =====\n {\n variant: 'destructive',\n checked: true,\n className:\n 'border-destructive bg-destructive text-destructive-foreground hover:bg-destructive/90',\n },\n ],\n defaultVariants: {\n variant: 'primary',\n size: 'sm',\n checked: false,\n },\n },\n);\n\n// ============================================\n// Types\n// ============================================\n\ntype CheckboxVariant =\n | 'primary'\n | 'secondary'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive';\ntype CheckboxSize = 'sm' | 'md' | 'lg';\n\n/**\n * Checkbox is a pure atom component that renders ONLY the checkbox element.\n * It does NOT render label, description, or error.\n *\n * Supports 6 color variants and 3 sizes matching Figma design.\n * When used inside a Field with an error, automatically uses destructive variant.\n *\n * @example\n * ```tsx\n * // Simple checkbox\n * <Checkbox />\n *\n * // With variant and size\n * <Checkbox variant=\"success\" size=\"lg\" />\n *\n * // Auto-destructive when Field has error\n * <Field error=\"Required\">\n * <Checkbox /> // automatically uses destructive variant\n * </Field>\n * ```\n */\ntype CheckboxControlProps = Omit<\n CheckboxPrimitive.Root.Props,\n 'onCheckedChange'\n> & {\n /** Color variant for the checkbox */\n variant?: CheckboxVariant;\n /** Size variant for the checkbox */\n size?: CheckboxSize;\n /** Controlled checked state. When provided, component is controlled. */\n checked?: boolean;\n /** Initial checked state for uncontrolled mode */\n defaultChecked?: boolean;\n /** Callback when checked state changes */\n onCheckedChange?: (checked: boolean) => void;\n};\n\nexport interface CheckboxProps\n extends CheckboxControlProps,\n Omit<FieldProps, 'topRight' | 'bottomRight'> {}\n\nexport type { CheckboxSize, CheckboxVariant };\n\n// ============================================\n// Size configuration\n// ============================================\n\nconst iconClasses = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-4',\n};\n\n// ============================================\n// Checkbox (pure atom)\n// ============================================\n\nconst CheckboxControl = React.forwardRef<\n HTMLButtonElement,\n CheckboxControlProps\n>(\n (\n {\n className,\n variant: variantProp,\n size = 'sm',\n checked: controlledChecked,\n defaultChecked = false,\n onCheckedChange,\n ...props\n },\n ref,\n ) => {\n // Internal state for uncontrolled mode\n const [internalChecked, setInternalChecked] =\n React.useState(defaultChecked);\n\n // Use controlled value if provided, otherwise use internal state\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n // Field context integration - auto-destructive on error\n const fieldContext = useFieldContextOptional();\n const hasFieldError = fieldContext?.state === 'destructive';\n const variant = variantProp ?? (hasFieldError ? 'destructive' : 'primary');\n\n const handleCheckedChange = React.useCallback(\n (newChecked: boolean) => {\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onCheckedChange?.(newChecked);\n },\n [isControlled, onCheckedChange],\n );\n\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n data-size={size}\n data-variant={variant}\n checked={checked}\n onCheckedChange={handleCheckedChange}\n className={cn(\n checkboxVariants({ variant, size, checked }),\n // Touch target expansion (ensures ≥24px hit area)\n 'before:content-[\"\"] before:absolute before:-inset-[4px] before:rounded-[inherit]',\n // Focus state - double ring effect\n 'focus-visible:ring-4 focus-visible:ring-bg-secondary focus-visible:shadow-[0_0_0_2px_var(--card),0_0_0_4px_var(--border)]',\n 'dark:focus-visible:ring-bg-tertiary dark:focus-visible:shadow-[0_0_0_2px_var(--card),0_0_0_4px_var(--border)]',\n checked && 'delight-check-bounce',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current\"\n >\n {props.indeterminate ? (\n <Minus\n className={cn(\n iconClasses[size],\n 'animate-[scale-in_150ms_ease-out] motion-reduce:animate-none',\n )}\n strokeWidth={3}\n />\n ) : (\n <DrawCheck className={iconClasses[size]} />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n },\n);\n\nCheckboxControl.displayName = 'CheckboxControl';\n\n// =============================================================================\n// Checkbox — public API with smart field mode (inline layout)\n// =============================================================================\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n (props, forwardedRef) => {\n const [fieldPropsObj, controlProps] = splitFieldProps(props);\n const { ref: _ref, ...cp } = controlProps as CheckboxControlProps & {\n ref?: unknown;\n };\n\n if (!hasFieldProps(fieldPropsObj)) {\n return (\n <CheckboxControl\n ref={forwardedRef}\n {...cp}\n required={fieldPropsObj.required}\n />\n );\n }\n\n const {\n label,\n required,\n labelIcon,\n tooltip,\n description,\n error,\n fieldClassName,\n } = fieldPropsObj;\n\n return (\n <Field\n layout=\"inline\"\n state={error ? 'destructive' : undefined}\n disabled={cp.disabled}\n className={fieldClassName}\n >\n <CheckboxControl ref={forwardedRef} {...cp} required={required} />\n {label && (\n <FieldLabel required={required} labelIcon={labelIcon}>\n {label}\n {tooltip && <FieldTooltip content={tooltip} />}\n </FieldLabel>\n )}\n {(error || description) && (\n <FieldBottom>\n {error && <FieldError>{error}</FieldError>}\n {!error && description && (\n <FieldDescription>{description}</FieldDescription>\n )}\n </FieldBottom>\n )}\n </Field>\n );\n },\n);\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };\n"],"mappings":"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"}
@@ -57,10 +57,10 @@ var de = [["path", {
57
57
  }
58
58
  }, ue = {
59
59
  primary: "bg-primary text-primary-foreground",
60
- info: "bg-info text-primary-foreground",
61
- warning: "bg-warning text-primary-foreground",
62
- success: "bg-success text-primary-foreground",
63
- destructive: "bg-destructive text-primary-foreground"
60
+ info: "bg-info text-info-foreground",
61
+ warning: "bg-warning text-warning-foreground",
62
+ success: "bg-success text-success-foreground",
63
+ destructive: "bg-destructive text-destructive-foreground"
64
64
  };
65
65
  function xe(e) {
66
66
  switch (e) {