premium-react-loaders 1.0.0 → 1.0.2

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 (105) hide show
  1. package/README.md +49 -3
  2. package/dist/components/index.d.ts +1 -0
  3. package/dist/components/index.d.ts.map +1 -1
  4. package/dist/components/overlay/LoaderOverlay.d.ts +28 -0
  5. package/dist/components/overlay/LoaderOverlay.d.ts.map +1 -0
  6. package/dist/components/overlay/index.d.ts +2 -0
  7. package/dist/components/overlay/index.d.ts.map +1 -0
  8. package/dist/components/progress/ProgressBar.d.ts +2 -0
  9. package/dist/components/progress/ProgressBar.d.ts.map +1 -1
  10. package/dist/components/progress/ProgressCircle.d.ts +2 -1
  11. package/dist/components/progress/ProgressCircle.d.ts.map +1 -1
  12. package/dist/components/progress/ProgressRing.d.ts +2 -1
  13. package/dist/components/progress/ProgressRing.d.ts.map +1 -1
  14. package/dist/components/skeleton/SkeletonPage.d.ts +16 -0
  15. package/dist/components/skeleton/SkeletonPage.d.ts.map +1 -0
  16. package/dist/components/skeleton/SkeletonText.d.ts +1 -1
  17. package/dist/components/skeleton/SkeletonText.d.ts.map +1 -1
  18. package/dist/components/skeleton/index.d.ts +1 -0
  19. package/dist/components/skeleton/index.d.ts.map +1 -1
  20. package/dist/components/spinner/SpinnerDots.d.ts.map +1 -1
  21. package/dist/components/spinner/SpinnerRing.d.ts +1 -0
  22. package/dist/components/spinner/SpinnerRing.d.ts.map +1 -1
  23. package/dist/index.cjs +16 -12
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.js +16 -12
  27. package/dist/index.js.map +1 -1
  28. package/dist/index12.cjs +126 -37
  29. package/dist/index12.cjs.map +1 -1
  30. package/dist/index12.js +127 -38
  31. package/dist/index12.js.map +1 -1
  32. package/dist/index13.cjs +23 -11
  33. package/dist/index13.cjs.map +1 -1
  34. package/dist/index13.js +23 -11
  35. package/dist/index13.js.map +1 -1
  36. package/dist/index14.cjs +10 -32
  37. package/dist/index14.cjs.map +1 -1
  38. package/dist/index14.js +10 -32
  39. package/dist/index14.js.map +1 -1
  40. package/dist/index15.cjs +41 -24
  41. package/dist/index15.cjs.map +1 -1
  42. package/dist/index15.js +42 -25
  43. package/dist/index15.js.map +1 -1
  44. package/dist/index16.cjs +24 -37
  45. package/dist/index16.cjs.map +1 -1
  46. package/dist/index16.js +24 -37
  47. package/dist/index16.js.map +1 -1
  48. package/dist/index17.cjs +48 -58
  49. package/dist/index17.cjs.map +1 -1
  50. package/dist/index17.js +49 -59
  51. package/dist/index17.js.map +1 -1
  52. package/dist/index18.cjs +49 -53
  53. package/dist/index18.cjs.map +1 -1
  54. package/dist/index18.js +51 -55
  55. package/dist/index18.js.map +1 -1
  56. package/dist/index19.cjs +32 -16
  57. package/dist/index19.cjs.map +1 -1
  58. package/dist/index19.js +33 -17
  59. package/dist/index19.js.map +1 -1
  60. package/dist/index20.cjs +104 -26
  61. package/dist/index20.cjs.map +1 -1
  62. package/dist/index20.js +107 -29
  63. package/dist/index20.js.map +1 -1
  64. package/dist/index21.cjs +21 -26
  65. package/dist/index21.cjs.map +1 -1
  66. package/dist/index21.js +21 -26
  67. package/dist/index21.js.map +1 -1
  68. package/dist/index22.cjs +10 -12
  69. package/dist/index22.cjs.map +1 -1
  70. package/dist/index22.js +11 -13
  71. package/dist/index22.js.map +1 -1
  72. package/dist/index23.cjs +62 -16
  73. package/dist/index23.cjs.map +1 -1
  74. package/dist/index23.js +61 -15
  75. package/dist/index23.js.map +1 -1
  76. package/dist/index24.cjs +71 -0
  77. package/dist/index24.cjs.map +1 -0
  78. package/dist/index24.js +71 -0
  79. package/dist/index24.js.map +1 -0
  80. package/dist/index25.cjs +18 -0
  81. package/dist/index25.cjs.map +1 -0
  82. package/dist/index25.js +18 -0
  83. package/dist/index25.js.map +1 -0
  84. package/dist/index3.cjs +1 -1
  85. package/dist/index3.js +1 -1
  86. package/dist/index4.cjs +63 -3
  87. package/dist/index4.cjs.map +1 -1
  88. package/dist/index4.js +64 -4
  89. package/dist/index4.js.map +1 -1
  90. package/dist/index6.cjs +2 -1
  91. package/dist/index6.cjs.map +1 -1
  92. package/dist/index6.js +2 -1
  93. package/dist/index6.js.map +1 -1
  94. package/dist/premium-react-loaders.css +101 -0
  95. package/dist/types/index.d.ts +1 -0
  96. package/dist/types/index.d.ts.map +1 -1
  97. package/dist/types/overlay.d.ts +24 -0
  98. package/dist/types/overlay.d.ts.map +1 -0
  99. package/dist/types/progress.d.ts +8 -0
  100. package/dist/types/progress.d.ts.map +1 -1
  101. package/dist/types/skeleton.d.ts +9 -0
  102. package/dist/types/skeleton.d.ts.map +1 -1
  103. package/dist/utils/colors.d.ts +14 -1
  104. package/dist/utils/colors.d.ts.map +1 -1
  105. package/package.json +7 -1
package/dist/index12.js CHANGED
@@ -1,63 +1,152 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
- import { getAnimationDuration, normalizeSize } from "./index4.js";
3
+ import { Skeleton } from "./index5.js";
4
+ import { SkeletonText } from "./index6.js";
5
+ import { SkeletonAvatar } from "./index7.js";
4
6
  import { cn } from "./index3.js";
5
- const SpinnerCircle = forwardRef(
7
+ const SkeletonPage = forwardRef(
6
8
  ({
7
- size = 40,
8
- color = "#3b82f6",
9
- thickness = 4,
10
- speed = "normal",
9
+ variant = "default",
10
+ animate = true,
11
+ baseColor = "#e0e0e0",
12
+ highlightColor = "#f5f5f5",
11
13
  className,
12
14
  style,
13
- testId = "spinner-circle",
15
+ testId = "skeleton-page",
14
16
  visible = true,
15
- ariaLabel = "Loading...",
16
17
  ...rest
17
18
  }, ref) => {
18
19
  if (!visible) return null;
20
+ const commonProps = {
21
+ animate,
22
+ baseColor,
23
+ highlightColor
24
+ };
25
+ const renderDefault = () => /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
26
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b pb-4", children: [
27
+ /* @__PURE__ */ jsx(Skeleton, { width: 200, height: 32, ...commonProps }),
28
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
29
+ /* @__PURE__ */ jsx(Skeleton, { width: 100, height: 36, borderRadius: 6, ...commonProps }),
30
+ /* @__PURE__ */ jsx(SkeletonAvatar, { size: 40, ...commonProps })
31
+ ] })
32
+ ] }),
33
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
34
+ /* @__PURE__ */ jsx(SkeletonText, { lines: 3, ...commonProps }),
35
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-4", children: [
36
+ /* @__PURE__ */ jsx(Skeleton, { height: 120, borderRadius: 8, ...commonProps }),
37
+ /* @__PURE__ */ jsx(Skeleton, { height: 120, borderRadius: 8, ...commonProps }),
38
+ /* @__PURE__ */ jsx(Skeleton, { height: 120, borderRadius: 8, ...commonProps })
39
+ ] }),
40
+ /* @__PURE__ */ jsx(SkeletonText, { lines: 5, ...commonProps })
41
+ ] })
42
+ ] });
43
+ const renderDashboard = () => /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
44
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
45
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
46
+ /* @__PURE__ */ jsx(Skeleton, { width: 180, height: 28, ...commonProps }),
47
+ /* @__PURE__ */ jsx(Skeleton, { width: 120, height: 36, borderRadius: 6, ...commonProps })
48
+ ] }),
49
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 gap-4", children: [...Array(4)].map((_, i) => /* @__PURE__ */ jsxs("div", { className: "p-4 border rounded-lg space-y-2", children: [
50
+ /* @__PURE__ */ jsx(Skeleton, { width: 100, height: 16, ...commonProps }),
51
+ /* @__PURE__ */ jsx(Skeleton, { width: 80, height: 32, ...commonProps }),
52
+ /* @__PURE__ */ jsx(Skeleton, { width: 60, height: 12, ...commonProps })
53
+ ] }, i)) })
54
+ ] }),
55
+ /* @__PURE__ */ jsx(Skeleton, { height: 300, borderRadius: 8, ...commonProps }),
56
+ /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
57
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
58
+ /* @__PURE__ */ jsx(Skeleton, { width: 150, height: 20, ...commonProps }),
59
+ /* @__PURE__ */ jsx(Skeleton, { width: 150, height: 20, ...commonProps }),
60
+ /* @__PURE__ */ jsx(Skeleton, { width: 150, height: 20, ...commonProps })
61
+ ] }),
62
+ [...Array(5)].map((_, i) => /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
63
+ /* @__PURE__ */ jsx(Skeleton, { width: 150, height: 16, ...commonProps }),
64
+ /* @__PURE__ */ jsx(Skeleton, { width: 150, height: 16, ...commonProps }),
65
+ /* @__PURE__ */ jsx(Skeleton, { width: 150, height: 16, ...commonProps })
66
+ ] }, i))
67
+ ] })
68
+ ] });
69
+ const renderArticle = () => /* @__PURE__ */ jsxs("div", { className: "max-w-3xl mx-auto space-y-6", children: [
70
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
71
+ /* @__PURE__ */ jsx(Skeleton, { width: "80%", height: 40, ...commonProps }),
72
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
73
+ /* @__PURE__ */ jsx(SkeletonAvatar, { size: 48, ...commonProps }),
74
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2 flex-1", children: [
75
+ /* @__PURE__ */ jsx(Skeleton, { width: 120, height: 16, ...commonProps }),
76
+ /* @__PURE__ */ jsx(Skeleton, { width: 180, height: 14, ...commonProps })
77
+ ] })
78
+ ] })
79
+ ] }),
80
+ /* @__PURE__ */ jsx(Skeleton, { height: 400, borderRadius: 8, ...commonProps }),
81
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
82
+ /* @__PURE__ */ jsx(SkeletonText, { lines: 4, ...commonProps }),
83
+ /* @__PURE__ */ jsx(Skeleton, { height: 200, borderRadius: 8, ...commonProps }),
84
+ /* @__PURE__ */ jsx(SkeletonText, { lines: 6, ...commonProps }),
85
+ /* @__PURE__ */ jsx(Skeleton, { height: 250, borderRadius: 8, ...commonProps }),
86
+ /* @__PURE__ */ jsx(SkeletonText, { lines: 4, ...commonProps })
87
+ ] })
88
+ ] });
89
+ const renderProfile = () => /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
90
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-6 border-b pb-6", children: [
91
+ /* @__PURE__ */ jsx(SkeletonAvatar, { size: 120, ...commonProps }),
92
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 space-y-3", children: [
93
+ /* @__PURE__ */ jsx(Skeleton, { width: 200, height: 32, ...commonProps }),
94
+ /* @__PURE__ */ jsx(Skeleton, { width: 150, height: 20, ...commonProps }),
95
+ /* @__PURE__ */ jsx(SkeletonText, { lines: 2, ...commonProps }),
96
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
97
+ /* @__PURE__ */ jsx(Skeleton, { width: 100, height: 36, borderRadius: 6, ...commonProps }),
98
+ /* @__PURE__ */ jsx(Skeleton, { width: 100, height: 36, borderRadius: 6, ...commonProps })
99
+ ] })
100
+ ] })
101
+ ] }),
102
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-6", children: [
103
+ /* @__PURE__ */ jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
104
+ /* @__PURE__ */ jsx(Skeleton, { width: 100, height: 20, ...commonProps }),
105
+ [...Array(4)].map((_, i) => /* @__PURE__ */ jsx(Skeleton, { height: 16, ...commonProps }, i))
106
+ ] }) }),
107
+ /* @__PURE__ */ jsx("div", { className: "col-span-2 space-y-4", children: [...Array(3)].map((_, i) => /* @__PURE__ */ jsxs("div", { className: "p-4 border rounded-lg space-y-3", children: [
108
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
109
+ /* @__PURE__ */ jsx(SkeletonAvatar, { size: 40, ...commonProps }),
110
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 space-y-2", children: [
111
+ /* @__PURE__ */ jsx(Skeleton, { width: 150, height: 16, ...commonProps }),
112
+ /* @__PURE__ */ jsx(Skeleton, { width: 100, height: 12, ...commonProps })
113
+ ] })
114
+ ] }),
115
+ /* @__PURE__ */ jsx(SkeletonText, { lines: 2, ...commonProps }),
116
+ /* @__PURE__ */ jsx(Skeleton, { height: 200, borderRadius: 6, ...commonProps })
117
+ ] }, i)) })
118
+ ] })
119
+ ] });
120
+ const renderContent = () => {
121
+ switch (variant) {
122
+ case "dashboard":
123
+ return renderDashboard();
124
+ case "article":
125
+ return renderArticle();
126
+ case "profile":
127
+ return renderProfile();
128
+ default:
129
+ return renderDefault();
130
+ }
131
+ };
19
132
  return /* @__PURE__ */ jsx(
20
133
  "div",
21
134
  {
22
135
  ref,
23
136
  "data-testid": testId,
24
- className: cn("inline-flex items-center justify-center", className),
137
+ className: cn("w-full p-6", className),
25
138
  style,
26
139
  role: "status",
27
- "aria-label": ariaLabel,
140
+ "aria-label": "Loading page...",
28
141
  "aria-busy": "true",
29
142
  ...rest,
30
- children: /* @__PURE__ */ jsx(
31
- "svg",
32
- {
33
- className: "animate-spinner-rotate",
34
- style: {
35
- width: normalizeSize(size),
36
- height: normalizeSize(size),
37
- animationDuration: getAnimationDuration(speed)
38
- },
39
- viewBox: "0 0 50 50",
40
- children: /* @__PURE__ */ jsx(
41
- "circle",
42
- {
43
- cx: "25",
44
- cy: "25",
45
- r: 25 - thickness * 2,
46
- fill: "none",
47
- stroke: color,
48
- strokeWidth: thickness,
49
- strokeDasharray: "80, 200",
50
- strokeLinecap: "round"
51
- }
52
- )
53
- }
54
- )
143
+ children: renderContent()
55
144
  }
56
145
  );
57
146
  }
58
147
  );
59
- SpinnerCircle.displayName = "SpinnerCircle";
148
+ SkeletonPage.displayName = "SkeletonPage";
60
149
  export {
61
- SpinnerCircle
150
+ SkeletonPage
62
151
  };
63
152
  //# sourceMappingURL=index12.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index12.js","sources":["../src/components/spinner/SpinnerCircle.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerCircleProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerCircle - Basic rotating circle spinner\n *\n * A simple, elegant circular spinner with a partial arc that rotates continuously.\n *\n * @example\n * ```tsx\n * <SpinnerCircle size={40} color=\"#3b82f6\" />\n * <SpinnerCircle size={24} thickness={3} speed=\"fast\" />\n * ```\n */\nexport const SpinnerCircle = forwardRef<HTMLDivElement, SpinnerCircleProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n thickness = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-circle',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\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 <svg\n className=\"animate-spinner-rotate\"\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n animationDuration: getAnimationDuration(speed),\n }}\n viewBox=\"0 0 50 50\"\n >\n <circle\n cx=\"25\"\n cy=\"25\"\n r={25 - thickness * 2}\n fill=\"none\"\n stroke={color}\n strokeWidth={thickness}\n strokeDasharray=\"80, 200\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n }\n);\n\nSpinnerCircle.displayName = 'SpinnerCircle';\n"],"names":[],"mappings":";;;;AAeO,MAAM,gBAAgB;AAAA,EAC3B,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,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,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,cAAc,IAAI;AAAA,cACzB,QAAQ,cAAc,IAAI;AAAA,cAC1B,mBAAmB,qBAAqB,KAAK;AAAA,YAAA;AAAA,YAE/C,SAAQ;AAAA,YAER,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAG;AAAA,gBACH,IAAG;AAAA,gBACH,GAAG,KAAK,YAAY;AAAA,gBACpB,MAAK;AAAA,gBACL,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,iBAAgB;AAAA,gBAChB,eAAc;AAAA,cAAA;AAAA,YAAA;AAAA,UAChB;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,cAAc,cAAc;"}
1
+ {"version":3,"file":"index12.js","sources":["../src/components/skeleton/SkeletonPage.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SkeletonPageProps } from '../../types';\nimport { cn } from '../../utils';\nimport { Skeleton } from './Skeleton';\nimport { SkeletonText } from './SkeletonText';\nimport { SkeletonAvatar } from './SkeletonAvatar';\n\n/**\n * SkeletonPage - Pre-built page loading skeleton\n *\n * A ready-to-use skeleton layout for full page loading states.\n * Displays a common page structure with header, navigation, and content sections.\n *\n * @example\n * ```tsx\n * <SkeletonPage />\n * <SkeletonPage variant=\"dashboard\" />\n * <SkeletonPage variant=\"article\" animate={false} />\n * ```\n */\nexport const SkeletonPage = forwardRef<HTMLDivElement, SkeletonPageProps>(\n (\n {\n variant = 'default',\n animate = true,\n baseColor = '#e0e0e0',\n highlightColor = '#f5f5f5',\n className,\n style,\n testId = 'skeleton-page',\n visible = true,\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const commonProps = {\n animate,\n baseColor,\n highlightColor,\n };\n\n const renderDefault = () => (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b pb-4\">\n <Skeleton width={200} height={32} {...commonProps} />\n <div className=\"flex items-center gap-4\">\n <Skeleton width={100} height={36} borderRadius={6} {...commonProps} />\n <SkeletonAvatar size={40} {...commonProps} />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"space-y-4\">\n <SkeletonText lines={3} {...commonProps} />\n <div className=\"grid grid-cols-3 gap-4\">\n <Skeleton height={120} borderRadius={8} {...commonProps} />\n <Skeleton height={120} borderRadius={8} {...commonProps} />\n <Skeleton height={120} borderRadius={8} {...commonProps} />\n </div>\n <SkeletonText lines={5} {...commonProps} />\n </div>\n </div>\n );\n\n const renderDashboard = () => (\n <div className=\"space-y-6\">\n {/* Header with stats */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <Skeleton width={180} height={28} {...commonProps} />\n <Skeleton width={120} height={36} borderRadius={6} {...commonProps} />\n </div>\n <div className=\"grid grid-cols-4 gap-4\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"p-4 border rounded-lg space-y-2\">\n <Skeleton width={100} height={16} {...commonProps} />\n <Skeleton width={80} height={32} {...commonProps} />\n <Skeleton width={60} height={12} {...commonProps} />\n </div>\n ))}\n </div>\n </div>\n\n {/* Chart area */}\n <Skeleton height={300} borderRadius={8} {...commonProps} />\n\n {/* Table */}\n <div className=\"space-y-3\">\n <div className=\"flex gap-4\">\n <Skeleton width={150} height={20} {...commonProps} />\n <Skeleton width={150} height={20} {...commonProps} />\n <Skeleton width={150} height={20} {...commonProps} />\n </div>\n {[...Array(5)].map((_, i) => (\n <div key={i} className=\"flex gap-4\">\n <Skeleton width={150} height={16} {...commonProps} />\n <Skeleton width={150} height={16} {...commonProps} />\n <Skeleton width={150} height={16} {...commonProps} />\n </div>\n ))}\n </div>\n </div>\n );\n\n const renderArticle = () => (\n <div className=\"max-w-3xl mx-auto space-y-6\">\n {/* Article header */}\n <div className=\"space-y-4\">\n <Skeleton width=\"80%\" height={40} {...commonProps} />\n <div className=\"flex items-center gap-3\">\n <SkeletonAvatar size={48} {...commonProps} />\n <div className=\"space-y-2 flex-1\">\n <Skeleton width={120} height={16} {...commonProps} />\n <Skeleton width={180} height={14} {...commonProps} />\n </div>\n </div>\n </div>\n\n {/* Featured image */}\n <Skeleton height={400} borderRadius={8} {...commonProps} />\n\n {/* Article content */}\n <div className=\"space-y-4\">\n <SkeletonText lines={4} {...commonProps} />\n <Skeleton height={200} borderRadius={8} {...commonProps} />\n <SkeletonText lines={6} {...commonProps} />\n <Skeleton height={250} borderRadius={8} {...commonProps} />\n <SkeletonText lines={4} {...commonProps} />\n </div>\n </div>\n );\n\n const renderProfile = () => (\n <div className=\"space-y-6\">\n {/* Profile header */}\n <div className=\"flex items-start gap-6 border-b pb-6\">\n <SkeletonAvatar size={120} {...commonProps} />\n <div className=\"flex-1 space-y-3\">\n <Skeleton width={200} height={32} {...commonProps} />\n <Skeleton width={150} height={20} {...commonProps} />\n <SkeletonText lines={2} {...commonProps} />\n <div className=\"flex gap-3\">\n <Skeleton width={100} height={36} borderRadius={6} {...commonProps} />\n <Skeleton width={100} height={36} borderRadius={6} {...commonProps} />\n </div>\n </div>\n </div>\n\n {/* Profile content grid */}\n <div className=\"grid grid-cols-3 gap-6\">\n {/* Left sidebar */}\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Skeleton width={100} height={20} {...commonProps} />\n {[...Array(4)].map((_, i) => (\n <Skeleton key={i} height={16} {...commonProps} />\n ))}\n </div>\n </div>\n\n {/* Main content */}\n <div className=\"col-span-2 space-y-4\">\n {[...Array(3)].map((_, i) => (\n <div key={i} className=\"p-4 border rounded-lg space-y-3\">\n <div className=\"flex items-center gap-3\">\n <SkeletonAvatar size={40} {...commonProps} />\n <div className=\"flex-1 space-y-2\">\n <Skeleton width={150} height={16} {...commonProps} />\n <Skeleton width={100} height={12} {...commonProps} />\n </div>\n </div>\n <SkeletonText lines={2} {...commonProps} />\n <Skeleton height={200} borderRadius={6} {...commonProps} />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n\n const renderContent = () => {\n switch (variant) {\n case 'dashboard':\n return renderDashboard();\n case 'article':\n return renderArticle();\n case 'profile':\n return renderProfile();\n default:\n return renderDefault();\n }\n };\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={cn('w-full p-6', className)}\n style={style}\n role=\"status\"\n aria-label=\"Loading page...\"\n aria-busy=\"true\"\n {...rest}\n >\n {renderContent()}\n </div>\n );\n }\n);\n\nSkeletonPage.displayName = 'SkeletonPage';\n"],"names":[],"mappings":"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"}
package/dist/index13.cjs CHANGED
@@ -2,9 +2,9 @@
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 classNames = require("./index3.cjs");
6
5
  const colors = require("./index4.cjs");
7
- const SpinnerRing = react.forwardRef(
6
+ const classNames = require("./index3.cjs");
7
+ const SpinnerCircle = react.forwardRef(
8
8
  ({
9
9
  size = 40,
10
10
  color = "#3b82f6",
@@ -12,7 +12,7 @@ const SpinnerRing = react.forwardRef(
12
12
  speed = "normal",
13
13
  className,
14
14
  style,
15
- testId = "spinner-ring",
15
+ testId = "spinner-circle",
16
16
  visible = true,
17
17
  ariaLabel = "Loading...",
18
18
  ...rest
@@ -30,22 +30,34 @@ const SpinnerRing = react.forwardRef(
30
30
  "aria-busy": "true",
31
31
  ...rest,
32
32
  children: /* @__PURE__ */ jsxRuntime.jsx(
33
- "div",
33
+ "svg",
34
34
  {
35
- className: "rounded-full",
35
+ className: "animate-spinner-rotate",
36
36
  style: {
37
37
  width: colors.normalizeSize(size),
38
38
  height: colors.normalizeSize(size),
39
- border: `${thickness}px solid rgba(0, 0, 0, 0.1)`,
40
- borderTopColor: color,
41
- animation: `spinner-rotate ${colors.getAnimationDuration(speed)} linear infinite`
42
- }
39
+ animationDuration: colors.getAnimationDuration(speed)
40
+ },
41
+ viewBox: "0 0 50 50",
42
+ children: /* @__PURE__ */ jsxRuntime.jsx(
43
+ "circle",
44
+ {
45
+ cx: "25",
46
+ cy: "25",
47
+ r: 25 - thickness * 2,
48
+ fill: "none",
49
+ stroke: color,
50
+ strokeWidth: thickness,
51
+ strokeDasharray: "80, 200",
52
+ strokeLinecap: "round"
53
+ }
54
+ )
43
55
  }
44
56
  )
45
57
  }
46
58
  );
47
59
  }
48
60
  );
49
- SpinnerRing.displayName = "SpinnerRing";
50
- exports.SpinnerRing = SpinnerRing;
61
+ SpinnerCircle.displayName = "SpinnerCircle";
62
+ exports.SpinnerCircle = SpinnerCircle;
51
63
  //# sourceMappingURL=index13.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index13.cjs","sources":["../src/components/spinner/SpinnerRing.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerRingProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerRing - Border-only rotating spinner\n *\n * A ring-style spinner with a transparent center and colored border.\n *\n * @example\n * ```tsx\n * <SpinnerRing size={40} color=\"#8b5cf6\" />\n * <SpinnerRing size={32} thickness={3} speed=\"slow\" />\n * ```\n */\nexport const SpinnerRing = forwardRef<HTMLDivElement, SpinnerRingProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n thickness = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-ring',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\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=\"rounded-full\"\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n border: `${thickness}px solid rgba(0, 0, 0, 0.1)`,\n borderTopColor: color,\n animation: `spinner-rotate ${getAnimationDuration(speed)} linear infinite`,\n }}\n />\n </div>\n );\n }\n);\n\nSpinnerRing.displayName = 'SpinnerRing';\n"],"names":["forwardRef","jsx","cn","normalizeSize","getAnimationDuration"],"mappings":";;;;;;AAeO,MAAM,cAAcA,MAAAA;AAAAA,EACzB,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,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,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,OAAOE,OAAAA,cAAc,IAAI;AAAA,cACzB,QAAQA,OAAAA,cAAc,IAAI;AAAA,cAC1B,QAAQ,GAAG,SAAS;AAAA,cACpB,gBAAgB;AAAA,cAChB,WAAW,kBAAkBC,4BAAqB,KAAK,CAAC;AAAA,YAAA;AAAA,UAC1D;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;;"}
1
+ {"version":3,"file":"index13.cjs","sources":["../src/components/spinner/SpinnerCircle.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerCircleProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerCircle - Basic rotating circle spinner\n *\n * A simple, elegant circular spinner with a partial arc that rotates continuously.\n *\n * @example\n * ```tsx\n * <SpinnerCircle size={40} color=\"#3b82f6\" />\n * <SpinnerCircle size={24} thickness={3} speed=\"fast\" />\n * ```\n */\nexport const SpinnerCircle = forwardRef<HTMLDivElement, SpinnerCircleProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n thickness = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-circle',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\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 <svg\n className=\"animate-spinner-rotate\"\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n animationDuration: getAnimationDuration(speed),\n }}\n viewBox=\"0 0 50 50\"\n >\n <circle\n cx=\"25\"\n cy=\"25\"\n r={25 - thickness * 2}\n fill=\"none\"\n stroke={color}\n strokeWidth={thickness}\n strokeDasharray=\"80, 200\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n }\n);\n\nSpinnerCircle.displayName = 'SpinnerCircle';\n"],"names":["forwardRef","jsx","cn","normalizeSize","getAnimationDuration"],"mappings":";;;;;;AAeO,MAAM,gBAAgBA,MAAAA;AAAAA,EAC3B,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,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,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,OAAOE,OAAAA,cAAc,IAAI;AAAA,cACzB,QAAQA,OAAAA,cAAc,IAAI;AAAA,cAC1B,mBAAmBC,OAAAA,qBAAqB,KAAK;AAAA,YAAA;AAAA,YAE/C,SAAQ;AAAA,YAER,UAAAH,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAG;AAAA,gBACH,IAAG;AAAA,gBACH,GAAG,KAAK,YAAY;AAAA,gBACpB,MAAK;AAAA,gBACL,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,iBAAgB;AAAA,gBAChB,eAAc;AAAA,cAAA;AAAA,YAAA;AAAA,UAChB;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,cAAc,cAAc;;"}
package/dist/index13.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
- import { cn } from "./index3.js";
4
3
  import { getAnimationDuration, normalizeSize } from "./index4.js";
5
- const SpinnerRing = forwardRef(
4
+ import { cn } from "./index3.js";
5
+ const SpinnerCircle = forwardRef(
6
6
  ({
7
7
  size = 40,
8
8
  color = "#3b82f6",
@@ -10,7 +10,7 @@ const SpinnerRing = forwardRef(
10
10
  speed = "normal",
11
11
  className,
12
12
  style,
13
- testId = "spinner-ring",
13
+ testId = "spinner-circle",
14
14
  visible = true,
15
15
  ariaLabel = "Loading...",
16
16
  ...rest
@@ -28,24 +28,36 @@ const SpinnerRing = forwardRef(
28
28
  "aria-busy": "true",
29
29
  ...rest,
30
30
  children: /* @__PURE__ */ jsx(
31
- "div",
31
+ "svg",
32
32
  {
33
- className: "rounded-full",
33
+ className: "animate-spinner-rotate",
34
34
  style: {
35
35
  width: normalizeSize(size),
36
36
  height: normalizeSize(size),
37
- border: `${thickness}px solid rgba(0, 0, 0, 0.1)`,
38
- borderTopColor: color,
39
- animation: `spinner-rotate ${getAnimationDuration(speed)} linear infinite`
40
- }
37
+ animationDuration: getAnimationDuration(speed)
38
+ },
39
+ viewBox: "0 0 50 50",
40
+ children: /* @__PURE__ */ jsx(
41
+ "circle",
42
+ {
43
+ cx: "25",
44
+ cy: "25",
45
+ r: 25 - thickness * 2,
46
+ fill: "none",
47
+ stroke: color,
48
+ strokeWidth: thickness,
49
+ strokeDasharray: "80, 200",
50
+ strokeLinecap: "round"
51
+ }
52
+ )
41
53
  }
42
54
  )
43
55
  }
44
56
  );
45
57
  }
46
58
  );
47
- SpinnerRing.displayName = "SpinnerRing";
59
+ SpinnerCircle.displayName = "SpinnerCircle";
48
60
  export {
49
- SpinnerRing
61
+ SpinnerCircle
50
62
  };
51
63
  //# sourceMappingURL=index13.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index13.js","sources":["../src/components/spinner/SpinnerRing.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerRingProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerRing - Border-only rotating spinner\n *\n * A ring-style spinner with a transparent center and colored border.\n *\n * @example\n * ```tsx\n * <SpinnerRing size={40} color=\"#8b5cf6\" />\n * <SpinnerRing size={32} thickness={3} speed=\"slow\" />\n * ```\n */\nexport const SpinnerRing = forwardRef<HTMLDivElement, SpinnerRingProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n thickness = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-ring',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\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=\"rounded-full\"\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n border: `${thickness}px solid rgba(0, 0, 0, 0.1)`,\n borderTopColor: color,\n animation: `spinner-rotate ${getAnimationDuration(speed)} linear infinite`,\n }}\n />\n </div>\n );\n }\n);\n\nSpinnerRing.displayName = 'SpinnerRing';\n"],"names":[],"mappings":";;;;AAeO,MAAM,cAAc;AAAA,EACzB,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,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,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,cAAc,IAAI;AAAA,cACzB,QAAQ,cAAc,IAAI;AAAA,cAC1B,QAAQ,GAAG,SAAS;AAAA,cACpB,gBAAgB;AAAA,cAChB,WAAW,kBAAkB,qBAAqB,KAAK,CAAC;AAAA,YAAA;AAAA,UAC1D;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;"}
1
+ {"version":3,"file":"index13.js","sources":["../src/components/spinner/SpinnerCircle.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerCircleProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerCircle - Basic rotating circle spinner\n *\n * A simple, elegant circular spinner with a partial arc that rotates continuously.\n *\n * @example\n * ```tsx\n * <SpinnerCircle size={40} color=\"#3b82f6\" />\n * <SpinnerCircle size={24} thickness={3} speed=\"fast\" />\n * ```\n */\nexport const SpinnerCircle = forwardRef<HTMLDivElement, SpinnerCircleProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n thickness = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-circle',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\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 <svg\n className=\"animate-spinner-rotate\"\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n animationDuration: getAnimationDuration(speed),\n }}\n viewBox=\"0 0 50 50\"\n >\n <circle\n cx=\"25\"\n cy=\"25\"\n r={25 - thickness * 2}\n fill=\"none\"\n stroke={color}\n strokeWidth={thickness}\n strokeDasharray=\"80, 200\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n }\n);\n\nSpinnerCircle.displayName = 'SpinnerCircle';\n"],"names":[],"mappings":";;;;AAeO,MAAM,gBAAgB;AAAA,EAC3B,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,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,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,cAAc,IAAI;AAAA,cACzB,QAAQ,cAAc,IAAI;AAAA,cAC1B,mBAAmB,qBAAqB,KAAK;AAAA,YAAA;AAAA,YAE/C,SAAQ;AAAA,YAER,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAG;AAAA,gBACH,IAAG;AAAA,gBACH,GAAG,KAAK,YAAY;AAAA,gBACpB,MAAK;AAAA,gBACL,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,iBAAgB;AAAA,gBAChB,eAAc;AAAA,cAAA;AAAA,YAAA;AAAA,UAChB;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,cAAc,cAAc;"}
package/dist/index14.cjs CHANGED
@@ -4,23 +4,21 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const classNames = require("./index3.cjs");
6
6
  const colors = require("./index4.cjs");
7
- const SpinnerDots = react.forwardRef(
7
+ const SpinnerRing = react.forwardRef(
8
8
  ({
9
9
  size = 40,
10
10
  color = "#3b82f6",
11
- dotCount = 8,
12
- dotSize = 4,
11
+ secondaryColor = "rgba(0, 0, 0, 0.1)",
12
+ thickness = 4,
13
13
  speed = "normal",
14
14
  className,
15
15
  style,
16
- testId = "spinner-dots",
16
+ testId = "spinner-ring",
17
17
  visible = true,
18
18
  ariaLabel = "Loading...",
19
19
  ...rest
20
20
  }, ref) => {
21
21
  if (!visible) return null;
22
- const sizeValue = typeof size === "number" ? size : parseInt(String(size), 10);
23
- const radius = (sizeValue - dotSize) / 2;
24
22
  return /* @__PURE__ */ jsxRuntime.jsx(
25
23
  "div",
26
24
  {
@@ -35,40 +33,20 @@ const SpinnerDots = react.forwardRef(
35
33
  children: /* @__PURE__ */ jsxRuntime.jsx(
36
34
  "div",
37
35
  {
38
- className: "relative",
36
+ className: "rounded-full",
39
37
  style: {
40
38
  width: colors.normalizeSize(size),
41
39
  height: colors.normalizeSize(size),
40
+ border: `${thickness}px solid ${secondaryColor}`,
41
+ borderTopColor: color,
42
42
  animation: `spinner-rotate ${colors.getAnimationDuration(speed)} linear infinite`
43
- },
44
- children: Array.from({ length: dotCount }).map((_, index) => {
45
- const angle = 360 / dotCount * index;
46
- const radian = angle * Math.PI / 180;
47
- const x = radius * Math.cos(radian) + radius;
48
- const y = radius * Math.sin(radian) + radius;
49
- return /* @__PURE__ */ jsxRuntime.jsx(
50
- "div",
51
- {
52
- className: "absolute rounded-full",
53
- style: {
54
- width: colors.normalizeSize(dotSize),
55
- height: colors.normalizeSize(dotSize),
56
- backgroundColor: color,
57
- left: `${x}px`,
58
- top: `${y}px`,
59
- opacity: 1 - index / dotCount * 0.7
60
- // Fade effect
61
- }
62
- },
63
- index
64
- );
65
- })
43
+ }
66
44
  }
67
45
  )
68
46
  }
69
47
  );
70
48
  }
71
49
  );
72
- SpinnerDots.displayName = "SpinnerDots";
73
- exports.SpinnerDots = SpinnerDots;
50
+ SpinnerRing.displayName = "SpinnerRing";
51
+ exports.SpinnerRing = SpinnerRing;
74
52
  //# sourceMappingURL=index14.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index14.cjs","sources":["../src/components/spinner/SpinnerDots.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerDotsProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerDots - Multiple dots rotating around center\n *\n * A spinner with multiple dots arranged in a circle that rotates continuously.\n *\n * @example\n * ```tsx\n * <SpinnerDots size={40} color=\"#3b82f6\" />\n * <SpinnerDots size={48} dotCount={8} dotSize={6} />\n * ```\n */\nexport const SpinnerDots = forwardRef<HTMLDivElement, SpinnerDotsProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n dotCount = 8,\n dotSize = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-dots',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const sizeValue = typeof size === 'number' ? size : parseInt(String(size), 10);\n const radius = (sizeValue - dotSize) / 2;\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: normalizeSize(size),\n height: normalizeSize(size),\n animation: `spinner-rotate ${getAnimationDuration(speed)} linear infinite`,\n }}\n >\n {Array.from({ length: dotCount }).map((_, index) => {\n const angle = (360 / dotCount) * index;\n const radian = (angle * Math.PI) / 180;\n const x = radius * Math.cos(radian) + radius;\n const y = radius * Math.sin(radian) + radius;\n\n return (\n <div\n key={index}\n className=\"absolute rounded-full\"\n style={{\n width: normalizeSize(dotSize),\n height: normalizeSize(dotSize),\n backgroundColor: color,\n left: `${x}px`,\n top: `${y}px`,\n opacity: 1 - (index / dotCount) * 0.7, // Fade effect\n }}\n />\n );\n })}\n </div>\n </div>\n );\n }\n);\n\nSpinnerDots.displayName = 'SpinnerDots';\n"],"names":["forwardRef","jsx","cn","normalizeSize","getAnimationDuration"],"mappings":";;;;;;AAeO,MAAM,cAAcA,MAAAA;AAAAA,EACzB,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,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,YAAY,OAAO,SAAS,WAAW,OAAO,SAAS,OAAO,IAAI,GAAG,EAAE;AAC7E,UAAM,UAAU,YAAY,WAAW;AAEvC,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,OAAOE,OAAAA,cAAc,IAAI;AAAA,cACzB,QAAQA,OAAAA,cAAc,IAAI;AAAA,cAC1B,WAAW,kBAAkBC,4BAAqB,KAAK,CAAC;AAAA,YAAA;AAAA,YAGzD,UAAA,MAAM,KAAK,EAAE,QAAQ,SAAA,CAAU,EAAE,IAAI,CAAC,GAAG,UAAU;AAClD,oBAAM,QAAS,MAAM,WAAY;AACjC,oBAAM,SAAU,QAAQ,KAAK,KAAM;AACnC,oBAAM,IAAI,SAAS,KAAK,IAAI,MAAM,IAAI;AACtC,oBAAM,IAAI,SAAS,KAAK,IAAI,MAAM,IAAI;AAEtC,qBACEH,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,OAAOE,OAAAA,cAAc,OAAO;AAAA,oBAC5B,QAAQA,OAAAA,cAAc,OAAO;AAAA,oBAC7B,iBAAiB;AAAA,oBACjB,MAAM,GAAG,CAAC;AAAA,oBACV,KAAK,GAAG,CAAC;AAAA,oBACT,SAAS,IAAK,QAAQ,WAAY;AAAA;AAAA,kBAAA;AAAA,gBACpC;AAAA,gBATK;AAAA,cAAA;AAAA,YAYX,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;;"}
1
+ {"version":3,"file":"index14.cjs","sources":["../src/components/spinner/SpinnerRing.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerRingProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerRing - Border-only rotating spinner\n *\n * A ring-style spinner with a transparent center and colored border.\n *\n * @example\n * ```tsx\n * <SpinnerRing size={40} color=\"#8b5cf6\" />\n * <SpinnerRing size={32} thickness={3} speed=\"slow\" />\n * <SpinnerRing size={40} color=\"#3b82f6\" secondaryColor=\"#e0e0e0\" />\n * ```\n */\nexport const SpinnerRing = forwardRef<HTMLDivElement, SpinnerRingProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n secondaryColor = 'rgba(0, 0, 0, 0.1)',\n thickness = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-ring',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\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=\"rounded-full\"\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n border: `${thickness}px solid ${secondaryColor}`,\n borderTopColor: color,\n animation: `spinner-rotate ${getAnimationDuration(speed)} linear infinite`,\n }}\n />\n </div>\n );\n }\n);\n\nSpinnerRing.displayName = 'SpinnerRing';\n"],"names":["forwardRef","jsx","cn","normalizeSize","getAnimationDuration"],"mappings":";;;;;;AAgBO,MAAM,cAAcA,MAAAA;AAAAA,EACzB,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,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,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,OAAOE,OAAAA,cAAc,IAAI;AAAA,cACzB,QAAQA,OAAAA,cAAc,IAAI;AAAA,cAC1B,QAAQ,GAAG,SAAS,YAAY,cAAc;AAAA,cAC9C,gBAAgB;AAAA,cAChB,WAAW,kBAAkBC,4BAAqB,KAAK,CAAC;AAAA,YAAA;AAAA,UAC1D;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;;"}
package/dist/index14.js CHANGED
@@ -2,23 +2,21 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { cn } from "./index3.js";
4
4
  import { getAnimationDuration, normalizeSize } from "./index4.js";
5
- const SpinnerDots = forwardRef(
5
+ const SpinnerRing = forwardRef(
6
6
  ({
7
7
  size = 40,
8
8
  color = "#3b82f6",
9
- dotCount = 8,
10
- dotSize = 4,
9
+ secondaryColor = "rgba(0, 0, 0, 0.1)",
10
+ thickness = 4,
11
11
  speed = "normal",
12
12
  className,
13
13
  style,
14
- testId = "spinner-dots",
14
+ testId = "spinner-ring",
15
15
  visible = true,
16
16
  ariaLabel = "Loading...",
17
17
  ...rest
18
18
  }, ref) => {
19
19
  if (!visible) return null;
20
- const sizeValue = typeof size === "number" ? size : parseInt(String(size), 10);
21
- const radius = (sizeValue - dotSize) / 2;
22
20
  return /* @__PURE__ */ jsx(
23
21
  "div",
24
22
  {
@@ -33,42 +31,22 @@ const SpinnerDots = forwardRef(
33
31
  children: /* @__PURE__ */ jsx(
34
32
  "div",
35
33
  {
36
- className: "relative",
34
+ className: "rounded-full",
37
35
  style: {
38
36
  width: normalizeSize(size),
39
37
  height: normalizeSize(size),
38
+ border: `${thickness}px solid ${secondaryColor}`,
39
+ borderTopColor: color,
40
40
  animation: `spinner-rotate ${getAnimationDuration(speed)} linear infinite`
41
- },
42
- children: Array.from({ length: dotCount }).map((_, index) => {
43
- const angle = 360 / dotCount * index;
44
- const radian = angle * Math.PI / 180;
45
- const x = radius * Math.cos(radian) + radius;
46
- const y = radius * Math.sin(radian) + radius;
47
- return /* @__PURE__ */ jsx(
48
- "div",
49
- {
50
- className: "absolute rounded-full",
51
- style: {
52
- width: normalizeSize(dotSize),
53
- height: normalizeSize(dotSize),
54
- backgroundColor: color,
55
- left: `${x}px`,
56
- top: `${y}px`,
57
- opacity: 1 - index / dotCount * 0.7
58
- // Fade effect
59
- }
60
- },
61
- index
62
- );
63
- })
41
+ }
64
42
  }
65
43
  )
66
44
  }
67
45
  );
68
46
  }
69
47
  );
70
- SpinnerDots.displayName = "SpinnerDots";
48
+ SpinnerRing.displayName = "SpinnerRing";
71
49
  export {
72
- SpinnerDots
50
+ SpinnerRing
73
51
  };
74
52
  //# sourceMappingURL=index14.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index14.js","sources":["../src/components/spinner/SpinnerDots.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerDotsProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerDots - Multiple dots rotating around center\n *\n * A spinner with multiple dots arranged in a circle that rotates continuously.\n *\n * @example\n * ```tsx\n * <SpinnerDots size={40} color=\"#3b82f6\" />\n * <SpinnerDots size={48} dotCount={8} dotSize={6} />\n * ```\n */\nexport const SpinnerDots = forwardRef<HTMLDivElement, SpinnerDotsProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n dotCount = 8,\n dotSize = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-dots',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\n\n const sizeValue = typeof size === 'number' ? size : parseInt(String(size), 10);\n const radius = (sizeValue - dotSize) / 2;\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: normalizeSize(size),\n height: normalizeSize(size),\n animation: `spinner-rotate ${getAnimationDuration(speed)} linear infinite`,\n }}\n >\n {Array.from({ length: dotCount }).map((_, index) => {\n const angle = (360 / dotCount) * index;\n const radian = (angle * Math.PI) / 180;\n const x = radius * Math.cos(radian) + radius;\n const y = radius * Math.sin(radian) + radius;\n\n return (\n <div\n key={index}\n className=\"absolute rounded-full\"\n style={{\n width: normalizeSize(dotSize),\n height: normalizeSize(dotSize),\n backgroundColor: color,\n left: `${x}px`,\n top: `${y}px`,\n opacity: 1 - (index / dotCount) * 0.7, // Fade effect\n }}\n />\n );\n })}\n </div>\n </div>\n );\n }\n);\n\nSpinnerDots.displayName = 'SpinnerDots';\n"],"names":[],"mappings":";;;;AAeO,MAAM,cAAc;AAAA,EACzB,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,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,YAAY,OAAO,SAAS,WAAW,OAAO,SAAS,OAAO,IAAI,GAAG,EAAE;AAC7E,UAAM,UAAU,YAAY,WAAW;AAEvC,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,cAAc,IAAI;AAAA,cACzB,QAAQ,cAAc,IAAI;AAAA,cAC1B,WAAW,kBAAkB,qBAAqB,KAAK,CAAC;AAAA,YAAA;AAAA,YAGzD,UAAA,MAAM,KAAK,EAAE,QAAQ,SAAA,CAAU,EAAE,IAAI,CAAC,GAAG,UAAU;AAClD,oBAAM,QAAS,MAAM,WAAY;AACjC,oBAAM,SAAU,QAAQ,KAAK,KAAM;AACnC,oBAAM,IAAI,SAAS,KAAK,IAAI,MAAM,IAAI;AACtC,oBAAM,IAAI,SAAS,KAAK,IAAI,MAAM,IAAI;AAEtC,qBACE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,OAAO,cAAc,OAAO;AAAA,oBAC5B,QAAQ,cAAc,OAAO;AAAA,oBAC7B,iBAAiB;AAAA,oBACjB,MAAM,GAAG,CAAC;AAAA,oBACV,KAAK,GAAG,CAAC;AAAA,oBACT,SAAS,IAAK,QAAQ,WAAY;AAAA;AAAA,kBAAA;AAAA,gBACpC;AAAA,gBATK;AAAA,cAAA;AAAA,YAYX,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;"}
1
+ {"version":3,"file":"index14.js","sources":["../src/components/spinner/SpinnerRing.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SpinnerRingProps } from '../../types';\nimport { cn, normalizeSize, getAnimationDuration } from '../../utils';\n\n/**\n * SpinnerRing - Border-only rotating spinner\n *\n * A ring-style spinner with a transparent center and colored border.\n *\n * @example\n * ```tsx\n * <SpinnerRing size={40} color=\"#8b5cf6\" />\n * <SpinnerRing size={32} thickness={3} speed=\"slow\" />\n * <SpinnerRing size={40} color=\"#3b82f6\" secondaryColor=\"#e0e0e0\" />\n * ```\n */\nexport const SpinnerRing = forwardRef<HTMLDivElement, SpinnerRingProps>(\n (\n {\n size = 40,\n color = '#3b82f6',\n secondaryColor = 'rgba(0, 0, 0, 0.1)',\n thickness = 4,\n speed = 'normal',\n className,\n style,\n testId = 'spinner-ring',\n visible = true,\n ariaLabel = 'Loading...',\n ...rest\n },\n ref\n ) => {\n if (!visible) return null;\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=\"rounded-full\"\n style={{\n width: normalizeSize(size),\n height: normalizeSize(size),\n border: `${thickness}px solid ${secondaryColor}`,\n borderTopColor: color,\n animation: `spinner-rotate ${getAnimationDuration(speed)} linear infinite`,\n }}\n />\n </div>\n );\n }\n);\n\nSpinnerRing.displayName = 'SpinnerRing';\n"],"names":[],"mappings":";;;;AAgBO,MAAM,cAAc;AAAA,EACzB,CACE;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,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,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,cAAc,IAAI;AAAA,cACzB,QAAQ,cAAc,IAAI;AAAA,cAC1B,QAAQ,GAAG,SAAS,YAAY,cAAc;AAAA,cAC9C,gBAAgB;AAAA,cAChB,WAAW,kBAAkB,qBAAqB,KAAK,CAAC;AAAA,YAAA;AAAA,UAC1D;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAEA,YAAY,cAAc;"}