premium-react-loaders 1.0.2 → 1.1.0

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 (107) hide show
  1. package/dist/components/progress/ProgressSteps.d.ts +16 -0
  2. package/dist/components/progress/ProgressSteps.d.ts.map +1 -0
  3. package/dist/components/progress/index.d.ts +1 -0
  4. package/dist/components/progress/index.d.ts.map +1 -1
  5. package/dist/components/pulse/TypingIndicator.d.ts +16 -0
  6. package/dist/components/pulse/TypingIndicator.d.ts.map +1 -0
  7. package/dist/components/pulse/index.d.ts +1 -0
  8. package/dist/components/pulse/index.d.ts.map +1 -1
  9. package/dist/components/skeleton/SkeletonForm.d.ts +16 -0
  10. package/dist/components/skeleton/SkeletonForm.d.ts.map +1 -0
  11. package/dist/components/skeleton/index.d.ts +1 -0
  12. package/dist/components/skeleton/index.d.ts.map +1 -1
  13. package/dist/components/spinner/SpinnerPulse.d.ts +15 -0
  14. package/dist/components/spinner/SpinnerPulse.d.ts.map +1 -0
  15. package/dist/components/spinner/SpinnerWave.d.ts +15 -0
  16. package/dist/components/spinner/SpinnerWave.d.ts.map +1 -0
  17. package/dist/components/spinner/index.d.ts +2 -0
  18. package/dist/components/spinner/index.d.ts.map +1 -1
  19. package/dist/index.cjs +23 -13
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +23 -13
  23. package/dist/index.js.map +1 -1
  24. package/dist/index13.cjs +54 -35
  25. package/dist/index13.cjs.map +1 -1
  26. package/dist/index13.js +56 -37
  27. package/dist/index13.js.map +1 -1
  28. package/dist/index14.cjs +23 -12
  29. package/dist/index14.cjs.map +1 -1
  30. package/dist/index14.js +23 -12
  31. package/dist/index14.js.map +1 -1
  32. package/dist/index15.cjs +11 -34
  33. package/dist/index15.cjs.map +1 -1
  34. package/dist/index15.js +11 -34
  35. package/dist/index15.js.map +1 -1
  36. package/dist/index16.cjs +40 -23
  37. package/dist/index16.cjs.map +1 -1
  38. package/dist/index16.js +41 -24
  39. package/dist/index16.js.map +1 -1
  40. package/dist/index17.cjs +23 -36
  41. package/dist/index17.cjs.map +1 -1
  42. package/dist/index17.js +23 -36
  43. package/dist/index17.js.map +1 -1
  44. package/dist/index18.cjs +46 -78
  45. package/dist/index18.cjs.map +1 -1
  46. package/dist/index18.js +48 -80
  47. package/dist/index18.js.map +1 -1
  48. package/dist/index19.cjs +39 -103
  49. package/dist/index19.cjs.map +1 -1
  50. package/dist/index19.js +40 -104
  51. package/dist/index19.js.map +1 -1
  52. package/dist/index20.cjs +52 -107
  53. package/dist/index20.cjs.map +1 -1
  54. package/dist/index20.js +54 -109
  55. package/dist/index20.js.map +1 -1
  56. package/dist/index21.cjs +73 -27
  57. package/dist/index21.cjs.map +1 -1
  58. package/dist/index21.js +76 -30
  59. package/dist/index21.js.map +1 -1
  60. package/dist/index22.cjs +98 -31
  61. package/dist/index22.cjs.map +1 -1
  62. package/dist/index22.js +99 -32
  63. package/dist/index22.js.map +1 -1
  64. package/dist/index23.cjs +104 -33
  65. package/dist/index23.cjs.map +1 -1
  66. package/dist/index23.js +106 -35
  67. package/dist/index23.js.map +1 -1
  68. package/dist/index24.cjs +108 -48
  69. package/dist/index24.cjs.map +1 -1
  70. package/dist/index24.js +110 -50
  71. package/dist/index24.js.map +1 -1
  72. package/dist/index25.cjs +55 -16
  73. package/dist/index25.cjs.map +1 -1
  74. package/dist/index25.js +54 -15
  75. package/dist/index25.js.map +1 -1
  76. package/dist/index26.cjs +62 -0
  77. package/dist/index26.cjs.map +1 -0
  78. package/dist/index26.js +62 -0
  79. package/dist/index26.js.map +1 -0
  80. package/dist/index27.cjs +64 -0
  81. package/dist/index27.cjs.map +1 -0
  82. package/dist/index27.js +64 -0
  83. package/dist/index27.js.map +1 -0
  84. package/dist/index28.cjs +61 -0
  85. package/dist/index28.cjs.map +1 -0
  86. package/dist/index28.js +61 -0
  87. package/dist/index28.js.map +1 -0
  88. package/dist/index29.cjs +71 -0
  89. package/dist/index29.cjs.map +1 -0
  90. package/dist/index29.js +71 -0
  91. package/dist/index29.js.map +1 -0
  92. package/dist/index3.cjs +1 -1
  93. package/dist/index3.js +1 -1
  94. package/dist/index30.cjs +18 -0
  95. package/dist/index30.cjs.map +1 -0
  96. package/dist/index30.js +18 -0
  97. package/dist/index30.js.map +1 -0
  98. package/dist/premium-react-loaders.css +29 -0
  99. package/dist/types/progress.d.ts +24 -1
  100. package/dist/types/progress.d.ts.map +1 -1
  101. package/dist/types/pulse.d.ts +13 -0
  102. package/dist/types/pulse.d.ts.map +1 -1
  103. package/dist/types/skeleton.d.ts +17 -0
  104. package/dist/types/skeleton.d.ts.map +1 -1
  105. package/dist/types/spinner.d.ts +18 -0
  106. package/dist/types/spinner.d.ts.map +1 -1
  107. package/package.json +1 -1
package/dist/index19.cjs CHANGED
@@ -2,128 +2,64 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
- const colors = require("./index4.cjs");
6
5
  const classNames = require("./index3.cjs");
7
- const ProgressCircle = react.forwardRef(
6
+ const colors = require("./index4.cjs");
7
+ const SpinnerWave = react.forwardRef(
8
8
  ({
9
- value = 0,
10
- indeterminate = false,
11
- showValue = false,
12
- size = 60,
13
- thickness = 4,
9
+ size = 40,
14
10
  color = "#3b82f6",
15
- secondaryColor = "#e0e0e0",
16
- buffer,
11
+ ripples = 3,
12
+ maxScale = 2,
17
13
  speed = "normal",
18
14
  className,
19
15
  style,
20
- testId = "progress-circle",
16
+ testId = "spinner-wave",
21
17
  visible = true,
22
- ariaLabel,
18
+ ariaLabel = "Loading...",
23
19
  ...rest
24
20
  }, ref) => {
25
21
  if (!visible) return null;
26
- const clampedValue = Math.min(100, Math.max(0, value));
27
- const clampedBuffer = buffer !== void 0 ? Math.min(100, Math.max(0, buffer)) : void 0;
28
- const sizeValue = colors.parseSizeToNumber(size, 60);
29
- const thicknessValue = colors.parseSizeToNumber(thickness, 4);
30
- const radius = (sizeValue - thicknessValue * 2) / 2;
31
- const circumference = 2 * Math.PI * radius;
32
- const strokeDashoffset = circumference - clampedValue / 100 * circumference;
33
- const bufferDashoffset = clampedBuffer !== void 0 ? circumference - clampedBuffer / 100 * circumference : void 0;
34
- const progressLabel = ariaLabel || `Loading ${clampedValue}%`;
35
22
  const animationDuration = colors.getAnimationDuration(speed);
36
- return /* @__PURE__ */ jsxRuntime.jsxs(
23
+ const sizeValue = colors.normalizeSize(size);
24
+ return /* @__PURE__ */ jsxRuntime.jsx(
37
25
  "div",
38
26
  {
39
27
  ref,
40
28
  "data-testid": testId,
41
- className: classNames.cn("inline-flex items-center justify-center relative", className),
42
- style: {
43
- width: colors.normalizeSize(size),
44
- height: colors.normalizeSize(size),
45
- ...style
46
- },
47
- role: "progressbar",
48
- "aria-label": progressLabel,
49
- "aria-valuenow": indeterminate ? void 0 : clampedValue,
50
- "aria-valuemin": 0,
51
- "aria-valuemax": 100,
29
+ className: classNames.cn("inline-flex items-center justify-center", className),
30
+ style,
31
+ role: "status",
32
+ "aria-label": ariaLabel,
33
+ "aria-busy": "true",
52
34
  ...rest,
53
- children: [
54
- /* @__PURE__ */ jsxRuntime.jsxs(
55
- "svg",
56
- {
57
- className: classNames.cn(indeterminate && "animate-spinner-rotate"),
35
+ children: /* @__PURE__ */ jsxRuntime.jsx(
36
+ "div",
37
+ {
38
+ className: "relative",
39
+ style: {
58
40
  width: sizeValue,
59
- height: sizeValue,
60
- viewBox: `0 0 ${sizeValue} ${sizeValue}`,
61
- style: indeterminate ? { animation: `spinner-rotate ${animationDuration} linear infinite` } : void 0,
62
- children: [
63
- /* @__PURE__ */ jsxRuntime.jsx(
64
- "circle",
65
- {
66
- cx: sizeValue / 2,
67
- cy: sizeValue / 2,
68
- r: radius,
69
- fill: "none",
70
- stroke: secondaryColor,
71
- strokeWidth: thicknessValue
72
- }
73
- ),
74
- bufferDashoffset !== void 0 && !indeterminate && /* @__PURE__ */ jsxRuntime.jsx(
75
- "circle",
76
- {
77
- cx: sizeValue / 2,
78
- cy: sizeValue / 2,
79
- r: radius,
80
- fill: "none",
81
- stroke: color,
82
- strokeWidth: thicknessValue,
83
- strokeLinecap: "round",
84
- strokeDasharray: circumference,
85
- strokeDashoffset: bufferDashoffset,
86
- transform: `rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`,
87
- opacity: 0.3
88
- }
89
- ),
90
- /* @__PURE__ */ jsxRuntime.jsx(
91
- "circle",
92
- {
93
- cx: sizeValue / 2,
94
- cy: sizeValue / 2,
95
- r: radius,
96
- fill: "none",
97
- stroke: color,
98
- strokeWidth: thicknessValue,
99
- strokeLinecap: "round",
100
- strokeDasharray: circumference,
101
- strokeDashoffset: indeterminate ? circumference * 0.75 : strokeDashoffset,
102
- transform: `rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`,
103
- style: {
104
- transition: indeterminate ? "none" : "stroke-dashoffset 0.3s ease-in-out"
105
- }
106
- }
107
- )
108
- ]
109
- }
110
- ),
111
- showValue && !indeterminate && /* @__PURE__ */ jsxRuntime.jsxs(
112
- "span",
113
- {
114
- className: "absolute text-sm font-medium",
115
- style: { color },
116
- children: [
117
- clampedValue,
118
- "%"
119
- ]
120
- }
121
- )
122
- ]
41
+ height: sizeValue
42
+ },
43
+ children: Array.from({ length: ripples }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
44
+ "div",
45
+ {
46
+ className: "absolute inset-0 rounded-full border-2",
47
+ style: {
48
+ borderColor: color,
49
+ animation: `ripple-expand ${animationDuration} ease-out infinite`,
50
+ animationDelay: `${index * 0.4}s`,
51
+ // @ts-ignore - CSS variable for animation
52
+ "--max-scale": maxScale
53
+ }
54
+ },
55
+ index
56
+ ))
57
+ }
58
+ )
123
59
  }
124
60
  );
125
61
  }
126
62
  );
127
- ProgressCircle.displayName = "ProgressCircle";
128
- exports.ProgressCircle = ProgressCircle;
63
+ SpinnerWave.displayName = "SpinnerWave";
64
+ exports.SpinnerWave = SpinnerWave;
129
65
  //# sourceMappingURL=index19.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index19.cjs","sources":["../src/components/progress/ProgressCircle.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { ProgressCircleProps } from '../../types';\nimport { cn, normalizeSize, parseSizeToNumber, getAnimationDuration } from '../../utils';\n\n/**\n * ProgressCircle - SVG-based circular progress indicator\n *\n * A circular progress indicator that shows progress as a partial circle.\n *\n * @example\n * ```tsx\n * <ProgressCircle value={75} showValue />\n * <ProgressCircle value={50} size={80} thickness={6} />\n * <ProgressCircle indeterminate speed=\"fast\" />\n * <ProgressCircle value={50} buffer={75} />\n * ```\n */\nexport const ProgressCircle = forwardRef<HTMLDivElement, ProgressCircleProps>(\n (\n {\n value = 0,\n indeterminate = false,\n showValue = false,\n size = 60,\n thickness = 4,\n color = '#3b82f6',\n secondaryColor = '#e0e0e0',\n buffer,\n speed = 'normal',\n className,\n style,\n testId = 'progress-circle',\n visible = true,\n ariaLabel,\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const clampedValue = Math.min(100, Math.max(0, value));\n const clampedBuffer = buffer !== undefined ? Math.min(100, Math.max(0, buffer)) : undefined;\n const sizeValue = parseSizeToNumber(size, 60);\n const thicknessValue = parseSizeToNumber(thickness, 4);\n const radius = (sizeValue - thicknessValue * 2) / 2;\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference - (clampedValue / 100) * circumference;\n const bufferDashoffset = clampedBuffer !== undefined ? circumference - (clampedBuffer / 100) * circumference : undefined;\n const progressLabel = ariaLabel || `Loading ${clampedValue}%`;\n const animationDuration = getAnimationDuration(speed);\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={cn('inline-flex items-center justify-center relative', className)}\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n ...style,\n }}\n role=\"progressbar\"\n aria-label={progressLabel}\n aria-valuenow={indeterminate ? undefined : clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n {...rest}\n >\n <svg\n className={cn(indeterminate && 'animate-spinner-rotate')}\n width={sizeValue}\n height={sizeValue}\n viewBox={`0 0 ${sizeValue} ${sizeValue}`}\n style={indeterminate ? { animation: `spinner-rotate ${animationDuration} linear infinite` } : undefined}\n >\n {/* Background circle */}\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={secondaryColor}\n strokeWidth={thicknessValue}\n />\n {/* Buffer circle (behind progress) */}\n {bufferDashoffset !== undefined && !indeterminate && (\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={color}\n strokeWidth={thicknessValue}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={bufferDashoffset}\n transform={`rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`}\n opacity={0.3}\n />\n )}\n {/* Progress circle */}\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={color}\n strokeWidth={thicknessValue}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={indeterminate ? circumference * 0.75 : strokeDashoffset}\n transform={`rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`}\n style={{\n transition: indeterminate ? 'none' : 'stroke-dashoffset 0.3s ease-in-out',\n }}\n />\n </svg>\n {showValue && !indeterminate && (\n <span\n className=\"absolute text-sm font-medium\"\n style={{ color }}\n >\n {clampedValue}%\n </span>\n )}\n </div>\n );\n }\n);\n\nProgressCircle.displayName = 'ProgressCircle';\n"],"names":["forwardRef","parseSizeToNumber","getAnimationDuration","jsxs","cn","normalizeSize","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index19.cjs","sources":["../src/components/spinner/SpinnerWave.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerWaveProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerWave - Ripple wave spinner\n *\n * A spinner with expanding ripple circles creating a wave effect.\n *\n * @example\n * ```tsx\n * <SpinnerWave size={60} color=\"#3b82f6\" />\n * <SpinnerWave size={80} ripples={5} />\n * <SpinnerWave size={50} maxScale={2.5} speed=\"fast\" />\n * ```\n */\nexport const SpinnerWave = forwardRef<HTMLDivElement, SpinnerWaveProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n ripples = 3,\n maxScale = 2,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-wave',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const animationDuration = getAnimationDuration(speed);\n const sizeValue = normalizeSize(size);\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={cn('inline-flex items-center justify-center', className)}\n style={style}\n role=\"status\"\n aria-label={ariaLabel}\n aria-busy=\"true\"\n {...rest}\n >\n <div\n className=\"relative\"\n style={{\n width: sizeValue,\n height: sizeValue,\n }}\n >\n {/* Expanding ripples */}\n {Array.from({ length: ripples }).map((_, index) => (\n <div\n key={index}\n className=\"absolute inset-0 rounded-full border-2\"\n style={{\n borderColor: color,\n animation: `ripple-expand ${animationDuration} ease-out infinite`,\n animationDelay: `${index * 0.4}s`,\n // @ts-ignore - CSS variable for animation\n '--max-scale': maxScale,\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n);\n\nSpinnerWave.displayName = 'SpinnerWave';\n"],"names":["forwardRef","getAnimationDuration","normalizeSize","jsx","cn"],"mappings":";;;;;;AAgBO,MAAM,cAAcA,MAAAA;AAAAA,EACzB,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,GAAG;AAAA,EAAA,GAEL,QACG;AACH,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,oBAAoBC,OAAAA,qBAAqB,KAAK;AACpD,UAAM,YAAYC,OAAAA,cAAc,IAAI;AAEpC,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,eAAa;AAAA,QACb,WAAWC,WAAAA,GAAG,2CAA2C,SAAS;AAAA,QAClE;AAAA,QACA,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,aAAU;AAAA,QACT,GAAG;AAAA,QAEJ,UAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,YAAA;AAAA,YAIT,UAAA,MAAM,KAAK,EAAE,QAAQ,SAAS,EAAE,IAAI,CAAC,GAAG,UACvCA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,aAAa;AAAA,kBACb,WAAW,iBAAiB,iBAAiB;AAAA,kBAC7C,gBAAgB,GAAG,QAAQ,GAAG;AAAA;AAAA,kBAE9B,eAAe;AAAA,gBAAA;AAAA,cACjB;AAAA,cARK;AAAA,YAAA,CAUR;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;;"}
package/dist/index19.js CHANGED
@@ -1,129 +1,65 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
- import { normalizeSize, getAnimationDuration, parseSizeToNumber } from "./index4.js";
4
3
  import { cn } from "./index3.js";
5
- const ProgressCircle = forwardRef(
4
+ import { normalizeSize, getAnimationDuration } from "./index4.js";
5
+ const SpinnerWave = forwardRef(
6
6
  ({
7
- value = 0,
8
- indeterminate = false,
9
- showValue = false,
10
- size = 60,
11
- thickness = 4,
7
+ size = 40,
12
8
  color = "#3b82f6",
13
- secondaryColor = "#e0e0e0",
14
- buffer,
9
+ ripples = 3,
10
+ maxScale = 2,
15
11
  speed = "normal",
16
12
  className,
17
13
  style,
18
- testId = "progress-circle",
14
+ testId = "spinner-wave",
19
15
  visible = true,
20
- ariaLabel,
16
+ ariaLabel = "Loading...",
21
17
  ...rest
22
18
  }, ref) => {
23
19
  if (!visible) return null;
24
- const clampedValue = Math.min(100, Math.max(0, value));
25
- const clampedBuffer = buffer !== void 0 ? Math.min(100, Math.max(0, buffer)) : void 0;
26
- const sizeValue = parseSizeToNumber(size, 60);
27
- const thicknessValue = parseSizeToNumber(thickness, 4);
28
- const radius = (sizeValue - thicknessValue * 2) / 2;
29
- const circumference = 2 * Math.PI * radius;
30
- const strokeDashoffset = circumference - clampedValue / 100 * circumference;
31
- const bufferDashoffset = clampedBuffer !== void 0 ? circumference - clampedBuffer / 100 * circumference : void 0;
32
- const progressLabel = ariaLabel || `Loading ${clampedValue}%`;
33
20
  const animationDuration = getAnimationDuration(speed);
34
- return /* @__PURE__ */ jsxs(
21
+ const sizeValue = normalizeSize(size);
22
+ return /* @__PURE__ */ jsx(
35
23
  "div",
36
24
  {
37
25
  ref,
38
26
  "data-testid": testId,
39
- className: cn("inline-flex items-center justify-center relative", className),
40
- style: {
41
- width: normalizeSize(size),
42
- height: normalizeSize(size),
43
- ...style
44
- },
45
- role: "progressbar",
46
- "aria-label": progressLabel,
47
- "aria-valuenow": indeterminate ? void 0 : clampedValue,
48
- "aria-valuemin": 0,
49
- "aria-valuemax": 100,
27
+ className: cn("inline-flex items-center justify-center", className),
28
+ style,
29
+ role: "status",
30
+ "aria-label": ariaLabel,
31
+ "aria-busy": "true",
50
32
  ...rest,
51
- children: [
52
- /* @__PURE__ */ jsxs(
53
- "svg",
54
- {
55
- className: cn(indeterminate && "animate-spinner-rotate"),
33
+ children: /* @__PURE__ */ jsx(
34
+ "div",
35
+ {
36
+ className: "relative",
37
+ style: {
56
38
  width: sizeValue,
57
- height: sizeValue,
58
- viewBox: `0 0 ${sizeValue} ${sizeValue}`,
59
- style: indeterminate ? { animation: `spinner-rotate ${animationDuration} linear infinite` } : void 0,
60
- children: [
61
- /* @__PURE__ */ jsx(
62
- "circle",
63
- {
64
- cx: sizeValue / 2,
65
- cy: sizeValue / 2,
66
- r: radius,
67
- fill: "none",
68
- stroke: secondaryColor,
69
- strokeWidth: thicknessValue
70
- }
71
- ),
72
- bufferDashoffset !== void 0 && !indeterminate && /* @__PURE__ */ jsx(
73
- "circle",
74
- {
75
- cx: sizeValue / 2,
76
- cy: sizeValue / 2,
77
- r: radius,
78
- fill: "none",
79
- stroke: color,
80
- strokeWidth: thicknessValue,
81
- strokeLinecap: "round",
82
- strokeDasharray: circumference,
83
- strokeDashoffset: bufferDashoffset,
84
- transform: `rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`,
85
- opacity: 0.3
86
- }
87
- ),
88
- /* @__PURE__ */ jsx(
89
- "circle",
90
- {
91
- cx: sizeValue / 2,
92
- cy: sizeValue / 2,
93
- r: radius,
94
- fill: "none",
95
- stroke: color,
96
- strokeWidth: thicknessValue,
97
- strokeLinecap: "round",
98
- strokeDasharray: circumference,
99
- strokeDashoffset: indeterminate ? circumference * 0.75 : strokeDashoffset,
100
- transform: `rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`,
101
- style: {
102
- transition: indeterminate ? "none" : "stroke-dashoffset 0.3s ease-in-out"
103
- }
104
- }
105
- )
106
- ]
107
- }
108
- ),
109
- showValue && !indeterminate && /* @__PURE__ */ jsxs(
110
- "span",
111
- {
112
- className: "absolute text-sm font-medium",
113
- style: { color },
114
- children: [
115
- clampedValue,
116
- "%"
117
- ]
118
- }
119
- )
120
- ]
39
+ height: sizeValue
40
+ },
41
+ children: Array.from({ length: ripples }).map((_, index) => /* @__PURE__ */ jsx(
42
+ "div",
43
+ {
44
+ className: "absolute inset-0 rounded-full border-2",
45
+ style: {
46
+ borderColor: color,
47
+ animation: `ripple-expand ${animationDuration} ease-out infinite`,
48
+ animationDelay: `${index * 0.4}s`,
49
+ // @ts-ignore - CSS variable for animation
50
+ "--max-scale": maxScale
51
+ }
52
+ },
53
+ index
54
+ ))
55
+ }
56
+ )
121
57
  }
122
58
  );
123
59
  }
124
60
  );
125
- ProgressCircle.displayName = "ProgressCircle";
61
+ SpinnerWave.displayName = "SpinnerWave";
126
62
  export {
127
- ProgressCircle
63
+ SpinnerWave
128
64
  };
129
65
  //# sourceMappingURL=index19.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index19.js","sources":["../src/components/progress/ProgressCircle.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { ProgressCircleProps } from '../../types';\nimport { cn, normalizeSize, parseSizeToNumber, getAnimationDuration } from '../../utils';\n\n/**\n * ProgressCircle - SVG-based circular progress indicator\n *\n * A circular progress indicator that shows progress as a partial circle.\n *\n * @example\n * ```tsx\n * <ProgressCircle value={75} showValue />\n * <ProgressCircle value={50} size={80} thickness={6} />\n * <ProgressCircle indeterminate speed=\"fast\" />\n * <ProgressCircle value={50} buffer={75} />\n * ```\n */\nexport const ProgressCircle = forwardRef<HTMLDivElement, ProgressCircleProps>(\n (\n {\n value = 0,\n indeterminate = false,\n showValue = false,\n size = 60,\n thickness = 4,\n color = '#3b82f6',\n secondaryColor = '#e0e0e0',\n buffer,\n speed = 'normal',\n className,\n style,\n testId = 'progress-circle',\n visible = true,\n ariaLabel,\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const clampedValue = Math.min(100, Math.max(0, value));\n const clampedBuffer = buffer !== undefined ? Math.min(100, Math.max(0, buffer)) : undefined;\n const sizeValue = parseSizeToNumber(size, 60);\n const thicknessValue = parseSizeToNumber(thickness, 4);\n const radius = (sizeValue - thicknessValue * 2) / 2;\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference - (clampedValue / 100) * circumference;\n const bufferDashoffset = clampedBuffer !== undefined ? circumference - (clampedBuffer / 100) * circumference : undefined;\n const progressLabel = ariaLabel || `Loading ${clampedValue}%`;\n const animationDuration = getAnimationDuration(speed);\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={cn('inline-flex items-center justify-center relative', className)}\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n ...style,\n }}\n role=\"progressbar\"\n aria-label={progressLabel}\n aria-valuenow={indeterminate ? undefined : clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n {...rest}\n >\n <svg\n className={cn(indeterminate && 'animate-spinner-rotate')}\n width={sizeValue}\n height={sizeValue}\n viewBox={`0 0 ${sizeValue} ${sizeValue}`}\n style={indeterminate ? { animation: `spinner-rotate ${animationDuration} linear infinite` } : undefined}\n >\n {/* Background circle */}\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={secondaryColor}\n strokeWidth={thicknessValue}\n />\n {/* Buffer circle (behind progress) */}\n {bufferDashoffset !== undefined && !indeterminate && (\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={color}\n strokeWidth={thicknessValue}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={bufferDashoffset}\n transform={`rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`}\n opacity={0.3}\n />\n )}\n {/* Progress circle */}\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={color}\n strokeWidth={thicknessValue}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={indeterminate ? circumference * 0.75 : strokeDashoffset}\n transform={`rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`}\n style={{\n transition: indeterminate ? 'none' : 'stroke-dashoffset 0.3s ease-in-out',\n }}\n />\n </svg>\n {showValue && !indeterminate && (\n <span\n className=\"absolute text-sm font-medium\"\n style={{ color }}\n >\n {clampedValue}%\n </span>\n )}\n </div>\n );\n }\n);\n\nProgressCircle.displayName = 'ProgressCircle';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index19.js","sources":["../src/components/spinner/SpinnerWave.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerWaveProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerWave - Ripple wave spinner\n *\n * A spinner with expanding ripple circles creating a wave effect.\n *\n * @example\n * ```tsx\n * <SpinnerWave size={60} color=\"#3b82f6\" />\n * <SpinnerWave size={80} ripples={5} />\n * <SpinnerWave size={50} maxScale={2.5} speed=\"fast\" />\n * ```\n */\nexport const SpinnerWave = forwardRef<HTMLDivElement, SpinnerWaveProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n ripples = 3,\n maxScale = 2,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-wave',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const animationDuration = getAnimationDuration(speed);\n const sizeValue = normalizeSize(size);\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={cn('inline-flex items-center justify-center', className)}\n style={style}\n role=\"status\"\n aria-label={ariaLabel}\n aria-busy=\"true\"\n {...rest}\n >\n <div\n className=\"relative\"\n style={{\n width: sizeValue,\n height: sizeValue,\n }}\n >\n {/* Expanding ripples */}\n {Array.from({ length: ripples }).map((_, index) => (\n <div\n key={index}\n className=\"absolute inset-0 rounded-full border-2\"\n style={{\n borderColor: color,\n animation: `ripple-expand ${animationDuration} ease-out infinite`,\n animationDelay: `${index * 0.4}s`,\n // @ts-ignore - CSS variable for animation\n '--max-scale': maxScale,\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n);\n\nSpinnerWave.displayName = 'SpinnerWave';\n"],"names":[],"mappings":";;;;AAgBO,MAAM,cAAc;AAAA,EACzB,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,GAAG;AAAA,EAAA,GAEL,QACG;AACH,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,oBAAoB,qBAAqB,KAAK;AACpD,UAAM,YAAY,cAAc,IAAI;AAEpC,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,eAAa;AAAA,QACb,WAAW,GAAG,2CAA2C,SAAS;AAAA,QAClE;AAAA,QACA,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,aAAU;AAAA,QACT,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,YAAA;AAAA,YAIT,UAAA,MAAM,KAAK,EAAE,QAAQ,SAAS,EAAE,IAAI,CAAC,GAAG,UACvC;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,aAAa;AAAA,kBACb,WAAW,iBAAiB,iBAAiB;AAAA,kBAC7C,gBAAgB,GAAG,QAAQ,GAAG;AAAA;AAAA,kBAE9B,eAAe;AAAA,gBAAA;AAAA,cACjB;AAAA,cARK;AAAA,YAAA,CAUR;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;"}
package/dist/index20.cjs CHANGED
@@ -2,134 +2,79 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
- const colors = require("./index4.cjs");
6
5
  const classNames = require("./index3.cjs");
7
- const ProgressRing = react.forwardRef(
6
+ const colors = require("./index4.cjs");
7
+ const SpinnerPulse = react.forwardRef(
8
8
  ({
9
- value = 0,
10
- indeterminate = false,
11
- showValue = false,
12
- size = 60,
13
- thickness = 4,
9
+ size = 40,
14
10
  color = "#3b82f6",
15
- secondaryColor = "#e0e0e0",
16
- gradient = false,
17
- buffer,
11
+ pulses = 2,
12
+ maxScale = 1.8,
18
13
  speed = "normal",
19
14
  className,
20
15
  style,
21
- testId = "progress-ring",
16
+ testId = "spinner-pulse",
22
17
  visible = true,
23
- ariaLabel,
18
+ ariaLabel = "Loading...",
24
19
  ...rest
25
20
  }, ref) => {
26
21
  if (!visible) return null;
27
- const clampedValue = Math.min(100, Math.max(0, value));
28
- const clampedBuffer = buffer !== void 0 ? Math.min(100, Math.max(0, buffer)) : void 0;
29
- const sizeValue = colors.parseSizeToNumber(size, 60);
30
- const thicknessValue = colors.parseSizeToNumber(thickness, 4);
31
- const radius = (sizeValue - thicknessValue * 2) / 2;
32
- const circumference = 2 * Math.PI * radius;
33
- const strokeDashoffset = circumference - clampedValue / 100 * circumference;
34
- const bufferDashoffset = clampedBuffer !== void 0 ? circumference - clampedBuffer / 100 * circumference : void 0;
35
- const progressLabel = ariaLabel || `Loading ${clampedValue}%`;
36
22
  const animationDuration = colors.getAnimationDuration(speed);
37
- const gradientId = react.useMemo(() => `progress-gradient-${Math.random().toString(36).substr(2, 9)}`, []);
38
- return /* @__PURE__ */ jsxRuntime.jsxs(
23
+ const sizeValue = colors.normalizeSize(size);
24
+ return /* @__PURE__ */ jsxRuntime.jsx(
39
25
  "div",
40
26
  {
41
27
  ref,
42
28
  "data-testid": testId,
43
- className: classNames.cn("inline-flex items-center justify-center relative", className),
44
- style: {
45
- width: colors.normalizeSize(size),
46
- height: colors.normalizeSize(size),
47
- ...style
48
- },
49
- role: "progressbar",
50
- "aria-label": progressLabel,
51
- "aria-valuenow": indeterminate ? void 0 : clampedValue,
52
- "aria-valuemin": 0,
53
- "aria-valuemax": 100,
29
+ className: classNames.cn("inline-flex items-center justify-center", className),
30
+ style,
31
+ role: "status",
32
+ "aria-label": ariaLabel,
33
+ "aria-busy": "true",
54
34
  ...rest,
55
- children: [
56
- /* @__PURE__ */ jsxRuntime.jsxs(
57
- "svg",
58
- {
59
- className: classNames.cn(indeterminate && "animate-spinner-rotate"),
35
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
36
+ "div",
37
+ {
38
+ className: "relative",
39
+ style: {
60
40
  width: sizeValue,
61
- height: sizeValue,
62
- viewBox: `0 0 ${sizeValue} ${sizeValue}`,
63
- style: indeterminate ? { animation: `spinner-rotate ${animationDuration} linear infinite` } : void 0,
64
- children: [
65
- gradient && /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: gradientId, x1: "0%", y1: "0%", x2: "100%", y2: "100%", children: [
66
- /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: color }),
67
- /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: secondaryColor === "#e0e0e0" ? "#8b5cf6" : secondaryColor })
68
- ] }) }),
69
- /* @__PURE__ */ jsxRuntime.jsx(
70
- "circle",
71
- {
72
- cx: sizeValue / 2,
73
- cy: sizeValue / 2,
74
- r: radius,
75
- fill: "none",
76
- stroke: gradient ? "#e0e0e0" : secondaryColor,
77
- strokeWidth: thicknessValue
78
- }
79
- ),
80
- bufferDashoffset !== void 0 && !indeterminate && /* @__PURE__ */ jsxRuntime.jsx(
81
- "circle",
82
- {
83
- cx: sizeValue / 2,
84
- cy: sizeValue / 2,
85
- r: radius,
86
- fill: "none",
87
- stroke: gradient ? `url(#${gradientId})` : color,
88
- strokeWidth: thicknessValue,
89
- strokeLinecap: "round",
90
- strokeDasharray: circumference,
91
- strokeDashoffset: bufferDashoffset,
92
- transform: `rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`,
93
- opacity: 0.3
41
+ height: sizeValue
42
+ },
43
+ children: [
44
+ Array.from({ length: pulses }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
45
+ "div",
46
+ {
47
+ className: "absolute inset-0 rounded-full",
48
+ style: {
49
+ backgroundColor: color,
50
+ animation: `heartbeat-pulse ${animationDuration} ease-out infinite`,
51
+ animationDelay: `${index * 0.3}s`,
52
+ // @ts-ignore - CSS variable for animation
53
+ "--max-scale": maxScale
94
54
  }
95
- ),
96
- /* @__PURE__ */ jsxRuntime.jsx(
97
- "circle",
98
- {
99
- cx: sizeValue / 2,
100
- cy: sizeValue / 2,
101
- r: radius,
102
- fill: "none",
103
- stroke: gradient ? `url(#${gradientId})` : color,
104
- strokeWidth: thicknessValue,
105
- strokeLinecap: "round",
106
- strokeDasharray: circumference,
107
- strokeDashoffset: indeterminate ? circumference * 0.75 : strokeDashoffset,
108
- transform: `rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`,
109
- style: {
110
- transition: indeterminate ? "none" : "stroke-dashoffset 0.3s ease-in-out"
111
- }
55
+ },
56
+ index
57
+ )),
58
+ /* @__PURE__ */ jsxRuntime.jsx(
59
+ "div",
60
+ {
61
+ className: "absolute rounded-full",
62
+ style: {
63
+ backgroundColor: color,
64
+ width: "50%",
65
+ height: "50%",
66
+ top: "25%",
67
+ left: "25%"
112
68
  }
113
- )
114
- ]
115
- }
116
- ),
117
- showValue && !indeterminate && /* @__PURE__ */ jsxRuntime.jsxs(
118
- "span",
119
- {
120
- className: "absolute text-sm font-semibold",
121
- style: { color },
122
- children: [
123
- clampedValue,
124
- "%"
125
- ]
126
- }
127
- )
128
- ]
69
+ }
70
+ )
71
+ ]
72
+ }
73
+ )
129
74
  }
130
75
  );
131
76
  }
132
77
  );
133
- ProgressRing.displayName = "ProgressRing";
134
- exports.ProgressRing = ProgressRing;
78
+ SpinnerPulse.displayName = "SpinnerPulse";
79
+ exports.SpinnerPulse = SpinnerPulse;
135
80
  //# sourceMappingURL=index20.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index20.cjs","sources":["../src/components/progress/ProgressRing.tsx"],"sourcesContent":["import { forwardRef, useMemo } from 'react';\nimport { ProgressRingProps } from '../../types';\nimport { cn, normalizeSize, parseSizeToNumber, getAnimationDuration } from '../../utils';\n\n/**\n * ProgressRing - Ring-style progress with gradient option\n *\n * A circular progress ring with optional gradient colors.\n *\n * @example\n * ```tsx\n * <ProgressRing value={75} showValue />\n * <ProgressRing value={60} gradient secondaryColor=\"#8b5cf6\" />\n * <ProgressRing indeterminate speed=\"fast\" />\n * <ProgressRing value={50} buffer={75} />\n * ```\n */\nexport const ProgressRing = forwardRef<HTMLDivElement, ProgressRingProps>(\n (\n {\n value = 0,\n indeterminate = false,\n showValue = false,\n size = 60,\n thickness = 4,\n color = '#3b82f6',\n secondaryColor = '#e0e0e0',\n gradient = false,\n buffer,\n speed = 'normal',\n className,\n style,\n testId = 'progress-ring',\n visible = true,\n ariaLabel,\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const clampedValue = Math.min(100, Math.max(0, value));\n const clampedBuffer = buffer !== undefined ? Math.min(100, Math.max(0, buffer)) : undefined;\n const sizeValue = parseSizeToNumber(size, 60);\n const thicknessValue = parseSizeToNumber(thickness, 4);\n const radius = (sizeValue - thicknessValue * 2) / 2;\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference - (clampedValue / 100) * circumference;\n const bufferDashoffset = clampedBuffer !== undefined ? circumference - (clampedBuffer / 100) * circumference : undefined;\n const progressLabel = ariaLabel || `Loading ${clampedValue}%`;\n const animationDuration = getAnimationDuration(speed);\n const gradientId = useMemo(() => `progress-gradient-${Math.random().toString(36).substr(2, 9)}`, []);\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={cn('inline-flex items-center justify-center relative', className)}\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n ...style,\n }}\n role=\"progressbar\"\n aria-label={progressLabel}\n aria-valuenow={indeterminate ? undefined : clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n {...rest}\n >\n <svg\n className={cn(indeterminate && 'animate-spinner-rotate')}\n width={sizeValue}\n height={sizeValue}\n viewBox={`0 0 ${sizeValue} ${sizeValue}`}\n style={indeterminate ? { animation: `spinner-rotate ${animationDuration} linear infinite` } : undefined}\n >\n {gradient && (\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor={color} />\n <stop offset=\"100%\" stopColor={secondaryColor === '#e0e0e0' ? '#8b5cf6' : secondaryColor} />\n </linearGradient>\n </defs>\n )}\n {/* Background circle */}\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={gradient ? '#e0e0e0' : secondaryColor}\n strokeWidth={thicknessValue}\n />\n {/* Buffer circle (behind progress) */}\n {bufferDashoffset !== undefined && !indeterminate && (\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={gradient ? `url(#${gradientId})` : color}\n strokeWidth={thicknessValue}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={bufferDashoffset}\n transform={`rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`}\n opacity={0.3}\n />\n )}\n {/* Progress circle */}\n <circle\n cx={sizeValue / 2}\n cy={sizeValue / 2}\n r={radius}\n fill=\"none\"\n stroke={gradient ? `url(#${gradientId})` : color}\n strokeWidth={thicknessValue}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={indeterminate ? circumference * 0.75 : strokeDashoffset}\n transform={`rotate(-90 ${sizeValue / 2} ${sizeValue / 2})`}\n style={{\n transition: indeterminate ? 'none' : 'stroke-dashoffset 0.3s ease-in-out',\n }}\n />\n </svg>\n {showValue && !indeterminate && (\n <span\n className=\"absolute text-sm font-semibold\"\n style={{ color }}\n >\n {clampedValue}%\n </span>\n )}\n </div>\n );\n }\n);\n\nProgressRing.displayName = 'ProgressRing';\n"],"names":["forwardRef","parseSizeToNumber","getAnimationDuration","useMemo","jsxs","cn","normalizeSize","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index20.cjs","sources":["../src/components/spinner/SpinnerPulse.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerPulseProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerPulse - Heartbeat pulse spinner\n *\n * A spinner with pulsing circles that scale and fade, creating a heartbeat effect.\n *\n * @example\n * ```tsx\n * <SpinnerPulse size={60} color=\"#3b82f6\" />\n * <SpinnerPulse size={80} pulses={3} />\n * <SpinnerPulse size={50} maxScale={2.5} speed=\"slow\" />\n * ```\n */\nexport const SpinnerPulse = forwardRef<HTMLDivElement, SpinnerPulseProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n pulses = 2,\n maxScale = 1.8,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-pulse',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const animationDuration = getAnimationDuration(speed);\n const sizeValue = normalizeSize(size);\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={cn('inline-flex items-center justify-center', className)}\n style={style}\n role=\"status\"\n aria-label={ariaLabel}\n aria-busy=\"true\"\n {...rest}\n >\n <div\n className=\"relative\"\n style={{\n width: sizeValue,\n height: sizeValue,\n }}\n >\n {/* Pulsing circles */}\n {Array.from({ length: pulses }).map((_, index) => (\n <div\n key={index}\n className=\"absolute inset-0 rounded-full\"\n style={{\n backgroundColor: color,\n animation: `heartbeat-pulse ${animationDuration} ease-out infinite`,\n animationDelay: `${index * 0.3}s`,\n // @ts-ignore - CSS variable for animation\n '--max-scale': maxScale,\n }}\n />\n ))}\n\n {/* Static center circle */}\n <div\n className=\"absolute rounded-full\"\n style={{\n backgroundColor: color,\n width: '50%',\n height: '50%',\n top: '25%',\n left: '25%',\n }}\n />\n </div>\n </div>\n );\n }\n);\n\nSpinnerPulse.displayName = 'SpinnerPulse';\n"],"names":["forwardRef","getAnimationDuration","normalizeSize","jsx","cn","jsxs"],"mappings":";;;;;;AAgBO,MAAM,eAAeA,MAAAA;AAAAA,EAC1B,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,GAAG;AAAA,EAAA,GAEL,QACG;AACH,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,oBAAoBC,OAAAA,qBAAqB,KAAK;AACpD,UAAM,YAAYC,OAAAA,cAAc,IAAI;AAEpC,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,eAAa;AAAA,QACb,WAAWC,WAAAA,GAAG,2CAA2C,SAAS;AAAA,QAClE;AAAA,QACA,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,aAAU;AAAA,QACT,GAAG;AAAA,QAEJ,UAAAC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,YAAA;AAAA,YAIT,UAAA;AAAA,cAAA,MAAM,KAAK,EAAE,QAAQ,OAAA,CAAQ,EAAE,IAAI,CAAC,GAAG,UACtCF,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,iBAAiB;AAAA,oBACjB,WAAW,mBAAmB,iBAAiB;AAAA,oBAC/C,gBAAgB,GAAG,QAAQ,GAAG;AAAA;AAAA,oBAE9B,eAAe;AAAA,kBAAA;AAAA,gBACjB;AAAA,gBARK;AAAA,cAAA,CAUR;AAAA,cAGDA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,iBAAiB;AAAA,oBACjB,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,KAAK;AAAA,oBACL,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,aAAa,cAAc;;"}