@almadar/ui 5.121.3 → 5.122.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,9 +1,9 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import * as React73 from 'react';
3
- import React73__default, { createContext, useContext, useMemo, useRef, useEffect, useCallback, useState, Suspense, lazy, useSyncExternalStore, useLayoutEffect, useId } from 'react';
2
+ import * as React74 from 'react';
3
+ import React74__default, { createContext, useContext, useMemo, useRef, useEffect, useCallback, useState, Suspense, lazy, useSyncExternalStore, useLayoutEffect, useId } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
- import { EventBusContext, useTraitScope, useCurrentPagePath, useGameAudioContextOptional, useEntitySchemaOptional, TraitScopeProvider } from '@almadar/ui/providers';
6
+ import { EventBusContext, useTraitScopeChain, useCurrentPagePath, useGameAudioContextOptional, useEntitySchemaOptional, TraitScopeProvider } from '@almadar/ui/providers';
7
7
  export { GameAudioContext, GameAudioProvider, useGameAudioContext } from '@almadar/ui/providers';
8
8
  import { createLogger, isLogLevelEnabled } from '@almadar/logger';
9
9
  import * as LucideIcons2 from 'lucide-react';
@@ -230,7 +230,7 @@ var init_SvgFlow = __esm({
230
230
  width = 100,
231
231
  height = 100
232
232
  }) => {
233
- const markerId = React73__default.useMemo(() => {
233
+ const markerId = React74__default.useMemo(() => {
234
234
  flowIdCounter += 1;
235
235
  return `almadar-flow-arrow-${flowIdCounter}`;
236
236
  }, []);
@@ -823,7 +823,7 @@ var init_SvgRing = __esm({
823
823
  width = 100,
824
824
  height = 100
825
825
  }) => {
826
- const gradientId = React73__default.useMemo(() => {
826
+ const gradientId = React74__default.useMemo(() => {
827
827
  ringIdCounter += 1;
828
828
  return `almadar-ring-glow-${ringIdCounter}`;
829
829
  }, []);
@@ -1043,9 +1043,9 @@ function getGlobalEventBus() {
1043
1043
  function useEventBus() {
1044
1044
  const context = useContext(EventBusContext);
1045
1045
  const baseBus = context ?? getGlobalEventBus() ?? fallbackEventBus;
1046
- const scope = useTraitScope();
1046
+ const chain = useTraitScopeChain();
1047
1047
  return useMemo(() => {
1048
- if (!scope) {
1048
+ if (chain.length === 0) {
1049
1049
  return {
1050
1050
  ...baseBus,
1051
1051
  emit: (type, payload, source) => {
@@ -1061,22 +1061,31 @@ function useEventBus() {
1061
1061
  emit: (type, payload, source) => {
1062
1062
  if (typeof type === "string" && type.startsWith("UI:")) {
1063
1063
  const tail = type.slice(3);
1064
- const qualified = tail.includes(".") ? type : `UI:${scope.orbital}.${scope.trait}.${tail}`;
1065
- if (qualified !== type) {
1066
- scopeLog.info("emit:qualified", {
1064
+ const isQualified = tail.includes(".");
1065
+ const event = isQualified ? tail.split(".").slice(2).join(".") : tail;
1066
+ if (!event) {
1067
+ baseBus.emit(type, payload, source);
1068
+ return;
1069
+ }
1070
+ const keys = /* @__PURE__ */ new Set();
1071
+ if (isQualified) keys.add(type);
1072
+ for (const sc of chain) {
1073
+ keys.add(`UI:${sc.orbital}.${sc.trait}.${event}`);
1074
+ }
1075
+ if (keys.size > 1) {
1076
+ scopeLog.info("emit:fan-out", {
1067
1077
  from: type,
1068
- to: qualified,
1069
- scopeOrbital: scope.orbital,
1070
- scopeTrait: scope.trait
1078
+ keys: Array.from(keys),
1079
+ chainDepth: chain.length
1071
1080
  });
1072
1081
  }
1073
- baseBus.emit(qualified, payload, source);
1082
+ for (const key of keys) baseBus.emit(key, payload, source);
1074
1083
  return;
1075
1084
  }
1076
1085
  baseBus.emit(type, payload, source);
1077
1086
  }
1078
1087
  };
1079
- }, [baseBus, scope]);
1088
+ }, [baseBus, chain]);
1080
1089
  }
1081
1090
  function useEventListener(event, handler) {
1082
1091
  const eventBus = useEventBus();
@@ -1353,13 +1362,13 @@ var init_Icon = __esm({
1353
1362
  style
1354
1363
  }) => {
1355
1364
  const directIcon = typeof icon === "string" ? void 0 : icon;
1356
- const effectiveName = typeof icon === "string" ? icon : name;
1365
+ const effectiveName = typeof icon === "string" && icon !== "" ? icon : name;
1366
+ const effectiveStrokeWidth = strokeWidth != null && strokeWidth > 0 ? strokeWidth : void 0;
1357
1367
  const family = useIconFamily();
1358
- const RenderedComponent = React73__default.useMemo(() => {
1368
+ const RenderedComponent = React74__default.useMemo(() => {
1359
1369
  if (directIcon) return null;
1360
1370
  return effectiveName ? resolveIconForFamily(effectiveName) : null;
1361
1371
  }, [directIcon, effectiveName, family]);
1362
- const effectiveStrokeWidth = strokeWidth ?? void 0;
1363
1372
  const inlineStyle = {
1364
1373
  ...effectiveStrokeWidth === void 0 ? { strokeWidth: "var(--icon-stroke-width, 2)" } : {},
1365
1374
  ...style
@@ -1476,7 +1485,7 @@ var init_atlasSlice = __esm({
1476
1485
  }
1477
1486
  });
1478
1487
  function useAtlasSliceDataUrl(asset) {
1479
- const [, bump] = React73.useReducer((x) => x + 1, 0);
1488
+ const [, bump] = React74.useReducer((x) => x + 1, 0);
1480
1489
  if (!isAtlasAsset(asset)) return void 0;
1481
1490
  const key = `${asset.atlas}#${asset.sprite}`;
1482
1491
  const cached = sliceDataUrlCache.get(key);
@@ -1539,13 +1548,13 @@ function AtlasImage({
1539
1548
  style,
1540
1549
  "aria-hidden": ariaHidden
1541
1550
  }) {
1542
- const [, bump] = React73.useReducer((x) => x + 1, 0);
1543
- const canvasRef = React73.useRef(null);
1551
+ const [, bump] = React74.useReducer((x) => x + 1, 0);
1552
+ const canvasRef = React74.useRef(null);
1544
1553
  const sliced = isAtlasAsset(asset);
1545
1554
  const atlas = sliced ? getAtlas(asset.atlas, bump) : void 0;
1546
1555
  const img = sliced && asset?.url ? getSheetImage(asset.url, bump) : null;
1547
1556
  const rect = sliced && atlas ? subRectFor(atlas, asset.sprite) : null;
1548
- React73.useEffect(() => {
1557
+ React74.useEffect(() => {
1549
1558
  const canvas = canvasRef.current;
1550
1559
  if (!canvas || !img || !rect) return;
1551
1560
  canvas.width = rect.sw;
@@ -1621,7 +1630,7 @@ function resolveIconProp(value, sizeClass) {
1621
1630
  const IconComp = value;
1622
1631
  return /* @__PURE__ */ jsx(IconComp, { className: sizeClass });
1623
1632
  }
1624
- if (React73__default.isValidElement(value)) {
1633
+ if (React74__default.isValidElement(value)) {
1625
1634
  return value;
1626
1635
  }
1627
1636
  if (typeof value === "object" && value !== null && isIconLike(value)) {
@@ -1698,7 +1707,7 @@ var init_Button = __esm({
1698
1707
  md: "h-icon-default w-icon-default",
1699
1708
  lg: "h-icon-default w-icon-default"
1700
1709
  };
1701
- Button = React73__default.forwardRef(
1710
+ Button = React74__default.forwardRef(
1702
1711
  ({
1703
1712
  className,
1704
1713
  variant = "primary",
@@ -1740,7 +1749,8 @@ var init_Button = __esm({
1740
1749
  "font-medium",
1741
1750
  "rounded-sm",
1742
1751
  "cursor-pointer",
1743
- "transition-all duration-[var(--transition-normal)]",
1752
+ "chrome-button",
1753
+ "transition-all duration-normal",
1744
1754
  "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-offset-[length:var(--focus-ring-offset)]",
1745
1755
  "disabled:opacity-50 disabled:cursor-not-allowed",
1746
1756
  variantStyles[variant],
@@ -1768,7 +1778,7 @@ var init_Input = __esm({
1768
1778
  init_cn();
1769
1779
  init_Icon();
1770
1780
  init_useEventBus();
1771
- Input = React73__default.forwardRef(
1781
+ Input = React74__default.forwardRef(
1772
1782
  ({
1773
1783
  className,
1774
1784
  inputType,
@@ -1803,7 +1813,7 @@ var init_Input = __esm({
1803
1813
  const showClearButton = clearable && value && String(value).length > 0;
1804
1814
  const isMultiline = type === "textarea";
1805
1815
  const baseClassName = cn(
1806
- "block w-full rounded-sm transition-all duration-[var(--transition-fast)]",
1816
+ "block w-full rounded-sm transition-all duration-fast",
1807
1817
  "border-[length:var(--border-width-thin)] border-border",
1808
1818
  isMultiline ? "px-3 py-2 text-sm" : "h-input-md px-3 text-sm",
1809
1819
  "bg-card hover:bg-muted focus:bg-card",
@@ -1836,7 +1846,7 @@ var init_Input = __esm({
1836
1846
  eventBus.emit(`UI:${action}`, { value: e.currentTarget.value });
1837
1847
  }
1838
1848
  };
1839
- const wrapField = (field) => /* @__PURE__ */ jsxs("div", { className: "w-full", children: [
1849
+ const wrapField = (field, fullWidth = true) => /* @__PURE__ */ jsxs("div", { className: fullWidth ? "w-full" : "w-fit", children: [
1840
1850
  label && /* @__PURE__ */ jsx("label", { className: "block text-sm font-medium text-foreground mb-1", children: label }),
1841
1851
  field,
1842
1852
  (helperText || error) && /* @__PURE__ */ jsx("p", { className: cn("mt-1 text-xs", error ? "text-error" : "text-muted-foreground"), children: error ?? helperText })
@@ -1896,7 +1906,8 @@ var init_Input = __esm({
1896
1906
  ),
1897
1907
  ...props
1898
1908
  }
1899
- )
1909
+ ),
1910
+ false
1900
1911
  );
1901
1912
  }
1902
1913
  return wrapField(
@@ -1935,7 +1946,7 @@ var Label;
1935
1946
  var init_Label = __esm({
1936
1947
  "components/core/atoms/Label.tsx"() {
1937
1948
  init_cn();
1938
- Label = React73__default.forwardRef(
1949
+ Label = React74__default.forwardRef(
1939
1950
  ({ className, required, children, ...props }, ref) => {
1940
1951
  return /* @__PURE__ */ jsxs(
1941
1952
  "label",
@@ -1962,7 +1973,7 @@ var init_Textarea = __esm({
1962
1973
  "components/core/atoms/Textarea.tsx"() {
1963
1974
  init_cn();
1964
1975
  init_useEventBus();
1965
- Textarea = React73__default.forwardRef(
1976
+ Textarea = React74__default.forwardRef(
1966
1977
  ({ className, error, onChange, ...props }, ref) => {
1967
1978
  const eventBus = useEventBus();
1968
1979
  const handleChange = (e) => {
@@ -2201,7 +2212,7 @@ var init_Select = __esm({
2201
2212
  init_cn();
2202
2213
  init_Icon();
2203
2214
  init_useEventBus();
2204
- Select = React73__default.forwardRef(
2215
+ Select = React74__default.forwardRef(
2205
2216
  (props, _ref) => {
2206
2217
  const { multiple, searchable, clearable } = props;
2207
2218
  if (multiple || searchable || clearable) {
@@ -2218,7 +2229,7 @@ var init_Checkbox = __esm({
2218
2229
  "components/core/atoms/Checkbox.tsx"() {
2219
2230
  init_cn();
2220
2231
  init_useEventBus();
2221
- Checkbox = React73__default.forwardRef(
2232
+ Checkbox = React74__default.forwardRef(
2222
2233
  ({ className, label, id, onChange, ...props }, ref) => {
2223
2234
  const inputId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;
2224
2235
  const eventBus = useEventBus();
@@ -2272,7 +2283,7 @@ var init_Spinner = __esm({
2272
2283
  md: "h-6 w-6",
2273
2284
  lg: "h-8 w-8"
2274
2285
  };
2275
- Spinner = React73__default.forwardRef(
2286
+ Spinner = React74__default.forwardRef(
2276
2287
  ({ className, size = "md", overlay, ...props }, ref) => {
2277
2288
  if (overlay) {
2278
2289
  return /* @__PURE__ */ jsx(
@@ -2314,21 +2325,21 @@ var init_Card = __esm({
2314
2325
  "bg-card",
2315
2326
  "border-[length:var(--border-width)] border-border",
2316
2327
  "shadow-elevation-card",
2317
- "transition-all duration-[var(--transition-normal)]",
2328
+ "transition-all duration-normal",
2318
2329
  "hover:shadow-elevation-dialog hover:translate-y-[var(--hover-translate-y)]"
2319
2330
  ].join(" "),
2320
2331
  bordered: [
2321
2332
  "bg-card",
2322
2333
  "border-[length:var(--border-width)] border-border",
2323
2334
  "shadow-elevation-card",
2324
- "transition-all duration-[var(--transition-normal)]",
2335
+ "transition-all duration-normal",
2325
2336
  "hover:shadow-elevation-dialog hover:translate-y-[var(--hover-translate-y)]"
2326
2337
  ].join(" "),
2327
2338
  elevated: [
2328
2339
  "bg-card",
2329
2340
  "border-[length:var(--border-width)] border-border",
2330
2341
  "shadow",
2331
- "transition-all duration-[var(--transition-normal)]",
2342
+ "transition-all duration-normal",
2332
2343
  "hover:shadow-elevation-dialog hover:translate-y-[var(--hover-translate-y)]"
2333
2344
  ].join(" "),
2334
2345
  // Interactive variant with theme-specific hover effects
@@ -2337,7 +2348,7 @@ var init_Card = __esm({
2337
2348
  "border-[length:var(--border-width)] border-border",
2338
2349
  "shadow",
2339
2350
  "cursor-pointer",
2340
- "transition-all duration-[var(--transition-normal)]",
2351
+ "transition-all duration-normal",
2341
2352
  "hover:shadow-elevation-dialog"
2342
2353
  ].join(" ")
2343
2354
  };
@@ -2362,7 +2373,7 @@ var init_Card = __esm({
2362
2373
  chip: "shadow-none rounded-pill border-[length:var(--border-width)] border-border",
2363
2374
  "tile-image-first": "p-0 overflow-hidden"
2364
2375
  };
2365
- Card = React73__default.forwardRef(
2376
+ Card = React74__default.forwardRef(
2366
2377
  ({
2367
2378
  className,
2368
2379
  variant = "bordered",
@@ -2388,7 +2399,8 @@ var init_Card = __esm({
2388
2399
  ref,
2389
2400
  className: cn(
2390
2401
  "rounded-container relative",
2391
- "transition-all duration-[var(--transition-normal)]",
2402
+ "transition-all duration-normal",
2403
+ "chrome-panel",
2392
2404
  variantStyles2[variant],
2393
2405
  paddingStyles[padding],
2394
2406
  lookStyles[look],
@@ -2410,9 +2422,9 @@ var init_Card = __esm({
2410
2422
  }
2411
2423
  );
2412
2424
  Card.displayName = "Card";
2413
- CardHeader = React73__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("mb-4", className), ...props }));
2425
+ CardHeader = React74__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("mb-4", className), ...props }));
2414
2426
  CardHeader.displayName = "CardHeader";
2415
- CardTitle = React73__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2427
+ CardTitle = React74__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2416
2428
  "h3",
2417
2429
  {
2418
2430
  ref,
@@ -2425,11 +2437,11 @@ var init_Card = __esm({
2425
2437
  }
2426
2438
  ));
2427
2439
  CardTitle.displayName = "CardTitle";
2428
- CardContent = React73__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("", className), ...props }));
2440
+ CardContent = React74__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("", className), ...props }));
2429
2441
  CardContent.displayName = "CardContent";
2430
2442
  CardBody = CardContent;
2431
2443
  CardBody.displayName = "CardBody";
2432
- CardFooter = React73__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2444
+ CardFooter = React74__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2433
2445
  "div",
2434
2446
  {
2435
2447
  ref,
@@ -2483,7 +2495,7 @@ var init_Badge = __esm({
2483
2495
  md: "px-2.5 py-1 text-sm",
2484
2496
  lg: "px-3 py-1.5 text-base"
2485
2497
  };
2486
- Badge = React73__default.forwardRef(
2498
+ Badge = React74__default.forwardRef(
2487
2499
  ({ className, variant = "default", size = "sm", amount, label, icon, iconAsset, children, onRemove, removeLabel, ...props }, ref) => {
2488
2500
  const iconSizes3 = {
2489
2501
  sm: "h-icon-default w-icon-default",
@@ -2609,7 +2621,7 @@ var init_FilterPill = __esm({
2609
2621
  md: "w-3.5 h-3.5",
2610
2622
  lg: "w-4 h-4"
2611
2623
  };
2612
- FilterPill = React73__default.forwardRef(
2624
+ FilterPill = React74__default.forwardRef(
2613
2625
  ({
2614
2626
  className,
2615
2627
  variant = "default",
@@ -2738,8 +2750,8 @@ var init_Avatar = __esm({
2738
2750
  actionPayload
2739
2751
  }) => {
2740
2752
  const eventBus = useEventBus();
2741
- const [imgFailed, setImgFailed] = React73__default.useState(false);
2742
- React73__default.useEffect(() => {
2753
+ const [imgFailed, setImgFailed] = React74__default.useState(false);
2754
+ React74__default.useEffect(() => {
2743
2755
  setImgFailed(false);
2744
2756
  }, [src]);
2745
2757
  const initials = providedInitials ?? (name ? generateInitials(name) : void 0);
@@ -2991,7 +3003,7 @@ var init_Box = __esm({
2991
3003
  fixed: "fixed",
2992
3004
  sticky: "sticky"
2993
3005
  };
2994
- Box = React73__default.forwardRef(
3006
+ Box = React74__default.forwardRef(
2995
3007
  ({
2996
3008
  padding,
2997
3009
  paddingX,
@@ -3056,7 +3068,7 @@ var init_Box = __esm({
3056
3068
  onPointerDown?.(e);
3057
3069
  }, [hoverEvent, tapReveal, triggerProps, onPointerDown]);
3058
3070
  const isClickable = action || onClick;
3059
- return React73__default.createElement(
3071
+ return React74__default.createElement(
3060
3072
  Component,
3061
3073
  {
3062
3074
  ref,
@@ -3110,7 +3122,7 @@ var init_Center = __esm({
3110
3122
  as: Component = "div"
3111
3123
  }) => {
3112
3124
  const mergedStyle = minHeight ? { minHeight, ...style } : style;
3113
- return React73__default.createElement(Component, {
3125
+ return React74__default.createElement(Component, {
3114
3126
  className: cn(
3115
3127
  inline ? "inline-flex" : "flex",
3116
3128
  horizontal && "justify-center",
@@ -3378,7 +3390,7 @@ var init_Radio = __esm({
3378
3390
  md: "w-2.5 h-2.5",
3379
3391
  lg: "w-3 h-3"
3380
3392
  };
3381
- Radio = React73__default.forwardRef(
3393
+ Radio = React74__default.forwardRef(
3382
3394
  ({
3383
3395
  label,
3384
3396
  helperText,
@@ -3395,12 +3407,12 @@ var init_Radio = __esm({
3395
3407
  onChange,
3396
3408
  ...props
3397
3409
  }, ref) => {
3398
- const reactId = React73__default.useId();
3410
+ const reactId = React74__default.useId();
3399
3411
  const baseId = id || `radio-${reactId}`;
3400
3412
  const hasError = !!error;
3401
3413
  const eventBus = useEventBus();
3402
- const [selected, setSelected] = React73__default.useState(value);
3403
- React73__default.useEffect(() => {
3414
+ const [selected, setSelected] = React74__default.useState(value);
3415
+ React74__default.useEffect(() => {
3404
3416
  if (value !== void 0) setSelected(value);
3405
3417
  }, [value]);
3406
3418
  const pick = (next, e) => {
@@ -3582,7 +3594,7 @@ var init_Switch = __esm({
3582
3594
  "components/core/atoms/Switch.tsx"() {
3583
3595
  "use client";
3584
3596
  init_cn();
3585
- Switch = React73.forwardRef(
3597
+ Switch = React74.forwardRef(
3586
3598
  ({
3587
3599
  checked,
3588
3600
  defaultChecked = false,
@@ -3593,10 +3605,10 @@ var init_Switch = __esm({
3593
3605
  name,
3594
3606
  className
3595
3607
  }, ref) => {
3596
- const [isChecked, setIsChecked] = React73.useState(
3608
+ const [isChecked, setIsChecked] = React74.useState(
3597
3609
  checked !== void 0 ? checked : defaultChecked
3598
3610
  );
3599
- React73.useEffect(() => {
3611
+ React74.useEffect(() => {
3600
3612
  if (checked !== void 0) {
3601
3613
  setIsChecked(checked);
3602
3614
  }
@@ -3627,7 +3639,7 @@ var init_Switch = __esm({
3627
3639
  // redefine --space-11 to 68px, which makes w-11 enormous and leaves
3628
3640
  // the thumb stuck near the left edge. The switch geometry must stay
3629
3641
  // proportional regardless of a theme's density scale.
3630
- "relative inline-flex h-[1.5rem] w-[2.75rem] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors",
3642
+ "relative inline-flex h-[1.5rem] w-[2.75rem] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors duration-fast",
3631
3643
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
3632
3644
  isChecked ? "bg-primary" : "bg-muted",
3633
3645
  disabled && "cursor-not-allowed opacity-50"
@@ -3636,7 +3648,7 @@ var init_Switch = __esm({
3636
3648
  "span",
3637
3649
  {
3638
3650
  className: cn(
3639
- "pointer-events-none block h-[1.25rem] w-[1.25rem] rounded-full bg-background shadow-lg ring-0 transition-transform",
3651
+ "pointer-events-none block h-[1.25rem] w-[1.25rem] rounded-full bg-background shadow-lg ring-0 transition-transform duration-fast",
3640
3652
  isChecked ? "translate-x-[1.25rem]" : "translate-x-0"
3641
3653
  )
3642
3654
  }
@@ -3759,7 +3771,7 @@ var init_Stack = __esm({
3759
3771
  };
3760
3772
  const isHorizontal = direction === "horizontal";
3761
3773
  const directionClass = responsive && isHorizontal ? reverse ? "flex-col-reverse md:flex-row-reverse" : "flex-col md:flex-row" : isHorizontal ? reverse ? "flex-row-reverse" : "flex-row" : reverse ? "flex-col-reverse" : "flex-col";
3762
- return React73__default.createElement(
3774
+ return React74__default.createElement(
3763
3775
  Component,
3764
3776
  {
3765
3777
  className: cn(
@@ -3804,7 +3816,7 @@ var init_TextHighlight = __esm({
3804
3816
  hoverEvent
3805
3817
  }) => {
3806
3818
  const eventBus = useEventBus();
3807
- const baseStyles = "cursor-pointer transition-all duration-150";
3819
+ const baseStyles = "cursor-pointer transition-all duration-fast";
3808
3820
  const typeStyles = {
3809
3821
  question: cn(
3810
3822
  // Blue border for questions
@@ -3955,7 +3967,7 @@ var init_Typography = __esm({
3955
3967
  }) => {
3956
3968
  const variant = variantProp ?? (level ? `h${level}` : "body1");
3957
3969
  const Component = as || defaultElements[variant];
3958
- return React73__default.createElement(
3970
+ return React74__default.createElement(
3959
3971
  Component,
3960
3972
  {
3961
3973
  id,
@@ -4038,12 +4050,84 @@ var init_ThemeToggle = __esm({
4038
4050
  ThemeToggle.displayName = "ThemeToggle";
4039
4051
  }
4040
4052
  });
4053
+ function isMotionEnabled() {
4054
+ if (typeof document === "undefined") return true;
4055
+ if (motionEnabledCache !== null) return motionEnabledCache;
4056
+ const v = getComputedStyle(document.documentElement).getPropertyValue("--motion-enable").trim().toLowerCase();
4057
+ motionEnabledCache = v !== "off";
4058
+ return motionEnabledCache;
4059
+ }
4060
+ function usePresence(show, opts) {
4061
+ const { animation, animate = true, onExited } = opts;
4062
+ const [mounted, setMounted] = useState(show);
4063
+ const [exiting, setExiting] = useState(false);
4064
+ const prev = useRef(show);
4065
+ const onExitedRef = useRef(onExited);
4066
+ onExitedRef.current = onExited;
4067
+ const safeTimer = useRef(null);
4068
+ const clearSafe = useCallback(() => {
4069
+ if (safeTimer.current) {
4070
+ clearTimeout(safeTimer.current);
4071
+ safeTimer.current = null;
4072
+ }
4073
+ }, []);
4074
+ const finishExit = useCallback(() => {
4075
+ clearSafe();
4076
+ setExiting(false);
4077
+ setMounted(false);
4078
+ onExitedRef.current?.();
4079
+ }, [clearSafe]);
4080
+ useEffect(() => {
4081
+ const moving = animate && isMotionEnabled();
4082
+ if (show && !prev.current) {
4083
+ setExiting(false);
4084
+ setMounted(true);
4085
+ } else if (!show && prev.current) {
4086
+ if (moving) {
4087
+ setExiting(true);
4088
+ clearSafe();
4089
+ safeTimer.current = setTimeout(finishExit, SAFE_EXIT_MS);
4090
+ } else {
4091
+ setMounted(false);
4092
+ setExiting(false);
4093
+ }
4094
+ }
4095
+ prev.current = show;
4096
+ }, [show, animate, clearSafe, finishExit]);
4097
+ useEffect(() => () => clearSafe(), [clearSafe]);
4098
+ const disabled = !animate || !isMotionEnabled();
4099
+ const className = disabled ? "" : exiting ? `animate-${animation}-out` : `animate-${animation}-in`;
4100
+ const onAnimationEnd = useCallback(
4101
+ (e) => {
4102
+ if (e.target !== e.currentTarget) return;
4103
+ if (exiting) finishExit();
4104
+ },
4105
+ [exiting, finishExit]
4106
+ );
4107
+ return { mounted, exiting, className, onAnimationEnd };
4108
+ }
4109
+ var SAFE_EXIT_MS, motionEnabledCache, Presence;
4110
+ var init_Presence = __esm({
4111
+ "components/core/atoms/Presence.tsx"() {
4112
+ "use client";
4113
+ init_cn();
4114
+ SAFE_EXIT_MS = 1e3;
4115
+ motionEnabledCache = null;
4116
+ Presence = ({ show, className, children, ...opts }) => {
4117
+ const { mounted, className: animClass, onAnimationEnd } = usePresence(show, opts);
4118
+ if (!mounted) return null;
4119
+ return /* @__PURE__ */ jsx("div", { className: cn(animClass, className), onAnimationEnd, children });
4120
+ };
4121
+ Presence.displayName = "Presence";
4122
+ }
4123
+ });
4041
4124
  var Overlay;
4042
4125
  var init_Overlay = __esm({
4043
4126
  "components/core/atoms/Overlay.tsx"() {
4044
4127
  "use client";
4045
4128
  init_cn();
4046
4129
  init_useEventBus();
4130
+ init_Presence();
4047
4131
  Overlay = ({
4048
4132
  isVisible = true,
4049
4133
  onClick,
@@ -4052,7 +4136,8 @@ var init_Overlay = __esm({
4052
4136
  action
4053
4137
  }) => {
4054
4138
  const eventBus = useEventBus();
4055
- if (!isVisible) return null;
4139
+ const { mounted, className: animClass, onAnimationEnd } = usePresence(isVisible, { animation: "overlay" });
4140
+ if (!mounted) return null;
4056
4141
  const handleClick = (e) => {
4057
4142
  if (action) {
4058
4143
  eventBus.emit(`UI:${action}`, {});
@@ -4065,10 +4150,12 @@ var init_Overlay = __esm({
4065
4150
  className: cn(
4066
4151
  "fixed inset-0 z-40",
4067
4152
  blur && "backdrop-blur-sm",
4153
+ animClass,
4068
4154
  className
4069
4155
  ),
4070
4156
  style: { backgroundColor: "rgba(0, 0, 0, 0.6)" },
4071
4157
  onClick: action || onClick ? handleClick : void 0,
4158
+ onAnimationEnd,
4072
4159
  "aria-hidden": "true"
4073
4160
  }
4074
4161
  );
@@ -4114,7 +4201,7 @@ var Dialog;
4114
4201
  var init_Dialog = __esm({
4115
4202
  "components/core/atoms/Dialog.tsx"() {
4116
4203
  init_cn();
4117
- Dialog = React73__default.forwardRef(
4204
+ Dialog = React74__default.forwardRef(
4118
4205
  ({
4119
4206
  role = "dialog",
4120
4207
  "aria-modal": ariaModal = true,
@@ -4140,7 +4227,7 @@ var Aside;
4140
4227
  var init_Aside = __esm({
4141
4228
  "components/core/atoms/Aside.tsx"() {
4142
4229
  init_cn();
4143
- Aside = React73__default.forwardRef(
4230
+ Aside = React74__default.forwardRef(
4144
4231
  ({ className, children, ...rest }, ref) => /* @__PURE__ */ jsx("aside", { ref, className: cn(className), ...rest, children })
4145
4232
  );
4146
4233
  Aside.displayName = "Aside";
@@ -4219,9 +4306,9 @@ var init_LawReferenceTooltip = __esm({
4219
4306
  className
4220
4307
  }) => {
4221
4308
  const { t } = useTranslate();
4222
- const [isVisible, setIsVisible] = React73__default.useState(false);
4223
- const timeoutRef = React73__default.useRef(null);
4224
- const triggerRef = React73__default.useRef(null);
4309
+ const [isVisible, setIsVisible] = React74__default.useState(false);
4310
+ const timeoutRef = React74__default.useRef(null);
4311
+ const triggerRef = React74__default.useRef(null);
4225
4312
  const handleMouseEnter = () => {
4226
4313
  if (timeoutRef.current) clearTimeout(timeoutRef.current);
4227
4314
  timeoutRef.current = setTimeout(() => setIsVisible(true), 200);
@@ -4232,7 +4319,7 @@ var init_LawReferenceTooltip = __esm({
4232
4319
  };
4233
4320
  const { revealed, triggerProps } = useTapReveal({ refs: [triggerRef] });
4234
4321
  const open = isVisible || revealed;
4235
- React73__default.useEffect(() => {
4322
+ React74__default.useEffect(() => {
4236
4323
  return () => {
4237
4324
  if (timeoutRef.current) clearTimeout(timeoutRef.current);
4238
4325
  };
@@ -4442,7 +4529,7 @@ var init_StatusDot = __esm({
4442
4529
  md: "w-2.5 h-2.5",
4443
4530
  lg: "w-3 h-3"
4444
4531
  };
4445
- StatusDot = React73__default.forwardRef(
4532
+ StatusDot = React74__default.forwardRef(
4446
4533
  ({ className, status = "offline", pulse = false, size = "md", label, ...props }, ref) => {
4447
4534
  return /* @__PURE__ */ jsx(
4448
4535
  "span",
@@ -4496,7 +4583,7 @@ var init_TrendIndicator = __esm({
4496
4583
  down: "trending-down",
4497
4584
  flat: "arrow-right"
4498
4585
  };
4499
- TrendIndicator = React73__default.forwardRef(
4586
+ TrendIndicator = React74__default.forwardRef(
4500
4587
  ({
4501
4588
  className,
4502
4589
  value,
@@ -4563,7 +4650,7 @@ var init_RangeSlider = __esm({
4563
4650
  md: "w-4 h-4",
4564
4651
  lg: "w-5 h-5"
4565
4652
  };
4566
- RangeSlider = React73__default.forwardRef(
4653
+ RangeSlider = React74__default.forwardRef(
4567
4654
  ({
4568
4655
  className,
4569
4656
  min = 0,
@@ -4706,7 +4793,7 @@ var init_RangeSlider = __esm({
4706
4793
  "border-2 border-primary",
4707
4794
  "shadow-sm",
4708
4795
  "pointer-events-none",
4709
- "transition-transform duration-100",
4796
+ "transition-transform duration-instant",
4710
4797
  isDragging && "scale-[var(--hover-scale)]",
4711
4798
  thumbSizes[size]
4712
4799
  ),
@@ -4756,6 +4843,18 @@ var init_RangeSlider = __esm({
4756
4843
  function easeOut(t) {
4757
4844
  return t * (2 - t);
4758
4845
  }
4846
+ function formatDisplay(value, format, decimals) {
4847
+ switch (format) {
4848
+ case "currency":
4849
+ return `$${value.toFixed(2)}`;
4850
+ case "percent":
4851
+ return `${Math.round(value)}%`;
4852
+ case "number":
4853
+ return value.toLocaleString();
4854
+ default:
4855
+ return value.toFixed(decimals);
4856
+ }
4857
+ }
4759
4858
  var AnimatedCounter;
4760
4859
  var init_AnimatedCounter = __esm({
4761
4860
  "components/marketing/atoms/AnimatedCounter.tsx"() {
@@ -4767,6 +4866,7 @@ var init_AnimatedCounter = __esm({
4767
4866
  duration = 600,
4768
4867
  prefix,
4769
4868
  suffix,
4869
+ format,
4770
4870
  className
4771
4871
  }) => {
4772
4872
  const numericRaw = typeof rawValue === "number" ? rawValue : Number.parseFloat(String(rawValue ?? ""));
@@ -4782,6 +4882,10 @@ var init_AnimatedCounter = __esm({
4782
4882
  setDisplayValue(to);
4783
4883
  return;
4784
4884
  }
4885
+ if (window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) {
4886
+ setDisplayValue(to);
4887
+ return;
4888
+ }
4785
4889
  const startTime = performance.now();
4786
4890
  const diff = to - from;
4787
4891
  function animate(currentTime) {
@@ -4803,7 +4907,7 @@ var init_AnimatedCounter = __esm({
4803
4907
  };
4804
4908
  }, [value, duration]);
4805
4909
  const decimalPlaces = Number.isInteger(value) ? 0 : String(value).split(".")[1]?.length ?? 0;
4806
- const formattedValue = displayValue.toFixed(decimalPlaces);
4910
+ const formattedValue = formatDisplay(displayValue, format, decimalPlaces);
4807
4911
  return /* @__PURE__ */ jsxs(Typography, { variant: "h3", className: cn("tabular-nums", className), children: [
4808
4912
  prefix,
4809
4913
  formattedValue,
@@ -5157,7 +5261,7 @@ var init_ContentSection = __esm({
5157
5261
  md: "py-16",
5158
5262
  lg: "py-24"
5159
5263
  };
5160
- ContentSection = React73__default.forwardRef(
5264
+ ContentSection = React74__default.forwardRef(
5161
5265
  ({ children, background = "default", padding = "lg", id, className }, ref) => {
5162
5266
  return /* @__PURE__ */ jsx(
5163
5267
  Box,
@@ -5691,7 +5795,7 @@ var init_AnimatedReveal = __esm({
5691
5795
  "scale-up": { opacity: 1, transform: "scale(1) translateY(0)" },
5692
5796
  "none": {}
5693
5797
  };
5694
- AnimatedReveal = React73__default.forwardRef(
5798
+ AnimatedReveal = React74__default.forwardRef(
5695
5799
  ({
5696
5800
  trigger = "scroll",
5697
5801
  animation = "fade-up",
@@ -5851,7 +5955,7 @@ var init_AnimatedGraphic = __esm({
5851
5955
  "components/marketing/atoms/AnimatedGraphic.tsx"() {
5852
5956
  "use client";
5853
5957
  init_cn();
5854
- AnimatedGraphic = React73__default.forwardRef(
5958
+ AnimatedGraphic = React74__default.forwardRef(
5855
5959
  ({
5856
5960
  src,
5857
5961
  svgContent,
@@ -5874,7 +5978,7 @@ var init_AnimatedGraphic = __esm({
5874
5978
  const fetchedSvg = useFetchedSvg(svgContent ? void 0 : src);
5875
5979
  const resolvedSvg = svgContent ?? fetchedSvg;
5876
5980
  const prevAnimateRef = useRef(animate);
5877
- const setRef = React73__default.useCallback(
5981
+ const setRef = React74__default.useCallback(
5878
5982
  (node) => {
5879
5983
  containerRef.current = node;
5880
5984
  if (typeof ref === "function") ref(node);
@@ -6016,6 +6120,15 @@ var init_Modal = __esm({
6016
6120
  const [dragY, setDragY] = useState(0);
6017
6121
  const dragStartY = useRef(0);
6018
6122
  const isDragging = useRef(false);
6123
+ const [closing, setClosing] = useState(false);
6124
+ const wasOpenRef = useRef(isOpen);
6125
+ useEffect(() => {
6126
+ if (wasOpenRef.current && !isOpen) setClosing(true);
6127
+ wasOpenRef.current = isOpen;
6128
+ }, [isOpen]);
6129
+ const handleAnimEnd = (e) => {
6130
+ if (closing && e.target === e.currentTarget) setClosing(false);
6131
+ };
6019
6132
  useEffect(() => {
6020
6133
  if (isOpen) {
6021
6134
  previousActiveElement.current = document.activeElement;
@@ -6049,7 +6162,11 @@ var init_Modal = __esm({
6049
6162
  document.body.style.overflow = "";
6050
6163
  };
6051
6164
  }, [isOpen]);
6052
- if (!isOpen || typeof document === "undefined") return null;
6165
+ if (typeof document === "undefined") return null;
6166
+ const renderOpen = isOpen || closing;
6167
+ if (!renderOpen) return null;
6168
+ const dialogAnim = closing ? "animate-modal-out" : "animate-modal-in";
6169
+ const overlayAnim = closing ? "animate-overlay-out" : "animate-overlay-in";
6053
6170
  const handleClose = () => {
6054
6171
  if (closeEvent) eventBus.emit(`UI:${closeEvent}`, {});
6055
6172
  onClose();
@@ -6066,7 +6183,8 @@ var init_Modal = __esm({
6066
6183
  className: cn(
6067
6184
  "fixed inset-0 z-[1000]",
6068
6185
  "flex items-start justify-center px-4 pb-4 pt-[10vh]",
6069
- "max-sm:items-stretch max-sm:p-0 max-sm:pt-0"
6186
+ "max-sm:items-stretch max-sm:p-0 max-sm:pt-0",
6187
+ overlayAnim
6070
6188
  ),
6071
6189
  style: { backgroundColor: "rgba(0, 0, 0, 0.6)" },
6072
6190
  onClick: handleOverlayClick,
@@ -6094,8 +6212,10 @@ var init_Modal = __esm({
6094
6212
  // full height, no rounded corners, no min-width.
6095
6213
  "max-sm:max-w-none max-sm:max-h-none max-sm:w-full max-sm:h-full max-sm:rounded-none",
6096
6214
  lookStyles2[look],
6097
- className
6215
+ className,
6216
+ dialogAnim
6098
6217
  ),
6218
+ onAnimationEnd: handleAnimEnd,
6099
6219
  style: dragY > 0 ? {
6100
6220
  transform: `translateY(${dragY}px)`,
6101
6221
  transition: isDragging.current ? "none" : "transform 200ms ease-out"
@@ -6185,6 +6305,7 @@ var init_Drawer = __esm({
6185
6305
  init_Button();
6186
6306
  init_Typography();
6187
6307
  init_Overlay();
6308
+ init_Presence();
6188
6309
  init_cn();
6189
6310
  init_useEventBus();
6190
6311
  sizeWidths = {
@@ -6238,6 +6359,7 @@ var init_Drawer = __esm({
6238
6359
  document.addEventListener("keydown", handleEscape);
6239
6360
  return () => document.removeEventListener("keydown", handleEscape);
6240
6361
  }, [isOpen, closeOnEscape, onClose, closeEvent, eventBus]);
6362
+ const { mounted, className: drawerAnim, onAnimationEnd } = usePresence(isOpen, { animation: "drawer" });
6241
6363
  useEffect(() => {
6242
6364
  if (isOpen) {
6243
6365
  document.body.style.overflow = "hidden";
@@ -6248,7 +6370,7 @@ var init_Drawer = __esm({
6248
6370
  document.body.style.overflow = "";
6249
6371
  };
6250
6372
  }, [isOpen]);
6251
- if (!isOpen) return null;
6373
+ if (!mounted) return null;
6252
6374
  const handleClose = () => {
6253
6375
  if (closeEvent) eventBus.emit(`UI:${closeEvent}`, {});
6254
6376
  onClose();
@@ -6261,7 +6383,7 @@ var init_Drawer = __esm({
6261
6383
  const widthClass = width in sizeWidths ? sizeWidths[width] : "";
6262
6384
  const widthStyle = width in sizeWidths ? void 0 : { width };
6263
6385
  const positionClasses = position === "right" ? "right-0 border-l" : "left-0 border-r";
6264
- const animationClasses2 = position === "right" ? "animate-slide-in-right" : "animate-slide-in-left";
6386
+ const drawerSign = position === "right" ? 1 : -1;
6265
6387
  return /* @__PURE__ */ jsxs(Fragment, { children: [
6266
6388
  /* @__PURE__ */ jsx(
6267
6389
  Overlay,
@@ -6283,12 +6405,13 @@ var init_Drawer = __esm({
6283
6405
  "flex flex-col max-h-screen",
6284
6406
  positionClasses,
6285
6407
  widthClass,
6286
- animationClasses2,
6408
+ drawerAnim,
6287
6409
  className
6288
6410
  ),
6289
- style: widthStyle,
6411
+ style: { ...widthStyle, "--motion-drawer-sign": drawerSign },
6290
6412
  role: "dialog",
6291
6413
  "aria-modal": "true",
6414
+ onAnimationEnd,
6292
6415
  ...title && { "aria-labelledby": "drawer-title" },
6293
6416
  children: [
6294
6417
  (title || showCloseButton) && /* @__PURE__ */ jsxs(
@@ -6327,31 +6450,7 @@ var init_Drawer = __esm({
6327
6450
  )
6328
6451
  ]
6329
6452
  }
6330
- ),
6331
- /* @__PURE__ */ jsx("style", { children: `
6332
- @keyframes slide-in-right {
6333
- from {
6334
- transform: translateX(100%);
6335
- }
6336
- to {
6337
- transform: translateX(0);
6338
- }
6339
- }
6340
- @keyframes slide-in-left {
6341
- from {
6342
- transform: translateX(-100%);
6343
- }
6344
- to {
6345
- transform: translateX(0);
6346
- }
6347
- }
6348
- .animate-slide-in-right {
6349
- animation: slide-in-right 0.3s ease-out;
6350
- }
6351
- .animate-slide-in-left {
6352
- animation: slide-in-left 0.3s ease-out;
6353
- }
6354
- ` })
6453
+ )
6355
6454
  ] });
6356
6455
  };
6357
6456
  Drawer.displayName = "Drawer";
@@ -6402,14 +6501,23 @@ var init_Toast = __esm({
6402
6501
  }) => {
6403
6502
  const eventBus = useEventBus();
6404
6503
  const { t } = useTranslate();
6405
- const handleDismiss = () => {
6504
+ const [leaving, setLeaving] = useState(false);
6505
+ const doRealDismiss = () => {
6406
6506
  if (dismissEvent) eventBus.emit(`UI:${dismissEvent}`, {});
6407
6507
  onDismiss?.();
6408
6508
  };
6509
+ const handleDismiss = () => {
6510
+ if (leaving) return;
6511
+ setLeaving(true);
6512
+ };
6409
6513
  const handleAction = () => {
6410
6514
  if (actionEvent) eventBus.emit(`UI:${actionEvent}`, {});
6411
6515
  onAction?.();
6412
6516
  };
6517
+ const handleAnimEnd = (e) => {
6518
+ if (e.target !== e.currentTarget) return;
6519
+ if (leaving) doRealDismiss();
6520
+ };
6413
6521
  useEffect(() => {
6414
6522
  if (duration <= 0 || !onDismiss && !dismissEvent) {
6415
6523
  return;
@@ -6428,10 +6536,12 @@ var init_Toast = __esm({
6428
6536
  // edge. `max-w-[calc(100vw-2rem)]` clamps to viewport too.
6429
6537
  "border-l-4 p-4 shadow-elevation-toast min-w-0 sm:min-w-[300px] max-w-md max-w-[calc(100vw-2rem)]",
6430
6538
  "rounded-sm",
6539
+ leaving ? "animate-toast-out" : "animate-toast-in",
6431
6540
  variantClasses[variant],
6432
6541
  className
6433
6542
  ),
6434
6543
  role: "alert",
6544
+ onAnimationEnd: handleAnimEnd,
6435
6545
  children: /* @__PURE__ */ jsxs(Box, { className: "flex items-start gap-3", children: [
6436
6546
  /* @__PURE__ */ jsx(Box, { className: "flex-shrink-0 mt-0.5", children: /* @__PURE__ */ jsx(
6437
6547
  Icon,
@@ -6547,7 +6657,7 @@ var init_ErrorBoundary = __esm({
6547
6657
  }
6548
6658
  );
6549
6659
  };
6550
- ErrorBoundary = class extends React73__default.Component {
6660
+ ErrorBoundary = class extends React74__default.Component {
6551
6661
  constructor(props) {
6552
6662
  super(props);
6553
6663
  __publicField(this, "reset", () => {
@@ -6828,7 +6938,7 @@ var init_Container = __esm({
6828
6938
  as: Component = "div"
6829
6939
  }) => {
6830
6940
  const resolvedSize = maxWidth ?? size ?? "lg";
6831
- return React73__default.createElement(
6941
+ return React74__default.createElement(
6832
6942
  Component,
6833
6943
  {
6834
6944
  className: cn(
@@ -9732,7 +9842,8 @@ var init_LoadingState = __esm({
9732
9842
  LoadingState = ({
9733
9843
  title,
9734
9844
  message,
9735
- className
9845
+ className,
9846
+ fullPage = false
9736
9847
  }) => {
9737
9848
  const { t } = useTranslate();
9738
9849
  const displayMessage = message ?? t("common.loading");
@@ -9741,7 +9852,8 @@ var init_LoadingState = __esm({
9741
9852
  {
9742
9853
  align: "center",
9743
9854
  className: cn(
9744
- "justify-center py-12",
9855
+ "justify-center",
9856
+ fullPage ? "fixed inset-0 z-[1000] py-12 bg-background/80 backdrop-blur-sm animate-overlay-in" : "py-12",
9745
9857
  className
9746
9858
  ),
9747
9859
  children: [
@@ -10049,7 +10161,7 @@ var init_CodeBlock = __esm({
10049
10161
  DIFF_STYLE_FALLBACK = { bg: "", prefix: " ", text: "text-foreground" };
10050
10162
  LINE_PROPS_FN = (n) => ({ "data-line": String(n - 1) });
10051
10163
  HIDDEN_LINE_NUMBERS = { display: "none" };
10052
- CodeBlock = React73__default.memo(
10164
+ CodeBlock = React74__default.memo(
10053
10165
  ({
10054
10166
  code: rawCode,
10055
10167
  language = "text",
@@ -10636,7 +10748,7 @@ var init_MarkdownContent = __esm({
10636
10748
  init_Box();
10637
10749
  init_CodeBlock();
10638
10750
  init_cn();
10639
- MarkdownContent = React73__default.memo(
10751
+ MarkdownContent = React74__default.memo(
10640
10752
  ({ content, direction = "ltr", className }) => {
10641
10753
  const { t: _t } = useTranslate();
10642
10754
  const safeContent = typeof content === "string" ? content : String(content ?? "");
@@ -11599,7 +11711,7 @@ var init_StateMachineView = __esm({
11599
11711
  Box,
11600
11712
  {
11601
11713
  className: cn(
11602
- "fixed z-50 animate-in fade-in-0 zoom-in-95 duration-150",
11714
+ "fixed z-50 animate-in fade-in-0 zoom-in-95 duration-fast",
11603
11715
  tooltip.pinned ? "pointer-events-auto" : "pointer-events-none"
11604
11716
  ),
11605
11717
  style: {
@@ -11963,7 +12075,7 @@ var init_StateMachineView = __esm({
11963
12075
  style: { top: title ? 30 : 0 },
11964
12076
  children: [
11965
12077
  entity && /* @__PURE__ */ jsx(EntityBox, { entity, config }),
11966
- states.map((state) => renderStateNode ? /* @__PURE__ */ jsx(React73__default.Fragment, { children: renderStateNode(state, config) }, state.id) : /* @__PURE__ */ jsx(
12078
+ states.map((state) => renderStateNode ? /* @__PURE__ */ jsx(React74__default.Fragment, { children: renderStateNode(state, config) }, state.id) : /* @__PURE__ */ jsx(
11967
12079
  StateNode,
11968
12080
  {
11969
12081
  state,
@@ -12943,7 +13055,7 @@ var init_BookCoverPage = __esm({
12943
13055
  size: "lg",
12944
13056
  action: "BOOK_START",
12945
13057
  className: "mt-8",
12946
- children: /* @__PURE__ */ jsx(Typography, { variant: "body", children: t("book.startReading") })
13058
+ children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "inherit", children: t("book.startReading") })
12947
13059
  }
12948
13060
  )
12949
13061
  ]
@@ -14002,6 +14114,129 @@ var init_Breadcrumb = __esm({
14002
14114
  Breadcrumb.displayName = "Breadcrumb";
14003
14115
  }
14004
14116
  });
14117
+ function useSafeEventBus2() {
14118
+ try {
14119
+ return useEventBus();
14120
+ } catch {
14121
+ return { emit: () => {
14122
+ }, on: () => () => {
14123
+ }, once: () => {
14124
+ } };
14125
+ }
14126
+ }
14127
+ var log5, lookStyles4, ButtonGroup;
14128
+ var init_ButtonGroup = __esm({
14129
+ "components/core/molecules/ButtonGroup.tsx"() {
14130
+ "use client";
14131
+ init_cn();
14132
+ init_atoms();
14133
+ init_useEventBus();
14134
+ log5 = createLogger("almadar:ui:button-group");
14135
+ lookStyles4 = {
14136
+ "right-aligned-buttons": "",
14137
+ "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
14138
+ "inline-row": "gap-2 inline-flex",
14139
+ "dropdown-menu": "[&>button:not(:first-child)]:hidden",
14140
+ "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
14141
+ };
14142
+ ButtonGroup = ({
14143
+ children,
14144
+ primary,
14145
+ secondary,
14146
+ variant = "default",
14147
+ orientation = "horizontal",
14148
+ className,
14149
+ // Filter-group pattern props (entity and filters are used for schema-driven filtering)
14150
+ entity: _entity,
14151
+ filters,
14152
+ look = "right-aligned-buttons"
14153
+ }) => {
14154
+ const eventBus = useSafeEventBus2();
14155
+ const variantClasses2 = {
14156
+ default: "gap-0",
14157
+ segmented: "gap-0 [&>button]:rounded-none [&>button:first-child]:rounded-l-lg [&>button:last-child]:rounded-r-lg [&>button:not(:first-child)]:border-l-0",
14158
+ toggle: "gap-0 [&>button]:rounded-none [&>button:first-child]:rounded-l-lg [&>button:last-child]:rounded-r-lg [&>button:not(:first-child)]:border-l-0"
14159
+ };
14160
+ const orientationClasses = {
14161
+ horizontal: "flex-row",
14162
+ vertical: "flex-col [&>button:first-child]:rounded-t-lg [&>button:last-child]:rounded-b-lg [&>button:not(:first-child)]:border-t-0 [&>button:not(:first-child)]:border-l"
14163
+ };
14164
+ const handleActionClick = (action) => {
14165
+ if (action.event) {
14166
+ eventBus.emit("UI:DISPATCH", { event: action.event });
14167
+ }
14168
+ if (action.navigatesTo) {
14169
+ eventBus.emit("UI:NAVIGATE", { url: action.navigatesTo });
14170
+ }
14171
+ };
14172
+ const renderFormActions = () => {
14173
+ const buttons = [];
14174
+ if (secondary) {
14175
+ secondary.forEach((action, index) => {
14176
+ buttons.push(
14177
+ /* @__PURE__ */ jsx(
14178
+ Button,
14179
+ {
14180
+ type: action.actionType === "submit" ? "submit" : "button",
14181
+ variant: action.variant || "ghost",
14182
+ onClick: () => handleActionClick(action),
14183
+ children: action.label
14184
+ },
14185
+ `secondary-${index}`
14186
+ )
14187
+ );
14188
+ });
14189
+ }
14190
+ if (primary) {
14191
+ const isSubmit = primary.actionType === "submit";
14192
+ buttons.push(
14193
+ /* @__PURE__ */ jsx(
14194
+ Button,
14195
+ {
14196
+ type: isSubmit ? "submit" : "button",
14197
+ variant: primary.variant || "primary",
14198
+ onClick: () => handleActionClick(primary),
14199
+ "data-testid": isSubmit ? "form-submit" : void 0,
14200
+ children: primary.label
14201
+ },
14202
+ "primary"
14203
+ )
14204
+ );
14205
+ }
14206
+ return buttons;
14207
+ };
14208
+ const renderFilters = () => {
14209
+ if (!filters || filters.length === 0) return null;
14210
+ return filters.map((filter, index) => /* @__PURE__ */ jsx(
14211
+ Button,
14212
+ {
14213
+ variant: "ghost",
14214
+ onClick: () => {
14215
+ log5.debug("Filter clicked", { field: filter.field });
14216
+ },
14217
+ children: filter.label
14218
+ },
14219
+ `filter-${filter.field}-${index}`
14220
+ ));
14221
+ };
14222
+ return /* @__PURE__ */ jsx(
14223
+ "div",
14224
+ {
14225
+ className: cn(
14226
+ "inline-flex gap-2",
14227
+ variantClasses2[variant],
14228
+ orientationClasses[orientation],
14229
+ lookStyles4[look],
14230
+ className
14231
+ ),
14232
+ role: "group",
14233
+ children: children || renderFilters() || renderFormActions()
14234
+ }
14235
+ );
14236
+ };
14237
+ ButtonGroup.displayName = "ButtonGroup";
14238
+ }
14239
+ });
14005
14240
  function useSwipeGesture(callbacks, options = {}) {
14006
14241
  const { threshold = 50, velocityThreshold = 0.3, preventDefault = false } = options;
14007
14242
  const startX = useRef(0);
@@ -14372,8 +14607,8 @@ function MiniMap({
14372
14607
  tileAssets,
14373
14608
  unitAssets
14374
14609
  }) {
14375
- const canvasRef = React73.useRef(null);
14376
- const imgCacheRef = React73.useRef(/* @__PURE__ */ new Map());
14610
+ const canvasRef = React74.useRef(null);
14611
+ const imgCacheRef = React74.useRef(/* @__PURE__ */ new Map());
14377
14612
  function loadImg(url) {
14378
14613
  const cached = imgCacheRef.current.get(url);
14379
14614
  if (cached) return cached.complete ? cached : null;
@@ -14388,7 +14623,7 @@ function MiniMap({
14388
14623
  imgCacheRef.current.set(url, img);
14389
14624
  return null;
14390
14625
  }
14391
- React73.useEffect(() => {
14626
+ React74.useEffect(() => {
14392
14627
  const canvas = canvasRef.current;
14393
14628
  if (!canvas) return;
14394
14629
  const ctx = canvas.getContext("2d");
@@ -14563,7 +14798,7 @@ function getTraitSnapshots() {
14563
14798
  try {
14564
14799
  snapshots.push(getter());
14565
14800
  } catch (err) {
14566
- log5.error("traitSnapshot getter failed", { trait: traitName, err: String(err) });
14801
+ log6.error("traitSnapshot getter failed", { trait: traitName, err: String(err) });
14567
14802
  }
14568
14803
  }
14569
14804
  return snapshots;
@@ -14648,10 +14883,10 @@ function updateAssetStatus(url, status) {
14648
14883
  window.__orbitalVerification.assetStatus[url] = status;
14649
14884
  }
14650
14885
  }
14651
- var log5;
14886
+ var log6;
14652
14887
  var init_verificationRegistry = __esm({
14653
14888
  "lib/verificationRegistry.ts"() {
14654
- log5 = createLogger("almadar:bridge");
14889
+ log6 = createLogger("almadar:bridge");
14655
14890
  exposeOnWindow();
14656
14891
  }
14657
14892
  });
@@ -15726,6 +15961,10 @@ function Canvas2D({
15726
15961
  window.removeEventListener("keyup", onUp);
15727
15962
  };
15728
15963
  }, [keyMap, keyUpMap, eventBus]);
15964
+ useEffect(() => {
15965
+ if (!keyMap && !keyUpMap) return;
15966
+ canvasRef.current?.focus();
15967
+ }, [keyMap, keyUpMap]);
15729
15968
  if (error) {
15730
15969
  return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center justify-center w-full h-full bg-[var(--color-card)] rounded-container", className), children: /* @__PURE__ */ jsxs(Stack, { direction: "vertical", gap: "md", align: "center", children: [
15731
15970
  /* @__PURE__ */ jsx(Icon, { name: "alert-circle", size: "xl" }),
@@ -15774,7 +16013,7 @@ function Canvas2D({
15774
16013
  onWheel: gestureHandlers.onWheel,
15775
16014
  onContextMenu: (e) => e.preventDefault(),
15776
16015
  className: "cursor-pointer touch-none",
15777
- tabIndex: isFree ? 0 : void 0,
16016
+ tabIndex: isFree || keyMap || keyUpMap ? 0 : void 0,
15778
16017
  style: {
15779
16018
  width: viewportSize.width,
15780
16019
  height: viewportSize.height
@@ -16396,7 +16635,7 @@ var init_CardGrid = __esm({
16396
16635
  CardGrid.displayName = "CardGrid";
16397
16636
  }
16398
16637
  });
16399
- function useSafeEventBus2() {
16638
+ function useSafeEventBus3() {
16400
16639
  try {
16401
16640
  return useEventBus();
16402
16641
  } catch {
@@ -16432,7 +16671,7 @@ var init_Carousel = __esm({
16432
16671
  const [activeIndex, setActiveIndex] = useState(0);
16433
16672
  const scrollRef = useRef(null);
16434
16673
  const autoPlayRef = useRef(null);
16435
- const eventBus = useSafeEventBus2();
16674
+ const eventBus = useSafeEventBus3();
16436
16675
  const { t } = useTranslate();
16437
16676
  const safeItems = items ?? [];
16438
16677
  const totalSlides = safeItems.length;
@@ -16794,7 +17033,7 @@ var init_Chart = __esm({
16794
17033
  return /* @__PURE__ */ jsx(
16795
17034
  Box,
16796
17035
  {
16797
- className: "h-full rounded-r-sm transition-all duration-500 ease-out min-w-[2px] cursor-pointer hover:opacity-80",
17036
+ className: "h-full rounded-r-sm transition-all duration-slow ease-standard min-w-[2px] cursor-pointer hover:opacity-80",
16798
17037
  style: {
16799
17038
  width: `${ratio}%`,
16800
17039
  backgroundColor: color
@@ -16840,8 +17079,9 @@ var init_Chart = __esm({
16840
17079
  align: "center",
16841
17080
  flex: true,
16842
17081
  className: "min-w-0",
17082
+ style: { height: "100%" },
16843
17083
  children: [
16844
- /* @__PURE__ */ jsx(HStack, { gap: histogram ? "none" : "xs", align: "end", className: "w-full", style: { height: "100%" }, children: series.map((s, sIdx) => {
17084
+ /* @__PURE__ */ jsx(HStack, { gap: histogram ? "none" : "xs", align: "end", justify: histogram ? void 0 : "center", className: "w-full flex-1 min-h-0", children: series.map((s, sIdx) => {
16845
17085
  const value = valueAt(s, label);
16846
17086
  const barHeight = value / maxValue * 100;
16847
17087
  const color = seriesColor(s, sIdx);
@@ -16849,11 +17089,13 @@ var init_Chart = __esm({
16849
17089
  Box,
16850
17090
  {
16851
17091
  className: cn(
16852
- "rounded-t-sm transition-all duration-500 ease-out min-h-[4px] cursor-pointer hover:opacity-80",
17092
+ "rounded-t-sm transition-all duration-slow ease-standard min-h-[4px] cursor-pointer hover:opacity-80",
16853
17093
  histogram ? "flex-1 mx-0" : "flex-1"
16854
17094
  ),
16855
17095
  style: {
16856
17096
  height: `${barHeight}%`,
17097
+ // Cap width so a lone category doesn't paint the whole plot as one solid block; narrow columns are unaffected (flex-1 binds first).
17098
+ ...!histogram && { maxWidth: 72 },
16857
17099
  backgroundColor: color
16858
17100
  },
16859
17101
  onClick: () => onPointClick?.(
@@ -16888,15 +17130,16 @@ var init_Chart = __esm({
16888
17130
  align: "center",
16889
17131
  flex: true,
16890
17132
  className: "min-w-0",
17133
+ style: { height: "100%" },
16891
17134
  children: [
16892
- /* @__PURE__ */ jsx(VStack, { gap: "none", className: "w-full", style: { height: "100%" }, justify: "end", children: series.map((s, sIdx) => {
17135
+ /* @__PURE__ */ jsx(VStack, { gap: "none", className: "w-full flex-1 min-h-0", justify: "end", children: series.map((s, sIdx) => {
16893
17136
  const value = valueAt(s, label);
16894
17137
  const ratio = stack === "normalize" ? total === 0 ? 0 : value / total * 100 : value / maxValue * 100;
16895
17138
  const color = seriesColor(s, sIdx);
16896
17139
  return /* @__PURE__ */ jsx(
16897
17140
  Box,
16898
17141
  {
16899
- className: "w-full transition-all duration-500 ease-out cursor-pointer hover:opacity-80",
17142
+ className: "w-full transition-all duration-slow ease-standard cursor-pointer hover:opacity-80",
16900
17143
  style: {
16901
17144
  height: `${ratio}%`,
16902
17145
  backgroundColor: color
@@ -16934,6 +17177,7 @@ var init_Chart = __esm({
16934
17177
  const innerRadius = donut ? radius * 0.6 : 0;
16935
17178
  const center = size / 2;
16936
17179
  const segments = useMemo(() => {
17180
+ if (!Number.isFinite(total) || total <= 0) return [];
16937
17181
  let currentAngle = -Math.PI / 2;
16938
17182
  return data.map((point, idx) => {
16939
17183
  const angle = point.value / total * 2 * Math.PI;
@@ -16945,13 +17189,25 @@ var init_Chart = __esm({
16945
17189
  const y1 = center + radius * Math.sin(startAngle);
16946
17190
  const x2 = center + radius * Math.cos(endAngle);
16947
17191
  const y2 = center + radius * Math.sin(endAngle);
17192
+ const fullCircle = angle >= 2 * Math.PI - 1e-9;
17193
+ const midAngle = startAngle + angle / 2;
17194
+ const xm = center + radius * Math.cos(midAngle);
17195
+ const ym = center + radius * Math.sin(midAngle);
16948
17196
  let d;
16949
17197
  if (innerRadius > 0) {
16950
17198
  const ix1 = center + innerRadius * Math.cos(startAngle);
16951
17199
  const iy1 = center + innerRadius * Math.sin(startAngle);
16952
17200
  const ix2 = center + innerRadius * Math.cos(endAngle);
16953
17201
  const iy2 = center + innerRadius * Math.sin(endAngle);
16954
- d = `M ${ix1} ${iy1} L ${x1} ${y1} A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2} L ${ix2} ${iy2} A ${innerRadius} ${innerRadius} 0 ${largeArc} 0 ${ix1} ${iy1} Z`;
17202
+ if (fullCircle) {
17203
+ const ixm = center + innerRadius * Math.cos(midAngle);
17204
+ const iym = center + innerRadius * Math.sin(midAngle);
17205
+ d = `M ${ix1} ${iy1} L ${x1} ${y1} A ${radius} ${radius} 0 1 1 ${xm} ${ym} A ${radius} ${radius} 0 1 1 ${x2} ${y2} L ${ix2} ${iy2} A ${innerRadius} ${innerRadius} 0 1 0 ${ixm} ${iym} A ${innerRadius} ${innerRadius} 0 1 0 ${ix1} ${iy1} Z`;
17206
+ } else {
17207
+ d = `M ${ix1} ${iy1} L ${x1} ${y1} A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2} L ${ix2} ${iy2} A ${innerRadius} ${innerRadius} 0 ${largeArc} 0 ${ix1} ${iy1} Z`;
17208
+ }
17209
+ } else if (fullCircle) {
17210
+ d = `M ${center} ${center} L ${x1} ${y1} A ${radius} ${radius} 0 1 1 ${xm} ${ym} A ${radius} ${radius} 0 1 1 ${x2} ${y2} Z`;
16955
17211
  } else {
16956
17212
  d = `M ${center} ${center} L ${x1} ${y1} A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2} Z`;
16957
17213
  }
@@ -16973,7 +17229,7 @@ var init_Chart = __esm({
16973
17229
  fill: seg.color,
16974
17230
  stroke: "var(--color-card)",
16975
17231
  strokeWidth: "2",
16976
- className: "transition-opacity duration-200 hover:opacity-80 cursor-pointer",
17232
+ className: "transition-opacity duration-fast hover:opacity-80 cursor-pointer",
16977
17233
  onClick: () => onPointClick?.(
16978
17234
  { label: seg.label, value: seg.value, color: seg.color },
16979
17235
  "default"
@@ -18227,9 +18483,9 @@ function ControlButton({
18227
18483
  className
18228
18484
  }) {
18229
18485
  const eventBus = useEventBus();
18230
- const [isPressed, setIsPressed] = React73.useState(false);
18486
+ const [isPressed, setIsPressed] = React74.useState(false);
18231
18487
  const actualPressed = pressed ?? isPressed;
18232
- const handlePointerDown = React73.useCallback(
18488
+ const handlePointerDown = React74.useCallback(
18233
18489
  (e) => {
18234
18490
  e.preventDefault();
18235
18491
  if (disabled) return;
@@ -18239,7 +18495,7 @@ function ControlButton({
18239
18495
  },
18240
18496
  [disabled, pressEvent, eventBus, onPress]
18241
18497
  );
18242
- const handlePointerUp = React73.useCallback(
18498
+ const handlePointerUp = React74.useCallback(
18243
18499
  (e) => {
18244
18500
  e.preventDefault();
18245
18501
  if (disabled) return;
@@ -18249,7 +18505,7 @@ function ControlButton({
18249
18505
  },
18250
18506
  [disabled, releaseEvent, eventBus, onRelease]
18251
18507
  );
18252
- const handlePointerLeave = React73.useCallback(
18508
+ const handlePointerLeave = React74.useCallback(
18253
18509
  (e) => {
18254
18510
  if (isPressed) {
18255
18511
  setIsPressed(false);
@@ -18337,8 +18593,8 @@ function ControlGrid({
18337
18593
  className
18338
18594
  }) {
18339
18595
  const eventBus = useEventBus();
18340
- const [active, setActive] = React73.useState(/* @__PURE__ */ new Set());
18341
- const handlePress = React73.useCallback(
18596
+ const [active, setActive] = React74.useState(/* @__PURE__ */ new Set());
18597
+ const handlePress = React74.useCallback(
18342
18598
  (id) => {
18343
18599
  setActive((prev) => new Set(prev).add(id));
18344
18600
  if (actionEvent) eventBus.emit(`UI:${actionEvent}`, { id, pressed: true });
@@ -18352,7 +18608,7 @@ function ControlGrid({
18352
18608
  },
18353
18609
  [kind, actionEvent, directionEvent, directionEvents, eventBus, onAction, onDirection]
18354
18610
  );
18355
- const handleRelease = React73.useCallback(
18611
+ const handleRelease = React74.useCallback(
18356
18612
  (id) => {
18357
18613
  setActive((prev) => {
18358
18614
  const next = new Set(prev);
@@ -19559,8 +19815,8 @@ var init_Menu = __esm({
19559
19815
  "bottom-end": "bottom-start"
19560
19816
  };
19561
19817
  const effectivePosition = direction === "rtl" ? rtlMirror[position] ?? position : position;
19562
- const triggerChild = React73__default.isValidElement(trigger) ? trigger : /* @__PURE__ */ jsx(Typography, { variant: "small", as: "span", children: trigger });
19563
- const triggerElement = React73__default.cloneElement(
19818
+ const triggerChild = React74__default.isValidElement(trigger) ? trigger : /* @__PURE__ */ jsx(Typography, { variant: "small", as: "span", children: trigger });
19819
+ const triggerElement = React74__default.cloneElement(
19564
19820
  triggerChild,
19565
19821
  {
19566
19822
  ref: triggerRef,
@@ -19655,14 +19911,14 @@ function useDataDnd(args) {
19655
19911
  const isZone = Boolean(dragGroup || accepts || sortable);
19656
19912
  const enabled = isZone || Boolean(dndRoot);
19657
19913
  const eventBus = useEventBus();
19658
- const parentRoot = React73__default.useContext(RootCtx);
19914
+ const parentRoot = React74__default.useContext(RootCtx);
19659
19915
  const isRoot = enabled && parentRoot === null;
19660
- const zoneId = React73__default.useId();
19916
+ const zoneId = React74__default.useId();
19661
19917
  const ownGroup = dragGroup ?? accepts ?? zoneId;
19662
- const [optimisticOrders, setOptimisticOrders] = React73__default.useState(() => /* @__PURE__ */ new Map());
19663
- const optimisticOrdersRef = React73__default.useRef(optimisticOrders);
19918
+ const [optimisticOrders, setOptimisticOrders] = React74__default.useState(() => /* @__PURE__ */ new Map());
19919
+ const optimisticOrdersRef = React74__default.useRef(optimisticOrders);
19664
19920
  optimisticOrdersRef.current = optimisticOrders;
19665
- const clearOptimisticOrder = React73__default.useCallback((group) => {
19921
+ const clearOptimisticOrder = React74__default.useCallback((group) => {
19666
19922
  setOptimisticOrders((prev) => {
19667
19923
  if (!prev.has(group)) return prev;
19668
19924
  const next = new Map(prev);
@@ -19687,7 +19943,7 @@ function useDataDnd(args) {
19687
19943
  const raw = it[dndItemIdField];
19688
19944
  return raw != null ? String(raw) : `__idx_${idx}`;
19689
19945
  }).join("|");
19690
- const itemIds = React73__default.useMemo(
19946
+ const itemIds = React74__default.useMemo(
19691
19947
  () => orderedItems.map((it, idx) => {
19692
19948
  const raw = it[dndItemIdField];
19693
19949
  return raw != null ? String(raw) : `__idx_${idx}`;
@@ -19698,7 +19954,7 @@ function useDataDnd(args) {
19698
19954
  const raw = it[dndItemIdField];
19699
19955
  return raw != null ? String(raw) : `__${idx}`;
19700
19956
  }).join("|");
19701
- React73__default.useEffect(() => {
19957
+ React74__default.useEffect(() => {
19702
19958
  const root = isRoot ? null : parentRoot;
19703
19959
  if (root) {
19704
19960
  root.clearOptimisticOrder(ownGroup);
@@ -19706,20 +19962,20 @@ function useDataDnd(args) {
19706
19962
  clearOptimisticOrder(ownGroup);
19707
19963
  }
19708
19964
  }, [itemsContentSig, ownGroup]);
19709
- const zonesRef = React73__default.useRef(/* @__PURE__ */ new Map());
19710
- const registerZone = React73__default.useCallback((zoneId2, meta2) => {
19965
+ const zonesRef = React74__default.useRef(/* @__PURE__ */ new Map());
19966
+ const registerZone = React74__default.useCallback((zoneId2, meta2) => {
19711
19967
  zonesRef.current.set(zoneId2, meta2);
19712
19968
  }, []);
19713
- const unregisterZone = React73__default.useCallback((zoneId2) => {
19969
+ const unregisterZone = React74__default.useCallback((zoneId2) => {
19714
19970
  zonesRef.current.delete(zoneId2);
19715
19971
  }, []);
19716
- const [activeDrag, setActiveDrag] = React73__default.useState(null);
19717
- const [overZoneGroup, setOverZoneGroup] = React73__default.useState(null);
19718
- const meta = React73__default.useMemo(
19972
+ const [activeDrag, setActiveDrag] = React74__default.useState(null);
19973
+ const [overZoneGroup, setOverZoneGroup] = React74__default.useState(null);
19974
+ const meta = React74__default.useMemo(
19719
19975
  () => ({ group: ownGroup, dropEvent, reorderEvent, positionEvent, itemIds, rawItems: items, idField: dndItemIdField }),
19720
19976
  [ownGroup, dropEvent, reorderEvent, positionEvent, itemIds, items, dndItemIdField]
19721
19977
  );
19722
- React73__default.useEffect(() => {
19978
+ React74__default.useEffect(() => {
19723
19979
  const target = isRoot ? null : parentRoot;
19724
19980
  if (!target) {
19725
19981
  zonesRef.current.set(zoneId, meta);
@@ -19738,7 +19994,7 @@ function useDataDnd(args) {
19738
19994
  }, [parentRoot, isRoot, zoneId, meta]);
19739
19995
  const sensors = useAlmadarDndSensors(true);
19740
19996
  const collisionDetection = almadarDndCollisionDetection;
19741
- const findZoneByItem = React73__default.useCallback(
19997
+ const findZoneByItem = React74__default.useCallback(
19742
19998
  (id) => {
19743
19999
  for (const z of zonesRef.current.values()) {
19744
20000
  if (z.itemIds.includes(id)) return z;
@@ -19747,7 +20003,7 @@ function useDataDnd(args) {
19747
20003
  },
19748
20004
  []
19749
20005
  );
19750
- React73__default.useCallback(
20006
+ React74__default.useCallback(
19751
20007
  (group) => {
19752
20008
  for (const z of zonesRef.current.values()) {
19753
20009
  if (z.group === group) return z;
@@ -19756,7 +20012,7 @@ function useDataDnd(args) {
19756
20012
  },
19757
20013
  []
19758
20014
  );
19759
- const handleDragEnd = React73__default.useCallback(
20015
+ const handleDragEnd = React74__default.useCallback(
19760
20016
  (event) => {
19761
20017
  const { active, over } = event;
19762
20018
  const activeIdStr = String(active.id);
@@ -19847,8 +20103,8 @@ function useDataDnd(args) {
19847
20103
  },
19848
20104
  [eventBus]
19849
20105
  );
19850
- const sortableData = React73__default.useMemo(() => ({ dndGroup: ownGroup }), [ownGroup]);
19851
- const SortableItem = React73__default.useCallback(
20106
+ const sortableData = React74__default.useMemo(() => ({ dndGroup: ownGroup }), [ownGroup]);
20107
+ const SortableItem = React74__default.useCallback(
19852
20108
  ({ id, children }) => {
19853
20109
  const {
19854
20110
  attributes,
@@ -19888,7 +20144,7 @@ function useDataDnd(args) {
19888
20144
  id: droppableId,
19889
20145
  data: sortableData
19890
20146
  });
19891
- const ctx = React73__default.useContext(RootCtx);
20147
+ const ctx = React74__default.useContext(RootCtx);
19892
20148
  const activeDrag2 = ctx?.activeDrag ?? null;
19893
20149
  const overZoneGroup2 = ctx?.overZoneGroup ?? null;
19894
20150
  const isThisZoneOver = overZoneGroup2 === ownGroup;
@@ -19903,7 +20159,7 @@ function useDataDnd(args) {
19903
20159
  showForeignPlaceholder,
19904
20160
  ctxAvailable: ctx != null
19905
20161
  });
19906
- React73__default.useEffect(() => {
20162
+ React74__default.useEffect(() => {
19907
20163
  dndLog.info("dropzone:isOver:change", { droppableId, group: ownGroup, isOver, isThisZoneOver, showForeignPlaceholder, activeDragSourceGroup: activeDrag2?.sourceGroup ?? null });
19908
20164
  }, [droppableId, isOver, isThisZoneOver, showForeignPlaceholder]);
19909
20165
  return /* @__PURE__ */ jsx(
@@ -19917,11 +20173,11 @@ function useDataDnd(args) {
19917
20173
  }
19918
20174
  );
19919
20175
  };
19920
- const rootContextValue = React73__default.useMemo(
20176
+ const rootContextValue = React74__default.useMemo(
19921
20177
  () => ({ registerZone, unregisterZone, activeDrag, overZoneGroup, optimisticOrders, clearOptimisticOrder }),
19922
20178
  [registerZone, unregisterZone, activeDrag, overZoneGroup, optimisticOrders, clearOptimisticOrder]
19923
20179
  );
19924
- const handleDragStart = React73__default.useCallback((event) => {
20180
+ const handleDragStart = React74__default.useCallback((event) => {
19925
20181
  const sourceZone = findZoneByItem(event.active.id);
19926
20182
  const rect = event.active.rect.current.initial;
19927
20183
  const height = rect?.height && rect.height > 0 ? rect.height : 64;
@@ -19940,7 +20196,7 @@ function useDataDnd(args) {
19940
20196
  isRoot
19941
20197
  });
19942
20198
  }, [findZoneByItem, isRoot, zoneId]);
19943
- const handleDragOver = React73__default.useCallback((event) => {
20199
+ const handleDragOver = React74__default.useCallback((event) => {
19944
20200
  const { active, over } = event;
19945
20201
  const overData = over?.data?.current;
19946
20202
  const overGroup = overData?.dndGroup ?? null;
@@ -20010,7 +20266,7 @@ function useDataDnd(args) {
20010
20266
  return next;
20011
20267
  });
20012
20268
  }, []);
20013
- const handleDragCancel = React73__default.useCallback((event) => {
20269
+ const handleDragCancel = React74__default.useCallback((event) => {
20014
20270
  setActiveDrag(null);
20015
20271
  setOverZoneGroup(null);
20016
20272
  dndLog.warn("dragCancel", {
@@ -20018,12 +20274,12 @@ function useDataDnd(args) {
20018
20274
  reason: "dnd-kit cancelled the drag (escape key, pointer interrupted, or external)"
20019
20275
  });
20020
20276
  }, []);
20021
- const handleDragEndWithCleanup = React73__default.useCallback((event) => {
20277
+ const handleDragEndWithCleanup = React74__default.useCallback((event) => {
20022
20278
  handleDragEnd(event);
20023
20279
  setActiveDrag(null);
20024
20280
  setOverZoneGroup(null);
20025
20281
  }, [handleDragEnd]);
20026
- const wrapContainer = React73__default.useCallback(
20282
+ const wrapContainer = React74__default.useCallback(
20027
20283
  (children) => {
20028
20284
  if (!enabled) return children;
20029
20285
  const strategy = layout === "grid" ? rectSortingStrategy : verticalListSortingStrategy;
@@ -20077,7 +20333,7 @@ var init_useDataDnd = __esm({
20077
20333
  init_useAlmadarDndCollision();
20078
20334
  init_Box();
20079
20335
  dndLog = createLogger("almadar:ui:dnd");
20080
- RootCtx = React73__default.createContext(null);
20336
+ RootCtx = React74__default.createContext(null);
20081
20337
  }
20082
20338
  });
20083
20339
  function renderIconInput(icon, props) {
@@ -20274,7 +20530,7 @@ function DataGrid({
20274
20530
  /* @__PURE__ */ jsx(
20275
20531
  Box,
20276
20532
  {
20277
- className: cn("grid", gapStyles5[gap], scrollX ? "grid-flow-col overflow-x-auto" : colsClass, lookStyles4[look], className),
20533
+ className: cn("grid", gapStyles5[gap], scrollX ? "grid-flow-col overflow-x-auto" : colsClass, lookStyles5[look], className),
20278
20534
  style: scrollX ? { gridAutoFlow: "column", gridAutoColumns: `minmax(${minCardWidth}px, 1fr)` } : gridTemplateColumns ? { gridTemplateColumns } : void 0,
20279
20535
  children: data.map((item, index) => {
20280
20536
  const itemData = item;
@@ -20351,10 +20607,10 @@ function DataGrid({
20351
20607
  ] }),
20352
20608
  badgeFields.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "flex-wrap", children: badgeFields.map((field) => {
20353
20609
  const val = getNestedValue(itemData, field.name);
20354
- if (val === void 0 || val === null) return null;
20610
+ if (val === void 0 || val === null || val === "") return null;
20355
20611
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
20356
20612
  field.icon && renderIconInput(field.icon, { size: "xs" }),
20357
- /* @__PURE__ */ jsx(Badge, { variant: resolveBadgeVariant(field, String(val)), children: String(val) })
20613
+ /* @__PURE__ */ jsx(Badge, { variant: resolveBadgeVariant(field, String(val)), children: formatValue(val, field.format) })
20358
20614
  ] }, field.name);
20359
20615
  }) })
20360
20616
  ] }),
@@ -20469,7 +20725,7 @@ function DataGrid({
20469
20725
  ] })
20470
20726
  );
20471
20727
  }
20472
- var dataGridLog, BADGE_VARIANTS, gapStyles5, lookStyles4;
20728
+ var dataGridLog, BADGE_VARIANTS, gapStyles5, lookStyles5;
20473
20729
  var init_DataGrid = __esm({
20474
20730
  "components/core/molecules/DataGrid.tsx"() {
20475
20731
  "use client";
@@ -20504,7 +20760,7 @@ var init_DataGrid = __esm({
20504
20760
  lg: "gap-6",
20505
20761
  xl: "gap-8"
20506
20762
  };
20507
- lookStyles4 = {
20763
+ lookStyles5 = {
20508
20764
  dense: "gap-2 [&>*]:p-card-sm",
20509
20765
  spacious: "gap-8 [&>*]:p-card-lg",
20510
20766
  striped: "[&>*:nth-child(even)]:bg-muted/30",
@@ -20604,7 +20860,7 @@ function DataList({
20604
20860
  }) {
20605
20861
  const eventBus = useEventBus();
20606
20862
  const { t } = useTranslate();
20607
- const [visibleCount, setVisibleCount] = React73__default.useState(pageSize || Infinity);
20863
+ const [visibleCount, setVisibleCount] = React74__default.useState(pageSize || Infinity);
20608
20864
  const fieldDefs = fields ?? columns ?? [];
20609
20865
  const allDataRaw = Array.isArray(entity) ? entity : entity ? [entity] : [];
20610
20866
  const dnd = useDataDnd({
@@ -20623,7 +20879,7 @@ function DataList({
20623
20879
  const data = pageSize > 0 ? allData.slice(0, visibleCount) : allData;
20624
20880
  const hasMoreLocal = pageSize > 0 && visibleCount < allData.length;
20625
20881
  const hasRenderProp = typeof children === "function";
20626
- React73__default.useEffect(() => {
20882
+ React74__default.useEffect(() => {
20627
20883
  const renderItemTypeOf = typeof schemaRenderItem;
20628
20884
  const childrenTypeOf = typeof children;
20629
20885
  if (data.length > 0 && !hasRenderProp) {
@@ -20727,7 +20983,7 @@ function DataList({
20727
20983
  const items2 = [...data];
20728
20984
  const groups2 = groupBy ? groupData(items2, groupBy) : [{ label: "", items: items2 }];
20729
20985
  const contentField = titleField?.name ?? fieldDefs[0]?.name ?? "";
20730
- return /* @__PURE__ */ jsx(VStack, { gap: "sm", className: cn("py-2", className), children: groups2.map((group, gi) => /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
20986
+ return /* @__PURE__ */ jsx(VStack, { gap: "sm", className: cn("py-2", className), children: groups2.map((group, gi) => /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
20731
20987
  group.label && /* @__PURE__ */ jsx(Divider, { label: group.label, className: "my-2" }),
20732
20988
  group.items.map((itemData, index) => {
20733
20989
  const id = itemData.id || `${gi}-${index}`;
@@ -20868,7 +21124,7 @@ function DataList({
20868
21124
  className
20869
21125
  ),
20870
21126
  children: [
20871
- groups.map((group, gi) => /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
21127
+ groups.map((group, gi) => /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
20872
21128
  group.label && /* @__PURE__ */ jsx(Divider, { label: group.label, className: gi > 0 ? "mt-4" : "mt-0" }),
20873
21129
  group.items.map(
20874
21130
  (itemData, index) => renderItem(itemData, index, gi === groups.length - 1 && index === group.items.length - 1)
@@ -20975,8 +21231,8 @@ function ScalarControl({
20975
21231
  }
20976
21232
  const numeric = typeof value === "number";
20977
21233
  const initial = value === null ? "" : String(value);
20978
- const [draft, setDraft] = React73__default.useState(initial);
20979
- React73__default.useEffect(() => setDraft(initial), [initial]);
21234
+ const [draft, setDraft] = React74__default.useState(initial);
21235
+ React74__default.useEffect(() => setDraft(initial), [initial]);
20980
21236
  const commit = () => {
20981
21237
  if (numeric) {
20982
21238
  const n = draft.trim() === "" ? 0 : Number(draft);
@@ -21044,8 +21300,8 @@ function Row({
21044
21300
  onRemove,
21045
21301
  readonly
21046
21302
  }) {
21047
- const [keyDraft, setKeyDraft] = React73__default.useState(rowKey);
21048
- React73__default.useEffect(() => setKeyDraft(rowKey), [rowKey]);
21303
+ const [keyDraft, setKeyDraft] = React74__default.useState(rowKey);
21304
+ React74__default.useEffect(() => setKeyDraft(rowKey), [rowKey]);
21049
21305
  const container = isObj(value) || isArr(value);
21050
21306
  return /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "group w-max min-w-full", children: [
21051
21307
  /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", className: "py-0.5 w-max", children: [
@@ -21088,7 +21344,7 @@ function ContainerNode({
21088
21344
  depth,
21089
21345
  readonly
21090
21346
  }) {
21091
- const [open, setOpen] = React73__default.useState(depth < 2);
21347
+ const [open, setOpen] = React74__default.useState(depth < 2);
21092
21348
  const array = isArr(value);
21093
21349
  const entries = array ? value.map((v, i) => [String(i), v]) : Object.entries(value);
21094
21350
  const setObjValue = (key, next) => {
@@ -21230,7 +21486,7 @@ var init_FormSection = __esm({
21230
21486
  columns = 1,
21231
21487
  className
21232
21488
  }) => {
21233
- const [collapsed, setCollapsed] = React73__default.useState(defaultCollapsed);
21489
+ const [collapsed, setCollapsed] = React74__default.useState(defaultCollapsed);
21234
21490
  const { t } = useTranslate();
21235
21491
  const eventBus = useEventBus();
21236
21492
  const gridClass = {
@@ -21238,7 +21494,7 @@ var init_FormSection = __esm({
21238
21494
  2: "grid-cols-1 md:grid-cols-2",
21239
21495
  3: "grid-cols-1 md:grid-cols-2 lg:grid-cols-3"
21240
21496
  }[columns];
21241
- React73__default.useCallback(() => {
21497
+ React74__default.useCallback(() => {
21242
21498
  if (collapsible) {
21243
21499
  setCollapsed((prev) => !prev);
21244
21500
  eventBus.emit("UI:TOGGLE_COLLAPSE", { collapsed: !collapsed });
@@ -21646,8 +21902,8 @@ function TextLikeControl({
21646
21902
  onCommit
21647
21903
  }) {
21648
21904
  const initial = value === void 0 || value === null ? "" : String(value);
21649
- const [draft, setDraft] = React73__default.useState(initial);
21650
- React73__default.useEffect(() => setDraft(initial), [initial]);
21905
+ const [draft, setDraft] = React74__default.useState(initial);
21906
+ React74__default.useEffect(() => setDraft(initial), [initial]);
21651
21907
  const commit = () => {
21652
21908
  if (numeric) {
21653
21909
  const n = draft.trim() === "" ? 0 : Number(draft);
@@ -21832,14 +22088,14 @@ var init_NodeSlotEditor = __esm({
21832
22088
  isObj2 = (v) => v !== null && v !== void 0 && typeof v === "object" && !Array.isArray(v);
21833
22089
  NodeSlotEditor = ({ value, onChange, className }) => {
21834
22090
  const { type, props, wasArray } = normalize(value);
21835
- const patterns = React73__default.useMemo(() => {
22091
+ const patterns = React74__default.useMemo(() => {
21836
22092
  try {
21837
22093
  return [...getKnownPatterns()].sort();
21838
22094
  } catch {
21839
22095
  return [];
21840
22096
  }
21841
22097
  }, []);
21842
- const options = React73__default.useMemo(
22098
+ const options = React74__default.useMemo(
21843
22099
  () => [{ value: "", label: "\u2014 none \u2014" }, ...patterns.map((p) => ({ value: p, label: p }))],
21844
22100
  [patterns]
21845
22101
  );
@@ -21851,7 +22107,7 @@ var init_NodeSlotEditor = __esm({
21851
22107
  const pattern = { type: nextType, ...nextProps };
21852
22108
  onChange(wasArray || value === void 0 ? [pattern] : pattern);
21853
22109
  };
21854
- const schemaEntries = React73__default.useMemo(() => {
22110
+ const schemaEntries = React74__default.useMemo(() => {
21855
22111
  if (!type) return [];
21856
22112
  const def = getPatternDefinition(type);
21857
22113
  if (!def?.propsSchema) return [];
@@ -22053,129 +22309,6 @@ var init_FormField = __esm({
22053
22309
  FormField.displayName = "FormField";
22054
22310
  }
22055
22311
  });
22056
- function useSafeEventBus3() {
22057
- try {
22058
- return useEventBus();
22059
- } catch {
22060
- return { emit: () => {
22061
- }, on: () => () => {
22062
- }, once: () => {
22063
- } };
22064
- }
22065
- }
22066
- var log6, lookStyles5, ButtonGroup;
22067
- var init_ButtonGroup = __esm({
22068
- "components/core/molecules/ButtonGroup.tsx"() {
22069
- "use client";
22070
- init_cn();
22071
- init_atoms();
22072
- init_useEventBus();
22073
- log6 = createLogger("almadar:ui:button-group");
22074
- lookStyles5 = {
22075
- "right-aligned-buttons": "",
22076
- "floating-bar": "fixed bottom-section left-1/2 -translate-x-1/2 shadow-elevation-toast bg-card p-card-sm rounded-container",
22077
- "inline-row": "gap-2 inline-flex",
22078
- "dropdown-menu": "[&>button:not(:first-child)]:hidden",
22079
- "command-palette-trigger": "[&>button:not(:first-child)]:hidden"
22080
- };
22081
- ButtonGroup = ({
22082
- children,
22083
- primary,
22084
- secondary,
22085
- variant = "default",
22086
- orientation = "horizontal",
22087
- className,
22088
- // Filter-group pattern props (entity and filters are used for schema-driven filtering)
22089
- entity: _entity,
22090
- filters,
22091
- look = "right-aligned-buttons"
22092
- }) => {
22093
- const eventBus = useSafeEventBus3();
22094
- const variantClasses2 = {
22095
- default: "gap-0",
22096
- segmented: "gap-0 [&>button]:rounded-none [&>button:first-child]:rounded-l-lg [&>button:last-child]:rounded-r-lg [&>button:not(:first-child)]:border-l-0",
22097
- toggle: "gap-0 [&>button]:rounded-none [&>button:first-child]:rounded-l-lg [&>button:last-child]:rounded-r-lg [&>button:not(:first-child)]:border-l-0"
22098
- };
22099
- const orientationClasses = {
22100
- horizontal: "flex-row",
22101
- vertical: "flex-col [&>button:first-child]:rounded-t-lg [&>button:last-child]:rounded-b-lg [&>button:not(:first-child)]:border-t-0 [&>button:not(:first-child)]:border-l"
22102
- };
22103
- const handleActionClick = (action) => {
22104
- if (action.event) {
22105
- eventBus.emit("UI:DISPATCH", { event: action.event });
22106
- }
22107
- if (action.navigatesTo) {
22108
- eventBus.emit("UI:NAVIGATE", { url: action.navigatesTo });
22109
- }
22110
- };
22111
- const renderFormActions = () => {
22112
- const buttons = [];
22113
- if (secondary) {
22114
- secondary.forEach((action, index) => {
22115
- buttons.push(
22116
- /* @__PURE__ */ jsx(
22117
- Button,
22118
- {
22119
- type: action.actionType === "submit" ? "submit" : "button",
22120
- variant: action.variant || "ghost",
22121
- onClick: () => handleActionClick(action),
22122
- children: action.label
22123
- },
22124
- `secondary-${index}`
22125
- )
22126
- );
22127
- });
22128
- }
22129
- if (primary) {
22130
- const isSubmit = primary.actionType === "submit";
22131
- buttons.push(
22132
- /* @__PURE__ */ jsx(
22133
- Button,
22134
- {
22135
- type: isSubmit ? "submit" : "button",
22136
- variant: primary.variant || "primary",
22137
- onClick: () => handleActionClick(primary),
22138
- "data-testid": isSubmit ? "form-submit" : void 0,
22139
- children: primary.label
22140
- },
22141
- "primary"
22142
- )
22143
- );
22144
- }
22145
- return buttons;
22146
- };
22147
- const renderFilters = () => {
22148
- if (!filters || filters.length === 0) return null;
22149
- return filters.map((filter, index) => /* @__PURE__ */ jsx(
22150
- Button,
22151
- {
22152
- variant: "ghost",
22153
- onClick: () => {
22154
- log6.debug("Filter clicked", { field: filter.field });
22155
- },
22156
- children: filter.label
22157
- },
22158
- `filter-${filter.field}-${index}`
22159
- ));
22160
- };
22161
- return /* @__PURE__ */ jsx(
22162
- "div",
22163
- {
22164
- className: cn(
22165
- "inline-flex gap-2",
22166
- variantClasses2[variant],
22167
- orientationClasses[orientation],
22168
- lookStyles5[look],
22169
- className
22170
- ),
22171
- role: "group",
22172
- children: children || renderFilters() || renderFormActions()
22173
- }
22174
- );
22175
- };
22176
- ButtonGroup.displayName = "ButtonGroup";
22177
- }
22178
- });
22179
22312
  function getOrCreateStore(query) {
22180
22313
  if (!queryStores.has(query)) {
22181
22314
  queryStores.set(query, {
@@ -22360,7 +22493,7 @@ var init_FilterGroup = __esm({
22360
22493
  type: "button",
22361
22494
  onClick: () => handleFilterSelect(filter.field, null),
22362
22495
  className: cn(
22363
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
22496
+ "px-3 py-1.5 text-sm font-medium transition-all duration-fast",
22364
22497
  !selectedValues[filter.field] ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
22365
22498
  ),
22366
22499
  children: t("filterGroup.all")
@@ -22372,7 +22505,7 @@ var init_FilterGroup = __esm({
22372
22505
  type: "button",
22373
22506
  onClick: () => handleFilterSelect(filter.field, option),
22374
22507
  className: cn(
22375
- "px-3 py-1.5 text-sm font-medium transition-all duration-[var(--transition-fast)]",
22508
+ "px-3 py-1.5 text-sm font-medium transition-all duration-fast",
22376
22509
  "border-l-[length:var(--border-width)] border-border",
22377
22510
  selectedValues[filter.field] === option ? "bg-primary text-primary-foreground" : "bg-card text-muted-foreground hover:bg-muted"
22378
22511
  ),
@@ -22753,7 +22886,7 @@ var init_Flex = __esm({
22753
22886
  flexStyle.flexBasis = typeof basis === "number" ? `${basis}px` : basis;
22754
22887
  }
22755
22888
  }
22756
- return React73__default.createElement(Component, {
22889
+ return React74__default.createElement(Component, {
22757
22890
  className: cn(
22758
22891
  inline ? "inline-flex" : "flex",
22759
22892
  directionStyles[direction],
@@ -22872,7 +23005,7 @@ var init_Grid = __esm({
22872
23005
  as: Component = "div"
22873
23006
  }) => {
22874
23007
  const mergedStyle = rows2 ? { gridTemplateRows: `repeat(${rows2}, minmax(0, 1fr))`, ...style } : style;
22875
- return React73__default.createElement(
23008
+ return React74__default.createElement(
22876
23009
  Component,
22877
23010
  {
22878
23011
  className: cn(
@@ -22957,6 +23090,15 @@ var init_InputGroup = __esm({
22957
23090
  InputGroup.displayName = "InputGroup";
22958
23091
  }
22959
23092
  });
23093
+ var PageTransition;
23094
+ var init_PageTransition = __esm({
23095
+ "components/core/molecules/PageTransition.tsx"() {
23096
+ "use client";
23097
+ init_cn();
23098
+ PageTransition = ({ locationKey, children, className }) => /* @__PURE__ */ jsx("div", { className: cn("animate-page-in", className), children }, locationKey);
23099
+ PageTransition.displayName = "PageTransition";
23100
+ }
23101
+ });
22960
23102
  function computePopoverStyle(position, triggerRect, popoverWidth) {
22961
23103
  if (position === "left" || position === "right") {
22962
23104
  return {
@@ -22983,6 +23125,7 @@ var init_Popover = __esm({
22983
23125
  "components/core/molecules/Popover.tsx"() {
22984
23126
  "use client";
22985
23127
  init_Typography();
23128
+ init_Presence();
22986
23129
  init_cn();
22987
23130
  init_useTapReveal();
22988
23131
  arrowClasses = {
@@ -23006,6 +23149,7 @@ var init_Popover = __esm({
23006
23149
  const [popoverWidth, setPopoverWidth] = useState(0);
23007
23150
  const triggerRef = useRef(null);
23008
23151
  const popoverRef = useRef(null);
23152
+ const { mounted, className: panelAnim, onAnimationEnd } = usePresence(isOpen, { animation: "popover" });
23009
23153
  const updatePosition = () => {
23010
23154
  if (triggerRef.current) {
23011
23155
  setTriggerRect(triggerRef.current.getBoundingClientRect());
@@ -23031,10 +23175,11 @@ var init_Popover = __esm({
23031
23175
  useEffect(() => {
23032
23176
  if (isOpen) {
23033
23177
  updatePosition();
23034
- } else {
23035
- setPopoverWidth(0);
23036
23178
  }
23037
23179
  }, [isOpen]);
23180
+ useEffect(() => {
23181
+ if (!mounted) setPopoverWidth(0);
23182
+ }, [mounted]);
23038
23183
  useLayoutEffect(() => {
23039
23184
  if (isOpen && popoverRef.current) {
23040
23185
  const measured = popoverRef.current.offsetWidth;
@@ -23068,9 +23213,9 @@ var init_Popover = __esm({
23068
23213
  onMouseLeave: handleClose,
23069
23214
  onPointerDown: tapTriggerProps.onPointerDown
23070
23215
  };
23071
- const childElement = React73__default.isValidElement(children) ? children : /* @__PURE__ */ jsx("span", { children });
23216
+ const childElement = React74__default.isValidElement(children) ? children : /* @__PURE__ */ jsx("span", { children });
23072
23217
  const childPointerDown = childElement.props.onPointerDown;
23073
- const triggerElement = React73__default.cloneElement(
23218
+ const triggerElement = React74__default.cloneElement(
23074
23219
  childElement,
23075
23220
  {
23076
23221
  ref: triggerRef,
@@ -23083,13 +23228,14 @@ var init_Popover = __esm({
23083
23228
  } : void 0
23084
23229
  }
23085
23230
  );
23086
- const panel = isOpen && triggerRect ? /* @__PURE__ */ jsxs(
23231
+ const panel = mounted && triggerRect ? /* @__PURE__ */ jsxs(
23087
23232
  "div",
23088
23233
  {
23089
23234
  ref: popoverRef,
23090
23235
  className: cn(
23091
23236
  "fixed z-50 p-4",
23092
23237
  "bg-card border-2 border-border shadow-elevation-popover",
23238
+ panelAnim,
23093
23239
  className
23094
23240
  ),
23095
23241
  style: {
@@ -23097,6 +23243,7 @@ var init_Popover = __esm({
23097
23243
  ...popoverWidth === 0 ? { visibility: "hidden" } : void 0
23098
23244
  },
23099
23245
  role: "dialog",
23246
+ onAnimationEnd,
23100
23247
  onMouseEnter: trigger === "hover" ? handleOpen : void 0,
23101
23248
  onMouseLeave: trigger === "hover" ? handleClose : void 0,
23102
23249
  children: [
@@ -23253,7 +23400,7 @@ var init_Coachmark = __esm({
23253
23400
  role: "dialog",
23254
23401
  "aria-label": title,
23255
23402
  className: cn(
23256
- "fixed z-50 max-w-xs w-72 transition-opacity duration-150",
23403
+ "fixed z-50 max-w-xs w-72 transition-opacity duration-fast",
23257
23404
  centered || pos ? "opacity-100" : "opacity-0",
23258
23405
  className
23259
23406
  ),
@@ -23760,6 +23907,7 @@ var init_SidePanel = __esm({
23760
23907
  init_Box();
23761
23908
  init_Button();
23762
23909
  init_Typography();
23910
+ init_Presence();
23763
23911
  init_cn();
23764
23912
  init_useEventBus();
23765
23913
  SidePanel = ({
@@ -23779,15 +23927,17 @@ var init_SidePanel = __esm({
23779
23927
  if (closeEvent) eventBus.emit(`UI:${closeEvent}`, {});
23780
23928
  onClose();
23781
23929
  };
23782
- if (!isOpen) return null;
23930
+ const { mounted, className: panelAnim, onAnimationEnd } = usePresence(isOpen, { animation: "drawer" });
23931
+ const drawerSign = position === "right" ? 1 : -1;
23932
+ if (!mounted) return null;
23783
23933
  return /* @__PURE__ */ jsxs(Fragment, { children: [
23784
- showOverlay && /* @__PURE__ */ jsx(
23934
+ showOverlay && /* @__PURE__ */ jsx(Presence, { show: isOpen, animation: "overlay", children: /* @__PURE__ */ jsx(
23785
23935
  Box,
23786
23936
  {
23787
23937
  className: "fixed inset-0 bg-white/80 backdrop-blur-sm z-40 lg:hidden",
23788
23938
  onClick: handleClose
23789
23939
  }
23790
- ),
23940
+ ) }),
23791
23941
  /* @__PURE__ */ jsxs(
23792
23942
  Aside,
23793
23943
  {
@@ -23797,11 +23947,13 @@ var init_SidePanel = __esm({
23797
23947
  "border-l-2 border-border",
23798
23948
  position === "left" && "border-l-0 border-r-2",
23799
23949
  "flex flex-col",
23800
- "transition-transform duration-normal ease-standard",
23950
+ panelAnim,
23801
23951
  width,
23802
23952
  position === "right" ? "right-0" : "left-0",
23803
23953
  className
23804
23954
  ),
23955
+ style: { "--motion-drawer-sign": drawerSign },
23956
+ onAnimationEnd,
23805
23957
  children: [
23806
23958
  /* @__PURE__ */ jsxs(Box, { className: "flex items-center justify-between p-4 border-b-2 border-border sticky top-0 bg-card z-10", children: [
23807
23959
  /* @__PURE__ */ jsx(Typography, { variant: "h6", children: title }),
@@ -23922,9 +24074,9 @@ var init_Tooltip = __esm({
23922
24074
  if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);
23923
24075
  };
23924
24076
  }, []);
23925
- const triggerElement = React73__default.isValidElement(children) ? children : /* @__PURE__ */ jsx("span", { children });
24077
+ const triggerElement = React74__default.isValidElement(children) ? children : /* @__PURE__ */ jsx("span", { children });
23926
24078
  const childPointerDown = triggerElement.props.onPointerDown;
23927
- const trigger = React73__default.cloneElement(triggerElement, {
24079
+ const trigger = React74__default.cloneElement(triggerElement, {
23928
24080
  ref: triggerRef,
23929
24081
  onMouseEnter: handleMouseEnter,
23930
24082
  onMouseLeave: handleMouseLeave,
@@ -24014,7 +24166,7 @@ var init_WizardProgress = __esm({
24014
24166
  children: /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: normalizedSteps.map((step, index) => {
24015
24167
  const isActive = index === currentStep;
24016
24168
  const isCompleted = index < currentStep;
24017
- return /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
24169
+ return /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
24018
24170
  /* @__PURE__ */ jsx(
24019
24171
  "button",
24020
24172
  {
@@ -24565,7 +24717,7 @@ var init_FormSectionHeader = __esm({
24565
24717
  name: "chevron-down",
24566
24718
  size: "sm",
24567
24719
  className: cn(
24568
- "text-muted-foreground transition-transform duration-200 shrink-0",
24720
+ "text-muted-foreground transition-transform duration-fast shrink-0",
24569
24721
  isCollapsed && "-rotate-90"
24570
24722
  )
24571
24723
  }
@@ -25686,17 +25838,18 @@ function GameHud({
25686
25838
  const mid = Math.ceil(stats.length / 2);
25687
25839
  const leftStats = stats.slice(0, mid);
25688
25840
  const rightStats = stats.slice(mid);
25689
- const isTop = position === "top";
25690
25841
  return /* @__PURE__ */ jsxs(
25691
- Box,
25842
+ Card,
25692
25843
  {
25844
+ variant: "bordered",
25845
+ padding: "none",
25693
25846
  className: cn(
25694
- "flex items-center justify-between w-full",
25847
+ "flex items-center justify-between w-full rounded-none bg-card",
25695
25848
  "px-4 py-2 gap-4",
25696
- !transparent && (isTop ? "border-b border-border/40 bg-surface/90 backdrop-blur-sm" : "border-t border-border/40 bg-surface/90 backdrop-blur-sm"),
25697
- transparent && (isTop ? "border-b border-white/10 bg-black/40 backdrop-blur-sm" : "border-t border-white/10 bg-black/40 backdrop-blur-sm"),
25849
+ transparent && "backdrop-blur-sm",
25698
25850
  className
25699
25851
  ),
25852
+ style: transparent ? { backgroundColor: "color-mix(in srgb, var(--color-card) 40%, transparent)" } : void 0,
25700
25853
  children: [
25701
25854
  /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-3 flex-shrink-0", children: leftStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) }),
25702
25855
  rightStats.length > 0 && /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-3 flex-shrink-0", children: rightStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) })
@@ -25705,14 +25858,16 @@ function GameHud({
25705
25858
  );
25706
25859
  }
25707
25860
  return /* @__PURE__ */ jsx(
25708
- Box,
25861
+ Card,
25709
25862
  {
25710
- position: "relative",
25863
+ variant: "bordered",
25864
+ padding: "sm",
25711
25865
  className: cn(
25712
- "z-10 flex items-center gap-4 px-4 py-2",
25713
- transparent ? "bg-black/30 backdrop-blur-sm" : "bg-surface/90 backdrop-blur-sm",
25866
+ "z-10 relative flex items-center gap-4 bg-card",
25867
+ transparent && "backdrop-blur-sm",
25714
25868
  className
25715
25869
  ),
25870
+ style: transparent ? { backgroundColor: "color-mix(in srgb, var(--color-card) 30%, transparent)" } : void 0,
25716
25871
  children: stats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i))
25717
25872
  }
25718
25873
  );
@@ -25722,6 +25877,7 @@ var init_GameHud = __esm({
25722
25877
  "components/game/molecules/GameHud.tsx"() {
25723
25878
  init_cn();
25724
25879
  init_Box();
25880
+ init_Card();
25725
25881
  init_StatBadge();
25726
25882
  positionMap = {
25727
25883
  corners: "inset-0 pointer-events-none"
@@ -25745,9 +25901,9 @@ function GameMenu({
25745
25901
  logo,
25746
25902
  className
25747
25903
  }) {
25748
- const resolvedOptions = options ?? menuItems ?? DEFAULT_MENU_OPTIONS;
25904
+ const resolvedOptions = (options?.length ? options : void 0) ?? (menuItems?.length ? menuItems : void 0) ?? DEFAULT_MENU_OPTIONS;
25749
25905
  const eventBus = useEventBus();
25750
- const handleOptionClick = React73.useCallback(
25906
+ const handleOptionClick = React74.useCallback(
25751
25907
  (option) => {
25752
25908
  if (option.event) {
25753
25909
  eventBus.emit(`UI:${option.event}`, { option });
@@ -25766,39 +25922,48 @@ function GameMenu({
25766
25922
  {
25767
25923
  className: cn(
25768
25924
  "min-h-screen w-full flex flex-col items-center justify-center p-8",
25925
+ !background && "bg-background",
25769
25926
  className
25770
25927
  ),
25771
- style: {
25772
- background: background ?? "linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f0e17 100%)"
25773
- },
25928
+ style: background ? { background } : void 0,
25774
25929
  children: [
25775
- /* @__PURE__ */ jsxs(Box, { className: "text-center mb-12 animate-fade-in", children: [
25776
- logo && /* @__PURE__ */ jsx(GameIcon, { assetUrl: logo, icon: "image", size: 96, alt: title, className: "h-24 w-auto mx-auto mb-6 drop-shadow-2xl" }),
25777
- /* @__PURE__ */ jsx(
25778
- Typography,
25779
- {
25780
- variant: "h1",
25781
- className: "text-5xl md:text-7xl font-bold text-[var(--color-foreground)] tracking-tight",
25782
- style: {
25783
- textShadow: "0 4px 12px rgba(0,0,0,0.5)"
25784
- },
25785
- children: title
25786
- }
25787
- ),
25788
- subtitle && /* @__PURE__ */ jsx(Typography, { variant: "body", className: "mt-2 text-lg text-muted-foreground tracking-widest uppercase", children: subtitle })
25789
- ] }),
25790
- /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-4 w-full max-w-md", children: resolvedOptions.map((option, index) => /* @__PURE__ */ jsx(
25791
- ChoiceButton,
25930
+ /* @__PURE__ */ jsxs(
25931
+ Card,
25792
25932
  {
25793
- text: option.label,
25794
- index: index + 1,
25795
- disabled: option.disabled,
25796
- onClick: () => handleOptionClick(option),
25797
- className: "text-lg py-4 px-8"
25798
- },
25799
- index
25800
- )) }),
25801
- /* @__PURE__ */ jsxs(Box, { position: "absolute", className: "inset-0 pointer-events-none overflow-hidden", children: [
25933
+ variant: "bordered",
25934
+ padding: "lg",
25935
+ className: "bg-card flex flex-col items-center max-w-md w-full",
25936
+ children: [
25937
+ /* @__PURE__ */ jsxs(Box, { className: "text-center mb-8 animate-fade-in", children: [
25938
+ logo && /* @__PURE__ */ jsx(GameIcon, { assetUrl: logo, icon: "image", size: 96, alt: title, className: "h-24 w-auto mx-auto mb-6 drop-shadow-2xl" }),
25939
+ /* @__PURE__ */ jsx(
25940
+ Typography,
25941
+ {
25942
+ variant: "h1",
25943
+ className: "text-4xl md:text-5xl font-bold text-foreground tracking-tight",
25944
+ style: {
25945
+ textShadow: "0 4px 12px rgba(0,0,0,0.5)"
25946
+ },
25947
+ children: title
25948
+ }
25949
+ ),
25950
+ subtitle && /* @__PURE__ */ jsx(Typography, { variant: "body", className: "mt-2 text-lg text-muted-foreground tracking-widest uppercase", children: subtitle })
25951
+ ] }),
25952
+ /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-4 w-full", children: resolvedOptions.map((option, index) => /* @__PURE__ */ jsx(
25953
+ ChoiceButton,
25954
+ {
25955
+ text: option.label,
25956
+ index: index + 1,
25957
+ disabled: option.disabled,
25958
+ onClick: () => handleOptionClick(option),
25959
+ className: "text-lg py-4 px-8"
25960
+ },
25961
+ index
25962
+ )) })
25963
+ ]
25964
+ }
25965
+ ),
25966
+ /* @__PURE__ */ jsxs(Box, { position: "absolute", className: "inset-0 pointer-events-none overflow-hidden -z-10", children: [
25802
25967
  /* @__PURE__ */ jsx(Box, { position: "absolute", className: "top-1/4 left-1/4 w-64 h-64 bg-info/10 rounded-container blur-3xl" }),
25803
25968
  /* @__PURE__ */ jsx(Box, { position: "absolute", className: "bottom-1/4 right-1/4 w-96 h-96 bg-accent/10 rounded-container blur-3xl" })
25804
25969
  ] })
@@ -25813,6 +25978,7 @@ var init_GameMenu = __esm({
25813
25978
  init_cn();
25814
25979
  init_useEventBus();
25815
25980
  init_Box();
25981
+ init_Card();
25816
25982
  init_Typography();
25817
25983
  init_GameIcon();
25818
25984
  init_ChoiceButton();
@@ -25973,7 +26139,7 @@ function StateGraph({
25973
26139
  }) {
25974
26140
  const eventBus = useEventBus();
25975
26141
  const nodes = states ?? [];
25976
- const positions = React73.useMemo(() => layoutStates(nodes, width, height), [nodes, width, height]);
26142
+ const positions = React74.useMemo(() => layoutStates(nodes, width, height), [nodes, width, height]);
25977
26143
  return /* @__PURE__ */ jsxs(
25978
26144
  Box,
25979
26145
  {
@@ -26510,7 +26676,7 @@ function LinearView({
26510
26676
  /* @__PURE__ */ jsx(HStack, { className: "flex-wrap items-center", gap: "xs", children: trait.states.map((state, i) => {
26511
26677
  const isDone = i < currentIdx;
26512
26678
  const isCurrent = i === currentIdx;
26513
- return /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
26679
+ return /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
26514
26680
  i > 0 && /* @__PURE__ */ jsx(
26515
26681
  Typography,
26516
26682
  {
@@ -27143,7 +27309,7 @@ function SequenceBar({
27143
27309
  else onSlotRemove?.(index);
27144
27310
  }, [emit, slotRemoveEvent, onSlotRemove, playing]);
27145
27311
  const paddedSlots = Array.from({ length: maxSlots }, (_, i) => slots[i]);
27146
- return /* @__PURE__ */ jsx(HStack, { className: cn("items-center", className), gap: "sm", children: paddedSlots.map((slot, i) => /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
27312
+ return /* @__PURE__ */ jsx(HStack, { className: cn("items-center", className), gap: "sm", children: paddedSlots.map((slot, i) => /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
27147
27313
  i > 0 && /* @__PURE__ */ jsx(
27148
27314
  Typography,
27149
27315
  {
@@ -27330,6 +27496,7 @@ var init_GameShell = __esm({
27330
27496
  "components/game/templates/GameShell.tsx"() {
27331
27497
  init_cn();
27332
27498
  init_Box();
27499
+ init_Card();
27333
27500
  init_Typography();
27334
27501
  init_AtlasImage();
27335
27502
  FONT_BASE = "https://almadar-kflow-assets.web.app/shared/_shared/kenney-fonts/fonts";
@@ -27358,13 +27525,14 @@ var init_GameShell = __esm({
27358
27525
  showTopBar = true,
27359
27526
  children,
27360
27527
  backgroundAsset,
27361
- hudBackgroundAsset,
27362
- fontFamily = "future"
27528
+ fontFamily = "future",
27529
+ "data-theme": dataTheme
27363
27530
  }) => {
27364
27531
  const font = GAME_FONTS[fontFamily] ?? fontFamily;
27365
27532
  return /* @__PURE__ */ jsxs(
27366
27533
  Box,
27367
27534
  {
27535
+ "data-theme": dataTheme || void 0,
27368
27536
  className: cn("game-shell", className),
27369
27537
  style: {
27370
27538
  position: "relative",
@@ -27372,7 +27540,7 @@ var init_GameShell = __esm({
27372
27540
  height: "100vh",
27373
27541
  overflow: "hidden",
27374
27542
  background: "var(--color-background, #0a0a0f)",
27375
- color: "var(--color-text, #e0e0e0)",
27543
+ color: "var(--color-foreground, #e0e0e0)",
27376
27544
  fontFamily: `'${font}', system-ui, sans-serif`
27377
27545
  },
27378
27546
  children: [
@@ -27404,19 +27572,12 @@ var init_GameShell = __esm({
27404
27572
  },
27405
27573
  children: [
27406
27574
  showTopBar && /* @__PURE__ */ jsx(
27407
- AtlasPanel,
27575
+ Card,
27408
27576
  {
27409
- asset: hudBackgroundAsset,
27410
- borderSlice: 12,
27411
- borderWidth: 10,
27412
- className: "game-shell__title pointer-events-auto",
27413
- style: {
27414
- padding: "6px 16px",
27415
- background: hudBackgroundAsset ? void 0 : "rgba(18, 18, 31, 0.85)",
27416
- borderRadius: hudBackgroundAsset ? void 0 : 10,
27417
- boxShadow: "0 4px 14px rgba(0,0,0,0.45)",
27418
- flexShrink: 0
27419
- },
27577
+ variant: "bordered",
27578
+ padding: "none",
27579
+ className: "game-shell__title bg-card pointer-events-auto",
27580
+ style: { padding: "6px 16px", flexShrink: 0 },
27420
27581
  children: /* @__PURE__ */ jsx(
27421
27582
  Typography,
27422
27583
  {
@@ -28128,13 +28289,13 @@ var init_MapView = __esm({
28128
28289
  shadowSize: [41, 41]
28129
28290
  });
28130
28291
  L.Marker.prototype.options.icon = defaultIcon;
28131
- const { useEffect: useEffect64, useRef: useRef61, useCallback: useCallback104, useState: useState100 } = React73__default;
28292
+ const { useEffect: useEffect65, useRef: useRef62, useCallback: useCallback105, useState: useState102 } = React74__default;
28132
28293
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
28133
28294
  const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
28134
28295
  function MapUpdater({ centerLat, centerLng, zoom }) {
28135
28296
  const map = useMap();
28136
- const prevRef = useRef61({ centerLat, centerLng, zoom });
28137
- useEffect64(() => {
28297
+ const prevRef = useRef62({ centerLat, centerLng, zoom });
28298
+ useEffect65(() => {
28138
28299
  const prev = prevRef.current;
28139
28300
  if (prev.centerLat !== centerLat || prev.centerLng !== centerLng || prev.zoom !== zoom) {
28140
28301
  map.setView([centerLat, centerLng], zoom);
@@ -28145,7 +28306,7 @@ var init_MapView = __esm({
28145
28306
  }
28146
28307
  function MapClickHandler({ onMapClick }) {
28147
28308
  const map = useMap();
28148
- useEffect64(() => {
28309
+ useEffect65(() => {
28149
28310
  if (!onMapClick) return;
28150
28311
  const handler = (e) => {
28151
28312
  onMapClick(e.latlng.lat, e.latlng.lng);
@@ -28173,8 +28334,8 @@ var init_MapView = __esm({
28173
28334
  showAttribution = true
28174
28335
  }) {
28175
28336
  const eventBus = useEventBus2();
28176
- const [clickedPosition, setClickedPosition] = useState100(null);
28177
- const handleMapClick = useCallback104((lat, lng) => {
28337
+ const [clickedPosition, setClickedPosition] = useState102(null);
28338
+ const handleMapClick = useCallback105((lat, lng) => {
28178
28339
  if (showClickedPin) {
28179
28340
  setClickedPosition({ lat, lng });
28180
28341
  }
@@ -28183,7 +28344,7 @@ var init_MapView = __esm({
28183
28344
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
28184
28345
  }
28185
28346
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
28186
- const handleMarkerClick = useCallback104((marker) => {
28347
+ const handleMarkerClick = useCallback105((marker) => {
28187
28348
  onMarkerClick?.(marker);
28188
28349
  if (markerClickEvent) {
28189
28350
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -28383,7 +28544,7 @@ var init_NumberStepper = __esm({
28383
28544
  "text-foreground",
28384
28545
  "hover:bg-muted",
28385
28546
  "active:bg-muted",
28386
- "transition-colors duration-100",
28547
+ "transition-colors duration-instant",
28387
28548
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
28388
28549
  "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
28389
28550
  styles.button
@@ -28424,7 +28585,7 @@ var init_NumberStepper = __esm({
28424
28585
  "text-foreground",
28425
28586
  "hover:bg-muted",
28426
28587
  "active:bg-muted",
28427
- "transition-colors duration-100",
28588
+ "transition-colors duration-instant",
28428
28589
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
28429
28590
  "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
28430
28591
  styles.button
@@ -28548,7 +28709,7 @@ var init_StarRating = __esm({
28548
28709
  className: cn(
28549
28710
  styles.star,
28550
28711
  "text-foreground/30",
28551
- "transition-colors duration-100"
28712
+ "transition-colors duration-instant"
28552
28713
  ),
28553
28714
  strokeWidth: 1.5
28554
28715
  }
@@ -28561,7 +28722,7 @@ var init_StarRating = __esm({
28561
28722
  styles.star,
28562
28723
  "absolute inset-0",
28563
28724
  "text-warning fill-warning",
28564
- "transition-colors duration-100"
28725
+ "transition-colors duration-instant"
28565
28726
  ),
28566
28727
  strokeWidth: 1.5,
28567
28728
  style: isHalf ? { clipPath: "inset(0 50% 0 0)" } : void 0
@@ -28716,7 +28877,7 @@ var init_UploadDropZone = __esm({
28716
28877
  "relative flex flex-col items-center justify-center",
28717
28878
  "p-8 rounded-sm",
28718
28879
  "border-2 border-dashed",
28719
- "transition-colors duration-150",
28880
+ "transition-colors duration-fast",
28720
28881
  "cursor-pointer",
28721
28882
  isDragOver ? "border-primary bg-primary bg-opacity-5" : "border-border bg-surface",
28722
28883
  error && "border-error",
@@ -29043,8 +29204,8 @@ function TableView({
29043
29204
  }) {
29044
29205
  const eventBus = useEventBus();
29045
29206
  const { t } = useTranslate();
29046
- const [visibleCount, setVisibleCount] = React73__default.useState(pageSize > 0 ? pageSize : Infinity);
29047
- const [localSelected, setLocalSelected] = React73__default.useState(/* @__PURE__ */ new Set());
29207
+ const [visibleCount, setVisibleCount] = React74__default.useState(pageSize > 0 ? pageSize : Infinity);
29208
+ const [localSelected, setLocalSelected] = React74__default.useState(/* @__PURE__ */ new Set());
29048
29209
  const colDefs = columns ?? fields ?? [];
29049
29210
  const allDataRaw = Array.isArray(entity) ? entity : entity ? [entity] : [];
29050
29211
  const dnd = useDataDnd({
@@ -29124,7 +29285,7 @@ function TableView({
29124
29285
  className: cn(
29125
29286
  "grid items-center gap-3 sticky top-0 z-10",
29126
29287
  "bg-[var(--color-surface-subtle)] border-b border-[var(--color-border)]",
29127
- "text-[var(--color-text-muted)] uppercase text-xs font-semibold tracking-wide",
29288
+ "text-muted-foreground uppercase text-xs font-semibold tracking-wide",
29128
29289
  lk.headPad
29129
29290
  ),
29130
29291
  children: [
@@ -29239,12 +29400,12 @@ function TableView({
29239
29400
  ]
29240
29401
  }
29241
29402
  );
29242
- return dnd.isZone ? /* @__PURE__ */ jsx(dnd.SortableItem, { id: row[idField] ?? id, children: rowInner }, id) : /* @__PURE__ */ jsx(React73__default.Fragment, { children: rowInner }, id);
29403
+ return dnd.isZone ? /* @__PURE__ */ jsx(dnd.SortableItem, { id: row[idField] ?? id, children: rowInner }, id) : /* @__PURE__ */ jsx(React74__default.Fragment, { children: rowInner }, id);
29243
29404
  };
29244
29405
  const items = Array.from(data);
29245
29406
  const groups = groupBy ? groupData2(items, groupBy) : [{ label: "", items }];
29246
29407
  let runningIndex = 0;
29247
- const body = /* @__PURE__ */ jsx(Box, { role: "rowgroup", children: groups.map((group, gi) => /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
29408
+ const body = /* @__PURE__ */ jsx(Box, { role: "rowgroup", children: groups.map((group, gi) => /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
29248
29409
  group.label && /* @__PURE__ */ jsx(Divider, { label: group.label, className: gi > 0 ? "mt-3" : "mt-0" }),
29249
29410
  group.items.map((row) => renderRow(row, runningIndex++))
29250
29411
  ] }, gi)) });
@@ -29980,7 +30141,7 @@ function SortableListInner({
29980
30141
  "flex items-center justify-center",
29981
30142
  "text-muted-foreground",
29982
30143
  "hover:text-foreground",
29983
- "transition-colors duration-100",
30144
+ "transition-colors duration-instant",
29984
30145
  "px-1"
29985
30146
  ),
29986
30147
  "aria-grabbed": ariaGrabbed,
@@ -30007,7 +30168,7 @@ function SortableListInner({
30007
30168
  gap: "sm",
30008
30169
  align: "center",
30009
30170
  className: cn(
30010
- "transition-opacity duration-150",
30171
+ "transition-opacity duration-fast",
30011
30172
  isBeingDragged && "opacity-50"
30012
30173
  ),
30013
30174
  children: [
@@ -30179,7 +30340,7 @@ var init_PullToRefresh = __esm({
30179
30340
  children: /* @__PURE__ */ jsx(
30180
30341
  Box,
30181
30342
  {
30182
- className: "transition-transform duration-150",
30343
+ className: "transition-transform duration-fast",
30183
30344
  style: {
30184
30345
  transform: `scale(${isRefreshing ? 1 : pullProgress})`,
30185
30346
  opacity: isRefreshing ? 1 : pullProgress
@@ -30601,7 +30762,7 @@ var init_StepFlow = __esm({
30601
30762
  className
30602
30763
  }) => {
30603
30764
  if (orientation === "vertical") {
30604
- return /* @__PURE__ */ jsx(VStack, { gap: "none", className: cn("w-full", className), children: steps.map((step, index) => /* @__PURE__ */ jsx(React73__default.Fragment, { children: /* @__PURE__ */ jsxs(HStack, { gap: "md", align: "start", className: "w-full", children: [
30765
+ return /* @__PURE__ */ jsx(VStack, { gap: "none", className: cn("w-full", className), children: steps.map((step, index) => /* @__PURE__ */ jsx(React74__default.Fragment, { children: /* @__PURE__ */ jsxs(HStack, { gap: "md", align: "start", className: "w-full", children: [
30605
30766
  /* @__PURE__ */ jsxs(VStack, { gap: "none", align: "center", children: [
30606
30767
  /* @__PURE__ */ jsx(StepCircle, { step, index }),
30607
30768
  showConnectors && index < steps.length - 1 && /* @__PURE__ */ jsx(Box, { className: "w-px h-8 bg-border" })
@@ -30612,7 +30773,7 @@ var init_StepFlow = __esm({
30612
30773
  ] })
30613
30774
  ] }) }, index)) });
30614
30775
  }
30615
- return /* @__PURE__ */ jsx(Box, { className: cn("w-full flex flex-col md:flex-row items-start gap-0", className), children: steps.map((step, index) => /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
30776
+ return /* @__PURE__ */ jsx(Box, { className: cn("w-full flex flex-col md:flex-row items-start gap-0", className), children: steps.map((step, index) => /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
30616
30777
  /* @__PURE__ */ jsxs(VStack, { gap: "sm", align: "center", className: "flex-1 w-full md:w-auto", children: [
30617
30778
  /* @__PURE__ */ jsx(StepCircle, { step, index }),
30618
30779
  /* @__PURE__ */ jsx(Typography, { variant: "h4", className: "text-center", children: step.title }),
@@ -31489,6 +31650,11 @@ var init_VoteStack = __esm({
31489
31650
  {
31490
31651
  className: cn(
31491
31652
  "inline-flex items-center justify-center",
31653
+ // Shrink-wrap in stretch contexts (slot/sidecar wrappers are
31654
+ // flex-column with stretch alignment): without this the root spans
31655
+ // the full wrapper width and the count row's `w-full` turns the
31656
+ // compact pill into a page-wide band.
31657
+ "w-fit",
31492
31658
  variant === "vertical" ? "flex-col" : "flex-row",
31493
31659
  "rounded-sm",
31494
31660
  "border-[length:var(--border-width)] border-border",
@@ -31513,7 +31679,7 @@ var init_VoteStack = __esm({
31513
31679
  isUp ? "text-primary" : "text-muted-foreground",
31514
31680
  "hover:bg-muted",
31515
31681
  "active:bg-muted",
31516
- "transition-colors duration-100",
31682
+ "transition-colors duration-instant",
31517
31683
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
31518
31684
  "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
31519
31685
  styles.button
@@ -31550,7 +31716,7 @@ var init_VoteStack = __esm({
31550
31716
  isDown ? "text-primary" : "text-muted-foreground",
31551
31717
  "hover:bg-muted",
31552
31718
  "active:bg-muted",
31553
- "transition-colors duration-100",
31719
+ "transition-colors duration-instant",
31554
31720
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
31555
31721
  "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
31556
31722
  styles.button
@@ -31597,7 +31763,7 @@ var init_LikertScale = __esm({
31597
31763
  md: "text-base",
31598
31764
  lg: "text-lg"
31599
31765
  };
31600
- LikertScale = React73__default.forwardRef(
31766
+ LikertScale = React74__default.forwardRef(
31601
31767
  ({
31602
31768
  question,
31603
31769
  options = DEFAULT_LIKERT_OPTIONS,
@@ -31609,7 +31775,7 @@ var init_LikertScale = __esm({
31609
31775
  variant = "radios",
31610
31776
  className
31611
31777
  }, ref) => {
31612
- const groupId = React73__default.useId();
31778
+ const groupId = React74__default.useId();
31613
31779
  const eventBus = useEventBus();
31614
31780
  const handleSelect = useCallback(
31615
31781
  (next) => {
@@ -31662,7 +31828,7 @@ var init_LikertScale = __esm({
31662
31828
  disabled,
31663
31829
  onClick: () => handleSelect(opt.value),
31664
31830
  className: cn(
31665
- "flex-1 text-center font-medium transition-colors duration-100",
31831
+ "flex-1 text-center font-medium transition-colors duration-instant",
31666
31832
  "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
31667
31833
  "disabled:cursor-not-allowed",
31668
31834
  "rounded-none gap-0 shadow-none border-none",
@@ -33891,7 +34057,7 @@ var init_DocBreadcrumb = __esm({
33891
34057
  "aria-label": t("aria.breadcrumb"),
33892
34058
  children: /* @__PURE__ */ jsx(HStack, { gap: "xs", align: "center", wrap: true, children: items.map((item, idx) => {
33893
34059
  const isLast = idx === items.length - 1;
33894
- return /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
34060
+ return /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
33895
34061
  idx > 0 && /* @__PURE__ */ jsx(
33896
34062
  Icon,
33897
34063
  {
@@ -34760,7 +34926,7 @@ var init_MiniStateMachine = __esm({
34760
34926
  const x = 2 + i * (NODE_W + GAP2 + ARROW_W + GAP2);
34761
34927
  const tc = transitionCounts[s.name] ?? 0;
34762
34928
  const role = getStateRole(s.name, s.isInitial ?? void 0, s.isTerminal ?? void 0, tc, maxTC);
34763
- return /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
34929
+ return /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
34764
34930
  /* @__PURE__ */ jsx(
34765
34931
  AvlState,
34766
34932
  {
@@ -34964,7 +35130,7 @@ var init_PageHeader = __esm({
34964
35130
  info: "bg-info/10 text-info"
34965
35131
  };
34966
35132
  return /* @__PURE__ */ jsxs(Box, { className: cn("mb-6", className), children: [
34967
- breadcrumbs && breadcrumbs.length > 0 && /* @__PURE__ */ jsx(Box, { as: "nav", className: "mb-4", children: /* @__PURE__ */ jsx(Box, { as: "ol", className: "flex items-center gap-2 text-sm", children: breadcrumbs.map((crumb, idx) => /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
35133
+ breadcrumbs && breadcrumbs.length > 0 && /* @__PURE__ */ jsx(Box, { as: "nav", className: "mb-4", children: /* @__PURE__ */ jsx(Box, { as: "ol", className: "flex items-center gap-2 text-sm", children: breadcrumbs.map((crumb, idx) => /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
34968
35134
  idx > 0 && /* @__PURE__ */ jsx(Typography, { variant: "small", color: "muted", children: "/" }),
34969
35135
  crumb.href ? /* @__PURE__ */ jsx(
34970
35136
  "a",
@@ -35322,7 +35488,7 @@ var init_Section = __esm({
35322
35488
  as: Component = "section"
35323
35489
  }) => {
35324
35490
  const hasHeader = title || description || action;
35325
- return React73__default.createElement(
35491
+ return React74__default.createElement(
35326
35492
  Component,
35327
35493
  {
35328
35494
  className: cn(
@@ -35389,12 +35555,12 @@ var init_Sidebar = __esm({
35389
35555
  variant: "ghost",
35390
35556
  onClick: item.onClick,
35391
35557
  className: cn(
35392
- "w-full flex items-center gap-3 px-3 py-2.5 transition-all duration-[var(--transition-fast)] group relative",
35558
+ "w-full flex items-center gap-3 px-3 py-2.5 transition-all duration-fast group relative",
35393
35559
  "rounded-sm border-[length:var(--border-width-thin)] border-transparent",
35394
35560
  isActive ? [
35395
35561
  "bg-primary text-primary-foreground",
35396
35562
  "font-medium shadow-sm",
35397
- "border-primary translate-x-1 -translate-y-0.5"
35563
+ "border-primary translate-x-1 rtl:-translate-x-1 -translate-y-0.5"
35398
35564
  ].join(" ") : [
35399
35565
  "text-foreground",
35400
35566
  "hover:bg-muted hover:border-border",
@@ -35404,10 +35570,10 @@ var init_Sidebar = __esm({
35404
35570
  title: collapsed ? item.label : void 0,
35405
35571
  children: [
35406
35572
  item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: item.icon, size: "sm", className: cn("min-w-[20px] flex-shrink-0", isActive && "text-primary-foreground") }) : /* @__PURE__ */ jsx(Icon, { icon: item.icon, size: "sm", className: cn("min-w-[20px] flex-shrink-0", isActive && "text-primary-foreground") })),
35407
- !collapsed && /* @__PURE__ */ jsx(Typography, { variant: "body", color: isActive ? "inherit" : "primary", className: "font-medium truncate flex-1 text-left", children: item.label }),
35573
+ !collapsed && /* @__PURE__ */ jsx(Typography, { variant: "body", color: isActive ? "inherit" : "primary", className: "font-medium truncate flex-1 text-start", children: item.label }),
35408
35574
  !collapsed && item.badge !== void 0 && /* @__PURE__ */ jsx(Badge, { variant: "danger", size: "sm", children: item.badge }),
35409
35575
  collapsed && /* @__PURE__ */ jsx(Box, { className: cn(
35410
- "absolute left-full ml-2 px-2 py-1 text-xs opacity-0 group-hover:opacity-100",
35576
+ "absolute start-full ms-2 px-2 py-1 text-xs opacity-0 group-hover:opacity-100",
35411
35577
  "pointer-events-none whitespace-nowrap z-50 transition-opacity",
35412
35578
  "bg-primary text-primary-foreground",
35413
35579
  "border-[length:var(--border-width-thin)] border-border",
@@ -35462,8 +35628,8 @@ var init_Sidebar = __esm({
35462
35628
  as: "aside",
35463
35629
  className: cn(
35464
35630
  "flex flex-col h-full",
35465
- "bg-card border-r border-border",
35466
- "transition-all duration-300 ease-in-out",
35631
+ "bg-card border-e border-border",
35632
+ "transition-all duration-normal ease-standard",
35467
35633
  collapsed ? "w-20" : "w-64",
35468
35634
  className
35469
35635
  ),
@@ -35696,7 +35862,7 @@ var init_WizardContainer = __esm({
35696
35862
  const isCompleted = index < currentStep;
35697
35863
  const stepKey = step.id ?? step.tabId ?? `step-${index}`;
35698
35864
  const stepTitle = step.title ?? step.name ?? `Step ${index + 1}`;
35699
- return /* @__PURE__ */ jsxs(React73__default.Fragment, { children: [
35865
+ return /* @__PURE__ */ jsxs(React74__default.Fragment, { children: [
35700
35866
  /* @__PURE__ */ jsx(
35701
35867
  Button,
35702
35868
  {
@@ -36623,7 +36789,7 @@ function resolveColor3(color, el) {
36623
36789
  function truncateLabel(label) {
36624
36790
  return label.length > MAX_LABEL_CHARS ? label.slice(0, MAX_LABEL_CHARS - 1) + "\u2026" : label;
36625
36791
  }
36626
- var GROUP_COLORS2, GROUP_GRAVITY, UNGROUPED_GRAVITY, labelMeasureCtx, MAX_LABEL_CHARS, GraphCanvas;
36792
+ var GROUP_COLORS2, GROUP_GRAVITY, UNGROUPED_GRAVITY, labelMeasureCtx, MAX_LABEL_CHARS, NO_NODES, NO_EDGES, NO_SIM, GraphCanvas;
36627
36793
  var init_GraphCanvas = __esm({
36628
36794
  "components/core/molecules/GraphCanvas.tsx"() {
36629
36795
  "use client";
@@ -36647,11 +36813,14 @@ var init_GraphCanvas = __esm({
36647
36813
  UNGROUPED_GRAVITY = 0.02;
36648
36814
  labelMeasureCtx = null;
36649
36815
  MAX_LABEL_CHARS = 22;
36816
+ NO_NODES = [];
36817
+ NO_EDGES = [];
36818
+ NO_SIM = [];
36650
36819
  GraphCanvas = ({
36651
36820
  title,
36652
- nodes: propNodes = [],
36653
- edges: propEdges = [],
36654
- similarity: propSimilarity = [],
36821
+ nodes: propNodes = NO_NODES,
36822
+ edges: propEdges = NO_EDGES,
36823
+ similarity: propSimilarity = NO_SIM,
36655
36824
  height = 400,
36656
36825
  showLabels = true,
36657
36826
  interactive = true,
@@ -36701,6 +36870,7 @@ var init_GraphCanvas = __esm({
36701
36870
  const interactionRef = useRef({
36702
36871
  mode: "none",
36703
36872
  dragNodeId: null,
36873
+ pressedNodeId: null,
36704
36874
  startMouse: { x: 0, y: 0 },
36705
36875
  startOffset: { x: 0, y: 0 },
36706
36876
  downPos: { x: 0, y: 0 }
@@ -36748,6 +36918,11 @@ var init_GraphCanvas = __esm({
36748
36918
  () => [...new Set(propNodes.map((n) => n.group).filter(Boolean))],
36749
36919
  [propNodes]
36750
36920
  );
36921
+ const nodesKey = useMemo(() => propNodes.map((n) => n.id).join(""), [propNodes]);
36922
+ const edgesKey = useMemo(
36923
+ () => propEdges.map((e) => `${e.source}${e.target}`).join(""),
36924
+ [propEdges]
36925
+ );
36751
36926
  useEffect(() => {
36752
36927
  const canvas = canvasRef.current;
36753
36928
  if (!canvas || propNodes.length === 0) return;
@@ -36928,7 +37103,7 @@ var init_GraphCanvas = __esm({
36928
37103
  return () => {
36929
37104
  cancelAnimationFrame(animRef.current);
36930
37105
  };
36931
- }, [propNodes, propEdges, propSimilarity, layout, repulsion, linkDistance, nodeSpacing, showLabels]);
37106
+ }, [nodesKey, edgesKey, propSimilarity, layout, repulsion, linkDistance, nodeSpacing, showLabels]);
36932
37107
  useEffect(() => {
36933
37108
  const canvas = canvasRef.current;
36934
37109
  if (!canvas) return;
@@ -37058,6 +37233,7 @@ var init_GraphCanvas = __esm({
37058
37233
  const cancelSinglePointer = useCallback(() => {
37059
37234
  interactionRef.current.mode = "none";
37060
37235
  interactionRef.current.dragNodeId = null;
37236
+ interactionRef.current.pressedNodeId = null;
37061
37237
  }, []);
37062
37238
  const handlePointerDown = useCallback(
37063
37239
  (e) => {
@@ -37068,6 +37244,7 @@ var init_GraphCanvas = __esm({
37068
37244
  state.downPos = { x: e.clientX, y: e.clientY };
37069
37245
  state.startMouse = { x: e.clientX, y: e.clientY };
37070
37246
  state.startOffset = { ...offset };
37247
+ state.pressedNodeId = node?.id ?? null;
37071
37248
  if (draggable && node) {
37072
37249
  state.mode = "dragging";
37073
37250
  state.dragNodeId = node.id;
@@ -37119,7 +37296,8 @@ var init_GraphCanvas = __esm({
37119
37296
  if (moved < 4) {
37120
37297
  const coords = toCoords(e);
37121
37298
  if (!coords) return;
37122
- const node = nodeAt(coords.graphX, coords.graphY);
37299
+ const node = (state.pressedNodeId ? nodesRef.current.find((n) => n.id === state.pressedNodeId) : void 0) ?? nodeAt(coords.graphX, coords.graphY);
37300
+ state.pressedNodeId = null;
37123
37301
  if (node) {
37124
37302
  if (node.badge && node.badge > 1 && onBadgeClick) {
37125
37303
  const r = (node.size || 8) + (selectedNodeId === node.id ? 4 : 0);
@@ -37139,6 +37317,7 @@ var init_GraphCanvas = __esm({
37139
37317
  );
37140
37318
  const handlePointerLeave = useCallback(() => {
37141
37319
  setHoveredNode(null);
37320
+ interactionRef.current.pressedNodeId = null;
37142
37321
  }, []);
37143
37322
  const gestureHandlers = useCanvasGestures({
37144
37323
  canvasRef,
@@ -37453,6 +37632,7 @@ var init_molecules2 = __esm({
37453
37632
  init_InputGroup();
37454
37633
  init_Menu();
37455
37634
  init_Modal();
37635
+ init_PageTransition();
37456
37636
  init_Pagination();
37457
37637
  init_Popover();
37458
37638
  init_Coachmark();
@@ -38503,7 +38683,7 @@ var init_DetailPanel = __esm({
38503
38683
  }
38504
38684
  });
38505
38685
  function extractTitle(children) {
38506
- if (!React73__default.isValidElement(children)) return void 0;
38686
+ if (!React74__default.isValidElement(children)) return void 0;
38507
38687
  const props = children.props;
38508
38688
  if (typeof props.title === "string") {
38509
38689
  return props.title;
@@ -38853,12 +39033,12 @@ var init_Form = __esm({
38853
39033
  const isSchemaEntity = isOrbitalEntitySchema(entity);
38854
39034
  const resolvedEntity = isSchemaEntity ? entity : void 0;
38855
39035
  const entityName = typeof entity === "string" ? entity : resolvedEntity?.name;
38856
- const normalizedInitialData = React73__default.useMemo(() => {
39036
+ const normalizedInitialData = React74__default.useMemo(() => {
38857
39037
  const entityRowAsInitial = isPlainEntityRow(entity) ? entity : void 0;
38858
39038
  const callerInitial = initialData !== null && typeof initialData === "object" && !Array.isArray(initialData) ? initialData : {};
38859
39039
  return entityRowAsInitial !== void 0 ? { ...entityRowAsInitial, ...callerInitial } : callerInitial;
38860
39040
  }, [entity, initialData]);
38861
- const entityDerivedFields = React73__default.useMemo(() => {
39041
+ const entityDerivedFields = React74__default.useMemo(() => {
38862
39042
  if (fields && fields.length > 0) return void 0;
38863
39043
  if (!resolvedEntity) return void 0;
38864
39044
  return resolvedEntity.fields.map(
@@ -38879,16 +39059,16 @@ var init_Form = __esm({
38879
39059
  const conditionalFields = typeof conditionalFieldsRaw === "boolean" ? {} : conditionalFieldsRaw;
38880
39060
  const hiddenCalculations = typeof hiddenCalculationsRaw === "boolean" ? [] : hiddenCalculationsRaw;
38881
39061
  const violationTriggers = typeof violationTriggersRaw === "boolean" ? [] : violationTriggersRaw;
38882
- const [formData, setFormData] = React73__default.useState(
39062
+ const [formData, setFormData] = React74__default.useState(
38883
39063
  normalizedInitialData
38884
39064
  );
38885
- const [collapsedSections, setCollapsedSections] = React73__default.useState(
39065
+ const [collapsedSections, setCollapsedSections] = React74__default.useState(
38886
39066
  /* @__PURE__ */ new Set()
38887
39067
  );
38888
- const [submitError, setSubmitError] = React73__default.useState(null);
38889
- const formRef = React73__default.useRef(null);
39068
+ const [submitError, setSubmitError] = React74__default.useState(null);
39069
+ const formRef = React74__default.useRef(null);
38890
39070
  const formMode = props.mode;
38891
- const mountedRef = React73__default.useRef(false);
39071
+ const mountedRef = React74__default.useRef(false);
38892
39072
  if (!mountedRef.current) {
38893
39073
  mountedRef.current = true;
38894
39074
  debug("forms", "mount", {
@@ -38901,7 +39081,7 @@ var init_Form = __esm({
38901
39081
  });
38902
39082
  }
38903
39083
  const shouldShowCancel = showCancel ?? (fields && fields.length > 0);
38904
- const evalContext = React73__default.useMemo(
39084
+ const evalContext = React74__default.useMemo(
38905
39085
  () => ({
38906
39086
  formValues: formData,
38907
39087
  globalVariables: externalContext?.globalVariables ?? {},
@@ -38910,7 +39090,7 @@ var init_Form = __esm({
38910
39090
  }),
38911
39091
  [formData, externalContext]
38912
39092
  );
38913
- React73__default.useEffect(() => {
39093
+ React74__default.useEffect(() => {
38914
39094
  debug("forms", "initialData-sync", {
38915
39095
  mode: formMode,
38916
39096
  normalizedInitialData,
@@ -38921,7 +39101,7 @@ var init_Form = __esm({
38921
39101
  setFormData(normalizedInitialData);
38922
39102
  }
38923
39103
  }, [normalizedInitialData]);
38924
- const processCalculations = React73__default.useCallback(
39104
+ const processCalculations = React74__default.useCallback(
38925
39105
  (changedFieldId, newFormData) => {
38926
39106
  if (!hiddenCalculations.length) return;
38927
39107
  const context = {
@@ -38946,7 +39126,7 @@ var init_Form = __esm({
38946
39126
  },
38947
39127
  [hiddenCalculations, externalContext, eventBus]
38948
39128
  );
38949
- const checkViolations = React73__default.useCallback(
39129
+ const checkViolations = React74__default.useCallback(
38950
39130
  (changedFieldId, newFormData) => {
38951
39131
  if (!violationTriggers.length) return;
38952
39132
  const context = {
@@ -38984,7 +39164,7 @@ var init_Form = __esm({
38984
39164
  processCalculations(name, newFormData);
38985
39165
  checkViolations(name, newFormData);
38986
39166
  };
38987
- const isFieldVisible = React73__default.useCallback(
39167
+ const isFieldVisible = React74__default.useCallback(
38988
39168
  (fieldName) => {
38989
39169
  const condition = conditionalFields[fieldName];
38990
39170
  if (!condition) return true;
@@ -38992,7 +39172,7 @@ var init_Form = __esm({
38992
39172
  },
38993
39173
  [conditionalFields, evalContext]
38994
39174
  );
38995
- const isSectionVisible = React73__default.useCallback(
39175
+ const isSectionVisible = React74__default.useCallback(
38996
39176
  (section) => {
38997
39177
  if (!section.condition) return true;
38998
39178
  return Boolean(evaluateFormExpression(section.condition, evalContext));
@@ -39068,7 +39248,7 @@ var init_Form = __esm({
39068
39248
  eventBus.emit(`UI:${onCancel}`);
39069
39249
  }
39070
39250
  };
39071
- const renderField = React73__default.useCallback(
39251
+ const renderField = React74__default.useCallback(
39072
39252
  (field) => {
39073
39253
  const fieldName = field.name || field.field;
39074
39254
  if (!fieldName) return null;
@@ -39089,7 +39269,7 @@ var init_Form = __esm({
39089
39269
  [formData, isFieldVisible, relationsData, relationsLoading, isLoading]
39090
39270
  );
39091
39271
  const effectiveFields = entityDerivedFields ?? fields;
39092
- const normalizedFields = React73__default.useMemo(() => {
39272
+ const normalizedFields = React74__default.useMemo(() => {
39093
39273
  if (!effectiveFields || effectiveFields.length === 0) return [];
39094
39274
  return effectiveFields.map((field) => {
39095
39275
  if (typeof field === "string") {
@@ -39113,7 +39293,7 @@ var init_Form = __esm({
39113
39293
  return field;
39114
39294
  });
39115
39295
  }, [effectiveFields, resolvedEntity]);
39116
- const schemaFields = React73__default.useMemo(() => {
39296
+ const schemaFields = React74__default.useMemo(() => {
39117
39297
  if (normalizedFields.length === 0) return null;
39118
39298
  if (isDebugEnabled()) {
39119
39299
  debugGroup(`Form: ${entityName || "unknown"}`);
@@ -39123,7 +39303,7 @@ var init_Form = __esm({
39123
39303
  }
39124
39304
  return normalizedFields.map(renderField).filter(Boolean);
39125
39305
  }, [normalizedFields, renderField, entityName, conditionalFields]);
39126
- const sectionElements = React73__default.useMemo(() => {
39306
+ const sectionElements = React74__default.useMemo(() => {
39127
39307
  if (!sections || sections.length === 0) return null;
39128
39308
  return sections.map((section) => {
39129
39309
  if (!isSectionVisible(section)) {
@@ -39806,7 +39986,7 @@ var init_List = __esm({
39806
39986
  Box,
39807
39987
  {
39808
39988
  className: cn(
39809
- "h-full rounded-full transition-all duration-500",
39989
+ "h-full rounded-full transition-all duration-slow",
39810
39990
  clampedValue >= 100 ? "bg-success" : clampedValue >= 70 ? "bg-info" : clampedValue >= 40 ? "bg-warning" : "bg-muted-foreground"
39811
39991
  ),
39812
39992
  style: { width: `${clampedValue}%` }
@@ -39848,7 +40028,7 @@ var init_List = __esm({
39848
40028
  if (entity && typeof entity === "object" && "id" in entity) return [entity];
39849
40029
  return [];
39850
40030
  }, [entity]);
39851
- const getItemActions = React73__default.useCallback(
40031
+ const getItemActions = React74__default.useCallback(
39852
40032
  (item) => {
39853
40033
  if (!itemActions) return [];
39854
40034
  if (typeof itemActions === "function") {
@@ -39975,7 +40155,7 @@ var init_List = __esm({
39975
40155
  {
39976
40156
  className: cn(
39977
40157
  "group flex items-center gap-5 px-6 py-5",
39978
- "transition-all duration-300 ease-out",
40158
+ "transition-all duration-normal ease-standard",
39979
40159
  hasExplicitClick && "cursor-pointer",
39980
40160
  // Hover state
39981
40161
  "hover:bg-muted/80",
@@ -40082,7 +40262,7 @@ var init_List = __esm({
40082
40262
  variant: "ghost",
40083
40263
  action: editAction.event,
40084
40264
  className: cn(
40085
- "p-2 rounded-lg transition-all duration-200",
40265
+ "p-2 rounded-lg transition-all duration-fast",
40086
40266
  "hover:bg-primary/10 hover:text-primary",
40087
40267
  "text-muted-foreground",
40088
40268
  "active:scale-95"
@@ -40098,7 +40278,7 @@ var init_List = __esm({
40098
40278
  variant: "ghost",
40099
40279
  action: viewAction.event,
40100
40280
  className: cn(
40101
- "p-2 rounded-lg transition-all duration-200",
40281
+ "p-2 rounded-lg transition-all duration-fast",
40102
40282
  "hover:bg-muted hover:text-foreground",
40103
40283
  "text-muted-foreground",
40104
40284
  "active:scale-95"
@@ -40120,7 +40300,7 @@ var init_List = __esm({
40120
40300
  {
40121
40301
  variant: "ghost",
40122
40302
  className: cn(
40123
- "p-2 rounded-lg transition-all duration-200",
40303
+ "p-2 rounded-lg transition-all duration-fast",
40124
40304
  "hover:bg-muted hover:shadow-sm",
40125
40305
  "text-muted-foreground hover:text-foreground",
40126
40306
  "active:scale-95"
@@ -40307,8 +40487,17 @@ var init_MediaGallery = __esm({
40307
40487
  const eventBus = useEventBus();
40308
40488
  const { t } = useTranslate();
40309
40489
  const [lightboxItem, setLightboxItem] = useState(null);
40490
+ const [failedIds, setFailedIds] = useState(/* @__PURE__ */ new Set());
40310
40491
  const closeLightbox = useCallback(() => setLightboxItem(null), []);
40311
40492
  useEventListener("UI:LIGHTBOX_CLOSE", closeLightbox);
40493
+ const handleImageError = useCallback((id) => {
40494
+ setFailedIds((prev) => {
40495
+ if (prev.has(id)) return prev;
40496
+ const next = new Set(prev);
40497
+ next.add(id);
40498
+ return next;
40499
+ });
40500
+ }, []);
40312
40501
  const handleItemClick = useCallback(
40313
40502
  (item) => {
40314
40503
  if (selectable) {
@@ -40323,8 +40512,8 @@ var init_MediaGallery = __esm({
40323
40512
  [selectable, selectedItems, selectionEvent, eventBus]
40324
40513
  );
40325
40514
  const entityData = Array.isArray(entity) ? entity : [];
40326
- const items = React73__default.useMemo(() => {
40327
- if (propItems) return propItems;
40515
+ const items = React74__default.useMemo(() => {
40516
+ if (propItems && propItems.length > 0) return propItems;
40328
40517
  if (entityData.length === 0) return [];
40329
40518
  return entityData.map((record, idx) => {
40330
40519
  return {
@@ -40401,19 +40590,20 @@ var init_MediaGallery = __esm({
40401
40590
  {
40402
40591
  className: cn(
40403
40592
  "group relative overflow-hidden rounded-md cursor-pointer",
40404
- "border-2 transition-all duration-200",
40593
+ "border-2 transition-all duration-fast",
40405
40594
  isSelected ? "border-primary ring-2 ring-primary/30" : "border-transparent hover:border-border",
40406
40595
  ASPECT_CLASSES[aspectRatio]
40407
40596
  ),
40408
40597
  onClick: () => handleItemClick(item),
40409
40598
  children: [
40410
- /* @__PURE__ */ jsx(
40599
+ failedIds.has(item.id) ? /* @__PURE__ */ jsx(Box, { className: "w-full h-full flex items-center justify-center bg-muted text-muted-foreground", children: /* @__PURE__ */ jsx(Icon, { icon: Image$1, size: "lg" }) }) : /* @__PURE__ */ jsx(
40411
40600
  "img",
40412
40601
  {
40413
40602
  src: item.thumbnail || item.src,
40414
40603
  alt: item.alt || item.caption || "",
40415
40604
  className: "w-full h-full object-cover",
40416
- loading: "lazy"
40605
+ loading: "lazy",
40606
+ onError: () => handleImageError(item.id)
40417
40607
  }
40418
40608
  ),
40419
40609
  /* @__PURE__ */ jsx(
@@ -40421,14 +40611,14 @@ var init_MediaGallery = __esm({
40421
40611
  {
40422
40612
  className: cn(
40423
40613
  "absolute inset-0 bg-foreground/0 group-hover:bg-foreground/20",
40424
- "transition-colors duration-200 flex items-center justify-center"
40614
+ "transition-colors duration-fast flex items-center justify-center"
40425
40615
  ),
40426
40616
  children: /* @__PURE__ */ jsx(
40427
40617
  Icon,
40428
40618
  {
40429
40619
  icon: ZoomIn,
40430
40620
  size: "md",
40431
- className: "text-white opacity-0 group-hover:opacity-100 transition-opacity duration-200"
40621
+ className: "text-white opacity-0 group-hover:opacity-100 transition-opacity duration-fast"
40432
40622
  }
40433
40623
  )
40434
40624
  }
@@ -40486,7 +40676,7 @@ var init_MediaGallery = __esm({
40486
40676
  }
40487
40677
  });
40488
40678
  function extractTitle2(children) {
40489
- if (!React73__default.isValidElement(children)) return void 0;
40679
+ if (!React74__default.isValidElement(children)) return void 0;
40490
40680
  const props = children.props;
40491
40681
  if (typeof props.title === "string") {
40492
40682
  return props.title;
@@ -40741,7 +40931,7 @@ var init_debugRegistry = __esm({
40741
40931
  }
40742
40932
  });
40743
40933
  function useDebugData() {
40744
- const [data, setData] = React73.useState(() => ({
40934
+ const [data, setData] = React74.useState(() => ({
40745
40935
  traits: [],
40746
40936
  ticks: [],
40747
40937
  guards: [],
@@ -40755,7 +40945,7 @@ function useDebugData() {
40755
40945
  },
40756
40946
  lastUpdate: Date.now()
40757
40947
  }));
40758
- React73.useEffect(() => {
40948
+ React74.useEffect(() => {
40759
40949
  const updateData = () => {
40760
40950
  setData({
40761
40951
  traits: getAllTraits(),
@@ -40864,12 +41054,12 @@ function layoutGraph(states, transitions, initialState, width, height) {
40864
41054
  return positions;
40865
41055
  }
40866
41056
  function WalkMinimap() {
40867
- const [walkStep, setWalkStep] = React73.useState(null);
40868
- const [traits2, setTraits] = React73.useState([]);
40869
- const [coveredEdges, setCoveredEdges] = React73.useState([]);
40870
- const [completedTraits, setCompletedTraits] = React73.useState(/* @__PURE__ */ new Set());
40871
- const prevTraitRef = React73.useRef(null);
40872
- React73.useEffect(() => {
41057
+ const [walkStep, setWalkStep] = React74.useState(null);
41058
+ const [traits2, setTraits] = React74.useState([]);
41059
+ const [coveredEdges, setCoveredEdges] = React74.useState([]);
41060
+ const [completedTraits, setCompletedTraits] = React74.useState(/* @__PURE__ */ new Set());
41061
+ const prevTraitRef = React74.useRef(null);
41062
+ React74.useEffect(() => {
40873
41063
  const interval = setInterval(() => {
40874
41064
  const w = window;
40875
41065
  const step = w.__orbitalWalkStep;
@@ -41305,15 +41495,15 @@ var init_EntitiesTab = __esm({
41305
41495
  });
41306
41496
  function EventFlowTab({ events: events2 }) {
41307
41497
  const { t } = useTranslate();
41308
- const [filter, setFilter] = React73.useState("all");
41309
- const containerRef = React73.useRef(null);
41310
- const [autoScroll, setAutoScroll] = React73.useState(true);
41311
- React73.useEffect(() => {
41498
+ const [filter, setFilter] = React74.useState("all");
41499
+ const containerRef = React74.useRef(null);
41500
+ const [autoScroll, setAutoScroll] = React74.useState(true);
41501
+ React74.useEffect(() => {
41312
41502
  if (autoScroll && containerRef.current) {
41313
41503
  containerRef.current.scrollTop = containerRef.current.scrollHeight;
41314
41504
  }
41315
41505
  }, [events2.length, autoScroll]);
41316
- const filteredEvents = React73.useMemo(() => {
41506
+ const filteredEvents = React74.useMemo(() => {
41317
41507
  if (filter === "all") return events2;
41318
41508
  return events2.filter((e) => e.type === filter);
41319
41509
  }, [events2, filter]);
@@ -41429,7 +41619,7 @@ var init_EventFlowTab = __esm({
41429
41619
  });
41430
41620
  function GuardsPanel({ guards }) {
41431
41621
  const { t } = useTranslate();
41432
- const [filter, setFilter] = React73.useState("all");
41622
+ const [filter, setFilter] = React74.useState("all");
41433
41623
  if (guards.length === 0) {
41434
41624
  return /* @__PURE__ */ jsx(
41435
41625
  EmptyState,
@@ -41442,7 +41632,7 @@ function GuardsPanel({ guards }) {
41442
41632
  }
41443
41633
  const passedCount = guards.filter((g) => g.result).length;
41444
41634
  const failedCount = guards.length - passedCount;
41445
- const filteredGuards = React73.useMemo(() => {
41635
+ const filteredGuards = React74.useMemo(() => {
41446
41636
  if (filter === "all") return guards;
41447
41637
  if (filter === "passed") return guards.filter((g) => g.result);
41448
41638
  return guards.filter((g) => !g.result);
@@ -41605,10 +41795,10 @@ function EffectBadge({ effect }) {
41605
41795
  }
41606
41796
  function TransitionTimeline({ transitions }) {
41607
41797
  const { t } = useTranslate();
41608
- const containerRef = React73.useRef(null);
41609
- const [autoScroll, setAutoScroll] = React73.useState(true);
41610
- const [expandedId, setExpandedId] = React73.useState(null);
41611
- React73.useEffect(() => {
41798
+ const containerRef = React74.useRef(null);
41799
+ const [autoScroll, setAutoScroll] = React74.useState(true);
41800
+ const [expandedId, setExpandedId] = React74.useState(null);
41801
+ React74.useEffect(() => {
41612
41802
  if (autoScroll && containerRef.current) {
41613
41803
  containerRef.current.scrollTop = containerRef.current.scrollHeight;
41614
41804
  }
@@ -41888,9 +42078,9 @@ function getAllEvents(traits2) {
41888
42078
  function EventDispatcherTab({ traits: traits2, schema }) {
41889
42079
  const eventBus = useEventBus();
41890
42080
  const { t } = useTranslate();
41891
- const [log19, setLog] = React73.useState([]);
41892
- const prevStatesRef = React73.useRef(/* @__PURE__ */ new Map());
41893
- React73.useEffect(() => {
42081
+ const [log19, setLog] = React74.useState([]);
42082
+ const prevStatesRef = React74.useRef(/* @__PURE__ */ new Map());
42083
+ React74.useEffect(() => {
41894
42084
  for (const trait of traits2) {
41895
42085
  const prev = prevStatesRef.current.get(trait.id);
41896
42086
  if (prev && prev !== trait.currentState) {
@@ -42059,10 +42249,10 @@ function VerifyModePanel({
42059
42249
  localCount
42060
42250
  }) {
42061
42251
  const { t } = useTranslate();
42062
- const [expanded, setExpanded] = React73.useState(true);
42063
- const scrollRef = React73.useRef(null);
42064
- const prevCountRef = React73.useRef(0);
42065
- React73.useEffect(() => {
42252
+ const [expanded, setExpanded] = React74.useState(true);
42253
+ const scrollRef = React74.useRef(null);
42254
+ const prevCountRef = React74.useRef(0);
42255
+ React74.useEffect(() => {
42066
42256
  if (expanded && transitions.length > prevCountRef.current && scrollRef.current) {
42067
42257
  scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
42068
42258
  }
@@ -42119,10 +42309,10 @@ function RuntimeDebugger({
42119
42309
  schema
42120
42310
  }) {
42121
42311
  const { t } = useTranslate();
42122
- const [isCollapsed, setIsCollapsed] = React73.useState(mode === "verify" ? true : defaultCollapsed);
42123
- const [isVisible, setIsVisible] = React73.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
42312
+ const [isCollapsed, setIsCollapsed] = React74.useState(mode === "verify" ? true : defaultCollapsed);
42313
+ const [isVisible, setIsVisible] = React74.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
42124
42314
  const debugData = useDebugData();
42125
- React73.useEffect(() => {
42315
+ React74.useEffect(() => {
42126
42316
  if (mode === "inline") return;
42127
42317
  return onDebugToggle((enabled) => {
42128
42318
  setIsVisible(enabled);
@@ -42131,7 +42321,7 @@ function RuntimeDebugger({
42131
42321
  }
42132
42322
  });
42133
42323
  }, [mode]);
42134
- React73.useEffect(() => {
42324
+ React74.useEffect(() => {
42135
42325
  if (mode === "inline") return;
42136
42326
  const handleKeyDown = (e) => {
42137
42327
  if (e.key === "`" && isVisible) {
@@ -42651,7 +42841,7 @@ var init_StatCard = __esm({
42651
42841
  const labelToUse = propLabel ?? propTitle;
42652
42842
  const eventBus = useEventBus();
42653
42843
  const { t } = useTranslate();
42654
- const handleActionClick = React73__default.useCallback(() => {
42844
+ const handleActionClick = React74__default.useCallback(() => {
42655
42845
  if (action?.event) {
42656
42846
  eventBus.emit(`UI:${action.event}`, {});
42657
42847
  }
@@ -42662,7 +42852,7 @@ var init_StatCard = __esm({
42662
42852
  const data = Array.isArray(entity) ? entity : entity ? [entity] : [];
42663
42853
  const isLoading = externalLoading ?? false;
42664
42854
  const error = externalError;
42665
- const computeMetricValue = React73__default.useCallback(
42855
+ const computeMetricValue = React74__default.useCallback(
42666
42856
  (metric, items) => {
42667
42857
  if (metric.value !== void 0) {
42668
42858
  return metric.value;
@@ -42701,7 +42891,7 @@ var init_StatCard = __esm({
42701
42891
  },
42702
42892
  []
42703
42893
  );
42704
- const schemaStats = React73__default.useMemo(() => {
42894
+ const schemaStats = React74__default.useMemo(() => {
42705
42895
  if (!metrics || metrics.length === 0) return null;
42706
42896
  return metrics.map((metric) => ({
42707
42897
  label: metric.label,
@@ -42709,7 +42899,7 @@ var init_StatCard = __esm({
42709
42899
  format: metric.format
42710
42900
  }));
42711
42901
  }, [metrics, data, computeMetricValue]);
42712
- const calculatedTrend = React73__default.useMemo(() => {
42902
+ const calculatedTrend = React74__default.useMemo(() => {
42713
42903
  if (manualTrend !== void 0) return manualTrend;
42714
42904
  if (previousValue === void 0 || currentValue2 === void 0)
42715
42905
  return void 0;
@@ -43349,8 +43539,8 @@ var init_SubagentTracePanel = __esm({
43349
43539
  ] });
43350
43540
  };
43351
43541
  InlineActivityStream = ({ activities, autoScroll = true, className }) => {
43352
- const endRef = React73__default.useRef(null);
43353
- React73__default.useEffect(() => {
43542
+ const endRef = React74__default.useRef(null);
43543
+ React74__default.useEffect(() => {
43354
43544
  if (!autoScroll) return;
43355
43545
  endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" });
43356
43546
  }, [activities.length, autoScroll]);
@@ -43444,7 +43634,7 @@ var init_SubagentTracePanel = __esm({
43444
43634
  };
43445
43635
  SubagentRichCard = ({ subagent }) => {
43446
43636
  const { t } = useTranslate();
43447
- const activities = React73__default.useMemo(
43637
+ const activities = React74__default.useMemo(
43448
43638
  () => subagentMessagesToActivities(subagent.messages),
43449
43639
  [subagent.messages]
43450
43640
  );
@@ -43521,8 +43711,8 @@ var init_SubagentTracePanel = __esm({
43521
43711
  ] });
43522
43712
  };
43523
43713
  CoordinatorConversation = ({ messages, autoScroll = true, className }) => {
43524
- const endRef = React73__default.useRef(null);
43525
- React73__default.useEffect(() => {
43714
+ const endRef = React74__default.useRef(null);
43715
+ React74__default.useEffect(() => {
43526
43716
  if (!autoScroll) return;
43527
43717
  endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" });
43528
43718
  }, [messages.length, autoScroll]);
@@ -43901,6 +44091,11 @@ var init_TeamOrganism = __esm({
43901
44091
  TeamOrganism.displayName = "TeamOrganism";
43902
44092
  }
43903
44093
  });
44094
+ function formatDate4(value) {
44095
+ const d = new Date(value);
44096
+ if (isNaN(d.getTime())) return value;
44097
+ return d.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
44098
+ }
43904
44099
  var lookStyles10, STATUS_STYLES2, Timeline;
43905
44100
  var init_Timeline = __esm({
43906
44101
  "components/core/organisms/Timeline.tsx"() {
@@ -43952,7 +44147,7 @@ var init_Timeline = __esm({
43952
44147
  }) => {
43953
44148
  const { t } = useTranslate();
43954
44149
  const entityData = entity ?? [];
43955
- const items = React73__default.useMemo(() => {
44150
+ const items = React74__default.useMemo(() => {
43956
44151
  if (propItems) return propItems;
43957
44152
  if (entityData.length === 0) return [];
43958
44153
  return entityData.map((record, idx) => {
@@ -44028,7 +44223,7 @@ var init_Timeline = __esm({
44028
44223
  /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: cn("flex-1 min-w-0", !isLast && "pb-6"), children: [
44029
44224
  /* @__PURE__ */ jsxs(HStack, { justify: "between", align: "start", wrap: true, children: [
44030
44225
  /* @__PURE__ */ jsx(Typography, { variant: "body", weight: "semibold", children: item.title }),
44031
- item.date && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "flex-shrink-0", children: item.date })
44226
+ item.date && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "flex-shrink-0", children: formatDate4(item.date) })
44032
44227
  ] }),
44033
44228
  item.description && /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", children: item.description }),
44034
44229
  item.tags && item.tags.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "xs", wrap: true, children: item.tags.map((tag, tagIdx) => /* @__PURE__ */ jsx(Badge, { variant: "default", children: tag }, tagIdx)) }),
@@ -44054,7 +44249,7 @@ var init_Timeline = __esm({
44054
44249
  }
44055
44250
  });
44056
44251
  function extractToastProps(children) {
44057
- if (!React73__default.isValidElement(children)) {
44252
+ if (!React74__default.isValidElement(children)) {
44058
44253
  if (typeof children === "string") {
44059
44254
  return { message: children };
44060
44255
  }
@@ -44096,7 +44291,7 @@ var init_ToastSlot = __esm({
44096
44291
  eventBus.emit(`${prefix}CLOSE`);
44097
44292
  };
44098
44293
  if (!isVisible) return null;
44099
- const isCustomContent = React73__default.isValidElement(children) && !message;
44294
+ const isCustomContent = React74__default.isValidElement(children) && !message;
44100
44295
  return /* @__PURE__ */ jsx(Box, { className: "fixed bottom-4 right-4 z-50", children: isCustomContent ? children : /* @__PURE__ */ jsx(
44101
44296
  Toast,
44102
44297
  {
@@ -44144,6 +44339,7 @@ var init_component_registry_generated = __esm({
44144
44339
  init_LayoutPatterns();
44145
44340
  init_BranchingLogicBuilder();
44146
44341
  init_Breadcrumb();
44342
+ init_ButtonGroup();
44147
44343
  init_CTABanner();
44148
44344
  init_CalendarGrid();
44149
44345
  init_Canvas();
@@ -44214,8 +44410,8 @@ var init_component_registry_generated = __esm({
44214
44410
  init_FlipContainer();
44215
44411
  init_FloatingActionButton();
44216
44412
  init_Form();
44217
- init_FormSection();
44218
44413
  init_FormField();
44414
+ init_FormSection();
44219
44415
  init_FormSectionHeader();
44220
44416
  init_GameAudioToggle();
44221
44417
  init_GameHud();
@@ -44401,6 +44597,7 @@ var init_component_registry_generated = __esm({
44401
44597
  "BranchingLogicBuilder": BranchingLogicBuilder,
44402
44598
  "Breadcrumb": Breadcrumb,
44403
44599
  "Button": ButtonPattern,
44600
+ "ButtonGroup": ButtonGroup,
44404
44601
  "ButtonPattern": ButtonPattern,
44405
44602
  "CTABanner": CTABanner,
44406
44603
  "CalendarGrid": CalendarGrid,
@@ -44474,7 +44671,6 @@ var init_component_registry_generated = __esm({
44474
44671
  "FlipContainer": FlipContainer,
44475
44672
  "FloatingActionButton": FloatingActionButton,
44476
44673
  "Form": Form,
44477
- "FormActions": FormActions,
44478
44674
  "FormField": FormField,
44479
44675
  "FormLayout": FormLayout,
44480
44676
  "FormSectionHeader": FormSectionHeader,
@@ -44654,7 +44850,7 @@ function SuspenseConfigProvider({
44654
44850
  config,
44655
44851
  children
44656
44852
  }) {
44657
- return React73__default.createElement(
44853
+ return React74__default.createElement(
44658
44854
  SuspenseConfigContext.Provider,
44659
44855
  { value: config },
44660
44856
  children
@@ -44696,7 +44892,7 @@ function enrichFormFields(fields, entityDef) {
44696
44892
  }
44697
44893
  return { name: field, label: field.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/\b\w/g, (c) => c.toUpperCase()) };
44698
44894
  }
44699
- if (field && typeof field === "object" && !Array.isArray(field) && !React73__default.isValidElement(field) && !(field instanceof Date)) {
44895
+ if (field && typeof field === "object" && !Array.isArray(field) && !React74__default.isValidElement(field) && !(field instanceof Date)) {
44700
44896
  const obj = field;
44701
44897
  const fieldName = typeof obj.name === "string" ? obj.name : typeof obj.field === "string" ? obj.field : void 0;
44702
44898
  if (!fieldName) return field;
@@ -45149,7 +45345,7 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
45149
45345
  const key = `${parentId}-${index}-trait:${traitName}`;
45150
45346
  return /* @__PURE__ */ jsx(TraitFrame, { traitName }, key);
45151
45347
  }
45152
- return /* @__PURE__ */ jsx(React73__default.Fragment, { children: child }, `${parentId}-${index}`);
45348
+ return /* @__PURE__ */ jsx(React74__default.Fragment, { children: child }, `${parentId}-${index}`);
45153
45349
  }
45154
45350
  if (!child || typeof child !== "object") return null;
45155
45351
  const childId = `${parentId}-${index}`;
@@ -45202,14 +45398,14 @@ function isPatternConfig(value) {
45202
45398
  if (value === null || value === void 0) return false;
45203
45399
  if (typeof value !== "object") return false;
45204
45400
  if (Array.isArray(value)) return false;
45205
- if (React73__default.isValidElement(value)) return false;
45401
+ if (React74__default.isValidElement(value)) return false;
45206
45402
  if (value instanceof Date) return false;
45207
45403
  if (typeof value === "function") return false;
45208
45404
  const record = value;
45209
45405
  return "type" in record && typeof record.type === "string" && getComponentForPattern$1(record.type) !== null;
45210
45406
  }
45211
45407
  function isPlainConfigObject(value) {
45212
- if (React73__default.isValidElement(value)) return false;
45408
+ if (React74__default.isValidElement(value)) return false;
45213
45409
  if (value instanceof Date) return false;
45214
45410
  const proto = Object.getPrototypeOf(value);
45215
45411
  return proto === Object.prototype || proto === null;
@@ -45240,7 +45436,7 @@ function substituteTraitRefsDeep(value, pathKey) {
45240
45436
  }
45241
45437
  return value;
45242
45438
  }
45243
- function renderPatternProps(props, onDismiss) {
45439
+ function renderPatternProps(props, onDismiss, propsSchema) {
45244
45440
  const rendered = {};
45245
45441
  for (const [key, value] of Object.entries(props)) {
45246
45442
  if (key === "children") {
@@ -45258,9 +45454,10 @@ function renderPatternProps(props, onDismiss) {
45258
45454
  };
45259
45455
  rendered[key] = /* @__PURE__ */ jsx(SlotContentRenderer, { content: childContent, onDismiss });
45260
45456
  } else if (Array.isArray(value)) {
45457
+ const isDataArray = propsSchema?.[key]?.items?.types?.includes("object") ?? false;
45261
45458
  rendered[key] = value.map((item, i) => {
45262
45459
  const el = item;
45263
- if (isPatternConfig(el)) {
45460
+ if (!isDataArray && isPatternConfig(el)) {
45264
45461
  const nestedProps = {};
45265
45462
  for (const [k, v] of Object.entries(el)) {
45266
45463
  if (k !== "type") nestedProps[k] = v;
@@ -45336,7 +45533,7 @@ function SlotContentRenderer({
45336
45533
  for (const slotKey of CONTENT_NODE_SLOTS) {
45337
45534
  const slotVal = restProps[slotKey];
45338
45535
  if (slotVal === void 0 || slotVal === null) continue;
45339
- if (React73__default.isValidElement(slotVal) || typeof slotVal === "string" || typeof slotVal === "number" || typeof slotVal === "boolean") continue;
45536
+ if (React74__default.isValidElement(slotVal) || typeof slotVal === "string" || typeof slotVal === "number" || typeof slotVal === "boolean") continue;
45340
45537
  if (Array.isArray(slotVal) || typeof slotVal === "object" && "type" in slotVal) {
45341
45538
  nodeSlotOverrides[slotKey] = renderPatternChildren(
45342
45539
  slotVal,
@@ -45348,14 +45545,15 @@ function SlotContentRenderer({
45348
45545
  );
45349
45546
  }
45350
45547
  }
45351
- const renderedProps = renderPatternProps(restProps, onDismiss);
45352
45548
  const patternDef = getPatternDefinition$1(content.pattern);
45353
45549
  const propsSchema = patternDef?.propsSchema;
45550
+ const renderedProps = renderPatternProps(restProps, onDismiss, propsSchema);
45354
45551
  if (propsSchema) {
45355
45552
  for (const [propKey, propValue] of Object.entries(renderedProps)) {
45356
45553
  if (typeof propValue !== "string") continue;
45357
45554
  const propDef = propsSchema[propKey];
45358
45555
  if (!propDef || propDef.kind !== "callback") continue;
45556
+ if (propValue === "") continue;
45359
45557
  renderedProps[propKey] = wrapCallbackForEvent(
45360
45558
  `UI:${propValue}`,
45361
45559
  propDef.callbackArgs,
@@ -45388,7 +45586,7 @@ function SlotContentRenderer({
45388
45586
  const resolvedItems = Array.isArray(entityVal) && entityVal[0] !== "fn" ? entityVal : null;
45389
45587
  if (resolvedItems && resolvedItems.length > 0 && !finalProps.fields && !finalProps.columns) {
45390
45588
  const sample = resolvedItems[0];
45391
- if (sample && typeof sample === "object" && !Array.isArray(sample) && !React73__default.isValidElement(sample) && !(sample instanceof Date)) {
45589
+ if (sample && typeof sample === "object" && !Array.isArray(sample) && !React74__default.isValidElement(sample) && !(sample instanceof Date)) {
45392
45590
  const keys = Object.keys(sample).filter((k) => k !== "id" && k !== "_id");
45393
45591
  finalProps.fields = keys.map((k, i) => ({ name: k, variant: i === 0 ? "h4" : "body" }));
45394
45592
  }
@@ -45667,6 +45865,7 @@ var init_atoms = __esm({
45667
45865
  init_Typography();
45668
45866
  init_ThemeToggle();
45669
45867
  init_Overlay();
45868
+ init_Presence();
45670
45869
  init_FlipContainer();
45671
45870
  init_Dialog();
45672
45871
  init_Aside();
@@ -47144,6 +47343,16 @@ function useSharedEntityStore() {
47144
47343
  }
47145
47344
  return storeRef.current;
47146
47345
  }
47346
+ var SharedEntityStoreContext = createContext(null);
47347
+ function useSharedEntityStoreContext() {
47348
+ const store = useContext(SharedEntityStoreContext);
47349
+ if (!store) {
47350
+ throw new Error(
47351
+ "useSharedEntityStoreContext: no SharedEntityStoreContext.Provider found in the component tree"
47352
+ );
47353
+ }
47354
+ return store;
47355
+ }
47147
47356
  function useSharedEntitySnapshot(store, entityId) {
47148
47357
  return useSyncExternalStore(
47149
47358
  (onStoreChange) => store.subscribe(entityId, onStoreChange),
@@ -48023,4 +48232,4 @@ function useGitHubBranches(owner, repo, enabled = true) {
48023
48232
  });
48024
48233
  }
48025
48234
 
48026
- export { ALL_PRESETS, ALMADAR_DND_MIME, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, Card2 as ActionCard, ActionPalette, ActionTile, ActivationBlock, Alert, AlgorithmCanvas, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AtlasImage, AtlasPanel, AuthLayout, Avatar, Badge, BehaviorView, BiologyCanvas, BloomQuizBlock, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, Button, ButtonGroup, CTABanner, CalendarGrid, Canvas, Canvas2D, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, Center, Chart, ChartLegend, ChatBar, Checkbox, ChemistryCanvas, ChoiceButton, Coachmark, CodeBlock, CodeRunnerPanel, CollapsibleSection, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ContentSection, ControlButton, ControlGrid, CounterTemplate, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DEFAULT_SLOTS, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DetailPanel, Dialog, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EntityDisplayEvents, ErrorBoundary, ErrorState, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioToggle, GameHud, GameIcon, GameMenu, GameShell, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HeroOrganism, HeroSection, I18nProvider, IDENTITY_BOOK_FIELDS, Icon, IconPicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, LearningCanvas, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MathCanvas, MatrixQuestion, MediaGallery, Menu, Meter, Modal, ModalSlot, ModuleCard, Navigation, NodeSlotEditor, NotifyListener, NumberStepper, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, Pagination, PatternTile, PhysicsCanvas, Popover, PositionedCanvas, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuizBlock, Radio, RangeSlider, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, RichBlockEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreDisplay, SearchInput, Section, SectionHeader, SegmentRenderer, Select, SequenceBar, ServiceCatalog, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateGraph, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StepFlow, StepFlowOrganism, SubagentTracePanel, SvgBranch, SvgConnection, SvgFlow, SvgGrid, SvgLobe, SvgMesh, SvgMorph, SvgNode, SvgPulse, SvgRing, SvgShield, SvgStack, SwipeableRow, Switch, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, TableView, Tabs, TagCloud, TagInput, TeamCard, TeamOrganism, TerrainPalette, TextHighlight, Textarea, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UploadDropZone, VStack, VersionDiff, ViolationAlert, VoteStack, WizardContainer, WizardNavigation, WizardProgress, boardEntity, bool, calculateAttackTargets, calculateValidMoves, cn, createInitialGameState, createSharedEntityStore, createTranslate, createUnitAnimationState, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, makeAsset, makeAssetMap, mapBookData, num, objAvailableActions, objAvailableEvents, objCurrentState, objIcon, objId, objMaxRules, objName, objRules, objStates, parseEditFocus, parseLessonSegments, parseMarkdownWithCodeBlocks, parseQueryBinding, pendulum, projectileMotion, resolveFieldMap, resolveFrame, resolveSheetDirection, rows, runTickFrame, screenToIso, springOscillator, str, tickAnimationState, toCodeLanguage, transitionAnimation, unitHealth, unitPosition, unitTeam, useAgentChat, useAnchorRect, useAtlasSliceDataUrl, useAuthContext, useCamera, useCanvasGestures, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useEmitEvent, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGameAudio, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useImageCache, useInfiniteScroll, useLongPress, useOrbitalHistory, usePreview, usePullToRefresh, useQuerySingleton, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSwipeGesture, useTapReveal, useTraitListens, useTranslate115 as useTranslate, useUIEvents, useUISlotManager, useUnitSpriteAtlas, useValidation, vec2 };
48235
+ export { ALL_PRESETS, ALMADAR_DND_MIME, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, Card2 as ActionCard, ActionPalette, ActionTile, ActivationBlock, Alert, AlgorithmCanvas, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AtlasImage, AtlasPanel, AuthLayout, Avatar, Badge, BehaviorView, BiologyCanvas, BloomQuizBlock, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, Button, ButtonGroup, CTABanner, CalendarGrid, Canvas, Canvas2D, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, Center, Chart, ChartLegend, ChatBar, Checkbox, ChemistryCanvas, ChoiceButton, Coachmark, CodeBlock, CodeRunnerPanel, CollapsibleSection, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ContentSection, ControlButton, ControlGrid, CounterTemplate, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DEFAULT_SLOTS, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DetailPanel, Dialog, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EntityDisplayEvents, ErrorBoundary, ErrorState, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioToggle, GameHud, GameIcon, GameMenu, GameShell, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HeroOrganism, HeroSection, I18nProvider, IDENTITY_BOOK_FIELDS, Icon, IconPicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, LearningCanvas, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MathCanvas, MatrixQuestion, MediaGallery, Menu, Meter, Modal, ModalSlot, ModuleCard, Navigation, NodeSlotEditor, NotifyListener, NumberStepper, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, PageTransition, Pagination, PatternTile, PhysicsCanvas, Popover, PositionedCanvas, Presence, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuizBlock, Radio, RangeSlider, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, RichBlockEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreDisplay, SearchInput, Section, SectionHeader, SegmentRenderer, Select, SequenceBar, ServiceCatalog, SharedEntityStoreContext, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateGraph, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StepFlow, StepFlowOrganism, SubagentTracePanel, SvgBranch, SvgConnection, SvgFlow, SvgGrid, SvgLobe, SvgMesh, SvgMorph, SvgNode, SvgPulse, SvgRing, SvgShield, SvgStack, SwipeableRow, Switch, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, TableView, Tabs, TagCloud, TagInput, TeamCard, TeamOrganism, TerrainPalette, TextHighlight, Textarea, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UploadDropZone, VStack, VersionDiff, ViolationAlert, VoteStack, WizardContainer, WizardNavigation, WizardProgress, boardEntity, bool, calculateAttackTargets, calculateValidMoves, cn, createInitialGameState, createSharedEntityStore, createTranslate, createUnitAnimationState, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, makeAsset, makeAssetMap, mapBookData, num, objAvailableActions, objAvailableEvents, objCurrentState, objIcon, objId, objMaxRules, objName, objRules, objStates, parseEditFocus, parseLessonSegments, parseMarkdownWithCodeBlocks, parseQueryBinding, pendulum, projectileMotion, resolveFieldMap, resolveFrame, resolveSheetDirection, rows, runTickFrame, screenToIso, springOscillator, str, tickAnimationState, toCodeLanguage, transitionAnimation, unitHealth, unitPosition, unitTeam, useAgentChat, useAnchorRect, useAtlasSliceDataUrl, useAuthContext, useCamera, useCanvasGestures, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useEmitEvent, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGameAudio, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useImageCache, useInfiniteScroll, useLongPress, useOrbitalHistory, usePresence, usePreview, usePullToRefresh, useQuerySingleton, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSharedEntityStoreContext, useSwipeGesture, useTapReveal, useTraitListens, useTranslate115 as useTranslate, useUIEvents, useUISlotManager, useUnitSpriteAtlas, useValidation, vec2 };