@karakuri-ui/react 0.3.2 → 0.3.4

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 (148) hide show
  1. package/README.md +27 -4
  2. package/dist/components/ui/accordion.js +27 -24
  3. package/dist/components/ui/accordion.js.map +1 -1
  4. package/dist/components/ui/accordion.mjs +27 -24
  5. package/dist/components/ui/accordion.mjs.map +1 -1
  6. package/dist/components/ui/alert.js +45 -27
  7. package/dist/components/ui/alert.js.map +1 -1
  8. package/dist/components/ui/alert.mjs +45 -27
  9. package/dist/components/ui/alert.mjs.map +1 -1
  10. package/dist/components/ui/avatar.js +41 -32
  11. package/dist/components/ui/avatar.js.map +1 -1
  12. package/dist/components/ui/avatar.mjs +41 -32
  13. package/dist/components/ui/avatar.mjs.map +1 -1
  14. package/dist/components/ui/badge.js +46 -43
  15. package/dist/components/ui/badge.js.map +1 -1
  16. package/dist/components/ui/badge.mjs +46 -43
  17. package/dist/components/ui/badge.mjs.map +1 -1
  18. package/dist/components/ui/breadcrumb.js +30 -25
  19. package/dist/components/ui/breadcrumb.js.map +1 -1
  20. package/dist/components/ui/breadcrumb.mjs +30 -25
  21. package/dist/components/ui/breadcrumb.mjs.map +1 -1
  22. package/dist/components/ui/button-group.js +6 -5
  23. package/dist/components/ui/button-group.js.map +1 -1
  24. package/dist/components/ui/button-group.mjs +6 -5
  25. package/dist/components/ui/button-group.mjs.map +1 -1
  26. package/dist/components/ui/button.js +24 -14
  27. package/dist/components/ui/button.js.map +1 -1
  28. package/dist/components/ui/button.mjs +24 -14
  29. package/dist/components/ui/button.mjs.map +1 -1
  30. package/dist/components/ui/card.js +53 -39
  31. package/dist/components/ui/card.js.map +1 -1
  32. package/dist/components/ui/card.mjs +53 -39
  33. package/dist/components/ui/card.mjs.map +1 -1
  34. package/dist/components/ui/chart.d.mts +1 -1
  35. package/dist/components/ui/chart.d.ts +1 -1
  36. package/dist/components/ui/chart.js +154 -130
  37. package/dist/components/ui/chart.js.map +1 -1
  38. package/dist/components/ui/chart.mjs +154 -130
  39. package/dist/components/ui/chart.mjs.map +1 -1
  40. package/dist/components/ui/checkbox.js +47 -40
  41. package/dist/components/ui/checkbox.js.map +1 -1
  42. package/dist/components/ui/checkbox.mjs +47 -40
  43. package/dist/components/ui/checkbox.mjs.map +1 -1
  44. package/dist/components/ui/divider.js +16 -13
  45. package/dist/components/ui/divider.js.map +1 -1
  46. package/dist/components/ui/divider.mjs +16 -13
  47. package/dist/components/ui/divider.mjs.map +1 -1
  48. package/dist/components/ui/drawer.js +44 -35
  49. package/dist/components/ui/drawer.js.map +1 -1
  50. package/dist/components/ui/drawer.mjs +44 -35
  51. package/dist/components/ui/drawer.mjs.map +1 -1
  52. package/dist/components/ui/dropdown.js +31 -24
  53. package/dist/components/ui/dropdown.js.map +1 -1
  54. package/dist/components/ui/dropdown.mjs +31 -24
  55. package/dist/components/ui/dropdown.mjs.map +1 -1
  56. package/dist/components/ui/field.js +18 -15
  57. package/dist/components/ui/field.js.map +1 -1
  58. package/dist/components/ui/field.mjs +18 -15
  59. package/dist/components/ui/field.mjs.map +1 -1
  60. package/dist/components/ui/icon-button.js +17 -14
  61. package/dist/components/ui/icon-button.js.map +1 -1
  62. package/dist/components/ui/icon-button.mjs +17 -14
  63. package/dist/components/ui/icon-button.mjs.map +1 -1
  64. package/dist/components/ui/input.js +34 -29
  65. package/dist/components/ui/input.js.map +1 -1
  66. package/dist/components/ui/input.mjs +34 -29
  67. package/dist/components/ui/input.mjs.map +1 -1
  68. package/dist/components/ui/metric-card.js +24 -21
  69. package/dist/components/ui/metric-card.js.map +1 -1
  70. package/dist/components/ui/metric-card.mjs +24 -21
  71. package/dist/components/ui/metric-card.mjs.map +1 -1
  72. package/dist/components/ui/modal.js +91 -74
  73. package/dist/components/ui/modal.js.map +1 -1
  74. package/dist/components/ui/modal.mjs +91 -74
  75. package/dist/components/ui/modal.mjs.map +1 -1
  76. package/dist/components/ui/navigation-menu.js +114 -93
  77. package/dist/components/ui/navigation-menu.js.map +1 -1
  78. package/dist/components/ui/navigation-menu.mjs +114 -93
  79. package/dist/components/ui/navigation-menu.mjs.map +1 -1
  80. package/dist/components/ui/pagination.js +66 -55
  81. package/dist/components/ui/pagination.js.map +1 -1
  82. package/dist/components/ui/pagination.mjs +66 -55
  83. package/dist/components/ui/pagination.mjs.map +1 -1
  84. package/dist/components/ui/popover.js +39 -36
  85. package/dist/components/ui/popover.js.map +1 -1
  86. package/dist/components/ui/popover.mjs +39 -36
  87. package/dist/components/ui/popover.mjs.map +1 -1
  88. package/dist/components/ui/progress.js +73 -64
  89. package/dist/components/ui/progress.js.map +1 -1
  90. package/dist/components/ui/progress.mjs +73 -64
  91. package/dist/components/ui/progress.mjs.map +1 -1
  92. package/dist/components/ui/radio-group.js +23 -19
  93. package/dist/components/ui/radio-group.js.map +1 -1
  94. package/dist/components/ui/radio-group.mjs +23 -19
  95. package/dist/components/ui/radio-group.mjs.map +1 -1
  96. package/dist/components/ui/segmented.js +7 -6
  97. package/dist/components/ui/segmented.js.map +1 -1
  98. package/dist/components/ui/segmented.mjs +7 -6
  99. package/dist/components/ui/segmented.mjs.map +1 -1
  100. package/dist/components/ui/select.js +55 -48
  101. package/dist/components/ui/select.js.map +1 -1
  102. package/dist/components/ui/select.mjs +55 -48
  103. package/dist/components/ui/select.mjs.map +1 -1
  104. package/dist/components/ui/skeleton.js +20 -19
  105. package/dist/components/ui/skeleton.js.map +1 -1
  106. package/dist/components/ui/skeleton.mjs +20 -19
  107. package/dist/components/ui/skeleton.mjs.map +1 -1
  108. package/dist/components/ui/slider.js +68 -58
  109. package/dist/components/ui/slider.js.map +1 -1
  110. package/dist/components/ui/slider.mjs +68 -58
  111. package/dist/components/ui/slider.mjs.map +1 -1
  112. package/dist/components/ui/spinner.js +185 -176
  113. package/dist/components/ui/spinner.js.map +1 -1
  114. package/dist/components/ui/spinner.mjs +185 -176
  115. package/dist/components/ui/spinner.mjs.map +1 -1
  116. package/dist/components/ui/switch.js +39 -28
  117. package/dist/components/ui/switch.js.map +1 -1
  118. package/dist/components/ui/switch.mjs +39 -28
  119. package/dist/components/ui/switch.mjs.map +1 -1
  120. package/dist/components/ui/table.js +26 -23
  121. package/dist/components/ui/table.js.map +1 -1
  122. package/dist/components/ui/table.mjs +26 -23
  123. package/dist/components/ui/table.mjs.map +1 -1
  124. package/dist/components/ui/tabs.js +25 -9
  125. package/dist/components/ui/tabs.js.map +1 -1
  126. package/dist/components/ui/tabs.mjs +25 -9
  127. package/dist/components/ui/tabs.mjs.map +1 -1
  128. package/dist/components/ui/textarea.js +2 -1
  129. package/dist/components/ui/textarea.js.map +1 -1
  130. package/dist/components/ui/textarea.mjs +2 -1
  131. package/dist/components/ui/textarea.mjs.map +1 -1
  132. package/dist/components/ui/toast.js +104 -80
  133. package/dist/components/ui/toast.js.map +1 -1
  134. package/dist/components/ui/toast.mjs +104 -80
  135. package/dist/components/ui/toast.mjs.map +1 -1
  136. package/dist/components/ui/toggle-group.js +9 -8
  137. package/dist/components/ui/toggle-group.js.map +1 -1
  138. package/dist/components/ui/toggle-group.mjs +9 -8
  139. package/dist/components/ui/toggle-group.mjs.map +1 -1
  140. package/dist/components/ui/toggle.js +3 -2
  141. package/dist/components/ui/toggle.js.map +1 -1
  142. package/dist/components/ui/toggle.mjs +3 -2
  143. package/dist/components/ui/toggle.mjs.map +1 -1
  144. package/dist/components/ui/tooltip.js +18 -15
  145. package/dist/components/ui/tooltip.js.map +1 -1
  146. package/dist/components/ui/tooltip.mjs +18 -15
  147. package/dist/components/ui/tooltip.mjs.map +1 -1
  148. package/package.json +27 -19
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/spinner.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Ring SVG sizes per size variant (diameter in px) */\nconst RING_SIZES = {\n sm: 16,\n default: 24,\n lg: 32,\n} as const\n\n/** Ring stroke widths per size */\nconst RING_STROKE = {\n sm: 2,\n default: 2.5,\n lg: 3,\n} as const\n\n/** Dot sizes (diameter in px) */\nconst DOT_SIZES = {\n sm: 4,\n default: 6,\n lg: 8,\n} as const\n\n/** Dot container gap per size */\nconst DOT_GAP = {\n sm: 3,\n default: 4,\n lg: 5,\n} as const\n\n/** Bar widths per size */\nconst BAR_WIDTHS = {\n sm: 2,\n default: 3,\n lg: 4,\n} as const\n\n/** Bar heights per size */\nconst BAR_HEIGHTS = {\n sm: 12,\n default: 16,\n lg: 24,\n} as const\n\n/** Bar gap per size */\nconst BAR_GAP = {\n sm: 2,\n default: 3,\n lg: 4,\n} as const\n\n/** Orbit sizes (diameter in px) */\nconst ORBIT_SIZES = {\n sm: 22,\n default: 32,\n lg: 44,\n} as const\n\n/** Orbit ring stroke widths per size */\nconst ORBIT_STROKE = {\n sm: 2.5,\n default: 3,\n lg: 3.5,\n} as const\n\n\n/** Number of dots in dots variant */\nconst DOT_COUNT = 3\n\n/** Number of bars in bars variant */\nconst BAR_COUNT = 4\n\n/** SVG viewBox for ring spinner */\nconst RING_VIEWBOX = 24\n\n/** SVG center for ring spinner */\nconst RING_CENTER = 12\n\n// ============================================================================\n// Color mapping\n// ============================================================================\n\nconst strokeColorMap = {\n default: 'stroke-foreground',\n primary: 'stroke-primary',\n current: 'stroke-current',\n} as const\n\nconst bgColorMap = {\n default: 'bg-foreground',\n primary: 'bg-primary',\n current: 'bg-current',\n} as const\n\n// ============================================================================\n// Speed mapping\n// ============================================================================\n\n/** Speed durations in ms for ring/dots/bars */\nconst SPEED_MS = { slow: 1500, default: 1000, fast: 750 } as const\n/** Speed durations in ms for orbit (slower) */\nconst ORBIT_SPEED_MS = { slow: 2000, default: 1500, fast: 1000 } as const\n\n// ============================================================================\n// Variants (CVA)\n// ============================================================================\n\nconst spinnerVariants = cva(\n 'inline-flex items-center justify-center shrink-0',\n {\n variants: {\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n)\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type OrbitStyle = 'ring' | 'dots' | 'cube' | 'flip' | 'morph'\n\nexport interface SpinnerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof spinnerVariants> {\n /** Visual variant */\n variant?: 'ring' | 'dots' | 'bars' | 'orbit'\n /** Orbit sub-style (only when variant=\"orbit\") */\n orbitStyle?: OrbitStyle\n /** Spinner color */\n color?: 'default' | 'primary' | 'current'\n /** Animation speed */\n speed?: 'slow' | 'default' | 'fast'\n /** Accessibility label */\n label?: string\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({\n className,\n variant = 'ring',\n orbitStyle = 'ring',\n size,\n color = 'default',\n speed = 'default',\n label,\n ...props\n }, ref) => {\n const resolvedSize = size || 'default'\n\n const orbitMap = {\n ring: OrbitSpinner,\n dots: OrbitDotsSpinner,\n cube: OrbitCubeSpinner,\n flip: OrbitFlipSpinner,\n morph: OrbitMorphSpinner,\n } as const\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label={label || 'Loading'}\n className={cn(spinnerVariants({ size }), className)}\n {...props}\n >\n {variant === 'ring' && (\n <RingSpinner size={resolvedSize} color={color} speed={speed} />\n )}\n {variant === 'dots' && (\n <DotsSpinner size={resolvedSize} color={color} speed={speed} />\n )}\n {variant === 'bars' && (\n <BarsSpinner size={resolvedSize} color={color} speed={speed} />\n )}\n {variant === 'orbit' && (() => {\n const OrbitComponent = orbitMap[orbitStyle]\n return <OrbitComponent size={resolvedSize} color={color} speed={speed} />\n })()}\n </div>\n )\n }\n)\nSpinner.displayName = 'Spinner'\n\n// ============================================================================\n// Ring Spinner (SVG circle with animate-spin)\n// ============================================================================\n\nfunction RingSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const diameter = RING_SIZES[size]\n const stroke = RING_STROKE[size]\n const r = (RING_VIEWBOX - stroke) / 2\n const circumference = 2 * Math.PI * r\n\n return (\n <svg\n viewBox={`0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`}\n width={diameter}\n height={diameter}\n fill=\"none\"\n className=\"animate-spin\"\n style={{ animationDuration: `${SPEED_MS[speed]}ms` }}\n >\n {/* Track */}\n <circle\n cx={RING_CENTER}\n cy={RING_CENTER}\n r={r}\n className=\"stroke-border\"\n strokeWidth={stroke}\n />\n {/* Indicator */}\n <circle\n cx={RING_CENTER}\n cy={RING_CENTER}\n r={r}\n className={strokeColorMap[color]}\n strokeWidth={stroke}\n strokeDasharray={circumference}\n strokeDashoffset={circumference * 0.75}\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\n// ============================================================================\n// Dots Spinner (3 pulsing dots)\n// ============================================================================\n\nfunction DotsSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const dotSize = DOT_SIZES[size]\n const gap = DOT_GAP[size]\n\n return (\n <div className=\"inline-flex items-center\" style={{ gap }}>\n {Array.from({ length: DOT_COUNT }, (_, i) => (\n <div\n key={i}\n className={cn(\n 'rounded-full animate-spinner-dot',\n bgColorMap[color],\n )}\n style={{\n width: dotSize,\n height: dotSize,\n animationDuration: `${SPEED_MS[speed]}ms`,\n animationDelay: `${i * (SPEED_MS[speed] / DOT_COUNT / 1.5)}ms`,\n }}\n />\n ))}\n </div>\n )\n}\n\n// ============================================================================\n// Bars Spinner (4 pulsing bars)\n// ============================================================================\n\nfunction BarsSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const barWidth = BAR_WIDTHS[size]\n const barHeight = BAR_HEIGHTS[size]\n const gap = BAR_GAP[size]\n\n return (\n <div className=\"inline-flex items-center\" style={{ gap, height: barHeight }}>\n {Array.from({ length: BAR_COUNT }, (_, i) => (\n <div\n key={i}\n className={cn(\n 'rounded-full animate-spinner-bar origin-center',\n bgColorMap[color],\n )}\n style={{\n width: barWidth,\n height: barHeight,\n animationDuration: `${SPEED_MS[speed]}ms`,\n animationDelay: `${i * (SPEED_MS[speed] / BAR_COUNT / 1.5)}ms`,\n }}\n />\n ))}\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Spinner (3D rotating ring)\n// ============================================================================\n\nconst orbitTextColorMap = {\n default: 'text-foreground',\n primary: 'text-primary',\n current: '',\n} as const\n\nfunction OrbitSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const diameter = ORBIT_SIZES[size]\n const stroke = ORBIT_STROKE[size]\n const r = (RING_VIEWBOX - stroke * 2) / 2\n const circumference = 2 * Math.PI * r\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: diameter,\n height: diameter,\n perspective: diameter * 3,\n position: 'relative',\n }}\n >\n {/* Ring 1 — solid, Y-axis rotation */}\n <svg\n viewBox={`0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`}\n width={diameter}\n height={diameter}\n fill=\"none\"\n className=\"absolute inset-0 animate-spinner-orbit\"\n style={{ animationDuration: `${ORBIT_SPEED_MS[speed]}ms` }}\n >\n <circle\n cx={RING_CENTER}\n cy={RING_CENTER}\n r={r}\n stroke=\"currentColor\"\n strokeWidth={stroke}\n />\n </svg>\n {/* Ring 2 — solid, perpendicular, reverse direction */}\n <svg\n viewBox={`0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`}\n width={diameter}\n height={diameter}\n fill=\"none\"\n className=\"absolute inset-0 animate-spinner-orbit\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n transform: 'rotateZ(90deg)',\n animationDirection: 'reverse',\n animationDelay: '-0.4s',\n opacity: 0.35,\n }}\n >\n <circle\n cx={RING_CENTER}\n cy={RING_CENTER}\n r={r}\n stroke=\"currentColor\"\n strokeWidth={stroke}\n />\n </svg>\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Dots — 3 dots orbiting in 3D path\n// ============================================================================\n\n/** Orbit dot size per spinner size */\nconst ORBIT_DOT_SIZE = { sm: 3, default: 4, lg: 6 } as const\n\nfunction OrbitDotsSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const diameter = ORBIT_SIZES[size]\n const dotSize = ORBIT_DOT_SIZE[size]\n const orbitRadius = (diameter - dotSize) / 2\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: diameter,\n height: diameter,\n perspective: diameter * 3,\n position: 'relative',\n }}\n >\n <div\n className=\"animate-spinner-orbit\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n width: '100%',\n height: '100%',\n position: 'relative',\n transformStyle: 'preserve-3d',\n }}\n >\n {[0, 120, 240].map((angle) => (\n <div\n key={angle}\n className=\"absolute rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: 'currentColor',\n left: '50%',\n top: '50%',\n transform: `translate(-50%, -50%) rotate(${angle}deg) translateX(${orbitRadius}px)`,\n }}\n />\n ))}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Cube — wireframe cube rotating in 3D\n// ============================================================================\n\n/** Cube face sizes per spinner size */\nconst CUBE_SIZES = { sm: 12, default: 18, lg: 26 } as const\n\nfunction OrbitCubeSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const cubeSize = CUBE_SIZES[size]\n const half = cubeSize / 2\n const radius = Math.round(cubeSize * 0.15)\n\n const overlap = 1\n const faceBase: React.CSSProperties = {\n position: 'absolute',\n width: cubeSize + overlap * 2,\n height: cubeSize + overlap * 2,\n backgroundColor: 'currentColor',\n borderRadius: radius,\n top: -overlap,\n left: -overlap,\n }\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: cubeSize,\n height: cubeSize,\n perspective: cubeSize * 6,\n }}\n >\n {/* Diagonal tilt — shows top + corner for depth */}\n <div\n style={{\n width: cubeSize,\n height: cubeSize,\n transform: 'rotateX(-25deg) rotateZ(15deg)',\n transformStyle: 'preserve-3d',\n }}\n >\n {/* Y-axis rotation */}\n <div\n className=\"animate-spinner-orbit\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n width: cubeSize,\n height: cubeSize,\n position: 'relative',\n transformStyle: 'preserve-3d',\n }}\n >\n <div style={{ ...faceBase, transform: `translateZ(${half}px)`, opacity: 0.25 }} />\n <div style={{ ...faceBase, transform: `translateZ(${-half}px)`, opacity: 0.1 }} />\n <div style={{ ...faceBase, transform: `rotateY(-90deg) translateZ(${half}px)`, opacity: 0.2 }} />\n <div style={{ ...faceBase, transform: `rotateY(90deg) translateZ(${half}px)`, opacity: 0.2 }} />\n <div style={{ ...faceBase, transform: `rotateX(90deg) translateZ(${half}px)`, opacity: 0.15 }} />\n <div style={{ ...faceBase, transform: `rotateX(-90deg) translateZ(${half}px)`, opacity: 0.08 }} />\n </div>\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Flip — rounded square tumbling in 3D\n// ============================================================================\n\n/** Flip square sizes per spinner size */\nconst FLIP_SIZES = { sm: 14, default: 20, lg: 28 } as const\n\nfunction OrbitFlipSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const sqSize = FLIP_SIZES[size]\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: sqSize,\n height: sqSize,\n perspective: sqSize * 4,\n }}\n >\n <div style={{ transform: 'rotateX(25deg)', transformStyle: 'preserve-3d', width: '100%', height: '100%' }}>\n <div\n className=\"animate-spinner-orbit\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n width: '100%',\n height: '100%',\n borderRadius: '25%',\n backgroundColor: 'currentColor',\n opacity: 0.85,\n }}\n />\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Morph — organic shape morphing + 3D rotation\n// ============================================================================\n\n/** Morph sizes per spinner size */\nconst MORPH_SIZES = { sm: 16, default: 24, lg: 34 } as const\n\nfunction OrbitMorphSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const morphSize = MORPH_SIZES[size]\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: morphSize,\n height: morphSize,\n perspective: morphSize * 3,\n }}\n >\n <div\n className=\"animate-spinner-morph\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n width: '100%',\n height: '100%',\n backgroundColor: 'currentColor',\n opacity: 0.85,\n }}\n />\n </div>\n )\n}\n\nexport { Spinner, spinnerVariants }\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/spinner.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Ring SVG sizes per size variant (diameter in px) */\nconst RING_SIZES = {\n sm: 16,\n default: 24,\n lg: 32,\n} as const\n\n/** Ring stroke widths per size */\nconst RING_STROKE = {\n sm: 2,\n default: 2.5,\n lg: 3,\n} as const\n\n/** Dot sizes (diameter in px) */\nconst DOT_SIZES = {\n sm: 4,\n default: 6,\n lg: 8,\n} as const\n\n/** Dot container gap per size */\nconst DOT_GAP = {\n sm: 3,\n default: 4,\n lg: 5,\n} as const\n\n/** Bar widths per size */\nconst BAR_WIDTHS = {\n sm: 2,\n default: 3,\n lg: 4,\n} as const\n\n/** Bar heights per size */\nconst BAR_HEIGHTS = {\n sm: 12,\n default: 16,\n lg: 24,\n} as const\n\n/** Bar gap per size */\nconst BAR_GAP = {\n sm: 2,\n default: 3,\n lg: 4,\n} as const\n\n/** Orbit sizes (diameter in px) */\nconst ORBIT_SIZES = {\n sm: 22,\n default: 32,\n lg: 44,\n} as const\n\n/** Orbit ring stroke widths per size */\nconst ORBIT_STROKE = {\n sm: 2.5,\n default: 3,\n lg: 3.5,\n} as const\n\n\n/** Number of dots in dots variant */\nconst DOT_COUNT = 3\n\n/** Number of bars in bars variant */\nconst BAR_COUNT = 4\n\n/** SVG viewBox for ring spinner */\nconst RING_VIEWBOX = 24\n\n/** SVG center for ring spinner */\nconst RING_CENTER = 12\n\n// ============================================================================\n// Color mapping\n// ============================================================================\n\nconst strokeColorMap = {\n default: 'stroke-foreground',\n primary: 'stroke-primary',\n current: 'stroke-current',\n} as const\n\nconst bgColorMap = {\n default: 'bg-foreground',\n primary: 'bg-primary',\n current: 'bg-current',\n} as const\n\n// ============================================================================\n// Speed mapping\n// ============================================================================\n\n/** Speed durations in ms for ring/dots/bars */\nconst SPEED_MS = { slow: 1500, default: 1000, fast: 750 } as const\n/** Speed durations in ms for orbit (slower) */\nconst ORBIT_SPEED_MS = { slow: 2000, default: 1500, fast: 1000 } as const\n\n// ============================================================================\n// Variants (CVA)\n// ============================================================================\n\nconst spinnerVariants = cva(\n 'inline-flex items-center justify-center shrink-0',\n {\n variants: {\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n)\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type OrbitStyle = 'ring' | 'dots' | 'cube' | 'flip' | 'morph'\n\nexport interface SpinnerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof spinnerVariants> {\n /** Visual variant */\n variant?: 'ring' | 'dots' | 'bars' | 'orbit'\n /** Orbit sub-style (only when variant=\"orbit\") */\n orbitStyle?: OrbitStyle\n /** Spinner color */\n color?: 'default' | 'primary' | 'current'\n /** Animation speed */\n speed?: 'slow' | 'default' | 'fast'\n /** Accessibility label */\n label?: string\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({\n className,\n variant = 'ring',\n orbitStyle = 'ring',\n size,\n color = 'default',\n speed = 'default',\n label,\n ...props\n }, ref) => {\n const resolvedSize = size || 'default'\n\n const orbitMap = {\n ring: OrbitSpinner,\n dots: OrbitDotsSpinner,\n cube: OrbitCubeSpinner,\n flip: OrbitFlipSpinner,\n morph: OrbitMorphSpinner,\n } as const\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label={label || 'Loading'}\n className={cn(spinnerVariants({ size }), className)}\n {...props}\n >\n {variant === 'ring' && (\n <RingSpinner size={resolvedSize} color={color} speed={speed} />\n )}\n {variant === 'dots' && (\n <DotsSpinner size={resolvedSize} color={color} speed={speed} />\n )}\n {variant === 'bars' && (\n <BarsSpinner size={resolvedSize} color={color} speed={speed} />\n )}\n {variant === 'orbit' && (() => {\n const OrbitComponent = orbitMap[orbitStyle]\n return <OrbitComponent size={resolvedSize} color={color} speed={speed} />\n })()}\n </div>\n )\n }\n)\nSpinner.displayName = 'Spinner'\n\n// ============================================================================\n// Ring Spinner (SVG circle with animate-spin)\n// ============================================================================\n\nfunction RingSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const diameter = RING_SIZES[size]\n const stroke = RING_STROKE[size]\n const r = (RING_VIEWBOX - stroke) / 2\n const circumference = 2 * Math.PI * r\n\n return (\n <svg\n viewBox={`0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`}\n width={diameter}\n height={diameter}\n fill=\"none\"\n className=\"animate-spin\"\n style={{ animationDuration: `${SPEED_MS[speed]}ms` }}\n >\n {/* Track */}\n <circle\n cx={RING_CENTER}\n cy={RING_CENTER}\n r={r}\n className=\"stroke-border\"\n strokeWidth={stroke}\n />\n {/* Indicator */}\n <circle\n cx={RING_CENTER}\n cy={RING_CENTER}\n r={r}\n className={strokeColorMap[color]}\n strokeWidth={stroke}\n strokeDasharray={circumference}\n strokeDashoffset={circumference * 0.75}\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\n// ============================================================================\n// Dots Spinner (3 pulsing dots)\n// ============================================================================\n\nfunction DotsSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const dotSize = DOT_SIZES[size]\n const gap = DOT_GAP[size]\n\n return (\n <div className=\"inline-flex items-center\" style={{ gap }}>\n {Array.from({ length: DOT_COUNT }, (_, i) => (\n <div\n key={i}\n className={cn(\n 'rounded-full animate-spinner-dot',\n bgColorMap[color],\n )}\n style={{\n width: dotSize,\n height: dotSize,\n animationDuration: `${SPEED_MS[speed]}ms`,\n animationDelay: `${i * (SPEED_MS[speed] / DOT_COUNT / 1.5)}ms`,\n }}\n />\n ))}\n </div>\n )\n}\n\n// ============================================================================\n// Bars Spinner (4 pulsing bars)\n// ============================================================================\n\nfunction BarsSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const barWidth = BAR_WIDTHS[size]\n const barHeight = BAR_HEIGHTS[size]\n const gap = BAR_GAP[size]\n\n return (\n <div className=\"inline-flex items-center\" style={{ gap, height: barHeight }}>\n {Array.from({ length: BAR_COUNT }, (_, i) => (\n <div\n key={i}\n className={cn(\n 'rounded-full animate-spinner-bar origin-center',\n bgColorMap[color],\n )}\n style={{\n width: barWidth,\n height: barHeight,\n animationDuration: `${SPEED_MS[speed]}ms`,\n animationDelay: `${i * (SPEED_MS[speed] / BAR_COUNT / 1.5)}ms`,\n }}\n />\n ))}\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Spinner (3D rotating ring)\n// ============================================================================\n\nconst orbitTextColorMap = {\n default: 'text-foreground',\n primary: 'text-primary',\n current: '',\n} as const\n\nfunction OrbitSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const diameter = ORBIT_SIZES[size]\n const stroke = ORBIT_STROKE[size]\n const r = (RING_VIEWBOX - stroke * 2) / 2\n const circumference = 2 * Math.PI * r\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: diameter,\n height: diameter,\n perspective: diameter * 3,\n position: 'relative',\n }}\n >\n {/* Ring 1 — solid, Y-axis rotation */}\n <svg\n viewBox={`0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`}\n width={diameter}\n height={diameter}\n fill=\"none\"\n className=\"absolute inset-0 animate-spinner-orbit\"\n style={{ animationDuration: `${ORBIT_SPEED_MS[speed]}ms` }}\n >\n <circle\n cx={RING_CENTER}\n cy={RING_CENTER}\n r={r}\n stroke=\"currentColor\"\n strokeWidth={stroke}\n />\n </svg>\n {/* Ring 2 — solid, perpendicular, reverse direction */}\n <svg\n viewBox={`0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`}\n width={diameter}\n height={diameter}\n fill=\"none\"\n className=\"absolute inset-0 animate-spinner-orbit\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n transform: 'rotateZ(90deg)',\n animationDirection: 'reverse',\n animationDelay: '-0.4s',\n opacity: 0.35,\n }}\n >\n <circle\n cx={RING_CENTER}\n cy={RING_CENTER}\n r={r}\n stroke=\"currentColor\"\n strokeWidth={stroke}\n />\n </svg>\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Dots — 3 dots orbiting in 3D path\n// ============================================================================\n\n/** Orbit dot size per spinner size */\nconst ORBIT_DOT_SIZE = { sm: 3, default: 4, lg: 6 } as const\n\nfunction OrbitDotsSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const diameter = ORBIT_SIZES[size]\n const dotSize = ORBIT_DOT_SIZE[size]\n const orbitRadius = (diameter - dotSize) / 2\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: diameter,\n height: diameter,\n perspective: diameter * 3,\n position: 'relative',\n }}\n >\n <div\n className=\"animate-spinner-orbit\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n width: '100%',\n height: '100%',\n position: 'relative',\n transformStyle: 'preserve-3d',\n }}\n >\n {[0, 120, 240].map((angle) => (\n <div\n key={angle}\n className=\"absolute rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: 'currentColor',\n left: '50%',\n top: '50%',\n transform: `translate(-50%, -50%) rotate(${angle}deg) translateX(${orbitRadius}px)`,\n }}\n />\n ))}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Cube — wireframe cube rotating in 3D\n// ============================================================================\n\n/** Cube face sizes per spinner size */\nconst CUBE_SIZES = { sm: 12, default: 18, lg: 26 } as const\n\nfunction OrbitCubeSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const cubeSize = CUBE_SIZES[size]\n const half = cubeSize / 2\n const radius = Math.round(cubeSize * 0.15)\n\n const overlap = 1\n const faceBase: React.CSSProperties = {\n position: 'absolute',\n width: cubeSize + overlap * 2,\n height: cubeSize + overlap * 2,\n backgroundColor: 'currentColor',\n borderRadius: radius,\n top: -overlap,\n left: -overlap,\n }\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: cubeSize,\n height: cubeSize,\n perspective: cubeSize * 6,\n }}\n >\n {/* Diagonal tilt — shows top + corner for depth */}\n <div\n style={{\n width: cubeSize,\n height: cubeSize,\n transform: 'rotateX(-25deg) rotateZ(15deg)',\n transformStyle: 'preserve-3d',\n }}\n >\n {/* Y-axis rotation */}\n <div\n className=\"animate-spinner-orbit\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n width: cubeSize,\n height: cubeSize,\n position: 'relative',\n transformStyle: 'preserve-3d',\n }}\n >\n <div style={{ ...faceBase, transform: `translateZ(${half}px)`, opacity: 0.25 }} />\n <div style={{ ...faceBase, transform: `translateZ(${-half}px)`, opacity: 0.1 }} />\n <div style={{ ...faceBase, transform: `rotateY(-90deg) translateZ(${half}px)`, opacity: 0.2 }} />\n <div style={{ ...faceBase, transform: `rotateY(90deg) translateZ(${half}px)`, opacity: 0.2 }} />\n <div style={{ ...faceBase, transform: `rotateX(90deg) translateZ(${half}px)`, opacity: 0.15 }} />\n <div style={{ ...faceBase, transform: `rotateX(-90deg) translateZ(${half}px)`, opacity: 0.08 }} />\n </div>\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Flip — rounded square tumbling in 3D\n// ============================================================================\n\n/** Flip square sizes per spinner size */\nconst FLIP_SIZES = { sm: 14, default: 20, lg: 28 } as const\n\nfunction OrbitFlipSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const sqSize = FLIP_SIZES[size]\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: sqSize,\n height: sqSize,\n perspective: sqSize * 4,\n }}\n >\n <div style={{ transform: 'rotateX(25deg)', transformStyle: 'preserve-3d', width: '100%', height: '100%' }}>\n <div\n className=\"animate-spinner-orbit\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n width: '100%',\n height: '100%',\n borderRadius: '25%',\n backgroundColor: 'currentColor',\n opacity: 0.85,\n }}\n />\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// Orbit Morph — organic shape morphing + 3D rotation\n// ============================================================================\n\n/** Morph sizes per spinner size */\nconst MORPH_SIZES = { sm: 16, default: 24, lg: 34 } as const\n\nfunction OrbitMorphSpinner({ size, color, speed }: {\n size: 'sm' | 'default' | 'lg'\n color: 'default' | 'primary' | 'current'\n speed: 'slow' | 'default' | 'fast'\n}) {\n const morphSize = MORPH_SIZES[size]\n\n return (\n <div\n className={cn(orbitTextColorMap[color])}\n style={{\n width: morphSize,\n height: morphSize,\n perspective: morphSize * 3,\n }}\n >\n <div\n className=\"animate-spinner-morph\"\n style={{\n animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,\n width: '100%',\n height: '100%',\n backgroundColor: 'currentColor',\n opacity: 0.85,\n }}\n />\n </div>\n )\n}\n\nexport { Spinner, spinnerVariants }\n"],"mappings":"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","names":[]}
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import * as React from "react";
3
4
  import { cva } from "class-variance-authority";
4
5
  import { cn } from "../../lib/utils";
@@ -97,22 +98,24 @@ const Spinner = React.forwardRef(
97
98
  flip: OrbitFlipSpinner,
98
99
  morph: OrbitMorphSpinner
99
100
  };
100
- return /* @__PURE__ */ React.createElement(
101
+ return /* @__PURE__ */ jsxs(
101
102
  "div",
102
103
  {
103
104
  ref,
104
105
  role: "status",
105
106
  "aria-label": label || "Loading",
106
107
  className: cn(spinnerVariants({ size }), className),
107
- ...props
108
- },
109
- variant === "ring" && /* @__PURE__ */ React.createElement(RingSpinner, { size: resolvedSize, color, speed }),
110
- variant === "dots" && /* @__PURE__ */ React.createElement(DotsSpinner, { size: resolvedSize, color, speed }),
111
- variant === "bars" && /* @__PURE__ */ React.createElement(BarsSpinner, { size: resolvedSize, color, speed }),
112
- variant === "orbit" && (() => {
113
- const OrbitComponent = orbitMap[orbitStyle];
114
- return /* @__PURE__ */ React.createElement(OrbitComponent, { size: resolvedSize, color, speed });
115
- })()
108
+ ...props,
109
+ children: [
110
+ variant === "ring" && /* @__PURE__ */ jsx(RingSpinner, { size: resolvedSize, color, speed }),
111
+ variant === "dots" && /* @__PURE__ */ jsx(DotsSpinner, { size: resolvedSize, color, speed }),
112
+ variant === "bars" && /* @__PURE__ */ jsx(BarsSpinner, { size: resolvedSize, color, speed }),
113
+ variant === "orbit" && (() => {
114
+ const OrbitComponent = orbitMap[orbitStyle];
115
+ return /* @__PURE__ */ jsx(OrbitComponent, { size: resolvedSize, color, speed });
116
+ })()
117
+ ]
118
+ }
116
119
  );
117
120
  }
118
121
  );
@@ -122,7 +125,7 @@ function RingSpinner({ size, color, speed }) {
122
125
  const stroke = RING_STROKE[size];
123
126
  const r = (RING_VIEWBOX - stroke) / 2;
124
127
  const circumference = 2 * Math.PI * r;
125
- return /* @__PURE__ */ React.createElement(
128
+ return /* @__PURE__ */ jsxs(
126
129
  "svg",
127
130
  {
128
131
  viewBox: `0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`,
@@ -130,40 +133,41 @@ function RingSpinner({ size, color, speed }) {
130
133
  height: diameter,
131
134
  fill: "none",
132
135
  className: "animate-spin",
133
- style: { animationDuration: `${SPEED_MS[speed]}ms` }
134
- },
135
- /* @__PURE__ */ React.createElement(
136
- "circle",
137
- {
138
- cx: RING_CENTER,
139
- cy: RING_CENTER,
140
- r,
141
- className: "stroke-border",
142
- strokeWidth: stroke
143
- }
144
- ),
145
- /* @__PURE__ */ React.createElement(
146
- "circle",
147
- {
148
- cx: RING_CENTER,
149
- cy: RING_CENTER,
150
- r,
151
- className: strokeColorMap[color],
152
- strokeWidth: stroke,
153
- strokeDasharray: circumference,
154
- strokeDashoffset: circumference * 0.75,
155
- strokeLinecap: "round"
156
- }
157
- )
136
+ style: { animationDuration: `${SPEED_MS[speed]}ms` },
137
+ children: [
138
+ /* @__PURE__ */ jsx(
139
+ "circle",
140
+ {
141
+ cx: RING_CENTER,
142
+ cy: RING_CENTER,
143
+ r,
144
+ className: "stroke-border",
145
+ strokeWidth: stroke
146
+ }
147
+ ),
148
+ /* @__PURE__ */ jsx(
149
+ "circle",
150
+ {
151
+ cx: RING_CENTER,
152
+ cy: RING_CENTER,
153
+ r,
154
+ className: strokeColorMap[color],
155
+ strokeWidth: stroke,
156
+ strokeDasharray: circumference,
157
+ strokeDashoffset: circumference * 0.75,
158
+ strokeLinecap: "round"
159
+ }
160
+ )
161
+ ]
162
+ }
158
163
  );
159
164
  }
160
165
  function DotsSpinner({ size, color, speed }) {
161
166
  const dotSize = DOT_SIZES[size];
162
167
  const gap = DOT_GAP[size];
163
- return /* @__PURE__ */ React.createElement("div", { className: "inline-flex items-center", style: { gap } }, Array.from({ length: DOT_COUNT }, (_, i) => /* @__PURE__ */ React.createElement(
168
+ return /* @__PURE__ */ jsx("div", { className: "inline-flex items-center", style: { gap }, children: Array.from({ length: DOT_COUNT }, (_, i) => /* @__PURE__ */ jsx(
164
169
  "div",
165
170
  {
166
- key: i,
167
171
  className: cn(
168
172
  "rounded-full animate-spinner-dot",
169
173
  bgColorMap[color]
@@ -174,17 +178,17 @@ function DotsSpinner({ size, color, speed }) {
174
178
  animationDuration: `${SPEED_MS[speed]}ms`,
175
179
  animationDelay: `${i * (SPEED_MS[speed] / DOT_COUNT / 1.5)}ms`
176
180
  }
177
- }
178
- )));
181
+ },
182
+ i
183
+ )) });
179
184
  }
180
185
  function BarsSpinner({ size, color, speed }) {
181
186
  const barWidth = BAR_WIDTHS[size];
182
187
  const barHeight = BAR_HEIGHTS[size];
183
188
  const gap = BAR_GAP[size];
184
- return /* @__PURE__ */ React.createElement("div", { className: "inline-flex items-center", style: { gap, height: barHeight } }, Array.from({ length: BAR_COUNT }, (_, i) => /* @__PURE__ */ React.createElement(
189
+ return /* @__PURE__ */ jsx("div", { className: "inline-flex items-center", style: { gap, height: barHeight }, children: Array.from({ length: BAR_COUNT }, (_, i) => /* @__PURE__ */ jsx(
185
190
  "div",
186
191
  {
187
- key: i,
188
192
  className: cn(
189
193
  "rounded-full animate-spinner-bar origin-center",
190
194
  bgColorMap[color]
@@ -195,8 +199,9 @@ function BarsSpinner({ size, color, speed }) {
195
199
  animationDuration: `${SPEED_MS[speed]}ms`,
196
200
  animationDelay: `${i * (SPEED_MS[speed] / BAR_COUNT / 1.5)}ms`
197
201
  }
198
- }
199
- )));
202
+ },
203
+ i
204
+ )) });
200
205
  }
201
206
  const orbitTextColorMap = {
202
207
  default: "text-foreground",
@@ -208,7 +213,7 @@ function OrbitSpinner({ size, color, speed }) {
208
213
  const stroke = ORBIT_STROKE[size];
209
214
  const r = (RING_VIEWBOX - stroke * 2) / 2;
210
215
  const circumference = 2 * Math.PI * r;
211
- return /* @__PURE__ */ React.createElement(
216
+ return /* @__PURE__ */ jsxs(
212
217
  "div",
213
218
  {
214
219
  className: cn(orbitTextColorMap[color]),
@@ -217,56 +222,58 @@ function OrbitSpinner({ size, color, speed }) {
217
222
  height: diameter,
218
223
  perspective: diameter * 3,
219
224
  position: "relative"
220
- }
221
- },
222
- /* @__PURE__ */ React.createElement(
223
- "svg",
224
- {
225
- viewBox: `0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`,
226
- width: diameter,
227
- height: diameter,
228
- fill: "none",
229
- className: "absolute inset-0 animate-spinner-orbit",
230
- style: { animationDuration: `${ORBIT_SPEED_MS[speed]}ms` }
231
225
  },
232
- /* @__PURE__ */ React.createElement(
233
- "circle",
234
- {
235
- cx: RING_CENTER,
236
- cy: RING_CENTER,
237
- r,
238
- stroke: "currentColor",
239
- strokeWidth: stroke
240
- }
241
- )
242
- ),
243
- /* @__PURE__ */ React.createElement(
244
- "svg",
245
- {
246
- viewBox: `0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`,
247
- width: diameter,
248
- height: diameter,
249
- fill: "none",
250
- className: "absolute inset-0 animate-spinner-orbit",
251
- style: {
252
- animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
253
- transform: "rotateZ(90deg)",
254
- animationDirection: "reverse",
255
- animationDelay: "-0.4s",
256
- opacity: 0.35
257
- }
258
- },
259
- /* @__PURE__ */ React.createElement(
260
- "circle",
261
- {
262
- cx: RING_CENTER,
263
- cy: RING_CENTER,
264
- r,
265
- stroke: "currentColor",
266
- strokeWidth: stroke
267
- }
268
- )
269
- )
226
+ children: [
227
+ /* @__PURE__ */ jsx(
228
+ "svg",
229
+ {
230
+ viewBox: `0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`,
231
+ width: diameter,
232
+ height: diameter,
233
+ fill: "none",
234
+ className: "absolute inset-0 animate-spinner-orbit",
235
+ style: { animationDuration: `${ORBIT_SPEED_MS[speed]}ms` },
236
+ children: /* @__PURE__ */ jsx(
237
+ "circle",
238
+ {
239
+ cx: RING_CENTER,
240
+ cy: RING_CENTER,
241
+ r,
242
+ stroke: "currentColor",
243
+ strokeWidth: stroke
244
+ }
245
+ )
246
+ }
247
+ ),
248
+ /* @__PURE__ */ jsx(
249
+ "svg",
250
+ {
251
+ viewBox: `0 0 ${RING_VIEWBOX} ${RING_VIEWBOX}`,
252
+ width: diameter,
253
+ height: diameter,
254
+ fill: "none",
255
+ className: "absolute inset-0 animate-spinner-orbit",
256
+ style: {
257
+ animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
258
+ transform: "rotateZ(90deg)",
259
+ animationDirection: "reverse",
260
+ animationDelay: "-0.4s",
261
+ opacity: 0.35
262
+ },
263
+ children: /* @__PURE__ */ jsx(
264
+ "circle",
265
+ {
266
+ cx: RING_CENTER,
267
+ cy: RING_CENTER,
268
+ r,
269
+ stroke: "currentColor",
270
+ strokeWidth: stroke
271
+ }
272
+ )
273
+ }
274
+ )
275
+ ]
276
+ }
270
277
  );
271
278
  }
272
279
  const ORBIT_DOT_SIZE = { sm: 3, default: 4, lg: 6 };
@@ -274,7 +281,7 @@ function OrbitDotsSpinner({ size, color, speed }) {
274
281
  const diameter = ORBIT_SIZES[size];
275
282
  const dotSize = ORBIT_DOT_SIZE[size];
276
283
  const orbitRadius = (diameter - dotSize) / 2;
277
- return /* @__PURE__ */ React.createElement(
284
+ return /* @__PURE__ */ jsx(
278
285
  "div",
279
286
  {
280
287
  className: cn(orbitTextColorMap[color]),
@@ -283,36 +290,36 @@ function OrbitDotsSpinner({ size, color, speed }) {
283
290
  height: diameter,
284
291
  perspective: diameter * 3,
285
292
  position: "relative"
286
- }
287
- },
288
- /* @__PURE__ */ React.createElement(
289
- "div",
290
- {
291
- className: "animate-spinner-orbit",
292
- style: {
293
- animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
294
- width: "100%",
295
- height: "100%",
296
- position: "relative",
297
- transformStyle: "preserve-3d"
298
- }
299
293
  },
300
- [0, 120, 240].map((angle) => /* @__PURE__ */ React.createElement(
294
+ children: /* @__PURE__ */ jsx(
301
295
  "div",
302
296
  {
303
- key: angle,
304
- className: "absolute rounded-full",
297
+ className: "animate-spinner-orbit",
305
298
  style: {
306
- width: dotSize,
307
- height: dotSize,
308
- backgroundColor: "currentColor",
309
- left: "50%",
310
- top: "50%",
311
- transform: `translate(-50%, -50%) rotate(${angle}deg) translateX(${orbitRadius}px)`
312
- }
299
+ animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
300
+ width: "100%",
301
+ height: "100%",
302
+ position: "relative",
303
+ transformStyle: "preserve-3d"
304
+ },
305
+ children: [0, 120, 240].map((angle) => /* @__PURE__ */ jsx(
306
+ "div",
307
+ {
308
+ className: "absolute rounded-full",
309
+ style: {
310
+ width: dotSize,
311
+ height: dotSize,
312
+ backgroundColor: "currentColor",
313
+ left: "50%",
314
+ top: "50%",
315
+ transform: `translate(-50%, -50%) rotate(${angle}deg) translateX(${orbitRadius}px)`
316
+ }
317
+ },
318
+ angle
319
+ ))
313
320
  }
314
- ))
315
- )
321
+ )
322
+ }
316
323
  );
317
324
  }
318
325
  const CUBE_SIZES = { sm: 12, default: 18, lg: 26 };
@@ -330,7 +337,7 @@ function OrbitCubeSpinner({ size, color, speed }) {
330
337
  top: -overlap,
331
338
  left: -overlap
332
339
  };
333
- return /* @__PURE__ */ React.createElement(
340
+ return /* @__PURE__ */ jsx(
334
341
  "div",
335
342
  {
336
343
  className: cn(orbitTextColorMap[color]),
@@ -338,44 +345,46 @@ function OrbitCubeSpinner({ size, color, speed }) {
338
345
  width: cubeSize,
339
346
  height: cubeSize,
340
347
  perspective: cubeSize * 6
341
- }
342
- },
343
- /* @__PURE__ */ React.createElement(
344
- "div",
345
- {
346
- style: {
347
- width: cubeSize,
348
- height: cubeSize,
349
- transform: "rotateX(-25deg) rotateZ(15deg)",
350
- transformStyle: "preserve-3d"
351
- }
352
348
  },
353
- /* @__PURE__ */ React.createElement(
349
+ children: /* @__PURE__ */ jsx(
354
350
  "div",
355
351
  {
356
- className: "animate-spinner-orbit",
357
352
  style: {
358
- animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
359
353
  width: cubeSize,
360
354
  height: cubeSize,
361
- position: "relative",
355
+ transform: "rotateX(-25deg) rotateZ(15deg)",
362
356
  transformStyle: "preserve-3d"
363
- }
364
- },
365
- /* @__PURE__ */ React.createElement("div", { style: { ...faceBase, transform: `translateZ(${half}px)`, opacity: 0.25 } }),
366
- /* @__PURE__ */ React.createElement("div", { style: { ...faceBase, transform: `translateZ(${-half}px)`, opacity: 0.1 } }),
367
- /* @__PURE__ */ React.createElement("div", { style: { ...faceBase, transform: `rotateY(-90deg) translateZ(${half}px)`, opacity: 0.2 } }),
368
- /* @__PURE__ */ React.createElement("div", { style: { ...faceBase, transform: `rotateY(90deg) translateZ(${half}px)`, opacity: 0.2 } }),
369
- /* @__PURE__ */ React.createElement("div", { style: { ...faceBase, transform: `rotateX(90deg) translateZ(${half}px)`, opacity: 0.15 } }),
370
- /* @__PURE__ */ React.createElement("div", { style: { ...faceBase, transform: `rotateX(-90deg) translateZ(${half}px)`, opacity: 0.08 } })
357
+ },
358
+ children: /* @__PURE__ */ jsxs(
359
+ "div",
360
+ {
361
+ className: "animate-spinner-orbit",
362
+ style: {
363
+ animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
364
+ width: cubeSize,
365
+ height: cubeSize,
366
+ position: "relative",
367
+ transformStyle: "preserve-3d"
368
+ },
369
+ children: [
370
+ /* @__PURE__ */ jsx("div", { style: { ...faceBase, transform: `translateZ(${half}px)`, opacity: 0.25 } }),
371
+ /* @__PURE__ */ jsx("div", { style: { ...faceBase, transform: `translateZ(${-half}px)`, opacity: 0.1 } }),
372
+ /* @__PURE__ */ jsx("div", { style: { ...faceBase, transform: `rotateY(-90deg) translateZ(${half}px)`, opacity: 0.2 } }),
373
+ /* @__PURE__ */ jsx("div", { style: { ...faceBase, transform: `rotateY(90deg) translateZ(${half}px)`, opacity: 0.2 } }),
374
+ /* @__PURE__ */ jsx("div", { style: { ...faceBase, transform: `rotateX(90deg) translateZ(${half}px)`, opacity: 0.15 } }),
375
+ /* @__PURE__ */ jsx("div", { style: { ...faceBase, transform: `rotateX(-90deg) translateZ(${half}px)`, opacity: 0.08 } })
376
+ ]
377
+ }
378
+ )
379
+ }
371
380
  )
372
- )
381
+ }
373
382
  );
374
383
  }
375
384
  const FLIP_SIZES = { sm: 14, default: 20, lg: 28 };
376
385
  function OrbitFlipSpinner({ size, color, speed }) {
377
386
  const sqSize = FLIP_SIZES[size];
378
- return /* @__PURE__ */ React.createElement(
387
+ return /* @__PURE__ */ jsx(
379
388
  "div",
380
389
  {
381
390
  className: cn(orbitTextColorMap[color]),
@@ -383,28 +392,28 @@ function OrbitFlipSpinner({ size, color, speed }) {
383
392
  width: sqSize,
384
393
  height: sqSize,
385
394
  perspective: sqSize * 4
386
- }
387
- },
388
- /* @__PURE__ */ React.createElement("div", { style: { transform: "rotateX(25deg)", transformStyle: "preserve-3d", width: "100%", height: "100%" } }, /* @__PURE__ */ React.createElement(
389
- "div",
390
- {
391
- className: "animate-spinner-orbit",
392
- style: {
393
- animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
394
- width: "100%",
395
- height: "100%",
396
- borderRadius: "25%",
397
- backgroundColor: "currentColor",
398
- opacity: 0.85
395
+ },
396
+ children: /* @__PURE__ */ jsx("div", { style: { transform: "rotateX(25deg)", transformStyle: "preserve-3d", width: "100%", height: "100%" }, children: /* @__PURE__ */ jsx(
397
+ "div",
398
+ {
399
+ className: "animate-spinner-orbit",
400
+ style: {
401
+ animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
402
+ width: "100%",
403
+ height: "100%",
404
+ borderRadius: "25%",
405
+ backgroundColor: "currentColor",
406
+ opacity: 0.85
407
+ }
399
408
  }
400
- }
401
- ))
409
+ ) })
410
+ }
402
411
  );
403
412
  }
404
413
  const MORPH_SIZES = { sm: 16, default: 24, lg: 34 };
405
414
  function OrbitMorphSpinner({ size, color, speed }) {
406
415
  const morphSize = MORPH_SIZES[size];
407
- return /* @__PURE__ */ React.createElement(
416
+ return /* @__PURE__ */ jsx(
408
417
  "div",
409
418
  {
410
419
  className: cn(orbitTextColorMap[color]),
@@ -412,21 +421,21 @@ function OrbitMorphSpinner({ size, color, speed }) {
412
421
  width: morphSize,
413
422
  height: morphSize,
414
423
  perspective: morphSize * 3
415
- }
416
- },
417
- /* @__PURE__ */ React.createElement(
418
- "div",
419
- {
420
- className: "animate-spinner-morph",
421
- style: {
422
- animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
423
- width: "100%",
424
- height: "100%",
425
- backgroundColor: "currentColor",
426
- opacity: 0.85
424
+ },
425
+ children: /* @__PURE__ */ jsx(
426
+ "div",
427
+ {
428
+ className: "animate-spinner-morph",
429
+ style: {
430
+ animationDuration: `${ORBIT_SPEED_MS[speed]}ms`,
431
+ width: "100%",
432
+ height: "100%",
433
+ backgroundColor: "currentColor",
434
+ opacity: 0.85
435
+ }
427
436
  }
428
- }
429
- )
437
+ )
438
+ }
430
439
  );
431
440
  }
432
441
  export {