@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.
@@ -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(
@@ -11418,14 +11423,22 @@ function BattleTemplate({
11418
11423
  entity,
11419
11424
  scale = 0.45,
11420
11425
  unitScale = 1,
11426
+ tiles,
11427
+ units,
11428
+ features,
11429
+ assetManifest,
11421
11430
  className
11422
11431
  }) {
11423
11432
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
11424
- if (!resolved) return null;
11433
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
11425
11434
  return /* @__PURE__ */ jsx(
11426
11435
  BattleBoard,
11427
11436
  {
11428
11437
  entity: resolved,
11438
+ tiles,
11439
+ units,
11440
+ features,
11441
+ assetManifest,
11429
11442
  scale,
11430
11443
  unitScale,
11431
11444
  tileClickEvent: "TILE_CLICK",
@@ -18400,16 +18413,21 @@ function EmojiEffect({
18400
18413
  }
18401
18414
  );
18402
18415
  }
18403
- function CanvasEffect(props) {
18416
+ function CanvasEffect({
18417
+ effectSpriteUrl = "https://almadar-kflow-assets.web.app/shared/effects/gas/gas00.png",
18418
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/effects/",
18419
+ ...props
18420
+ }) {
18404
18421
  const eventBus = useEventBus();
18405
- const { completeEvent, onComplete, ...rest } = props;
18422
+ const mergedProps = { effectSpriteUrl, assetBaseUrl, ...props };
18423
+ const { completeEvent, onComplete, ...rest } = mergedProps;
18406
18424
  const handleComplete = useCallback(() => {
18407
18425
  if (completeEvent) eventBus.emit(`UI:${completeEvent}`, {});
18408
18426
  onComplete?.();
18409
18427
  }, [completeEvent, eventBus, onComplete]);
18410
18428
  const enhancedProps = { ...rest, onComplete: handleComplete };
18411
- if (props.assetManifest) {
18412
- return /* @__PURE__ */ jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: props.assetManifest });
18429
+ if (rest.assetManifest) {
18430
+ return /* @__PURE__ */ jsx(CanvasEffectEngine, { ...enhancedProps, assetManifest: rest.assetManifest });
18413
18431
  }
18414
18432
  return /* @__PURE__ */ jsx(EmojiEffect, { ...enhancedProps });
18415
18433
  }
@@ -19194,6 +19212,10 @@ var init_CaseStudyOrganism = __esm({
19194
19212
  });
19195
19213
  function CastleBoard({
19196
19214
  entity,
19215
+ tiles: propTiles,
19216
+ units: propUnits,
19217
+ features: propFeatures,
19218
+ assetManifest: propAssetManifest,
19197
19219
  scale = 0.45,
19198
19220
  header,
19199
19221
  sidePanel,
@@ -19209,10 +19231,10 @@ function CastleBoard({
19209
19231
  }) {
19210
19232
  const eventBus = useEventBus();
19211
19233
  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;
19234
+ const tiles = propTiles ?? (Array.isArray(resolved?.tiles) ? resolved.tiles : []);
19235
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
19236
+ const units = propUnits ?? (Array.isArray(resolved?.units) ? resolved.units : []);
19237
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
19216
19238
  const backgroundImage = resolved?.backgroundImage;
19217
19239
  const [hoveredTile, setHoveredTile] = useState(null);
19218
19240
  const [selectedFeature, setSelectedFeature] = useState(null);
@@ -19315,14 +19337,22 @@ var init_CastleBoard = __esm({
19315
19337
  function CastleTemplate({
19316
19338
  entity,
19317
19339
  scale = 0.45,
19340
+ tiles,
19341
+ units,
19342
+ features,
19343
+ assetManifest,
19318
19344
  className
19319
19345
  }) {
19320
19346
  const resolved = entity && typeof entity === "object" && !Array.isArray(entity) ? entity : void 0;
19321
- if (!resolved) return null;
19347
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
19322
19348
  return /* @__PURE__ */ jsx(
19323
19349
  CastleBoard,
19324
19350
  {
19325
19351
  entity: resolved,
19352
+ tiles,
19353
+ units,
19354
+ features,
19355
+ assetManifest,
19326
19356
  scale,
19327
19357
  featureClickEvent: "FEATURE_CLICK",
19328
19358
  unitClickEvent: "UNIT_CLICK",
@@ -25955,8 +25985,8 @@ function GameCanvas2D({
25955
25985
  tickEvent,
25956
25986
  drawEvent,
25957
25987
  fps = 60,
25958
- backgroundImage,
25959
- assetBaseUrl = "",
25988
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/resonators.jpeg",
25989
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/",
25960
25990
  className
25961
25991
  }) {
25962
25992
  const canvasRef = React79.useRef(null);
@@ -26020,6 +26050,9 @@ function GameCanvas2D({
26020
26050
  const bgImg = loadImage(backgroundImageRef.current);
26021
26051
  if (bgImg) {
26022
26052
  ctx.drawImage(bgImg, 0, 0, widthRef.current, heightRef.current);
26053
+ } else {
26054
+ ctx.fillStyle = "#0f1420";
26055
+ ctx.fillRect(0, 0, widthRef.current, heightRef.current);
26023
26056
  }
26024
26057
  }
26025
26058
  onDrawRef.current?.(ctx, frame);
@@ -27164,10 +27197,10 @@ function PlatformerCanvas({
27164
27197
  canvasHeight = 400,
27165
27198
  followCamera = true,
27166
27199
  bgColor,
27167
- playerSprite,
27200
+ playerSprite = "https://almadar-kflow-assets.web.app/shared/platformer/characters/platformChar_idle.png",
27168
27201
  tileSprites,
27169
- backgroundImage,
27170
- assetBaseUrl = "",
27202
+ backgroundImage = "https://almadar-kflow-assets.web.app/shared/scenes/court.png",
27203
+ assetBaseUrl = "https://almadar-kflow-assets.web.app/shared/platformer/",
27171
27204
  leftEvent = "MOVE_LEFT",
27172
27205
  rightEvent = "MOVE_RIGHT",
27173
27206
  jumpEvent = "JUMP",
@@ -45394,7 +45427,14 @@ var init_useBattleState = __esm({
45394
45427
  init_boardEntity();
45395
45428
  }
45396
45429
  });
45397
- function UncontrolledBattleBoard({ entity, ...rest }) {
45430
+ function UncontrolledBattleBoard({
45431
+ entity,
45432
+ tiles,
45433
+ units,
45434
+ features,
45435
+ assetManifest,
45436
+ ...rest
45437
+ }) {
45398
45438
  const resolved = boardEntity(entity);
45399
45439
  const battleState = useBattleState(
45400
45440
  rows(resolved?.initialUnits),
@@ -45414,19 +45454,23 @@ function UncontrolledBattleBoard({ entity, ...rest }) {
45414
45454
  calculateDamage: rest.calculateDamage
45415
45455
  }
45416
45456
  );
45417
- if (!resolved) return null;
45457
+ if (!resolved && !tiles && !units && !features && !assetManifest) return null;
45418
45458
  return /* @__PURE__ */ jsx(
45419
45459
  BattleBoard,
45420
45460
  {
45421
45461
  ...rest,
45422
- entity: {
45462
+ tiles,
45463
+ units,
45464
+ features,
45465
+ assetManifest,
45466
+ entity: resolved ? {
45423
45467
  ...resolved,
45424
45468
  units: battleState.units,
45425
45469
  phase: battleState.phase,
45426
45470
  turn: battleState.turn,
45427
45471
  gameResult: battleState.gameResult,
45428
45472
  selectedUnitId: battleState.selectedUnitId
45429
- }
45473
+ } : void 0
45430
45474
  }
45431
45475
  );
45432
45476
  }
@@ -45455,6 +45499,10 @@ function defaultIsInRange(from, to, range) {
45455
45499
  }
45456
45500
  function WorldMapBoard({
45457
45501
  entity,
45502
+ tiles: propTiles,
45503
+ units: propUnits,
45504
+ features: propFeatures,
45505
+ assetManifest: propAssetManifest,
45458
45506
  isLoading,
45459
45507
  scale = 0.4,
45460
45508
  unitScale = 2.5,
@@ -45483,16 +45531,16 @@ function WorldMapBoard({
45483
45531
  const resolved = boardEntity(entity);
45484
45532
  const hexes = rows(resolved?.hexes);
45485
45533
  const heroes = rows(resolved?.heroes);
45486
- const features = Array.isArray(resolved?.features) ? resolved.features : [];
45534
+ const features = propFeatures ?? (Array.isArray(resolved?.features) ? resolved.features : []);
45487
45535
  const selectedHeroId = resolved?.selectedHeroId ?? null;
45488
- const assetManifest = resolved?.assetManifest;
45536
+ const assetManifest = propAssetManifest ?? resolved?.assetManifest;
45489
45537
  const backgroundImage = resolved?.backgroundImage;
45490
45538
  const [hoveredTile, setHoveredTile] = useState(null);
45491
45539
  const selectedHero = useMemo(
45492
45540
  () => heroes.find((h) => str(h.id) === selectedHeroId) ?? null,
45493
45541
  [heroes, selectedHeroId]
45494
45542
  );
45495
- const tiles = useMemo(
45543
+ const derivedTiles = useMemo(
45496
45544
  () => hexes.map((hex) => ({
45497
45545
  x: num(hex.x),
45498
45546
  y: num(hex.y),
@@ -45501,8 +45549,9 @@ function WorldMapBoard({
45501
45549
  })),
45502
45550
  [hexes]
45503
45551
  );
45552
+ const tiles = propTiles ?? derivedTiles;
45504
45553
  const baseUnits = useMemo(
45505
- () => heroes.map((hero) => ({
45554
+ () => propUnits ?? heroes.map((hero) => ({
45506
45555
  id: str(hero.id),
45507
45556
  position: heroPosition(hero),
45508
45557
  name: str(hero.name),
@@ -45511,7 +45560,7 @@ function WorldMapBoard({
45511
45560
  maxHealth: 100,
45512
45561
  sprite: hero.sprite == null ? void 0 : str(hero.sprite)
45513
45562
  })),
45514
- [heroes]
45563
+ [heroes, propUnits]
45515
45564
  );
45516
45565
  const MOVE_SPEED_MS_PER_TILE = 300;
45517
45566
  const movementAnimRef = useRef(null);
@@ -45721,12 +45770,20 @@ function WorldMapTemplate({
45721
45770
  unitScale = 2.5,
45722
45771
  diamondTopY,
45723
45772
  allowMoveAllHeroes = false,
45773
+ tiles,
45774
+ units,
45775
+ features,
45776
+ assetManifest,
45724
45777
  className
45725
45778
  }) {
45726
45779
  return /* @__PURE__ */ jsx(
45727
45780
  WorldMapBoard,
45728
45781
  {
45729
45782
  entity,
45783
+ tiles,
45784
+ units,
45785
+ features,
45786
+ assetManifest,
45730
45787
  scale,
45731
45788
  unitScale,
45732
45789
  diamondTopY,
@@ -46944,6 +47001,24 @@ function renderPatternProps(props, onDismiss) {
46944
47001
  priority: 0
46945
47002
  };
46946
47003
  rendered[key] = /* @__PURE__ */ jsx(SlotContentRenderer, { content: childContent, onDismiss });
47004
+ } else if (Array.isArray(value)) {
47005
+ rendered[key] = value.map((item, i) => {
47006
+ const el = item;
47007
+ if (isPatternConfig(el)) {
47008
+ const nestedProps = {};
47009
+ for (const [k, v] of Object.entries(el)) {
47010
+ if (k !== "type") nestedProps[k] = v;
47011
+ }
47012
+ const childContent = {
47013
+ id: `prop-${key}-${i}`,
47014
+ pattern: el.type,
47015
+ props: nestedProps,
47016
+ priority: 0
47017
+ };
47018
+ return /* @__PURE__ */ jsx(SlotContentRenderer, { content: childContent, onDismiss }, i);
47019
+ }
47020
+ return substituteTraitRefsDeep(el, `prop:${key}[${i}]`);
47021
+ });
46947
47022
  } else {
46948
47023
  rendered[key] = substituteTraitRefsDeep(value, `prop:${key}`);
46949
47024
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "5.28.2",
3
+ "version": "5.28.4",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [