@almadar/ui 2.26.0 → 2.27.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.
@@ -1,5 +1,5 @@
1
- import * as React110 from 'react';
2
- import React110__default, { createContext, useCallback, useState, useRef, useLayoutEffect, useEffect, lazy, useContext, useMemo } from 'react';
1
+ import * as React112 from 'react';
2
+ import React112__default, { createContext, useCallback, useState, useRef, useEffect, useLayoutEffect, lazy, useContext, useMemo } from 'react';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { EventBusContext } from '@almadar/ui/providers';
5
5
  import 'react-dom';
@@ -357,8 +357,8 @@ function EventBusProvider({ children, debug: debug2 = false }) {
357
357
  payload,
358
358
  timestamp: Date.now()
359
359
  };
360
- const listeners7 = listenersRef.current.get(type);
361
- const listenerCount = listeners7?.size ?? 0;
360
+ const listeners6 = listenersRef.current.get(type);
361
+ const listenerCount = listeners6?.size ?? 0;
362
362
  if (debug2) {
363
363
  if (listenerCount > 0) {
364
364
  console.log(`[EventBus] Emit: ${type} \u2192 ${listenerCount} listener(s)`, payload);
@@ -366,8 +366,8 @@ function EventBusProvider({ children, debug: debug2 = false }) {
366
366
  console.warn(`[EventBus] Emit: ${type} (NO LISTENERS - event may be lost!)`, payload);
367
367
  }
368
368
  }
369
- if (listeners7) {
370
- const listenersCopy = Array.from(listeners7);
369
+ if (listeners6) {
370
+ const listenersCopy = Array.from(listeners6);
371
371
  for (const listener of listenersCopy) {
372
372
  try {
373
373
  listener(event);
@@ -389,17 +389,17 @@ function EventBusProvider({ children, debug: debug2 = false }) {
389
389
  if (!listenersRef.current.has(type)) {
390
390
  listenersRef.current.set(type, /* @__PURE__ */ new Set());
391
391
  }
392
- const listeners7 = listenersRef.current.get(type);
393
- listeners7.add(listener);
392
+ const listeners6 = listenersRef.current.get(type);
393
+ listeners6.add(listener);
394
394
  if (debug2) {
395
- console.log(`[EventBus] Subscribed to '${type}', total: ${listeners7.size}`);
395
+ console.log(`[EventBus] Subscribed to '${type}', total: ${listeners6.size}`);
396
396
  }
397
397
  return () => {
398
- listeners7.delete(listener);
398
+ listeners6.delete(listener);
399
399
  if (debug2) {
400
- console.log(`[EventBus] Unsubscribed from '${type}', remaining: ${listeners7.size}`);
400
+ console.log(`[EventBus] Unsubscribed from '${type}', remaining: ${listeners6.size}`);
401
401
  }
402
- if (listeners7.size === 0) {
402
+ if (listeners6.size === 0) {
403
403
  listenersRef.current.delete(type);
404
404
  }
405
405
  };
@@ -412,8 +412,8 @@ function EventBusProvider({ children, debug: debug2 = false }) {
412
412
  return on(type, wrappedListener);
413
413
  }, [on]);
414
414
  const hasListeners = useCallback((type) => {
415
- const listeners7 = listenersRef.current.get(type);
416
- return listeners7 !== void 0 && listeners7.size > 0;
415
+ const listeners6 = listenersRef.current.get(type);
416
+ return listeners6 !== void 0 && listeners6.size > 0;
417
417
  }, []);
418
418
  const onAny = useCallback((listener) => {
419
419
  anyListenersRef.current.add(listener);
@@ -674,7 +674,7 @@ var positionStyles = {
674
674
  fixed: "fixed",
675
675
  sticky: "sticky"
676
676
  };
677
- var Box = React110__default.forwardRef(
677
+ var Box = React112__default.forwardRef(
678
678
  ({
679
679
  padding,
680
680
  paddingX,
@@ -944,7 +944,7 @@ function resolveIconProp(value, sizeClass) {
944
944
  const IconComp = value;
945
945
  return /* @__PURE__ */ jsx(IconComp, { className: sizeClass });
946
946
  }
947
- if (React110__default.isValidElement(value)) {
947
+ if (React112__default.isValidElement(value)) {
948
948
  return value;
949
949
  }
950
950
  if (typeof value === "object" && value !== null && "render" in value) {
@@ -953,7 +953,7 @@ function resolveIconProp(value, sizeClass) {
953
953
  }
954
954
  return value;
955
955
  }
956
- var Button = React110__default.forwardRef(
956
+ var Button = React112__default.forwardRef(
957
957
  ({
958
958
  className,
959
959
  variant = "primary",
@@ -1049,7 +1049,7 @@ var sizeStyles3 = {
1049
1049
  md: "px-2.5 py-1 text-sm",
1050
1050
  lg: "px-3 py-1.5 text-base"
1051
1051
  };
1052
- var Badge = React110__default.forwardRef(
1052
+ var Badge = React112__default.forwardRef(
1053
1053
  ({ className, variant = "default", size = "sm", amount, label, icon, children, ...props }, ref) => {
1054
1054
  const iconSizes2 = { sm: "w-3 h-3", md: "w-3.5 h-3.5", lg: "w-4 h-4" };
1055
1055
  const resolvedIcon = typeof icon === "string" ? (() => {
@@ -1076,7 +1076,7 @@ var Badge = React110__default.forwardRef(
1076
1076
  }
1077
1077
  );
1078
1078
  Badge.displayName = "Badge";
1079
- var Input = React110__default.forwardRef(
1079
+ var Input = React112__default.forwardRef(
1080
1080
  ({
1081
1081
  className,
1082
1082
  inputType,
@@ -1188,7 +1188,7 @@ var Input = React110__default.forwardRef(
1188
1188
  }
1189
1189
  );
1190
1190
  Input.displayName = "Input";
1191
- var Label = React110__default.forwardRef(
1191
+ var Label = React112__default.forwardRef(
1192
1192
  ({ className, required, children, ...props }, ref) => {
1193
1193
  return /* @__PURE__ */ jsxs(
1194
1194
  "label",
@@ -1208,7 +1208,7 @@ var Label = React110__default.forwardRef(
1208
1208
  }
1209
1209
  );
1210
1210
  Label.displayName = "Label";
1211
- var Textarea = React110__default.forwardRef(
1211
+ var Textarea = React112__default.forwardRef(
1212
1212
  ({ className, error, ...props }, ref) => {
1213
1213
  return /* @__PURE__ */ jsx(
1214
1214
  "textarea",
@@ -1231,7 +1231,7 @@ var Textarea = React110__default.forwardRef(
1231
1231
  }
1232
1232
  );
1233
1233
  Textarea.displayName = "Textarea";
1234
- var Select = React110__default.forwardRef(
1234
+ var Select = React112__default.forwardRef(
1235
1235
  ({ className, options, placeholder, error, ...props }, ref) => {
1236
1236
  return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
1237
1237
  /* @__PURE__ */ jsxs(
@@ -1267,7 +1267,7 @@ var Select = React110__default.forwardRef(
1267
1267
  }
1268
1268
  );
1269
1269
  Select.displayName = "Select";
1270
- var Checkbox = React110__default.forwardRef(
1270
+ var Checkbox = React112__default.forwardRef(
1271
1271
  ({ className, label, id, ...props }, ref) => {
1272
1272
  const inputId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;
1273
1273
  return /* @__PURE__ */ jsxs("div", { className: "flex items-center", children: [
@@ -1343,7 +1343,7 @@ var shadowStyles2 = {
1343
1343
  md: "shadow",
1344
1344
  lg: "shadow-lg"
1345
1345
  };
1346
- var Card = React110__default.forwardRef(
1346
+ var Card = React112__default.forwardRef(
1347
1347
  ({
1348
1348
  className,
1349
1349
  variant = "bordered",
@@ -1379,9 +1379,9 @@ var Card = React110__default.forwardRef(
1379
1379
  }
1380
1380
  );
1381
1381
  Card.displayName = "Card";
1382
- var CardHeader = React110__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("mb-4", className), ...props }));
1382
+ var CardHeader = React112__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("mb-4", className), ...props }));
1383
1383
  CardHeader.displayName = "CardHeader";
1384
- var CardTitle = React110__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1384
+ var CardTitle = React112__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1385
1385
  "h3",
1386
1386
  {
1387
1387
  ref,
@@ -1394,11 +1394,11 @@ var CardTitle = React110__default.forwardRef(({ className, ...props }, ref) => /
1394
1394
  }
1395
1395
  ));
1396
1396
  CardTitle.displayName = "CardTitle";
1397
- var CardContent = React110__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("", className), ...props }));
1397
+ var CardContent = React112__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("", className), ...props }));
1398
1398
  CardContent.displayName = "CardContent";
1399
1399
  var CardBody = CardContent;
1400
1400
  CardBody.displayName = "CardBody";
1401
- var CardFooter = React110__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1401
+ var CardFooter = React112__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1402
1402
  "div",
1403
1403
  {
1404
1404
  ref,
@@ -1413,7 +1413,7 @@ var sizeStyles4 = {
1413
1413
  md: "h-6 w-6",
1414
1414
  lg: "h-8 w-8"
1415
1415
  };
1416
- var Spinner = React110__default.forwardRef(
1416
+ var Spinner = React112__default.forwardRef(
1417
1417
  ({ className, size = "md", ...props }, ref) => {
1418
1418
  return /* @__PURE__ */ jsx(
1419
1419
  "div",
@@ -1427,7 +1427,7 @@ var Spinner = React110__default.forwardRef(
1427
1427
  }
1428
1428
  );
1429
1429
  Spinner.displayName = "Spinner";
1430
- var Radio = React110__default.forwardRef(
1430
+ var Radio = React112__default.forwardRef(
1431
1431
  ({
1432
1432
  label,
1433
1433
  helperText,
@@ -1531,7 +1531,7 @@ var Radio = React110__default.forwardRef(
1531
1531
  }
1532
1532
  );
1533
1533
  Radio.displayName = "Radio";
1534
- var Switch = React110.forwardRef(
1534
+ var Switch = React112.forwardRef(
1535
1535
  ({
1536
1536
  checked,
1537
1537
  defaultChecked = false,
@@ -1542,10 +1542,10 @@ var Switch = React110.forwardRef(
1542
1542
  name,
1543
1543
  className
1544
1544
  }, ref) => {
1545
- const [isChecked, setIsChecked] = React110.useState(
1545
+ const [isChecked, setIsChecked] = React112.useState(
1546
1546
  checked !== void 0 ? checked : defaultChecked
1547
1547
  );
1548
- React110.useEffect(() => {
1548
+ React112.useEffect(() => {
1549
1549
  if (checked !== void 0) {
1550
1550
  setIsChecked(checked);
1551
1551
  }
@@ -1703,7 +1703,7 @@ var sizeStyles5 = {
1703
1703
  md: "w-2.5 h-2.5",
1704
1704
  lg: "w-3 h-3"
1705
1705
  };
1706
- var StatusDot = React110__default.forwardRef(
1706
+ var StatusDot = React112__default.forwardRef(
1707
1707
  ({ className, status = "offline", pulse = false, size = "md", label, ...props }, ref) => {
1708
1708
  return /* @__PURE__ */ jsx(
1709
1709
  "span",
@@ -1750,7 +1750,7 @@ var iconMap2 = {
1750
1750
  down: TrendingDown,
1751
1751
  flat: ArrowRight
1752
1752
  };
1753
- var TrendIndicator = React110__default.forwardRef(
1753
+ var TrendIndicator = React112__default.forwardRef(
1754
1754
  ({
1755
1755
  className,
1756
1756
  value,
@@ -1809,7 +1809,7 @@ var thumbSizes = {
1809
1809
  md: "w-4 h-4",
1810
1810
  lg: "w-5 h-5"
1811
1811
  };
1812
- var RangeSlider = React110__default.forwardRef(
1812
+ var RangeSlider = React112__default.forwardRef(
1813
1813
  ({
1814
1814
  className,
1815
1815
  min = 0,
@@ -2012,7 +2012,7 @@ var paddingClasses = {
2012
2012
  md: "py-16",
2013
2013
  lg: "py-24"
2014
2014
  };
2015
- var ContentSection = React110__default.forwardRef(
2015
+ var ContentSection = React112__default.forwardRef(
2016
2016
  ({ children, background = "default", padding = "lg", id, className }, ref) => {
2017
2017
  return /* @__PURE__ */ jsx(
2018
2018
  Box,
@@ -2031,6 +2031,289 @@ var ContentSection = React110__default.forwardRef(
2031
2031
  }
2032
2032
  );
2033
2033
  ContentSection.displayName = "ContentSection";
2034
+ var initialStyles = {
2035
+ "fade-up": { opacity: 0, transform: "translateY(24px)" },
2036
+ "fade-down": { opacity: 0, transform: "translateY(-24px)" },
2037
+ "fade-in": { opacity: 0 },
2038
+ "fade-left": { opacity: 0, transform: "translateX(24px)" },
2039
+ "fade-right": { opacity: 0, transform: "translateX(-24px)" },
2040
+ "scale": { opacity: 0, transform: "scale(0.92)" },
2041
+ "scale-up": { opacity: 0, transform: "scale(0.92) translateY(16px)" },
2042
+ "none": {}
2043
+ };
2044
+ var animatedStyles = {
2045
+ "fade-up": { opacity: 1, transform: "translateY(0)" },
2046
+ "fade-down": { opacity: 1, transform: "translateY(0)" },
2047
+ "fade-in": { opacity: 1 },
2048
+ "fade-left": { opacity: 1, transform: "translateX(0)" },
2049
+ "fade-right": { opacity: 1, transform: "translateX(0)" },
2050
+ "scale": { opacity: 1, transform: "scale(1)" },
2051
+ "scale-up": { opacity: 1, transform: "scale(1) translateY(0)" },
2052
+ "none": {}
2053
+ };
2054
+ var AnimatedReveal = React112__default.forwardRef(
2055
+ ({
2056
+ trigger = "scroll",
2057
+ animation = "fade-up",
2058
+ duration = 600,
2059
+ delay = 0,
2060
+ threshold = 0.15,
2061
+ once = true,
2062
+ animate: manualAnimate,
2063
+ easing = "cubic-bezier(0.16, 1, 0.3, 1)",
2064
+ children,
2065
+ className,
2066
+ style,
2067
+ ...props
2068
+ }, forwardedRef) => {
2069
+ const [isAnimated, setIsAnimated] = useState(false);
2070
+ const internalRef = useRef(null);
2071
+ const hasAnimated = useRef(false);
2072
+ const setRef = useCallback(
2073
+ (node) => {
2074
+ internalRef.current = node;
2075
+ if (typeof forwardedRef === "function") forwardedRef(node);
2076
+ else if (forwardedRef) forwardedRef.current = node;
2077
+ },
2078
+ [forwardedRef]
2079
+ );
2080
+ useEffect(() => {
2081
+ if (trigger !== "scroll") return;
2082
+ const el = internalRef.current;
2083
+ if (!el) return;
2084
+ const observer = new IntersectionObserver(
2085
+ ([entry]) => {
2086
+ if (entry.isIntersecting) {
2087
+ if (once && hasAnimated.current) return;
2088
+ hasAnimated.current = true;
2089
+ setIsAnimated(true);
2090
+ } else if (!once) {
2091
+ setIsAnimated(false);
2092
+ }
2093
+ },
2094
+ { threshold }
2095
+ );
2096
+ observer.observe(el);
2097
+ return () => observer.disconnect();
2098
+ }, [trigger, threshold, once]);
2099
+ const handleMouseEnter = trigger === "hover" ? () => setIsAnimated(true) : void 0;
2100
+ const handleMouseLeave = trigger === "hover" ? () => {
2101
+ if (!once || !hasAnimated.current) {
2102
+ hasAnimated.current = true;
2103
+ setIsAnimated(false);
2104
+ }
2105
+ } : void 0;
2106
+ useEffect(() => {
2107
+ if (trigger === "manual" && manualAnimate !== void 0) {
2108
+ setIsAnimated(manualAnimate);
2109
+ }
2110
+ }, [trigger, manualAnimate]);
2111
+ const active = isAnimated;
2112
+ const currentStyle = active ? animatedStyles[animation] : initialStyles[animation];
2113
+ return /* @__PURE__ */ jsx(
2114
+ "div",
2115
+ {
2116
+ ref: setRef,
2117
+ className: cn("will-change-[opacity,transform]", className),
2118
+ style: {
2119
+ ...currentStyle,
2120
+ transitionProperty: "opacity, transform",
2121
+ transitionDuration: `${duration}ms`,
2122
+ transitionDelay: `${delay}ms`,
2123
+ transitionTimingFunction: easing,
2124
+ ...style
2125
+ },
2126
+ onMouseEnter: handleMouseEnter,
2127
+ onMouseLeave: handleMouseLeave,
2128
+ ...props,
2129
+ children: typeof children === "function" ? children(active) : children
2130
+ }
2131
+ );
2132
+ }
2133
+ );
2134
+ AnimatedReveal.displayName = "AnimatedReveal";
2135
+ function useFetchedSvg(src) {
2136
+ const [svg, setSvg] = useState(null);
2137
+ const cache = useRef({});
2138
+ useEffect(() => {
2139
+ if (!src) {
2140
+ setSvg(null);
2141
+ return;
2142
+ }
2143
+ if (cache.current[src]) {
2144
+ setSvg(cache.current[src]);
2145
+ return;
2146
+ }
2147
+ let cancelled = false;
2148
+ fetch(src).then((res) => {
2149
+ if (!res.ok) throw new Error(`Failed to fetch SVG: ${res.status}`);
2150
+ return res.text();
2151
+ }).then((text) => {
2152
+ if (cancelled) return;
2153
+ cache.current[src] = text;
2154
+ setSvg(text);
2155
+ }).catch(() => {
2156
+ if (!cancelled) setSvg(null);
2157
+ });
2158
+ return () => {
2159
+ cancelled = true;
2160
+ };
2161
+ }, [src]);
2162
+ return svg;
2163
+ }
2164
+ function applyDrawAnimation(container, animate, duration, delay, easing) {
2165
+ const paths = container.querySelectorAll("path, line, polyline, polygon, circle, ellipse, rect");
2166
+ paths.forEach((el) => {
2167
+ if ("getTotalLength" in el && typeof el.getTotalLength === "function") {
2168
+ const len = el.getTotalLength();
2169
+ el.style.strokeDasharray = `${len}`;
2170
+ el.style.strokeDashoffset = animate ? "0" : `${len}`;
2171
+ el.style.transition = `stroke-dashoffset ${duration}ms ${easing} ${delay}ms`;
2172
+ }
2173
+ });
2174
+ }
2175
+ function applyFillAnimation(container, animate, duration, delay, easing, fillColor) {
2176
+ const paths = container.querySelectorAll("path, circle, ellipse, rect, polygon");
2177
+ paths.forEach((el) => {
2178
+ if ("getTotalLength" in el && typeof el.getTotalLength === "function") {
2179
+ const geom = el;
2180
+ const len = geom.getTotalLength();
2181
+ geom.style.strokeDasharray = `${len}`;
2182
+ geom.style.strokeDashoffset = animate ? "0" : `${len}`;
2183
+ geom.style.transition = `stroke-dashoffset ${duration * 0.6}ms ${easing} ${delay}ms, fill-opacity ${duration * 0.4}ms ${easing} ${delay + duration * 0.6}ms`;
2184
+ }
2185
+ if (fillColor) el.style.fill = fillColor;
2186
+ el.style.fillOpacity = animate ? "1" : "0";
2187
+ });
2188
+ }
2189
+ function applyPulseAnimation(container, animate, duration) {
2190
+ const svg = container.querySelector("svg");
2191
+ if (!svg) return;
2192
+ if (animate) {
2193
+ svg.style.animation = `ag-pulse ${duration}ms ease-in-out infinite`;
2194
+ } else {
2195
+ svg.style.animation = "none";
2196
+ }
2197
+ }
2198
+ function applyMorphAnimation(container, animate, duration, delay, easing) {
2199
+ const paths = container.querySelectorAll("path, circle, ellipse, rect, polygon");
2200
+ paths.forEach((el) => {
2201
+ el.style.transition = `all ${duration}ms ${easing} ${delay}ms`;
2202
+ el.style.transform = animate ? "scale(1)" : "scale(0)";
2203
+ el.style.transformOrigin = "center";
2204
+ el.style.opacity = animate ? "1" : "0";
2205
+ });
2206
+ }
2207
+ var AnimatedGraphic = React112__default.forwardRef(
2208
+ ({
2209
+ src,
2210
+ svgContent,
2211
+ animation = "draw",
2212
+ animate = false,
2213
+ duration = 1200,
2214
+ delay = 0,
2215
+ easing = "cubic-bezier(0.16, 1, 0.3, 1)",
2216
+ width,
2217
+ height,
2218
+ strokeColor,
2219
+ fillColor,
2220
+ alt,
2221
+ className,
2222
+ style,
2223
+ children,
2224
+ ...props
2225
+ }, ref) => {
2226
+ const containerRef = useRef(null);
2227
+ const fetchedSvg = useFetchedSvg(svgContent ? void 0 : src);
2228
+ const resolvedSvg = svgContent ?? fetchedSvg;
2229
+ const prevAnimateRef = useRef(animate);
2230
+ const setRef = React112__default.useCallback(
2231
+ (node) => {
2232
+ containerRef.current = node;
2233
+ if (typeof ref === "function") ref(node);
2234
+ else if (ref) ref.current = node;
2235
+ },
2236
+ [ref]
2237
+ );
2238
+ useEffect(() => {
2239
+ const el = containerRef.current;
2240
+ if (!el || !strokeColor) return;
2241
+ const paths = el.querySelectorAll("path, line, polyline, polygon, circle, ellipse, rect");
2242
+ paths.forEach((p2) => {
2243
+ p2.style.stroke = strokeColor;
2244
+ });
2245
+ }, [resolvedSvg, strokeColor]);
2246
+ useEffect(() => {
2247
+ const el = containerRef.current;
2248
+ if (!el || !resolvedSvg) return;
2249
+ if (animation === "draw" || animation === "fill") {
2250
+ const paths = el.querySelectorAll("path, line, polyline, polygon, circle, ellipse, rect");
2251
+ paths.forEach((p2) => {
2252
+ if ("getTotalLength" in p2 && typeof p2.getTotalLength === "function") {
2253
+ const len = p2.getTotalLength();
2254
+ p2.style.strokeDasharray = `${len}`;
2255
+ p2.style.strokeDashoffset = `${len}`;
2256
+ }
2257
+ if (animation === "fill") {
2258
+ p2.style.fillOpacity = "0";
2259
+ }
2260
+ });
2261
+ }
2262
+ if (animation === "morph") {
2263
+ const paths = el.querySelectorAll("path, circle, ellipse, rect, polygon");
2264
+ paths.forEach((p2) => {
2265
+ p2.style.transform = "scale(0)";
2266
+ p2.style.transformOrigin = "center";
2267
+ p2.style.opacity = "0";
2268
+ });
2269
+ }
2270
+ }, [resolvedSvg, animation]);
2271
+ useEffect(() => {
2272
+ const el = containerRef.current;
2273
+ if (!el) return;
2274
+ const id = requestAnimationFrame(() => {
2275
+ switch (animation) {
2276
+ case "draw":
2277
+ applyDrawAnimation(el, animate, duration, delay, easing);
2278
+ break;
2279
+ case "fill":
2280
+ applyFillAnimation(el, animate, duration, delay, easing, fillColor);
2281
+ break;
2282
+ case "pulse":
2283
+ applyPulseAnimation(el, animate, duration);
2284
+ break;
2285
+ case "morph":
2286
+ applyMorphAnimation(el, animate, duration, delay, easing);
2287
+ break;
2288
+ }
2289
+ });
2290
+ prevAnimateRef.current = animate;
2291
+ return () => cancelAnimationFrame(id);
2292
+ }, [animate, animation, duration, delay, easing, fillColor, resolvedSvg]);
2293
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2294
+ /* @__PURE__ */ jsx("style", { children: `@keyframes ag-pulse { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.04); opacity: 0.85; } }` }),
2295
+ /* @__PURE__ */ jsx(
2296
+ "div",
2297
+ {
2298
+ ref: setRef,
2299
+ className: cn("inline-flex items-center justify-center", className),
2300
+ style: { width, height, ...style },
2301
+ role: alt ? "img" : void 0,
2302
+ "aria-label": alt,
2303
+ ...props,
2304
+ children: resolvedSvg ? /* @__PURE__ */ jsx(
2305
+ "div",
2306
+ {
2307
+ className: "w-full h-full [&>svg]:w-full [&>svg]:h-full",
2308
+ dangerouslySetInnerHTML: { __html: resolvedSvg }
2309
+ }
2310
+ ) : children
2311
+ }
2312
+ )
2313
+ ] });
2314
+ }
2315
+ );
2316
+ AnimatedGraphic.displayName = "AnimatedGraphic";
2034
2317
 
2035
2318
  // locales/en.json
2036
2319
  var en_default = {
@@ -2186,7 +2469,7 @@ var ErrorState = ({
2186
2469
  );
2187
2470
  };
2188
2471
  ErrorState.displayName = "ErrorState";
2189
- var ErrorBoundary = class extends React110__default.Component {
2472
+ var ErrorBoundary = class extends React112__default.Component {
2190
2473
  constructor(props) {
2191
2474
  super(props);
2192
2475
  __publicField(this, "reset", () => {
@@ -2614,29 +2897,41 @@ var defaultIcon = L.icon({
2614
2897
  L.Marker.prototype.options.icon = defaultIcon;
2615
2898
 
2616
2899
  // lib/verificationRegistry.ts
2617
- var checks = /* @__PURE__ */ new Map();
2618
- var transitions = [];
2619
2900
  var MAX_TRANSITIONS = 500;
2620
- var listeners = /* @__PURE__ */ new Set();
2901
+ function getState() {
2902
+ if (typeof window !== "undefined") {
2903
+ const w = window;
2904
+ if (!w.__verificationRegistryState) {
2905
+ w.__verificationRegistryState = {
2906
+ checks: /* @__PURE__ */ new Map(),
2907
+ transitions: [],
2908
+ bridgeHealth: null,
2909
+ listeners: /* @__PURE__ */ new Set()
2910
+ };
2911
+ }
2912
+ return w.__verificationRegistryState;
2913
+ }
2914
+ return { checks: /* @__PURE__ */ new Map(), transitions: [], bridgeHealth: null, listeners: /* @__PURE__ */ new Set() };
2915
+ }
2621
2916
  function notifyListeners() {
2622
- listeners.forEach((l) => l());
2917
+ getState().listeners.forEach((l) => l());
2623
2918
  exposeOnWindow();
2624
2919
  }
2625
2920
  function registerCheck(id, label, status = "pending", details) {
2626
- checks.set(id, { id, label, status, details, updatedAt: Date.now() });
2921
+ getState().checks.set(id, { id, label, status, details, updatedAt: Date.now() });
2627
2922
  notifyListeners();
2628
2923
  }
2629
2924
  function getAllChecks() {
2630
- return Array.from(checks.values());
2925
+ return Array.from(getState().checks.values());
2631
2926
  }
2632
2927
  function recordTransition(trace) {
2633
2928
  const entry = {
2634
2929
  ...trace,
2635
2930
  id: `t-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
2636
2931
  };
2637
- transitions.push(entry);
2638
- if (transitions.length > MAX_TRANSITIONS) {
2639
- transitions.shift();
2932
+ getState().transitions.push(entry);
2933
+ if (getState().transitions.length > MAX_TRANSITIONS) {
2934
+ getState().transitions.shift();
2640
2935
  }
2641
2936
  if (entry.event === "INIT") {
2642
2937
  const hasFetch = entry.effects.some((e) => e.type === "fetch");
@@ -2671,10 +2966,11 @@ function recordTransition(trace) {
2671
2966
  notifyListeners();
2672
2967
  }
2673
2968
  function getTransitions() {
2674
- return [...transitions];
2969
+ return [...getState().transitions];
2675
2970
  }
2676
2971
  function getBridgeHealth() {
2677
- return null;
2972
+ const bh = getState().bridgeHealth;
2973
+ return bh ? { ...bh } : null;
2678
2974
  }
2679
2975
  function getSummary() {
2680
2976
  const allChecks = getAllChecks();
@@ -2695,8 +2991,8 @@ function getSnapshot() {
2695
2991
  };
2696
2992
  }
2697
2993
  function subscribeToVerification(listener) {
2698
- listeners.add(listener);
2699
- return () => listeners.delete(listener);
2994
+ getState().listeners.add(listener);
2995
+ return () => getState().listeners.delete(listener);
2700
2996
  }
2701
2997
  function exposeOnWindow() {
2702
2998
  if (typeof window === "undefined") return;
@@ -2713,7 +3009,7 @@ function exposeOnWindow() {
2713
3009
  }
2714
3010
  function waitForTransition(event, timeoutMs = 1e4) {
2715
3011
  return new Promise((resolve) => {
2716
- const existing = transitions.find((t) => t.event === event);
3012
+ const existing = getState().transitions.find((t) => t.event === event);
2717
3013
  if (existing) {
2718
3014
  resolve(existing);
2719
3015
  return;
@@ -2723,7 +3019,7 @@ function waitForTransition(event, timeoutMs = 1e4) {
2723
3019
  resolve(null);
2724
3020
  }, timeoutMs);
2725
3021
  const unsub = subscribeToVerification(() => {
2726
- const found = transitions.find((t) => t.event === event);
3022
+ const found = getState().transitions.find((t) => t.event === event);
2727
3023
  if (found) {
2728
3024
  clearTimeout(timeout);
2729
3025
  unsub();
@@ -2766,7 +3062,7 @@ function bindTraitStateGetter(getter) {
2766
3062
  }
2767
3063
  }
2768
3064
  exposeOnWindow();
2769
- var MarkdownContent = React110__default.memo(
3065
+ var MarkdownContent = React112__default.memo(
2770
3066
  ({ content, direction, className }) => {
2771
3067
  const { t: _t } = useTranslate();
2772
3068
  const safeContent = typeof content === "string" ? content : String(content ?? "");
@@ -2868,7 +3164,7 @@ var MarkdownContent = React110__default.memo(
2868
3164
  (prev, next) => prev.content === next.content && prev.className === next.className && prev.direction === next.direction
2869
3165
  );
2870
3166
  MarkdownContent.displayName = "MarkdownContent";
2871
- var CodeBlock = React110__default.memo(
3167
+ var CodeBlock = React112__default.memo(
2872
3168
  ({
2873
3169
  code: rawCode,
2874
3170
  language = "text",
@@ -2985,12 +3281,12 @@ GameAudioContext.displayName = "GameAudioContext";
2985
3281
 
2986
3282
  // components/organisms/component-registry.generated.ts
2987
3283
  function lazyThree(name, loader) {
2988
- const Lazy = React110__default.lazy(() => loader().then((m) => ({ default: m[name] })));
3284
+ const Lazy = React112__default.lazy(() => loader().then((m) => ({ default: m[name] })));
2989
3285
  function ThreeWrapper(props) {
2990
- return React110__default.createElement(
2991
- React110__default.Suspense,
3286
+ return React112__default.createElement(
3287
+ React112__default.Suspense,
2992
3288
  { fallback: null },
2993
- React110__default.createElement(Lazy, props)
3289
+ React112__default.createElement(Lazy, props)
2994
3290
  );
2995
3291
  }
2996
3292
  ThreeWrapper.displayName = `Lazy(${name})`;
@@ -3017,7 +3313,7 @@ function SuspenseConfigProvider({
3017
3313
  config,
3018
3314
  children
3019
3315
  }) {
3020
- return React110__default.createElement(
3316
+ return React112__default.createElement(
3021
3317
  SuspenseConfigContext.Provider,
3022
3318
  { value: config },
3023
3319
  children
@@ -3090,7 +3386,7 @@ function VerificationProvider({
3090
3386
  })) : [];
3091
3387
  recordTransition({
3092
3388
  traitName: parsed.traitName,
3093
- from: pending?.from ?? "unknown",
3389
+ from: pending?.from ?? (parsed.event === "INIT" ? "init" : "unknown"),
3094
3390
  to: newState,
3095
3391
  event: parsed.event,
3096
3392
  effects,