@almadar/ui 5.28.2 → 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.
@@ -7717,7 +7717,7 @@ var init_DamageNumber = __esm({
7717
7717
  function DialogueBubble({
7718
7718
  speaker,
7719
7719
  text,
7720
- portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/00_base_model.png",
7720
+ portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/04_hero.png",
7721
7721
  position = "bottom",
7722
7722
  className
7723
7723
  }) {
@@ -10327,7 +10327,7 @@ function IsometricCanvas({
10327
10327
  // Rendering options
10328
10328
  scale = 0.4,
10329
10329
  debug: debug2 = false,
10330
- backgroundImage,
10330
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
10331
10331
  showMinimap = true,
10332
10332
  enableCamera = true,
10333
10333
  unitScale = 1,
@@ -10342,7 +10342,7 @@ function IsometricCanvas({
10342
10342
  // Tuning
10343
10343
  diamondTopY: diamondTopYProp,
10344
10344
  // Remote asset loading
10345
- assetBaseUrl,
10345
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
10346
10346
  assetManifest
10347
10347
  }) {
10348
10348
  const tilesProp = Array.isArray(_tilesPropRaw) ? _tilesPropRaw : [];
@@ -11101,6 +11101,10 @@ var init_boardEntity = __esm({
11101
11101
  });
11102
11102
  function BattleBoard({
11103
11103
  entity,
11104
+ tiles: propTiles,
11105
+ units: propUnits,
11106
+ features: propFeatures,
11107
+ assetManifest: propAssetManifest,
11104
11108
  scale = 0.45,
11105
11109
  unitScale = 1,
11106
11110
  header,
@@ -11126,11 +11130,11 @@ function BattleBoard({
11126
11130
  className
11127
11131
  }) {
11128
11132
  const board = boardEntity(entity) ?? {};
11129
- const tiles = Array.isArray(board.tiles) ? board.tiles : [];
11130
- const features = Array.isArray(board.features) ? board.features : [];
11133
+ const tiles = propTiles ?? (Array.isArray(board.tiles) ? board.tiles : []);
11134
+ const features = propFeatures ?? (Array.isArray(board.features) ? board.features : []);
11131
11135
  const boardWidth = num(board.boardWidth, 8);
11132
11136
  const boardHeight = num(board.boardHeight, 6);
11133
- const assetManifest = board.assetManifest;
11137
+ const assetManifest = propAssetManifest ?? board.assetManifest;
11134
11138
  const backgroundImage = board.backgroundImage;
11135
11139
  const units = rows(board.units);
11136
11140
  const selectedUnitId = board.selectedUnitId ?? null;
@@ -11222,7 +11226,7 @@ function BattleBoard({
11222
11226
  }, 16);
11223
11227
  return () => clearInterval(interval);
11224
11228
  }, []);
11225
- const isoUnits = React79.useMemo(() => {
11229
+ const derivedIsoUnits = React79.useMemo(() => {
11226
11230
  return units.filter((u) => unitHealth(u) > 0).map((unit) => {
11227
11231
  const id = str(unit.id);
11228
11232
  const pos = movingPositions.get(id) ?? unitPosition(unit);
@@ -11246,6 +11250,7 @@ function BattleBoard({
11246
11250
  };
11247
11251
  });
11248
11252
  }, [units, movingPositions]);
11253
+ const isoUnits = propUnits ?? derivedIsoUnits;
11249
11254
  const maxY = Math.max(...tiles.map((t2) => t2.y), 0);
11250
11255
  const baseOffsetX = (maxY + 1) * (TILE_WIDTH * scale / 2);
11251
11256
  const tileToScreen = React79.useCallback(
@@ -18449,16 +18454,21 @@ function EmojiEffect({
18449
18454
  }
18450
18455
  );
18451
18456
  }
18452
- function CanvasEffect(props) {
18457
+ function CanvasEffect({
18458
+ effectSpriteUrl = "https://almadar-kflow-assets.web.app/shared/effects/gas/gas00.png",
18459
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/effects/",
18460
+ ...props
18461
+ }) {
18453
18462
  const eventBus = useEventBus();
18454
- const { completeEvent, onComplete, ...rest } = props;
18463
+ const mergedProps = { effectSpriteUrl, assetBaseUrl, ...props };
18464
+ const { completeEvent, onComplete, ...rest } = mergedProps;
18455
18465
  const handleComplete = React79.useCallback(() => {
18456
18466
  if (completeEvent) eventBus.emit(`UI:${completeEvent}`, {});
18457
18467
  onComplete?.();
18458
18468
  }, [completeEvent, eventBus, onComplete]);
18459
18469
  const enhancedProps = { ...rest, onComplete: handleComplete };
18460
- if (props.assetManifest) {
18461
- return /* @__PURE__ */ jsxRuntime.jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: props.assetManifest });
18470
+ if (rest.assetManifest) {
18471
+ return /* @__PURE__ */ jsxRuntime.jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: rest.assetManifest });
18462
18472
  }
18463
18473
  return /* @__PURE__ */ jsxRuntime.jsx(EmojiEffect, { ...enhancedProps });
18464
18474
  }
@@ -19243,6 +19253,10 @@ var init_CaseStudyOrganism = __esm({
19243
19253
  });
19244
19254
  function CastleBoard({
19245
19255
  entity,
19256
+ tiles: propTiles,
19257
+ units: propUnits,
19258
+ features: propFeatures,
19259
+ assetManifest: propAssetManifest,
19246
19260
  scale = 0.45,
19247
19261
  header,
19248
19262
  sidePanel,
@@ -19258,10 +19272,10 @@ function CastleBoard({
19258
19272
  }) {
19259
19273
  const eventBus = useEventBus();
19260
19274
  const resolved = boardEntity(entity);
19261
- const tiles = Array.isArray(resolved?.tiles) ? resolved.tiles : [];
19262
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
19263
- const units = Array.isArray(resolved?.units) ? resolved.units : [];
19264
- const assetManifest = resolved?.assetManifest;
19275
+ const tiles = propTiles ?? (Array.isArray(resolved?.tiles) ? resolved.tiles : []);
19276
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
19277
+ const units = propUnits ?? (Array.isArray(resolved?.units) ? resolved.units : []);
19278
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
19265
19279
  const backgroundImage = resolved?.backgroundImage;
19266
19280
  const [hoveredTile, setHoveredTile] = React79.useState(null);
19267
19281
  const [selectedFeature, setSelectedFeature] = React79.useState(null);
@@ -19364,14 +19378,22 @@ var init_CastleBoard = __esm({
19364
19378
  function CastleTemplate({
19365
19379
  entity,
19366
19380
  scale = 0.45,
19381
+ tiles,
19382
+ units,
19383
+ features,
19384
+ assetManifest,
19367
19385
  className
19368
19386
  }) {
19369
19387
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
19370
- if (!resolved) return null;
19388
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
19371
19389
  return /* @__PURE__ */ jsxRuntime.jsx(
19372
19390
  CastleBoard,
19373
19391
  {
19374
19392
  entity: resolved,
19393
+ tiles,
19394
+ units,
19395
+ features,
19396
+ assetManifest,
19375
19397
  scale,
19376
19398
  featureClickEvent: "FEATURE_CLICK",
19377
19399
  unitClickEvent: "UNIT_CLICK",
@@ -26004,8 +26026,8 @@ function GameCanvas2D({
26004
26026
  tickEvent,
26005
26027
  drawEvent,
26006
26028
  fps = 60,
26007
- backgroundImage,
26008
- assetBaseUrl = "",
26029
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/resonators.jpeg",
26030
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
26009
26031
  className
26010
26032
  }) {
26011
26033
  const canvasRef = React79__namespace.useRef(null);
@@ -26069,6 +26091,9 @@ function GameCanvas2D({
26069
26091
  const bgImg = loadImage(backgroundImageRef.current);
26070
26092
  if (bgImg) {
26071
26093
  ctx.drawImage(bgImg, 0, 0, widthRef.current, heightRef.current);
26094
+ } else {
26095
+ ctx.fillStyle = "#0f1420";
26096
+ ctx.fillRect(0, 0, widthRef.current, heightRef.current);
26072
26097
  }
26073
26098
  }
26074
26099
  onDrawRef.current?.(ctx, frame);
@@ -27213,10 +27238,10 @@ function PlatformerCanvas({
27213
27238
  canvasHeight = 400,
27214
27239
  followCamera = true,
27215
27240
  bgColor,
27216
- playerSprite,
27241
+ playerSprite = "https://almadar-kflow-assets.web.app/shared/platformer/characters/platformChar_idle.png",
27217
27242
  tileSprites,
27218
- backgroundImage,
27219
- assetBaseUrl = "",
27243
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
27244
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/platformer/",
27220
27245
  leftEvent = "MOVE_LEFT",
27221
27246
  rightEvent = "MOVE_RIGHT",
27222
27247
  jumpEvent = "JUMP",
@@ -45504,6 +45529,10 @@ function defaultIsInRange(from, to, range) {
45504
45529
  }
45505
45530
  function WorldMapBoard({
45506
45531
  entity,
45532
+ tiles: propTiles,
45533
+ units: propUnits,
45534
+ features: propFeatures,
45535
+ assetManifest: propAssetManifest,
45507
45536
  isLoading,
45508
45537
  scale = 0.4,
45509
45538
  unitScale = 2.5,
@@ -45532,16 +45561,16 @@ function WorldMapBoard({
45532
45561
  const resolved = boardEntity(entity);
45533
45562
  const hexes = rows(resolved?.hexes);
45534
45563
  const heroes = rows(resolved?.heroes);
45535
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
45564
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
45536
45565
  const selectedHeroId = resolved?.selectedHeroId ?? null;
45537
- const assetManifest = resolved?.assetManifest;
45566
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
45538
45567
  const backgroundImage = resolved?.backgroundImage;
45539
45568
  const [hoveredTile, setHoveredTile] = React79.useState(null);
45540
45569
  const selectedHero = React79.useMemo(
45541
45570
  () => heroes.find((h) => str(h.id) === selectedHeroId) ?? null,
45542
45571
  [heroes, selectedHeroId]
45543
45572
  );
45544
- const tiles = React79.useMemo(
45573
+ const derivedTiles = React79.useMemo(
45545
45574
  () => hexes.map((hex) => ({
45546
45575
  x: num(hex.x),
45547
45576
  y: num(hex.y),
@@ -45550,8 +45579,9 @@ function WorldMapBoard({
45550
45579
  })),
45551
45580
  [hexes]
45552
45581
  );
45582
+ const tiles = propTiles ?? derivedTiles;
45553
45583
  const baseUnits = React79.useMemo(
45554
- () => heroes.map((hero) => ({
45584
+ () => propUnits ?? heroes.map((hero) => ({
45555
45585
  id: str(hero.id),
45556
45586
  position: heroPosition(hero),
45557
45587
  name: str(hero.name),
@@ -45560,7 +45590,7 @@ function WorldMapBoard({
45560
45590
  maxHealth: 100,
45561
45591
  sprite: hero.sprite == null ? void 0 : str(hero.sprite)
45562
45592
  })),
45563
- [heroes]
45593
+ [heroes, propUnits]
45564
45594
  );
45565
45595
  const MOVE_SPEED_MS_PER_TILE = 300;
45566
45596
  const movementAnimRef = React79.useRef(null);
@@ -45770,12 +45800,20 @@ function WorldMapTemplate({
45770
45800
  unitScale = 2.5,
45771
45801
  diamondTopY,
45772
45802
  allowMoveAllHeroes = false,
45803
+ tiles,
45804
+ units,
45805
+ features,
45806
+ assetManifest,
45773
45807
  className
45774
45808
  }) {
45775
45809
  return /* @__PURE__ */ jsxRuntime.jsx(
45776
45810
  WorldMapBoard,
45777
45811
  {
45778
45812
  entity,
45813
+ tiles,
45814
+ units,
45815
+ features,
45816
+ assetManifest,
45779
45817
  scale,
45780
45818
  unitScale,
45781
45819
  diamondTopY,
@@ -7668,7 +7668,7 @@ var init_DamageNumber = __esm({
7668
7668
  function DialogueBubble({
7669
7669
  speaker,
7670
7670
  text,
7671
- portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/00_base_model.png",
7671
+ portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/04_hero.png",
7672
7672
  position = "bottom",
7673
7673
  className
7674
7674
  }) {
@@ -10278,7 +10278,7 @@ function IsometricCanvas({
10278
10278
  // Rendering options
10279
10279
  scale = 0.4,
10280
10280
  debug: debug2 = false,
10281
- backgroundImage,
10281
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
10282
10282
  showMinimap = true,
10283
10283
  enableCamera = true,
10284
10284
  unitScale = 1,
@@ -10293,7 +10293,7 @@ function IsometricCanvas({
10293
10293
  // Tuning
10294
10294
  diamondTopY: diamondTopYProp,
10295
10295
  // Remote asset loading
10296
- assetBaseUrl,
10296
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
10297
10297
  assetManifest
10298
10298
  }) {
10299
10299
  const tilesProp = Array.isArray(_tilesPropRaw) ? _tilesPropRaw : [];
@@ -11052,6 +11052,10 @@ var init_boardEntity = __esm({
11052
11052
  });
11053
11053
  function BattleBoard({
11054
11054
  entity,
11055
+ tiles: propTiles,
11056
+ units: propUnits,
11057
+ features: propFeatures,
11058
+ assetManifest: propAssetManifest,
11055
11059
  scale = 0.45,
11056
11060
  unitScale = 1,
11057
11061
  header,
@@ -11077,11 +11081,11 @@ function BattleBoard({
11077
11081
  className
11078
11082
  }) {
11079
11083
  const board = boardEntity(entity) ?? {};
11080
- const tiles = Array.isArray(board.tiles) ? board.tiles : [];
11081
- const features = Array.isArray(board.features) ? board.features : [];
11084
+ const tiles = propTiles ?? (Array.isArray(board.tiles) ? board.tiles : []);
11085
+ const features = propFeatures ?? (Array.isArray(board.features) ? board.features : []);
11082
11086
  const boardWidth = num(board.boardWidth, 8);
11083
11087
  const boardHeight = num(board.boardHeight, 6);
11084
- const assetManifest = board.assetManifest;
11088
+ const assetManifest = propAssetManifest ?? board.assetManifest;
11085
11089
  const backgroundImage = board.backgroundImage;
11086
11090
  const units = rows(board.units);
11087
11091
  const selectedUnitId = board.selectedUnitId ?? null;
@@ -11173,7 +11177,7 @@ function BattleBoard({
11173
11177
  }, 16);
11174
11178
  return () => clearInterval(interval);
11175
11179
  }, []);
11176
- const isoUnits = useMemo(() => {
11180
+ const derivedIsoUnits = useMemo(() => {
11177
11181
  return units.filter((u) => unitHealth(u) > 0).map((unit) => {
11178
11182
  const id = str(unit.id);
11179
11183
  const pos = movingPositions.get(id) ?? unitPosition(unit);
@@ -11197,6 +11201,7 @@ function BattleBoard({
11197
11201
  };
11198
11202
  });
11199
11203
  }, [units, movingPositions]);
11204
+ const isoUnits = propUnits ?? derivedIsoUnits;
11200
11205
  const maxY = Math.max(...tiles.map((t2) => t2.y), 0);
11201
11206
  const baseOffsetX = (maxY + 1) * (TILE_WIDTH * scale / 2);
11202
11207
  const tileToScreen = useCallback(
@@ -18400,16 +18405,21 @@ function EmojiEffect({
18400
18405
  }
18401
18406
  );
18402
18407
  }
18403
- function CanvasEffect(props) {
18408
+ function CanvasEffect({
18409
+ effectSpriteUrl = "https://almadar-kflow-assets.web.app/shared/effects/gas/gas00.png",
18410
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/effects/",
18411
+ ...props
18412
+ }) {
18404
18413
  const eventBus = useEventBus();
18405
- const { completeEvent, onComplete, ...rest } = props;
18414
+ const mergedProps = { effectSpriteUrl, assetBaseUrl, ...props };
18415
+ const { completeEvent, onComplete, ...rest } = mergedProps;
18406
18416
  const handleComplete = useCallback(() => {
18407
18417
  if (completeEvent) eventBus.emit(`UI:${completeEvent}`, {});
18408
18418
  onComplete?.();
18409
18419
  }, [completeEvent, eventBus, onComplete]);
18410
18420
  const enhancedProps = { ...rest, onComplete: handleComplete };
18411
- if (props.assetManifest) {
18412
- return /* @__PURE__ */ jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: props.assetManifest });
18421
+ if (rest.assetManifest) {
18422
+ return /* @__PURE__ */ jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: rest.assetManifest });
18413
18423
  }
18414
18424
  return /* @__PURE__ */ jsx(EmojiEffect, { ...enhancedProps });
18415
18425
  }
@@ -19194,6 +19204,10 @@ var init_CaseStudyOrganism = __esm({
19194
19204
  });
19195
19205
  function CastleBoard({
19196
19206
  entity,
19207
+ tiles: propTiles,
19208
+ units: propUnits,
19209
+ features: propFeatures,
19210
+ assetManifest: propAssetManifest,
19197
19211
  scale = 0.45,
19198
19212
  header,
19199
19213
  sidePanel,
@@ -19209,10 +19223,10 @@ function CastleBoard({
19209
19223
  }) {
19210
19224
  const eventBus = useEventBus();
19211
19225
  const resolved = boardEntity(entity);
19212
- const tiles = Array.isArray(resolved?.tiles) ? resolved.tiles : [];
19213
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
19214
- const units = Array.isArray(resolved?.units) ? resolved.units : [];
19215
- const assetManifest = resolved?.assetManifest;
19226
+ const tiles = propTiles ?? (Array.isArray(resolved?.tiles) ? resolved.tiles : []);
19227
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
19228
+ const units = propUnits ?? (Array.isArray(resolved?.units) ? resolved.units : []);
19229
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
19216
19230
  const backgroundImage = resolved?.backgroundImage;
19217
19231
  const [hoveredTile, setHoveredTile] = useState(null);
19218
19232
  const [selectedFeature, setSelectedFeature] = useState(null);
@@ -19315,14 +19329,22 @@ var init_CastleBoard = __esm({
19315
19329
  function CastleTemplate({
19316
19330
  entity,
19317
19331
  scale = 0.45,
19332
+ tiles,
19333
+ units,
19334
+ features,
19335
+ assetManifest,
19318
19336
  className
19319
19337
  }) {
19320
19338
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
19321
- if (!resolved) return null;
19339
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
19322
19340
  return /* @__PURE__ */ jsx(
19323
19341
  CastleBoard,
19324
19342
  {
19325
19343
  entity: resolved,
19344
+ tiles,
19345
+ units,
19346
+ features,
19347
+ assetManifest,
19326
19348
  scale,
19327
19349
  featureClickEvent: "FEATURE_CLICK",
19328
19350
  unitClickEvent: "UNIT_CLICK",
@@ -25955,8 +25977,8 @@ function GameCanvas2D({
25955
25977
  tickEvent,
25956
25978
  drawEvent,
25957
25979
  fps = 60,
25958
- backgroundImage,
25959
- assetBaseUrl = "",
25980
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/resonators.jpeg",
25981
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
25960
25982
  className
25961
25983
  }) {
25962
25984
  const canvasRef = React79.useRef(null);
@@ -26020,6 +26042,9 @@ function GameCanvas2D({
26020
26042
  const bgImg = loadImage(backgroundImageRef.current);
26021
26043
  if (bgImg) {
26022
26044
  ctx.drawImage(bgImg, 0, 0, widthRef.current, heightRef.current);
26045
+ } else {
26046
+ ctx.fillStyle = "#0f1420";
26047
+ ctx.fillRect(0, 0, widthRef.current, heightRef.current);
26023
26048
  }
26024
26049
  }
26025
26050
  onDrawRef.current?.(ctx, frame);
@@ -27164,10 +27189,10 @@ function PlatformerCanvas({
27164
27189
  canvasHeight = 400,
27165
27190
  followCamera = true,
27166
27191
  bgColor,
27167
- playerSprite,
27192
+ playerSprite = "https://almadar-kflow-assets.web.app/shared/platformer/characters/platformChar_idle.png",
27168
27193
  tileSprites,
27169
- backgroundImage,
27170
- assetBaseUrl = "",
27194
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
27195
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/platformer/",
27171
27196
  leftEvent = "MOVE_LEFT",
27172
27197
  rightEvent = "MOVE_RIGHT",
27173
27198
  jumpEvent = "JUMP",
@@ -45455,6 +45480,10 @@ function defaultIsInRange(from, to, range) {
45455
45480
  }
45456
45481
  function WorldMapBoard({
45457
45482
  entity,
45483
+ tiles: propTiles,
45484
+ units: propUnits,
45485
+ features: propFeatures,
45486
+ assetManifest: propAssetManifest,
45458
45487
  isLoading,
45459
45488
  scale = 0.4,
45460
45489
  unitScale = 2.5,
@@ -45483,16 +45512,16 @@ function WorldMapBoard({
45483
45512
  const resolved = boardEntity(entity);
45484
45513
  const hexes = rows(resolved?.hexes);
45485
45514
  const heroes = rows(resolved?.heroes);
45486
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
45515
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
45487
45516
  const selectedHeroId = resolved?.selectedHeroId ?? null;
45488
- const assetManifest = resolved?.assetManifest;
45517
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
45489
45518
  const backgroundImage = resolved?.backgroundImage;
45490
45519
  const [hoveredTile, setHoveredTile] = useState(null);
45491
45520
  const selectedHero = useMemo(
45492
45521
  () => heroes.find((h) => str(h.id) === selectedHeroId) ?? null,
45493
45522
  [heroes, selectedHeroId]
45494
45523
  );
45495
- const tiles = useMemo(
45524
+ const derivedTiles = useMemo(
45496
45525
  () => hexes.map((hex) => ({
45497
45526
  x: num(hex.x),
45498
45527
  y: num(hex.y),
@@ -45501,8 +45530,9 @@ function WorldMapBoard({
45501
45530
  })),
45502
45531
  [hexes]
45503
45532
  );
45533
+ const tiles = propTiles ?? derivedTiles;
45504
45534
  const baseUnits = useMemo(
45505
- () => heroes.map((hero) => ({
45535
+ () => propUnits ?? heroes.map((hero) => ({
45506
45536
  id: str(hero.id),
45507
45537
  position: heroPosition(hero),
45508
45538
  name: str(hero.name),
@@ -45511,7 +45541,7 @@ function WorldMapBoard({
45511
45541
  maxHealth: 100,
45512
45542
  sprite: hero.sprite == null ? void 0 : str(hero.sprite)
45513
45543
  })),
45514
- [heroes]
45544
+ [heroes, propUnits]
45515
45545
  );
45516
45546
  const MOVE_SPEED_MS_PER_TILE = 300;
45517
45547
  const movementAnimRef = useRef(null);
@@ -45721,12 +45751,20 @@ function WorldMapTemplate({
45721
45751
  unitScale = 2.5,
45722
45752
  diamondTopY,
45723
45753
  allowMoveAllHeroes = false,
45754
+ tiles,
45755
+ units,
45756
+ features,
45757
+ assetManifest,
45724
45758
  className
45725
45759
  }) {
45726
45760
  return /* @__PURE__ */ jsx(
45727
45761
  WorldMapBoard,
45728
45762
  {
45729
45763
  entity,
45764
+ tiles,
45765
+ units,
45766
+ features,
45767
+ assetManifest,
45730
45768
  scale,
45731
45769
  unitScale,
45732
45770
  diamondTopY,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "5.28.2",
3
+ "version": "5.28.3",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [