@humain/ui 2.4.2 → 2.4.3

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 (153) hide show
  1. package/dist/index194.js +6 -8
  2. package/dist/index194.js.map +1 -1
  3. package/dist/index24.js +1 -1
  4. package/dist/index24.js.map +1 -1
  5. package/dist/styles.css +1 -1
  6. package/dist/wc/AIClarificationCard.js +1 -1
  7. package/dist/wc/AIContainer.js +1 -1
  8. package/dist/wc/AIForm.js +17 -17
  9. package/dist/wc/AIInput.js +1 -1
  10. package/dist/wc/AIMermaidDiagram.js +1 -1
  11. package/dist/wc/AIMessage.js +1 -1
  12. package/dist/wc/AIScrollButton.js +4 -4
  13. package/dist/wc/AIToolCall.js +5 -5
  14. package/dist/wc/AppSidebar.constants.js +1 -1
  15. package/dist/wc/AvatarFallback.js +5 -5
  16. package/dist/wc/CheckboxIndicator.js +7 -7
  17. package/dist/wc/CollapsiblePanel.js +1 -1
  18. package/dist/wc/DialogTrigger.js +9 -9
  19. package/dist/wc/DropdownMenu.js +16 -16
  20. package/dist/wc/MenuSubmenuTrigger.js +31 -31
  21. package/dist/wc/PopoverDescription.js +30 -30
  22. package/dist/wc/PrehydrationScript.js +1 -1
  23. package/dist/wc/Select.js +18 -18
  24. package/dist/wc/SelectSeparator.js +72 -72
  25. package/dist/wc/SelectSeparator.js.map +1 -1
  26. package/dist/wc/Tabs.js +18 -18
  27. package/dist/wc/TooltipProvider.js +9 -9
  28. package/dist/wc/chart.js +1 -1
  29. package/dist/wc/chunk-75Z2AOVW.js +39 -39
  30. package/dist/wc/chunk-OSK3NFVY.js +32 -32
  31. package/dist/wc/command.js +4 -4
  32. package/dist/wc/form-field.js +1 -1
  33. package/dist/wc/form-fieldset.js +5 -5
  34. package/dist/wc/hf-accordion-card.js +4 -4
  35. package/dist/wc/hf-accordion.js +6 -6
  36. package/dist/wc/hf-ai-feedback-bar.js +5 -5
  37. package/dist/wc/hf-ai-reasoning-block.js +6 -6
  38. package/dist/wc/hf-ai-system-message.js +1 -1
  39. package/dist/wc/hf-ai-tool-run.js +1 -1
  40. package/dist/wc/hf-area-chart.js +15 -15
  41. package/dist/wc/hf-autocomplete.js +36 -36
  42. package/dist/wc/hf-bar-chart.js +4 -4
  43. package/dist/wc/hf-calendar.js +4 -4
  44. package/dist/wc/hf-carousel.js +1 -1
  45. package/dist/wc/hf-context-menu.js +8 -8
  46. package/dist/wc/hf-donut-chart.js +10 -10
  47. package/dist/wc/hf-empty-state.js +87 -88
  48. package/dist/wc/hf-empty-state.js.map +1 -1
  49. package/dist/wc/hf-history.js +4 -4
  50. package/dist/wc/hf-horizontal-bar-chart.js +7 -7
  51. package/dist/wc/hf-hover-card.js +6 -6
  52. package/dist/wc/hf-line-chart.js +4 -4
  53. package/dist/wc/hf-metric-card.js +5 -5
  54. package/dist/wc/hf-metric-item.js +8 -8
  55. package/dist/wc/hf-metric-item.js.map +1 -1
  56. package/dist/wc/hf-nav-account-menu.js +4 -4
  57. package/dist/wc/hf-notification-panel.js +2 -2
  58. package/dist/wc/hf-pie-chart.js +17 -17
  59. package/dist/wc/hf-radar-chart.js +16 -16
  60. package/dist/wc/hf-section-header.js +6 -6
  61. package/dist/wc/hf-sheet.js +1 -1
  62. package/dist/wc/hf-sparkline-chart.js +5 -5
  63. package/dist/wc/hf-steps.js +6 -6
  64. package/dist/wc/journeyDiagram-3NMN7TZE.js +10 -10
  65. package/dist/wc/pieDiagram-E7YTZNPT.js +16 -16
  66. package/dist/wc/popupStateMapping.js +53 -53
  67. package/dist/wc/popupStateMapping.js.map +1 -1
  68. package/dist/wc/selection-group.js +1 -1
  69. package/dist/wc/selection-group.js.map +1 -1
  70. package/dist/wc/{useOpenChangeComplete.js → stateAttributesMapping.js} +21 -21
  71. package/dist/wc/stateAttributesMapping.js.map +1 -0
  72. package/dist/wc/stateDiagram-D77RDMKH.js +3 -3
  73. package/dist/wc/timeline-definition-24CTP7MA.js +19 -19
  74. package/dist/wc/useCollapsiblePanel.js +3 -3
  75. package/dist/wc/usePopupHandleStore.js +4 -4
  76. package/dist/wc/useScrollLock.js +1 -1
  77. package/dist/wc/vendor/recharts.js +525 -524
  78. package/dist/wc/vendor/recharts.js.map +1 -1
  79. package/dist/wc/xychartDiagram-S5SC5T6Z.js +6 -6
  80. package/dist/wc-react/AIClarificationCard.js +1 -1
  81. package/dist/wc-react/AIContainer.js +1 -1
  82. package/dist/wc-react/AIForm.js +17 -17
  83. package/dist/wc-react/AIInput.js +1 -1
  84. package/dist/wc-react/AIMermaidDiagram.js +1 -1
  85. package/dist/wc-react/AIMessage.js +1 -1
  86. package/dist/wc-react/AIScrollButton.js +4 -4
  87. package/dist/wc-react/AIToolCall.js +5 -5
  88. package/dist/wc-react/AppSidebar.constants.js +1 -1
  89. package/dist/wc-react/AvatarFallback.js +5 -5
  90. package/dist/wc-react/CheckboxIndicator.js +7 -7
  91. package/dist/wc-react/CollapsiblePanel.js +1 -1
  92. package/dist/wc-react/DialogTrigger.js +9 -9
  93. package/dist/wc-react/DropdownMenu.js +16 -16
  94. package/dist/wc-react/FloatingPortalLite.js +3 -3
  95. package/dist/wc-react/MenuSubmenuTrigger.js +31 -31
  96. package/dist/wc-react/PopoverDescription.js +31 -31
  97. package/dist/wc-react/PrehydrationScript.js +1 -1
  98. package/dist/wc-react/Select.js +18 -18
  99. package/dist/wc-react/SelectSeparator.js +71 -70
  100. package/dist/wc-react/SelectSeparator.js.map +1 -1
  101. package/dist/wc-react/Tabs.js +18 -18
  102. package/dist/wc-react/TooltipProvider.js +9 -9
  103. package/dist/wc-react/chart.js +1 -1
  104. package/dist/wc-react/chunk-75Z2AOVW.js +39 -39
  105. package/dist/wc-react/chunk-OSK3NFVY.js +32 -32
  106. package/dist/wc-react/command.js +4 -4
  107. package/dist/wc-react/form-field.js +1 -1
  108. package/dist/wc-react/form-fieldset.js +77 -77
  109. package/dist/wc-react/hf-accordion-card.js +4 -4
  110. package/dist/wc-react/hf-accordion.js +6 -6
  111. package/dist/wc-react/hf-ai-feedback-bar.js +5 -5
  112. package/dist/wc-react/hf-ai-reasoning-block.js +6 -6
  113. package/dist/wc-react/hf-ai-system-message.js +1 -1
  114. package/dist/wc-react/hf-ai-tool-run.js +1 -1
  115. package/dist/wc-react/hf-autocomplete.js +37 -37
  116. package/dist/wc-react/hf-calendar.js +4 -4
  117. package/dist/wc-react/hf-carousel.js +1 -1
  118. package/dist/wc-react/hf-context-menu.js +8 -8
  119. package/dist/wc-react/hf-data-table.js +1 -1
  120. package/dist/wc-react/hf-empty-state.js +87 -88
  121. package/dist/wc-react/hf-empty-state.js.map +1 -1
  122. package/dist/wc-react/hf-history.js +4 -4
  123. package/dist/wc-react/hf-hover-card.js +6 -6
  124. package/dist/wc-react/hf-metric-item.js +6 -6
  125. package/dist/wc-react/hf-metric-item.js.map +1 -1
  126. package/dist/wc-react/hf-nav-account-menu.js +4 -4
  127. package/dist/wc-react/hf-notification-panel.js +2 -2
  128. package/dist/wc-react/hf-section-header.js +6 -6
  129. package/dist/wc-react/hf-sheet.js +1 -1
  130. package/dist/wc-react/hf-steps.js +5 -5
  131. package/dist/wc-react/journeyDiagram-3NMN7TZE.js +10 -10
  132. package/dist/wc-react/pieDiagram-E7YTZNPT.js +16 -16
  133. package/dist/wc-react/popupStateMapping.js +54 -54
  134. package/dist/wc-react/popupStateMapping.js.map +1 -1
  135. package/dist/wc-react/selection-group.js +1 -1
  136. package/dist/wc-react/selection-group.js.map +1 -1
  137. package/dist/wc-react/{useOpenChangeComplete.js → stateAttributesMapping.js} +19 -19
  138. package/dist/wc-react/stateAttributesMapping.js.map +1 -0
  139. package/dist/wc-react/stateDiagram-D77RDMKH.js +3 -3
  140. package/dist/wc-react/timeline-definition-24CTP7MA.js +19 -19
  141. package/dist/wc-react/useCollapsiblePanel.js +3 -3
  142. package/dist/wc-react/usePopupHandleStore.js +3 -3
  143. package/dist/wc-react/useScrollLock.js +1 -1
  144. package/dist/wc-react/vendor/recharts.js +525 -524
  145. package/dist/wc-react/vendor/recharts.js.map +1 -1
  146. package/dist/wc-react/xychartDiagram-S5SC5T6Z.js +6 -6
  147. package/package.json +1 -1
  148. package/skills/humain-ui/SKILL.md +1 -1
  149. package/skills/humain-ui-wc/SKILL.md +1 -1
  150. package/skills/humain-ui-wc.skill +0 -0
  151. package/skills/humain-ui.skill +0 -0
  152. package/dist/wc/useOpenChangeComplete.js.map +0 -1
  153. package/dist/wc-react/useOpenChangeComplete.js.map +0 -1
@@ -159,7 +159,7 @@ var S = {
159
159
  className: c("shrink-0 rounded-md border border-border bg-card/60", "flex items-center justify-center", "dark:border-border", d, n),
160
160
  style: { boxShadow: "var(--shadow-inset-ring)" },
161
161
  children: /* @__PURE__ */ i("div", {
162
- className: c("text-secondary-foreground", t),
162
+ className: c("text-secondary-foreground [&>svg]:block [&>svg]:size-full", t),
163
163
  children: a
164
164
  })
165
165
  });
@@ -1 +1 @@
1
- {"version":3,"file":"selection-group.js","names":[],"sources":["../../src/components/ui/selection-group.tsx"],"sourcesContent":["'use client';\n\nimport { cva } from 'class-variance-authority';\nimport { Minus } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SelectionColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'warning'\n | 'info'\n | 'destructive';\n\nexport type SelectionSize = 'sm' | 'md' | 'lg';\n\nexport type SelectionVariant =\n | 'default'\n | 'card'\n | 'pill'\n | 'stacked'\n | 'icon-simple'\n | 'icon-card'\n | 'avatar'\n | 'payment'\n | 'simple'\n | 'chip';\n\nexport interface SelectionItem {\n /** Unique value for the option */\n value: string;\n /** Display label */\n label: string;\n /** Whether this option is disabled */\n disabled?: boolean;\n /** Secondary text (e.g., \"$10/month\") */\n subtext?: string;\n /** Supporting description text */\n description?: string;\n /** Leading icon component */\n icon?: React.ReactNode;\n /** Avatar element */\n avatar?: React.ReactNode;\n /** Image URL */\n image?: string;\n /** Alt text for the image (defaults to \"\" if omitted) */\n imageAlt?: string;\n /** Position of the image */\n imagePosition?: 'top' | 'left' | 'trailing';\n /** Badge element */\n badge?: React.ReactNode;\n /** Dot color for chip variant (named color or hex) */\n dotColor?: string;\n /** Price display (e.g., \"$10\") */\n price?: string;\n /** Price period (e.g., \"per month\") */\n pricePeriod?: string;\n /** Payment icon element */\n paymentIcon?: React.ReactNode;\n /** Action buttons */\n actions?: React.ReactNode;\n}\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\ninterface UseSelectionStateOptions {\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled mode */\n defaultValue?: string;\n /** Callback when value changes */\n onValueChange?: (value: string) => void;\n}\n\n/**\n * Hook for managing single selection state (radio behavior).\n * Supports both controlled and uncontrolled modes.\n */\nexport function useSelectionState(\n options: UseSelectionStateOptions = {},\n): [string | undefined, (value: string) => void] {\n const { value: controlledValue, defaultValue, onValueChange } = options;\n\n const [internalValue, setInternalValue] = React.useState<string | undefined>(\n defaultValue,\n );\n\n const isControlled = controlledValue !== undefined;\n const selectedValue = isControlled ? controlledValue : internalValue;\n\n const setValue = React.useCallback(\n (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onValueChange?.(newValue);\n },\n [isControlled, onValueChange],\n );\n\n return [selectedValue, setValue];\n}\n\ninterface UseMultiSelectionStateOptions {\n /** Controlled value */\n value?: string[];\n /** Default value for uncontrolled mode */\n defaultValue?: string[];\n /** Callback when value changes */\n onValueChange?: (value: string[]) => void;\n}\n\n/**\n * Hook for managing multi selection state (checkbox behavior).\n * Supports both controlled and uncontrolled modes.\n */\nexport function useMultiSelectionState(\n options: UseMultiSelectionStateOptions = {},\n): [string[], (value: string, checked: boolean) => void] {\n const { value: controlledValue, defaultValue = [], onValueChange } = options;\n\n const [internalValue, setInternalValue] =\n React.useState<string[]>(defaultValue);\n\n const isControlled = controlledValue !== undefined;\n const selectedValues = isControlled ? controlledValue : internalValue;\n\n const setValue = React.useCallback(\n (itemValue: string, checked: boolean) => {\n const newValue = checked\n ? [...selectedValues, itemValue]\n : selectedValues.filter((v) => v !== itemValue);\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onValueChange?.(newValue);\n },\n [isControlled, selectedValues, onValueChange],\n );\n\n return [selectedValues, setValue];\n}\n\n// =============================================================================\n// Color Mappings\n// =============================================================================\n\nexport const selectionColorClasses: Record<\n SelectionColor,\n {\n indicator: string;\n indicatorChecked: string;\n border: string;\n bg: string;\n text: string;\n }\n> = {\n primary: {\n indicator: 'border-primary',\n indicatorChecked: 'bg-primary',\n border: 'border-primary',\n bg: 'bg-primary',\n text: 'text-primary-foreground',\n },\n secondary: {\n indicator: 'border-secondary',\n indicatorChecked: 'bg-secondary-foreground',\n border: 'border-secondary',\n bg: 'bg-secondary',\n text: 'text-secondary-foreground',\n },\n success: {\n indicator: 'border-success',\n indicatorChecked: 'bg-success',\n border: 'border-success',\n bg: 'bg-success',\n text: 'text-primary-foreground',\n },\n warning: {\n indicator: 'border-warning',\n indicatorChecked: 'bg-warning',\n border: 'border-warning',\n bg: 'bg-warning',\n text: 'text-primary-foreground',\n },\n info: {\n indicator: 'border-info',\n indicatorChecked: 'bg-info',\n border: 'border-info',\n bg: 'bg-info',\n text: 'text-primary-foreground',\n },\n destructive: {\n indicator: 'border-destructive',\n indicatorChecked: 'bg-destructive',\n border: 'border-destructive',\n bg: 'bg-destructive',\n text: 'text-primary-foreground',\n },\n};\n\n// =============================================================================\n// CVA Variants\n// =============================================================================\n\n/**\n * Selection group container variants.\n * Used for the outer wrapper of a group of selection items.\n */\nexport const selectionGroupVariants = cva('flex', {\n variants: {\n orientation: {\n horizontal: 'flex-row flex-wrap',\n vertical: 'flex-col',\n },\n gap: {\n sm: 'gap-2',\n md: 'gap-3',\n lg: 'gap-4',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n gap: 'md',\n },\n});\n\n/**\n * Selection indicator variants (for both radio and checkbox).\n * Renders as a rounded indicator with border.\n */\nexport const selectionIndicatorVariants = cva(\n 'shrink-0 rounded-full border shadow-xs transition-all flex items-center justify-center',\n {\n variants: {\n size: {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/**\n * Checkbox indicator variants (square with rounded corners).\n */\nexport const checkboxIndicatorVariants = cva(\n 'shrink-0 border shadow-xs transition-[border-color,background-color,color,box-shadow] duration-200 ease-out motion-reduce:transition-none flex items-center justify-center',\n {\n variants: {\n size: {\n sm: 'size-4 rounded-[4px]',\n md: 'size-5 rounded-[5px]',\n lg: 'size-6 rounded-[6px]',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/**\n * Inner dot sizes for radio indicators when checked.\n */\nexport const innerDotSizes: Record<SelectionSize, string> = {\n sm: 'size-2',\n md: 'size-3',\n lg: 'size-4',\n};\n\n/**\n * Text size classes for selection labels.\n */\nexport const textSizeClasses: Record<SelectionSize, string> = {\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\n/**\n * Icon size classes for checkbox indicators.\n */\nexport const iconSizeClasses: Record<SelectionSize, string> = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-5',\n};\n\n// =============================================================================\n// Draw-on checkmark SVG (shared delight animation)\n// =============================================================================\n\nexport const CHECKMARK_PATH = 'M4 12l5 5L20 6';\n\nexport function DrawCheck({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(className, 'delight-check-draw')}\n >\n <path d={CHECKMARK_PATH} />\n </svg>\n );\n}\n\n// =============================================================================\n// SelectionIndicator Component\n// =============================================================================\n\nexport interface SelectionIndicatorProps {\n /** Type of indicator to render */\n type: 'checkbox' | 'radio';\n /** Whether the indicator is checked */\n checked?: boolean;\n /** Whether the indicator is disabled */\n disabled?: boolean;\n /** Size of the indicator */\n size?: SelectionSize;\n /** Color of the indicator */\n color?: SelectionColor;\n /** Additional CSS classes */\n className?: string;\n /** Whether the checkbox is in indeterminate state (checkbox only) */\n indeterminate?: boolean;\n}\n\n/**\n * SelectionIndicator renders either a checkbox or radio indicator based on type.\n * For checkbox: renders a check icon when checked.\n * For radio: renders an inner dot when checked.\n */\nconst SelectionIndicator = React.forwardRef<\n HTMLSpanElement,\n SelectionIndicatorProps\n>(\n (\n {\n type,\n checked = false,\n disabled = false,\n size = 'sm',\n color = 'primary',\n className,\n indeterminate = false,\n },\n ref,\n ) => {\n const colors = selectionColorClasses[color];\n\n if (type === 'checkbox') {\n return (\n <span\n ref={ref}\n data-slot=\"selection-indicator\"\n data-type=\"checkbox\"\n data-checked={checked}\n data-indeterminate={indeterminate || undefined}\n className={cn(\n checkboxIndicatorVariants({ size }),\n checked || indeterminate\n ? cn(\n colors.indicatorChecked,\n colors.border,\n colors.text,\n 'border',\n 'delight-check-bounce',\n )\n : 'border-input bg-background',\n disabled && 'opacity-50',\n className,\n )}\n aria-hidden=\"true\"\n >\n {(checked || indeterminate) &&\n (indeterminate ? (\n <Minus\n className={cn(\n iconSizeClasses[size],\n 'animate-[scale-in_150ms_ease-out] motion-reduce:animate-none',\n )}\n strokeWidth={3}\n />\n ) : (\n <DrawCheck className={iconSizeClasses[size]} />\n ))}\n </span>\n );\n }\n\n // Radio type\n return (\n <span\n ref={ref}\n data-slot=\"selection-indicator\"\n data-type=\"radio\"\n data-checked={checked}\n className={cn(\n selectionIndicatorVariants({ size }),\n 'transition-[background-color,border-color] duration-150 motion-reduce:transition-none',\n 'border-input bg-transparent',\n disabled && 'opacity-50',\n className,\n )}\n aria-hidden=\"true\"\n >\n <span\n className={cn(\n 'rounded-full transition-transform duration-150 ease-out motion-reduce:transition-none',\n colors.indicatorChecked,\n innerDotSizes[size],\n checked ? 'scale-100' : 'scale-0',\n )}\n />\n </span>\n );\n },\n);\n\nSelectionIndicator.displayName = 'SelectionIndicator';\n\n// =============================================================================\n// FeaturedIcon Component\n// =============================================================================\n\nexport interface FeaturedIconProps {\n /** The icon content to display */\n children: React.ReactNode;\n /** Size of the featured icon container */\n size?: SelectionSize;\n /** Additional CSS classes */\n className?: string;\n}\n\n// Hoisted outside component to avoid recreation on every render\nconst featuredIconContainerSizes: Record<SelectionSize, string> = {\n sm: 'size-8',\n md: 'size-10',\n lg: 'size-12',\n};\n\nconst featuredIconInnerSizes: Record<SelectionSize, string> = {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n};\n\n/**\n * FeaturedIcon is a container for icons with border and shadow.\n * Used in icon-simple and icon-card variants.\n */\nconst FeaturedIcon = React.forwardRef<HTMLDivElement, FeaturedIconProps>(\n ({ children, size = 'sm', className }, ref) => {\n const containerSize = featuredIconContainerSizes[size];\n const innerSize = featuredIconInnerSizes[size];\n\n return (\n <div\n ref={ref}\n data-slot=\"featured-icon\"\n className={cn(\n 'shrink-0 rounded-md border border-border bg-card/60',\n 'flex items-center justify-center',\n 'dark:border-border',\n containerSize,\n className,\n )}\n style={{\n boxShadow: 'var(--shadow-inset-ring)',\n }}\n >\n <div className={cn('text-secondary-foreground', innerSize)}>\n {children}\n </div>\n </div>\n );\n },\n);\n\nFeaturedIcon.displayName = 'FeaturedIcon';\n\n// =============================================================================\n// ColorDot Component\n// =============================================================================\n\nexport type ColorDotColor =\n | 'gray'\n | 'orange'\n | 'red'\n | 'darkRed'\n | 'brand'\n | 'success'\n | 'warning'\n | 'error'\n | string; // Allow custom hex colors\n\nconst dotColorMap: Record<string, string> = {\n gray: 'bg-muted',\n orange: 'bg-warning',\n red: 'bg-destructive',\n darkRed: 'bg-destructive-hover',\n brand: 'bg-primary/10',\n success: 'bg-success/10',\n warning: 'bg-warning/10',\n error: 'bg-destructive/10',\n};\n\nconst dotSizeMap: Record<SelectionSize, string> = {\n sm: 'size-[10px]',\n md: 'size-3',\n lg: 'size-3.5',\n};\n\nexport interface ColorDotProps {\n /** Color of the dot (named color or hex) */\n color?: ColorDotColor;\n /** Size of the dot */\n size?: SelectionSize;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * ColorDot renders a colored dot for chip variant.\n * Supports named colors (gray, orange, red, etc.) and hex colors.\n */\nconst ColorDot = React.forwardRef<HTMLSpanElement, ColorDotProps>(\n ({ color, size = 'sm', className }, ref) => {\n if (!color) return null;\n\n const colorClass = dotColorMap[color];\n const isHexColor = color.startsWith('#');\n\n return (\n <span\n ref={ref}\n data-slot=\"color-dot\"\n className={cn(\n 'shrink-0 rounded-full',\n dotSizeMap[size],\n !isHexColor && colorClass,\n className,\n )}\n style={isHexColor ? { backgroundColor: color } : undefined}\n aria-hidden=\"true\"\n />\n );\n },\n);\n\nColorDot.displayName = 'ColorDot';\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ColorDot, FeaturedIcon, SelectionIndicator };\n"],"mappings":"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"}
1
+ {"version":3,"file":"selection-group.js","names":[],"sources":["../../src/components/ui/selection-group.tsx"],"sourcesContent":["'use client';\n\nimport { cva } from 'class-variance-authority';\nimport { Minus } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SelectionColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'warning'\n | 'info'\n | 'destructive';\n\nexport type SelectionSize = 'sm' | 'md' | 'lg';\n\nexport type SelectionVariant =\n | 'default'\n | 'card'\n | 'pill'\n | 'stacked'\n | 'icon-simple'\n | 'icon-card'\n | 'avatar'\n | 'payment'\n | 'simple'\n | 'chip';\n\nexport interface SelectionItem {\n /** Unique value for the option */\n value: string;\n /** Display label */\n label: string;\n /** Whether this option is disabled */\n disabled?: boolean;\n /** Secondary text (e.g., \"$10/month\") */\n subtext?: string;\n /** Supporting description text */\n description?: string;\n /** Leading icon component */\n icon?: React.ReactNode;\n /** Avatar element */\n avatar?: React.ReactNode;\n /** Image URL */\n image?: string;\n /** Alt text for the image (defaults to \"\" if omitted) */\n imageAlt?: string;\n /** Position of the image */\n imagePosition?: 'top' | 'left' | 'trailing';\n /** Badge element */\n badge?: React.ReactNode;\n /** Dot color for chip variant (named color or hex) */\n dotColor?: string;\n /** Price display (e.g., \"$10\") */\n price?: string;\n /** Price period (e.g., \"per month\") */\n pricePeriod?: string;\n /** Payment icon element */\n paymentIcon?: React.ReactNode;\n /** Action buttons */\n actions?: React.ReactNode;\n}\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\ninterface UseSelectionStateOptions {\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled mode */\n defaultValue?: string;\n /** Callback when value changes */\n onValueChange?: (value: string) => void;\n}\n\n/**\n * Hook for managing single selection state (radio behavior).\n * Supports both controlled and uncontrolled modes.\n */\nexport function useSelectionState(\n options: UseSelectionStateOptions = {},\n): [string | undefined, (value: string) => void] {\n const { value: controlledValue, defaultValue, onValueChange } = options;\n\n const [internalValue, setInternalValue] = React.useState<string | undefined>(\n defaultValue,\n );\n\n const isControlled = controlledValue !== undefined;\n const selectedValue = isControlled ? controlledValue : internalValue;\n\n const setValue = React.useCallback(\n (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onValueChange?.(newValue);\n },\n [isControlled, onValueChange],\n );\n\n return [selectedValue, setValue];\n}\n\ninterface UseMultiSelectionStateOptions {\n /** Controlled value */\n value?: string[];\n /** Default value for uncontrolled mode */\n defaultValue?: string[];\n /** Callback when value changes */\n onValueChange?: (value: string[]) => void;\n}\n\n/**\n * Hook for managing multi selection state (checkbox behavior).\n * Supports both controlled and uncontrolled modes.\n */\nexport function useMultiSelectionState(\n options: UseMultiSelectionStateOptions = {},\n): [string[], (value: string, checked: boolean) => void] {\n const { value: controlledValue, defaultValue = [], onValueChange } = options;\n\n const [internalValue, setInternalValue] =\n React.useState<string[]>(defaultValue);\n\n const isControlled = controlledValue !== undefined;\n const selectedValues = isControlled ? controlledValue : internalValue;\n\n const setValue = React.useCallback(\n (itemValue: string, checked: boolean) => {\n const newValue = checked\n ? [...selectedValues, itemValue]\n : selectedValues.filter((v) => v !== itemValue);\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onValueChange?.(newValue);\n },\n [isControlled, selectedValues, onValueChange],\n );\n\n return [selectedValues, setValue];\n}\n\n// =============================================================================\n// Color Mappings\n// =============================================================================\n\nexport const selectionColorClasses: Record<\n SelectionColor,\n {\n indicator: string;\n indicatorChecked: string;\n border: string;\n bg: string;\n text: string;\n }\n> = {\n primary: {\n indicator: 'border-primary',\n indicatorChecked: 'bg-primary',\n border: 'border-primary',\n bg: 'bg-primary',\n text: 'text-primary-foreground',\n },\n secondary: {\n indicator: 'border-secondary',\n indicatorChecked: 'bg-secondary-foreground',\n border: 'border-secondary',\n bg: 'bg-secondary',\n text: 'text-secondary-foreground',\n },\n success: {\n indicator: 'border-success',\n indicatorChecked: 'bg-success',\n border: 'border-success',\n bg: 'bg-success',\n text: 'text-primary-foreground',\n },\n warning: {\n indicator: 'border-warning',\n indicatorChecked: 'bg-warning',\n border: 'border-warning',\n bg: 'bg-warning',\n text: 'text-primary-foreground',\n },\n info: {\n indicator: 'border-info',\n indicatorChecked: 'bg-info',\n border: 'border-info',\n bg: 'bg-info',\n text: 'text-primary-foreground',\n },\n destructive: {\n indicator: 'border-destructive',\n indicatorChecked: 'bg-destructive',\n border: 'border-destructive',\n bg: 'bg-destructive',\n text: 'text-primary-foreground',\n },\n};\n\n// =============================================================================\n// CVA Variants\n// =============================================================================\n\n/**\n * Selection group container variants.\n * Used for the outer wrapper of a group of selection items.\n */\nexport const selectionGroupVariants = cva('flex', {\n variants: {\n orientation: {\n horizontal: 'flex-row flex-wrap',\n vertical: 'flex-col',\n },\n gap: {\n sm: 'gap-2',\n md: 'gap-3',\n lg: 'gap-4',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n gap: 'md',\n },\n});\n\n/**\n * Selection indicator variants (for both radio and checkbox).\n * Renders as a rounded indicator with border.\n */\nexport const selectionIndicatorVariants = cva(\n 'shrink-0 rounded-full border shadow-xs transition-all flex items-center justify-center',\n {\n variants: {\n size: {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/**\n * Checkbox indicator variants (square with rounded corners).\n */\nexport const checkboxIndicatorVariants = cva(\n 'shrink-0 border shadow-xs transition-[border-color,background-color,color,box-shadow] duration-200 ease-out motion-reduce:transition-none flex items-center justify-center',\n {\n variants: {\n size: {\n sm: 'size-4 rounded-[4px]',\n md: 'size-5 rounded-[5px]',\n lg: 'size-6 rounded-[6px]',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/**\n * Inner dot sizes for radio indicators when checked.\n */\nexport const innerDotSizes: Record<SelectionSize, string> = {\n sm: 'size-2',\n md: 'size-3',\n lg: 'size-4',\n};\n\n/**\n * Text size classes for selection labels.\n */\nexport const textSizeClasses: Record<SelectionSize, string> = {\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\n/**\n * Icon size classes for checkbox indicators.\n */\nexport const iconSizeClasses: Record<SelectionSize, string> = {\n sm: 'size-3',\n md: 'size-3.5',\n lg: 'size-5',\n};\n\n// =============================================================================\n// Draw-on checkmark SVG (shared delight animation)\n// =============================================================================\n\nexport const CHECKMARK_PATH = 'M4 12l5 5L20 6';\n\nexport function DrawCheck({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(className, 'delight-check-draw')}\n >\n <path d={CHECKMARK_PATH} />\n </svg>\n );\n}\n\n// =============================================================================\n// SelectionIndicator Component\n// =============================================================================\n\nexport interface SelectionIndicatorProps {\n /** Type of indicator to render */\n type: 'checkbox' | 'radio';\n /** Whether the indicator is checked */\n checked?: boolean;\n /** Whether the indicator is disabled */\n disabled?: boolean;\n /** Size of the indicator */\n size?: SelectionSize;\n /** Color of the indicator */\n color?: SelectionColor;\n /** Additional CSS classes */\n className?: string;\n /** Whether the checkbox is in indeterminate state (checkbox only) */\n indeterminate?: boolean;\n}\n\n/**\n * SelectionIndicator renders either a checkbox or radio indicator based on type.\n * For checkbox: renders a check icon when checked.\n * For radio: renders an inner dot when checked.\n */\nconst SelectionIndicator = React.forwardRef<\n HTMLSpanElement,\n SelectionIndicatorProps\n>(\n (\n {\n type,\n checked = false,\n disabled = false,\n size = 'sm',\n color = 'primary',\n className,\n indeterminate = false,\n },\n ref,\n ) => {\n const colors = selectionColorClasses[color];\n\n if (type === 'checkbox') {\n return (\n <span\n ref={ref}\n data-slot=\"selection-indicator\"\n data-type=\"checkbox\"\n data-checked={checked}\n data-indeterminate={indeterminate || undefined}\n className={cn(\n checkboxIndicatorVariants({ size }),\n checked || indeterminate\n ? cn(\n colors.indicatorChecked,\n colors.border,\n colors.text,\n 'border',\n 'delight-check-bounce',\n )\n : 'border-input bg-background',\n disabled && 'opacity-50',\n className,\n )}\n aria-hidden=\"true\"\n >\n {(checked || indeterminate) &&\n (indeterminate ? (\n <Minus\n className={cn(\n iconSizeClasses[size],\n 'animate-[scale-in_150ms_ease-out] motion-reduce:animate-none',\n )}\n strokeWidth={3}\n />\n ) : (\n <DrawCheck className={iconSizeClasses[size]} />\n ))}\n </span>\n );\n }\n\n // Radio type\n return (\n <span\n ref={ref}\n data-slot=\"selection-indicator\"\n data-type=\"radio\"\n data-checked={checked}\n className={cn(\n selectionIndicatorVariants({ size }),\n 'transition-[background-color,border-color] duration-150 motion-reduce:transition-none',\n 'border-input bg-transparent',\n disabled && 'opacity-50',\n className,\n )}\n aria-hidden=\"true\"\n >\n <span\n className={cn(\n 'rounded-full transition-transform duration-150 ease-out motion-reduce:transition-none',\n colors.indicatorChecked,\n innerDotSizes[size],\n checked ? 'scale-100' : 'scale-0',\n )}\n />\n </span>\n );\n },\n);\n\nSelectionIndicator.displayName = 'SelectionIndicator';\n\n// =============================================================================\n// FeaturedIcon Component\n// =============================================================================\n\nexport interface FeaturedIconProps {\n /** The icon content to display */\n children: React.ReactNode;\n /** Size of the featured icon container */\n size?: SelectionSize;\n /** Additional CSS classes */\n className?: string;\n}\n\n// Hoisted outside component to avoid recreation on every render\nconst featuredIconContainerSizes: Record<SelectionSize, string> = {\n sm: 'size-8',\n md: 'size-10',\n lg: 'size-12',\n};\n\nconst featuredIconInnerSizes: Record<SelectionSize, string> = {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n};\n\n/**\n * FeaturedIcon is a container for icons with border and shadow.\n * Used in icon-simple and icon-card variants.\n */\nconst FeaturedIcon = React.forwardRef<HTMLDivElement, FeaturedIconProps>(\n ({ children, size = 'sm', className }, ref) => {\n const containerSize = featuredIconContainerSizes[size];\n const innerSize = featuredIconInnerSizes[size];\n\n return (\n <div\n ref={ref}\n data-slot=\"featured-icon\"\n className={cn(\n 'shrink-0 rounded-md border border-border bg-card/60',\n 'flex items-center justify-center',\n 'dark:border-border',\n containerSize,\n className,\n )}\n style={{\n boxShadow: 'var(--shadow-inset-ring)',\n }}\n >\n <div\n className={cn(\n 'text-secondary-foreground [&>svg]:block [&>svg]:size-full',\n innerSize,\n )}\n >\n {children}\n </div>\n </div>\n );\n },\n);\n\nFeaturedIcon.displayName = 'FeaturedIcon';\n\n// =============================================================================\n// ColorDot Component\n// =============================================================================\n\nexport type ColorDotColor =\n | 'gray'\n | 'orange'\n | 'red'\n | 'darkRed'\n | 'brand'\n | 'success'\n | 'warning'\n | 'error'\n | string; // Allow custom hex colors\n\nconst dotColorMap: Record<string, string> = {\n gray: 'bg-muted',\n orange: 'bg-warning',\n red: 'bg-destructive',\n darkRed: 'bg-destructive-hover',\n brand: 'bg-primary/10',\n success: 'bg-success/10',\n warning: 'bg-warning/10',\n error: 'bg-destructive/10',\n};\n\nconst dotSizeMap: Record<SelectionSize, string> = {\n sm: 'size-[10px]',\n md: 'size-3',\n lg: 'size-3.5',\n};\n\nexport interface ColorDotProps {\n /** Color of the dot (named color or hex) */\n color?: ColorDotColor;\n /** Size of the dot */\n size?: SelectionSize;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * ColorDot renders a colored dot for chip variant.\n * Supports named colors (gray, orange, red, etc.) and hex colors.\n */\nconst ColorDot = React.forwardRef<HTMLSpanElement, ColorDotProps>(\n ({ color, size = 'sm', className }, ref) => {\n if (!color) return null;\n\n const colorClass = dotColorMap[color];\n const isHexColor = color.startsWith('#');\n\n return (\n <span\n ref={ref}\n data-slot=\"color-dot\"\n className={cn(\n 'shrink-0 rounded-full',\n dotSizeMap[size],\n !isHexColor && colorClass,\n className,\n )}\n style={isHexColor ? { backgroundColor: color } : undefined}\n aria-hidden=\"true\"\n />\n );\n },\n);\n\nColorDot.displayName = 'ColorDot';\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ColorDot, FeaturedIcon, SelectionIndicator };\n"],"mappings":"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"}
@@ -2,6 +2,9 @@ import { n as g, t as d } from "./useIsoLayoutEffect.js";
2
2
  import { n as A, t as c } from "./useAnimationFrame.js";
3
3
  import * as m from "react";
4
4
  import * as v from "react-dom";
5
+ function b(t) {
6
+ return t == null ? t : "current" in t ? t.current : t;
7
+ }
5
8
  function p(t, a = !1, o = !1) {
6
9
  const [e, r] = m.useState(t && a ? "idle" : void 0), [n, i] = m.useState(t);
7
10
  return t && !n && (i(!0), r("starting")), !t && n && e !== "ending" && !o && r("ending"), !t && !n && e === "ending" && r(void 0), d(() => {
@@ -46,19 +49,11 @@ function p(t, a = !1, o = !1) {
46
49
  transitionStatus: e
47
50
  };
48
51
  }
49
- var q = /* @__PURE__ */ (function(t) {
50
- return t.startingStyle = "data-starting-style", t.endingStyle = "data-ending-style", t;
51
- })({}), b = { "data-starting-style": "" }, h = { "data-ending-style": "" }, F = { transitionStatus(t) {
52
- return t === "starting" ? b : t === "ending" ? h : null;
53
- } };
54
- function O(t) {
55
- return t == null ? t : "current" in t ? t.current : t;
56
- }
57
- function S(t, a = !1) {
52
+ function h(t, a = !1) {
58
53
  const o = A();
59
54
  return g((e, r = null) => {
60
55
  o.cancel();
61
- const n = O(t);
56
+ const n = b(t);
62
57
  if (n == null) return;
63
58
  const i = n, s = () => {
64
59
  v.flushSync(e);
@@ -98,8 +93,8 @@ function S(t, a = !1) {
98
93
  o.request(f);
99
94
  });
100
95
  }
101
- function M(t) {
102
- const { enabled: a = !0, open: o, ref: e, onComplete: r } = t, n = g(r), i = S(e, o);
96
+ function q(t) {
97
+ const { enabled: a = !0, open: o, ref: e, onComplete: r } = t, n = g(r), i = h(e, o);
103
98
  m.useEffect(() => {
104
99
  if (!a) return;
105
100
  const s = new AbortController();
@@ -113,13 +108,18 @@ function M(t) {
113
108
  i
114
109
  ]);
115
110
  }
111
+ var F = /* @__PURE__ */ (function(t) {
112
+ return t.startingStyle = "data-starting-style", t.endingStyle = "data-ending-style", t;
113
+ })({}), O = { "data-starting-style": "" }, S = { "data-ending-style": "" }, M = { transitionStatus(t) {
114
+ return t === "starting" ? O : t === "ending" ? S : null;
115
+ } };
116
116
  export {
117
- F as a,
118
- q as i,
119
- S as n,
120
- p as o,
121
- O as r,
122
- M as t
117
+ p as a,
118
+ h as i,
119
+ M as n,
120
+ b as o,
121
+ q as r,
122
+ F as t
123
123
  };
124
124
 
125
- //# sourceMappingURL=useOpenChangeComplete.js.map
125
+ //# sourceMappingURL=stateAttributesMapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateAttributesMapping.js","names":["React"],"sources":["../../../../node_modules/.bun/@base-ui+react@1.7.0+8a291ac5721f2b4f/node_modules/@base-ui/react/utils/resolveRef.mjs","../../../../node_modules/.bun/@base-ui+react@1.7.0+8a291ac5721f2b4f/node_modules/@base-ui/react/internals/useTransitionStatus.mjs","../../../../node_modules/.bun/@base-ui+react@1.7.0+8a291ac5721f2b4f/node_modules/@base-ui/react/internals/useAnimationsFinished.mjs","../../../../node_modules/.bun/@base-ui+react@1.7.0+8a291ac5721f2b4f/node_modules/@base-ui/react/internals/useOpenChangeComplete.mjs","../../../../node_modules/.bun/@base-ui+react@1.7.0+8a291ac5721f2b4f/node_modules/@base-ui/react/internals/stateAttributesMapping.mjs"],"sourcesContent":["/**\n * If the provided argument is a ref object, returns its `current` value.\n * Otherwise, returns the argument itself.\n */\nexport function resolveRef(maybeRef) {\n if (maybeRef == null) {\n return maybeRef;\n }\n return 'current' in maybeRef ? maybeRef.current : maybeRef;\n}","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { AnimationFrame } from '@base-ui/utils/useAnimationFrame';\n/**\n * Provides a status string for CSS animations.\n * @param open - a boolean that determines if the element is open.\n * @param enableIdleState - a boolean that enables the `'idle'` state between `'starting'` and `'ending'`\n */\nexport function useTransitionStatus(open, enableIdleState = false, deferEndingState = false) {\n const [transitionStatus, setTransitionStatus] = React.useState(open && enableIdleState ? 'idle' : undefined);\n const [mounted, setMounted] = React.useState(open);\n if (open && !mounted) {\n setMounted(true);\n setTransitionStatus('starting');\n }\n if (!open && mounted && transitionStatus !== 'ending' && !deferEndingState) {\n setTransitionStatus('ending');\n }\n if (!open && !mounted && transitionStatus === 'ending') {\n setTransitionStatus(undefined);\n }\n useIsoLayoutEffect(() => {\n if (!open && mounted && transitionStatus !== 'ending' && deferEndingState) {\n const frame = AnimationFrame.request(() => {\n setTransitionStatus('ending');\n });\n return () => {\n AnimationFrame.cancel(frame);\n };\n }\n return undefined;\n }, [open, mounted, transitionStatus, deferEndingState]);\n useIsoLayoutEffect(() => {\n if (!open || enableIdleState) {\n return undefined;\n }\n const frame = AnimationFrame.request(() => {\n // Avoid `flushSync` here due to Firefox.\n // See https://github.com/mui/base-ui/pull/3424\n setTransitionStatus(undefined);\n });\n return () => {\n AnimationFrame.cancel(frame);\n };\n }, [enableIdleState, open]);\n useIsoLayoutEffect(() => {\n if (!open || !enableIdleState) {\n return undefined;\n }\n if (open && mounted && transitionStatus !== 'idle') {\n setTransitionStatus('starting');\n }\n const frame = AnimationFrame.request(() => {\n setTransitionStatus('idle');\n });\n return () => {\n AnimationFrame.cancel(frame);\n };\n }, [enableIdleState, open, mounted, transitionStatus]);\n return {\n mounted,\n setMounted,\n transitionStatus\n };\n}","'use client';\n\nimport * as ReactDOM from 'react-dom';\nimport { useAnimationFrame } from '@base-ui/utils/useAnimationFrame';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { resolveRef } from \"../utils/resolveRef.mjs\";\n\n/**\n * Executes a function once all animations have finished on the provided element.\n * If an animation is canceled, waits for any replacement animations before executing.\n * @param elementOrRef - The element to watch for animations.\n * @param waitForStartingStyleRemoved - Whether to wait for [data-starting-style] to be removed before checking for animations.\n * @returns A function that takes a callback to execute once all animations have finished, and an optional AbortSignal to abort the callback\n */\nexport function useAnimationsFinished(elementOrRef, waitForStartingStyleRemoved = false) {\n const frame = useAnimationFrame();\n return useStableCallback((fnToExecute,\n /**\n * An optional [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) that\n * can be used to abort `fnToExecute` before all the animations have finished.\n * @default null\n */\n signal = null) => {\n frame.cancel();\n const element = resolveRef(elementOrRef);\n if (element == null) {\n return;\n }\n const resolvedElement = element;\n const done = () => {\n // Synchronously flush the unmounting of the component so that the browser doesn't\n // paint: https://github.com/mui/base-ui/issues/979\n ReactDOM.flushSync(fnToExecute);\n };\n if (typeof resolvedElement.getAnimations !== 'function' || globalThis.BASE_UI_ANIMATIONS_DISABLED) {\n fnToExecute();\n return;\n }\n function exec() {\n Promise.all(resolvedElement.getAnimations().map(animation => animation.finished)).then(() => {\n if (!signal?.aborted) {\n done();\n }\n }, () => {\n if (signal?.aborted) {\n return;\n }\n const currentAnimations = resolvedElement.getAnimations();\n if (currentAnimations.some(animation => animation.pending || animation.playState !== 'finished')) {\n // Sometimes animations can be aborted because a property they depend on changes while the animation plays.\n // In such cases, we need to re-check if any new animations have started.\n exec();\n return;\n }\n done();\n });\n }\n if (waitForStartingStyleRemoved) {\n const startingStyleAttribute = 'data-starting-style';\n\n // If `[data-starting-style]` isn't present, fall back to waiting one more frame\n // to give \"open\" animations a chance to be registered.\n if (!resolvedElement.hasAttribute(startingStyleAttribute)) {\n frame.request(exec);\n return;\n }\n\n // Wait for `[data-starting-style]` to have been removed.\n const attributeObserver = new MutationObserver(() => {\n if (!resolvedElement.hasAttribute(startingStyleAttribute)) {\n attributeObserver.disconnect();\n exec();\n }\n });\n attributeObserver.observe(resolvedElement, {\n attributes: true,\n attributeFilter: [startingStyleAttribute]\n });\n signal?.addEventListener('abort', () => attributeObserver.disconnect(), {\n once: true\n });\n return;\n }\n frame.request(exec);\n });\n}","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useAnimationsFinished } from \"./useAnimationsFinished.mjs\";\n\n/**\n * Calls the provided function when the CSS open/close animation or transition completes.\n */\nexport function useOpenChangeComplete(parameters) {\n const {\n enabled = true,\n open,\n ref,\n onComplete: onCompleteParam\n } = parameters;\n const onComplete = useStableCallback(onCompleteParam);\n const runOnceAnimationsFinish = useAnimationsFinished(ref, open);\n React.useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n const abortController = new AbortController();\n runOnceAnimationsFinish(onComplete, abortController.signal);\n return () => {\n abortController.abort();\n };\n }, [enabled, open, onComplete, runOnceAnimationsFinish]);\n}","export let TransitionStatusDataAttributes = /*#__PURE__*/function (TransitionStatusDataAttributes) {\n /**\n * Present when the component begins animating in.\n */\n TransitionStatusDataAttributes[\"startingStyle\"] = \"data-starting-style\";\n /**\n * Present when the component is animating out.\n */\n TransitionStatusDataAttributes[\"endingStyle\"] = \"data-ending-style\";\n return TransitionStatusDataAttributes;\n}({});\nconst STARTING_HOOK = {\n 'data-starting-style': ''\n};\nconst ENDING_HOOK = {\n 'data-ending-style': ''\n};\nexport const transitionStatusMapping = {\n transitionStatus(value) {\n if (value === 'starting') {\n return STARTING_HOOK;\n }\n if (value === 'ending') {\n return ENDING_HOOK;\n }\n return null;\n }\n};"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Et as W, St as _, u as M } from "./vendor/recharts.js";
1
+ import { bt as W, u as M, wt as _ } from "./vendor/recharts.js";
2
2
  import { n as y } from "./chunk-Y2CYZVJY.js";
3
3
  import { t as S } from "./chunk-X3CZISLH.js";
4
4
  import { O as G, c as P, s as T, x as t } from "./chunk-DU6HZSFF.js";
@@ -87,11 +87,11 @@ var J = /* @__PURE__ */ y((e) => e.append("circle").attr("class", "start-state")
87
87
  }
88
88
  }, "getRelationType");
89
89
  i.points = i.points.filter((s) => !Number.isNaN(s.y));
90
- const n = i.points, x = W().x(function(s) {
90
+ const n = i.points, x = _().x(function(s) {
91
91
  return s.x;
92
92
  }).y(function(s) {
93
93
  return s.y;
94
- }).curve(_), p = e.append("path").attr("d", x(n)).attr("id", "edge" + L).attr("class", "transition");
94
+ }).curve(W), p = e.append("path").attr("d", x(n)).attr("id", "edge" + L).attr("class", "transition");
95
95
  let a = "";
96
96
  if (t().state.arrowMarkerAbsolute && (a = G(!0)), p.attr("marker-end", "url(" + a + "#" + o(N.relationType.DEPENDENCY) + "End)"), d.title !== void 0) {
97
97
  const s = e.append("g").attr("class", "stateLabel"), { x: h, y: g } = R.calcLabelPosition(i.points), c = T.getRows(d.title);
@@ -1,9 +1,9 @@
1
- import { Ot as lt, u as Z } from "./vendor/recharts.js";
1
+ import { Et as lt, u as Z } from "./vendor/recharts.js";
2
2
  import { n as o, t as Ct } from "./chunk-Y2CYZVJY.js";
3
3
  import { t as b } from "./chunk-X3CZISLH.js";
4
4
  import { J as gt, a as Wt, b as ft, et as Pt, o as Bt, rt as Vt, tt as Ft, x as yt } from "./chunk-DU6HZSFF.js";
5
- import { p as Ot } from "./chunk-75Z2AOVW.js";
6
- import { a as zt } from "./mermaid.core.js";
5
+ import { p as zt } from "./chunk-75Z2AOVW.js";
6
+ import { a as Ot } from "./mermaid.core.js";
7
7
  var tt = (function() {
8
8
  var e = /* @__PURE__ */ o(function(i, l, u, h) {
9
9
  for (u = u || {}, h = i.length; h--; u[i[h]] = l) ;
@@ -218,7 +218,7 @@ var tt = (function() {
218
218
  return typeof P != "number" && (P instanceof Array && (g = P, P = g.pop()), P = u.symbols_[P] || P), P;
219
219
  }
220
220
  o($, "lex");
221
- for (var _, H, C, N, D, G = {}, K, O, ot, j; ; ) {
221
+ for (var _, H, C, N, D, G = {}, K, z, ot, j; ; ) {
222
222
  if (C = h[h.length - 1], this.defaultActions[C] ? N = this.defaultActions[C] : ((_ === null || typeof _ > "u") && (_ = $()), N = S[C] && S[C][_]), typeof N > "u" || !N.length || !N[0]) {
223
223
  var Y = "";
224
224
  j = [];
@@ -239,12 +239,12 @@ Expecting ` + j.join(", ") + ", got '" + (this.terminals_[_] || _) + "'" : Y = "
239
239
  h.push(_), x.push(w.yytext), p.push(w.yylloc), h.push(N[1]), _ = null, H ? (_ = H, H = null) : (W = w.yyleng, k = w.yytext, L = w.yylineno, T = w.yylloc, B > 0 && B--);
240
240
  break;
241
241
  case 2:
242
- if (O = this.productions_[N[1]][1], G.$ = x[x.length - O], G._$ = {
243
- first_line: p[p.length - (O || 1)].first_line,
242
+ if (z = this.productions_[N[1]][1], G.$ = x[x.length - z], G._$ = {
243
+ first_line: p[p.length - (z || 1)].first_line,
244
244
  last_line: p[p.length - 1].last_line,
245
- first_column: p[p.length - (O || 1)].first_column,
245
+ first_column: p[p.length - (z || 1)].first_column,
246
246
  last_column: p[p.length - 1].last_column
247
- }, v && (G._$.range = [p[p.length - (O || 1)].range[0], p[p.length - 1].range[1]]), D = this.performAction.apply(G, [
247
+ }, v && (G._$.range = [p[p.length - (z || 1)].range[0], p[p.length - 1].range[1]]), D = this.performAction.apply(G, [
248
248
  k,
249
249
  W,
250
250
  L,
@@ -253,7 +253,7 @@ Expecting ` + j.join(", ") + ", got '" + (this.terminals_[_] || _) + "'" : Y = "
253
253
  x,
254
254
  p
255
255
  ].concat(R)), typeof D < "u") return D;
256
- O && (h = h.slice(0, -1 * O * 2), x = x.slice(0, -1 * O), p = p.slice(0, -1 * O)), h.push(this.productions_[N[1]][0]), x.push(G.$), p.push(G._$), ot = S[h[h.length - 2]][h[h.length - 1]], h.push(ot);
256
+ z && (h = h.slice(0, -1 * z * 2), x = x.slice(0, -1 * z), p = p.slice(0, -1 * z)), h.push(this.productions_[N[1]][0]), x.push(G.$), p.push(G._$), ot = S[h[h.length - 2]][h[h.length - 1]], h.push(ot);
257
257
  break;
258
258
  case 3:
259
259
  return !0;
@@ -844,10 +844,10 @@ var Yt = /* @__PURE__ */ o(function(e, t, n, a, r, c = !1) {
844
844
  setConf: /* @__PURE__ */ o(() => {
845
845
  }, "setConf"),
846
846
  draw: ne
847
- }, Q = 200, z = 5, se = Q + z * 2, at = Q + 100, ae = at + z * 2, Mt = 10, oe = 0, dt = 20, At = 20, ut = 30, Rt = 50, le = /* @__PURE__ */ o(function(e, t, n, a) {
847
+ }, Q = 200, O = 5, se = Q + O * 2, at = Q + 100, ae = at + O * 2, Mt = 10, oe = 0, dt = 20, At = 20, ut = 30, Rt = 50, le = /* @__PURE__ */ o(function(e, t, n, a) {
848
848
  const r = yt(), c = r.timeline?.leftMargin ?? 50;
849
849
  b.debug("timeline", a.db);
850
- const s = zt(t);
850
+ const s = Ot(t);
851
851
  s.append("g");
852
852
  const d = a.db.getTasks(), y = a.db.getCommonDb().getDiagramTitle();
853
853
  b.debug("task", d), A.initGraphics(s);
@@ -858,14 +858,14 @@ var Yt = /* @__PURE__ */ o(function(e, t, n, a, r, c = !1) {
858
858
  let u = 50;
859
859
  const h = u, g = l, x = se + At, p = ae + Rt, S = g + x;
860
860
  let k = 0;
861
- const L = f && f.length > 0, W = L ? S : l + x, B = Math.max(50, x + p - z * 2);
861
+ const L = f && f.length > 0, W = L ? S : l + x, B = Math.max(50, x + p - O * 2);
862
862
  f.forEach(function(v) {
863
863
  const E = {
864
864
  number: k,
865
865
  descr: v,
866
866
  section: k,
867
867
  width: B,
868
- padding: z,
868
+ padding: O,
869
869
  maxHeight: m
870
870
  }, $ = A.getVirtualNodeHeight(s, E, r);
871
871
  b.debug("sectionHeight before draw", $), m = Math.max(m, $);
@@ -878,7 +878,7 @@ var Yt = /* @__PURE__ */ o(function(e, t, n, a, r, c = !1) {
878
878
  descr: E,
879
879
  section: E.section,
880
880
  width: Q,
881
- padding: z,
881
+ padding: O,
882
882
  maxHeight: i
883
883
  }, _ = A.getVirtualNodeHeight(s, $, r);
884
884
  b.debug("taskHeight before draw", _), i = Math.max(i, _);
@@ -889,7 +889,7 @@ var Yt = /* @__PURE__ */ o(function(e, t, n, a, r, c = !1) {
889
889
  section: E.section,
890
890
  number: E.section,
891
891
  width: at,
892
- padding: z,
892
+ padding: O,
893
893
  maxHeight: 50
894
894
  };
895
895
  H += A.getVirtualNodeHeight(s, N, r);
@@ -904,7 +904,7 @@ var Yt = /* @__PURE__ */ o(function(e, t, n, a, r, c = !1) {
904
904
  descr: v,
905
905
  section: k,
906
906
  width: B,
907
- padding: z,
907
+ padding: O,
908
908
  maxHeight: m
909
909
  };
910
910
  b.debug("sectionNode", $);
@@ -923,7 +923,7 @@ var Yt = /* @__PURE__ */ o(function(e, t, n, a, r, c = !1) {
923
923
  if (s.append("text").text(y).attr("x", R.width / 2 - c).attr("font-size", "4ex").attr("font-weight", "bold").attr("y", 20), R = s.node()?.getBBox(), !R) throw new Error("bbox not found");
924
924
  b.debug("bounds after title", R);
925
925
  }
926
- const [w] = Ot(r.fontSize), M = (w ?? 16) * 2, F = (w ?? 16) * 0.5 + 20, T = s.append("g").attr("class", "lineWrapper");
926
+ const [w] = zt(r.fontSize), M = (w ?? 16) * 2, F = (w ?? 16) * 0.5 + 20, T = s.append("g").attr("class", "lineWrapper");
927
927
  T.append("line").attr("x1", W).attr("y1", h - M).attr("x2", W).attr("y2", R.y + R.height + F).attr("stroke-width", 4).attr("stroke", "black").attr("marker-end", "url(#arrowhead)"), T.lower(), gt(void 0, s, r.timeline?.padding ?? 50, r.timeline?.useMaxWidth ?? !1);
928
928
  }, "draw"), pt = /* @__PURE__ */ o(function(e, t, n, a, r, c, s, d, y) {
929
929
  for (const f of t) {
@@ -932,7 +932,7 @@ var Yt = /* @__PURE__ */ o(function(e, t, n, a, r, c = !1) {
932
932
  section: n,
933
933
  number: n,
934
934
  width: Q,
935
- padding: z,
935
+ padding: O,
936
936
  maxHeight: c
937
937
  };
938
938
  b.debug("taskNode", m);
@@ -953,7 +953,7 @@ var Yt = /* @__PURE__ */ o(function(e, t, n, a, r, c = !1) {
953
953
  section: n,
954
954
  number: n,
955
955
  width: at,
956
- padding: z,
956
+ padding: O,
957
957
  maxHeight: 0
958
958
  };
959
959
  b.debug("eventNode", f);
@@ -7,7 +7,7 @@ import { t as ie } from "./useBaseUiId.js";
7
7
  import { t as ae } from "./addEventListener.js";
8
8
  import { t as b } from "./useAnimationFrame.js";
9
9
  import { t as ue } from "./useValueAsRef.js";
10
- import { i as Y, n as ce, o as le, t as fe } from "./useOpenChangeComplete.js";
10
+ import { a as ce, i as le, r as fe, t as Y } from "./stateAttributesMapping.js";
11
11
  import * as o from "react";
12
12
  function Ie(e) {
13
13
  const { open: r, defaultOpen: i, onOpenChange: l, disabled: u } = e, [n, g] = te({
@@ -15,7 +15,7 @@ function Ie(e) {
15
15
  default: i,
16
16
  name: "Collapsible",
17
17
  state: "open"
18
- }), { mounted: s, setMounted: p, transitionStatus: O } = le(n, !0, !0), c = ie(), [f, m] = o.useState(), h = f === null ? void 0 : f ?? c, I = M((P) => {
18
+ }), { mounted: s, setMounted: p, transitionStatus: O } = ce(n, !0, !0), c = ie(), [f, m] = o.useState(), h = f === null ? void 0 : f ?? c, I = M((P) => {
19
19
  const S = !n, v = $(se, P.nativeEvent);
20
20
  l(S, v), !v.isCanceled && g(S);
21
21
  });
@@ -62,7 +62,7 @@ var B = (function(e) {
62
62
  width: void 0
63
63
  };
64
64
  function xe(e) {
65
- const { externalRef: r, hiddenUntilFound: i, id: l, keepMounted: u, mounted: n, onOpenChange: g, open: s, setMounted: p, setOpen: O, transitionStatus: c } = e, f = o.useRef(null), m = o.useRef(null), [h, I] = o.useState(A), P = o.useRef(A), S = o.useRef(!1), v = o.useRef(s), F = o.useRef(!1), [j, w] = o.useState(!1), C = o.useRef(null), z = ne(r, f), U = ue(s), V = ce(f), D = !s && !n, N = j ? "idle" : c, k = s && (v.current || F.current), q = !s && n && m.current === "css-animation" && h.height === void 0 && h.width === void 0 ? P.current : h, G = i && D && m.current !== "css-animation", d = M((t, a = !0) => {
65
+ const { externalRef: r, hiddenUntilFound: i, id: l, keepMounted: u, mounted: n, onOpenChange: g, open: s, setMounted: p, setOpen: O, transitionStatus: c } = e, f = o.useRef(null), m = o.useRef(null), [h, I] = o.useState(A), P = o.useRef(A), S = o.useRef(!1), v = o.useRef(s), F = o.useRef(!1), [j, w] = o.useState(!1), C = o.useRef(null), z = ne(r, f), U = ue(s), V = le(f), D = !s && !n, N = j ? "idle" : c, k = s && (v.current || F.current), q = !s && n && m.current === "css-animation" && h.height === void 0 && h.width === void 0 ? P.current : h, G = i && D && m.current !== "css-animation", d = M((t, a = !0) => {
66
66
  a && (P.current = t), I(t);
67
67
  }), E = M(() => {
68
68
  C.current?.(), C.current = null;
@@ -1,13 +1,13 @@
1
- import { at as i } from "./vendor/recharts.js";
1
+ import { Ot as i } from "./vendor/recharts.js";
2
2
  import { u } from "./useRenderElement.js";
3
3
  import * as t from "react";
4
4
  var c = i();
5
- function p(r) {
5
+ function a(r) {
6
6
  const o = t.useCallback((e) => r === void 0 ? u : r.subscribeStore(e), [r]), s = t.useCallback(() => r === void 0 ? void 0 : r.store, [r]);
7
7
  return (0, c.useSyncExternalStore)(o, s, () => r?.serverStore);
8
8
  }
9
9
  export {
10
- p as t
10
+ a as t
11
11
  };
12
12
 
13
13
  //# sourceMappingURL=usePopupHandleStore.js.map
@@ -12,8 +12,8 @@ import { o as Xe, s as ct, t as He } from "./element.js";
12
12
  import { t as D } from "./addEventListener.js";
13
13
  import { n as lt, t as Ot } from "./useAnimationFrame.js";
14
14
  import { t as ie } from "./useValueAsRef.js";
15
- import { r as z } from "./useOpenChangeComplete.js";
16
15
  import { n as Re, t as Be } from "./useTimeout.js";
16
+ import { o as z } from "./stateAttributesMapping.js";
17
17
  import * as y from "react";
18
18
  import { jsx as Te, jsxs as It } from "react/jsx-runtime";
19
19
  var ce = 0;