@almadar/ui 5.65.0 → 5.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/avl/index.cjs +3259 -1568
  2. package/dist/avl/index.d.cts +10 -2
  3. package/dist/avl/index.d.ts +1 -0
  4. package/dist/avl/index.js +1992 -302
  5. package/dist/components/avl/derive-edit-focus.d.ts +8 -0
  6. package/dist/components/core/organisms/ChatBar.d.ts +31 -0
  7. package/dist/components/core/organisms/SubagentTracePanel.d.ts +50 -0
  8. package/dist/components/core/organisms/index.d.ts +3 -0
  9. package/dist/components/core/organisms/trace-edit-focus.d.ts +14 -0
  10. package/dist/components/game/atoms/ChoiceButton.d.ts +7 -1
  11. package/dist/components/game/molecules/HealthPanel.d.ts +3 -0
  12. package/dist/components/game/molecules/IsometricCanvas.d.ts +1 -1
  13. package/dist/components/game/molecules/PowerupSlots.d.ts +3 -0
  14. package/dist/components/game/molecules/TurnPanel.d.ts +3 -0
  15. package/dist/components/game/molecules/three/index.cjs +6 -6
  16. package/dist/components/game/molecules/three/index.js +6 -6
  17. package/dist/components/game/organisms/BoardgameBoard.d.ts +37 -0
  18. package/dist/components/game/organisms/FishingBoard.d.ts +33 -0
  19. package/dist/components/game/organisms/HolidayRunnerBoard.d.ts +35 -0
  20. package/dist/components/game/organisms/MatchPuzzleBoard.d.ts +37 -0
  21. package/dist/components/game/organisms/MinigolfBoard.d.ts +37 -0
  22. package/dist/components/game/organisms/PinballBoard.d.ts +35 -0
  23. package/dist/components/game/organisms/PirateBoard.d.ts +37 -0
  24. package/dist/components/game/organisms/RacingBoard.d.ts +29 -0
  25. package/dist/components/game/organisms/SokobanBoard.d.ts +37 -0
  26. package/dist/components/game/organisms/SpaceShmupBoard.d.ts +20 -0
  27. package/dist/components/game/organisms/SpaceStationBoard.d.ts +37 -0
  28. package/dist/components/game/organisms/SportsBoard.d.ts +37 -0
  29. package/dist/components/game/organisms/TanksBoard.d.ts +37 -0
  30. package/dist/components/game/organisms/index.d.ts +13 -0
  31. package/dist/components/game/organisms/utils/isometric.d.ts +10 -1
  32. package/dist/components/index.cjs +3096 -1377
  33. package/dist/components/index.js +1970 -266
  34. package/dist/hooks/index.cjs +94 -0
  35. package/dist/hooks/index.d.ts +1 -0
  36. package/dist/hooks/index.js +95 -2
  37. package/dist/hooks/useAgentTrace.d.ts +85 -0
  38. package/dist/providers/index.cjs +3037 -1351
  39. package/dist/providers/index.js +1937 -251
  40. package/dist/runtime/index.cjs +3095 -1409
  41. package/dist/runtime/index.js +1943 -257
  42. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import * as React79 from 'react';
3
- import React79__default, { useContext, useMemo, useRef, useEffect, useCallback, useState, Suspense, lazy, createContext, useLayoutEffect, useId, forwardRef, useImperativeHandle, useSyncExternalStore, Component } from 'react';
2
+ import * as React80 from 'react';
3
+ import React80__default, { useContext, useMemo, useRef, useEffect, useCallback, useState, Suspense, lazy, createContext, useLayoutEffect, useId, forwardRef, useImperativeHandle, useSyncExternalStore, Component } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { EventBusContext, useTraitScope, TraitScopeProvider } from '@almadar/ui/providers';
@@ -49,7 +49,7 @@ import { GLTFLoader as GLTFLoader$1 } from 'three/examples/jsm/loaders/GLTFLoade
49
49
  import { clone } from 'three/examples/jsm/utils/SkeletonUtils';
50
50
  import { Canvas, useLoader, useFrame, useThree } from '@react-three/fiber';
51
51
  import { Billboard, Grid as Grid$1, OrbitControls } from '@react-three/drei';
52
- import { getPatternDefinition as getPatternDefinition$1, getComponentForPattern as getComponentForPattern$1 } from '@almadar/patterns';
52
+ import { getPatternDefinition as getPatternDefinition$1, getComponentForPattern } from '@almadar/patterns';
53
53
 
54
54
  var __defProp = Object.defineProperty;
55
55
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -234,7 +234,7 @@ var init_SvgFlow = __esm({
234
234
  width = 100,
235
235
  height = 100
236
236
  }) => {
237
- const markerId = React79__default.useMemo(() => {
237
+ const markerId = React80__default.useMemo(() => {
238
238
  flowIdCounter += 1;
239
239
  return `almadar-flow-arrow-${flowIdCounter}`;
240
240
  }, []);
@@ -827,7 +827,7 @@ var init_SvgRing = __esm({
827
827
  width = 100,
828
828
  height = 100
829
829
  }) => {
830
- const gradientId = React79__default.useMemo(() => {
830
+ const gradientId = React80__default.useMemo(() => {
831
831
  ringIdCounter += 1;
832
832
  return `almadar-ring-glow-${ringIdCounter}`;
833
833
  }, []);
@@ -1239,7 +1239,7 @@ function loadLib(key, importer) {
1239
1239
  return p2;
1240
1240
  }
1241
1241
  function lazyFamilyIcon(libKey, importer, pick, fallbackName, family) {
1242
- const Lazy = React79__default.lazy(async () => {
1242
+ const Lazy = React80__default.lazy(async () => {
1243
1243
  const lib = await loadLib(libKey, importer);
1244
1244
  const Comp = pick(lib);
1245
1245
  if (!Comp) {
@@ -1249,7 +1249,7 @@ function lazyFamilyIcon(libKey, importer, pick, fallbackName, family) {
1249
1249
  return { default: Comp };
1250
1250
  });
1251
1251
  const Wrapped = (props) => /* @__PURE__ */ jsx(
1252
- React79__default.Suspense,
1252
+ React80__default.Suspense,
1253
1253
  {
1254
1254
  fallback: /* @__PURE__ */ jsx(
1255
1255
  "span",
@@ -1975,7 +1975,7 @@ var init_Icon = __esm({
1975
1975
  const directIcon = typeof icon === "string" ? void 0 : icon;
1976
1976
  const effectiveName = typeof icon === "string" ? icon : name;
1977
1977
  const family = useIconFamily();
1978
- const RenderedComponent = React79__default.useMemo(() => {
1978
+ const RenderedComponent = React80__default.useMemo(() => {
1979
1979
  if (directIcon) return null;
1980
1980
  return effectiveName ? resolveIconForFamily(effectiveName, family) : null;
1981
1981
  }, [directIcon, effectiveName, family]);
@@ -2034,7 +2034,7 @@ function resolveIconProp(value, sizeClass) {
2034
2034
  const IconComp = value;
2035
2035
  return /* @__PURE__ */ jsx(IconComp, { className: sizeClass });
2036
2036
  }
2037
- if (React79__default.isValidElement(value)) {
2037
+ if (React80__default.isValidElement(value)) {
2038
2038
  return value;
2039
2039
  }
2040
2040
  if (typeof value === "object" && value !== null && "render" in value) {
@@ -2110,7 +2110,7 @@ var init_Button = __esm({
2110
2110
  md: "h-icon-default w-icon-default",
2111
2111
  lg: "h-icon-default w-icon-default"
2112
2112
  };
2113
- Button = React79__default.forwardRef(
2113
+ Button = React80__default.forwardRef(
2114
2114
  ({
2115
2115
  className,
2116
2116
  variant = "primary",
@@ -2177,7 +2177,7 @@ var init_Input = __esm({
2177
2177
  init_cn();
2178
2178
  init_Icon();
2179
2179
  init_useEventBus();
2180
- Input = React79__default.forwardRef(
2180
+ Input = React80__default.forwardRef(
2181
2181
  ({
2182
2182
  className,
2183
2183
  inputType,
@@ -2337,7 +2337,7 @@ var Label;
2337
2337
  var init_Label = __esm({
2338
2338
  "components/core/atoms/Label.tsx"() {
2339
2339
  init_cn();
2340
- Label = React79__default.forwardRef(
2340
+ Label = React80__default.forwardRef(
2341
2341
  ({ className, required, children, ...props }, ref) => {
2342
2342
  return /* @__PURE__ */ jsxs(
2343
2343
  "label",
@@ -2364,7 +2364,7 @@ var init_Textarea = __esm({
2364
2364
  "components/core/atoms/Textarea.tsx"() {
2365
2365
  init_cn();
2366
2366
  init_useEventBus();
2367
- Textarea = React79__default.forwardRef(
2367
+ Textarea = React80__default.forwardRef(
2368
2368
  ({ className, error, onChange, ...props }, ref) => {
2369
2369
  const eventBus = useEventBus();
2370
2370
  const handleChange = (e) => {
@@ -2603,7 +2603,7 @@ var init_Select = __esm({
2603
2603
  init_cn();
2604
2604
  init_Icon();
2605
2605
  init_useEventBus();
2606
- Select = React79__default.forwardRef(
2606
+ Select = React80__default.forwardRef(
2607
2607
  (props, _ref) => {
2608
2608
  const { multiple, searchable, clearable } = props;
2609
2609
  if (multiple || searchable || clearable) {
@@ -2620,7 +2620,7 @@ var init_Checkbox = __esm({
2620
2620
  "components/core/atoms/Checkbox.tsx"() {
2621
2621
  init_cn();
2622
2622
  init_useEventBus();
2623
- Checkbox = React79__default.forwardRef(
2623
+ Checkbox = React80__default.forwardRef(
2624
2624
  ({ className, label, id, onChange, ...props }, ref) => {
2625
2625
  const inputId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;
2626
2626
  const eventBus = useEventBus();
@@ -2674,7 +2674,7 @@ var init_Spinner = __esm({
2674
2674
  md: "h-6 w-6",
2675
2675
  lg: "h-8 w-8"
2676
2676
  };
2677
- Spinner = React79__default.forwardRef(
2677
+ Spinner = React80__default.forwardRef(
2678
2678
  ({ className, size = "md", overlay, ...props }, ref) => {
2679
2679
  if (overlay) {
2680
2680
  return /* @__PURE__ */ jsx(
@@ -2764,7 +2764,7 @@ var init_Card = __esm({
2764
2764
  chip: "shadow-none rounded-pill border-[length:var(--border-width)] border-border",
2765
2765
  "tile-image-first": "p-0 overflow-hidden"
2766
2766
  };
2767
- Card = React79__default.forwardRef(
2767
+ Card = React80__default.forwardRef(
2768
2768
  ({
2769
2769
  className,
2770
2770
  variant = "bordered",
@@ -2812,9 +2812,9 @@ var init_Card = __esm({
2812
2812
  }
2813
2813
  );
2814
2814
  Card.displayName = "Card";
2815
- CardHeader = React79__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("mb-4", className), ...props }));
2815
+ CardHeader = React80__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("mb-4", className), ...props }));
2816
2816
  CardHeader.displayName = "CardHeader";
2817
- CardTitle = React79__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2817
+ CardTitle = React80__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2818
2818
  "h3",
2819
2819
  {
2820
2820
  ref,
@@ -2827,11 +2827,11 @@ var init_Card = __esm({
2827
2827
  }
2828
2828
  ));
2829
2829
  CardTitle.displayName = "CardTitle";
2830
- CardContent = React79__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("", className), ...props }));
2830
+ CardContent = React80__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("", className), ...props }));
2831
2831
  CardContent.displayName = "CardContent";
2832
2832
  CardBody = CardContent;
2833
2833
  CardBody.displayName = "CardBody";
2834
- CardFooter = React79__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2834
+ CardFooter = React80__default.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2835
2835
  "div",
2836
2836
  {
2837
2837
  ref,
@@ -2884,7 +2884,7 @@ var init_Badge = __esm({
2884
2884
  md: "px-2.5 py-1 text-sm",
2885
2885
  lg: "px-3 py-1.5 text-base"
2886
2886
  };
2887
- Badge = React79__default.forwardRef(
2887
+ Badge = React80__default.forwardRef(
2888
2888
  ({ className, variant = "default", size = "sm", amount, label, icon, children, onRemove, removeLabel, ...props }, ref) => {
2889
2889
  const iconSizes3 = {
2890
2890
  sm: "h-icon-default w-icon-default",
@@ -2977,7 +2977,7 @@ var init_FilterPill = __esm({
2977
2977
  md: "w-3.5 h-3.5",
2978
2978
  lg: "w-4 h-4"
2979
2979
  };
2980
- FilterPill = React79__default.forwardRef(
2980
+ FilterPill = React80__default.forwardRef(
2981
2981
  ({
2982
2982
  className,
2983
2983
  variant = "default",
@@ -3106,8 +3106,8 @@ var init_Avatar = __esm({
3106
3106
  actionPayload
3107
3107
  }) => {
3108
3108
  const eventBus = useEventBus();
3109
- const [imgFailed, setImgFailed] = React79__default.useState(false);
3110
- React79__default.useEffect(() => {
3109
+ const [imgFailed, setImgFailed] = React80__default.useState(false);
3110
+ React80__default.useEffect(() => {
3111
3111
  setImgFailed(false);
3112
3112
  }, [src]);
3113
3113
  const initials = providedInitials ?? (name ? generateInitials(name) : void 0);
@@ -3359,7 +3359,7 @@ var init_Box = __esm({
3359
3359
  fixed: "fixed",
3360
3360
  sticky: "sticky"
3361
3361
  };
3362
- Box = React79__default.forwardRef(
3362
+ Box = React80__default.forwardRef(
3363
3363
  ({
3364
3364
  padding,
3365
3365
  paddingX,
@@ -3424,7 +3424,7 @@ var init_Box = __esm({
3424
3424
  onPointerDown?.(e);
3425
3425
  }, [hoverEvent, tapReveal, triggerProps, onPointerDown]);
3426
3426
  const isClickable = action || onClick;
3427
- return React79__default.createElement(
3427
+ return React80__default.createElement(
3428
3428
  Component2,
3429
3429
  {
3430
3430
  ref,
@@ -3750,7 +3750,7 @@ var init_Radio = __esm({
3750
3750
  md: "w-2.5 h-2.5",
3751
3751
  lg: "w-3 h-3"
3752
3752
  };
3753
- Radio = React79__default.forwardRef(
3753
+ Radio = React80__default.forwardRef(
3754
3754
  ({
3755
3755
  label,
3756
3756
  helperText,
@@ -3767,12 +3767,12 @@ var init_Radio = __esm({
3767
3767
  onChange,
3768
3768
  ...props
3769
3769
  }, ref) => {
3770
- const reactId = React79__default.useId();
3770
+ const reactId = React80__default.useId();
3771
3771
  const baseId = id || `radio-${reactId}`;
3772
3772
  const hasError = !!error;
3773
3773
  const eventBus = useEventBus();
3774
- const [selected, setSelected] = React79__default.useState(value);
3775
- React79__default.useEffect(() => {
3774
+ const [selected, setSelected] = React80__default.useState(value);
3775
+ React80__default.useEffect(() => {
3776
3776
  if (value !== void 0) setSelected(value);
3777
3777
  }, [value]);
3778
3778
  const pick = (next, e) => {
@@ -3954,7 +3954,7 @@ var init_Switch = __esm({
3954
3954
  "components/core/atoms/Switch.tsx"() {
3955
3955
  "use client";
3956
3956
  init_cn();
3957
- Switch = React79.forwardRef(
3957
+ Switch = React80.forwardRef(
3958
3958
  ({
3959
3959
  checked,
3960
3960
  defaultChecked = false,
@@ -3965,10 +3965,10 @@ var init_Switch = __esm({
3965
3965
  name,
3966
3966
  className
3967
3967
  }, ref) => {
3968
- const [isChecked, setIsChecked] = React79.useState(
3968
+ const [isChecked, setIsChecked] = React80.useState(
3969
3969
  checked !== void 0 ? checked : defaultChecked
3970
3970
  );
3971
- React79.useEffect(() => {
3971
+ React80.useEffect(() => {
3972
3972
  if (checked !== void 0) {
3973
3973
  setIsChecked(checked);
3974
3974
  }
@@ -4625,7 +4625,7 @@ var Dialog;
4625
4625
  var init_Dialog = __esm({
4626
4626
  "components/core/atoms/Dialog.tsx"() {
4627
4627
  init_cn();
4628
- Dialog = React79__default.forwardRef(
4628
+ Dialog = React80__default.forwardRef(
4629
4629
  ({
4630
4630
  role = "dialog",
4631
4631
  "aria-modal": ariaModal = true,
@@ -4651,7 +4651,7 @@ var Aside;
4651
4651
  var init_Aside = __esm({
4652
4652
  "components/core/atoms/Aside.tsx"() {
4653
4653
  init_cn();
4654
- Aside = React79__default.forwardRef(
4654
+ Aside = React80__default.forwardRef(
4655
4655
  ({ className, children, ...rest }, ref) => /* @__PURE__ */ jsx("aside", { ref, className: cn(className), ...rest, children })
4656
4656
  );
4657
4657
  Aside.displayName = "Aside";
@@ -4730,9 +4730,9 @@ var init_LawReferenceTooltip = __esm({
4730
4730
  className
4731
4731
  }) => {
4732
4732
  const { t } = useTranslate();
4733
- const [isVisible, setIsVisible] = React79__default.useState(false);
4734
- const timeoutRef = React79__default.useRef(null);
4735
- const triggerRef = React79__default.useRef(null);
4733
+ const [isVisible, setIsVisible] = React80__default.useState(false);
4734
+ const timeoutRef = React80__default.useRef(null);
4735
+ const triggerRef = React80__default.useRef(null);
4736
4736
  const handleMouseEnter = () => {
4737
4737
  if (timeoutRef.current) clearTimeout(timeoutRef.current);
4738
4738
  timeoutRef.current = setTimeout(() => setIsVisible(true), 200);
@@ -4743,7 +4743,7 @@ var init_LawReferenceTooltip = __esm({
4743
4743
  };
4744
4744
  const { revealed, triggerProps } = useTapReveal({ refs: [triggerRef] });
4745
4745
  const open = isVisible || revealed;
4746
- React79__default.useEffect(() => {
4746
+ React80__default.useEffect(() => {
4747
4747
  return () => {
4748
4748
  if (timeoutRef.current) clearTimeout(timeoutRef.current);
4749
4749
  };
@@ -4955,7 +4955,7 @@ var init_StatusDot = __esm({
4955
4955
  md: "w-2.5 h-2.5",
4956
4956
  lg: "w-3 h-3"
4957
4957
  };
4958
- StatusDot = React79__default.forwardRef(
4958
+ StatusDot = React80__default.forwardRef(
4959
4959
  ({ className, status = "offline", pulse = false, size = "md", label, ...props }, ref) => {
4960
4960
  return /* @__PURE__ */ jsx(
4961
4961
  "span",
@@ -5009,7 +5009,7 @@ var init_TrendIndicator = __esm({
5009
5009
  down: "trending-down",
5010
5010
  flat: "arrow-right"
5011
5011
  };
5012
- TrendIndicator = React79__default.forwardRef(
5012
+ TrendIndicator = React80__default.forwardRef(
5013
5013
  ({
5014
5014
  className,
5015
5015
  value,
@@ -5076,7 +5076,7 @@ var init_RangeSlider = __esm({
5076
5076
  md: "w-4 h-4",
5077
5077
  lg: "w-5 h-5"
5078
5078
  };
5079
- RangeSlider = React79__default.forwardRef(
5079
+ RangeSlider = React80__default.forwardRef(
5080
5080
  ({
5081
5081
  className,
5082
5082
  min = 0,
@@ -5672,7 +5672,7 @@ var init_ContentSection = __esm({
5672
5672
  md: "py-16",
5673
5673
  lg: "py-24"
5674
5674
  };
5675
- ContentSection = React79__default.forwardRef(
5675
+ ContentSection = React80__default.forwardRef(
5676
5676
  ({ children, background = "default", padding = "lg", id, className }, ref) => {
5677
5677
  return /* @__PURE__ */ jsx(
5678
5678
  Box,
@@ -6206,7 +6206,7 @@ var init_AnimatedReveal = __esm({
6206
6206
  "scale-up": { opacity: 1, transform: "scale(1) translateY(0)" },
6207
6207
  "none": {}
6208
6208
  };
6209
- AnimatedReveal = React79__default.forwardRef(
6209
+ AnimatedReveal = React80__default.forwardRef(
6210
6210
  ({
6211
6211
  trigger = "scroll",
6212
6212
  animation = "fade-up",
@@ -6366,7 +6366,7 @@ var init_AnimatedGraphic = __esm({
6366
6366
  "components/marketing/atoms/AnimatedGraphic.tsx"() {
6367
6367
  "use client";
6368
6368
  init_cn();
6369
- AnimatedGraphic = React79__default.forwardRef(
6369
+ AnimatedGraphic = React80__default.forwardRef(
6370
6370
  ({
6371
6371
  src,
6372
6372
  svgContent,
@@ -6389,7 +6389,7 @@ var init_AnimatedGraphic = __esm({
6389
6389
  const fetchedSvg = useFetchedSvg(svgContent ? void 0 : src);
6390
6390
  const resolvedSvg = svgContent ?? fetchedSvg;
6391
6391
  const prevAnimateRef = useRef(animate);
6392
- const setRef = React79__default.useCallback(
6392
+ const setRef = React80__default.useCallback(
6393
6393
  (node) => {
6394
6394
  containerRef.current = node;
6395
6395
  if (typeof ref === "function") ref(node);
@@ -7071,7 +7071,7 @@ var init_ErrorBoundary = __esm({
7071
7071
  }
7072
7072
  );
7073
7073
  };
7074
- ErrorBoundary = class extends React79__default.Component {
7074
+ ErrorBoundary = class extends React80__default.Component {
7075
7075
  constructor(props) {
7076
7076
  super(props);
7077
7077
  __publicField(this, "reset", () => {
@@ -8191,9 +8191,9 @@ function ControlButton({
8191
8191
  className
8192
8192
  }) {
8193
8193
  const eventBus = useEventBus();
8194
- const [isPressed, setIsPressed] = React79.useState(false);
8194
+ const [isPressed, setIsPressed] = React80.useState(false);
8195
8195
  const actualPressed = pressed ?? isPressed;
8196
- const handlePointerDown = React79.useCallback(
8196
+ const handlePointerDown = React80.useCallback(
8197
8197
  (e) => {
8198
8198
  e.preventDefault();
8199
8199
  if (disabled) return;
@@ -8203,7 +8203,7 @@ function ControlButton({
8203
8203
  },
8204
8204
  [disabled, pressEvent, eventBus, onPress]
8205
8205
  );
8206
- const handlePointerUp = React79.useCallback(
8206
+ const handlePointerUp = React80.useCallback(
8207
8207
  (e) => {
8208
8208
  e.preventDefault();
8209
8209
  if (disabled) return;
@@ -8213,7 +8213,7 @@ function ControlButton({
8213
8213
  },
8214
8214
  [disabled, releaseEvent, eventBus, onRelease]
8215
8215
  );
8216
- const handlePointerLeave = React79.useCallback(
8216
+ const handlePointerLeave = React80.useCallback(
8217
8217
  (e) => {
8218
8218
  if (isPressed) {
8219
8219
  setIsPressed(false);
@@ -8301,8 +8301,8 @@ function ActionButtons({
8301
8301
  disabled
8302
8302
  }) {
8303
8303
  const eventBus = useEventBus();
8304
- const [activeButtons, setActiveButtons] = React79.useState(/* @__PURE__ */ new Set());
8305
- const handlePress = React79.useCallback(
8304
+ const [activeButtons, setActiveButtons] = React80.useState(/* @__PURE__ */ new Set());
8305
+ const handlePress = React80.useCallback(
8306
8306
  (id) => {
8307
8307
  setActiveButtons((prev) => new Set(prev).add(id));
8308
8308
  if (actionEvent) eventBus.emit(`UI:${actionEvent}`, { id, pressed: true });
@@ -8310,7 +8310,7 @@ function ActionButtons({
8310
8310
  },
8311
8311
  [actionEvent, eventBus, onAction]
8312
8312
  );
8313
- const handleRelease = React79.useCallback(
8313
+ const handleRelease = React80.useCallback(
8314
8314
  (id) => {
8315
8315
  setActiveButtons((prev) => {
8316
8316
  const next = new Set(prev);
@@ -9885,6 +9885,11 @@ function isoToScreen(tileX, tileY, scale, baseOffsetX, layout = "isometric") {
9885
9885
  const screenY2 = tileY * (scaledFloorHeight * 0.75);
9886
9886
  return { x: screenX2, y: screenY2 };
9887
9887
  }
9888
+ if (layout === "flat") {
9889
+ const screenX2 = tileX * scaledTileWidth + baseOffsetX;
9890
+ const screenY2 = tileY * scaledFloorHeight;
9891
+ return { x: screenX2, y: screenY2 };
9892
+ }
9888
9893
  const screenX = (tileX - tileY) * (scaledTileWidth / 2) + baseOffsetX;
9889
9894
  const screenY = (tileX + tileY) * (scaledFloorHeight / 2);
9890
9895
  return { x: screenX, y: screenY };
@@ -9897,6 +9902,11 @@ function screenToIso(screenX, screenY, scale, baseOffsetX, layout = "isometric")
9897
9902
  const col = Math.round((screenX - (row & 1) * (scaledTileWidth / 2) - baseOffsetX) / scaledTileWidth);
9898
9903
  return { x: col, y: row };
9899
9904
  }
9905
+ if (layout === "flat") {
9906
+ const col = Math.round((screenX - baseOffsetX) / scaledTileWidth);
9907
+ const row = Math.round(screenY / scaledFloorHeight);
9908
+ return { x: col, y: row };
9909
+ }
9900
9910
  const adjustedX = screenX - baseOffsetX;
9901
9911
  const tileX = (adjustedX / (scaledTileWidth / 2) + screenY / (scaledFloorHeight / 2)) / 2;
9902
9912
  const tileY = (screenY / (scaledFloorHeight / 2) - adjustedX / (scaledTileWidth / 2)) / 2;
@@ -10016,7 +10026,7 @@ function IsometricCanvas({
10016
10026
  );
10017
10027
  const sortedTiles = useMemo(() => {
10018
10028
  const tiles = [...tilesProp];
10019
- if (tileLayout === "hex") {
10029
+ if (tileLayout === "hex" || tileLayout === "flat") {
10020
10030
  tiles.sort((a, b) => a.y !== b.y ? a.y - b.y : a.x - b.x);
10021
10031
  } else {
10022
10032
  tiles.sort((a, b) => {
@@ -10144,7 +10154,8 @@ function IsometricCanvas({
10144
10154
  const minX = Math.min(...allScreenPos.map((p2) => p2.x));
10145
10155
  const maxX = Math.max(...allScreenPos.map((p2) => p2.x + scaledTileWidth));
10146
10156
  const minY = Math.min(...allScreenPos.map((p2) => p2.y));
10147
- const maxY = Math.max(...allScreenPos.map((p2) => p2.y + scaledTileHeight));
10157
+ const tileBottomExtent = tileLayout === "hex" || tileLayout === "flat" ? scaledTileWidth : scaledTileHeight;
10158
+ const maxY = Math.max(...allScreenPos.map((p2) => p2.y + tileBottomExtent));
10148
10159
  const worldW = maxX - minX;
10149
10160
  const worldH = maxY - minY;
10150
10161
  const scaleM = Math.min(mW / worldW, mH / worldH) * 0.9;
@@ -10236,7 +10247,7 @@ function IsometricCanvas({
10236
10247
  const drawW = scaledTileWidth;
10237
10248
  const drawH = scaledTileWidth * (img.naturalHeight / img.naturalWidth);
10238
10249
  const drawX = pos.x;
10239
- const drawY = pos.y + scaledTileHeight - drawH;
10250
+ const drawY = tileLayout === "hex" || tileLayout === "flat" ? pos.y : pos.y + scaledTileHeight - drawH;
10240
10251
  ctx.drawImage(img, drawX, drawY, drawW, drawH);
10241
10252
  }
10242
10253
  } else {
@@ -10303,7 +10314,7 @@ function IsometricCanvas({
10303
10314
  }
10304
10315
  }
10305
10316
  const sortedFeatures = [...features].sort((a, b) => {
10306
- if (tileLayout === "hex") return a.y !== b.y ? a.y - b.y : a.x - b.x;
10317
+ if (tileLayout === "hex" || tileLayout === "flat") return a.y !== b.y ? a.y - b.y : a.x - b.x;
10307
10318
  const depthA = a.x + a.y;
10308
10319
  const depthB = b.x + b.y;
10309
10320
  return depthA !== depthB ? depthA - depthB : a.y - b.y;
@@ -10344,7 +10355,7 @@ function IsometricCanvas({
10344
10355
  }
10345
10356
  const unitsWithPosition = units.filter((u) => !!u.position);
10346
10357
  const sortedUnits = [...unitsWithPosition].sort((a, b) => {
10347
- if (tileLayout === "hex") return a.position.y !== b.position.y ? a.position.y - b.position.y : a.position.x - b.position.x;
10358
+ if (tileLayout === "hex" || tileLayout === "flat") return a.position.y !== b.position.y ? a.position.y - b.position.y : a.position.x - b.position.x;
10348
10359
  const depthA = a.position.x + a.position.y;
10349
10360
  const depthB = b.position.x + b.position.y;
10350
10361
  return depthA !== depthB ? depthA - depthB : a.position.y - b.position.y;
@@ -12519,7 +12530,7 @@ var init_CodeBlock = __esm({
12519
12530
  };
12520
12531
  LINE_PROPS_FN = (n) => ({ "data-line": String(n - 1) });
12521
12532
  HIDDEN_LINE_NUMBERS = { display: "none" };
12522
- CodeBlock = React79__default.memo(
12533
+ CodeBlock = React80__default.memo(
12523
12534
  ({
12524
12535
  code: rawCode,
12525
12536
  language = "text",
@@ -13106,7 +13117,7 @@ var init_MarkdownContent = __esm({
13106
13117
  init_Box();
13107
13118
  init_CodeBlock();
13108
13119
  init_cn();
13109
- MarkdownContent = React79__default.memo(
13120
+ MarkdownContent = React80__default.memo(
13110
13121
  ({ content, direction = "ltr", className }) => {
13111
13122
  const { t: _t } = useTranslate();
13112
13123
  const safeContent = typeof content === "string" ? content : String(content ?? "");
@@ -13396,6 +13407,48 @@ var init_BloomQuizBlock = __esm({
13396
13407
  BloomQuizBlock.displayName = "BloomQuizBlock";
13397
13408
  }
13398
13409
  });
13410
+ function BoardgameBoard({
13411
+ tiles,
13412
+ units,
13413
+ features,
13414
+ assetManifest,
13415
+ assetBaseUrl,
13416
+ scale = 0.45,
13417
+ showMinimap = false,
13418
+ enableCamera = true,
13419
+ tileClickEvent,
13420
+ unitClickEvent,
13421
+ isLoading,
13422
+ error,
13423
+ className
13424
+ }) {
13425
+ return /* @__PURE__ */ jsx("div", { className: cn("boardgame-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
13426
+ IsometricCanvas_default,
13427
+ {
13428
+ tileLayout: "flat",
13429
+ tiles,
13430
+ units,
13431
+ features,
13432
+ assetManifest,
13433
+ assetBaseUrl,
13434
+ scale,
13435
+ showMinimap,
13436
+ enableCamera,
13437
+ tileClickEvent,
13438
+ unitClickEvent,
13439
+ isLoading,
13440
+ error
13441
+ }
13442
+ ) });
13443
+ }
13444
+ var init_BoardgameBoard = __esm({
13445
+ "components/game/organisms/BoardgameBoard.tsx"() {
13446
+ "use client";
13447
+ init_cn();
13448
+ init_IsometricCanvas();
13449
+ BoardgameBoard.displayName = "BoardgameBoard";
13450
+ }
13451
+ });
13399
13452
  var MIN_DIAGRAM_WIDTH, ScaledDiagram;
13400
13453
  var init_ScaledDiagram = __esm({
13401
13454
  "components/core/molecules/ScaledDiagram.tsx"() {
@@ -14433,7 +14486,7 @@ var init_StateMachineView = __esm({
14433
14486
  style: { top: title ? 30 : 0 },
14434
14487
  children: [
14435
14488
  entity && /* @__PURE__ */ jsx(EntityBox, { entity, config }),
14436
- states.map((state) => renderStateNode ? /* @__PURE__ */ jsx(React79__default.Fragment, { children: renderStateNode(state, config) }, state.id) : /* @__PURE__ */ jsx(
14489
+ states.map((state) => renderStateNode ? /* @__PURE__ */ jsx(React80__default.Fragment, { children: renderStateNode(state, config) }, state.id) : /* @__PURE__ */ jsx(
14437
14490
  StateNode,
14438
14491
  {
14439
14492
  state,
@@ -18388,7 +18441,7 @@ function CardHand({
18388
18441
  className
18389
18442
  }) {
18390
18443
  const eventBus = useEventBus();
18391
- const handleClick = React79.useCallback(
18444
+ const handleClick = React80.useCallback(
18392
18445
  (card) => {
18393
18446
  if (card.disabled) return;
18394
18447
  onCardClick?.(card.id);
@@ -20534,9 +20587,220 @@ var init_ChartLegend = __esm({
20534
20587
  ChartLegend.displayName = "ChartLegend";
20535
20588
  }
20536
20589
  });
20590
+
20591
+ // components/core/organisms/trace-edit-focus.ts
20592
+ function asString(v) {
20593
+ return typeof v === "string" ? v : void 0;
20594
+ }
20595
+ function asLevel(v) {
20596
+ if (typeof v === "string" && EDIT_FOCUS_LEVELS.has(v)) {
20597
+ return v;
20598
+ }
20599
+ return "node";
20600
+ }
20601
+ function isEventPayload(v) {
20602
+ return v !== null && v !== void 0 && typeof v === "object" && !Array.isArray(v) && !(v instanceof Date);
20603
+ }
20604
+ function parseEditFocus(value) {
20605
+ if (!isEventPayload(value)) return null;
20606
+ const payload = value;
20607
+ const orbital = asString(payload.orbital);
20608
+ if (orbital === void 0 || orbital.length === 0) return null;
20609
+ const focus = {
20610
+ level: asLevel(payload.level),
20611
+ orbital,
20612
+ label: asString(payload.label) ?? orbital
20613
+ };
20614
+ const trait = asString(payload.trait);
20615
+ if (trait !== void 0) focus.trait = trait;
20616
+ const transition = asString(payload.transition);
20617
+ if (transition !== void 0) focus.transition = transition;
20618
+ const state = asString(payload.state);
20619
+ if (state !== void 0) focus.state = state;
20620
+ const slot = asString(payload.slot);
20621
+ if (slot !== void 0) focus.slot = slot;
20622
+ const path = asString(payload.path);
20623
+ if (path !== void 0) focus.path = path;
20624
+ const patternType = asString(payload.patternType);
20625
+ if (patternType !== void 0) focus.patternType = patternType;
20626
+ const entity = asString(payload.entity);
20627
+ if (entity !== void 0) focus.entity = entity;
20628
+ const source = asString(payload.source);
20629
+ if (source !== void 0) focus.source = source;
20630
+ return focus;
20631
+ }
20632
+ var ELEMENT_SELECTED_EVENT, EDIT_FOCUS_LEVELS;
20633
+ var init_trace_edit_focus = __esm({
20634
+ "components/core/organisms/trace-edit-focus.ts"() {
20635
+ ELEMENT_SELECTED_EVENT = "UI:ELEMENT_SELECTED";
20636
+ EDIT_FOCUS_LEVELS = /* @__PURE__ */ new Set([
20637
+ "node",
20638
+ "slot",
20639
+ "field",
20640
+ "effect",
20641
+ "trait",
20642
+ "page",
20643
+ "orbital"
20644
+ ]);
20645
+ }
20646
+ });
20647
+ function getJepaBadgeVariant(probability) {
20648
+ if (probability >= 0.9) return "success";
20649
+ if (probability >= 0.5) return "warning";
20650
+ return "danger";
20651
+ }
20652
+ function ChatBar({
20653
+ status = "idle",
20654
+ activeGate,
20655
+ jepaValidity,
20656
+ placeholder,
20657
+ context,
20658
+ className
20659
+ }) {
20660
+ const { t } = useTranslate();
20661
+ const eventBus = useEventBus();
20662
+ const [inputValue, setInputValue] = useState("");
20663
+ const [focus, setFocus] = useState(null);
20664
+ const clearFocus = useCallback(() => {
20665
+ setFocus(null);
20666
+ eventBus.emit(ELEMENT_SELECTED_EVENT, { focus: null });
20667
+ }, [eventBus]);
20668
+ const handleKeyDown = useCallback((e) => {
20669
+ if (e.key !== "Enter" || e.shiftKey) return;
20670
+ const trimmed = inputValue.trim();
20671
+ if (!trimmed) return;
20672
+ e.preventDefault();
20673
+ eventBus.emit("UI:CHAT_SEND", { message: trimmed });
20674
+ }, [inputValue, eventBus]);
20675
+ useEffect(() => {
20676
+ const unsubSend = eventBus.on("UI:CHAT_SEND", () => {
20677
+ setInputValue("");
20678
+ setFocus(null);
20679
+ });
20680
+ const unsubSelect = eventBus.on(ELEMENT_SELECTED_EVENT, (e) => {
20681
+ setFocus(parseEditFocus(e.payload?.focus));
20682
+ });
20683
+ return () => {
20684
+ unsubSend();
20685
+ unsubSelect();
20686
+ };
20687
+ }, [eventBus]);
20688
+ const trailingAction = status === "error" ? /* @__PURE__ */ jsxs(Button, { variant: "secondary", size: "sm", action: "RETRY_GENERATION", className: "rounded-none flex-shrink-0 h-auto", children: [
20689
+ /* @__PURE__ */ jsx(Icon, { name: "refresh-cw", size: "xs" }),
20690
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", children: t("openFile.retry") })
20691
+ ] }) : status === "running" ? /* @__PURE__ */ jsxs(Fragment, { children: [
20692
+ /* @__PURE__ */ jsx(
20693
+ Button,
20694
+ {
20695
+ variant: "ghost",
20696
+ size: "sm",
20697
+ action: "PAUSE",
20698
+ title: t("chatBar.pauseTheAgentYouCanEdit"),
20699
+ className: "rounded-none flex-shrink-0 h-auto",
20700
+ children: /* @__PURE__ */ jsx(Icon, { name: "pause", size: "xs" })
20701
+ }
20702
+ ),
20703
+ /* @__PURE__ */ jsx(
20704
+ Button,
20705
+ {
20706
+ variant: "ghost",
20707
+ size: "sm",
20708
+ action: "STOP",
20709
+ title: t("chatBar.cancelGeneration"),
20710
+ className: "rounded-none flex-shrink-0 h-auto border-l border-[var(--color-border)]",
20711
+ children: /* @__PURE__ */ jsx(Icon, { name: "square", size: "xs" })
20712
+ }
20713
+ )
20714
+ ] }) : status === "paused" ? /* @__PURE__ */ jsxs(
20715
+ Button,
20716
+ {
20717
+ variant: "primary",
20718
+ size: "sm",
20719
+ action: "RESUME",
20720
+ title: t("chatBar.resumeTheAgentYourCanvasEdits"),
20721
+ className: "rounded-none flex-shrink-0 h-auto",
20722
+ children: [
20723
+ /* @__PURE__ */ jsx(Icon, { name: "play", size: "xs" }),
20724
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", children: t("chatBar.resume") })
20725
+ ]
20726
+ }
20727
+ ) : /* @__PURE__ */ jsx(
20728
+ Button,
20729
+ {
20730
+ variant: "primary",
20731
+ size: "sm",
20732
+ action: "CHAT_SEND",
20733
+ actionPayload: { message: inputValue.trim() },
20734
+ disabled: !inputValue.trim(),
20735
+ "aria-label": t("chatBar.sendMessage"),
20736
+ className: "rounded-none flex-shrink-0 h-auto",
20737
+ children: /* @__PURE__ */ jsx(Icon, { name: "send", size: "xs" })
20738
+ }
20739
+ );
20740
+ return /* @__PURE__ */ jsxs(Box, { className: `border-t border-[var(--color-border)] bg-[var(--color-card)] ${className ?? ""}`, children: [
20741
+ focus && /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "items-center px-4 pt-2", children: /* @__PURE__ */ jsxs(Badge, { variant: "secondary", size: "sm", className: "flex items-center gap-1 max-w-full", children: [
20742
+ /* @__PURE__ */ jsx(Icon, { name: "mouse-pointer-2", size: "xs" }),
20743
+ /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "text-inherit truncate", children: [
20744
+ t("chatBar.editing"),
20745
+ ": ",
20746
+ focus.label
20747
+ ] }),
20748
+ /* @__PURE__ */ jsx(
20749
+ Box,
20750
+ {
20751
+ onClick: clearFocus,
20752
+ title: t("chatBar.clearSelection"),
20753
+ className: "cursor-pointer flex items-center ml-1 hover:opacity-70",
20754
+ children: /* @__PURE__ */ jsx(Icon, { name: "x", size: "xs" })
20755
+ }
20756
+ )
20757
+ ] }) }),
20758
+ /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "items-center px-4 py-2", children: [
20759
+ context && /* @__PURE__ */ jsx(Badge, { variant: "primary", size: "sm", className: "whitespace-nowrap flex-shrink-0", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-inherit", children: context }) }),
20760
+ /* @__PURE__ */ jsxs(Box, { className: "flex-1 min-w-0 flex items-stretch rounded-[var(--radius-md)] border border-[var(--color-border)] bg-[var(--color-background)] focus-within:border-[var(--color-primary)] overflow-hidden", children: [
20761
+ /* @__PURE__ */ jsx(
20762
+ Textarea,
20763
+ {
20764
+ value: inputValue,
20765
+ placeholder: placeholder ?? t("chatBar.askTheAgentAnything"),
20766
+ onChange: (e) => setInputValue(e.target.value),
20767
+ onKeyDown: handleKeyDown,
20768
+ rows: 1,
20769
+ className: "flex-1 min-w-0 min-h-0 text-sm border-0 rounded-none shadow-none bg-transparent resize-none focus:ring-0"
20770
+ }
20771
+ ),
20772
+ trailingAction
20773
+ ] }),
20774
+ (activeGate || jepaValidity !== void 0) && /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center flex-shrink-0", children: [
20775
+ activeGate && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "whitespace-nowrap", children: activeGate }),
20776
+ jepaValidity !== void 0 && /* @__PURE__ */ jsx(Badge, { variant: getJepaBadgeVariant(jepaValidity), size: "sm", children: /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "text-inherit", children: [
20777
+ (jepaValidity * 100).toFixed(1),
20778
+ "%"
20779
+ ] }) })
20780
+ ] })
20781
+ ] })
20782
+ ] });
20783
+ }
20784
+ var init_ChatBar = __esm({
20785
+ "components/core/organisms/ChatBar.tsx"() {
20786
+ "use client";
20787
+ init_Box();
20788
+ init_Stack();
20789
+ init_Typography();
20790
+ init_Button();
20791
+ init_Badge();
20792
+ init_Icon();
20793
+ init_Textarea();
20794
+ init_useEventBus();
20795
+ init_trace_edit_focus();
20796
+ ChatBar.displayName = "ChatBar";
20797
+ }
20798
+ });
20537
20799
  function ChoiceButton({
20538
20800
  text = "Charge forward into the fray",
20539
20801
  index,
20802
+ assetUrl,
20803
+ icon,
20540
20804
  disabled = false,
20541
20805
  selected = false,
20542
20806
  onClick,
@@ -20569,6 +20833,23 @@ function ChoiceButton({
20569
20833
  ]
20570
20834
  }
20571
20835
  ),
20836
+ assetUrl ? /* @__PURE__ */ jsx(
20837
+ "img",
20838
+ {
20839
+ src: assetUrl,
20840
+ alt: "",
20841
+ width: 16,
20842
+ height: 16,
20843
+ style: { imageRendering: "pixelated", objectFit: "contain" },
20844
+ className: "flex-shrink-0"
20845
+ }
20846
+ ) : icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0 text-sm", children: typeof icon === "string" ? (() => {
20847
+ const I = resolveIcon(icon);
20848
+ return I ? /* @__PURE__ */ jsx(I, { className: "w-4 h-4" }) : null;
20849
+ })() : /* @__PURE__ */ (() => {
20850
+ const I = icon;
20851
+ return /* @__PURE__ */ jsx(I, { className: "w-4 h-4" });
20852
+ })() }) : null,
20572
20853
  /* @__PURE__ */ jsx("span", { className: "text-sm leading-snug", children: text })
20573
20854
  ]
20574
20855
  }
@@ -20577,6 +20858,7 @@ function ChoiceButton({
20577
20858
  var init_ChoiceButton = __esm({
20578
20859
  "components/game/atoms/ChoiceButton.tsx"() {
20579
20860
  init_cn();
20861
+ init_Icon();
20580
20862
  ChoiceButton.displayName = "ChoiceButton";
20581
20863
  }
20582
20864
  });
@@ -21867,7 +22149,7 @@ function CraftingRecipe({
21867
22149
  className
21868
22150
  }) {
21869
22151
  const eventBus = useEventBus();
21870
- const handleCraft = React79.useCallback(() => {
22152
+ const handleCraft = React80.useCallback(() => {
21871
22153
  onCraft?.();
21872
22154
  if (craftEvent) {
21873
22155
  eventBus.emit(craftEvent, { output: output.label });
@@ -21884,7 +22166,7 @@ function CraftingRecipe({
21884
22166
  children: [
21885
22167
  /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "flex-wrap items-center", children: inputs.map((ingredient, index) => {
21886
22168
  const hasSufficient = ingredient.available >= ingredient.required;
21887
- return /* @__PURE__ */ jsxs(React79.Fragment, { children: [
22169
+ return /* @__PURE__ */ jsxs(React80.Fragment, { children: [
21888
22170
  /* @__PURE__ */ jsx(Box, { className: "relative", children: /* @__PURE__ */ jsx(
21889
22171
  ItemSlot,
21890
22172
  {
@@ -21956,8 +22238,8 @@ function DPad({
21956
22238
  }) {
21957
22239
  const eventBus = useEventBus();
21958
22240
  const sizes = sizeMap6[size];
21959
- const [activeDirections, setActiveDirections] = React79.useState(/* @__PURE__ */ new Set());
21960
- const handlePress = React79.useCallback(
22241
+ const [activeDirections, setActiveDirections] = React80.useState(/* @__PURE__ */ new Set());
22242
+ const handlePress = React80.useCallback(
21961
22243
  (direction) => {
21962
22244
  setActiveDirections((prev) => new Set(prev).add(direction));
21963
22245
  if (directionEvent) eventBus.emit(`UI:${directionEvent}`, { direction, pressed: true });
@@ -21965,7 +22247,7 @@ function DPad({
21965
22247
  },
21966
22248
  [directionEvent, eventBus, onDirection]
21967
22249
  );
21968
- const handleRelease = React79.useCallback(
22250
+ const handleRelease = React80.useCallback(
21969
22251
  (direction) => {
21970
22252
  setActiveDirections((prev) => {
21971
22253
  const next = new Set(prev);
@@ -22914,8 +23196,8 @@ var init_Menu = __esm({
22914
23196
  "bottom-end": "bottom-start"
22915
23197
  };
22916
23198
  const effectivePosition = direction === "rtl" ? rtlMirror[position] ?? position : position;
22917
- const triggerChild = React79__default.isValidElement(trigger) ? trigger : /* @__PURE__ */ jsx(Typography, { variant: "small", as: "span", children: trigger });
22918
- const triggerElement = React79__default.cloneElement(
23199
+ const triggerChild = React80__default.isValidElement(trigger) ? trigger : /* @__PURE__ */ jsx(Typography, { variant: "small", as: "span", children: trigger });
23200
+ const triggerElement = React80__default.cloneElement(
22919
23201
  triggerChild,
22920
23202
  {
22921
23203
  ref: triggerRef,
@@ -23010,14 +23292,14 @@ function useDataDnd(args) {
23010
23292
  const isZone = Boolean(dragGroup || accepts || sortable);
23011
23293
  const enabled = isZone || Boolean(dndRoot);
23012
23294
  const eventBus = useEventBus();
23013
- const parentRoot = React79__default.useContext(RootCtx);
23295
+ const parentRoot = React80__default.useContext(RootCtx);
23014
23296
  const isRoot = enabled && parentRoot === null;
23015
- const zoneId = React79__default.useId();
23297
+ const zoneId = React80__default.useId();
23016
23298
  const ownGroup = dragGroup ?? accepts ?? zoneId;
23017
- const [optimisticOrders, setOptimisticOrders] = React79__default.useState(() => /* @__PURE__ */ new Map());
23018
- const optimisticOrdersRef = React79__default.useRef(optimisticOrders);
23299
+ const [optimisticOrders, setOptimisticOrders] = React80__default.useState(() => /* @__PURE__ */ new Map());
23300
+ const optimisticOrdersRef = React80__default.useRef(optimisticOrders);
23019
23301
  optimisticOrdersRef.current = optimisticOrders;
23020
- const clearOptimisticOrder = React79__default.useCallback((group) => {
23302
+ const clearOptimisticOrder = React80__default.useCallback((group) => {
23021
23303
  setOptimisticOrders((prev) => {
23022
23304
  if (!prev.has(group)) return prev;
23023
23305
  const next = new Map(prev);
@@ -23042,7 +23324,7 @@ function useDataDnd(args) {
23042
23324
  const raw = it[dndItemIdField];
23043
23325
  return String(raw ?? `__idx_${idx}`);
23044
23326
  }).join("|");
23045
- const itemIds = React79__default.useMemo(
23327
+ const itemIds = React80__default.useMemo(
23046
23328
  () => orderedItems.map((it, idx) => {
23047
23329
  const raw = it[dndItemIdField];
23048
23330
  return raw ?? `__idx_${idx}`;
@@ -23050,7 +23332,7 @@ function useDataDnd(args) {
23050
23332
  [itemIdsSignature]
23051
23333
  );
23052
23334
  const itemsContentSig = items.map((it, idx) => String(it[dndItemIdField] ?? `__${idx}`)).join("|");
23053
- React79__default.useEffect(() => {
23335
+ React80__default.useEffect(() => {
23054
23336
  const root = isRoot ? null : parentRoot;
23055
23337
  if (root) {
23056
23338
  root.clearOptimisticOrder(ownGroup);
@@ -23058,20 +23340,20 @@ function useDataDnd(args) {
23058
23340
  clearOptimisticOrder(ownGroup);
23059
23341
  }
23060
23342
  }, [itemsContentSig, ownGroup]);
23061
- const zonesRef = React79__default.useRef(/* @__PURE__ */ new Map());
23062
- const registerZone = React79__default.useCallback((zoneId2, meta2) => {
23343
+ const zonesRef = React80__default.useRef(/* @__PURE__ */ new Map());
23344
+ const registerZone = React80__default.useCallback((zoneId2, meta2) => {
23063
23345
  zonesRef.current.set(zoneId2, meta2);
23064
23346
  }, []);
23065
- const unregisterZone = React79__default.useCallback((zoneId2) => {
23347
+ const unregisterZone = React80__default.useCallback((zoneId2) => {
23066
23348
  zonesRef.current.delete(zoneId2);
23067
23349
  }, []);
23068
- const [activeDrag, setActiveDrag] = React79__default.useState(null);
23069
- const [overZoneGroup, setOverZoneGroup] = React79__default.useState(null);
23070
- const meta = React79__default.useMemo(
23350
+ const [activeDrag, setActiveDrag] = React80__default.useState(null);
23351
+ const [overZoneGroup, setOverZoneGroup] = React80__default.useState(null);
23352
+ const meta = React80__default.useMemo(
23071
23353
  () => ({ group: ownGroup, dropEvent, reorderEvent, positionEvent, itemIds, rawItems: items, idField: dndItemIdField }),
23072
23354
  [ownGroup, dropEvent, reorderEvent, positionEvent, itemIds, items, dndItemIdField]
23073
23355
  );
23074
- React79__default.useEffect(() => {
23356
+ React80__default.useEffect(() => {
23075
23357
  const target = isRoot ? null : parentRoot;
23076
23358
  if (!target) {
23077
23359
  zonesRef.current.set(zoneId, meta);
@@ -23090,7 +23372,7 @@ function useDataDnd(args) {
23090
23372
  }, [parentRoot, isRoot, zoneId, meta]);
23091
23373
  const sensors = useAlmadarDndSensors(true);
23092
23374
  const collisionDetection = almadarDndCollisionDetection;
23093
- const findZoneByItem = React79__default.useCallback(
23375
+ const findZoneByItem = React80__default.useCallback(
23094
23376
  (id) => {
23095
23377
  for (const z of zonesRef.current.values()) {
23096
23378
  if (z.itemIds.includes(id)) return z;
@@ -23099,7 +23381,7 @@ function useDataDnd(args) {
23099
23381
  },
23100
23382
  []
23101
23383
  );
23102
- React79__default.useCallback(
23384
+ React80__default.useCallback(
23103
23385
  (group) => {
23104
23386
  for (const z of zonesRef.current.values()) {
23105
23387
  if (z.group === group) return z;
@@ -23108,7 +23390,7 @@ function useDataDnd(args) {
23108
23390
  },
23109
23391
  []
23110
23392
  );
23111
- const handleDragEnd = React79__default.useCallback(
23393
+ const handleDragEnd = React80__default.useCallback(
23112
23394
  (event) => {
23113
23395
  const { active, over } = event;
23114
23396
  const activeIdStr = String(active.id);
@@ -23199,8 +23481,8 @@ function useDataDnd(args) {
23199
23481
  },
23200
23482
  [eventBus]
23201
23483
  );
23202
- const sortableData = React79__default.useMemo(() => ({ dndGroup: ownGroup }), [ownGroup]);
23203
- const SortableItem = React79__default.useCallback(
23484
+ const sortableData = React80__default.useMemo(() => ({ dndGroup: ownGroup }), [ownGroup]);
23485
+ const SortableItem = React80__default.useCallback(
23204
23486
  ({ id, children }) => {
23205
23487
  const {
23206
23488
  attributes,
@@ -23240,7 +23522,7 @@ function useDataDnd(args) {
23240
23522
  id: droppableId,
23241
23523
  data: sortableData
23242
23524
  });
23243
- const ctx = React79__default.useContext(RootCtx);
23525
+ const ctx = React80__default.useContext(RootCtx);
23244
23526
  const activeDrag2 = ctx?.activeDrag ?? null;
23245
23527
  const overZoneGroup2 = ctx?.overZoneGroup ?? null;
23246
23528
  const isThisZoneOver = overZoneGroup2 === ownGroup;
@@ -23255,7 +23537,7 @@ function useDataDnd(args) {
23255
23537
  showForeignPlaceholder,
23256
23538
  ctxAvailable: ctx != null
23257
23539
  });
23258
- React79__default.useEffect(() => {
23540
+ React80__default.useEffect(() => {
23259
23541
  dndLog.info("dropzone:isOver:change", { droppableId, group: ownGroup, isOver, isThisZoneOver, showForeignPlaceholder, activeDragSourceGroup: activeDrag2?.sourceGroup ?? null });
23260
23542
  }, [droppableId, isOver, isThisZoneOver, showForeignPlaceholder]);
23261
23543
  return /* @__PURE__ */ jsx(
@@ -23269,11 +23551,11 @@ function useDataDnd(args) {
23269
23551
  }
23270
23552
  );
23271
23553
  };
23272
- const rootContextValue = React79__default.useMemo(
23554
+ const rootContextValue = React80__default.useMemo(
23273
23555
  () => ({ registerZone, unregisterZone, activeDrag, overZoneGroup, optimisticOrders, clearOptimisticOrder }),
23274
23556
  [registerZone, unregisterZone, activeDrag, overZoneGroup, optimisticOrders, clearOptimisticOrder]
23275
23557
  );
23276
- const handleDragStart = React79__default.useCallback((event) => {
23558
+ const handleDragStart = React80__default.useCallback((event) => {
23277
23559
  const sourceZone = findZoneByItem(event.active.id);
23278
23560
  const rect = event.active.rect.current.initial;
23279
23561
  const height = rect?.height && rect.height > 0 ? rect.height : 64;
@@ -23292,7 +23574,7 @@ function useDataDnd(args) {
23292
23574
  isRoot
23293
23575
  });
23294
23576
  }, [findZoneByItem, isRoot, zoneId]);
23295
- const handleDragOver = React79__default.useCallback((event) => {
23577
+ const handleDragOver = React80__default.useCallback((event) => {
23296
23578
  const { active, over } = event;
23297
23579
  const overData = over?.data?.current;
23298
23580
  const overGroup = overData?.dndGroup ?? null;
@@ -23362,7 +23644,7 @@ function useDataDnd(args) {
23362
23644
  return next;
23363
23645
  });
23364
23646
  }, []);
23365
- const handleDragCancel = React79__default.useCallback((event) => {
23647
+ const handleDragCancel = React80__default.useCallback((event) => {
23366
23648
  setActiveDrag(null);
23367
23649
  setOverZoneGroup(null);
23368
23650
  dndLog.warn("dragCancel", {
@@ -23370,12 +23652,12 @@ function useDataDnd(args) {
23370
23652
  reason: "dnd-kit cancelled the drag (escape key, pointer interrupted, or external)"
23371
23653
  });
23372
23654
  }, []);
23373
- const handleDragEndWithCleanup = React79__default.useCallback((event) => {
23655
+ const handleDragEndWithCleanup = React80__default.useCallback((event) => {
23374
23656
  handleDragEnd(event);
23375
23657
  setActiveDrag(null);
23376
23658
  setOverZoneGroup(null);
23377
23659
  }, [handleDragEnd]);
23378
- const wrapContainer = React79__default.useCallback(
23660
+ const wrapContainer = React80__default.useCallback(
23379
23661
  (children) => {
23380
23662
  if (!enabled) return children;
23381
23663
  const strategy = layout === "grid" ? rectSortingStrategy : verticalListSortingStrategy;
@@ -23429,7 +23711,7 @@ var init_useDataDnd = __esm({
23429
23711
  init_useAlmadarDndCollision();
23430
23712
  init_Box();
23431
23713
  dndLog = createLogger("almadar:ui:dnd");
23432
- RootCtx = React79__default.createContext(null);
23714
+ RootCtx = React80__default.createContext(null);
23433
23715
  }
23434
23716
  });
23435
23717
  function renderIconInput(icon, props) {
@@ -23955,7 +24237,7 @@ function DataList({
23955
24237
  }) {
23956
24238
  const eventBus = useEventBus();
23957
24239
  const { t } = useTranslate();
23958
- const [visibleCount, setVisibleCount] = React79__default.useState(pageSize || Infinity);
24240
+ const [visibleCount, setVisibleCount] = React80__default.useState(pageSize || Infinity);
23959
24241
  const fieldDefs = fields ?? columns ?? [];
23960
24242
  const allDataRaw = Array.isArray(entity) ? entity : entity ? [entity] : [];
23961
24243
  const dnd = useDataDnd({
@@ -23974,7 +24256,7 @@ function DataList({
23974
24256
  const data = pageSize > 0 ? allData.slice(0, visibleCount) : allData;
23975
24257
  const hasMoreLocal = pageSize > 0 && visibleCount < allData.length;
23976
24258
  const hasRenderProp = typeof children === "function";
23977
- React79__default.useEffect(() => {
24259
+ React80__default.useEffect(() => {
23978
24260
  const renderItemTypeOf = typeof schemaRenderItem;
23979
24261
  const childrenTypeOf = typeof children;
23980
24262
  if (data.length > 0 && !hasRenderProp) {
@@ -24079,7 +24361,7 @@ function DataList({
24079
24361
  const items2 = data.map((item) => item);
24080
24362
  const groups2 = groupBy ? groupData(items2, groupBy) : [{ label: "", items: items2 }];
24081
24363
  const contentField = titleField?.name ?? fieldDefs[0]?.name ?? "";
24082
- return /* @__PURE__ */ jsx(VStack, { gap: "sm", className: cn("py-2", className), children: groups2.map((group, gi) => /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
24364
+ return /* @__PURE__ */ jsx(VStack, { gap: "sm", className: cn("py-2", className), children: groups2.map((group, gi) => /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
24083
24365
  group.label && /* @__PURE__ */ jsx(Divider, { label: group.label, className: "my-2" }),
24084
24366
  group.items.map((itemData, index) => {
24085
24367
  const id = itemData.id || `${gi}-${index}`;
@@ -24220,7 +24502,7 @@ function DataList({
24220
24502
  className
24221
24503
  ),
24222
24504
  children: [
24223
- groups.map((group, gi) => /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
24505
+ groups.map((group, gi) => /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
24224
24506
  group.label && /* @__PURE__ */ jsx(Divider, { label: group.label, className: gi > 0 ? "mt-4" : "mt-0" }),
24225
24507
  group.items.map(
24226
24508
  (itemData, index) => renderItem(itemData, index, gi === groups.length - 1 && index === group.items.length - 1)
@@ -24327,8 +24609,8 @@ function ScalarControl({
24327
24609
  }
24328
24610
  const numeric = typeof value === "number";
24329
24611
  const initial = value === null ? "" : String(value);
24330
- const [draft, setDraft] = React79__default.useState(initial);
24331
- React79__default.useEffect(() => setDraft(initial), [initial]);
24612
+ const [draft, setDraft] = React80__default.useState(initial);
24613
+ React80__default.useEffect(() => setDraft(initial), [initial]);
24332
24614
  const commit = () => {
24333
24615
  if (numeric) {
24334
24616
  const n = draft.trim() === "" ? 0 : Number(draft);
@@ -24396,8 +24678,8 @@ function Row({
24396
24678
  onRemove,
24397
24679
  readonly
24398
24680
  }) {
24399
- const [keyDraft, setKeyDraft] = React79__default.useState(rowKey);
24400
- React79__default.useEffect(() => setKeyDraft(rowKey), [rowKey]);
24681
+ const [keyDraft, setKeyDraft] = React80__default.useState(rowKey);
24682
+ React80__default.useEffect(() => setKeyDraft(rowKey), [rowKey]);
24401
24683
  const container = isObj(value) || isArr(value);
24402
24684
  return /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "group w-max min-w-full", children: [
24403
24685
  /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", className: "py-0.5 w-max", children: [
@@ -24440,7 +24722,7 @@ function ContainerNode({
24440
24722
  depth,
24441
24723
  readonly
24442
24724
  }) {
24443
- const [open, setOpen] = React79__default.useState(depth < 2);
24725
+ const [open, setOpen] = React80__default.useState(depth < 2);
24444
24726
  const array = isArr(value);
24445
24727
  const entries = array ? value.map((v, i) => [String(i), v]) : Object.entries(value);
24446
24728
  const setObjValue = (key, next) => {
@@ -24582,7 +24864,7 @@ var init_FormSection = __esm({
24582
24864
  columns = 1,
24583
24865
  className
24584
24866
  }) => {
24585
- const [collapsed, setCollapsed] = React79__default.useState(defaultCollapsed);
24867
+ const [collapsed, setCollapsed] = React80__default.useState(defaultCollapsed);
24586
24868
  const { t } = useTranslate();
24587
24869
  const eventBus = useEventBus();
24588
24870
  const gridClass = {
@@ -24590,7 +24872,7 @@ var init_FormSection = __esm({
24590
24872
  2: "grid-cols-1 md:grid-cols-2",
24591
24873
  3: "grid-cols-1 md:grid-cols-2 lg:grid-cols-3"
24592
24874
  }[columns];
24593
- React79__default.useCallback(() => {
24875
+ React80__default.useCallback(() => {
24594
24876
  if (collapsible) {
24595
24877
  setCollapsed((prev) => !prev);
24596
24878
  eventBus.emit("UI:TOGGLE_COLLAPSE", { collapsed: !collapsed });
@@ -24998,8 +25280,8 @@ function TextLikeControl({
24998
25280
  onCommit
24999
25281
  }) {
25000
25282
  const initial = value === void 0 || value === null ? "" : String(value);
25001
- const [draft, setDraft] = React79__default.useState(initial);
25002
- React79__default.useEffect(() => setDraft(initial), [initial]);
25283
+ const [draft, setDraft] = React80__default.useState(initial);
25284
+ React80__default.useEffect(() => setDraft(initial), [initial]);
25003
25285
  const commit = () => {
25004
25286
  if (numeric) {
25005
25287
  const n = draft.trim() === "" ? 0 : Number(draft);
@@ -25165,14 +25447,14 @@ var init_NodeSlotEditor = __esm({
25165
25447
  isObj2 = (v) => v !== null && v !== void 0 && typeof v === "object" && !Array.isArray(v);
25166
25448
  NodeSlotEditor = ({ value, onChange, className }) => {
25167
25449
  const { type, props, wasArray } = normalize(value);
25168
- const patterns = React79__default.useMemo(() => {
25450
+ const patterns = React80__default.useMemo(() => {
25169
25451
  try {
25170
25452
  return [...getKnownPatterns()].sort();
25171
25453
  } catch {
25172
25454
  return [];
25173
25455
  }
25174
25456
  }, []);
25175
- const options = React79__default.useMemo(
25457
+ const options = React80__default.useMemo(
25176
25458
  () => [{ value: "", label: "\u2014 none \u2014" }, ...patterns.map((p2) => ({ value: p2, label: p2 }))],
25177
25459
  [patterns]
25178
25460
  );
@@ -25184,7 +25466,7 @@ var init_NodeSlotEditor = __esm({
25184
25466
  const pattern = { type: nextType, ...nextProps };
25185
25467
  onChange(wasArray || value === void 0 ? [pattern] : pattern);
25186
25468
  };
25187
- const schemaEntries = React79__default.useMemo(() => {
25469
+ const schemaEntries = React80__default.useMemo(() => {
25188
25470
  if (!type) return [];
25189
25471
  const def = getPatternDefinition(type);
25190
25472
  if (!def?.propsSchema) return [];
@@ -26078,7 +26360,7 @@ var init_Grid = __esm({
26078
26360
  as: Component2 = "div"
26079
26361
  }) => {
26080
26362
  const mergedStyle = rows2 ? { gridTemplateRows: `repeat(${rows2}, minmax(0, 1fr))`, ...style } : style;
26081
- return React79__default.createElement(
26363
+ return React80__default.createElement(
26082
26364
  Component2,
26083
26365
  {
26084
26366
  className: cn(
@@ -26274,9 +26556,9 @@ var init_Popover = __esm({
26274
26556
  onMouseLeave: handleClose,
26275
26557
  onPointerDown: tapTriggerProps.onPointerDown
26276
26558
  };
26277
- const childElement = React79__default.isValidElement(children) ? children : /* @__PURE__ */ jsx("span", { children });
26559
+ const childElement = React80__default.isValidElement(children) ? children : /* @__PURE__ */ jsx("span", { children });
26278
26560
  const childPointerDown = childElement.props.onPointerDown;
26279
- const triggerElement = React79__default.cloneElement(
26561
+ const triggerElement = React80__default.cloneElement(
26280
26562
  childElement,
26281
26563
  {
26282
26564
  ref: triggerRef,
@@ -27128,9 +27410,9 @@ var init_Tooltip = __esm({
27128
27410
  if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);
27129
27411
  };
27130
27412
  }, []);
27131
- const triggerElement = React79__default.isValidElement(children) ? children : /* @__PURE__ */ jsx("span", { children });
27413
+ const triggerElement = React80__default.isValidElement(children) ? children : /* @__PURE__ */ jsx("span", { children });
27132
27414
  const childPointerDown = triggerElement.props.onPointerDown;
27133
- const trigger = React79__default.cloneElement(triggerElement, {
27415
+ const trigger = React80__default.cloneElement(triggerElement, {
27134
27416
  ref: triggerRef,
27135
27417
  onMouseEnter: handleMouseEnter,
27136
27418
  onMouseLeave: handleMouseLeave,
@@ -27220,7 +27502,7 @@ var init_WizardProgress = __esm({
27220
27502
  children: /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: normalizedSteps.map((step, index) => {
27221
27503
  const isActive = index === currentStep;
27222
27504
  const isCompleted = index < currentStep;
27223
- return /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
27505
+ return /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
27224
27506
  /* @__PURE__ */ jsx(
27225
27507
  "button",
27226
27508
  {
@@ -28265,9 +28547,9 @@ function ScoreDisplay({
28265
28547
  ...rest
28266
28548
  }) {
28267
28549
  const resolvedValue = typeof value === "number" && !Number.isNaN(value) ? value : typeof rest.score === "number" && !Number.isNaN(rest.score) ? rest.score : 0;
28268
- const [displayValue, setDisplayValue] = React79.useState(resolvedValue);
28269
- const [isAnimating, setIsAnimating] = React79.useState(false);
28270
- React79.useEffect(() => {
28550
+ const [displayValue, setDisplayValue] = React80.useState(resolvedValue);
28551
+ const [isAnimating, setIsAnimating] = React80.useState(false);
28552
+ React80.useEffect(() => {
28271
28553
  if (!animated || displayValue === resolvedValue) {
28272
28554
  setDisplayValue(resolvedValue);
28273
28555
  return;
@@ -28437,7 +28719,7 @@ function InventoryGrid({
28437
28719
  const eventBus = useEventBus();
28438
28720
  const slotCount = totalSlots ?? items.length;
28439
28721
  const emptySlotCount = Math.max(0, slotCount - items.length);
28440
- const handleSelect = React79.useCallback(
28722
+ const handleSelect = React80.useCallback(
28441
28723
  (id) => {
28442
28724
  onSelect?.(id);
28443
28725
  if (selectEvent) {
@@ -28690,6 +28972,7 @@ function PowerupSlots({
28690
28972
  /* @__PURE__ */ jsx(
28691
28973
  ItemSlot,
28692
28974
  {
28975
+ assetUrl: powerup.assetUrl,
28693
28976
  icon: powerup.icon,
28694
28977
  label: powerup.label,
28695
28978
  rarity: "uncommon",
@@ -28753,31 +29036,31 @@ function GameCanvas2D({
28753
29036
  assetBaseUrl,
28754
29037
  className
28755
29038
  }) {
28756
- const canvasRef = React79.useRef(null);
28757
- const rafRef = React79.useRef(0);
28758
- const frameRef = React79.useRef(0);
28759
- const lastTimeRef = React79.useRef(0);
28760
- const imageCache = React79.useRef(/* @__PURE__ */ new Map());
29039
+ const canvasRef = React80.useRef(null);
29040
+ const rafRef = React80.useRef(0);
29041
+ const frameRef = React80.useRef(0);
29042
+ const lastTimeRef = React80.useRef(0);
29043
+ const imageCache = React80.useRef(/* @__PURE__ */ new Map());
28761
29044
  const emit = useEmitEvent();
28762
- const onDrawRef = React79.useRef(onDraw);
29045
+ const onDrawRef = React80.useRef(onDraw);
28763
29046
  onDrawRef.current = onDraw;
28764
- const onTickRef = React79.useRef(onTick);
29047
+ const onTickRef = React80.useRef(onTick);
28765
29048
  onTickRef.current = onTick;
28766
- const tickEventRef = React79.useRef(tickEvent);
29049
+ const tickEventRef = React80.useRef(tickEvent);
28767
29050
  tickEventRef.current = tickEvent;
28768
- const drawEventRef = React79.useRef(drawEvent);
29051
+ const drawEventRef = React80.useRef(drawEvent);
28769
29052
  drawEventRef.current = drawEvent;
28770
- const emitRef = React79.useRef(emit);
29053
+ const emitRef = React80.useRef(emit);
28771
29054
  emitRef.current = emit;
28772
- const assetBaseUrlRef = React79.useRef(assetBaseUrl);
29055
+ const assetBaseUrlRef = React80.useRef(assetBaseUrl);
28773
29056
  assetBaseUrlRef.current = assetBaseUrl;
28774
- const backgroundImageRef = React79.useRef(backgroundImage);
29057
+ const backgroundImageRef = React80.useRef(backgroundImage);
28775
29058
  backgroundImageRef.current = backgroundImage;
28776
- const widthRef = React79.useRef(width);
29059
+ const widthRef = React80.useRef(width);
28777
29060
  widthRef.current = width;
28778
- const heightRef = React79.useRef(height);
29061
+ const heightRef = React80.useRef(height);
28779
29062
  heightRef.current = height;
28780
- const loadImage = React79.useCallback((url) => {
29063
+ const loadImage = React80.useCallback((url) => {
28781
29064
  const base = assetBaseUrlRef.current;
28782
29065
  if (!url.startsWith("http") && !base) return null;
28783
29066
  const fullUrl = url.startsWith("http") ? url : `${base}${url}`;
@@ -28791,7 +29074,7 @@ function GameCanvas2D({
28791
29074
  }
28792
29075
  return null;
28793
29076
  }, []);
28794
- React79.useEffect(() => {
29077
+ React80.useEffect(() => {
28795
29078
  const canvas = canvasRef.current;
28796
29079
  if (!canvas) return;
28797
29080
  const ctx = canvas.getContext("2d");
@@ -28939,13 +29222,26 @@ function HealthPanel({
28939
29222
  )
28940
29223
  }
28941
29224
  ),
28942
- effects && effects.length > 0 && /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-1 flex-wrap", children: effects.map((effect, i) => /* @__PURE__ */ jsx(
29225
+ effects && effects.length > 0 && /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-1 flex-wrap", children: effects.map((effect, i) => /* @__PURE__ */ jsxs(
28943
29226
  Badge,
28944
29227
  {
28945
29228
  variant: effectVariantMap[effect.variant ?? "neutral"],
28946
29229
  size: "sm",
28947
- icon: effect.icon,
28948
- children: effect.label
29230
+ icon: effect.assetUrl ? void 0 : effect.icon,
29231
+ children: [
29232
+ effect.assetUrl && /* @__PURE__ */ jsx(
29233
+ "img",
29234
+ {
29235
+ src: effect.assetUrl,
29236
+ alt: "",
29237
+ width: 12,
29238
+ height: 12,
29239
+ style: { imageRendering: "pixelated", objectFit: "contain" },
29240
+ className: "flex-shrink-0 inline-block"
29241
+ }
29242
+ ),
29243
+ effect.label
29244
+ ]
28949
29245
  },
28950
29246
  i
28951
29247
  )) })
@@ -29167,7 +29463,7 @@ function TurnPanel({
29167
29463
  className
29168
29464
  }) {
29169
29465
  const eventBus = useEventBus();
29170
- const handleAction = React79.useCallback(
29466
+ const handleAction = React80.useCallback(
29171
29467
  (event) => {
29172
29468
  if (event) {
29173
29469
  eventBus.emit(event, { turn: currentTurn, phase, activeTeam });
@@ -29192,15 +29488,28 @@ function TurnPanel({
29192
29488
  activeTeam
29193
29489
  }
29194
29490
  ),
29195
- actions && actions.length > 0 && /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-1.5 ml-auto", children: actions.map((action, i) => /* @__PURE__ */ jsx(
29491
+ actions && actions.length > 0 && /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-1.5 ml-auto", children: actions.map((action, i) => /* @__PURE__ */ jsxs(
29196
29492
  Button,
29197
29493
  {
29198
29494
  variant: "ghost",
29199
29495
  size: "sm",
29200
29496
  disabled: action.disabled,
29201
- leftIcon: action.icon,
29497
+ leftIcon: action.assetUrl ? void 0 : action.icon,
29202
29498
  onClick: () => handleAction(action.event),
29203
- children: action.label
29499
+ children: [
29500
+ action.assetUrl && /* @__PURE__ */ jsx(
29501
+ "img",
29502
+ {
29503
+ src: action.assetUrl,
29504
+ alt: "",
29505
+ width: 14,
29506
+ height: 14,
29507
+ style: { imageRendering: "pixelated", objectFit: "contain" },
29508
+ className: "flex-shrink-0"
29509
+ }
29510
+ ),
29511
+ action.label
29512
+ ]
29204
29513
  },
29205
29514
  i
29206
29515
  )) })
@@ -29335,7 +29644,7 @@ function UnitCommandBar({
29335
29644
  className
29336
29645
  }) {
29337
29646
  const eventBus = useEventBus();
29338
- const handleCommand = React79.useCallback(
29647
+ const handleCommand = React80.useCallback(
29339
29648
  (event) => {
29340
29649
  if (event) {
29341
29650
  eventBus.emit(event, { unitId: selectedUnitId });
@@ -29886,7 +30195,7 @@ function GameMenu({
29886
30195
  } catch {
29887
30196
  }
29888
30197
  const eventBus = eventBusProp || eventBusFromHook;
29889
- const handleOptionClick = React79.useCallback(
30198
+ const handleOptionClick = React80.useCallback(
29890
30199
  (option) => {
29891
30200
  if (option.event && eventBus) {
29892
30201
  eventBus.emit(`UI:${option.event}`, { option });
@@ -30005,7 +30314,7 @@ function GameOverScreen({
30005
30314
  } catch {
30006
30315
  }
30007
30316
  const eventBus = eventBusProp || eventBusFromHook;
30008
- const handleActionClick = React79.useCallback(
30317
+ const handleActionClick = React80.useCallback(
30009
30318
  (action) => {
30010
30319
  if (action.event && eventBus) {
30011
30320
  eventBus.emit(`UI:${action.event}`, { action });
@@ -30960,13 +31269,13 @@ var init_MapView = __esm({
30960
31269
  shadowSize: [41, 41]
30961
31270
  });
30962
31271
  L.Marker.prototype.options.icon = defaultIcon;
30963
- const { useEffect: useEffect83, useRef: useRef83, useCallback: useCallback127, useState: useState112 } = React79__default;
31272
+ const { useEffect: useEffect84, useRef: useRef83, useCallback: useCallback128, useState: useState114 } = React80__default;
30964
31273
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
30965
31274
  const { useEventBus: useEventBus3 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
30966
31275
  function MapUpdater({ centerLat, centerLng, zoom }) {
30967
31276
  const map = useMap();
30968
31277
  const prevRef = useRef83({ centerLat, centerLng, zoom });
30969
- useEffect83(() => {
31278
+ useEffect84(() => {
30970
31279
  const prev = prevRef.current;
30971
31280
  if (prev.centerLat !== centerLat || prev.centerLng !== centerLng || prev.zoom !== zoom) {
30972
31281
  map.setView([centerLat, centerLng], zoom);
@@ -30977,7 +31286,7 @@ var init_MapView = __esm({
30977
31286
  }
30978
31287
  function MapClickHandler({ onMapClick }) {
30979
31288
  const map = useMap();
30980
- useEffect83(() => {
31289
+ useEffect84(() => {
30981
31290
  if (!onMapClick) return;
30982
31291
  const handler = (e) => {
30983
31292
  onMapClick(e.latlng.lat, e.latlng.lng);
@@ -31005,8 +31314,8 @@ var init_MapView = __esm({
31005
31314
  showAttribution = true
31006
31315
  }) {
31007
31316
  const eventBus = useEventBus3();
31008
- const [clickedPosition, setClickedPosition] = useState112(null);
31009
- const handleMapClick = useCallback127((lat, lng) => {
31317
+ const [clickedPosition, setClickedPosition] = useState114(null);
31318
+ const handleMapClick = useCallback128((lat, lng) => {
31010
31319
  if (showClickedPin) {
31011
31320
  setClickedPosition({ lat, lng });
31012
31321
  }
@@ -31015,7 +31324,7 @@ var init_MapView = __esm({
31015
31324
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
31016
31325
  }
31017
31326
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
31018
- const handleMarkerClick = useCallback127((marker) => {
31327
+ const handleMarkerClick = useCallback128((marker) => {
31019
31328
  onMarkerClick?.(marker);
31020
31329
  if (markerClickEvent) {
31021
31330
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -31866,8 +32175,8 @@ function TableView({
31866
32175
  }) {
31867
32176
  const eventBus = useEventBus();
31868
32177
  const { t } = useTranslate();
31869
- const [visibleCount, setVisibleCount] = React79__default.useState(pageSize > 0 ? pageSize : Infinity);
31870
- const [localSelected, setLocalSelected] = React79__default.useState(/* @__PURE__ */ new Set());
32178
+ const [visibleCount, setVisibleCount] = React80__default.useState(pageSize > 0 ? pageSize : Infinity);
32179
+ const [localSelected, setLocalSelected] = React80__default.useState(/* @__PURE__ */ new Set());
31871
32180
  const colDefs = columns ?? fields ?? [];
31872
32181
  const allDataRaw = Array.isArray(entity) ? entity : entity ? [entity] : [];
31873
32182
  const dnd = useDataDnd({
@@ -32062,12 +32371,12 @@ function TableView({
32062
32371
  ]
32063
32372
  }
32064
32373
  );
32065
- return dnd.isZone ? /* @__PURE__ */ jsx(dnd.SortableItem, { id: row[idField] ?? id, children: rowInner }, id) : /* @__PURE__ */ jsx(React79__default.Fragment, { children: rowInner }, id);
32374
+ return dnd.isZone ? /* @__PURE__ */ jsx(dnd.SortableItem, { id: row[idField] ?? id, children: rowInner }, id) : /* @__PURE__ */ jsx(React80__default.Fragment, { children: rowInner }, id);
32066
32375
  };
32067
32376
  const items = data.map((row) => row);
32068
32377
  const groups = groupBy ? groupData2(items, groupBy) : [{ label: "", items }];
32069
32378
  let runningIndex = 0;
32070
- const body = /* @__PURE__ */ jsx(Box, { role: "rowgroup", children: groups.map((group, gi) => /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
32379
+ const body = /* @__PURE__ */ jsx(Box, { role: "rowgroup", children: groups.map((group, gi) => /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
32071
32380
  group.label && /* @__PURE__ */ jsx(Divider, { label: group.label, className: gi > 0 ? "mt-3" : "mt-0" }),
32072
32381
  group.items.map((row) => renderRow(row, runningIndex++))
32073
32382
  ] }, gi)) });
@@ -33424,7 +33733,7 @@ var init_StepFlow = __esm({
33424
33733
  className
33425
33734
  }) => {
33426
33735
  if (orientation === "vertical") {
33427
- return /* @__PURE__ */ jsx(VStack, { gap: "none", className: cn("w-full", className), children: steps.map((step, index) => /* @__PURE__ */ jsx(React79__default.Fragment, { children: /* @__PURE__ */ jsxs(HStack, { gap: "md", align: "start", className: "w-full", children: [
33736
+ return /* @__PURE__ */ jsx(VStack, { gap: "none", className: cn("w-full", className), children: steps.map((step, index) => /* @__PURE__ */ jsx(React80__default.Fragment, { children: /* @__PURE__ */ jsxs(HStack, { gap: "md", align: "start", className: "w-full", children: [
33428
33737
  /* @__PURE__ */ jsxs(VStack, { gap: "none", align: "center", children: [
33429
33738
  /* @__PURE__ */ jsx(StepCircle, { step, index }),
33430
33739
  showConnectors && index < steps.length - 1 && /* @__PURE__ */ jsx(Box, { className: "w-px h-8 bg-border" })
@@ -33435,7 +33744,7 @@ var init_StepFlow = __esm({
33435
33744
  ] })
33436
33745
  ] }) }, index)) });
33437
33746
  }
33438
- 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(React79__default.Fragment, { children: [
33747
+ 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(React80__default.Fragment, { children: [
33439
33748
  /* @__PURE__ */ jsxs(VStack, { gap: "sm", align: "center", className: "flex-1 w-full md:w-auto", children: [
33440
33749
  /* @__PURE__ */ jsx(StepCircle, { step, index }),
33441
33750
  /* @__PURE__ */ jsx(Typography, { variant: "h4", className: "text-center", children: step.title }),
@@ -34420,7 +34729,7 @@ var init_LikertScale = __esm({
34420
34729
  md: "text-base",
34421
34730
  lg: "text-lg"
34422
34731
  };
34423
- LikertScale = React79__default.forwardRef(
34732
+ LikertScale = React80__default.forwardRef(
34424
34733
  ({
34425
34734
  question,
34426
34735
  options = DEFAULT_LIKERT_OPTIONS,
@@ -34432,7 +34741,7 @@ var init_LikertScale = __esm({
34432
34741
  variant = "radios",
34433
34742
  className
34434
34743
  }, ref) => {
34435
- const groupId = React79__default.useId();
34744
+ const groupId = React80__default.useId();
34436
34745
  const eventBus = useEventBus();
34437
34746
  const handleSelect = useCallback(
34438
34747
  (next) => {
@@ -36714,7 +37023,7 @@ var init_DocBreadcrumb = __esm({
36714
37023
  "aria-label": t("aria.breadcrumb"),
36715
37024
  children: /* @__PURE__ */ jsx(HStack, { gap: "xs", align: "center", wrap: true, children: items.map((item, idx) => {
36716
37025
  const isLast = idx === items.length - 1;
36717
- return /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
37026
+ return /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
36718
37027
  idx > 0 && /* @__PURE__ */ jsx(
36719
37028
  Icon,
36720
37029
  {
@@ -37583,7 +37892,7 @@ var init_MiniStateMachine = __esm({
37583
37892
  const x = 2 + i * (NODE_W + GAP2 + ARROW_W + GAP2);
37584
37893
  const tc = transitionCounts[s.name] ?? 0;
37585
37894
  const role = getStateRole(s.name, s.isInitial, s.isTerminal, tc, maxTC);
37586
- return /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
37895
+ return /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
37587
37896
  /* @__PURE__ */ jsx(
37588
37897
  AvlState,
37589
37898
  {
@@ -37787,7 +38096,7 @@ var init_PageHeader = __esm({
37787
38096
  info: "bg-info/10 text-info"
37788
38097
  };
37789
38098
  return /* @__PURE__ */ jsxs(Box, { className: cn("mb-6", className), children: [
37790
- 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(React79__default.Fragment, { children: [
38099
+ 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(React80__default.Fragment, { children: [
37791
38100
  idx > 0 && /* @__PURE__ */ jsx(Typography, { variant: "small", color: "muted", children: "/" }),
37792
38101
  crumb.href ? /* @__PURE__ */ jsx(
37793
38102
  "a",
@@ -38516,7 +38825,7 @@ var init_WizardContainer = __esm({
38516
38825
  const isCompleted = index < currentStep;
38517
38826
  const stepKey = step.id ?? step.tabId ?? `step-${index}`;
38518
38827
  const stepTitle = step.title ?? step.name ?? `Step ${index + 1}`;
38519
- return /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
38828
+ return /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
38520
38829
  /* @__PURE__ */ jsx(
38521
38830
  Button,
38522
38831
  {
@@ -41326,7 +41635,7 @@ var init_DialogueBubble = __esm({
41326
41635
  }
41327
41636
  });
41328
41637
  function extractTitle(children) {
41329
- if (!React79__default.isValidElement(children)) return void 0;
41638
+ if (!React80__default.isValidElement(children)) return void 0;
41330
41639
  const props = children.props;
41331
41640
  if (typeof props.title === "string") {
41332
41641
  return props.title;
@@ -41451,7 +41760,7 @@ function LinearView({
41451
41760
  /* @__PURE__ */ jsx(HStack, { className: "flex-wrap items-center", gap: "xs", children: trait.states.map((state, i) => {
41452
41761
  const isDone = i < currentIdx;
41453
41762
  const isCurrent = i === currentIdx;
41454
- return /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
41763
+ return /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
41455
41764
  i > 0 && /* @__PURE__ */ jsx(
41456
41765
  Typography,
41457
41766
  {
@@ -42220,6 +42529,42 @@ var init_FeatureGridOrganism = __esm({
42220
42529
  FeatureGridOrganism.displayName = "FeatureGridOrganism";
42221
42530
  }
42222
42531
  });
42532
+ function FishingBoard({
42533
+ backgroundImage,
42534
+ assetBaseUrl,
42535
+ scale = 1,
42536
+ showMinimap = false,
42537
+ enableCamera = true,
42538
+ width = 800,
42539
+ height = 600,
42540
+ isLoading,
42541
+ error,
42542
+ className
42543
+ }) {
42544
+ return /* @__PURE__ */ jsxs("div", { className: cn("fishing-board relative w-full h-full", className), children: [
42545
+ isLoading && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-black/40 z-10", children: /* @__PURE__ */ jsx("span", { className: "text-white text-sm", children: "Loading\u2026" }) }),
42546
+ error && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-black/40 z-10", children: /* @__PURE__ */ jsx("span", { className: "text-red-400 text-sm", children: error.message }) }),
42547
+ /* @__PURE__ */ jsx(
42548
+ GameCanvas2D,
42549
+ {
42550
+ width,
42551
+ height,
42552
+ backgroundImage: backgroundImage ?? "",
42553
+ assetBaseUrl,
42554
+ fps: 60,
42555
+ className: "w-full h-full"
42556
+ }
42557
+ )
42558
+ ] });
42559
+ }
42560
+ var init_FishingBoard = __esm({
42561
+ "components/game/organisms/FishingBoard.tsx"() {
42562
+ "use client";
42563
+ init_cn();
42564
+ init_GameCanvas2D();
42565
+ FishingBoard.displayName = "FishingBoard";
42566
+ }
42567
+ });
42223
42568
  function toSharedContext2(formCtx) {
42224
42569
  return createMinimalContext(
42225
42570
  {
@@ -42401,12 +42746,12 @@ var init_Form = __esm({
42401
42746
  const isSchemaEntity = isOrbitalEntitySchema(entity);
42402
42747
  const resolvedEntity = isSchemaEntity ? entity : void 0;
42403
42748
  const entityName = typeof entity === "string" ? entity : resolvedEntity?.name;
42404
- const normalizedInitialData = React79__default.useMemo(() => {
42749
+ const normalizedInitialData = React80__default.useMemo(() => {
42405
42750
  const entityRowAsInitial = isPlainEntityRow(entity) ? entity : void 0;
42406
42751
  const callerInitial = initialData !== null && typeof initialData === "object" && !Array.isArray(initialData) ? initialData : {};
42407
42752
  return entityRowAsInitial !== void 0 ? { ...entityRowAsInitial, ...callerInitial } : callerInitial;
42408
42753
  }, [entity, initialData]);
42409
- const entityDerivedFields = React79__default.useMemo(() => {
42754
+ const entityDerivedFields = React80__default.useMemo(() => {
42410
42755
  if (fields && fields.length > 0) return void 0;
42411
42756
  if (!resolvedEntity) return void 0;
42412
42757
  return resolvedEntity.fields.map(
@@ -42426,16 +42771,16 @@ var init_Form = __esm({
42426
42771
  const conditionalFields = typeof conditionalFieldsRaw === "boolean" ? {} : conditionalFieldsRaw;
42427
42772
  const hiddenCalculations = typeof hiddenCalculationsRaw === "boolean" ? [] : hiddenCalculationsRaw;
42428
42773
  const violationTriggers = typeof violationTriggersRaw === "boolean" ? [] : violationTriggersRaw;
42429
- const [formData, setFormData] = React79__default.useState(
42774
+ const [formData, setFormData] = React80__default.useState(
42430
42775
  normalizedInitialData
42431
42776
  );
42432
- const [collapsedSections, setCollapsedSections] = React79__default.useState(
42777
+ const [collapsedSections, setCollapsedSections] = React80__default.useState(
42433
42778
  /* @__PURE__ */ new Set()
42434
42779
  );
42435
- const [submitError, setSubmitError] = React79__default.useState(null);
42436
- const formRef = React79__default.useRef(null);
42780
+ const [submitError, setSubmitError] = React80__default.useState(null);
42781
+ const formRef = React80__default.useRef(null);
42437
42782
  const formMode = props.mode;
42438
- const mountedRef = React79__default.useRef(false);
42783
+ const mountedRef = React80__default.useRef(false);
42439
42784
  if (!mountedRef.current) {
42440
42785
  mountedRef.current = true;
42441
42786
  debug("forms", "mount", {
@@ -42448,7 +42793,7 @@ var init_Form = __esm({
42448
42793
  });
42449
42794
  }
42450
42795
  const shouldShowCancel = showCancel ?? (fields && fields.length > 0);
42451
- const evalContext = React79__default.useMemo(
42796
+ const evalContext = React80__default.useMemo(
42452
42797
  () => ({
42453
42798
  formValues: formData,
42454
42799
  globalVariables: externalContext?.globalVariables ?? {},
@@ -42457,7 +42802,7 @@ var init_Form = __esm({
42457
42802
  }),
42458
42803
  [formData, externalContext]
42459
42804
  );
42460
- React79__default.useEffect(() => {
42805
+ React80__default.useEffect(() => {
42461
42806
  debug("forms", "initialData-sync", {
42462
42807
  mode: formMode,
42463
42808
  normalizedInitialData,
@@ -42468,7 +42813,7 @@ var init_Form = __esm({
42468
42813
  setFormData(normalizedInitialData);
42469
42814
  }
42470
42815
  }, [normalizedInitialData]);
42471
- const processCalculations = React79__default.useCallback(
42816
+ const processCalculations = React80__default.useCallback(
42472
42817
  (changedFieldId, newFormData) => {
42473
42818
  if (!hiddenCalculations.length) return;
42474
42819
  const context = {
@@ -42493,7 +42838,7 @@ var init_Form = __esm({
42493
42838
  },
42494
42839
  [hiddenCalculations, externalContext, eventBus]
42495
42840
  );
42496
- const checkViolations = React79__default.useCallback(
42841
+ const checkViolations = React80__default.useCallback(
42497
42842
  (changedFieldId, newFormData) => {
42498
42843
  if (!violationTriggers.length) return;
42499
42844
  const context = {
@@ -42531,7 +42876,7 @@ var init_Form = __esm({
42531
42876
  processCalculations(name, newFormData);
42532
42877
  checkViolations(name, newFormData);
42533
42878
  };
42534
- const isFieldVisible = React79__default.useCallback(
42879
+ const isFieldVisible = React80__default.useCallback(
42535
42880
  (fieldName) => {
42536
42881
  const condition = conditionalFields[fieldName];
42537
42882
  if (!condition) return true;
@@ -42539,7 +42884,7 @@ var init_Form = __esm({
42539
42884
  },
42540
42885
  [conditionalFields, evalContext]
42541
42886
  );
42542
- const isSectionVisible = React79__default.useCallback(
42887
+ const isSectionVisible = React80__default.useCallback(
42543
42888
  (section) => {
42544
42889
  if (!section.condition) return true;
42545
42890
  return Boolean(evaluateFormExpression(section.condition, evalContext));
@@ -42615,7 +42960,7 @@ var init_Form = __esm({
42615
42960
  eventBus.emit(`UI:${onCancel}`);
42616
42961
  }
42617
42962
  };
42618
- const renderField = React79__default.useCallback(
42963
+ const renderField = React80__default.useCallback(
42619
42964
  (field) => {
42620
42965
  const fieldName = field.name || field.field;
42621
42966
  if (!fieldName) return null;
@@ -42636,7 +42981,7 @@ var init_Form = __esm({
42636
42981
  [formData, isFieldVisible, relationsData, relationsLoading, isLoading]
42637
42982
  );
42638
42983
  const effectiveFields = entityDerivedFields ?? fields;
42639
- const normalizedFields = React79__default.useMemo(() => {
42984
+ const normalizedFields = React80__default.useMemo(() => {
42640
42985
  if (!effectiveFields || effectiveFields.length === 0) return [];
42641
42986
  return effectiveFields.map((field) => {
42642
42987
  if (typeof field === "string") {
@@ -42659,7 +43004,7 @@ var init_Form = __esm({
42659
43004
  return field;
42660
43005
  });
42661
43006
  }, [effectiveFields, resolvedEntity]);
42662
- const schemaFields = React79__default.useMemo(() => {
43007
+ const schemaFields = React80__default.useMemo(() => {
42663
43008
  if (normalizedFields.length === 0) return null;
42664
43009
  if (isDebugEnabled()) {
42665
43010
  debugGroup(`Form: ${entityName || "unknown"}`);
@@ -42669,7 +43014,7 @@ var init_Form = __esm({
42669
43014
  }
42670
43015
  return normalizedFields.map(renderField).filter(Boolean);
42671
43016
  }, [normalizedFields, renderField, entityName, conditionalFields]);
42672
- const sectionElements = React79__default.useMemo(() => {
43017
+ const sectionElements = React80__default.useMemo(() => {
42673
43018
  if (!sections || sections.length === 0) return null;
42674
43019
  return sections.map((section) => {
42675
43020
  if (!isSectionVisible(section)) {
@@ -44466,9 +44811,9 @@ var init_GameCanvas3D2 = __esm({
44466
44811
  const color = unit.faction === "player" ? 4491519 : unit.faction === "enemy" ? 16729156 : 16777028;
44467
44812
  const hasAtlas = unitAtlasUrl(unit) !== null;
44468
44813
  const initialFrame = hasAtlas ? resolveUnitFrame(unit.id) : null;
44469
- const modelScale = UNIT_BASE_MODEL_SCALE * unitScale;
44470
- const billboardHeight = UNIT_BASE_BILLBOARD_HEIGHT * unitScale;
44471
- const primitiveRadius = UNIT_BASE_PRIMITIVE_RADIUS * unitScale;
44814
+ const modelScale = UNIT_BASE_MODEL_SCALE * unitScale * gridConfig.cellSize;
44815
+ const billboardHeight = UNIT_BASE_BILLBOARD_HEIGHT * unitScale * gridConfig.cellSize;
44816
+ const primitiveRadius = UNIT_BASE_PRIMITIVE_RADIUS * unitScale * gridConfig.cellSize;
44472
44817
  return /* @__PURE__ */ jsxs(
44473
44818
  "group",
44474
44819
  {
@@ -44515,7 +44860,7 @@ var init_GameCanvas3D2 = __esm({
44515
44860
  /* @__PURE__ */ jsx("meshStandardMaterial", { color })
44516
44861
  ] })
44517
44862
  ] }),
44518
- unit.health !== void 0 && unit.maxHealth !== void 0 && /* @__PURE__ */ jsxs("group", { position: [0, 1.2, 0], children: [
44863
+ unit.health !== void 0 && unit.maxHealth !== void 0 && /* @__PURE__ */ jsxs("group", { position: [0, billboardHeight, 0], children: [
44519
44864
  /* @__PURE__ */ jsxs("mesh", { position: [-0.25, 0, 0], children: [
44520
44865
  /* @__PURE__ */ jsx("planeGeometry", { args: [0.5, 0.05] }),
44521
44866
  /* @__PURE__ */ jsx("meshBasicMaterial", { color: 3355443 })
@@ -44544,7 +44889,7 @@ var init_GameCanvas3D2 = __esm({
44544
44889
  }
44545
44890
  );
44546
44891
  },
44547
- [selectedUnitId, handleUnitClick, resolveUnitFrame, unitScale]
44892
+ [selectedUnitId, handleUnitClick, resolveUnitFrame, unitScale, gridConfig]
44548
44893
  );
44549
44894
  const DefaultFeatureRenderer = useCallback(
44550
44895
  ({
@@ -44632,7 +44977,7 @@ var init_GameCanvas3D2 = __esm({
44632
44977
  {
44633
44978
  ref: containerRef,
44634
44979
  className: cn("game-canvas-3d relative w-full overflow-hidden", className),
44635
- style: { height: "85vh" },
44980
+ style: { flex: "1 1 0", minHeight: "400px" },
44636
44981
  "data-orientation": orientation,
44637
44982
  "data-camera-mode": cameraMode,
44638
44983
  "data-overlay": overlay,
@@ -44932,13 +45277,39 @@ var init_GameBoard3D = __esm({
44932
45277
  GameBoard3D.displayName = "GameBoard3D";
44933
45278
  }
44934
45279
  });
44935
- var GameShell;
45280
+ function getSlotContentRenderer() {
45281
+ if (_scr) return _scr;
45282
+ const mod = (init_UISlotRenderer(), __toCommonJS(UISlotRenderer_exports));
45283
+ _scr = mod.SlotContentRenderer;
45284
+ return _scr;
45285
+ }
45286
+ function resolveDescriptor(value, idPrefix) {
45287
+ if (value === null || value === void 0) return value;
45288
+ if (React80__default.isValidElement(value)) return value;
45289
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return value;
45290
+ if (Array.isArray(value)) {
45291
+ return value.map((item, i) => /* @__PURE__ */ jsx(React80__default.Fragment, { children: resolveDescriptor(item, `${idPrefix}-${i}`) }, i));
45292
+ }
45293
+ if (typeof value === "object") {
45294
+ const rec = value;
45295
+ if (typeof rec.type === "string" && getComponentForPattern(rec.type) !== null) {
45296
+ const { type, props: nestedProps, _id, ...flatProps } = rec;
45297
+ const resolvedProps = nestedProps !== void 0 ? nestedProps : flatProps;
45298
+ const content = { id: _id ?? idPrefix, pattern: type, props: resolvedProps, priority: 0 };
45299
+ const SCR = getSlotContentRenderer();
45300
+ return /* @__PURE__ */ jsx(SCR, { content, onDismiss: () => void 0 });
45301
+ }
45302
+ }
45303
+ return null;
45304
+ }
45305
+ var _scr, GameShell;
44936
45306
  var init_GameShell = __esm({
44937
45307
  "components/game/templates/GameShell.tsx"() {
44938
45308
  init_cn();
44939
45309
  init_Box();
44940
45310
  init_Stack();
44941
45311
  init_Typography();
45312
+ _scr = null;
44942
45313
  GameShell = ({
44943
45314
  appName = "Game",
44944
45315
  hud,
@@ -44987,7 +45358,7 @@ var init_GameShell = __esm({
44987
45358
  children: appName
44988
45359
  }
44989
45360
  ),
44990
- hud && /* @__PURE__ */ jsx(Box, { className: "game-shell__hud", children: hud })
45361
+ hud && /* @__PURE__ */ jsx(Box, { className: "game-shell__hud", children: resolveDescriptor(hud, "gs-hud") })
44991
45362
  ]
44992
45363
  }
44993
45364
  ),
@@ -45000,7 +45371,7 @@ var init_GameShell = __esm({
45000
45371
  overflow: "hidden",
45001
45372
  position: "relative"
45002
45373
  },
45003
- children
45374
+ children: resolveDescriptor(children, "gs-children")
45004
45375
  }
45005
45376
  )
45006
45377
  ]
@@ -45010,7 +45381,32 @@ var init_GameShell = __esm({
45010
45381
  GameShell.displayName = "GameShell";
45011
45382
  }
45012
45383
  });
45013
- var GameTemplate;
45384
+ function getSlotContentRenderer2() {
45385
+ if (_scr2) return _scr2;
45386
+ const mod = (init_UISlotRenderer(), __toCommonJS(UISlotRenderer_exports));
45387
+ _scr2 = mod.SlotContentRenderer;
45388
+ return _scr2;
45389
+ }
45390
+ function resolveDescriptor2(value, idPrefix) {
45391
+ if (value === null || value === void 0) return value;
45392
+ if (React80__default.isValidElement(value)) return value;
45393
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return value;
45394
+ if (Array.isArray(value)) {
45395
+ return value.map((item, i) => /* @__PURE__ */ jsx(React80__default.Fragment, { children: resolveDescriptor2(item, `${idPrefix}-${i}`) }, i));
45396
+ }
45397
+ if (typeof value === "object") {
45398
+ const rec = value;
45399
+ if (typeof rec.type === "string" && getComponentForPattern(rec.type) !== null) {
45400
+ const { type, props: nestedProps, _id, ...flatProps } = rec;
45401
+ const resolvedProps = nestedProps !== void 0 ? nestedProps : flatProps;
45402
+ const content = { id: _id ?? idPrefix, pattern: type, props: resolvedProps, priority: 0 };
45403
+ const SCR = getSlotContentRenderer2();
45404
+ return /* @__PURE__ */ jsx(SCR, { content, onDismiss: () => void 0 });
45405
+ }
45406
+ }
45407
+ return null;
45408
+ }
45409
+ var _scr2, GameTemplate;
45014
45410
  var init_GameTemplate = __esm({
45015
45411
  "components/game/templates/GameTemplate.tsx"() {
45016
45412
  init_cn();
@@ -45018,6 +45414,7 @@ var init_GameTemplate = __esm({
45018
45414
  init_Stack();
45019
45415
  init_Typography();
45020
45416
  init_Button();
45417
+ _scr2 = null;
45021
45418
  GameTemplate = ({
45022
45419
  entity,
45023
45420
  title = "Game",
@@ -45085,13 +45482,13 @@ var init_GameTemplate = __esm({
45085
45482
  fullWidth: true,
45086
45483
  className: "flex-1 bg-muted",
45087
45484
  children: [
45088
- children,
45485
+ resolveDescriptor2(children, "gt-children"),
45089
45486
  hud && /* @__PURE__ */ jsx(
45090
45487
  Box,
45091
45488
  {
45092
45489
  position: "absolute",
45093
45490
  className: "top-0 left-0 right-0 pointer-events-none",
45094
- children: /* @__PURE__ */ jsx(Box, { padding: "md", className: "pointer-events-auto w-fit", children: hud })
45491
+ children: /* @__PURE__ */ jsx(Box, { padding: "md", className: "pointer-events-auto w-fit", children: resolveDescriptor2(hud, "gt-hud") })
45095
45492
  }
45096
45493
  )
45097
45494
  ]
@@ -45116,7 +45513,7 @@ var init_GameTemplate = __esm({
45116
45513
  children: /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Debug Panel" })
45117
45514
  }
45118
45515
  ),
45119
- /* @__PURE__ */ jsx(Box, { padding: "md", children: debugPanel })
45516
+ /* @__PURE__ */ jsx(Box, { padding: "md", children: resolveDescriptor2(debugPanel, "gt-debug") })
45120
45517
  ]
45121
45518
  }
45122
45519
  )
@@ -45328,6 +45725,39 @@ var init_HexStrategyBoard = __esm({
45328
45725
  HexStrategyBoard.displayName = "HexStrategyBoard";
45329
45726
  }
45330
45727
  });
45728
+ function HolidayRunnerBoard({
45729
+ backgroundImage,
45730
+ assetBaseUrl,
45731
+ width = 800,
45732
+ height = 400,
45733
+ fps = 60,
45734
+ isLoading,
45735
+ error,
45736
+ className
45737
+ }) {
45738
+ return /* @__PURE__ */ jsxs("div", { className: cn("holiday-runner-board relative w-full h-full", className), children: [
45739
+ isLoading && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-black/40 z-10", children: /* @__PURE__ */ jsx("span", { className: "text-white text-sm", children: "Loading\u2026" }) }),
45740
+ error && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-black/60 z-10", children: /* @__PURE__ */ jsx("span", { className: "text-red-400 text-sm", children: error.message }) }),
45741
+ /* @__PURE__ */ jsx(
45742
+ GameCanvas2D,
45743
+ {
45744
+ width,
45745
+ height,
45746
+ fps,
45747
+ backgroundImage: backgroundImage ?? "",
45748
+ assetBaseUrl
45749
+ }
45750
+ )
45751
+ ] });
45752
+ }
45753
+ var init_HolidayRunnerBoard = __esm({
45754
+ "components/game/organisms/HolidayRunnerBoard.tsx"() {
45755
+ "use client";
45756
+ init_cn();
45757
+ init_GameCanvas2D();
45758
+ HolidayRunnerBoard.displayName = "HolidayRunnerBoard";
45759
+ }
45760
+ });
45331
45761
  var LandingPageTemplate;
45332
45762
  var init_LandingPageTemplate = __esm({
45333
45763
  "components/marketing/templates/LandingPageTemplate.tsx"() {
@@ -45663,7 +46093,7 @@ var init_List = __esm({
45663
46093
  if (entity && typeof entity === "object" && "id" in entity) return [entity];
45664
46094
  return [];
45665
46095
  }, [entity]);
45666
- const getItemActions = React79__default.useCallback(
46096
+ const getItemActions = React80__default.useCallback(
45667
46097
  (item) => {
45668
46098
  if (!itemActions) return [];
45669
46099
  if (typeof itemActions === "function") {
@@ -46082,6 +46512,48 @@ var init_MasterDetailLayout = __esm({
46082
46512
  MasterDetailLayout.displayName = "MasterDetailLayout";
46083
46513
  }
46084
46514
  });
46515
+ function MatchPuzzleBoard({
46516
+ tiles,
46517
+ units,
46518
+ features,
46519
+ assetManifest,
46520
+ assetBaseUrl,
46521
+ scale = 0.45,
46522
+ showMinimap = false,
46523
+ enableCamera = false,
46524
+ tileClickEvent,
46525
+ unitClickEvent,
46526
+ isLoading,
46527
+ error,
46528
+ className
46529
+ }) {
46530
+ return /* @__PURE__ */ jsx("div", { className: cn("match-puzzle-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
46531
+ IsometricCanvas_default,
46532
+ {
46533
+ tileLayout: "flat",
46534
+ tiles,
46535
+ units,
46536
+ features,
46537
+ assetManifest,
46538
+ assetBaseUrl,
46539
+ scale,
46540
+ showMinimap,
46541
+ enableCamera,
46542
+ tileClickEvent,
46543
+ unitClickEvent,
46544
+ isLoading,
46545
+ error
46546
+ }
46547
+ ) });
46548
+ }
46549
+ var init_MatchPuzzleBoard = __esm({
46550
+ "components/game/organisms/MatchPuzzleBoard.tsx"() {
46551
+ "use client";
46552
+ init_cn();
46553
+ init_IsometricCanvas();
46554
+ MatchPuzzleBoard.displayName = "MatchPuzzleBoard";
46555
+ }
46556
+ });
46085
46557
  var COLUMN_CLASSES, ASPECT_CLASSES, MediaGallery;
46086
46558
  var init_MediaGallery = __esm({
46087
46559
  "components/core/organisms/MediaGallery.tsx"() {
@@ -46139,7 +46611,7 @@ var init_MediaGallery = __esm({
46139
46611
  [selectable, selectedItems, selectionEvent, eventBus]
46140
46612
  );
46141
46613
  const entityData = Array.isArray(entity) ? entity : [];
46142
- const items = React79__default.useMemo(() => {
46614
+ const items = React80__default.useMemo(() => {
46143
46615
  if (propItems) return propItems;
46144
46616
  if (entityData.length === 0) return [];
46145
46617
  return entityData.map((record, idx) => ({
@@ -46309,9 +46781,9 @@ function MiniMap({
46309
46781
  viewportRect = DEFAULT_VIEWPORT,
46310
46782
  className
46311
46783
  }) {
46312
- const canvasRef = React79.useRef(null);
46313
- const frameRef = React79.useRef(0);
46314
- React79.useEffect(() => {
46784
+ const canvasRef = React80.useRef(null);
46785
+ const frameRef = React80.useRef(0);
46786
+ React80.useEffect(() => {
46315
46787
  const canvas = canvasRef.current;
46316
46788
  if (!canvas) return;
46317
46789
  const ctx = canvas.getContext("2d");
@@ -46407,8 +46879,50 @@ var init_MiniMap = __esm({
46407
46879
  MiniMap.displayName = "MiniMap";
46408
46880
  }
46409
46881
  });
46882
+ function MinigolfBoard({
46883
+ tiles,
46884
+ units,
46885
+ features,
46886
+ assetManifest,
46887
+ assetBaseUrl,
46888
+ scale = 0.45,
46889
+ showMinimap = true,
46890
+ enableCamera = true,
46891
+ tileClickEvent,
46892
+ unitClickEvent,
46893
+ isLoading,
46894
+ error,
46895
+ className
46896
+ }) {
46897
+ return /* @__PURE__ */ jsx("div", { className: cn("minigolf-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
46898
+ IsometricCanvas_default,
46899
+ {
46900
+ tileLayout: "isometric",
46901
+ tiles,
46902
+ units,
46903
+ features,
46904
+ assetManifest,
46905
+ assetBaseUrl,
46906
+ scale,
46907
+ showMinimap,
46908
+ enableCamera,
46909
+ tileClickEvent,
46910
+ unitClickEvent,
46911
+ isLoading,
46912
+ error
46913
+ }
46914
+ ) });
46915
+ }
46916
+ var init_MinigolfBoard = __esm({
46917
+ "components/game/organisms/MinigolfBoard.tsx"() {
46918
+ "use client";
46919
+ init_cn();
46920
+ init_IsometricCanvas();
46921
+ MinigolfBoard.displayName = "MinigolfBoard";
46922
+ }
46923
+ });
46410
46924
  function extractTitle2(children) {
46411
- if (!React79__default.isValidElement(children)) return void 0;
46925
+ if (!React80__default.isValidElement(children)) return void 0;
46412
46926
  const props = children.props;
46413
46927
  if (typeof props.title === "string") {
46414
46928
  return props.title;
@@ -46624,6 +47138,87 @@ var init_NegotiatorBoard = __esm({
46624
47138
  NegotiatorBoard.displayName = "NegotiatorBoard";
46625
47139
  }
46626
47140
  });
47141
+ function PinballBoard({
47142
+ tiles: _tiles,
47143
+ units: _units,
47144
+ features: _features,
47145
+ assetManifest: _assetManifest,
47146
+ assetBaseUrl,
47147
+ scale = 1,
47148
+ showMinimap: _showMinimap = false,
47149
+ enableCamera: _enableCamera = false,
47150
+ tileClickEvent: _tileClickEvent,
47151
+ unitClickEvent: _unitClickEvent,
47152
+ isLoading,
47153
+ error,
47154
+ className
47155
+ }) {
47156
+ if (isLoading) {
47157
+ return /* @__PURE__ */ jsx("div", { className: cn("pinball-board relative w-full h-full flex items-center justify-center", className), children: /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: "Loading..." }) });
47158
+ }
47159
+ if (error) {
47160
+ return /* @__PURE__ */ jsx("div", { className: cn("pinball-board relative w-full h-full flex items-center justify-center", className), children: /* @__PURE__ */ jsx("span", { className: "text-sm text-destructive", children: error.message }) });
47161
+ }
47162
+ return /* @__PURE__ */ jsx("div", { className: cn("pinball-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
47163
+ GameCanvas2D,
47164
+ {
47165
+ width: Math.round(400 * scale),
47166
+ height: Math.round(800 * scale),
47167
+ assetBaseUrl,
47168
+ fps: 60
47169
+ }
47170
+ ) });
47171
+ }
47172
+ var init_PinballBoard = __esm({
47173
+ "components/game/organisms/PinballBoard.tsx"() {
47174
+ "use client";
47175
+ init_cn();
47176
+ init_GameCanvas2D();
47177
+ PinballBoard.displayName = "PinballBoard";
47178
+ }
47179
+ });
47180
+ function PirateBoard({
47181
+ tiles,
47182
+ units,
47183
+ features,
47184
+ assetManifest,
47185
+ assetBaseUrl,
47186
+ scale = 0.45,
47187
+ showMinimap = true,
47188
+ enableCamera = true,
47189
+ tileClickEvent,
47190
+ unitClickEvent,
47191
+ isLoading,
47192
+ error,
47193
+ className
47194
+ }) {
47195
+ return /* @__PURE__ */ jsx("div", { className: cn("pirate-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
47196
+ IsometricCanvas_default,
47197
+ {
47198
+ tileLayout: "flat",
47199
+ tiles,
47200
+ units,
47201
+ features,
47202
+ assetManifest,
47203
+ assetBaseUrl,
47204
+ scale,
47205
+ showMinimap,
47206
+ enableCamera,
47207
+ tileClickEvent,
47208
+ unitClickEvent,
47209
+ isLoading,
47210
+ error
47211
+ }
47212
+ ) });
47213
+ }
47214
+ var init_PirateBoard = __esm({
47215
+ "components/game/organisms/PirateBoard.tsx"() {
47216
+ "use client";
47217
+ init_cn();
47218
+ init_IsometricCanvas();
47219
+ PirateBoard.displayName = "PirateBoard";
47220
+ }
47221
+ });
46627
47222
  function resolveEntity(entity) {
46628
47223
  if (!entity) return {};
46629
47224
  if (Array.isArray(entity)) return entity[0] ?? {};
@@ -46984,6 +47579,37 @@ var init_PricingPageTemplate = __esm({
46984
47579
  PricingPageTemplate.displayName = "PricingPageTemplate";
46985
47580
  }
46986
47581
  });
47582
+ function RacingBoard({
47583
+ backgroundImage,
47584
+ assetBaseUrl,
47585
+ width = 800,
47586
+ height = 600,
47587
+ fps = 60,
47588
+ tickEvent,
47589
+ drawEvent,
47590
+ className
47591
+ }) {
47592
+ return /* @__PURE__ */ jsx("div", { className: cn("racing-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
47593
+ GameCanvas2D,
47594
+ {
47595
+ backgroundImage,
47596
+ assetBaseUrl,
47597
+ width,
47598
+ height,
47599
+ fps,
47600
+ tickEvent: typeof tickEvent === "string" ? tickEvent : void 0,
47601
+ drawEvent: typeof drawEvent === "string" ? drawEvent : void 0
47602
+ }
47603
+ ) });
47604
+ }
47605
+ var init_RacingBoard = __esm({
47606
+ "components/game/organisms/RacingBoard.tsx"() {
47607
+ "use client";
47608
+ init_cn();
47609
+ init_GameCanvas2D();
47610
+ RacingBoard.displayName = "RacingBoard";
47611
+ }
47612
+ });
46987
47613
  function ResourceCounter({
46988
47614
  assetUrl = DEFAULT_ASSET_URL10,
46989
47615
  icon,
@@ -47525,7 +48151,7 @@ var init_debugRegistry = __esm({
47525
48151
  }
47526
48152
  });
47527
48153
  function useDebugData() {
47528
- const [data, setData] = React79.useState(() => ({
48154
+ const [data, setData] = React80.useState(() => ({
47529
48155
  traits: [],
47530
48156
  ticks: [],
47531
48157
  guards: [],
@@ -47539,7 +48165,7 @@ function useDebugData() {
47539
48165
  },
47540
48166
  lastUpdate: Date.now()
47541
48167
  }));
47542
- React79.useEffect(() => {
48168
+ React80.useEffect(() => {
47543
48169
  const updateData = () => {
47544
48170
  setData({
47545
48171
  traits: getAllTraits(),
@@ -47648,12 +48274,12 @@ function layoutGraph(states, transitions, initialState, width, height) {
47648
48274
  return positions;
47649
48275
  }
47650
48276
  function WalkMinimap() {
47651
- const [walkStep, setWalkStep] = React79.useState(null);
47652
- const [traits2, setTraits] = React79.useState([]);
47653
- const [coveredEdges, setCoveredEdges] = React79.useState([]);
47654
- const [completedTraits, setCompletedTraits] = React79.useState(/* @__PURE__ */ new Set());
47655
- const prevTraitRef = React79.useRef(null);
47656
- React79.useEffect(() => {
48277
+ const [walkStep, setWalkStep] = React80.useState(null);
48278
+ const [traits2, setTraits] = React80.useState([]);
48279
+ const [coveredEdges, setCoveredEdges] = React80.useState([]);
48280
+ const [completedTraits, setCompletedTraits] = React80.useState(/* @__PURE__ */ new Set());
48281
+ const prevTraitRef = React80.useRef(null);
48282
+ React80.useEffect(() => {
47657
48283
  const interval = setInterval(() => {
47658
48284
  const w = window;
47659
48285
  const step = w.__orbitalWalkStep;
@@ -48089,15 +48715,15 @@ var init_EntitiesTab = __esm({
48089
48715
  });
48090
48716
  function EventFlowTab({ events: events2 }) {
48091
48717
  const { t } = useTranslate();
48092
- const [filter, setFilter] = React79.useState("all");
48093
- const containerRef = React79.useRef(null);
48094
- const [autoScroll, setAutoScroll] = React79.useState(true);
48095
- React79.useEffect(() => {
48718
+ const [filter, setFilter] = React80.useState("all");
48719
+ const containerRef = React80.useRef(null);
48720
+ const [autoScroll, setAutoScroll] = React80.useState(true);
48721
+ React80.useEffect(() => {
48096
48722
  if (autoScroll && containerRef.current) {
48097
48723
  containerRef.current.scrollTop = containerRef.current.scrollHeight;
48098
48724
  }
48099
48725
  }, [events2.length, autoScroll]);
48100
- const filteredEvents = React79.useMemo(() => {
48726
+ const filteredEvents = React80.useMemo(() => {
48101
48727
  if (filter === "all") return events2;
48102
48728
  return events2.filter((e) => e.type === filter);
48103
48729
  }, [events2, filter]);
@@ -48213,7 +48839,7 @@ var init_EventFlowTab = __esm({
48213
48839
  });
48214
48840
  function GuardsPanel({ guards }) {
48215
48841
  const { t } = useTranslate();
48216
- const [filter, setFilter] = React79.useState("all");
48842
+ const [filter, setFilter] = React80.useState("all");
48217
48843
  if (guards.length === 0) {
48218
48844
  return /* @__PURE__ */ jsx(
48219
48845
  EmptyState,
@@ -48226,7 +48852,7 @@ function GuardsPanel({ guards }) {
48226
48852
  }
48227
48853
  const passedCount = guards.filter((g) => g.result).length;
48228
48854
  const failedCount = guards.length - passedCount;
48229
- const filteredGuards = React79.useMemo(() => {
48855
+ const filteredGuards = React80.useMemo(() => {
48230
48856
  if (filter === "all") return guards;
48231
48857
  if (filter === "passed") return guards.filter((g) => g.result);
48232
48858
  return guards.filter((g) => !g.result);
@@ -48389,10 +49015,10 @@ function EffectBadge({ effect }) {
48389
49015
  }
48390
49016
  function TransitionTimeline({ transitions }) {
48391
49017
  const { t } = useTranslate();
48392
- const containerRef = React79.useRef(null);
48393
- const [autoScroll, setAutoScroll] = React79.useState(true);
48394
- const [expandedId, setExpandedId] = React79.useState(null);
48395
- React79.useEffect(() => {
49018
+ const containerRef = React80.useRef(null);
49019
+ const [autoScroll, setAutoScroll] = React80.useState(true);
49020
+ const [expandedId, setExpandedId] = React80.useState(null);
49021
+ React80.useEffect(() => {
48396
49022
  if (autoScroll && containerRef.current) {
48397
49023
  containerRef.current.scrollTop = containerRef.current.scrollHeight;
48398
49024
  }
@@ -48672,9 +49298,9 @@ function getAllEvents(traits2) {
48672
49298
  function EventDispatcherTab({ traits: traits2, schema }) {
48673
49299
  const eventBus = useEventBus();
48674
49300
  const { t } = useTranslate();
48675
- const [log10, setLog] = React79.useState([]);
48676
- const prevStatesRef = React79.useRef(/* @__PURE__ */ new Map());
48677
- React79.useEffect(() => {
49301
+ const [log10, setLog] = React80.useState([]);
49302
+ const prevStatesRef = React80.useRef(/* @__PURE__ */ new Map());
49303
+ React80.useEffect(() => {
48678
49304
  for (const trait of traits2) {
48679
49305
  const prev = prevStatesRef.current.get(trait.id);
48680
49306
  if (prev && prev !== trait.currentState) {
@@ -48843,10 +49469,10 @@ function VerifyModePanel({
48843
49469
  localCount
48844
49470
  }) {
48845
49471
  const { t } = useTranslate();
48846
- const [expanded, setExpanded] = React79.useState(true);
48847
- const scrollRef = React79.useRef(null);
48848
- const prevCountRef = React79.useRef(0);
48849
- React79.useEffect(() => {
49472
+ const [expanded, setExpanded] = React80.useState(true);
49473
+ const scrollRef = React80.useRef(null);
49474
+ const prevCountRef = React80.useRef(0);
49475
+ React80.useEffect(() => {
48850
49476
  if (expanded && transitions.length > prevCountRef.current && scrollRef.current) {
48851
49477
  scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
48852
49478
  }
@@ -48903,10 +49529,10 @@ function RuntimeDebugger({
48903
49529
  schema
48904
49530
  }) {
48905
49531
  const { t } = useTranslate();
48906
- const [isCollapsed, setIsCollapsed] = React79.useState(mode === "verify" ? true : defaultCollapsed);
48907
- const [isVisible, setIsVisible] = React79.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
49532
+ const [isCollapsed, setIsCollapsed] = React80.useState(mode === "verify" ? true : defaultCollapsed);
49533
+ const [isVisible, setIsVisible] = React80.useState(mode === "inline" || mode === "verify" || isDebugEnabled2());
48908
49534
  const debugData = useDebugData();
48909
- React79.useEffect(() => {
49535
+ React80.useEffect(() => {
48910
49536
  if (mode === "inline") return;
48911
49537
  return onDebugToggle((enabled) => {
48912
49538
  setIsVisible(enabled);
@@ -48915,7 +49541,7 @@ function RuntimeDebugger({
48915
49541
  }
48916
49542
  });
48917
49543
  }, [mode]);
48918
- React79.useEffect(() => {
49544
+ React80.useEffect(() => {
48919
49545
  if (mode === "inline") return;
48920
49546
  const handleKeyDown = (e) => {
48921
49547
  if (e.key === "`" && isVisible) {
@@ -49475,7 +50101,7 @@ function SequenceBar({
49475
50101
  onSlotRemove(index);
49476
50102
  }, [onSlotRemove, playing]);
49477
50103
  const paddedSlots = Array.from({ length: maxSlots }, (_, i) => slots[i]);
49478
- return /* @__PURE__ */ jsx(HStack, { className: cn("items-center", className), gap: "sm", children: paddedSlots.map((slot, i) => /* @__PURE__ */ jsxs(React79__default.Fragment, { children: [
50104
+ return /* @__PURE__ */ jsx(HStack, { className: cn("items-center", className), gap: "sm", children: paddedSlots.map((slot, i) => /* @__PURE__ */ jsxs(React80__default.Fragment, { children: [
49479
50105
  i > 0 && /* @__PURE__ */ jsx(
49480
50106
  Typography,
49481
50107
  {
@@ -50236,6 +50862,123 @@ var init_SimulatorBoard = __esm({
50236
50862
  SimulatorBoard.displayName = "SimulatorBoard";
50237
50863
  }
50238
50864
  });
50865
+ function SokobanBoard({
50866
+ tiles,
50867
+ units,
50868
+ features,
50869
+ assetManifest,
50870
+ assetBaseUrl,
50871
+ scale = 0.45,
50872
+ showMinimap = false,
50873
+ enableCamera = false,
50874
+ tileClickEvent,
50875
+ unitClickEvent,
50876
+ isLoading,
50877
+ error,
50878
+ className
50879
+ }) {
50880
+ return /* @__PURE__ */ jsx("div", { className: cn("sokoban-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
50881
+ IsometricCanvas_default,
50882
+ {
50883
+ tileLayout: "flat",
50884
+ tiles,
50885
+ units,
50886
+ features,
50887
+ assetManifest,
50888
+ assetBaseUrl,
50889
+ scale,
50890
+ showMinimap,
50891
+ enableCamera,
50892
+ tileClickEvent,
50893
+ unitClickEvent,
50894
+ isLoading,
50895
+ error
50896
+ }
50897
+ ) });
50898
+ }
50899
+ var init_SokobanBoard = __esm({
50900
+ "components/game/organisms/SokobanBoard.tsx"() {
50901
+ "use client";
50902
+ init_cn();
50903
+ init_IsometricCanvas();
50904
+ SokobanBoard.displayName = "SokobanBoard";
50905
+ }
50906
+ });
50907
+ function SpaceShmupBoard({
50908
+ backgroundImage,
50909
+ assetBaseUrl,
50910
+ width = 800,
50911
+ height = 600,
50912
+ fps = 60,
50913
+ isLoading,
50914
+ error,
50915
+ className
50916
+ }) {
50917
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-shmup-board relative w-full h-full", className), children: [
50918
+ isLoading && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-black/60 z-10", children: /* @__PURE__ */ jsx("span", { className: "text-white text-sm", children: "Loading\u2026" }) }),
50919
+ error && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-red-900/60 z-10", children: /* @__PURE__ */ jsx("span", { className: "text-white text-sm", children: error.message }) }),
50920
+ /* @__PURE__ */ jsx(
50921
+ GameCanvas2D,
50922
+ {
50923
+ backgroundImage,
50924
+ assetBaseUrl,
50925
+ width,
50926
+ height,
50927
+ fps
50928
+ }
50929
+ )
50930
+ ] });
50931
+ }
50932
+ var init_SpaceShmupBoard = __esm({
50933
+ "components/game/organisms/SpaceShmupBoard.tsx"() {
50934
+ "use client";
50935
+ init_cn();
50936
+ init_GameCanvas2D();
50937
+ SpaceShmupBoard.displayName = "SpaceShmupBoard";
50938
+ }
50939
+ });
50940
+ function SpaceStationBoard({
50941
+ tiles,
50942
+ units,
50943
+ features,
50944
+ assetManifest,
50945
+ assetBaseUrl,
50946
+ scale = 0.45,
50947
+ showMinimap = true,
50948
+ enableCamera = true,
50949
+ tileClickEvent,
50950
+ unitClickEvent,
50951
+ isLoading,
50952
+ error,
50953
+ className
50954
+ }) {
50955
+ return /* @__PURE__ */ jsx("div", { className: cn("space-station-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
50956
+ IsometricCanvas_default,
50957
+ {
50958
+ tileLayout: "isometric",
50959
+ tiles,
50960
+ units,
50961
+ features,
50962
+ assetManifest,
50963
+ assetBaseUrl,
50964
+ scale,
50965
+ showMinimap,
50966
+ enableCamera,
50967
+ tileClickEvent,
50968
+ unitClickEvent,
50969
+ isLoading,
50970
+ error
50971
+ }
50972
+ ) });
50973
+ }
50974
+ var init_SpaceStationBoard = __esm({
50975
+ "components/game/organisms/SpaceStationBoard.tsx"() {
50976
+ "use client";
50977
+ init_cn();
50978
+ init_IsometricCanvas();
50979
+ SpaceStationBoard.displayName = "SpaceStationBoard";
50980
+ }
50981
+ });
50239
50982
  var SplitPane;
50240
50983
  var init_SplitPane = __esm({
50241
50984
  "components/core/organisms/layout/SplitPane.tsx"() {
@@ -50329,6 +51072,48 @@ var init_SplitPane = __esm({
50329
51072
  SplitPane.displayName = "SplitPane";
50330
51073
  }
50331
51074
  });
51075
+ function SportsBoard({
51076
+ tiles,
51077
+ units,
51078
+ features,
51079
+ assetManifest,
51080
+ assetBaseUrl,
51081
+ scale = 0.45,
51082
+ showMinimap = false,
51083
+ enableCamera = true,
51084
+ tileClickEvent,
51085
+ unitClickEvent,
51086
+ isLoading,
51087
+ error,
51088
+ className
51089
+ }) {
51090
+ return /* @__PURE__ */ jsx("div", { className: cn("sports-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
51091
+ IsometricCanvas_default,
51092
+ {
51093
+ tileLayout: "flat",
51094
+ tiles,
51095
+ units,
51096
+ features,
51097
+ assetManifest,
51098
+ assetBaseUrl,
51099
+ scale,
51100
+ showMinimap,
51101
+ enableCamera,
51102
+ tileClickEvent,
51103
+ unitClickEvent,
51104
+ isLoading,
51105
+ error
51106
+ }
51107
+ ) });
51108
+ }
51109
+ var init_SportsBoard = __esm({
51110
+ "components/game/organisms/SportsBoard.tsx"() {
51111
+ "use client";
51112
+ init_cn();
51113
+ init_IsometricCanvas();
51114
+ SportsBoard.displayName = "SportsBoard";
51115
+ }
51116
+ });
50332
51117
  function Sprite({
50333
51118
  spritesheet = "https://almadar-kflow-assets.web.app/shared/isometric-blocks/Spritesheet/allTiles_sheet.png",
50334
51119
  frameWidth = 64,
@@ -50474,7 +51259,7 @@ var init_StatCard = __esm({
50474
51259
  const labelToUse = propLabel ?? propTitle;
50475
51260
  const eventBus = useEventBus();
50476
51261
  const { t } = useTranslate();
50477
- const handleActionClick = React79__default.useCallback(() => {
51262
+ const handleActionClick = React80__default.useCallback(() => {
50478
51263
  if (action?.event) {
50479
51264
  eventBus.emit(`UI:${action.event}`, {});
50480
51265
  }
@@ -50485,7 +51270,7 @@ var init_StatCard = __esm({
50485
51270
  const data = Array.isArray(entity) ? entity : entity ? [entity] : [];
50486
51271
  const isLoading = externalLoading ?? false;
50487
51272
  const error = externalError;
50488
- const computeMetricValue = React79__default.useCallback(
51273
+ const computeMetricValue = React80__default.useCallback(
50489
51274
  (metric, items) => {
50490
51275
  if (metric.value !== void 0) {
50491
51276
  return metric.value;
@@ -50524,7 +51309,7 @@ var init_StatCard = __esm({
50524
51309
  },
50525
51310
  []
50526
51311
  );
50527
- const schemaStats = React79__default.useMemo(() => {
51312
+ const schemaStats = React80__default.useMemo(() => {
50528
51313
  if (!metrics || metrics.length === 0) return null;
50529
51314
  return metrics.map((metric) => ({
50530
51315
  label: metric.label,
@@ -50532,7 +51317,7 @@ var init_StatCard = __esm({
50532
51317
  format: metric.format
50533
51318
  }));
50534
51319
  }, [metrics, data, computeMetricValue]);
50535
- const calculatedTrend = React79__default.useMemo(() => {
51320
+ const calculatedTrend = React80__default.useMemo(() => {
50536
51321
  if (manualTrend !== void 0) return manualTrend;
50537
51322
  if (previousValue === void 0 || currentValue2 === void 0)
50538
51323
  return void 0;
@@ -51365,6 +52150,832 @@ var init_StepFlowOrganism = __esm({
51365
52150
  StepFlowOrganism.displayName = "StepFlowOrganism";
51366
52151
  }
51367
52152
  });
52153
+
52154
+ // components/core/molecules/markdown/index.ts
52155
+ var init_markdown = __esm({
52156
+ "components/core/molecules/markdown/index.ts"() {
52157
+ init_MarkdownContent();
52158
+ init_CodeBlock();
52159
+ }
52160
+ });
52161
+ function groupByOrbital(subagents) {
52162
+ const map = /* @__PURE__ */ new Map();
52163
+ for (const sub of subagents) {
52164
+ const key = sub.orbitalName ?? "(unattached)";
52165
+ const arr = map.get(key) ?? [];
52166
+ arr.push(sub);
52167
+ map.set(key, arr);
52168
+ }
52169
+ return map;
52170
+ }
52171
+ function statusIconName(status) {
52172
+ switch (status) {
52173
+ case "running":
52174
+ return "loader";
52175
+ case "complete":
52176
+ return "check";
52177
+ case "error":
52178
+ return "x";
52179
+ default:
52180
+ return "circle";
52181
+ }
52182
+ }
52183
+ function lastMessage(sub) {
52184
+ if (sub.messages.length === 0) return void 0;
52185
+ return sub.messages[sub.messages.length - 1].message;
52186
+ }
52187
+ function formatHHMMSS(ts) {
52188
+ const d = new Date(ts);
52189
+ const hh = String(d.getHours()).padStart(2, "0");
52190
+ const mm = String(d.getMinutes()).padStart(2, "0");
52191
+ const ss = String(d.getSeconds()).padStart(2, "0");
52192
+ return `${hh}:${mm}:${ss}`;
52193
+ }
52194
+ function compactJson(value) {
52195
+ if (value === void 0 || value === null) return "";
52196
+ if (typeof value === "string") return value;
52197
+ try {
52198
+ const json = JSON.stringify(value);
52199
+ if (json.length <= 240) return json;
52200
+ return json.slice(0, 239) + "\u2026";
52201
+ } catch {
52202
+ return String(value);
52203
+ }
52204
+ }
52205
+ function tryPrettyJson(s) {
52206
+ try {
52207
+ return JSON.stringify(JSON.parse(s), null, 2);
52208
+ } catch {
52209
+ return null;
52210
+ }
52211
+ }
52212
+ function summarizeArgs(args) {
52213
+ const keys = Object.keys(args);
52214
+ if (keys.length === 0) return "";
52215
+ return keys.slice(0, 3).join(", ") + (keys.length > 3 ? ", \u2026" : "");
52216
+ }
52217
+ function previewText(text, max = 120) {
52218
+ if (!text) return "";
52219
+ return text.length > max ? text.slice(0, max - 1) + "\u2026" : text;
52220
+ }
52221
+ function coordinatorToActivityItems(activities) {
52222
+ return activities.flatMap((a) => {
52223
+ switch (a.type) {
52224
+ case "tool_call":
52225
+ return [{
52226
+ type: "tool_call",
52227
+ tool: a.tool,
52228
+ args: a.args,
52229
+ timestamp: a.timestamp
52230
+ }];
52231
+ case "tool_result":
52232
+ return [{
52233
+ type: "tool_result",
52234
+ tool: a.tool,
52235
+ result: a.result,
52236
+ success: a.success,
52237
+ timestamp: a.timestamp
52238
+ }];
52239
+ case "message":
52240
+ return [{
52241
+ type: "message",
52242
+ role: a.role,
52243
+ content: a.content,
52244
+ timestamp: a.timestamp
52245
+ }];
52246
+ case "error":
52247
+ return [{
52248
+ type: "message",
52249
+ role: "system",
52250
+ content: `Error: ${a.message}`,
52251
+ timestamp: a.timestamp
52252
+ }];
52253
+ case "coordinator_decision":
52254
+ case "plan_committed":
52255
+ case "pending_question":
52256
+ case "clarification_question":
52257
+ return [];
52258
+ case "file_operation":
52259
+ return [{
52260
+ type: "file_operation",
52261
+ operation: a.operation,
52262
+ path: a.path,
52263
+ success: a.success,
52264
+ timestamp: a.timestamp
52265
+ }];
52266
+ case "schema_diff":
52267
+ return [{
52268
+ type: "schema_diff",
52269
+ filePath: a.filePath,
52270
+ hunks: a.hunks,
52271
+ timestamp: a.timestamp
52272
+ }];
52273
+ }
52274
+ });
52275
+ }
52276
+ function pluckCoordinatorState(activities) {
52277
+ let decision = null;
52278
+ let plan = null;
52279
+ const pendingQuestions = [];
52280
+ for (const a of activities) {
52281
+ if (a.type === "coordinator_decision") decision = a;
52282
+ else if (a.type === "plan_committed") plan = a;
52283
+ else if (a.type === "pending_question") pendingQuestions.push(a);
52284
+ }
52285
+ return { decision, plan, pendingQuestions };
52286
+ }
52287
+ function subagentMessagesToActivities(messages) {
52288
+ return messages.map((m) => {
52289
+ if (m.tool) {
52290
+ return {
52291
+ type: "tool_call",
52292
+ tool: m.tool,
52293
+ args: { preview: m.message },
52294
+ timestamp: m.timestamp
52295
+ };
52296
+ }
52297
+ return {
52298
+ type: "message",
52299
+ role: "system",
52300
+ content: m.message,
52301
+ timestamp: m.timestamp
52302
+ };
52303
+ });
52304
+ }
52305
+ function buildTimelineItems(messages, activities, subagents) {
52306
+ const items = [];
52307
+ if (messages) {
52308
+ messages.forEach((m, i) => items.push({ source: "message", data: m, index: i }));
52309
+ }
52310
+ if (activities) {
52311
+ activities.forEach((a) => items.push({ source: "activity", data: a }));
52312
+ }
52313
+ subagents.forEach((s) => items.push({ source: "subagent", data: s }));
52314
+ return items;
52315
+ }
52316
+ function timelineItemIcon(item) {
52317
+ switch (item.source) {
52318
+ case "message": {
52319
+ const m = item.data;
52320
+ if (m.role === "tool") return { name: "terminal", color: "text-[var(--color-primary)]" };
52321
+ if (m.reasoningContent) return { name: "sparkles", color: "text-[var(--color-primary)]" };
52322
+ if (m.role === "user") return { name: "user", color: "text-[var(--color-primary)]" };
52323
+ return { name: "message-square", color: "text-[var(--color-muted-foreground)]" };
52324
+ }
52325
+ case "activity": {
52326
+ const a = item.data;
52327
+ switch (a.type) {
52328
+ case "tool_call":
52329
+ return { name: "terminal", color: "text-[var(--color-primary)]" };
52330
+ case "tool_result":
52331
+ return { name: a.success !== false ? "check" : "x", color: a.success !== false ? "text-[var(--color-success)]" : "text-[var(--color-danger)]" };
52332
+ case "error":
52333
+ return { name: "alert-triangle", color: "text-[var(--color-danger)]" };
52334
+ case "file_operation":
52335
+ return { name: "file", color: "text-[var(--color-muted-foreground)]" };
52336
+ case "schema_diff":
52337
+ return { name: "git-commit", color: "text-[var(--color-muted-foreground)]" };
52338
+ default:
52339
+ return { name: "info", color: "text-[var(--color-muted-foreground)]" };
52340
+ }
52341
+ }
52342
+ case "subagent":
52343
+ return { name: "bot", color: "text-[var(--color-primary)]" };
52344
+ }
52345
+ }
52346
+ function timelineItemLabel(item) {
52347
+ switch (item.source) {
52348
+ case "message": {
52349
+ const m = item.data;
52350
+ if (m.role === "tool") return "tool";
52351
+ if (m.reasoningContent) return "thinking";
52352
+ return m.role;
52353
+ }
52354
+ case "activity":
52355
+ return item.data.type;
52356
+ case "subagent":
52357
+ return "subagent";
52358
+ }
52359
+ }
52360
+ function timelineItemPreview(item) {
52361
+ switch (item.source) {
52362
+ case "message": {
52363
+ const m = item.data;
52364
+ if (m.role === "tool") return `${m.toolName ?? "tool"} \u2192 ${m.toolCallId?.slice(0, 8) ?? ""}`;
52365
+ if (m.reasoningContent) return previewText(m.reasoningContent, 120);
52366
+ return previewText(m.content, 120);
52367
+ }
52368
+ case "activity": {
52369
+ const a = item.data;
52370
+ switch (a.type) {
52371
+ case "tool_call":
52372
+ return `${a.tool}(${summarizeArgs(a.args)})`;
52373
+ case "tool_result":
52374
+ return `${a.tool}: ${compactJson(a.result)}`;
52375
+ case "message":
52376
+ return previewText(a.content, 120);
52377
+ case "error":
52378
+ return previewText(a.message, 120);
52379
+ case "file_operation":
52380
+ return `${a.operation} ${a.path}`;
52381
+ case "schema_diff":
52382
+ return `diff ${a.filePath}`;
52383
+ default:
52384
+ return String(a.type);
52385
+ }
52386
+ }
52387
+ case "subagent":
52388
+ return `${item.data.name} \xB7 ${item.data.task}`;
52389
+ }
52390
+ }
52391
+ function timelineItemTimeLabel(item) {
52392
+ if (item.source === "activity") return formatHHMMSS(item.data.timestamp);
52393
+ if (item.source === "subagent") {
52394
+ const ts = item.data.messages[0]?.timestamp;
52395
+ return ts !== void 0 ? formatHHMMSS(ts) : void 0;
52396
+ }
52397
+ return void 0;
52398
+ }
52399
+ function TraceDetailContent({ item }) {
52400
+ const { t } = useTranslate();
52401
+ switch (item.source) {
52402
+ case "message": {
52403
+ const m = item.data;
52404
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52405
+ /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "items-center", children: /* @__PURE__ */ jsx(Badge, { variant: roleBadgeVariant[m.role], className: "text-[10px] uppercase", children: m.role }) }),
52406
+ typeof m.reasoningContent === "string" && m.reasoningContent.length > 0 && /* @__PURE__ */ jsxs(Box, { children: [
52407
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "mb-1", children: t("subagentTrace.reasoning") }),
52408
+ /* @__PURE__ */ jsx(MarkdownContent, { content: m.reasoningContent })
52409
+ ] }),
52410
+ m.content.length > 0 && /* @__PURE__ */ jsxs(Box, { children: [
52411
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "mb-1", children: t("subagentTrace.content") }),
52412
+ m.role === "tool" ? (() => {
52413
+ const pretty = tryPrettyJson(m.content);
52414
+ return pretty !== null ? /* @__PURE__ */ jsx(CodeBlock, { code: pretty, language: "json", maxHeight: "24rem" }) : /* @__PURE__ */ jsx(Typography, { variant: "body", className: "whitespace-pre-wrap font-mono text-[11px]", children: m.content });
52415
+ })() : /* @__PURE__ */ jsx(MarkdownContent, { content: m.content })
52416
+ ] }),
52417
+ Array.isArray(m.toolCalls) && m.toolCalls.length > 0 && /* @__PURE__ */ jsxs(Box, { children: [
52418
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "mb-1", children: t("subagentTrace.toolCalls") }),
52419
+ /* @__PURE__ */ jsx(
52420
+ Accordion,
52421
+ {
52422
+ multiple: true,
52423
+ items: m.toolCalls.map((tc, i) => ({
52424
+ id: `tc-detail-${i}`,
52425
+ title: `${tc.name}(${summarizeArgs(tc.args)})`,
52426
+ content: /* @__PURE__ */ jsx(CodeBlock, { code: JSON.stringify(tc.args, null, 2), language: "json", maxHeight: "24rem" })
52427
+ }))
52428
+ }
52429
+ )
52430
+ ] })
52431
+ ] });
52432
+ }
52433
+ case "activity": {
52434
+ const a = item.data;
52435
+ switch (a.type) {
52436
+ case "tool_call":
52437
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52438
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52439
+ /* @__PURE__ */ jsx(Badge, { variant: "default", className: "text-[10px]", children: "tool_call" }),
52440
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: formatHHMMSS(a.timestamp) })
52441
+ ] }),
52442
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: a.tool }),
52443
+ /* @__PURE__ */ jsx(CodeBlock, { code: JSON.stringify(a.args, null, 2), language: "json", maxHeight: "60vh" })
52444
+ ] });
52445
+ case "tool_result":
52446
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52447
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52448
+ /* @__PURE__ */ jsx(Badge, { variant: a.success !== false ? "default" : "warning", className: "text-[10px]", children: a.success !== false ? "success" : "fail" }),
52449
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: formatHHMMSS(a.timestamp) })
52450
+ ] }),
52451
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: a.tool }),
52452
+ /* @__PURE__ */ jsx(CodeBlock, { code: JSON.stringify(a.result, null, 2), language: "json", maxHeight: "60vh" })
52453
+ ] });
52454
+ case "message":
52455
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52456
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52457
+ /* @__PURE__ */ jsx(Badge, { variant: "neutral", className: "text-[10px]", children: a.role }),
52458
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: formatHHMMSS(a.timestamp) })
52459
+ ] }),
52460
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "whitespace-pre-wrap", children: a.content })
52461
+ ] });
52462
+ case "error":
52463
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52464
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52465
+ /* @__PURE__ */ jsx(Badge, { variant: "warning", className: "text-[10px]", children: "error" }),
52466
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: formatHHMMSS(a.timestamp) })
52467
+ ] }),
52468
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "whitespace-pre-wrap text-[var(--color-danger)]", children: a.message })
52469
+ ] });
52470
+ case "file_operation":
52471
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52472
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52473
+ /* @__PURE__ */ jsx(Badge, { variant: "neutral", className: "text-[10px]", children: "file" }),
52474
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: formatHHMMSS(a.timestamp) })
52475
+ ] }),
52476
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
52477
+ a.operation,
52478
+ " ",
52479
+ a.path
52480
+ ] })
52481
+ ] });
52482
+ case "schema_diff":
52483
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52484
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52485
+ /* @__PURE__ */ jsx(Badge, { variant: "neutral", className: "text-[10px]", children: "diff" }),
52486
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: formatHHMMSS(a.timestamp) })
52487
+ ] }),
52488
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: a.filePath })
52489
+ ] });
52490
+ default:
52491
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52492
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: formatHHMMSS(a.timestamp) }),
52493
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: String(a.type) })
52494
+ ] });
52495
+ }
52496
+ }
52497
+ case "subagent": {
52498
+ const s = item.data;
52499
+ const activities = subagentMessagesToActivities(s.messages);
52500
+ const ts = s.messages[0]?.timestamp;
52501
+ return /* @__PURE__ */ jsxs(VStack, { gap: "md", children: [
52502
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52503
+ /* @__PURE__ */ jsx(Badge, { variant: "default", className: "text-[10px]", children: s.role }),
52504
+ ts !== void 0 && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: formatHHMMSS(ts) })
52505
+ ] }),
52506
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", weight: "semibold", children: s.name }),
52507
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "muted", children: s.task }),
52508
+ activities.length > 0 && /* @__PURE__ */ jsx(Box, { className: "border-t border-[var(--color-border)] pt-2", children: /* @__PURE__ */ jsx(InlineActivityStream, { activities, autoScroll: false }) })
52509
+ ] });
52510
+ }
52511
+ }
52512
+ }
52513
+ var InlineActivityRow, InlineActivityStream, CoordinatorCard, SubagentRow, OrbitalGroup, SubagentRichCard, roleBadgeVariant, ChatMessageRow, CoordinatorConversation, SubagentTracePanel;
52514
+ var init_SubagentTracePanel = __esm({
52515
+ "components/core/organisms/SubagentTracePanel.tsx"() {
52516
+ "use client";
52517
+ init_Box();
52518
+ init_Stack();
52519
+ init_Typography();
52520
+ init_Badge();
52521
+ init_Icon();
52522
+ init_Button();
52523
+ init_Modal();
52524
+ init_Accordion();
52525
+ init_markdown();
52526
+ InlineActivityRow = ({ activity }) => {
52527
+ const time = formatHHMMSS(activity.timestamp);
52528
+ const baseRow = "items-start px-3 py-1 hover:bg-[var(--color-surface)]";
52529
+ if (activity.type === "tool_call") {
52530
+ return /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: baseRow, children: [
52531
+ /* @__PURE__ */ jsx(Icon, { name: "terminal", size: "xs", className: "mt-0.5 flex-shrink-0 text-[var(--color-primary)]" }),
52532
+ /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "flex-1 min-w-0 text-[11px] font-mono break-all whitespace-pre-wrap", children: [
52533
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", weight: "semibold", className: "text-[11px] font-mono", children: activity.tool }),
52534
+ activity.args !== void 0 && /* @__PURE__ */ jsxs(Typography, { as: "span", variant: "caption", color: "muted", className: "text-[11px] font-mono", children: [
52535
+ " ",
52536
+ compactJson(activity.args)
52537
+ ] })
52538
+ ] }),
52539
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px] flex-shrink-0 tabular-nums mt-0.5", children: time })
52540
+ ] });
52541
+ }
52542
+ if (activity.type === "tool_result") {
52543
+ const success = activity.success !== false;
52544
+ return /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: baseRow, children: [
52545
+ /* @__PURE__ */ jsx(
52546
+ Icon,
52547
+ {
52548
+ name: success ? "check" : "x",
52549
+ size: "xs",
52550
+ className: `mt-0.5 flex-shrink-0 ${success ? "text-[var(--color-success)]" : "text-[var(--color-danger)]"}`
52551
+ }
52552
+ ),
52553
+ /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "flex-1 min-w-0 text-[11px] font-mono break-all whitespace-pre-wrap", children: [
52554
+ /* @__PURE__ */ jsxs(Typography, { as: "span", variant: "caption", color: "muted", className: "text-[11px] font-mono", children: [
52555
+ activity.tool,
52556
+ ":",
52557
+ " "
52558
+ ] }),
52559
+ /* @__PURE__ */ jsx(Typography, { as: "span", variant: "caption", className: "text-[11px] font-mono", children: compactJson(activity.result) })
52560
+ ] }),
52561
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px] flex-shrink-0 tabular-nums mt-0.5", children: time })
52562
+ ] });
52563
+ }
52564
+ if (activity.type === "message") {
52565
+ const role = activity.role;
52566
+ const iconName = role === "user" ? "user" : role === "system" ? "info" : "sparkles";
52567
+ const roleColor = role === "user" ? "text-[var(--color-primary)]" : role === "system" ? "text-[var(--color-muted-foreground)]" : "text-[var(--color-foreground)]";
52568
+ return /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: baseRow, children: [
52569
+ /* @__PURE__ */ jsx(Icon, { name: iconName, size: "xs", className: `mt-0.5 flex-shrink-0 ${roleColor}` }),
52570
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "flex-1 min-w-0 text-[11px] whitespace-pre-wrap break-words", children: activity.content }),
52571
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px] flex-shrink-0 tabular-nums mt-0.5", children: time })
52572
+ ] });
52573
+ }
52574
+ if (activity.type === "error") {
52575
+ return /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: baseRow, children: [
52576
+ /* @__PURE__ */ jsx(Icon, { name: "alert-triangle", size: "xs", className: "mt-0.5 flex-shrink-0 text-[var(--color-danger)]" }),
52577
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "flex-1 min-w-0 text-[11px] text-[var(--color-danger)] whitespace-pre-wrap break-words", children: activity.message }),
52578
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px] flex-shrink-0 tabular-nums mt-0.5", children: time })
52579
+ ] });
52580
+ }
52581
+ return /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: baseRow, children: [
52582
+ /* @__PURE__ */ jsx(Icon, { name: "file", size: "xs", className: "mt-0.5 flex-shrink-0 text-[var(--color-muted-foreground)]" }),
52583
+ /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "muted", className: "flex-1 min-w-0 text-[11px] font-mono break-all", children: [
52584
+ "[",
52585
+ activity.type,
52586
+ "] ",
52587
+ compactJson(activity)
52588
+ ] }),
52589
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px] flex-shrink-0 tabular-nums mt-0.5", children: time })
52590
+ ] });
52591
+ };
52592
+ InlineActivityStream = ({ activities, autoScroll = true, className }) => {
52593
+ const endRef = React80__default.useRef(null);
52594
+ React80__default.useEffect(() => {
52595
+ if (!autoScroll) return;
52596
+ endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" });
52597
+ }, [activities.length, autoScroll]);
52598
+ return /* @__PURE__ */ jsxs(Box, { className, children: [
52599
+ activities.map((a, i) => /* @__PURE__ */ jsx(InlineActivityRow, { activity: a }, `${a.timestamp}-${i}`)),
52600
+ /* @__PURE__ */ jsx(Box, { ref: endRef })
52601
+ ] });
52602
+ };
52603
+ CoordinatorCard = ({ snapshot, className }) => {
52604
+ const { t } = useTranslate();
52605
+ const { decision, plan, pendingQuestions } = snapshot;
52606
+ if (!decision && !plan && pendingQuestions.length === 0) return null;
52607
+ return /* @__PURE__ */ jsxs(
52608
+ Box,
52609
+ {
52610
+ className: `px-3 py-2 border-b border-[var(--color-border)] bg-[var(--color-muted)]/30 ${className ?? ""}`,
52611
+ children: [
52612
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center mb-2", children: [
52613
+ /* @__PURE__ */ jsx(Icon, { name: "compass", size: "xs" }),
52614
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold text-[11px]", children: t("subagentTrace.coordinator") })
52615
+ ] }),
52616
+ decision && /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "mb-2", children: [
52617
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52618
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px] uppercase tracking-wide", children: t("subagentTrace.organism") }),
52619
+ /* @__PURE__ */ jsx(Badge, { variant: "default", className: "text-[10px]", children: decision.organism }),
52620
+ decision.priorOrganism && decision.priorOrganism !== decision.organism && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px]", children: t("subagentTrace.wasOrganism", { organism: decision.priorOrganism }) })
52621
+ ] }),
52622
+ decision.reason && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[11px] mt-0.5", children: decision.reason })
52623
+ ] }),
52624
+ plan && plan.orbitals.length > 0 && /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "mb-2", children: [
52625
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px] uppercase tracking-wide mb-0.5", children: plan.orbitals.length === 1 ? t("subagentTrace.planOrbital", { count: plan.orbitals.length }) : t("subagentTrace.planOrbitals", { count: plan.orbitals.length }) }),
52626
+ /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "flex-wrap", children: plan.orbitals.map((o) => /* @__PURE__ */ jsx(Badge, { variant: "neutral", className: "text-[10px]", children: o }, o)) })
52627
+ ] }),
52628
+ pendingQuestions.length > 0 && /* @__PURE__ */ jsxs(VStack, { gap: "none", children: [
52629
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px] uppercase tracking-wide mb-0.5", children: pendingQuestions.length === 1 ? t("subagentTrace.pendingQuestion", { count: pendingQuestions.length }) : t("subagentTrace.pendingQuestions", { count: pendingQuestions.length }) }),
52630
+ pendingQuestions.map((q) => /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-start", children: [
52631
+ /* @__PURE__ */ jsx(Icon, { name: "help-circle", size: "xs", className: "mt-0.5 flex-shrink-0 text-[var(--color-warning)]" }),
52632
+ /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "text-[11px] flex-1 min-w-0", children: [
52633
+ q.question,
52634
+ q.orbitalName && /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "muted", className: "text-[10px] ml-1", children: [
52635
+ "(",
52636
+ q.orbitalName,
52637
+ ")"
52638
+ ] })
52639
+ ] })
52640
+ ] }, q.questionId))
52641
+ ] })
52642
+ ]
52643
+ }
52644
+ );
52645
+ };
52646
+ SubagentRow = ({ subagent }) => {
52647
+ const recent = lastMessage(subagent);
52648
+ return /* @__PURE__ */ jsxs(
52649
+ HStack,
52650
+ {
52651
+ gap: "sm",
52652
+ className: "items-start px-3 py-2 border-b border-[var(--color-border)]",
52653
+ children: [
52654
+ /* @__PURE__ */ jsx(Box, { className: "pt-0.5", children: /* @__PURE__ */ jsx(Icon, { name: statusIconName(subagent.status), size: "xs" }) }),
52655
+ /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "flex-1 min-w-0", children: [
52656
+ /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "items-center", children: [
52657
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-medium truncate", children: subagent.name }),
52658
+ /* @__PURE__ */ jsx(Badge, { variant: "default", children: subagent.role })
52659
+ ] }),
52660
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "truncate", children: recent ?? subagent.task })
52661
+ ] })
52662
+ ]
52663
+ }
52664
+ );
52665
+ };
52666
+ OrbitalGroup = ({ orbitalName, subagents }) => {
52667
+ const { t } = useTranslate();
52668
+ const runningCount = subagents.filter((s) => s.status === "running").length;
52669
+ const completeCount = subagents.filter((s) => s.status === "complete").length;
52670
+ return /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "border-b border-[var(--color-border)]", children: [
52671
+ /* @__PURE__ */ jsxs(
52672
+ HStack,
52673
+ {
52674
+ gap: "sm",
52675
+ className: "items-center px-3 py-2 bg-[var(--color-surface)] border-b border-[var(--color-border)]",
52676
+ children: [
52677
+ /* @__PURE__ */ jsx(Icon, { name: "circle", size: "xs" }),
52678
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold flex-1 truncate", children: orbitalName }),
52679
+ /* @__PURE__ */ jsx(Badge, { variant: "default", children: runningCount > 0 ? t("subagentTrace.countRunning", { count: runningCount }) : t("subagentTrace.countDone", { count: completeCount }) })
52680
+ ]
52681
+ }
52682
+ ),
52683
+ subagents.map((sub) => /* @__PURE__ */ jsx(SubagentRow, { subagent: sub }, sub.id))
52684
+ ] });
52685
+ };
52686
+ SubagentRichCard = ({ subagent }) => {
52687
+ const { t } = useTranslate();
52688
+ const activities = React80__default.useMemo(
52689
+ () => subagentMessagesToActivities(subagent.messages),
52690
+ [subagent.messages]
52691
+ );
52692
+ return /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "border-b border-[var(--color-border)] p-3", children: [
52693
+ /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "items-center mb-2", children: [
52694
+ /* @__PURE__ */ jsx(
52695
+ Box,
52696
+ {
52697
+ style: {
52698
+ width: 8,
52699
+ height: 8,
52700
+ borderRadius: "50%",
52701
+ flexShrink: 0,
52702
+ backgroundColor: subagent.status === "complete" ? "var(--color-success)" : subagent.status === "error" ? "var(--color-error)" : "var(--color-primary)",
52703
+ ...subagent.status === "running" ? { animation: "pulse 1.5s infinite" } : {}
52704
+ }
52705
+ }
52706
+ ),
52707
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold flex-1 truncate", children: subagent.name }),
52708
+ /* @__PURE__ */ jsx(Badge, { variant: subagent.role === "deterministic" ? "default" : subagent.role === "llm" ? "info" : "warning", children: subagent.role }),
52709
+ subagent.durationMs !== void 0 && subagent.durationMs > 0 && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: subagent.durationMs < 1e3 ? `${subagent.durationMs}ms` : `${(subagent.durationMs / 1e3).toFixed(1)}s` })
52710
+ ] }),
52711
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "mb-2", children: subagent.task }),
52712
+ activities.length > 0 ? /* @__PURE__ */ jsx(Box, { className: "max-h-64 overflow-y-auto border-t border-[var(--color-border)]", children: /* @__PURE__ */ jsx(InlineActivityStream, { activities, autoScroll: true }) }) : /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "italic text-[10px]", children: subagent.status === "complete" ? t("subagentTrace.noConversationLog") : t("subagentTrace.waitingForProcessData") })
52713
+ ] });
52714
+ };
52715
+ roleBadgeVariant = {
52716
+ system: "neutral",
52717
+ user: "info",
52718
+ assistant: "default",
52719
+ tool: "warning"
52720
+ };
52721
+ ChatMessageRow = ({ message, index }) => {
52722
+ const { t } = useTranslate();
52723
+ const { role, content, toolCalls, reasoningContent, toolCallId, toolName } = message;
52724
+ if (role === "tool") {
52725
+ const pretty = tryPrettyJson(content);
52726
+ const title = `${toolName ?? "tool"} \u2192${toolCallId ? ` ${toolCallId.slice(0, 8)}` : ""}`;
52727
+ const body = pretty !== null ? /* @__PURE__ */ jsx(CodeBlock, { code: pretty, language: "json", maxHeight: "24rem" }) : /* @__PURE__ */ jsx(Typography, { variant: "body", className: "whitespace-pre-wrap font-mono text-[11px]", children: content });
52728
+ const items = [{ id: `tool-${index}`, title, content: body }];
52729
+ return /* @__PURE__ */ jsx(Box, { className: "px-3 py-2 border-b border-[var(--color-border)]", children: /* @__PURE__ */ jsx(Accordion, { items }) });
52730
+ }
52731
+ const hasReasoning = typeof reasoningContent === "string" && reasoningContent.length > 0;
52732
+ const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;
52733
+ return /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: "px-3 py-2 border-b border-[var(--color-border)]", children: [
52734
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52735
+ /* @__PURE__ */ jsx(Badge, { variant: roleBadgeVariant[role], className: "text-[10px] uppercase", children: role }),
52736
+ hasReasoning && /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "muted", className: "text-[10px]", children: [
52737
+ "\xB7 ",
52738
+ t("subagentTrace.thinking")
52739
+ ] }),
52740
+ hasToolCalls && /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "muted", className: "text-[10px]", children: [
52741
+ "\xB7 ",
52742
+ toolCalls.length === 1 ? t("subagentTrace.toolCallCount", { count: toolCalls.length }) : t("subagentTrace.toolCallCountPlural", { count: toolCalls.length })
52743
+ ] })
52744
+ ] }),
52745
+ hasReasoning && /* @__PURE__ */ jsx(Accordion, { items: [{
52746
+ id: `reasoning-${index}`,
52747
+ title: t("subagentTrace.reasoning"),
52748
+ content: /* @__PURE__ */ jsx(MarkdownContent, { content: reasoningContent })
52749
+ }] }),
52750
+ content.length > 0 && /* @__PURE__ */ jsx(MarkdownContent, { content }),
52751
+ hasToolCalls && /* @__PURE__ */ jsx(
52752
+ Accordion,
52753
+ {
52754
+ multiple: true,
52755
+ items: toolCalls.map((tc, i) => ({
52756
+ id: `tc-${index}-${i}`,
52757
+ title: `${tc.name}(${summarizeArgs(tc.args)})`,
52758
+ content: /* @__PURE__ */ jsx(CodeBlock, { code: JSON.stringify(tc.args, null, 2), language: "json", maxHeight: "24rem" })
52759
+ }))
52760
+ }
52761
+ )
52762
+ ] });
52763
+ };
52764
+ CoordinatorConversation = ({ messages, autoScroll = true, className }) => {
52765
+ const endRef = React80__default.useRef(null);
52766
+ React80__default.useEffect(() => {
52767
+ if (!autoScroll) return;
52768
+ endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" });
52769
+ }, [messages.length, autoScroll]);
52770
+ return /* @__PURE__ */ jsxs(Box, { className, children: [
52771
+ messages.map((m, i) => /* @__PURE__ */ jsx(ChatMessageRow, { message: m, index: i }, `msg-${i}`)),
52772
+ /* @__PURE__ */ jsx(Box, { ref: endRef })
52773
+ ] });
52774
+ };
52775
+ SubagentTracePanel = ({
52776
+ subagents,
52777
+ focusedOrbital,
52778
+ disclosureLevel,
52779
+ open,
52780
+ onClose,
52781
+ className,
52782
+ mode = "overlay",
52783
+ coordinatorActivities,
52784
+ coordinatorMessages
52785
+ }) => {
52786
+ const { t } = useTranslate();
52787
+ const [selectedItem, setSelectedItem] = useState(null);
52788
+ const densityLabel = (rich) => rich ? t("subagentTrace.densityRich") : t("subagentTrace.densityCompact");
52789
+ if (mode === "overlay" && !open) return null;
52790
+ const isTabMode = mode === "tab";
52791
+ const isRichMode = isTabMode || disclosureLevel >= 3;
52792
+ if (isTabMode) {
52793
+ const timelineItems = buildTimelineItems(coordinatorMessages, coordinatorActivities, subagents);
52794
+ const hasData = timelineItems.length > 0;
52795
+ return /* @__PURE__ */ jsxs(Box, { className: `h-full w-full bg-[var(--color-card)] overflow-hidden flex flex-col ${className ?? ""}`, children: [
52796
+ /* @__PURE__ */ jsxs(
52797
+ HStack,
52798
+ {
52799
+ gap: "sm",
52800
+ className: "items-center px-3 py-2 border-b border-[var(--color-border)]",
52801
+ children: [
52802
+ /* @__PURE__ */ jsx(Icon, { name: "activity", size: "sm" }),
52803
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold flex-1", children: t("subagentTrace.trace") }),
52804
+ onClose && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, children: /* @__PURE__ */ jsx(Icon, { name: "x", size: "xs" }) })
52805
+ ]
52806
+ }
52807
+ ),
52808
+ !hasData && /* @__PURE__ */ jsx(Box, { className: "flex-1 flex items-center justify-center px-4", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "muted", className: "text-center", children: t("subagentTrace.noAgentActivity") }) }),
52809
+ hasData && /* @__PURE__ */ jsx(Box, { className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx(VStack, { gap: "none", children: timelineItems.map((item, i) => {
52810
+ const { name: iconName, color: iconColor } = timelineItemIcon(item);
52811
+ const isLast = i === timelineItems.length - 1;
52812
+ return /* @__PURE__ */ jsxs(
52813
+ Box,
52814
+ {
52815
+ className: "flex items-start px-3 py-2 border-b border-[var(--color-border)] hover:bg-[var(--color-muted)]/30 transition-colors duration-fast cursor-pointer",
52816
+ onClick: () => setSelectedItem(item),
52817
+ children: [
52818
+ /* @__PURE__ */ jsxs(Box, { className: "flex flex-col items-center mr-3 mt-0.5", style: { width: 20 }, children: [
52819
+ /* @__PURE__ */ jsx(
52820
+ Box,
52821
+ {
52822
+ className: "rounded-full flex-shrink-0",
52823
+ style: {
52824
+ width: 8,
52825
+ height: 8,
52826
+ backgroundColor: "var(--color-primary)"
52827
+ }
52828
+ }
52829
+ ),
52830
+ !isLast && /* @__PURE__ */ jsx(
52831
+ Box,
52832
+ {
52833
+ className: "flex-1",
52834
+ style: {
52835
+ width: 2,
52836
+ backgroundColor: "var(--color-border)",
52837
+ marginTop: 4,
52838
+ minHeight: 24
52839
+ }
52840
+ }
52841
+ )
52842
+ ] }),
52843
+ /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: "flex-1 min-w-0", children: [
52844
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
52845
+ /* @__PURE__ */ jsx(Icon, { name: iconName, size: "xs", className: `flex-shrink-0 ${iconColor}` }),
52846
+ timelineItemTimeLabel(item) && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: timelineItemTimeLabel(item) }),
52847
+ /* @__PURE__ */ jsx(Badge, { variant: "neutral", className: "text-[10px]", children: timelineItemLabel(item) })
52848
+ ] }),
52849
+ /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "items-start", children: [
52850
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "muted", className: "flex-1 min-w-0 line-clamp-2", children: timelineItemPreview(item) }),
52851
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", className: "flex-shrink-0 mt-0", onClick: (e) => {
52852
+ e.stopPropagation();
52853
+ setSelectedItem(item);
52854
+ }, children: /* @__PURE__ */ jsx(Icon, { name: "maximize-2", size: "xs" }) })
52855
+ ] })
52856
+ ] })
52857
+ ]
52858
+ },
52859
+ `${item.source}-${i}`
52860
+ );
52861
+ }) }) }),
52862
+ /* @__PURE__ */ jsx(
52863
+ Modal,
52864
+ {
52865
+ isOpen: selectedItem !== null,
52866
+ onClose: () => setSelectedItem(null),
52867
+ title: selectedItem ? `${timelineItemLabel(selectedItem)}${timelineItemTimeLabel(selectedItem) ? ` \xB7 ${timelineItemTimeLabel(selectedItem)}` : ""}` : "",
52868
+ size: "lg",
52869
+ children: selectedItem && /* @__PURE__ */ jsx(TraceDetailContent, { item: selectedItem })
52870
+ }
52871
+ )
52872
+ ] });
52873
+ }
52874
+ const filtered = focusedOrbital ? subagents.filter((s) => s.orbitalName === focusedOrbital) : subagents;
52875
+ const wrapperClass = isRichMode ? `absolute inset-x-3 bottom-3 sm:inset-x-auto sm:top-3 sm:right-3 sm:bottom-3 w-full sm:w-[28rem] max-w-[calc(100vw-1.5rem)] max-h-[60vh] sm:max-h-none bg-[var(--color-card)] border border-[var(--color-border)] rounded-md shadow-lg overflow-hidden flex flex-col ${className ?? ""}` : `absolute inset-x-3 bottom-3 sm:inset-x-auto sm:top-3 sm:right-3 sm:bottom-3 w-full sm:w-80 max-w-[calc(100vw-1.5rem)] max-h-[60vh] sm:max-h-none bg-[var(--color-card)] border border-[var(--color-border)] rounded-md shadow-lg overflow-hidden flex flex-col ${className ?? ""}`;
52876
+ const wrapperStyle = { zIndex: 20 };
52877
+ const hasCoordinatorData = coordinatorMessages && coordinatorMessages.length > 0 || coordinatorActivities && coordinatorActivities.length > 0;
52878
+ if (filtered.length === 0 && !hasCoordinatorData) {
52879
+ return /* @__PURE__ */ jsxs(Box, { className: wrapperClass, style: wrapperStyle, children: [
52880
+ /* @__PURE__ */ jsxs(
52881
+ HStack,
52882
+ {
52883
+ gap: "sm",
52884
+ className: "items-center px-3 py-2 border-b border-[var(--color-border)]",
52885
+ children: [
52886
+ /* @__PURE__ */ jsx(Icon, { name: "activity", size: "sm" }),
52887
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold flex-1", children: t("subagentTrace.subagents") }),
52888
+ onClose && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, children: /* @__PURE__ */ jsx(Icon, { name: "x", size: "xs" }) })
52889
+ ]
52890
+ }
52891
+ ),
52892
+ /* @__PURE__ */ jsx(Box, { className: "flex-1 flex items-center justify-center px-4", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-center", children: focusedOrbital ? t("subagentTrace.noSubagentsForOrbital", { orbital: focusedOrbital }) : t("subagentTrace.noSubagentsActive") }) })
52893
+ ] });
52894
+ }
52895
+ if (focusedOrbital) {
52896
+ return /* @__PURE__ */ jsxs(Box, { className: wrapperClass, style: wrapperStyle, children: [
52897
+ /* @__PURE__ */ jsxs(
52898
+ HStack,
52899
+ {
52900
+ gap: "sm",
52901
+ className: "items-center px-3 py-2 border-b border-[var(--color-border)]",
52902
+ children: [
52903
+ /* @__PURE__ */ jsx(Icon, { name: "activity", size: "sm" }),
52904
+ /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "flex-1 min-w-0", children: [
52905
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold truncate", children: focusedOrbital }),
52906
+ /* @__PURE__ */ jsxs(Typography, { variant: "caption", color: "muted", children: [
52907
+ filtered.length === 1 ? t("subagentTrace.subagentCount", { count: filtered.length }) : t("subagentTrace.subagentCountPlural", { count: filtered.length }),
52908
+ " \xB7 ",
52909
+ densityLabel(isRichMode)
52910
+ ] })
52911
+ ] }),
52912
+ onClose && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, children: /* @__PURE__ */ jsx(Icon, { name: "x", size: "xs" }) })
52913
+ ]
52914
+ }
52915
+ ),
52916
+ /* @__PURE__ */ jsx(Box, { className: "flex-1 overflow-y-auto", children: filtered.map((sub) => isRichMode ? /* @__PURE__ */ jsx(SubagentRichCard, { subagent: sub }, sub.id) : /* @__PURE__ */ jsx(SubagentRow, { subagent: sub }, sub.id)) })
52917
+ ] });
52918
+ }
52919
+ const grouped = groupByOrbital(filtered);
52920
+ const coordinatorSnapshot = pluckCoordinatorState(coordinatorActivities ?? []);
52921
+ return /* @__PURE__ */ jsxs(Box, { className: wrapperClass, style: wrapperStyle, children: [
52922
+ /* @__PURE__ */ jsxs(
52923
+ HStack,
52924
+ {
52925
+ gap: "sm",
52926
+ className: "items-center px-3 py-2 border-b border-[var(--color-border)]",
52927
+ children: [
52928
+ /* @__PURE__ */ jsx(Icon, { name: "activity", size: "sm" }),
52929
+ /* @__PURE__ */ jsxs(Typography, { variant: "caption", className: "font-semibold flex-1", children: [
52930
+ t("subagentTrace.subagentsWithCount", { count: filtered.length }),
52931
+ " \xB7 ",
52932
+ densityLabel(isRichMode)
52933
+ ] }),
52934
+ onClose && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, children: /* @__PURE__ */ jsx(Icon, { name: "x", size: "xs" }) })
52935
+ ]
52936
+ }
52937
+ ),
52938
+ /* @__PURE__ */ jsxs(Box, { className: "flex-1 overflow-y-auto", children: [
52939
+ !focusedOrbital && isRichMode && /* @__PURE__ */ jsx(CoordinatorCard, { snapshot: coordinatorSnapshot }),
52940
+ coordinatorMessages && coordinatorMessages.length > 0 ? /* @__PURE__ */ jsxs(Box, { className: "border-b border-[var(--color-border)]", children: [
52941
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center px-3 py-1.5 bg-[var(--color-card)] border-b border-[var(--color-border)]", children: [
52942
+ /* @__PURE__ */ jsx(Box, { style: { width: 6, height: 6, borderRadius: "50%", backgroundColor: "var(--color-primary)", flexShrink: 0 } }),
52943
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold text-[11px]", children: t("subagentTrace.coordinator") }),
52944
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px]", children: t("subagentTrace.messagesCount", { count: coordinatorMessages.length }) })
52945
+ ] }),
52946
+ /* @__PURE__ */ jsx(Box, { className: "max-h-[36rem] overflow-y-auto", children: /* @__PURE__ */ jsx(CoordinatorConversation, { messages: coordinatorMessages, autoScroll: true }) })
52947
+ ] }) : coordinatorActivities && coordinatorActivities.length > 0 && (() => {
52948
+ const filteredCoordinator = coordinatorActivities;
52949
+ if (filteredCoordinator.length === 0) return null;
52950
+ return /* @__PURE__ */ jsxs(Box, { className: "border-b border-[var(--color-border)]", children: [
52951
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center px-3 py-1.5 bg-[var(--color-card)] border-b border-[var(--color-border)]", children: [
52952
+ /* @__PURE__ */ jsx(Box, { style: { width: 6, height: 6, borderRadius: "50%", backgroundColor: "var(--color-primary)", flexShrink: 0 } }),
52953
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold text-[11px]", children: t("subagentTrace.coordinator") }),
52954
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", className: "text-[10px]", children: t("subagentTrace.eventsCount", { count: filteredCoordinator.length }) })
52955
+ ] }),
52956
+ /* @__PURE__ */ jsx(Box, { className: "max-h-60 overflow-y-auto", children: /* @__PURE__ */ jsx(
52957
+ InlineActivityStream,
52958
+ {
52959
+ activities: coordinatorToActivityItems(filteredCoordinator),
52960
+ autoScroll: true
52961
+ }
52962
+ ) })
52963
+ ] });
52964
+ })(),
52965
+ isRichMode ? filtered.map((sub) => /* @__PURE__ */ jsx(SubagentRichCard, { subagent: sub }, sub.id)) : Array.from(grouped.entries()).map(([orbitalName, subs]) => /* @__PURE__ */ jsx(
52966
+ OrbitalGroup,
52967
+ {
52968
+ orbitalName,
52969
+ subagents: subs
52970
+ },
52971
+ orbitalName
52972
+ ))
52973
+ ] })
52974
+ ] });
52975
+ };
52976
+ SubagentTracePanel.displayName = "SubagentTracePanel";
52977
+ }
52978
+ });
51368
52979
  var TabbedContainer;
51369
52980
  var init_TabbedContainer = __esm({
51370
52981
  "components/core/organisms/layout/TabbedContainer.tsx"() {
@@ -51479,6 +53090,48 @@ var init_TabbedContainer = __esm({
51479
53090
  TabbedContainer.displayName = "TabbedContainer";
51480
53091
  }
51481
53092
  });
53093
+ function TanksBoard({
53094
+ tiles,
53095
+ units,
53096
+ features,
53097
+ assetManifest,
53098
+ assetBaseUrl,
53099
+ scale = 0.45,
53100
+ showMinimap = true,
53101
+ enableCamera = true,
53102
+ tileClickEvent,
53103
+ unitClickEvent,
53104
+ isLoading,
53105
+ error,
53106
+ className
53107
+ }) {
53108
+ return /* @__PURE__ */ jsx("div", { className: cn("tanks-board relative w-full h-full", className), children: /* @__PURE__ */ jsx(
53109
+ IsometricCanvas_default,
53110
+ {
53111
+ tileLayout: "flat",
53112
+ tiles,
53113
+ units,
53114
+ features,
53115
+ assetManifest,
53116
+ assetBaseUrl,
53117
+ scale,
53118
+ showMinimap,
53119
+ enableCamera,
53120
+ tileClickEvent,
53121
+ unitClickEvent,
53122
+ isLoading,
53123
+ error
53124
+ }
53125
+ ) });
53126
+ }
53127
+ var init_TanksBoard = __esm({
53128
+ "components/game/organisms/TanksBoard.tsx"() {
53129
+ "use client";
53130
+ init_cn();
53131
+ init_IsometricCanvas();
53132
+ TanksBoard.displayName = "TanksBoard";
53133
+ }
53134
+ });
51482
53135
  var TeamOrganism;
51483
53136
  var init_TeamOrganism = __esm({
51484
53137
  "components/marketing/organisms/TeamOrganism.tsx"() {
@@ -51582,7 +53235,7 @@ var init_Timeline = __esm({
51582
53235
  }) => {
51583
53236
  const { t } = useTranslate();
51584
53237
  const entityData = Array.isArray(entity) ? entity : [];
51585
- const items = React79__default.useMemo(() => {
53238
+ const items = React80__default.useMemo(() => {
51586
53239
  if (propItems) return propItems;
51587
53240
  if (entityData.length === 0) return [];
51588
53241
  return entityData.map((record, idx) => {
@@ -51739,7 +53392,7 @@ var init_TimerDisplay = __esm({
51739
53392
  }
51740
53393
  });
51741
53394
  function extractToastProps(children) {
51742
- if (!React79__default.isValidElement(children)) {
53395
+ if (!React80__default.isValidElement(children)) {
51743
53396
  if (typeof children === "string") {
51744
53397
  return { message: children };
51745
53398
  }
@@ -51777,7 +53430,7 @@ var init_ToastSlot = __esm({
51777
53430
  eventBus.emit("UI:CLOSE");
51778
53431
  };
51779
53432
  if (!isVisible) return null;
51780
- const isCustomContent = React79__default.isValidElement(children) && !message;
53433
+ const isCustomContent = React80__default.isValidElement(children) && !message;
51781
53434
  return /* @__PURE__ */ jsx(Box, { className: "fixed bottom-4 right-4 z-50", children: isCustomContent ? children : /* @__PURE__ */ jsx(
51782
53435
  Toast,
51783
53436
  {
@@ -53403,8 +55056,8 @@ function XPBar({
53403
55056
  }) {
53404
55057
  const sizes = sizeMap18[size];
53405
55058
  const percentage = max > 0 ? Math.max(0, Math.min(100, current / max * 100)) : 0;
53406
- const [fillWidth, setFillWidth] = React79.useState(animated ? 0 : percentage);
53407
- React79.useEffect(() => {
55059
+ const [fillWidth, setFillWidth] = React80.useState(animated ? 0 : percentage);
55060
+ React80.useEffect(() => {
53408
55061
  if (!animated) {
53409
55062
  setFillWidth(percentage);
53410
55063
  return;
@@ -53477,7 +55130,7 @@ var init_XPBar = __esm({
53477
55130
  }
53478
55131
  });
53479
55132
  function lazyThree(name, loader) {
53480
- const Lazy = React79__default.lazy(
55133
+ const Lazy = React80__default.lazy(
53481
55134
  () => loader().then((m) => {
53482
55135
  const Resolved = m[name];
53483
55136
  if (!Resolved) {
@@ -53489,13 +55142,13 @@ function lazyThree(name, loader) {
53489
55142
  })
53490
55143
  );
53491
55144
  function ThreeWrapper(props) {
53492
- return React79__default.createElement(
55145
+ return React80__default.createElement(
53493
55146
  ThreeBoundary,
53494
55147
  { name },
53495
- React79__default.createElement(
53496
- React79__default.Suspense,
55148
+ React80__default.createElement(
55149
+ React80__default.Suspense,
53497
55150
  { fallback: null },
53498
- React79__default.createElement(Lazy, props)
55151
+ React80__default.createElement(Lazy, props)
53499
55152
  )
53500
55153
  );
53501
55154
  }
@@ -53525,6 +55178,7 @@ var init_component_registry_generated = __esm({
53525
55178
  init_BattleTemplate();
53526
55179
  init_BehaviorView();
53527
55180
  init_BloomQuizBlock();
55181
+ init_BoardgameBoard();
53528
55182
  init_BookChapterView();
53529
55183
  init_BookCoverPage();
53530
55184
  init_BookNavBar();
@@ -53551,6 +55205,7 @@ var init_component_registry_generated = __esm({
53551
55205
  init_Center();
53552
55206
  init_Chart();
53553
55207
  init_ChartLegend();
55208
+ init_ChatBar();
53554
55209
  init_Checkbox();
53555
55210
  init_ChoiceButton();
53556
55211
  init_CityBuilderBoard();
@@ -53608,6 +55263,7 @@ var init_component_registry_generated = __esm({
53608
55263
  init_FileTree();
53609
55264
  init_FilterGroup();
53610
55265
  init_FilterPill();
55266
+ init_FishingBoard();
53611
55267
  init_Flex();
53612
55268
  init_FlipCard();
53613
55269
  init_FlipContainer();
@@ -53637,6 +55293,7 @@ var init_component_registry_generated = __esm({
53637
55293
  init_HeroOrganism();
53638
55294
  init_HeroSection();
53639
55295
  init_HexStrategyBoard();
55296
+ init_HolidayRunnerBoard();
53640
55297
  init_Icon();
53641
55298
  init_InfiniteScrollSentinel();
53642
55299
  init_Input();
@@ -53659,11 +55316,13 @@ var init_component_registry_generated = __esm({
53659
55316
  init_MarketingFooter();
53660
55317
  init_MasterDetail();
53661
55318
  init_MasterDetailLayout();
55319
+ init_MatchPuzzleBoard();
53662
55320
  init_MatrixQuestion();
53663
55321
  init_MediaGallery();
53664
55322
  init_Menu();
53665
55323
  init_Meter();
53666
55324
  init_MiniMap();
55325
+ init_MinigolfBoard();
53667
55326
  init_Modal();
53668
55327
  init_ModalSlot();
53669
55328
  init_ModuleCard();
@@ -53676,6 +55335,8 @@ var init_component_registry_generated = __esm({
53676
55335
  init_PageHeader();
53677
55336
  init_Pagination();
53678
55337
  init_PatternTile();
55338
+ init_PinballBoard();
55339
+ init_PirateBoard();
53679
55340
  init_PlatformerBoard();
53680
55341
  init_PlatformerCanvas();
53681
55342
  init_PlatformerTemplate();
@@ -53693,6 +55354,7 @@ var init_component_registry_generated = __esm({
53693
55354
  init_QrScanner();
53694
55355
  init_QuestTracker();
53695
55356
  init_QuizBlock();
55357
+ init_RacingBoard();
53696
55358
  init_Radio();
53697
55359
  init_RangeSlider();
53698
55360
  init_ReflectionBlock();
@@ -53726,12 +55388,16 @@ var init_component_registry_generated = __esm({
53726
55388
  init_SimulatorBoard();
53727
55389
  init_Skeleton();
53728
55390
  init_SocialProof();
55391
+ init_SokobanBoard();
53729
55392
  init_SortableList();
55393
+ init_SpaceShmupBoard();
55394
+ init_SpaceStationBoard();
53730
55395
  init_Sparkline();
53731
55396
  init_Spinner();
53732
55397
  init_Split();
53733
55398
  init_SplitPane();
53734
55399
  init_SplitSection();
55400
+ init_SportsBoard();
53735
55401
  init_Sprite();
53736
55402
  init_StarRating();
53737
55403
  init_StatBadge();
@@ -53746,6 +55412,7 @@ var init_component_registry_generated = __esm({
53746
55412
  init_StatusEffect();
53747
55413
  init_StepFlow();
53748
55414
  init_StepFlowOrganism();
55415
+ init_SubagentTracePanel();
53749
55416
  init_SvgBranch();
53750
55417
  init_SvgConnection();
53751
55418
  init_SvgFlow();
@@ -53765,6 +55432,7 @@ var init_component_registry_generated = __esm({
53765
55432
  init_Tabs();
53766
55433
  init_TagCloud();
53767
55434
  init_TagInput();
55435
+ init_TanksBoard();
53768
55436
  init_TeamCard();
53769
55437
  init_TeamOrganism();
53770
55438
  init_TextHighlight();
@@ -53803,7 +55471,7 @@ var init_component_registry_generated = __esm({
53803
55471
  init_WorldMapBoard();
53804
55472
  init_WorldMapTemplate();
53805
55473
  init_XPBar();
53806
- ThreeBoundary = class extends React79__default.Component {
55474
+ ThreeBoundary = class extends React80__default.Component {
53807
55475
  constructor() {
53808
55476
  super(...arguments);
53809
55477
  __publicField(this, "state", { failed: false });
@@ -53813,7 +55481,7 @@ var init_component_registry_generated = __esm({
53813
55481
  }
53814
55482
  render() {
53815
55483
  if (this.state.failed) {
53816
- return React79__default.createElement(
55484
+ return React80__default.createElement(
53817
55485
  "div",
53818
55486
  {
53819
55487
  "data-testid": "three-unavailable",
@@ -53852,6 +55520,7 @@ var init_component_registry_generated = __esm({
53852
55520
  "BattleTemplate": BattleTemplate,
53853
55521
  "BehaviorView": BehaviorView,
53854
55522
  "BloomQuizBlock": BloomQuizBlock,
55523
+ "BoardgameBoard": BoardgameBoard,
53855
55524
  "BookChapterView": BookChapterView,
53856
55525
  "BookCoverPage": BookCoverPage,
53857
55526
  "BookNavBar": BookNavBar,
@@ -53881,6 +55550,7 @@ var init_component_registry_generated = __esm({
53881
55550
  "Center": Center,
53882
55551
  "Chart": Chart,
53883
55552
  "ChartLegend": ChartLegend,
55553
+ "ChatBar": ChatBar,
53884
55554
  "Checkbox": Checkbox,
53885
55555
  "ChoiceButton": ChoiceButton,
53886
55556
  "CityBuilderBoard": CityBuilderBoard,
@@ -53941,6 +55611,7 @@ var init_component_registry_generated = __esm({
53941
55611
  "FileTree": FileTree,
53942
55612
  "FilterGroup": FilterGroup,
53943
55613
  "FilterPill": FilterPill,
55614
+ "FishingBoard": FishingBoard,
53944
55615
  "Flex": Flex,
53945
55616
  "FlipCard": FlipCard,
53946
55617
  "FlipContainer": FlipContainer,
@@ -53974,6 +55645,7 @@ var init_component_registry_generated = __esm({
53974
55645
  "HeroOrganism": HeroOrganism,
53975
55646
  "HeroSection": HeroSection,
53976
55647
  "HexStrategyBoard": HexStrategyBoard,
55648
+ "HolidayRunnerBoard": HolidayRunnerBoard,
53977
55649
  "Icon": Icon,
53978
55650
  "InfiniteScrollSentinel": InfiniteScrollSentinel,
53979
55651
  "Input": Input,
@@ -53998,11 +55670,13 @@ var init_component_registry_generated = __esm({
53998
55670
  "MarketingFooter": MarketingFooter,
53999
55671
  "MasterDetail": MasterDetail,
54000
55672
  "MasterDetailLayout": MasterDetailLayout,
55673
+ "MatchPuzzleBoard": MatchPuzzleBoard,
54001
55674
  "MatrixQuestion": MatrixQuestion,
54002
55675
  "MediaGallery": MediaGallery,
54003
55676
  "Menu": Menu,
54004
55677
  "Meter": Meter,
54005
55678
  "MiniMap": MiniMap,
55679
+ "MinigolfBoard": MinigolfBoard,
54006
55680
  "Modal": Modal,
54007
55681
  "ModalSlot": ModalSlot,
54008
55682
  "ModuleCard": ModuleCard,
@@ -54015,6 +55689,8 @@ var init_component_registry_generated = __esm({
54015
55689
  "PageHeader": PageHeader,
54016
55690
  "Pagination": Pagination,
54017
55691
  "PatternTile": PatternTile,
55692
+ "PinballBoard": PinballBoard,
55693
+ "PirateBoard": PirateBoard,
54018
55694
  "PlatformerBoard": PlatformerBoard,
54019
55695
  "PlatformerCanvas": PlatformerCanvas,
54020
55696
  "PlatformerTemplate": PlatformerTemplate,
@@ -54032,6 +55708,7 @@ var init_component_registry_generated = __esm({
54032
55708
  "QrScanner": QrScanner,
54033
55709
  "QuestTracker": QuestTracker,
54034
55710
  "QuizBlock": QuizBlock,
55711
+ "RacingBoard": RacingBoard,
54035
55712
  "Radio": Radio,
54036
55713
  "RangeSlider": RangeSlider,
54037
55714
  "ReflectionBlock": ReflectionBlock,
@@ -54065,7 +55742,10 @@ var init_component_registry_generated = __esm({
54065
55742
  "SimulatorBoard": SimulatorBoard,
54066
55743
  "Skeleton": Skeleton,
54067
55744
  "SocialProof": SocialProof,
55745
+ "SokobanBoard": SokobanBoard,
54068
55746
  "SortableList": SortableList,
55747
+ "SpaceShmupBoard": SpaceShmupBoard,
55748
+ "SpaceStationBoard": SpaceStationBoard,
54069
55749
  "Spacer": SpacerPattern,
54070
55750
  "SpacerPattern": SpacerPattern,
54071
55751
  "Sparkline": Sparkline,
@@ -54073,6 +55753,7 @@ var init_component_registry_generated = __esm({
54073
55753
  "Split": Split,
54074
55754
  "SplitPane": SplitPane,
54075
55755
  "SplitSection": SplitSection,
55756
+ "SportsBoard": SportsBoard,
54076
55757
  "Sprite": Sprite,
54077
55758
  "Stack": Stack,
54078
55759
  "StarRating": StarRating,
@@ -54088,6 +55769,7 @@ var init_component_registry_generated = __esm({
54088
55769
  "StatusEffect": StatusEffect,
54089
55770
  "StepFlow": StepFlow,
54090
55771
  "StepFlowOrganism": StepFlowOrganism,
55772
+ "SubagentTracePanel": SubagentTracePanel,
54091
55773
  "SvgBranch": SvgBranch,
54092
55774
  "SvgConnection": SvgConnection,
54093
55775
  "SvgFlow": SvgFlow,
@@ -54107,6 +55789,7 @@ var init_component_registry_generated = __esm({
54107
55789
  "Tabs": Tabs,
54108
55790
  "TagCloud": TagCloud,
54109
55791
  "TagInput": TagInput,
55792
+ "TanksBoard": TanksBoard,
54110
55793
  "TeamCard": TeamCard,
54111
55794
  "TeamOrganism": TeamOrganism,
54112
55795
  "TextHighlight": TextHighlight,
@@ -54164,7 +55847,7 @@ function SuspenseConfigProvider({
54164
55847
  config,
54165
55848
  children
54166
55849
  }) {
54167
- return React79__default.createElement(
55850
+ return React80__default.createElement(
54168
55851
  SuspenseConfigContext.Provider,
54169
55852
  { value: config },
54170
55853
  children
@@ -54175,8 +55858,8 @@ function getSlotFallback(slot, config) {
54175
55858
  const variant = SLOT_SKELETON_MAP[slot] ?? "text";
54176
55859
  return /* @__PURE__ */ jsx(Skeleton, { variant });
54177
55860
  }
54178
- function getComponentForPattern(patternType) {
54179
- const mapping = getComponentForPattern$1(patternType);
55861
+ function getComponentForPattern3(patternType) {
55862
+ const mapping = getComponentForPattern(patternType);
54180
55863
  if (!mapping) {
54181
55864
  return null;
54182
55865
  }
@@ -54654,7 +56337,7 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
54654
56337
  const key = `${parentId}-${index}-trait:${traitName}`;
54655
56338
  return /* @__PURE__ */ jsx(TraitFrame, { traitName }, key);
54656
56339
  }
54657
- return /* @__PURE__ */ jsx(React79__default.Fragment, { children: child }, `${parentId}-${index}`);
56340
+ return /* @__PURE__ */ jsx(React80__default.Fragment, { children: child }, `${parentId}-${index}`);
54658
56341
  }
54659
56342
  if (!child || typeof child !== "object") return null;
54660
56343
  const childId = `${parentId}-${index}`;
@@ -54694,14 +56377,14 @@ function isPatternConfig(value) {
54694
56377
  if (value === null || value === void 0) return false;
54695
56378
  if (typeof value !== "object") return false;
54696
56379
  if (Array.isArray(value)) return false;
54697
- if (React79__default.isValidElement(value)) return false;
56380
+ if (React80__default.isValidElement(value)) return false;
54698
56381
  if (value instanceof Date) return false;
54699
56382
  if (typeof value === "function") return false;
54700
56383
  const record = value;
54701
- return "type" in record && typeof record.type === "string" && getComponentForPattern$1(record.type) !== null;
56384
+ return "type" in record && typeof record.type === "string" && getComponentForPattern(record.type) !== null;
54702
56385
  }
54703
56386
  function isPlainConfigObject(value) {
54704
- if (React79__default.isValidElement(value)) return false;
56387
+ if (React80__default.isValidElement(value)) return false;
54705
56388
  if (value instanceof Date) return false;
54706
56389
  const proto = Object.getPrototypeOf(value);
54707
56390
  return proto === Object.prototype || proto === null;
@@ -54806,7 +56489,8 @@ function SlotContentRenderer({
54806
56489
  entityDef = schemaCtx.entities.get(linkedEntity);
54807
56490
  }
54808
56491
  }
54809
- const PatternComponent = getComponentForPattern(content.pattern);
56492
+ const orbitalName = schemaCtx && content.sourceTrait !== void 0 ? schemaCtx.orbitalsByTrait.get(content.sourceTrait) : void 0;
56493
+ const PatternComponent = getComponentForPattern3(content.pattern);
54810
56494
  if (PatternComponent) {
54811
56495
  const childrenConfig = content.props.children;
54812
56496
  const isSingleChild = typeof childrenConfig === "string" || typeof childrenConfig === "object" && childrenConfig !== null && !Array.isArray(childrenConfig) && "type" in childrenConfig;
@@ -54826,7 +56510,7 @@ function SlotContentRenderer({
54826
56510
  for (const slotKey of CONTENT_NODE_SLOTS) {
54827
56511
  const slotVal = restProps[slotKey];
54828
56512
  if (slotVal === void 0 || slotVal === null) continue;
54829
- if (React79__default.isValidElement(slotVal) || typeof slotVal === "string" || typeof slotVal === "number" || typeof slotVal === "boolean") continue;
56513
+ if (React80__default.isValidElement(slotVal) || typeof slotVal === "string" || typeof slotVal === "number" || typeof slotVal === "boolean") continue;
54830
56514
  if (Array.isArray(slotVal) || typeof slotVal === "object" && "type" in slotVal) {
54831
56515
  nodeSlotOverrides[slotKey] = renderPatternChildren(
54832
56516
  slotVal,
@@ -54904,6 +56588,7 @@ function SlotContentRenderer({
54904
56588
  "data-orb-entity": content.entity,
54905
56589
  "data-orb-path": myPath,
54906
56590
  "data-orb-pattern": content.pattern,
56591
+ "data-orb-orbital": orbitalName,
54907
56592
  children: renderedChildren !== void 0 ? /* @__PURE__ */ jsx(PatternComponent, { ...finalProps, children: renderedChildren }) : /* @__PURE__ */ jsx(PatternComponent, { ...finalProps })
54908
56593
  }
54909
56594
  );
@@ -54923,6 +56608,7 @@ function SlotContentRenderer({
54923
56608
  "data-orb-entity": content.entity,
54924
56609
  "data-orb-path": patternPath ?? "root",
54925
56610
  "data-orb-pattern": content.pattern,
56611
+ "data-orb-orbital": orbitalName,
54926
56612
  children: content.props.children ?? /* @__PURE__ */ jsxs(Box, { className: "p-4 text-sm text-muted-foreground border border-dashed border-border rounded", children: [
54927
56613
  "Unknown pattern: ",
54928
56614
  content.pattern,
@@ -55092,7 +56778,7 @@ function TraitFrame({
55092
56778
  if (!content) {
55093
56779
  return /* @__PURE__ */ jsx(Fragment, { children: fallback });
55094
56780
  }
55095
- const SlotContentRenderer2 = getSlotContentRenderer();
56781
+ const SlotContentRenderer2 = getSlotContentRenderer3();
55096
56782
  const rendered = /* @__PURE__ */ jsx(
55097
56783
  SlotContentRenderer2,
55098
56784
  {
@@ -55106,7 +56792,7 @@ function TraitFrame({
55106
56792
  }
55107
56793
  return /* @__PURE__ */ jsx(TraitScopeProvider, { orbital, trait: traitName, children: rendered });
55108
56794
  }
55109
- function getSlotContentRenderer() {
56795
+ function getSlotContentRenderer3() {
55110
56796
  if (_slotContentRenderer) return _slotContentRenderer;
55111
56797
  const mod = (init_UISlotRenderer(), __toCommonJS(UISlotRenderer_exports));
55112
56798
  _slotContentRenderer = mod.SlotContentRenderer;
@@ -56099,6 +57785,21 @@ function generateCombatMessage(event) {
56099
57785
  return event.message;
56100
57786
  }
56101
57787
 
57788
+ // components/game/organisms/index.ts
57789
+ init_RacingBoard();
57790
+ init_TanksBoard();
57791
+ init_SpaceShmupBoard();
57792
+ init_SportsBoard();
57793
+ init_SokobanBoard();
57794
+ init_BoardgameBoard();
57795
+ init_PirateBoard();
57796
+ init_PinballBoard();
57797
+ init_FishingBoard();
57798
+ init_MatchPuzzleBoard();
57799
+ init_HolidayRunnerBoard();
57800
+ init_MinigolfBoard();
57801
+ init_SpaceStationBoard();
57802
+
56102
57803
  // components/core/organisms/index.ts
56103
57804
  init_UISlotRenderer();
56104
57805
  init_ModalSlot();
@@ -56181,6 +57882,9 @@ init_TeamOrganism();
56181
57882
  init_CaseStudyOrganism();
56182
57883
  init_CodeRunnerPanel();
56183
57884
  init_SegmentRenderer();
57885
+ init_ChatBar();
57886
+ init_trace_edit_focus();
57887
+ init_SubagentTracePanel();
56184
57888
 
56185
57889
  // components/core/templates/index.ts
56186
57890
  init_DashboardLayout();
@@ -56207,4 +57911,4 @@ init_AboutPageTemplate();
56207
57911
  // components/index.ts
56208
57912
  init_cn();
56209
57913
 
56210
- export { ALL_PRESETS, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, ActionButton, ActionButtons, Card2 as ActionCard, ActionPalette, ActionTile, ActivationBlock, Alert, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AuthLayout, Avatar, Badge, BattleBoard, BattleTemplate, BehaviorView, BloomQuizBlock, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, BuilderBoard, Button, ButtonGroup, CTABanner, CalendarGrid, CanvasEffect, Card, CardBattlerBoard, CardBattlerTemplate, CardBody, CardContent, CardFooter, CardGrid, CardHand, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, CastleBoard, CastleTemplate, Center, Chart, ChartLegend, Checkbox, ChoiceButton, CityBuilderBoard, CityBuilderTemplate, ClassifierBoard, Coachmark, CodeBlock, CodeRunnerPanel, CollapsibleSection, CombatLog, ComboCounter, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ContentSection, ControlButton, CounterTemplate, CraftingRecipe, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DIAMOND_TOP_Y, DPad, DamageNumber, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DebuggerBoard, DetailPanel, Dialog, DialogueBox, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EnemyPlate, EntityDisplayEvents, ErrorBoundary, ErrorState, EventHandlerBoard, EventLog, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioContext, GameAudioProvider, GameAudioToggle, GameBoard3D, GameCanvas2D, GameHud, GameMenu, GameOverScreen, GameShell, GameTemplate, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HealthPanel, HeroOrganism, HeroSection, HexStrategyBoard, IDENTITY_BOOK_FIELDS, Icon, IconPicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, InventoryGrid, InventoryPanel, IsometricCanvas, ItemSlot, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MatrixQuestion, MediaGallery, Menu, Meter, MiniMap, Modal, ModalSlot, ModuleCard, Navigation, NegotiatorBoard, NodeSlotEditor, NotifyListener, NumberStepper, ObjectRulePanel, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, Pagination, PatternTile, PhysicsManager, PlatformerBoard, PlatformerCanvas, PlatformerTemplate, Popover, PositionedCanvas, PowerupSlots, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuestTracker, QuizBlock, Radio, RangeSlider, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, ResourceBar, ResourceCounter, RichBlockEditor, RoguelikeBoard, RoguelikeTemplate, RuleEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreBoard, ScoreDisplay, SearchInput, Section, SectionHeader, SegmentRenderer, Select, SequenceBar, SequencerBoard, ServiceCatalog, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, SimulationCanvas, SimulationControls, SimulationGraph, SimulatorBoard, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Sprite, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateArchitectBoard, StateIndicator, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StatusEffect, StepFlow, StepFlowOrganism, 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, ThemeSelector, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TopDownShooterBoard, TopDownShooterTemplate, TowerDefenseBoard, TowerDefenseTemplate, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TurnIndicator, TurnPanel, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UncontrolledBattleBoard, UnitCommandBar, UploadDropZone, VStack, VariablePanel, VersionDiff, ViolationAlert, VisualNovelBoard, VisualNovelTemplate, VoteStack, WaypointMarker, WizardContainer, WizardNavigation, WizardProgress, WorldMapBoard, WorldMapTemplate, XPBar, applyTemporaryEffect, calculateAttackTargets, calculateDamage, calculateValidMoves, cn, combatAnimations, combatClasses, combatEffects, createInitialGameState, createUnitAnimationState, drawSprite, generateCombatMessage, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, mapBookData, parseLessonSegments, parseMarkdownWithCodeBlocks, pendulum, projectileMotion, resolveFieldMap, resolveFrame, resolveSheetDirection, screenToIso, springOscillator, tickAnimationState, toCodeLanguage, transitionAnimation, useAnchorRect, useBattleState, useCamera, useGameAudio, useGameAudioContext, useImageCache, usePhysics2D, useSpriteAnimations };
57914
+ export { ALL_PRESETS, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, ActionButton, ActionButtons, Card2 as ActionCard, ActionPalette, ActionTile, ActivationBlock, Alert, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AuthLayout, Avatar, Badge, BattleBoard, BattleTemplate, BehaviorView, BloomQuizBlock, BoardgameBoard, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, BuilderBoard, Button, ButtonGroup, CTABanner, CalendarGrid, CanvasEffect, Card, CardBattlerBoard, CardBattlerTemplate, CardBody, CardContent, CardFooter, CardGrid, CardHand, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, CastleBoard, CastleTemplate, Center, Chart, ChartLegend, ChatBar, Checkbox, ChoiceButton, CityBuilderBoard, CityBuilderTemplate, ClassifierBoard, Coachmark, CodeBlock, CodeRunnerPanel, CollapsibleSection, CombatLog, ComboCounter, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ContentSection, ControlButton, CounterTemplate, CraftingRecipe, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DIAMOND_TOP_Y, DPad, DamageNumber, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DebuggerBoard, DetailPanel, Dialog, DialogueBox, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EnemyPlate, EntityDisplayEvents, ErrorBoundary, ErrorState, EventHandlerBoard, EventLog, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FileTree, FilterGroup, FilterPill, FishingBoard, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioContext, GameAudioProvider, GameAudioToggle, GameBoard3D, GameCanvas2D, GameHud, GameMenu, GameOverScreen, GameShell, GameTemplate, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HealthPanel, HeroOrganism, HeroSection, HexStrategyBoard, HolidayRunnerBoard, IDENTITY_BOOK_FIELDS, Icon, IconPicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, InventoryGrid, InventoryPanel, IsometricCanvas, ItemSlot, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MatchPuzzleBoard, MatrixQuestion, MediaGallery, Menu, Meter, MiniMap, MinigolfBoard, Modal, ModalSlot, ModuleCard, Navigation, NegotiatorBoard, NodeSlotEditor, NotifyListener, NumberStepper, ObjectRulePanel, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, Pagination, PatternTile, PhysicsManager, PinballBoard, PirateBoard, PlatformerBoard, PlatformerCanvas, PlatformerTemplate, Popover, PositionedCanvas, PowerupSlots, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuestTracker, QuizBlock, RacingBoard, Radio, RangeSlider, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, ResourceBar, ResourceCounter, RichBlockEditor, RoguelikeBoard, RoguelikeTemplate, RuleEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreBoard, ScoreDisplay, SearchInput, Section, SectionHeader, SegmentRenderer, Select, SequenceBar, SequencerBoard, ServiceCatalog, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, SimulationCanvas, SimulationControls, SimulationGraph, SimulatorBoard, Skeleton, SlotContentRenderer, SocialProof, SokobanBoard, SortableList, SpaceShmupBoard, SpaceStationBoard, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, SportsBoard, Sprite, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateArchitectBoard, StateIndicator, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StatusEffect, 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, TanksBoard, TeamCard, TeamOrganism, TerrainPalette, TextHighlight, Textarea, ThemeSelector, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TopDownShooterBoard, TopDownShooterTemplate, TowerDefenseBoard, TowerDefenseTemplate, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TurnIndicator, TurnPanel, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UncontrolledBattleBoard, UnitCommandBar, UploadDropZone, VStack, VariablePanel, VersionDiff, ViolationAlert, VisualNovelBoard, VisualNovelTemplate, VoteStack, WaypointMarker, WizardContainer, WizardNavigation, WizardProgress, WorldMapBoard, WorldMapTemplate, XPBar, applyTemporaryEffect, calculateAttackTargets, calculateDamage, calculateValidMoves, cn, combatAnimations, combatClasses, combatEffects, createInitialGameState, createUnitAnimationState, drawSprite, generateCombatMessage, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, mapBookData, parseEditFocus, parseLessonSegments, parseMarkdownWithCodeBlocks, pendulum, projectileMotion, resolveFieldMap, resolveFrame, resolveSheetDirection, screenToIso, springOscillator, tickAnimationState, toCodeLanguage, transitionAnimation, useAnchorRect, useBattleState, useCamera, useGameAudio, useGameAudioContext, useImageCache, usePhysics2D, useSpriteAnimations };