@almadar/ui 5.28.2 → 5.28.4

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.
@@ -11456,7 +11456,7 @@ var init_DamageNumber = __esm({
11456
11456
  function DialogueBubble({
11457
11457
  speaker,
11458
11458
  text,
11459
- portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/00_base_model.png",
11459
+ portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/04_hero.png",
11460
11460
  position = "bottom",
11461
11461
  className
11462
11462
  }) {
@@ -14066,7 +14066,7 @@ function IsometricCanvas({
14066
14066
  // Rendering options
14067
14067
  scale = 0.4,
14068
14068
  debug: debug2 = false,
14069
- backgroundImage,
14069
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
14070
14070
  showMinimap = true,
14071
14071
  enableCamera = true,
14072
14072
  unitScale = 1,
@@ -14081,7 +14081,7 @@ function IsometricCanvas({
14081
14081
  // Tuning
14082
14082
  diamondTopY: diamondTopYProp,
14083
14083
  // Remote asset loading
14084
- assetBaseUrl,
14084
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
14085
14085
  assetManifest
14086
14086
  }) {
14087
14087
  const tilesProp = Array.isArray(_tilesPropRaw) ? _tilesPropRaw : [];
@@ -14840,6 +14840,10 @@ var init_boardEntity = __esm({
14840
14840
  });
14841
14841
  function BattleBoard({
14842
14842
  entity,
14843
+ tiles: propTiles,
14844
+ units: propUnits,
14845
+ features: propFeatures,
14846
+ assetManifest: propAssetManifest,
14843
14847
  scale = 0.45,
14844
14848
  unitScale = 1,
14845
14849
  header,
@@ -14865,11 +14869,11 @@ function BattleBoard({
14865
14869
  className
14866
14870
  }) {
14867
14871
  const board = boardEntity(entity) ?? {};
14868
- const tiles = Array.isArray(board.tiles) ? board.tiles : [];
14869
- const features = Array.isArray(board.features) ? board.features : [];
14872
+ const tiles = propTiles ?? (Array.isArray(board.tiles) ? board.tiles : []);
14873
+ const features = propFeatures ?? (Array.isArray(board.features) ? board.features : []);
14870
14874
  const boardWidth = num(board.boardWidth, 8);
14871
14875
  const boardHeight = num(board.boardHeight, 6);
14872
- const assetManifest = board.assetManifest;
14876
+ const assetManifest = propAssetManifest ?? board.assetManifest;
14873
14877
  const backgroundImage = board.backgroundImage;
14874
14878
  const units = rows(board.units);
14875
14879
  const selectedUnitId = board.selectedUnitId ?? null;
@@ -14961,7 +14965,7 @@ function BattleBoard({
14961
14965
  }, 16);
14962
14966
  return () => clearInterval(interval);
14963
14967
  }, []);
14964
- const isoUnits = React88.useMemo(() => {
14968
+ const derivedIsoUnits = React88.useMemo(() => {
14965
14969
  return units.filter((u) => unitHealth(u) > 0).map((unit) => {
14966
14970
  const id = str(unit.id);
14967
14971
  const pos = movingPositions.get(id) ?? unitPosition(unit);
@@ -14985,6 +14989,7 @@ function BattleBoard({
14985
14989
  };
14986
14990
  });
14987
14991
  }, [units, movingPositions]);
14992
+ const isoUnits = propUnits ?? derivedIsoUnits;
14988
14993
  const maxY = Math.max(...tiles.map((t2) => t2.y), 0);
14989
14994
  const baseOffsetX = (maxY + 1) * (TILE_WIDTH * scale / 2);
14990
14995
  const tileToScreen = React88.useCallback(
@@ -15206,14 +15211,22 @@ function BattleTemplate({
15206
15211
  entity,
15207
15212
  scale = 0.45,
15208
15213
  unitScale = 1,
15214
+ tiles,
15215
+ units,
15216
+ features,
15217
+ assetManifest,
15209
15218
  className
15210
15219
  }) {
15211
15220
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
15212
- if (!resolved) return null;
15221
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
15213
15222
  return /* @__PURE__ */ jsxRuntime.jsx(
15214
15223
  BattleBoard,
15215
15224
  {
15216
15225
  entity: resolved,
15226
+ tiles,
15227
+ units,
15228
+ features,
15229
+ assetManifest,
15217
15230
  scale,
15218
15231
  unitScale,
15219
15232
  tileClickEvent: "TILE_CLICK",
@@ -21359,16 +21372,21 @@ function EmojiEffect({
21359
21372
  }
21360
21373
  );
21361
21374
  }
21362
- function CanvasEffect(props) {
21375
+ function CanvasEffect({
21376
+ effectSpriteUrl = "https://almadar-kflow-assets.web.app/shared/effects/gas/gas00.png",
21377
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/effects/",
21378
+ ...props
21379
+ }) {
21363
21380
  const eventBus = useEventBus();
21364
- const { completeEvent, onComplete, ...rest } = props;
21381
+ const mergedProps = { effectSpriteUrl, assetBaseUrl, ...props };
21382
+ const { completeEvent, onComplete, ...rest } = mergedProps;
21365
21383
  const handleComplete = React88.useCallback(() => {
21366
21384
  if (completeEvent) eventBus.emit(`UI:${completeEvent}`, {});
21367
21385
  onComplete?.();
21368
21386
  }, [completeEvent, eventBus, onComplete]);
21369
21387
  const enhancedProps = { ...rest, onComplete: handleComplete };
21370
- if (props.assetManifest) {
21371
- return /* @__PURE__ */ jsxRuntime.jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: props.assetManifest });
21388
+ if (rest.assetManifest) {
21389
+ return /* @__PURE__ */ jsxRuntime.jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: rest.assetManifest });
21372
21390
  }
21373
21391
  return /* @__PURE__ */ jsxRuntime.jsx(EmojiEffect, { ...enhancedProps });
21374
21392
  }
@@ -22153,6 +22171,10 @@ var init_CaseStudyOrganism = __esm({
22153
22171
  });
22154
22172
  function CastleBoard({
22155
22173
  entity,
22174
+ tiles: propTiles,
22175
+ units: propUnits,
22176
+ features: propFeatures,
22177
+ assetManifest: propAssetManifest,
22156
22178
  scale = 0.45,
22157
22179
  header,
22158
22180
  sidePanel,
@@ -22168,10 +22190,10 @@ function CastleBoard({
22168
22190
  }) {
22169
22191
  const eventBus = useEventBus();
22170
22192
  const resolved = boardEntity(entity);
22171
- const tiles = Array.isArray(resolved?.tiles) ? resolved.tiles : [];
22172
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
22173
- const units = Array.isArray(resolved?.units) ? resolved.units : [];
22174
- const assetManifest = resolved?.assetManifest;
22193
+ const tiles = propTiles ?? (Array.isArray(resolved?.tiles) ? resolved.tiles : []);
22194
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
22195
+ const units = propUnits ?? (Array.isArray(resolved?.units) ? resolved.units : []);
22196
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
22175
22197
  const backgroundImage = resolved?.backgroundImage;
22176
22198
  const [hoveredTile, setHoveredTile] = React88.useState(null);
22177
22199
  const [selectedFeature, setSelectedFeature] = React88.useState(null);
@@ -22274,14 +22296,22 @@ var init_CastleBoard = __esm({
22274
22296
  function CastleTemplate({
22275
22297
  entity,
22276
22298
  scale = 0.45,
22299
+ tiles,
22300
+ units,
22301
+ features,
22302
+ assetManifest,
22277
22303
  className
22278
22304
  }) {
22279
22305
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
22280
- if (!resolved) return null;
22306
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
22281
22307
  return /* @__PURE__ */ jsxRuntime.jsx(
22282
22308
  CastleBoard,
22283
22309
  {
22284
22310
  entity: resolved,
22311
+ tiles,
22312
+ units,
22313
+ features,
22314
+ assetManifest,
22285
22315
  scale,
22286
22316
  featureClickEvent: "FEATURE_CLICK",
22287
22317
  unitClickEvent: "UNIT_CLICK",
@@ -28914,8 +28944,8 @@ function GameCanvas2D({
28914
28944
  tickEvent,
28915
28945
  drawEvent,
28916
28946
  fps = 60,
28917
- backgroundImage,
28918
- assetBaseUrl = "",
28947
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/resonators.jpeg",
28948
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
28919
28949
  className
28920
28950
  }) {
28921
28951
  const canvasRef = React88__namespace.useRef(null);
@@ -28979,6 +29009,9 @@ function GameCanvas2D({
28979
29009
  const bgImg = loadImage(backgroundImageRef.current);
28980
29010
  if (bgImg) {
28981
29011
  ctx.drawImage(bgImg, 0, 0, widthRef.current, heightRef.current);
29012
+ } else {
29013
+ ctx.fillStyle = "#0f1420";
29014
+ ctx.fillRect(0, 0, widthRef.current, heightRef.current);
28982
29015
  }
28983
29016
  }
28984
29017
  onDrawRef.current?.(ctx, frame);
@@ -30123,10 +30156,10 @@ function PlatformerCanvas({
30123
30156
  canvasHeight = 400,
30124
30157
  followCamera = true,
30125
30158
  bgColor,
30126
- playerSprite,
30159
+ playerSprite = "https://almadar-kflow-assets.web.app/shared/platformer/characters/platformChar_idle.png",
30127
30160
  tileSprites,
30128
- backgroundImage,
30129
- assetBaseUrl = "",
30161
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
30162
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/platformer/",
30130
30163
  leftEvent = "MOVE_LEFT",
30131
30164
  rightEvent = "MOVE_RIGHT",
30132
30165
  jumpEvent = "JUMP",
@@ -47944,7 +47977,14 @@ var init_useBattleState = __esm({
47944
47977
  init_boardEntity();
47945
47978
  }
47946
47979
  });
47947
- function UncontrolledBattleBoard({ entity, ...rest }) {
47980
+ function UncontrolledBattleBoard({
47981
+ entity,
47982
+ tiles,
47983
+ units,
47984
+ features,
47985
+ assetManifest,
47986
+ ...rest
47987
+ }) {
47948
47988
  const resolved = boardEntity(entity);
47949
47989
  const battleState = useBattleState(
47950
47990
  rows(resolved?.initialUnits),
@@ -47964,19 +48004,23 @@ function UncontrolledBattleBoard({ entity, ...rest }) {
47964
48004
  calculateDamage: rest.calculateDamage
47965
48005
  }
47966
48006
  );
47967
- if (!resolved) return null;
48007
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
47968
48008
  return /* @__PURE__ */ jsxRuntime.jsx(
47969
48009
  BattleBoard,
47970
48010
  {
47971
48011
  ...rest,
47972
- entity: {
48012
+ tiles,
48013
+ units,
48014
+ features,
48015
+ assetManifest,
48016
+ entity: resolved ? {
47973
48017
  ...resolved,
47974
48018
  units: battleState.units,
47975
48019
  phase: battleState.phase,
47976
48020
  turn: battleState.turn,
47977
48021
  gameResult: battleState.gameResult,
47978
48022
  selectedUnitId: battleState.selectedUnitId
47979
- }
48023
+ } : void 0
47980
48024
  }
47981
48025
  );
47982
48026
  }
@@ -48005,6 +48049,10 @@ function defaultIsInRange(from, to, range) {
48005
48049
  }
48006
48050
  function WorldMapBoard({
48007
48051
  entity,
48052
+ tiles: propTiles,
48053
+ units: propUnits,
48054
+ features: propFeatures,
48055
+ assetManifest: propAssetManifest,
48008
48056
  isLoading,
48009
48057
  scale = 0.4,
48010
48058
  unitScale = 2.5,
@@ -48033,16 +48081,16 @@ function WorldMapBoard({
48033
48081
  const resolved = boardEntity(entity);
48034
48082
  const hexes = rows(resolved?.hexes);
48035
48083
  const heroes = rows(resolved?.heroes);
48036
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
48084
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
48037
48085
  const selectedHeroId = resolved?.selectedHeroId ?? null;
48038
- const assetManifest = resolved?.assetManifest;
48086
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
48039
48087
  const backgroundImage = resolved?.backgroundImage;
48040
48088
  const [hoveredTile, setHoveredTile] = React88.useState(null);
48041
48089
  const selectedHero = React88.useMemo(
48042
48090
  () => heroes.find((h) => str(h.id) === selectedHeroId) ?? null,
48043
48091
  [heroes, selectedHeroId]
48044
48092
  );
48045
- const tiles = React88.useMemo(
48093
+ const derivedTiles = React88.useMemo(
48046
48094
  () => hexes.map((hex) => ({
48047
48095
  x: num(hex.x),
48048
48096
  y: num(hex.y),
@@ -48051,8 +48099,9 @@ function WorldMapBoard({
48051
48099
  })),
48052
48100
  [hexes]
48053
48101
  );
48102
+ const tiles = propTiles ?? derivedTiles;
48054
48103
  const baseUnits = React88.useMemo(
48055
- () => heroes.map((hero) => ({
48104
+ () => propUnits ?? heroes.map((hero) => ({
48056
48105
  id: str(hero.id),
48057
48106
  position: heroPosition(hero),
48058
48107
  name: str(hero.name),
@@ -48061,7 +48110,7 @@ function WorldMapBoard({
48061
48110
  maxHealth: 100,
48062
48111
  sprite: hero.sprite == null ? void 0 : str(hero.sprite)
48063
48112
  })),
48064
- [heroes]
48113
+ [heroes, propUnits]
48065
48114
  );
48066
48115
  const MOVE_SPEED_MS_PER_TILE = 300;
48067
48116
  const movementAnimRef = React88.useRef(null);
@@ -48271,12 +48320,20 @@ function WorldMapTemplate({
48271
48320
  unitScale = 2.5,
48272
48321
  diamondTopY,
48273
48322
  allowMoveAllHeroes = false,
48323
+ tiles,
48324
+ units,
48325
+ features,
48326
+ assetManifest,
48274
48327
  className
48275
48328
  }) {
48276
48329
  return /* @__PURE__ */ jsxRuntime.jsx(
48277
48330
  WorldMapBoard,
48278
48331
  {
48279
48332
  entity,
48333
+ tiles,
48334
+ units,
48335
+ features,
48336
+ assetManifest,
48280
48337
  scale,
48281
48338
  unitScale,
48282
48339
  diamondTopY,
@@ -49494,6 +49551,24 @@ function renderPatternProps(props, onDismiss) {
49494
49551
  priority: 0
49495
49552
  };
49496
49553
  rendered[key] = /* @__PURE__ */ jsxRuntime.jsx(SlotContentRenderer, { content: childContent, onDismiss });
49554
+ } else if (Array.isArray(value)) {
49555
+ rendered[key] = value.map((item, i) => {
49556
+ const el = item;
49557
+ if (isPatternConfig(el)) {
49558
+ const nestedProps = {};
49559
+ for (const [k, v] of Object.entries(el)) {
49560
+ if (k !== "type") nestedProps[k] = v;
49561
+ }
49562
+ const childContent = {
49563
+ id: `prop-${key}-${i}`,
49564
+ pattern: el.type,
49565
+ props: nestedProps,
49566
+ priority: 0
49567
+ };
49568
+ return /* @__PURE__ */ jsxRuntime.jsx(SlotContentRenderer, { content: childContent, onDismiss }, i);
49569
+ }
49570
+ return substituteTraitRefsDeep(el, `prop:${key}[${i}]`);
49571
+ });
49497
49572
  } else {
49498
49573
  rendered[key] = substituteTraitRefsDeep(value, `prop:${key}`);
49499
49574
  }
package/dist/avl/index.js CHANGED
@@ -11407,7 +11407,7 @@ var init_DamageNumber = __esm({
11407
11407
  function DialogueBubble({
11408
11408
  speaker,
11409
11409
  text,
11410
- portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/00_base_model.png",
11410
+ portrait = "https://almadar-kflow-assets.web.app/shared/characters/archetypes/04_hero.png",
11411
11411
  position = "bottom",
11412
11412
  className
11413
11413
  }) {
@@ -14017,7 +14017,7 @@ function IsometricCanvas({
14017
14017
  // Rendering options
14018
14018
  scale = 0.4,
14019
14019
  debug: debug2 = false,
14020
- backgroundImage,
14020
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
14021
14021
  showMinimap = true,
14022
14022
  enableCamera = true,
14023
14023
  unitScale = 1,
@@ -14032,7 +14032,7 @@ function IsometricCanvas({
14032
14032
  // Tuning
14033
14033
  diamondTopY: diamondTopYProp,
14034
14034
  // Remote asset loading
14035
- assetBaseUrl,
14035
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
14036
14036
  assetManifest
14037
14037
  }) {
14038
14038
  const tilesProp = Array.isArray(_tilesPropRaw) ? _tilesPropRaw : [];
@@ -14791,6 +14791,10 @@ var init_boardEntity = __esm({
14791
14791
  });
14792
14792
  function BattleBoard({
14793
14793
  entity,
14794
+ tiles: propTiles,
14795
+ units: propUnits,
14796
+ features: propFeatures,
14797
+ assetManifest: propAssetManifest,
14794
14798
  scale = 0.45,
14795
14799
  unitScale = 1,
14796
14800
  header,
@@ -14816,11 +14820,11 @@ function BattleBoard({
14816
14820
  className
14817
14821
  }) {
14818
14822
  const board = boardEntity(entity) ?? {};
14819
- const tiles = Array.isArray(board.tiles) ? board.tiles : [];
14820
- const features = Array.isArray(board.features) ? board.features : [];
14823
+ const tiles = propTiles ?? (Array.isArray(board.tiles) ? board.tiles : []);
14824
+ const features = propFeatures ?? (Array.isArray(board.features) ? board.features : []);
14821
14825
  const boardWidth = num(board.boardWidth, 8);
14822
14826
  const boardHeight = num(board.boardHeight, 6);
14823
- const assetManifest = board.assetManifest;
14827
+ const assetManifest = propAssetManifest ?? board.assetManifest;
14824
14828
  const backgroundImage = board.backgroundImage;
14825
14829
  const units = rows(board.units);
14826
14830
  const selectedUnitId = board.selectedUnitId ?? null;
@@ -14912,7 +14916,7 @@ function BattleBoard({
14912
14916
  }, 16);
14913
14917
  return () => clearInterval(interval);
14914
14918
  }, []);
14915
- const isoUnits = useMemo(() => {
14919
+ const derivedIsoUnits = useMemo(() => {
14916
14920
  return units.filter((u) => unitHealth(u) > 0).map((unit) => {
14917
14921
  const id = str(unit.id);
14918
14922
  const pos = movingPositions.get(id) ?? unitPosition(unit);
@@ -14936,6 +14940,7 @@ function BattleBoard({
14936
14940
  };
14937
14941
  });
14938
14942
  }, [units, movingPositions]);
14943
+ const isoUnits = propUnits ?? derivedIsoUnits;
14939
14944
  const maxY = Math.max(...tiles.map((t2) => t2.y), 0);
14940
14945
  const baseOffsetX = (maxY + 1) * (TILE_WIDTH * scale / 2);
14941
14946
  const tileToScreen = useCallback(
@@ -15157,14 +15162,22 @@ function BattleTemplate({
15157
15162
  entity,
15158
15163
  scale = 0.45,
15159
15164
  unitScale = 1,
15165
+ tiles,
15166
+ units,
15167
+ features,
15168
+ assetManifest,
15160
15169
  className
15161
15170
  }) {
15162
15171
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
15163
- if (!resolved) return null;
15172
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
15164
15173
  return /* @__PURE__ */ jsx(
15165
15174
  BattleBoard,
15166
15175
  {
15167
15176
  entity: resolved,
15177
+ tiles,
15178
+ units,
15179
+ features,
15180
+ assetManifest,
15168
15181
  scale,
15169
15182
  unitScale,
15170
15183
  tileClickEvent: "TILE_CLICK",
@@ -21310,16 +21323,21 @@ function EmojiEffect({
21310
21323
  }
21311
21324
  );
21312
21325
  }
21313
- function CanvasEffect(props) {
21326
+ function CanvasEffect({
21327
+ effectSpriteUrl = "https://almadar-kflow-assets.web.app/shared/effects/gas/gas00.png",
21328
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/effects/",
21329
+ ...props
21330
+ }) {
21314
21331
  const eventBus = useEventBus();
21315
- const { completeEvent, onComplete, ...rest } = props;
21332
+ const mergedProps = { effectSpriteUrl, assetBaseUrl, ...props };
21333
+ const { completeEvent, onComplete, ...rest } = mergedProps;
21316
21334
  const handleComplete = useCallback(() => {
21317
21335
  if (completeEvent) eventBus.emit(`UI:${completeEvent}`, {});
21318
21336
  onComplete?.();
21319
21337
  }, [completeEvent, eventBus, onComplete]);
21320
21338
  const enhancedProps = { ...rest, onComplete: handleComplete };
21321
- if (props.assetManifest) {
21322
- return /* @__PURE__ */ jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: props.assetManifest });
21339
+ if (rest.assetManifest) {
21340
+ return /* @__PURE__ */ jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: rest.assetManifest });
21323
21341
  }
21324
21342
  return /* @__PURE__ */ jsx(EmojiEffect, { ...enhancedProps });
21325
21343
  }
@@ -22104,6 +22122,10 @@ var init_CaseStudyOrganism = __esm({
22104
22122
  });
22105
22123
  function CastleBoard({
22106
22124
  entity,
22125
+ tiles: propTiles,
22126
+ units: propUnits,
22127
+ features: propFeatures,
22128
+ assetManifest: propAssetManifest,
22107
22129
  scale = 0.45,
22108
22130
  header,
22109
22131
  sidePanel,
@@ -22119,10 +22141,10 @@ function CastleBoard({
22119
22141
  }) {
22120
22142
  const eventBus = useEventBus();
22121
22143
  const resolved = boardEntity(entity);
22122
- const tiles = Array.isArray(resolved?.tiles) ? resolved.tiles : [];
22123
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
22124
- const units = Array.isArray(resolved?.units) ? resolved.units : [];
22125
- const assetManifest = resolved?.assetManifest;
22144
+ const tiles = propTiles ?? (Array.isArray(resolved?.tiles) ? resolved.tiles : []);
22145
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
22146
+ const units = propUnits ?? (Array.isArray(resolved?.units) ? resolved.units : []);
22147
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
22126
22148
  const backgroundImage = resolved?.backgroundImage;
22127
22149
  const [hoveredTile, setHoveredTile] = useState(null);
22128
22150
  const [selectedFeature, setSelectedFeature] = useState(null);
@@ -22225,14 +22247,22 @@ var init_CastleBoard = __esm({
22225
22247
  function CastleTemplate({
22226
22248
  entity,
22227
22249
  scale = 0.45,
22250
+ tiles,
22251
+ units,
22252
+ features,
22253
+ assetManifest,
22228
22254
  className
22229
22255
  }) {
22230
22256
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
22231
- if (!resolved) return null;
22257
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
22232
22258
  return /* @__PURE__ */ jsx(
22233
22259
  CastleBoard,
22234
22260
  {
22235
22261
  entity: resolved,
22262
+ tiles,
22263
+ units,
22264
+ features,
22265
+ assetManifest,
22236
22266
  scale,
22237
22267
  featureClickEvent: "FEATURE_CLICK",
22238
22268
  unitClickEvent: "UNIT_CLICK",
@@ -28865,8 +28895,8 @@ function GameCanvas2D({
28865
28895
  tickEvent,
28866
28896
  drawEvent,
28867
28897
  fps = 60,
28868
- backgroundImage,
28869
- assetBaseUrl = "",
28898
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/resonators.jpeg",
28899
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
28870
28900
  className
28871
28901
  }) {
28872
28902
  const canvasRef = React88.useRef(null);
@@ -28930,6 +28960,9 @@ function GameCanvas2D({
28930
28960
  const bgImg = loadImage(backgroundImageRef.current);
28931
28961
  if (bgImg) {
28932
28962
  ctx.drawImage(bgImg, 0, 0, widthRef.current, heightRef.current);
28963
+ } else {
28964
+ ctx.fillStyle = "#0f1420";
28965
+ ctx.fillRect(0, 0, widthRef.current, heightRef.current);
28933
28966
  }
28934
28967
  }
28935
28968
  onDrawRef.current?.(ctx, frame);
@@ -30074,10 +30107,10 @@ function PlatformerCanvas({
30074
30107
  canvasHeight = 400,
30075
30108
  followCamera = true,
30076
30109
  bgColor,
30077
- playerSprite,
30110
+ playerSprite = "https://almadar-kflow-assets.web.app/shared/platformer/characters/platformChar_idle.png",
30078
30111
  tileSprites,
30079
- backgroundImage,
30080
- assetBaseUrl = "",
30112
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
30113
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/platformer/",
30081
30114
  leftEvent = "MOVE_LEFT",
30082
30115
  rightEvent = "MOVE_RIGHT",
30083
30116
  jumpEvent = "JUMP",
@@ -47895,7 +47928,14 @@ var init_useBattleState = __esm({
47895
47928
  init_boardEntity();
47896
47929
  }
47897
47930
  });
47898
- function UncontrolledBattleBoard({ entity, ...rest }) {
47931
+ function UncontrolledBattleBoard({
47932
+ entity,
47933
+ tiles,
47934
+ units,
47935
+ features,
47936
+ assetManifest,
47937
+ ...rest
47938
+ }) {
47899
47939
  const resolved = boardEntity(entity);
47900
47940
  const battleState = useBattleState(
47901
47941
  rows(resolved?.initialUnits),
@@ -47915,19 +47955,23 @@ function UncontrolledBattleBoard({ entity, ...rest }) {
47915
47955
  calculateDamage: rest.calculateDamage
47916
47956
  }
47917
47957
  );
47918
- if (!resolved) return null;
47958
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
47919
47959
  return /* @__PURE__ */ jsx(
47920
47960
  BattleBoard,
47921
47961
  {
47922
47962
  ...rest,
47923
- entity: {
47963
+ tiles,
47964
+ units,
47965
+ features,
47966
+ assetManifest,
47967
+ entity: resolved ? {
47924
47968
  ...resolved,
47925
47969
  units: battleState.units,
47926
47970
  phase: battleState.phase,
47927
47971
  turn: battleState.turn,
47928
47972
  gameResult: battleState.gameResult,
47929
47973
  selectedUnitId: battleState.selectedUnitId
47930
- }
47974
+ } : void 0
47931
47975
  }
47932
47976
  );
47933
47977
  }
@@ -47956,6 +48000,10 @@ function defaultIsInRange(from, to, range) {
47956
48000
  }
47957
48001
  function WorldMapBoard({
47958
48002
  entity,
48003
+ tiles: propTiles,
48004
+ units: propUnits,
48005
+ features: propFeatures,
48006
+ assetManifest: propAssetManifest,
47959
48007
  isLoading,
47960
48008
  scale = 0.4,
47961
48009
  unitScale = 2.5,
@@ -47984,16 +48032,16 @@ function WorldMapBoard({
47984
48032
  const resolved = boardEntity(entity);
47985
48033
  const hexes = rows(resolved?.hexes);
47986
48034
  const heroes = rows(resolved?.heroes);
47987
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
48035
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
47988
48036
  const selectedHeroId = resolved?.selectedHeroId ?? null;
47989
- const assetManifest = resolved?.assetManifest;
48037
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
47990
48038
  const backgroundImage = resolved?.backgroundImage;
47991
48039
  const [hoveredTile, setHoveredTile] = useState(null);
47992
48040
  const selectedHero = useMemo(
47993
48041
  () => heroes.find((h) => str(h.id) === selectedHeroId) ?? null,
47994
48042
  [heroes, selectedHeroId]
47995
48043
  );
47996
- const tiles = useMemo(
48044
+ const derivedTiles = useMemo(
47997
48045
  () => hexes.map((hex) => ({
47998
48046
  x: num(hex.x),
47999
48047
  y: num(hex.y),
@@ -48002,8 +48050,9 @@ function WorldMapBoard({
48002
48050
  })),
48003
48051
  [hexes]
48004
48052
  );
48053
+ const tiles = propTiles ?? derivedTiles;
48005
48054
  const baseUnits = useMemo(
48006
- () => heroes.map((hero) => ({
48055
+ () => propUnits ?? heroes.map((hero) => ({
48007
48056
  id: str(hero.id),
48008
48057
  position: heroPosition(hero),
48009
48058
  name: str(hero.name),
@@ -48012,7 +48061,7 @@ function WorldMapBoard({
48012
48061
  maxHealth: 100,
48013
48062
  sprite: hero.sprite == null ? void 0 : str(hero.sprite)
48014
48063
  })),
48015
- [heroes]
48064
+ [heroes, propUnits]
48016
48065
  );
48017
48066
  const MOVE_SPEED_MS_PER_TILE = 300;
48018
48067
  const movementAnimRef = useRef(null);
@@ -48222,12 +48271,20 @@ function WorldMapTemplate({
48222
48271
  unitScale = 2.5,
48223
48272
  diamondTopY,
48224
48273
  allowMoveAllHeroes = false,
48274
+ tiles,
48275
+ units,
48276
+ features,
48277
+ assetManifest,
48225
48278
  className
48226
48279
  }) {
48227
48280
  return /* @__PURE__ */ jsx(
48228
48281
  WorldMapBoard,
48229
48282
  {
48230
48283
  entity,
48284
+ tiles,
48285
+ units,
48286
+ features,
48287
+ assetManifest,
48231
48288
  scale,
48232
48289
  unitScale,
48233
48290
  diamondTopY,
@@ -49445,6 +49502,24 @@ function renderPatternProps(props, onDismiss) {
49445
49502
  priority: 0
49446
49503
  };
49447
49504
  rendered[key] = /* @__PURE__ */ jsx(SlotContentRenderer, { content: childContent, onDismiss });
49505
+ } else if (Array.isArray(value)) {
49506
+ rendered[key] = value.map((item, i) => {
49507
+ const el = item;
49508
+ if (isPatternConfig(el)) {
49509
+ const nestedProps = {};
49510
+ for (const [k, v] of Object.entries(el)) {
49511
+ if (k !== "type") nestedProps[k] = v;
49512
+ }
49513
+ const childContent = {
49514
+ id: `prop-${key}-${i}`,
49515
+ pattern: el.type,
49516
+ props: nestedProps,
49517
+ priority: 0
49518
+ };
49519
+ return /* @__PURE__ */ jsx(SlotContentRenderer, { content: childContent, onDismiss }, i);
49520
+ }
49521
+ return substituteTraitRefsDeep(el, `prop:${key}[${i}]`);
49522
+ });
49448
49523
  } else {
49449
49524
  rendered[key] = substituteTraitRefsDeep(value, `prop:${key}`);
49450
49525
  }