premium-react-loaders 3.1.1 → 4.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 (197) hide show
  1. package/README.md +30 -3
  2. package/dist/components/gradient/GradientBar.d.ts +13 -0
  3. package/dist/components/gradient/GradientBar.d.ts.map +1 -0
  4. package/dist/components/gradient/GradientRing.d.ts +12 -0
  5. package/dist/components/gradient/GradientRing.d.ts.map +1 -0
  6. package/dist/components/gradient/GradientSpinner.d.ts +12 -0
  7. package/dist/components/gradient/GradientSpinner.d.ts.map +1 -0
  8. package/dist/components/gradient/index.d.ts +4 -0
  9. package/dist/components/gradient/index.d.ts.map +1 -0
  10. package/dist/components/index.d.ts +4 -0
  11. package/dist/components/index.d.ts.map +1 -1
  12. package/dist/components/morph/LiquidFill.d.ts +13 -0
  13. package/dist/components/morph/LiquidFill.d.ts.map +1 -0
  14. package/dist/components/morph/MorphBlob.d.ts +12 -0
  15. package/dist/components/morph/MorphBlob.d.ts.map +1 -0
  16. package/dist/components/morph/WaveCircle.d.ts +12 -0
  17. package/dist/components/morph/WaveCircle.d.ts.map +1 -0
  18. package/dist/components/morph/index.d.ts +4 -0
  19. package/dist/components/morph/index.d.ts.map +1 -0
  20. package/dist/components/neon/NeonPulse.d.ts +12 -0
  21. package/dist/components/neon/NeonPulse.d.ts.map +1 -0
  22. package/dist/components/neon/NeonSpinner.d.ts +12 -0
  23. package/dist/components/neon/NeonSpinner.d.ts.map +1 -0
  24. package/dist/components/neon/NeonText.d.ts +12 -0
  25. package/dist/components/neon/NeonText.d.ts.map +1 -0
  26. package/dist/components/neon/index.d.ts +4 -0
  27. package/dist/components/neon/index.d.ts.map +1 -0
  28. package/dist/components/particle/ParticleBurst.d.ts +12 -0
  29. package/dist/components/particle/ParticleBurst.d.ts.map +1 -0
  30. package/dist/components/particle/ParticleField.d.ts +3 -0
  31. package/dist/components/particle/ParticleField.d.ts.map +1 -0
  32. package/dist/components/particle/ParticleOrbit.d.ts +12 -0
  33. package/dist/components/particle/ParticleOrbit.d.ts.map +1 -0
  34. package/dist/components/particle/ParticleTrail.d.ts +12 -0
  35. package/dist/components/particle/ParticleTrail.d.ts.map +1 -0
  36. package/dist/components/particle/index.d.ts +5 -0
  37. package/dist/components/particle/index.d.ts.map +1 -0
  38. package/dist/components/progress/ProgressBar.d.ts.map +1 -1
  39. package/dist/components/progress/ProgressCircle.d.ts.map +1 -1
  40. package/dist/components/progress/ProgressRing.d.ts.map +1 -1
  41. package/dist/components/status/InfoIndicator.d.ts +29 -0
  42. package/dist/components/status/InfoIndicator.d.ts.map +1 -0
  43. package/dist/components/status/WarningIndicator.d.ts +29 -0
  44. package/dist/components/status/WarningIndicator.d.ts.map +1 -0
  45. package/dist/components/status/index.d.ts +2 -0
  46. package/dist/components/status/index.d.ts.map +1 -1
  47. package/dist/index.cjs +50 -20
  48. package/dist/index.d.ts +1 -1
  49. package/dist/index.js +50 -20
  50. package/dist/index10.cjs +1 -1
  51. package/dist/index10.js +1 -1
  52. package/dist/index11.cjs +1 -1
  53. package/dist/index11.js +1 -1
  54. package/dist/index12.cjs +1 -1
  55. package/dist/index12.js +1 -1
  56. package/dist/index13.cjs +1 -1
  57. package/dist/index13.js +1 -1
  58. package/dist/index14.cjs +1 -1
  59. package/dist/index14.js +1 -1
  60. package/dist/index15.cjs +1 -1
  61. package/dist/index15.js +1 -1
  62. package/dist/index17.cjs +1 -1
  63. package/dist/index17.js +1 -1
  64. package/dist/index18.cjs +1 -1
  65. package/dist/index18.js +1 -1
  66. package/dist/index19.cjs +1 -1
  67. package/dist/index19.js +1 -1
  68. package/dist/index20.cjs +1 -1
  69. package/dist/index20.js +1 -1
  70. package/dist/index21.cjs +1 -1
  71. package/dist/index21.js +1 -1
  72. package/dist/index22.cjs +1 -1
  73. package/dist/index22.js +1 -1
  74. package/dist/index23.cjs +1 -1
  75. package/dist/index23.js +1 -1
  76. package/dist/index24.cjs +1 -1
  77. package/dist/index24.js +1 -1
  78. package/dist/index25.cjs +17 -2
  79. package/dist/index25.js +18 -3
  80. package/dist/index26.cjs +17 -2
  81. package/dist/index26.js +18 -3
  82. package/dist/index27.cjs +17 -2
  83. package/dist/index27.js +18 -3
  84. package/dist/index28.cjs +1 -1
  85. package/dist/index28.js +1 -1
  86. package/dist/index29.cjs +1 -1
  87. package/dist/index29.js +1 -1
  88. package/dist/index30.cjs +1 -1
  89. package/dist/index30.js +1 -1
  90. package/dist/index31.cjs +1 -1
  91. package/dist/index31.js +1 -1
  92. package/dist/index32.cjs +1 -1
  93. package/dist/index32.js +1 -1
  94. package/dist/index33.cjs +1 -1
  95. package/dist/index33.js +1 -1
  96. package/dist/index34.cjs +1 -1
  97. package/dist/index34.js +1 -1
  98. package/dist/index35.cjs +1 -1
  99. package/dist/index35.js +1 -1
  100. package/dist/index36.cjs +1 -1
  101. package/dist/index36.js +1 -1
  102. package/dist/index37.cjs +59 -145
  103. package/dist/index37.js +61 -147
  104. package/dist/index38.cjs +32 -53
  105. package/dist/index38.js +33 -54
  106. package/dist/index39.cjs +138 -84
  107. package/dist/index39.js +140 -86
  108. package/dist/index4.cjs +10 -0
  109. package/dist/index4.js +10 -0
  110. package/dist/index40.cjs +33 -106
  111. package/dist/index40.js +34 -107
  112. package/dist/index41.cjs +66 -50
  113. package/dist/index41.js +66 -50
  114. package/dist/index42.cjs +123 -44
  115. package/dist/index42.js +124 -45
  116. package/dist/index43.cjs +43 -85
  117. package/dist/index43.js +44 -86
  118. package/dist/index44.cjs +35 -27
  119. package/dist/index44.js +35 -27
  120. package/dist/index45.cjs +87 -58
  121. package/dist/index45.js +87 -58
  122. package/dist/index46.cjs +35 -88
  123. package/dist/index46.js +36 -89
  124. package/dist/index47.cjs +62 -58
  125. package/dist/index47.js +63 -59
  126. package/dist/index48.cjs +87 -110
  127. package/dist/index48.js +88 -111
  128. package/dist/index49.cjs +48 -109
  129. package/dist/index49.js +49 -110
  130. package/dist/index50.cjs +110 -62
  131. package/dist/index50.js +111 -63
  132. package/dist/index51.cjs +104 -49
  133. package/dist/index51.js +104 -49
  134. package/dist/index52.cjs +43 -77
  135. package/dist/index52.js +44 -78
  136. package/dist/index53.cjs +56 -56
  137. package/dist/index53.js +56 -56
  138. package/dist/index54.cjs +104 -149
  139. package/dist/index54.js +106 -151
  140. package/dist/index55.cjs +97 -38
  141. package/dist/index55.js +99 -40
  142. package/dist/index56.cjs +184 -120
  143. package/dist/index56.js +185 -121
  144. package/dist/index57.cjs +53 -0
  145. package/dist/index57.js +53 -0
  146. package/dist/index58.cjs +55 -0
  147. package/dist/index58.js +55 -0
  148. package/dist/index59.cjs +119 -0
  149. package/dist/index59.js +119 -0
  150. package/dist/index60.cjs +70 -0
  151. package/dist/index60.js +70 -0
  152. package/dist/index61.cjs +66 -0
  153. package/dist/index61.js +66 -0
  154. package/dist/index62.cjs +68 -0
  155. package/dist/index62.js +68 -0
  156. package/dist/index63.cjs +99 -0
  157. package/dist/index63.js +99 -0
  158. package/dist/index64.cjs +75 -0
  159. package/dist/index64.js +75 -0
  160. package/dist/index65.cjs +92 -0
  161. package/dist/index65.js +92 -0
  162. package/dist/index66.cjs +76 -0
  163. package/dist/index66.js +76 -0
  164. package/dist/index67.cjs +76 -0
  165. package/dist/index67.js +76 -0
  166. package/dist/index68.cjs +64 -0
  167. package/dist/index68.js +64 -0
  168. package/dist/index69.cjs +60 -0
  169. package/dist/index69.js +60 -0
  170. package/dist/index7.cjs +1 -1
  171. package/dist/index7.js +1 -1
  172. package/dist/index70.cjs +57 -0
  173. package/dist/index70.js +57 -0
  174. package/dist/index71.cjs +125 -0
  175. package/dist/index71.js +125 -0
  176. package/dist/index8.cjs +1 -1
  177. package/dist/index8.js +1 -1
  178. package/dist/index9.cjs +1 -1
  179. package/dist/index9.js +1 -1
  180. package/dist/premium-react-loaders.css +126 -0
  181. package/dist/types/gradient.d.ts +38 -0
  182. package/dist/types/gradient.d.ts.map +1 -0
  183. package/dist/types/index.d.ts +4 -0
  184. package/dist/types/index.d.ts.map +1 -1
  185. package/dist/types/morph.d.ts +28 -0
  186. package/dist/types/morph.d.ts.map +1 -0
  187. package/dist/types/neon.d.ts +26 -0
  188. package/dist/types/neon.d.ts.map +1 -0
  189. package/dist/types/particle.d.ts +40 -0
  190. package/dist/types/particle.d.ts.map +1 -0
  191. package/dist/types/progress.d.ts +6 -0
  192. package/dist/types/progress.d.ts.map +1 -1
  193. package/dist/types/status.d.ts +30 -0
  194. package/dist/types/status.d.ts.map +1 -1
  195. package/dist/utils/colors.d.ts +5 -0
  196. package/dist/utils/colors.d.ts.map +1 -1
  197. package/package.json +1 -1
package/dist/index56.cjs CHANGED
@@ -1,125 +1,189 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
3
4
  const react = require("react");
4
- function useReducedMotion() {
5
- const [prefersReducedMotion, setPrefersReducedMotion] = react.useState(false);
6
- react.useEffect(() => {
7
- if (typeof window === "undefined" || !window.matchMedia) {
8
- return;
9
- }
10
- const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
11
- setPrefersReducedMotion(mediaQuery.matches);
12
- const handleChange = (event) => {
13
- setPrefersReducedMotion(event.matches);
14
- };
15
- if (mediaQuery.addEventListener) {
16
- mediaQuery.addEventListener("change", handleChange);
17
- return () => mediaQuery.removeEventListener("change", handleChange);
18
- } else {
19
- mediaQuery.addListener(handleChange);
20
- return () => mediaQuery.removeListener(handleChange);
21
- }
22
- }, []);
23
- return prefersReducedMotion;
24
- }
25
- function getEffectiveDuration(speed, respectMotionPreference, prefersReducedMotion) {
26
- if (respectMotionPreference && prefersReducedMotion) {
27
- return "0.01ms";
28
- }
29
- if (typeof speed === "number") {
30
- const validSpeed = !isNaN(speed) && speed > 0 ? Math.max(50, Math.min(1e4, speed)) : 1e3;
31
- return `${validSpeed}ms`;
32
- }
33
- const speedMap = {
34
- slow: "2s",
35
- normal: "1s",
36
- fast: "0.5s"
37
- };
38
- return speedMap[speed] || speedMap.normal;
39
- }
40
- function useLoaderVisibility(visible = true, delay = 0, minDuration = 0, transition) {
41
- const transitionDuration = transition === true ? 150 : typeof transition === "number" ? transition : 0;
42
- const hasTransition = transitionDuration > 0;
43
- const [shouldRender, setShouldRender] = react.useState(visible && delay === 0);
44
- const [isTransitioning, setIsTransitioning] = react.useState(visible && delay === 0 && hasTransition);
45
- const showTimeRef = react.useRef(visible && delay === 0 ? Date.now() : null);
46
- const delayTimerRef = react.useRef(null);
47
- const minDurationTimerRef = react.useRef(null);
48
- const transitionTimerRef = react.useRef(null);
49
- react.useEffect(() => {
50
- if (delayTimerRef.current) {
51
- clearTimeout(delayTimerRef.current);
52
- delayTimerRef.current = null;
53
- }
54
- if (minDurationTimerRef.current) {
55
- clearTimeout(minDurationTimerRef.current);
56
- minDurationTimerRef.current = null;
57
- }
58
- if (transitionTimerRef.current) {
59
- clearTimeout(transitionTimerRef.current);
60
- transitionTimerRef.current = null;
61
- }
62
- if (visible) {
63
- if (delay > 0) {
64
- delayTimerRef.current = setTimeout(() => {
65
- setShouldRender(true);
66
- showTimeRef.current = Date.now();
67
- if (hasTransition) {
68
- setIsTransitioning(true);
69
- }
70
- }, delay);
71
- } else {
72
- setShouldRender(true);
73
- showTimeRef.current = Date.now();
74
- if (hasTransition) {
75
- setIsTransitioning(true);
76
- }
77
- }
78
- } else {
79
- const hideLoader = () => {
80
- if (hasTransition) {
81
- setIsTransitioning(false);
82
- transitionTimerRef.current = setTimeout(() => {
83
- setShouldRender(false);
84
- showTimeRef.current = null;
85
- }, transitionDuration);
86
- } else {
87
- setShouldRender(false);
88
- showTimeRef.current = null;
89
- }
90
- };
91
- if (showTimeRef.current !== null && minDuration > 0) {
92
- const elapsedTime = Date.now() - showTimeRef.current;
93
- const remainingTime = minDuration - elapsedTime;
94
- if (remainingTime > 0) {
95
- minDurationTimerRef.current = setTimeout(hideLoader, remainingTime);
96
- } else {
97
- hideLoader();
98
- }
99
- } else {
100
- hideLoader();
101
- }
102
- }
103
- return () => {
104
- if (delayTimerRef.current) {
105
- clearTimeout(delayTimerRef.current);
106
- }
107
- if (minDurationTimerRef.current) {
108
- clearTimeout(minDurationTimerRef.current);
109
- }
110
- if (transitionTimerRef.current) {
111
- clearTimeout(transitionTimerRef.current);
5
+ const Skeleton = require("./index7.cjs");
6
+ const hooks = require("./index71.cjs");
7
+ const classNames = require("./index3.cjs");
8
+ const colors = require("./index4.cjs");
9
+ const FormFieldLoader = react.forwardRef(
10
+ ({
11
+ size = "md",
12
+ fieldType = "text",
13
+ showLabel = true,
14
+ labelWidth = 100,
15
+ fieldWidth = "100%",
16
+ fieldHeight,
17
+ showValidation = false,
18
+ showRequired = false,
19
+ showHelperText = false,
20
+ delay = 0,
21
+ minDuration = 0,
22
+ transition,
23
+ className,
24
+ style,
25
+ testId = "form-field-loader",
26
+ visible = true,
27
+ ariaLabel = "Loading form field...",
28
+ ...rest
29
+ }, ref) => {
30
+ const { shouldRender, opacity, transitionStyle } = hooks.useLoaderVisibility(
31
+ visible,
32
+ delay,
33
+ minDuration,
34
+ transition
35
+ );
36
+ if (!shouldRender) return null;
37
+ const getFieldHeight = () => {
38
+ if (fieldHeight) return colors.normalizeSize(fieldHeight);
39
+ switch (fieldType) {
40
+ case "textarea":
41
+ return "80px";
42
+ case "select":
43
+ return "40px";
44
+ case "checkbox":
45
+ case "radio":
46
+ return "20px";
47
+ default:
48
+ return "40px";
112
49
  }
113
50
  };
114
- }, [visible, delay, minDuration, hasTransition, transitionDuration]);
115
- const opacity = hasTransition ? isTransitioning ? 1 : 0 : 1;
116
- const transitionStyle = hasTransition ? `opacity ${transitionDuration}ms ease-in-out` : "none";
117
- return {
118
- shouldRender,
119
- opacity,
120
- transitionStyle
121
- };
122
- }
123
- exports.getEffectiveDuration = getEffectiveDuration;
124
- exports.useLoaderVisibility = useLoaderVisibility;
125
- exports.useReducedMotion = useReducedMotion;
51
+ return /* @__PURE__ */ jsxRuntime.jsxs(
52
+ "div",
53
+ {
54
+ ref,
55
+ "data-testid": testId,
56
+ className: classNames.cn("w-full", className),
57
+ style: {
58
+ ...style,
59
+ opacity,
60
+ transition: transitionStyle
61
+ },
62
+ role: "status",
63
+ "aria-label": ariaLabel,
64
+ "aria-busy": "true",
65
+ ...rest,
66
+ children: [
67
+ showLabel && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 mb-2", children: [
68
+ /* @__PURE__ */ jsxRuntime.jsx(
69
+ Skeleton.Skeleton,
70
+ {
71
+ width: colors.normalizeSize(labelWidth),
72
+ height: 16,
73
+ borderRadius: 4
74
+ }
75
+ ),
76
+ showRequired && /* @__PURE__ */ jsxRuntime.jsx(
77
+ Skeleton.Skeleton,
78
+ {
79
+ width: 8,
80
+ height: 8,
81
+ variant: "circular"
82
+ }
83
+ )
84
+ ] }),
85
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full", children: fieldType === "checkbox" || fieldType === "radio" ? (
86
+ // Checkbox/Radio with label on the right
87
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
88
+ /* @__PURE__ */ jsxRuntime.jsx(
89
+ Skeleton.Skeleton,
90
+ {
91
+ width: 20,
92
+ height: 20,
93
+ variant: fieldType === "radio" ? "circular" : "rectangular",
94
+ borderRadius: fieldType === "checkbox" ? 4 : void 0
95
+ }
96
+ ),
97
+ /* @__PURE__ */ jsxRuntime.jsx(
98
+ Skeleton.Skeleton,
99
+ {
100
+ width: 150,
101
+ height: 16,
102
+ borderRadius: 4
103
+ }
104
+ )
105
+ ] })
106
+ ) : fieldType === "select" ? (
107
+ // Select dropdown
108
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
109
+ /* @__PURE__ */ jsxRuntime.jsx(
110
+ Skeleton.Skeleton,
111
+ {
112
+ width: fieldWidth,
113
+ height: getFieldHeight(),
114
+ borderRadius: 6
115
+ }
116
+ ),
117
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute right-3 top-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsxRuntime.jsx(
118
+ Skeleton.Skeleton,
119
+ {
120
+ width: 12,
121
+ height: 12,
122
+ variant: "rectangular"
123
+ }
124
+ ) })
125
+ ] })
126
+ ) : fieldType === "file" ? (
127
+ // File input
128
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
129
+ /* @__PURE__ */ jsxRuntime.jsx(
130
+ Skeleton.Skeleton,
131
+ {
132
+ width: 120,
133
+ height: 40,
134
+ borderRadius: 6
135
+ }
136
+ ),
137
+ /* @__PURE__ */ jsxRuntime.jsx(
138
+ Skeleton.Skeleton,
139
+ {
140
+ width: "calc(100% - 132px)",
141
+ height: 40,
142
+ borderRadius: 6
143
+ }
144
+ )
145
+ ] })
146
+ ) : (
147
+ // Text, textarea, etc.
148
+ /* @__PURE__ */ jsxRuntime.jsx(
149
+ Skeleton.Skeleton,
150
+ {
151
+ width: fieldWidth,
152
+ height: getFieldHeight(),
153
+ borderRadius: 6
154
+ }
155
+ )
156
+ ) }),
157
+ showHelperText && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1", children: /* @__PURE__ */ jsxRuntime.jsx(
158
+ Skeleton.Skeleton,
159
+ {
160
+ width: 200,
161
+ height: 14,
162
+ borderRadius: 4
163
+ }
164
+ ) }),
165
+ showValidation && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 mt-1", children: [
166
+ /* @__PURE__ */ jsxRuntime.jsx(
167
+ Skeleton.Skeleton,
168
+ {
169
+ width: 14,
170
+ height: 14,
171
+ variant: "circular"
172
+ }
173
+ ),
174
+ /* @__PURE__ */ jsxRuntime.jsx(
175
+ Skeleton.Skeleton,
176
+ {
177
+ width: 180,
178
+ height: 14,
179
+ borderRadius: 4
180
+ }
181
+ )
182
+ ] })
183
+ ]
184
+ }
185
+ );
186
+ }
187
+ );
188
+ FormFieldLoader.displayName = "FormFieldLoader";
189
+ exports.FormFieldLoader = FormFieldLoader;
package/dist/index56.js CHANGED
@@ -1,125 +1,189 @@
1
- import { useState, useRef, useEffect } from "react";
2
- function useReducedMotion() {
3
- const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);
4
- useEffect(() => {
5
- if (typeof window === "undefined" || !window.matchMedia) {
6
- return;
7
- }
8
- const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
9
- setPrefersReducedMotion(mediaQuery.matches);
10
- const handleChange = (event) => {
11
- setPrefersReducedMotion(event.matches);
12
- };
13
- if (mediaQuery.addEventListener) {
14
- mediaQuery.addEventListener("change", handleChange);
15
- return () => mediaQuery.removeEventListener("change", handleChange);
16
- } else {
17
- mediaQuery.addListener(handleChange);
18
- return () => mediaQuery.removeListener(handleChange);
19
- }
20
- }, []);
21
- return prefersReducedMotion;
22
- }
23
- function getEffectiveDuration(speed, respectMotionPreference, prefersReducedMotion) {
24
- if (respectMotionPreference && prefersReducedMotion) {
25
- return "0.01ms";
26
- }
27
- if (typeof speed === "number") {
28
- const validSpeed = !isNaN(speed) && speed > 0 ? Math.max(50, Math.min(1e4, speed)) : 1e3;
29
- return `${validSpeed}ms`;
30
- }
31
- const speedMap = {
32
- slow: "2s",
33
- normal: "1s",
34
- fast: "0.5s"
35
- };
36
- return speedMap[speed] || speedMap.normal;
37
- }
38
- function useLoaderVisibility(visible = true, delay = 0, minDuration = 0, transition) {
39
- const transitionDuration = transition === true ? 150 : typeof transition === "number" ? transition : 0;
40
- const hasTransition = transitionDuration > 0;
41
- const [shouldRender, setShouldRender] = useState(visible && delay === 0);
42
- const [isTransitioning, setIsTransitioning] = useState(visible && delay === 0 && hasTransition);
43
- const showTimeRef = useRef(visible && delay === 0 ? Date.now() : null);
44
- const delayTimerRef = useRef(null);
45
- const minDurationTimerRef = useRef(null);
46
- const transitionTimerRef = useRef(null);
47
- useEffect(() => {
48
- if (delayTimerRef.current) {
49
- clearTimeout(delayTimerRef.current);
50
- delayTimerRef.current = null;
51
- }
52
- if (minDurationTimerRef.current) {
53
- clearTimeout(minDurationTimerRef.current);
54
- minDurationTimerRef.current = null;
55
- }
56
- if (transitionTimerRef.current) {
57
- clearTimeout(transitionTimerRef.current);
58
- transitionTimerRef.current = null;
59
- }
60
- if (visible) {
61
- if (delay > 0) {
62
- delayTimerRef.current = setTimeout(() => {
63
- setShouldRender(true);
64
- showTimeRef.current = Date.now();
65
- if (hasTransition) {
66
- setIsTransitioning(true);
67
- }
68
- }, delay);
69
- } else {
70
- setShouldRender(true);
71
- showTimeRef.current = Date.now();
72
- if (hasTransition) {
73
- setIsTransitioning(true);
74
- }
75
- }
76
- } else {
77
- const hideLoader = () => {
78
- if (hasTransition) {
79
- setIsTransitioning(false);
80
- transitionTimerRef.current = setTimeout(() => {
81
- setShouldRender(false);
82
- showTimeRef.current = null;
83
- }, transitionDuration);
84
- } else {
85
- setShouldRender(false);
86
- showTimeRef.current = null;
87
- }
88
- };
89
- if (showTimeRef.current !== null && minDuration > 0) {
90
- const elapsedTime = Date.now() - showTimeRef.current;
91
- const remainingTime = minDuration - elapsedTime;
92
- if (remainingTime > 0) {
93
- minDurationTimerRef.current = setTimeout(hideLoader, remainingTime);
94
- } else {
95
- hideLoader();
96
- }
97
- } else {
98
- hideLoader();
99
- }
100
- }
101
- return () => {
102
- if (delayTimerRef.current) {
103
- clearTimeout(delayTimerRef.current);
104
- }
105
- if (minDurationTimerRef.current) {
106
- clearTimeout(minDurationTimerRef.current);
107
- }
108
- if (transitionTimerRef.current) {
109
- clearTimeout(transitionTimerRef.current);
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { Skeleton } from "./index7.js";
4
+ import { useLoaderVisibility } from "./index71.js";
5
+ import { cn } from "./index3.js";
6
+ import { normalizeSize } from "./index4.js";
7
+ const FormFieldLoader = forwardRef(
8
+ ({
9
+ size = "md",
10
+ fieldType = "text",
11
+ showLabel = true,
12
+ labelWidth = 100,
13
+ fieldWidth = "100%",
14
+ fieldHeight,
15
+ showValidation = false,
16
+ showRequired = false,
17
+ showHelperText = false,
18
+ delay = 0,
19
+ minDuration = 0,
20
+ transition,
21
+ className,
22
+ style,
23
+ testId = "form-field-loader",
24
+ visible = true,
25
+ ariaLabel = "Loading form field...",
26
+ ...rest
27
+ }, ref) => {
28
+ const { shouldRender, opacity, transitionStyle } = useLoaderVisibility(
29
+ visible,
30
+ delay,
31
+ minDuration,
32
+ transition
33
+ );
34
+ if (!shouldRender) return null;
35
+ const getFieldHeight = () => {
36
+ if (fieldHeight) return normalizeSize(fieldHeight);
37
+ switch (fieldType) {
38
+ case "textarea":
39
+ return "80px";
40
+ case "select":
41
+ return "40px";
42
+ case "checkbox":
43
+ case "radio":
44
+ return "20px";
45
+ default:
46
+ return "40px";
110
47
  }
111
48
  };
112
- }, [visible, delay, minDuration, hasTransition, transitionDuration]);
113
- const opacity = hasTransition ? isTransitioning ? 1 : 0 : 1;
114
- const transitionStyle = hasTransition ? `opacity ${transitionDuration}ms ease-in-out` : "none";
115
- return {
116
- shouldRender,
117
- opacity,
118
- transitionStyle
119
- };
120
- }
49
+ return /* @__PURE__ */ jsxs(
50
+ "div",
51
+ {
52
+ ref,
53
+ "data-testid": testId,
54
+ className: cn("w-full", className),
55
+ style: {
56
+ ...style,
57
+ opacity,
58
+ transition: transitionStyle
59
+ },
60
+ role: "status",
61
+ "aria-label": ariaLabel,
62
+ "aria-busy": "true",
63
+ ...rest,
64
+ children: [
65
+ showLabel && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 mb-2", children: [
66
+ /* @__PURE__ */ jsx(
67
+ Skeleton,
68
+ {
69
+ width: normalizeSize(labelWidth),
70
+ height: 16,
71
+ borderRadius: 4
72
+ }
73
+ ),
74
+ showRequired && /* @__PURE__ */ jsx(
75
+ Skeleton,
76
+ {
77
+ width: 8,
78
+ height: 8,
79
+ variant: "circular"
80
+ }
81
+ )
82
+ ] }),
83
+ /* @__PURE__ */ jsx("div", { className: "w-full", children: fieldType === "checkbox" || fieldType === "radio" ? (
84
+ // Checkbox/Radio with label on the right
85
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
86
+ /* @__PURE__ */ jsx(
87
+ Skeleton,
88
+ {
89
+ width: 20,
90
+ height: 20,
91
+ variant: fieldType === "radio" ? "circular" : "rectangular",
92
+ borderRadius: fieldType === "checkbox" ? 4 : void 0
93
+ }
94
+ ),
95
+ /* @__PURE__ */ jsx(
96
+ Skeleton,
97
+ {
98
+ width: 150,
99
+ height: 16,
100
+ borderRadius: 4
101
+ }
102
+ )
103
+ ] })
104
+ ) : fieldType === "select" ? (
105
+ // Select dropdown
106
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
107
+ /* @__PURE__ */ jsx(
108
+ Skeleton,
109
+ {
110
+ width: fieldWidth,
111
+ height: getFieldHeight(),
112
+ borderRadius: 6
113
+ }
114
+ ),
115
+ /* @__PURE__ */ jsx("div", { className: "absolute right-3 top-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsx(
116
+ Skeleton,
117
+ {
118
+ width: 12,
119
+ height: 12,
120
+ variant: "rectangular"
121
+ }
122
+ ) })
123
+ ] })
124
+ ) : fieldType === "file" ? (
125
+ // File input
126
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
127
+ /* @__PURE__ */ jsx(
128
+ Skeleton,
129
+ {
130
+ width: 120,
131
+ height: 40,
132
+ borderRadius: 6
133
+ }
134
+ ),
135
+ /* @__PURE__ */ jsx(
136
+ Skeleton,
137
+ {
138
+ width: "calc(100% - 132px)",
139
+ height: 40,
140
+ borderRadius: 6
141
+ }
142
+ )
143
+ ] })
144
+ ) : (
145
+ // Text, textarea, etc.
146
+ /* @__PURE__ */ jsx(
147
+ Skeleton,
148
+ {
149
+ width: fieldWidth,
150
+ height: getFieldHeight(),
151
+ borderRadius: 6
152
+ }
153
+ )
154
+ ) }),
155
+ showHelperText && /* @__PURE__ */ jsx("div", { className: "mt-1", children: /* @__PURE__ */ jsx(
156
+ Skeleton,
157
+ {
158
+ width: 200,
159
+ height: 14,
160
+ borderRadius: 4
161
+ }
162
+ ) }),
163
+ showValidation && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 mt-1", children: [
164
+ /* @__PURE__ */ jsx(
165
+ Skeleton,
166
+ {
167
+ width: 14,
168
+ height: 14,
169
+ variant: "circular"
170
+ }
171
+ ),
172
+ /* @__PURE__ */ jsx(
173
+ Skeleton,
174
+ {
175
+ width: 180,
176
+ height: 14,
177
+ borderRadius: 4
178
+ }
179
+ )
180
+ ] })
181
+ ]
182
+ }
183
+ );
184
+ }
185
+ );
186
+ FormFieldLoader.displayName = "FormFieldLoader";
121
187
  export {
122
- getEffectiveDuration,
123
- useLoaderVisibility,
124
- useReducedMotion
188
+ FormFieldLoader
125
189
  };
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const classNames = require("./index3.cjs");
6
+ const LiveRegion = react.forwardRef(
7
+ ({
8
+ message,
9
+ politeness = "polite",
10
+ clearAfter,
11
+ atomic = true,
12
+ relevant = "additions",
13
+ className
14
+ }, ref) => {
15
+ const [displayMessage, setDisplayMessage] = react.useState(message);
16
+ const clearTimerRef = react.useRef(null);
17
+ react.useEffect(() => {
18
+ setDisplayMessage(message);
19
+ if (clearTimerRef.current) {
20
+ clearTimeout(clearTimerRef.current);
21
+ clearTimerRef.current = null;
22
+ }
23
+ if (clearAfter && message) {
24
+ clearTimerRef.current = setTimeout(() => {
25
+ setDisplayMessage("");
26
+ }, clearAfter);
27
+ }
28
+ return () => {
29
+ if (clearTimerRef.current) {
30
+ clearTimeout(clearTimerRef.current);
31
+ }
32
+ };
33
+ }, [message, clearAfter]);
34
+ return /* @__PURE__ */ jsxRuntime.jsx(
35
+ "div",
36
+ {
37
+ ref,
38
+ className: classNames.cn(
39
+ // Visually hidden but accessible to screen readers
40
+ "sr-only absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0",
41
+ className
42
+ ),
43
+ role: politeness === "assertive" ? "alert" : "status",
44
+ "aria-live": politeness,
45
+ "aria-atomic": atomic,
46
+ "aria-relevant": relevant,
47
+ children: displayMessage
48
+ }
49
+ );
50
+ }
51
+ );
52
+ LiveRegion.displayName = "LiveRegion";
53
+ exports.LiveRegion = LiveRegion;