asterui 0.12.26 → 0.12.27

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 (163) hide show
  1. package/dist/components/Descriptions.d.ts +35 -3
  2. package/dist/components/Empty.d.ts +10 -1
  3. package/dist/components/Image.d.ts +13 -1
  4. package/dist/components/List.d.ts +74 -8
  5. package/dist/components/Table.d.ts +64 -10
  6. package/dist/components/Timeline.d.ts +62 -7
  7. package/dist/index.d.ts +4 -6
  8. package/dist/index.js +148 -150
  9. package/dist/index.js.map +1 -1
  10. package/dist/index10.js +1 -1
  11. package/dist/index100.js +5 -32
  12. package/dist/index100.js.map +1 -1
  13. package/dist/index101.js +13 -5
  14. package/dist/index101.js.map +1 -1
  15. package/dist/index102.js +43 -11
  16. package/dist/index102.js.map +1 -1
  17. package/dist/index103.js +11 -44
  18. package/dist/index103.js.map +1 -1
  19. package/dist/index104.js +12 -10
  20. package/dist/index104.js.map +1 -1
  21. package/dist/index105.js +7 -14
  22. package/dist/index105.js.map +1 -1
  23. package/dist/index106.js +12 -7
  24. package/dist/index106.js.map +1 -1
  25. package/dist/index107.js +29 -11
  26. package/dist/index107.js.map +1 -1
  27. package/dist/index108.js +16 -29
  28. package/dist/index108.js.map +1 -1
  29. package/dist/index109.js +31 -16
  30. package/dist/index109.js.map +1 -1
  31. package/dist/index110.js +517 -30
  32. package/dist/index110.js.map +1 -1
  33. package/dist/index111.js +45 -515
  34. package/dist/index111.js.map +1 -1
  35. package/dist/index22.js +1 -1
  36. package/dist/index23.js +127 -93
  37. package/dist/index23.js.map +1 -1
  38. package/dist/index39.js +162 -115
  39. package/dist/index39.js.map +1 -1
  40. package/dist/index40.js +398 -40
  41. package/dist/index40.js.map +1 -1
  42. package/dist/index41.js +132 -389
  43. package/dist/index41.js.map +1 -1
  44. package/dist/index42.js +252 -91
  45. package/dist/index42.js.map +1 -1
  46. package/dist/index43.js +143 -247
  47. package/dist/index43.js.map +1 -1
  48. package/dist/index44.js +15 -154
  49. package/dist/index44.js.map +1 -1
  50. package/dist/index45.js +17 -15
  51. package/dist/index45.js.map +1 -1
  52. package/dist/index46.js +136 -16
  53. package/dist/index46.js.map +1 -1
  54. package/dist/index47.js +118 -133
  55. package/dist/index47.js.map +1 -1
  56. package/dist/index48.js +35 -13
  57. package/dist/index48.js.map +1 -1
  58. package/dist/index49.js +34 -35
  59. package/dist/index49.js.map +1 -1
  60. package/dist/index50.js +81 -34
  61. package/dist/index50.js.map +1 -1
  62. package/dist/index51.js +166 -71
  63. package/dist/index51.js.map +1 -1
  64. package/dist/index52.js +144 -167
  65. package/dist/index52.js.map +1 -1
  66. package/dist/index53.js +11 -152
  67. package/dist/index53.js.map +1 -1
  68. package/dist/index54.js +55 -10
  69. package/dist/index54.js.map +1 -1
  70. package/dist/index55.js +12 -55
  71. package/dist/index55.js.map +1 -1
  72. package/dist/index56.js +7 -14
  73. package/dist/index56.js.map +1 -1
  74. package/dist/index57.js +333 -6
  75. package/dist/index57.js.map +1 -1
  76. package/dist/index58.js +47 -334
  77. package/dist/index58.js.map +1 -1
  78. package/dist/index59.js +122 -47
  79. package/dist/index59.js.map +1 -1
  80. package/dist/index60.js +108 -120
  81. package/dist/index60.js.map +1 -1
  82. package/dist/index61.js +167 -107
  83. package/dist/index61.js.map +1 -1
  84. package/dist/index62.js +29 -167
  85. package/dist/index62.js.map +1 -1
  86. package/dist/index63.js +120 -30
  87. package/dist/index63.js.map +1 -1
  88. package/dist/index64.js +80 -116
  89. package/dist/index64.js.map +1 -1
  90. package/dist/index65.js +19 -85
  91. package/dist/index65.js.map +1 -1
  92. package/dist/index66.js +73 -19
  93. package/dist/index66.js.map +1 -1
  94. package/dist/index67.js +54 -71
  95. package/dist/index67.js.map +1 -1
  96. package/dist/index68.js +44 -56
  97. package/dist/index68.js.map +1 -1
  98. package/dist/index69.js +49 -42
  99. package/dist/index69.js.map +1 -1
  100. package/dist/index70.js +121 -50
  101. package/dist/index70.js.map +1 -1
  102. package/dist/index71.js +102 -118
  103. package/dist/index71.js.map +1 -1
  104. package/dist/index72.js +72 -105
  105. package/dist/index72.js.map +1 -1
  106. package/dist/index73.js +67 -73
  107. package/dist/index73.js.map +1 -1
  108. package/dist/index74.js +19 -66
  109. package/dist/index74.js.map +1 -1
  110. package/dist/index75.js +55 -18
  111. package/dist/index75.js.map +1 -1
  112. package/dist/index76.js +251 -55
  113. package/dist/index76.js.map +1 -1
  114. package/dist/index77.js +22 -254
  115. package/dist/index77.js.map +1 -1
  116. package/dist/index78.js +31 -22
  117. package/dist/index78.js.map +1 -1
  118. package/dist/index79.js +93 -30
  119. package/dist/index79.js.map +1 -1
  120. package/dist/index80.js +626 -86
  121. package/dist/index80.js.map +1 -1
  122. package/dist/index81.js +73 -322
  123. package/dist/index81.js.map +1 -1
  124. package/dist/index82.js +39 -79
  125. package/dist/index82.js.map +1 -1
  126. package/dist/index83.js +23 -40
  127. package/dist/index83.js.map +1 -1
  128. package/dist/index84.js +207 -23
  129. package/dist/index84.js.map +1 -1
  130. package/dist/index85.js +148 -199
  131. package/dist/index85.js.map +1 -1
  132. package/dist/index86.js +152 -147
  133. package/dist/index86.js.map +1 -1
  134. package/dist/index87.js +143 -156
  135. package/dist/index87.js.map +1 -1
  136. package/dist/index88.js +35 -65
  137. package/dist/index88.js.map +1 -1
  138. package/dist/index89.js +234 -35
  139. package/dist/index89.js.map +1 -1
  140. package/dist/index90.js +31 -231
  141. package/dist/index90.js.map +1 -1
  142. package/dist/index91.js +210 -34
  143. package/dist/index91.js.map +1 -1
  144. package/dist/index92.js +418 -187
  145. package/dist/index92.js.map +1 -1
  146. package/dist/index93.js +686 -376
  147. package/dist/index93.js.map +1 -1
  148. package/dist/index94.js +165 -738
  149. package/dist/index94.js.map +1 -1
  150. package/dist/index95.js +253 -173
  151. package/dist/index95.js.map +1 -1
  152. package/dist/index96.js +64 -256
  153. package/dist/index96.js.map +1 -1
  154. package/dist/index97.js +121 -61
  155. package/dist/index97.js.map +1 -1
  156. package/dist/index98.js +14 -126
  157. package/dist/index98.js.map +1 -1
  158. package/dist/index99.js +31 -12
  159. package/dist/index99.js.map +1 -1
  160. package/package.json +1 -1
  161. package/dist/components/Indicator.d.ts +0 -7
  162. package/dist/index112.js +0 -53
  163. package/dist/index112.js.map +0 -1
package/dist/index39.js CHANGED
@@ -1,125 +1,172 @@
1
- import { jsxs as u, Fragment as M, jsx as e } from "react/jsx-runtime";
2
- import { useState as a, useEffect as P } from "react";
3
- const I = ({
4
- src: s,
5
- alt: f = "",
6
- fallback: i,
7
- placeholder: h,
8
- preview: p = !0,
9
- width: n,
10
- height: o,
11
- className: g = "",
12
- onLoad: k,
13
- onError: y,
14
- ...C
15
- }) => {
16
- const [r, l] = a(!0), [c, m] = a(!1), [L, b] = a(!1), [N, v] = a(s);
17
- P(() => {
18
- l(!0), m(!1), v(s);
19
- }, [s]);
20
- const j = () => {
21
- l(!1), m(!1), k?.();
22
- }, w = () => {
23
- l(!1), m(!0), i && v(i), y?.();
24
- }, S = () => {
25
- p && !c && !r && b(!0);
26
- }, x = () => {
27
- b(!1);
28
- }, d = () => {
29
- const t = {};
30
- return n && (t.width = typeof n == "number" ? `${n}px` : n), o && (t.height = typeof o == "number" ? `${o}px` : o), t;
31
- }, E = [
32
- g,
33
- p && !c && !r ? "cursor-pointer hover:opacity-80 transition-opacity" : ""
34
- ].filter(Boolean).join(" ");
35
- return /* @__PURE__ */ u(M, { children: [
36
- /* @__PURE__ */ u("div", { className: "relative inline-block", style: d(), children: [
37
- r && h && /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center bg-base-200", children: h }),
38
- /* @__PURE__ */ e(
39
- "img",
1
+ import { jsxs as p, Fragment as F, jsx as a } from "react/jsx-runtime";
2
+ import { forwardRef as z, useState as h, useEffect as W, useCallback as i } from "react";
3
+ const H = z(
4
+ ({
5
+ src: l,
6
+ alt: n = "",
7
+ fallback: c,
8
+ placeholder: y,
9
+ preview: s = !0,
10
+ width: d,
11
+ height: m,
12
+ className: N = "",
13
+ onLoad: k,
14
+ onError: w,
15
+ "data-testid": o = "image",
16
+ ...$
17
+ }, j) => {
18
+ const [t, g] = h(!0), [r, v] = h(!1), [L, u] = h(!1), [P, x] = h(l);
19
+ W(() => {
20
+ g(!0), v(!1), x(l);
21
+ }, [l]);
22
+ const D = i(() => {
23
+ g(!1), v(!1), k?.();
24
+ }, [k]), E = i(() => {
25
+ g(!1), v(!0), c && x(c), w?.();
26
+ }, [c, w]), S = i(() => {
27
+ s && !r && !t && u(!0);
28
+ }, [s, r, t]), C = i(() => {
29
+ u(!1);
30
+ }, []), K = i(
31
+ (e) => {
32
+ s && !r && !t && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), u(!0));
33
+ },
34
+ [s, r, t]
35
+ ), M = i((e) => {
36
+ e.key === "Escape" && u(!1);
37
+ }, []), b = () => {
38
+ const e = {};
39
+ return d && (e.width = typeof d == "number" ? `${d}px` : d), m && (e.height = typeof m == "number" ? `${m}px` : m), e;
40
+ }, f = s && !r && !t, B = [
41
+ N,
42
+ f ? "cursor-pointer hover:opacity-80 transition-opacity" : ""
43
+ ].filter(Boolean).join(" ");
44
+ return /* @__PURE__ */ p(F, { children: [
45
+ /* @__PURE__ */ p(
46
+ "div",
40
47
  {
41
- ...C,
42
- src: N,
43
- alt: f,
44
- className: E,
45
- style: { ...d(), display: r ? "none" : "block" },
46
- onLoad: j,
47
- onError: w,
48
- onClick: S
48
+ className: "relative inline-block",
49
+ style: b(),
50
+ "data-testid": o,
51
+ "data-state": t ? "loading" : r ? "error" : "loaded",
52
+ children: [
53
+ t && y && /* @__PURE__ */ a(
54
+ "div",
55
+ {
56
+ className: "absolute inset-0 flex items-center justify-center bg-base-200",
57
+ "data-testid": `${o}-placeholder`,
58
+ children: y
59
+ }
60
+ ),
61
+ /* @__PURE__ */ a(
62
+ "img",
63
+ {
64
+ ref: j,
65
+ ...$,
66
+ src: P,
67
+ alt: n,
68
+ className: B,
69
+ style: { ...b(), display: t ? "none" : "block" },
70
+ onLoad: D,
71
+ onError: E,
72
+ onClick: S,
73
+ onKeyDown: K,
74
+ tabIndex: f ? 0 : void 0,
75
+ role: f ? "button" : void 0,
76
+ "aria-label": f ? `${n || "Image"} (click to preview)` : void 0,
77
+ "data-testid": `${o}-img`
78
+ }
79
+ ),
80
+ r && !c && /* @__PURE__ */ a(
81
+ "div",
82
+ {
83
+ className: "flex items-center justify-center bg-base-200 text-base-content/50",
84
+ style: b(),
85
+ "data-testid": `${o}-error`,
86
+ role: "img",
87
+ "aria-label": `Failed to load: ${n || "image"}`,
88
+ children: /* @__PURE__ */ a(
89
+ "svg",
90
+ {
91
+ className: "w-12 h-12",
92
+ fill: "none",
93
+ stroke: "currentColor",
94
+ viewBox: "0 0 24 24",
95
+ "aria-hidden": "true",
96
+ children: /* @__PURE__ */ a(
97
+ "path",
98
+ {
99
+ strokeLinecap: "round",
100
+ strokeLinejoin: "round",
101
+ strokeWidth: 2,
102
+ d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"
103
+ }
104
+ )
105
+ }
106
+ )
107
+ }
108
+ )
109
+ ]
49
110
  }
50
111
  ),
51
- c && !i && /* @__PURE__ */ e(
112
+ L && /* @__PURE__ */ a(
52
113
  "div",
53
114
  {
54
- className: "flex items-center justify-center bg-base-200 text-base-content/50",
55
- style: d(),
56
- children: /* @__PURE__ */ e(
57
- "svg",
58
- {
59
- className: "w-12 h-12",
60
- fill: "none",
61
- stroke: "currentColor",
62
- viewBox: "0 0 24 24",
63
- children: /* @__PURE__ */ e(
64
- "path",
65
- {
66
- strokeLinecap: "round",
67
- strokeLinejoin: "round",
68
- strokeWidth: 2,
69
- d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"
70
- }
71
- )
72
- }
73
- )
115
+ className: "fixed inset-0 z-50 bg-black bg-opacity-80 flex items-center justify-center p-4",
116
+ onClick: C,
117
+ onKeyDown: M,
118
+ role: "dialog",
119
+ "aria-modal": "true",
120
+ "aria-label": `Preview: ${n || "Image"}`,
121
+ "data-testid": `${o}-preview`,
122
+ children: /* @__PURE__ */ p("div", { className: "relative max-w-full max-h-full", children: [
123
+ /* @__PURE__ */ a(
124
+ "button",
125
+ {
126
+ className: "absolute top-4 right-4 btn btn-circle btn-sm",
127
+ onClick: C,
128
+ "aria-label": "Close preview",
129
+ autoFocus: !0,
130
+ "data-testid": `${o}-preview-close`,
131
+ children: /* @__PURE__ */ a(
132
+ "svg",
133
+ {
134
+ className: "w-6 h-6",
135
+ fill: "none",
136
+ stroke: "currentColor",
137
+ viewBox: "0 0 24 24",
138
+ "aria-hidden": "true",
139
+ children: /* @__PURE__ */ a(
140
+ "path",
141
+ {
142
+ strokeLinecap: "round",
143
+ strokeLinejoin: "round",
144
+ strokeWidth: 2,
145
+ d: "M6 18L18 6M6 6l12 12"
146
+ }
147
+ )
148
+ }
149
+ )
150
+ }
151
+ ),
152
+ /* @__PURE__ */ a(
153
+ "img",
154
+ {
155
+ src: l,
156
+ alt: n,
157
+ className: "max-w-full max-h-[90vh] object-contain",
158
+ onClick: (e) => e.stopPropagation(),
159
+ "data-testid": `${o}-preview-img`
160
+ }
161
+ )
162
+ ] })
74
163
  }
75
164
  )
76
- ] }),
77
- L && /* @__PURE__ */ e(
78
- "div",
79
- {
80
- className: "fixed inset-0 z-50 bg-black bg-opacity-80 flex items-center justify-center p-4",
81
- onClick: x,
82
- children: /* @__PURE__ */ u("div", { className: "relative max-w-full max-h-full", children: [
83
- /* @__PURE__ */ e(
84
- "button",
85
- {
86
- className: "absolute top-4 right-4 btn btn-circle btn-sm",
87
- onClick: x,
88
- children: /* @__PURE__ */ e(
89
- "svg",
90
- {
91
- className: "w-6 h-6",
92
- fill: "none",
93
- stroke: "currentColor",
94
- viewBox: "0 0 24 24",
95
- children: /* @__PURE__ */ e(
96
- "path",
97
- {
98
- strokeLinecap: "round",
99
- strokeLinejoin: "round",
100
- strokeWidth: 2,
101
- d: "M6 18L18 6M6 6l12 12"
102
- }
103
- )
104
- }
105
- )
106
- }
107
- ),
108
- /* @__PURE__ */ e(
109
- "img",
110
- {
111
- src: s,
112
- alt: f,
113
- className: "max-w-full max-h-[90vh] object-contain",
114
- onClick: (t) => t.stopPropagation()
115
- }
116
- )
117
- ] })
118
- }
119
- )
120
- ] });
121
- };
165
+ ] });
166
+ }
167
+ );
168
+ H.displayName = "Image";
122
169
  export {
123
- I as Image
170
+ H as Image
124
171
  };
125
172
  //# sourceMappingURL=index39.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index39.js","sources":["../src/components/Image.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react'\n\nexport interface ImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'placeholder'> {\n src: string\n alt?: string\n fallback?: string\n placeholder?: React.ReactNode\n preview?: boolean\n width?: string | number\n height?: string | number\n className?: string\n onLoad?: () => void\n onError?: () => void\n}\n\nexport const Image: React.FC<ImageProps> = ({\n src,\n alt = '',\n fallback,\n placeholder,\n preview = true,\n width,\n height,\n className = '',\n onLoad,\n onError,\n ...props\n}) => {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [currentSrc, setCurrentSrc] = useState(src)\n\n useEffect(() => {\n setLoading(true)\n setError(false)\n setCurrentSrc(src)\n }, [src])\n\n const handleLoad = () => {\n setLoading(false)\n setError(false)\n onLoad?.()\n }\n\n const handleError = () => {\n setLoading(false)\n setError(true)\n if (fallback) {\n setCurrentSrc(fallback)\n }\n onError?.()\n }\n\n const handleImageClick = () => {\n if (preview && !error && !loading) {\n setShowPreview(true)\n }\n }\n\n const handleClosePreview = () => {\n setShowPreview(false)\n }\n\n const getStyle = (): React.CSSProperties => {\n const style: React.CSSProperties = {}\n if (width) {\n style.width = typeof width === 'number' ? `${width}px` : width\n }\n if (height) {\n style.height = typeof height === 'number' ? `${height}px` : height\n }\n return style\n }\n\n const imageClasses = [\n className,\n preview && !error && !loading ? 'cursor-pointer hover:opacity-80 transition-opacity' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <>\n <div className=\"relative inline-block\" style={getStyle()}>\n {loading && placeholder && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-base-200\">\n {placeholder}\n </div>\n )}\n <img\n {...props}\n src={currentSrc}\n alt={alt}\n className={imageClasses}\n style={{ ...getStyle(), display: loading ? 'none' : 'block' }}\n onLoad={handleLoad}\n onError={handleError}\n onClick={handleImageClick}\n />\n {error && !fallback && (\n <div\n className=\"flex items-center justify-center bg-base-200 text-base-content/50\"\n style={getStyle()}\n >\n <svg\n className=\"w-12 h-12\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n </div>\n )}\n </div>\n\n {showPreview && (\n <div\n className=\"fixed inset-0 z-50 bg-black bg-opacity-80 flex items-center justify-center p-4\"\n onClick={handleClosePreview}\n >\n <div className=\"relative max-w-full max-h-full\">\n <button\n className=\"absolute top-4 right-4 btn btn-circle btn-sm\"\n onClick={handleClosePreview}\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n <img\n src={src}\n alt={alt}\n className=\"max-w-full max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n </div>\n )}\n </>\n )\n}\n"],"names":["Image","src","alt","fallback","placeholder","preview","width","height","className","onLoad","onError","props","loading","setLoading","useState","error","setError","showPreview","setShowPreview","currentSrc","setCurrentSrc","useEffect","handleLoad","handleError","handleImageClick","handleClosePreview","getStyle","style","imageClasses","jsxs","Fragment","jsx","e"],"mappings":"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"}
1
+ {"version":3,"file":"index39.js","sources":["../src/components/Image.tsx"],"sourcesContent":["import React, { useState, useEffect, forwardRef, useCallback } from 'react'\n\nexport interface ImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'placeholder'> {\n /** Image source URL */\n src: string\n /** Alternative text for the image */\n alt?: string\n /** Fallback image URL when source fails to load */\n fallback?: string\n /** Placeholder content shown while loading */\n placeholder?: React.ReactNode\n /** Enable click to preview image in lightbox */\n preview?: boolean\n /** Image width */\n width?: string | number\n /** Image height */\n height?: string | number\n /** Additional CSS classes */\n className?: string\n /** Callback when image loads successfully */\n onLoad?: () => void\n /** Callback when image fails to load */\n onError?: () => void\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n (\n {\n src,\n alt = '',\n fallback,\n placeholder,\n preview = true,\n width,\n height,\n className = '',\n onLoad,\n onError,\n 'data-testid': testId = 'image',\n ...props\n },\n ref\n ) => {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [currentSrc, setCurrentSrc] = useState(src)\n\n useEffect(() => {\n setLoading(true)\n setError(false)\n setCurrentSrc(src)\n }, [src])\n\n const handleLoad = useCallback(() => {\n setLoading(false)\n setError(false)\n onLoad?.()\n }, [onLoad])\n\n const handleError = useCallback(() => {\n setLoading(false)\n setError(true)\n if (fallback) {\n setCurrentSrc(fallback)\n }\n onError?.()\n }, [fallback, onError])\n\n const handleImageClick = useCallback(() => {\n if (preview && !error && !loading) {\n setShowPreview(true)\n }\n }, [preview, error, loading])\n\n const handleClosePreview = useCallback(() => {\n setShowPreview(false)\n }, [])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (preview && !error && !loading && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n setShowPreview(true)\n }\n },\n [preview, error, loading]\n )\n\n const handlePreviewKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n setShowPreview(false)\n }\n }, [])\n\n const getStyle = (): React.CSSProperties => {\n const style: React.CSSProperties = {}\n if (width) {\n style.width = typeof width === 'number' ? `${width}px` : width\n }\n if (height) {\n style.height = typeof height === 'number' ? `${height}px` : height\n }\n return style\n }\n\n const isPreviewable = preview && !error && !loading\n const imageClasses = [\n className,\n isPreviewable ? 'cursor-pointer hover:opacity-80 transition-opacity' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <>\n <div\n className=\"relative inline-block\"\n style={getStyle()}\n data-testid={testId}\n data-state={loading ? 'loading' : error ? 'error' : 'loaded'}\n >\n {loading && placeholder && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-base-200\"\n data-testid={`${testId}-placeholder`}\n >\n {placeholder}\n </div>\n )}\n <img\n ref={ref}\n {...props}\n src={currentSrc}\n alt={alt}\n className={imageClasses}\n style={{ ...getStyle(), display: loading ? 'none' : 'block' }}\n onLoad={handleLoad}\n onError={handleError}\n onClick={handleImageClick}\n onKeyDown={handleKeyDown}\n tabIndex={isPreviewable ? 0 : undefined}\n role={isPreviewable ? 'button' : undefined}\n aria-label={isPreviewable ? `${alt || 'Image'} (click to preview)` : undefined}\n data-testid={`${testId}-img`}\n />\n {error && !fallback && (\n <div\n className=\"flex items-center justify-center bg-base-200 text-base-content/50\"\n style={getStyle()}\n data-testid={`${testId}-error`}\n role=\"img\"\n aria-label={`Failed to load: ${alt || 'image'}`}\n >\n <svg\n className=\"w-12 h-12\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n </div>\n )}\n </div>\n\n {showPreview && (\n <div\n className=\"fixed inset-0 z-50 bg-black bg-opacity-80 flex items-center justify-center p-4\"\n onClick={handleClosePreview}\n onKeyDown={handlePreviewKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Preview: ${alt || 'Image'}`}\n data-testid={`${testId}-preview`}\n >\n <div className=\"relative max-w-full max-h-full\">\n <button\n className=\"absolute top-4 right-4 btn btn-circle btn-sm\"\n onClick={handleClosePreview}\n aria-label=\"Close preview\"\n autoFocus\n data-testid={`${testId}-preview-close`}\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n <img\n src={src}\n alt={alt}\n className=\"max-w-full max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n data-testid={`${testId}-preview-img`}\n />\n </div>\n </div>\n )}\n </>\n )\n }\n)\n\nImage.displayName = 'Image'\n"],"names":["Image","forwardRef","src","alt","fallback","placeholder","preview","width","height","className","onLoad","onError","testId","props","ref","loading","setLoading","useState","error","setError","showPreview","setShowPreview","currentSrc","setCurrentSrc","useEffect","handleLoad","useCallback","handleError","handleImageClick","handleClosePreview","handleKeyDown","handlePreviewKeyDown","getStyle","style","isPreviewable","imageClasses","jsxs","Fragment","jsx"],"mappings":"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"}