@almadar/ui 5.28.1 → 5.28.3

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.
@@ -7806,7 +7806,7 @@ var init_DamageNumber = __esm({
7806
7806
  function DialogueBubble({
7807
7807
  speaker,
7808
7808
  text,
7809
- portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/00_base_model.png",
7809
+ portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/04_hero.png",
7810
7810
  position = "bottom",
7811
7811
  className
7812
7812
  }) {
@@ -10760,7 +10760,7 @@ function IsometricCanvas({
10760
10760
  // Rendering options
10761
10761
  scale = 0.4,
10762
10762
  debug: debug2 = false,
10763
- backgroundImage,
10763
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
10764
10764
  showMinimap = true,
10765
10765
  enableCamera = true,
10766
10766
  unitScale = 1,
@@ -10775,7 +10775,7 @@ function IsometricCanvas({
10775
10775
  // Tuning
10776
10776
  diamondTopY: diamondTopYProp,
10777
10777
  // Remote asset loading
10778
- assetBaseUrl,
10778
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
10779
10779
  assetManifest
10780
10780
  }) {
10781
10781
  const tilesProp = Array.isArray(_tilesPropRaw) ? _tilesPropRaw : [];
@@ -11534,6 +11534,10 @@ var init_boardEntity = __esm({
11534
11534
  });
11535
11535
  function BattleBoard({
11536
11536
  entity,
11537
+ tiles: propTiles,
11538
+ units: propUnits,
11539
+ features: propFeatures,
11540
+ assetManifest: propAssetManifest,
11537
11541
  scale = 0.45,
11538
11542
  unitScale = 1,
11539
11543
  header,
@@ -11559,11 +11563,11 @@ function BattleBoard({
11559
11563
  className
11560
11564
  }) {
11561
11565
  const board = boardEntity(entity) ?? {};
11562
- const tiles = Array.isArray(board.tiles) ? board.tiles : [];
11563
- const features = Array.isArray(board.features) ? board.features : [];
11566
+ const tiles = propTiles ?? (Array.isArray(board.tiles) ? board.tiles : []);
11567
+ const features = propFeatures ?? (Array.isArray(board.features) ? board.features : []);
11564
11568
  const boardWidth = num(board.boardWidth, 8);
11565
11569
  const boardHeight = num(board.boardHeight, 6);
11566
- const assetManifest = board.assetManifest;
11570
+ const assetManifest = propAssetManifest ?? board.assetManifest;
11567
11571
  const backgroundImage = board.backgroundImage;
11568
11572
  const units = rows(board.units);
11569
11573
  const selectedUnitId = board.selectedUnitId ?? null;
@@ -11655,7 +11659,7 @@ function BattleBoard({
11655
11659
  }, 16);
11656
11660
  return () => clearInterval(interval);
11657
11661
  }, []);
11658
- const isoUnits = React80.useMemo(() => {
11662
+ const derivedIsoUnits = React80.useMemo(() => {
11659
11663
  return units.filter((u) => unitHealth(u) > 0).map((unit) => {
11660
11664
  const id = str(unit.id);
11661
11665
  const pos = movingPositions.get(id) ?? unitPosition(unit);
@@ -11679,6 +11683,7 @@ function BattleBoard({
11679
11683
  };
11680
11684
  });
11681
11685
  }, [units, movingPositions]);
11686
+ const isoUnits = propUnits ?? derivedIsoUnits;
11682
11687
  const maxY = Math.max(...tiles.map((t2) => t2.y), 0);
11683
11688
  const baseOffsetX = (maxY + 1) * (TILE_WIDTH * scale / 2);
11684
11689
  const tileToScreen = React80.useCallback(
@@ -18882,16 +18887,21 @@ function EmojiEffect({
18882
18887
  }
18883
18888
  );
18884
18889
  }
18885
- function CanvasEffect(props) {
18890
+ function CanvasEffect({
18891
+ effectSpriteUrl = "https://almadar-kflow-assets.web.app/shared/effects/gas/gas00.png",
18892
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/effects/",
18893
+ ...props
18894
+ }) {
18886
18895
  const eventBus = useEventBus();
18887
- const { completeEvent, onComplete, ...rest } = props;
18896
+ const mergedProps = { effectSpriteUrl, assetBaseUrl, ...props };
18897
+ const { completeEvent, onComplete, ...rest } = mergedProps;
18888
18898
  const handleComplete = React80.useCallback(() => {
18889
18899
  if (completeEvent) eventBus.emit(`UI:${completeEvent}`, {});
18890
18900
  onComplete?.();
18891
18901
  }, [completeEvent, eventBus, onComplete]);
18892
18902
  const enhancedProps = { ...rest, onComplete: handleComplete };
18893
- if (props.assetManifest) {
18894
- return /* @__PURE__ */ jsxRuntime.jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: props.assetManifest });
18903
+ if (rest.assetManifest) {
18904
+ return /* @__PURE__ */ jsxRuntime.jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: rest.assetManifest });
18895
18905
  }
18896
18906
  return /* @__PURE__ */ jsxRuntime.jsx(EmojiEffect, { ...enhancedProps });
18897
18907
  }
@@ -19676,6 +19686,10 @@ var init_CaseStudyOrganism = __esm({
19676
19686
  });
19677
19687
  function CastleBoard({
19678
19688
  entity,
19689
+ tiles: propTiles,
19690
+ units: propUnits,
19691
+ features: propFeatures,
19692
+ assetManifest: propAssetManifest,
19679
19693
  scale = 0.45,
19680
19694
  header,
19681
19695
  sidePanel,
@@ -19691,10 +19705,10 @@ function CastleBoard({
19691
19705
  }) {
19692
19706
  const eventBus = useEventBus();
19693
19707
  const resolved = boardEntity(entity);
19694
- const tiles = Array.isArray(resolved?.tiles) ? resolved.tiles : [];
19695
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
19696
- const units = Array.isArray(resolved?.units) ? resolved.units : [];
19697
- const assetManifest = resolved?.assetManifest;
19708
+ const tiles = propTiles ?? (Array.isArray(resolved?.tiles) ? resolved.tiles : []);
19709
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
19710
+ const units = propUnits ?? (Array.isArray(resolved?.units) ? resolved.units : []);
19711
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
19698
19712
  const backgroundImage = resolved?.backgroundImage;
19699
19713
  const [hoveredTile, setHoveredTile] = React80.useState(null);
19700
19714
  const [selectedFeature, setSelectedFeature] = React80.useState(null);
@@ -19797,14 +19811,22 @@ var init_CastleBoard = __esm({
19797
19811
  function CastleTemplate({
19798
19812
  entity,
19799
19813
  scale = 0.45,
19814
+ tiles,
19815
+ units,
19816
+ features,
19817
+ assetManifest,
19800
19818
  className
19801
19819
  }) {
19802
19820
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
19803
- if (!resolved) return null;
19821
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
19804
19822
  return /* @__PURE__ */ jsxRuntime.jsx(
19805
19823
  CastleBoard,
19806
19824
  {
19807
19825
  entity: resolved,
19826
+ tiles,
19827
+ units,
19828
+ features,
19829
+ assetManifest,
19808
19830
  scale,
19809
19831
  featureClickEvent: "FEATURE_CLICK",
19810
19832
  unitClickEvent: "UNIT_CLICK",
@@ -26437,8 +26459,8 @@ function GameCanvas2D({
26437
26459
  tickEvent,
26438
26460
  drawEvent,
26439
26461
  fps = 60,
26440
- backgroundImage,
26441
- assetBaseUrl = "",
26462
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/resonators.jpeg",
26463
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
26442
26464
  className
26443
26465
  }) {
26444
26466
  const canvasRef = React80__namespace.useRef(null);
@@ -26502,6 +26524,9 @@ function GameCanvas2D({
26502
26524
  const bgImg = loadImage(backgroundImageRef.current);
26503
26525
  if (bgImg) {
26504
26526
  ctx.drawImage(bgImg, 0, 0, widthRef.current, heightRef.current);
26527
+ } else {
26528
+ ctx.fillStyle = "#0f1420";
26529
+ ctx.fillRect(0, 0, widthRef.current, heightRef.current);
26505
26530
  }
26506
26531
  }
26507
26532
  onDrawRef.current?.(ctx, frame);
@@ -27646,10 +27671,10 @@ function PlatformerCanvas({
27646
27671
  canvasHeight = 400,
27647
27672
  followCamera = true,
27648
27673
  bgColor,
27649
- playerSprite,
27674
+ playerSprite = "https://almadar-kflow-assets.web.app/shared/platformer/characters/platformChar_idle.png",
27650
27675
  tileSprites,
27651
- backgroundImage,
27652
- assetBaseUrl = "",
27676
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
27677
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/platformer/",
27653
27678
  leftEvent = "MOVE_LEFT",
27654
27679
  rightEvent = "MOVE_RIGHT",
27655
27680
  jumpEvent = "JUMP",
@@ -45918,6 +45943,10 @@ function defaultIsInRange(from, to, range) {
45918
45943
  }
45919
45944
  function WorldMapBoard({
45920
45945
  entity,
45946
+ tiles: propTiles,
45947
+ units: propUnits,
45948
+ features: propFeatures,
45949
+ assetManifest: propAssetManifest,
45921
45950
  isLoading,
45922
45951
  scale = 0.4,
45923
45952
  unitScale = 2.5,
@@ -45946,16 +45975,16 @@ function WorldMapBoard({
45946
45975
  const resolved = boardEntity(entity);
45947
45976
  const hexes = rows(resolved?.hexes);
45948
45977
  const heroes = rows(resolved?.heroes);
45949
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
45978
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
45950
45979
  const selectedHeroId = resolved?.selectedHeroId ?? null;
45951
- const assetManifest = resolved?.assetManifest;
45980
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
45952
45981
  const backgroundImage = resolved?.backgroundImage;
45953
45982
  const [hoveredTile, setHoveredTile] = React80.useState(null);
45954
45983
  const selectedHero = React80.useMemo(
45955
45984
  () => heroes.find((h) => str(h.id) === selectedHeroId) ?? null,
45956
45985
  [heroes, selectedHeroId]
45957
45986
  );
45958
- const tiles = React80.useMemo(
45987
+ const derivedTiles = React80.useMemo(
45959
45988
  () => hexes.map((hex) => ({
45960
45989
  x: num(hex.x),
45961
45990
  y: num(hex.y),
@@ -45964,8 +45993,9 @@ function WorldMapBoard({
45964
45993
  })),
45965
45994
  [hexes]
45966
45995
  );
45996
+ const tiles = propTiles ?? derivedTiles;
45967
45997
  const baseUnits = React80.useMemo(
45968
- () => heroes.map((hero) => ({
45998
+ () => propUnits ?? heroes.map((hero) => ({
45969
45999
  id: str(hero.id),
45970
46000
  position: heroPosition(hero),
45971
46001
  name: str(hero.name),
@@ -45974,7 +46004,7 @@ function WorldMapBoard({
45974
46004
  maxHealth: 100,
45975
46005
  sprite: hero.sprite == null ? void 0 : str(hero.sprite)
45976
46006
  })),
45977
- [heroes]
46007
+ [heroes, propUnits]
45978
46008
  );
45979
46009
  const MOVE_SPEED_MS_PER_TILE = 300;
45980
46010
  const movementAnimRef = React80.useRef(null);
@@ -46184,12 +46214,20 @@ function WorldMapTemplate({
46184
46214
  unitScale = 2.5,
46185
46215
  diamondTopY,
46186
46216
  allowMoveAllHeroes = false,
46217
+ tiles,
46218
+ units,
46219
+ features,
46220
+ assetManifest,
46187
46221
  className
46188
46222
  }) {
46189
46223
  return /* @__PURE__ */ jsxRuntime.jsx(
46190
46224
  WorldMapBoard,
46191
46225
  {
46192
46226
  entity,
46227
+ tiles,
46228
+ units,
46229
+ features,
46230
+ assetManifest,
46193
46231
  scale,
46194
46232
  unitScale,
46195
46233
  diamondTopY,
@@ -7757,7 +7757,7 @@ var init_DamageNumber = __esm({
7757
7757
  function DialogueBubble({
7758
7758
  speaker,
7759
7759
  text,
7760
- portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/00_base_model.png",
7760
+ portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/04_hero.png",
7761
7761
  position = "bottom",
7762
7762
  className
7763
7763
  }) {
@@ -10711,7 +10711,7 @@ function IsometricCanvas({
10711
10711
  // Rendering options
10712
10712
  scale = 0.4,
10713
10713
  debug: debug2 = false,
10714
- backgroundImage,
10714
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
10715
10715
  showMinimap = true,
10716
10716
  enableCamera = true,
10717
10717
  unitScale = 1,
@@ -10726,7 +10726,7 @@ function IsometricCanvas({
10726
10726
  // Tuning
10727
10727
  diamondTopY: diamondTopYProp,
10728
10728
  // Remote asset loading
10729
- assetBaseUrl,
10729
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
10730
10730
  assetManifest
10731
10731
  }) {
10732
10732
  const tilesProp = Array.isArray(_tilesPropRaw) ? _tilesPropRaw : [];
@@ -11485,6 +11485,10 @@ var init_boardEntity = __esm({
11485
11485
  });
11486
11486
  function BattleBoard({
11487
11487
  entity,
11488
+ tiles: propTiles,
11489
+ units: propUnits,
11490
+ features: propFeatures,
11491
+ assetManifest: propAssetManifest,
11488
11492
  scale = 0.45,
11489
11493
  unitScale = 1,
11490
11494
  header,
@@ -11510,11 +11514,11 @@ function BattleBoard({
11510
11514
  className
11511
11515
  }) {
11512
11516
  const board = boardEntity(entity) ?? {};
11513
- const tiles = Array.isArray(board.tiles) ? board.tiles : [];
11514
- const features = Array.isArray(board.features) ? board.features : [];
11517
+ const tiles = propTiles ?? (Array.isArray(board.tiles) ? board.tiles : []);
11518
+ const features = propFeatures ?? (Array.isArray(board.features) ? board.features : []);
11515
11519
  const boardWidth = num(board.boardWidth, 8);
11516
11520
  const boardHeight = num(board.boardHeight, 6);
11517
- const assetManifest = board.assetManifest;
11521
+ const assetManifest = propAssetManifest ?? board.assetManifest;
11518
11522
  const backgroundImage = board.backgroundImage;
11519
11523
  const units = rows(board.units);
11520
11524
  const selectedUnitId = board.selectedUnitId ?? null;
@@ -11606,7 +11610,7 @@ function BattleBoard({
11606
11610
  }, 16);
11607
11611
  return () => clearInterval(interval);
11608
11612
  }, []);
11609
- const isoUnits = useMemo(() => {
11613
+ const derivedIsoUnits = useMemo(() => {
11610
11614
  return units.filter((u) => unitHealth(u) > 0).map((unit) => {
11611
11615
  const id = str(unit.id);
11612
11616
  const pos = movingPositions.get(id) ?? unitPosition(unit);
@@ -11630,6 +11634,7 @@ function BattleBoard({
11630
11634
  };
11631
11635
  });
11632
11636
  }, [units, movingPositions]);
11637
+ const isoUnits = propUnits ?? derivedIsoUnits;
11633
11638
  const maxY = Math.max(...tiles.map((t2) => t2.y), 0);
11634
11639
  const baseOffsetX = (maxY + 1) * (TILE_WIDTH * scale / 2);
11635
11640
  const tileToScreen = useCallback(
@@ -18833,16 +18838,21 @@ function EmojiEffect({
18833
18838
  }
18834
18839
  );
18835
18840
  }
18836
- function CanvasEffect(props) {
18841
+ function CanvasEffect({
18842
+ effectSpriteUrl = "https://almadar-kflow-assets.web.app/shared/effects/gas/gas00.png",
18843
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/effects/",
18844
+ ...props
18845
+ }) {
18837
18846
  const eventBus = useEventBus();
18838
- const { completeEvent, onComplete, ...rest } = props;
18847
+ const mergedProps = { effectSpriteUrl, assetBaseUrl, ...props };
18848
+ const { completeEvent, onComplete, ...rest } = mergedProps;
18839
18849
  const handleComplete = useCallback(() => {
18840
18850
  if (completeEvent) eventBus.emit(`UI:${completeEvent}`, {});
18841
18851
  onComplete?.();
18842
18852
  }, [completeEvent, eventBus, onComplete]);
18843
18853
  const enhancedProps = { ...rest, onComplete: handleComplete };
18844
- if (props.assetManifest) {
18845
- return /* @__PURE__ */ jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: props.assetManifest });
18854
+ if (rest.assetManifest) {
18855
+ return /* @__PURE__ */ jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: rest.assetManifest });
18846
18856
  }
18847
18857
  return /* @__PURE__ */ jsx(EmojiEffect, { ...enhancedProps });
18848
18858
  }
@@ -19627,6 +19637,10 @@ var init_CaseStudyOrganism = __esm({
19627
19637
  });
19628
19638
  function CastleBoard({
19629
19639
  entity,
19640
+ tiles: propTiles,
19641
+ units: propUnits,
19642
+ features: propFeatures,
19643
+ assetManifest: propAssetManifest,
19630
19644
  scale = 0.45,
19631
19645
  header,
19632
19646
  sidePanel,
@@ -19642,10 +19656,10 @@ function CastleBoard({
19642
19656
  }) {
19643
19657
  const eventBus = useEventBus();
19644
19658
  const resolved = boardEntity(entity);
19645
- const tiles = Array.isArray(resolved?.tiles) ? resolved.tiles : [];
19646
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
19647
- const units = Array.isArray(resolved?.units) ? resolved.units : [];
19648
- const assetManifest = resolved?.assetManifest;
19659
+ const tiles = propTiles ?? (Array.isArray(resolved?.tiles) ? resolved.tiles : []);
19660
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
19661
+ const units = propUnits ?? (Array.isArray(resolved?.units) ? resolved.units : []);
19662
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
19649
19663
  const backgroundImage = resolved?.backgroundImage;
19650
19664
  const [hoveredTile, setHoveredTile] = useState(null);
19651
19665
  const [selectedFeature, setSelectedFeature] = useState(null);
@@ -19748,14 +19762,22 @@ var init_CastleBoard = __esm({
19748
19762
  function CastleTemplate({
19749
19763
  entity,
19750
19764
  scale = 0.45,
19765
+ tiles,
19766
+ units,
19767
+ features,
19768
+ assetManifest,
19751
19769
  className
19752
19770
  }) {
19753
19771
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
19754
- if (!resolved) return null;
19772
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
19755
19773
  return /* @__PURE__ */ jsx(
19756
19774
  CastleBoard,
19757
19775
  {
19758
19776
  entity: resolved,
19777
+ tiles,
19778
+ units,
19779
+ features,
19780
+ assetManifest,
19759
19781
  scale,
19760
19782
  featureClickEvent: "FEATURE_CLICK",
19761
19783
  unitClickEvent: "UNIT_CLICK",
@@ -26388,8 +26410,8 @@ function GameCanvas2D({
26388
26410
  tickEvent,
26389
26411
  drawEvent,
26390
26412
  fps = 60,
26391
- backgroundImage,
26392
- assetBaseUrl = "",
26413
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/resonators.jpeg",
26414
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
26393
26415
  className
26394
26416
  }) {
26395
26417
  const canvasRef = React80.useRef(null);
@@ -26453,6 +26475,9 @@ function GameCanvas2D({
26453
26475
  const bgImg = loadImage(backgroundImageRef.current);
26454
26476
  if (bgImg) {
26455
26477
  ctx.drawImage(bgImg, 0, 0, widthRef.current, heightRef.current);
26478
+ } else {
26479
+ ctx.fillStyle = "#0f1420";
26480
+ ctx.fillRect(0, 0, widthRef.current, heightRef.current);
26456
26481
  }
26457
26482
  }
26458
26483
  onDrawRef.current?.(ctx, frame);
@@ -27597,10 +27622,10 @@ function PlatformerCanvas({
27597
27622
  canvasHeight = 400,
27598
27623
  followCamera = true,
27599
27624
  bgColor,
27600
- playerSprite,
27625
+ playerSprite = "https://almadar-kflow-assets.web.app/shared/platformer/characters/platformChar_idle.png",
27601
27626
  tileSprites,
27602
- backgroundImage,
27603
- assetBaseUrl = "",
27627
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
27628
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/platformer/",
27604
27629
  leftEvent = "MOVE_LEFT",
27605
27630
  rightEvent = "MOVE_RIGHT",
27606
27631
  jumpEvent = "JUMP",
@@ -45869,6 +45894,10 @@ function defaultIsInRange(from, to, range) {
45869
45894
  }
45870
45895
  function WorldMapBoard({
45871
45896
  entity,
45897
+ tiles: propTiles,
45898
+ units: propUnits,
45899
+ features: propFeatures,
45900
+ assetManifest: propAssetManifest,
45872
45901
  isLoading,
45873
45902
  scale = 0.4,
45874
45903
  unitScale = 2.5,
@@ -45897,16 +45926,16 @@ function WorldMapBoard({
45897
45926
  const resolved = boardEntity(entity);
45898
45927
  const hexes = rows(resolved?.hexes);
45899
45928
  const heroes = rows(resolved?.heroes);
45900
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
45929
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
45901
45930
  const selectedHeroId = resolved?.selectedHeroId ?? null;
45902
- const assetManifest = resolved?.assetManifest;
45931
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
45903
45932
  const backgroundImage = resolved?.backgroundImage;
45904
45933
  const [hoveredTile, setHoveredTile] = useState(null);
45905
45934
  const selectedHero = useMemo(
45906
45935
  () => heroes.find((h) => str(h.id) === selectedHeroId) ?? null,
45907
45936
  [heroes, selectedHeroId]
45908
45937
  );
45909
- const tiles = useMemo(
45938
+ const derivedTiles = useMemo(
45910
45939
  () => hexes.map((hex) => ({
45911
45940
  x: num(hex.x),
45912
45941
  y: num(hex.y),
@@ -45915,8 +45944,9 @@ function WorldMapBoard({
45915
45944
  })),
45916
45945
  [hexes]
45917
45946
  );
45947
+ const tiles = propTiles ?? derivedTiles;
45918
45948
  const baseUnits = useMemo(
45919
- () => heroes.map((hero) => ({
45949
+ () => propUnits ?? heroes.map((hero) => ({
45920
45950
  id: str(hero.id),
45921
45951
  position: heroPosition(hero),
45922
45952
  name: str(hero.name),
@@ -45925,7 +45955,7 @@ function WorldMapBoard({
45925
45955
  maxHealth: 100,
45926
45956
  sprite: hero.sprite == null ? void 0 : str(hero.sprite)
45927
45957
  })),
45928
- [heroes]
45958
+ [heroes, propUnits]
45929
45959
  );
45930
45960
  const MOVE_SPEED_MS_PER_TILE = 300;
45931
45961
  const movementAnimRef = useRef(null);
@@ -46135,12 +46165,20 @@ function WorldMapTemplate({
46135
46165
  unitScale = 2.5,
46136
46166
  diamondTopY,
46137
46167
  allowMoveAllHeroes = false,
46168
+ tiles,
46169
+ units,
46170
+ features,
46171
+ assetManifest,
46138
46172
  className
46139
46173
  }) {
46140
46174
  return /* @__PURE__ */ jsx(
46141
46175
  WorldMapBoard,
46142
46176
  {
46143
46177
  entity,
46178
+ tiles,
46179
+ units,
46180
+ features,
46181
+ assetManifest,
46144
46182
  scale,
46145
46183
  unitScale,
46146
46184
  diamondTopY,