{"version":3,"sources":["../src/spinner/index.tsx"],"names":["useTheme","jsx","jsxs"],"mappings":"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","file":"spinner.cjs","sourcesContent":["/**\n * Spinner (web). Indeterminate loading indicator built on an SVG arc +\n * a CSS keyframe. Theme-colored by default, override with `color`.\n *\n *   <Spinner />\n *   <Spinner size=\"lg\" color={colors.primaryOrange} />\n *   <Button loading={isSaving} iconLeading={<Spinner size=\"sm\" />}>Save</Button>\n *\n * Renders an aria-label by default so the loading state is announced to\n * screen readers; pass `label={null}` to suppress when there's already a\n * visible \"Loading…\" text alongside.\n */\nimport { useTheme } from \"@plyxui/styles\";\n\nexport type SpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst sizeMap: Record<SpinnerSize, number> = {\n  xs: 12,\n  sm: 16,\n  md: 20,\n  lg: 28,\n  xl: 40,\n};\n\nexport interface SpinnerProps {\n  size?: SpinnerSize | number;\n  /** Defaults to primaryOrange. */\n  color?: string;\n  /** Stroke thickness as a fraction of size. Default 0.12. */\n  thickness?: number;\n  /** Screen-reader label. Default \"Loading\". Pass null to suppress. */\n  label?: string | null;\n  className?: string;\n}\n\n// Inject the keyframes once per page. Avoids a global stylesheet dependency.\nconst KEYFRAMES_ID = \"plyxui-spinner-keyframes\";\nfunction ensureKeyframes() {\n  if (typeof document === \"undefined\") return;\n  if (document.getElementById(KEYFRAMES_ID)) return;\n  const style = document.createElement(\"style\");\n  style.id = KEYFRAMES_ID;\n  style.textContent = `\n@keyframes plyxui-spin {\n  to { transform: rotate(360deg); }\n}`;\n  document.head.appendChild(style);\n}\n\nexport function Spinner({\n  size = \"md\",\n  color,\n  thickness = 0.12,\n  label = \"Loading\",\n  className,\n}: SpinnerProps) {\n  ensureKeyframes();\n  const { colors } = useTheme();\n  const px = typeof size === \"number\" ? size : sizeMap[size];\n  const stroke = Math.max(1, Math.round(px * thickness));\n  const finalColor = color ?? colors.primaryOrange;\n  const r = (px - stroke) / 2;\n  const c = px / 2;\n  const circumference = 2 * Math.PI * r;\n  // Show ~25% of the ring at any time.\n  const dash = circumference * 0.25;\n\n  return (\n    <span\n      role={label ? \"status\" : \"presentation\"}\n      aria-label={label ?? undefined}\n      className={className}\n      style={{\n        display: \"inline-block\",\n        width: px,\n        height: px,\n        animation: \"plyxui-spin 0.7s linear infinite\",\n        color: finalColor,\n        lineHeight: 0,\n      }}\n    >\n      <svg width={px} height={px} viewBox={`0 0 ${px} ${px}`} fill=\"none\">\n        <circle cx={c} cy={c} r={r} stroke=\"currentColor\" strokeOpacity={0.18} strokeWidth={stroke} />\n        <circle\n          cx={c}\n          cy={c}\n          r={r}\n          stroke=\"currentColor\"\n          strokeWidth={stroke}\n          strokeLinecap=\"round\"\n          strokeDasharray={`${dash} ${circumference - dash}`}\n          transform={`rotate(-90 ${c} ${c})`}\n        />\n      </svg>\n    </span>\n  );\n}\n"]}