@almadar/ui 5.61.0 → 5.63.1

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 (61) hide show
  1. package/dist/avl/index.cjs +3599 -1810
  2. package/dist/avl/index.js +2431 -642
  3. package/dist/components/core/atoms/Box.d.ts +2 -0
  4. package/dist/components/core/molecules/CalendarGrid.d.ts +9 -1
  5. package/dist/components/core/molecules/GraphCanvas.d.ts +4 -0
  6. package/dist/components/core/molecules/PositionedCanvas.d.ts +14 -1
  7. package/dist/components/core/molecules/ReplyTree.d.ts +13 -1
  8. package/dist/components/core/templates/index.d.ts +4 -0
  9. package/dist/components/game/molecules/CardHand.d.ts +35 -0
  10. package/dist/components/game/molecules/DialogueBox.d.ts +8 -2
  11. package/dist/components/game/molecules/index.d.ts +1 -0
  12. package/dist/components/game/molecules/three/index.cjs +283 -115
  13. package/dist/components/game/molecules/three/index.js +283 -115
  14. package/dist/components/game/organisms/CardBattlerBoard.d.ts +46 -0
  15. package/dist/components/game/organisms/CityBuilderBoard.d.ts +63 -0
  16. package/dist/components/game/organisms/TopDownShooterBoard.d.ts +64 -0
  17. package/dist/components/game/organisms/TowerDefenseBoard.d.ts +10 -1
  18. package/dist/components/game/organisms/TraitSlot.d.ts +1 -3
  19. package/dist/components/game/organisms/VisualNovelBoard.d.ts +53 -0
  20. package/dist/components/game/organisms/hooks/useCamera.d.ts +16 -0
  21. package/dist/components/game/organisms/index.d.ts +4 -0
  22. package/dist/components/game/templates/CardBattlerTemplate.d.ts +35 -0
  23. package/dist/components/game/templates/CityBuilderTemplate.d.ts +40 -0
  24. package/dist/components/game/templates/GameCanvas3DBattleTemplate.d.ts +5 -2
  25. package/dist/components/game/templates/GameCanvas3DCastleTemplate.d.ts +5 -2
  26. package/dist/components/game/templates/GameCanvas3DWorldMapTemplate.d.ts +5 -2
  27. package/dist/components/game/templates/TopDownShooterTemplate.d.ts +42 -0
  28. package/dist/components/game/templates/VisualNovelTemplate.d.ts +28 -0
  29. package/dist/components/game/templates/game3dAssetManifest.d.ts +50 -0
  30. package/dist/components/game/templates/index.d.ts +4 -0
  31. package/dist/components/index.cjs +3465 -1659
  32. package/dist/components/index.js +2444 -647
  33. package/dist/components/marketing/organisms/CaseStudyOrganism.d.ts +10 -1
  34. package/dist/components/marketing/organisms/FeatureGridOrganism.d.ts +10 -1
  35. package/dist/components/marketing/organisms/HeroOrganism.d.ts +24 -1
  36. package/dist/components/marketing/organisms/PricingOrganism.d.ts +14 -1
  37. package/dist/components/marketing/organisms/ShowcaseOrganism.d.ts +14 -1
  38. package/dist/components/marketing/organisms/StatsOrganism.d.ts +6 -1
  39. package/dist/components/marketing/organisms/StepFlowOrganism.d.ts +9 -1
  40. package/dist/components/marketing/organisms/TeamOrganism.d.ts +10 -1
  41. package/dist/docs/index.cjs +169 -1
  42. package/dist/docs/index.d.cts +2 -0
  43. package/dist/docs/index.js +169 -1
  44. package/dist/hooks/index.cjs +253 -1
  45. package/dist/hooks/index.d.ts +2 -0
  46. package/dist/hooks/index.js +252 -2
  47. package/dist/hooks/useCanvasGestures.d.ts +44 -0
  48. package/dist/hooks/useTapReveal.d.ts +32 -0
  49. package/dist/locales/index.cjs +315 -3
  50. package/dist/locales/index.js +315 -3
  51. package/dist/marketing/index.cjs +59 -0
  52. package/dist/marketing/index.d.cts +2 -0
  53. package/dist/marketing/index.js +59 -0
  54. package/dist/providers/index.cjs +3408 -1619
  55. package/dist/providers/index.js +2407 -618
  56. package/dist/runtime/index.cjs +3464 -1675
  57. package/dist/runtime/index.js +2411 -622
  58. package/locales/ar.json +105 -1
  59. package/locales/en.json +105 -1
  60. package/locales/sl.json +105 -1
  61. package/package.json +2 -2
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+ import type { AssetUrl, EventEmit, EntityRow } from '@almadar/core';
3
+ import type { DisplayStateProps } from '../../core/organisms/types';
4
+ /** Manifest of asset base-url + per-kind sprite maps (UI value DTO). */
5
+ type CityBuilderAssetManifest = {
6
+ baseUrl?: AssetUrl;
7
+ terrains?: Record<string, AssetUrl>;
8
+ units?: Record<string, AssetUrl>;
9
+ features?: Record<string, AssetUrl>;
10
+ };
11
+ export interface CityBuilderTile {
12
+ x: number;
13
+ y: number;
14
+ terrain?: string;
15
+ terrainSprite?: AssetUrl;
16
+ passable?: boolean;
17
+ }
18
+ export interface CityBuilderBuilding {
19
+ id: string;
20
+ x: number;
21
+ y: number;
22
+ type: string;
23
+ }
24
+ /** A placeable building type shown in the build palette (UI value DTO). */
25
+ export interface CityBuilderBuildType {
26
+ type: string;
27
+ label: string;
28
+ cost: number;
29
+ }
30
+ export interface CityBuilderBoardProps extends DisplayStateProps {
31
+ entity?: EntityRow | readonly EntityRow[];
32
+ tiles?: CityBuilderTile[];
33
+ buildings?: CityBuilderBuilding[];
34
+ /** Asset base-url + terrain/unit/feature sprite maps (organism owns asset choice). */
35
+ assetManifest?: CityBuilderAssetManifest;
36
+ buildTypes?: CityBuilderBuildType[];
37
+ pendingBuildType?: string;
38
+ gold?: number;
39
+ wood?: number;
40
+ population?: number;
41
+ tick?: number;
42
+ result?: 'none' | 'won' | 'lost';
43
+ scale?: number;
44
+ unitScale?: number;
45
+ spriteHeightRatio?: number;
46
+ spriteMaxWidthRatio?: number;
47
+ selectBuildTypeEvent?: EventEmit<{
48
+ buildType: string;
49
+ }>;
50
+ placeBuildingEvent?: EventEmit<{
51
+ x: number;
52
+ y: number;
53
+ }>;
54
+ gameEndEvent?: EventEmit<{
55
+ result: 'won' | 'lost';
56
+ }>;
57
+ className?: string;
58
+ }
59
+ export declare function CityBuilderBoard({ entity, tiles: propTiles, buildings: propBuildings, assetManifest: propAssetManifest, buildTypes: propBuildTypes, pendingBuildType: propPendingBuildType, gold: propGold, wood: propWood, population: propPopulation, result: propResult, scale, unitScale, spriteHeightRatio, spriteMaxWidthRatio, selectBuildTypeEvent, placeBuildingEvent, gameEndEvent, className, }: CityBuilderBoardProps): React.JSX.Element;
60
+ export declare namespace CityBuilderBoard {
61
+ var displayName: string;
62
+ }
63
+ export default CityBuilderBoard;
@@ -0,0 +1,64 @@
1
+ import * as React from 'react';
2
+ import type { AssetUrl, EventEmit, EntityRow } from '@almadar/core';
3
+ /** Asset base-url + per-kind sprite maps (organism owns asset choice; UI value DTO). */
4
+ type ShooterAssetManifest = {
5
+ baseUrl?: AssetUrl;
6
+ units?: Record<string, AssetUrl>;
7
+ features?: Record<string, AssetUrl>;
8
+ background?: AssetUrl;
9
+ };
10
+ export interface ShooterPlayer {
11
+ x: number;
12
+ y: number;
13
+ }
14
+ export interface ShooterEnemy {
15
+ id: string;
16
+ x: number;
17
+ y: number;
18
+ hp: number;
19
+ }
20
+ export interface ShooterProjectile {
21
+ id: string;
22
+ x: number;
23
+ y: number;
24
+ vx: number;
25
+ vy: number;
26
+ }
27
+ export interface TopDownShooterBoardProps {
28
+ /** Entity carrying all board state (player, enemies, projectiles, score, wave, lives, result). */
29
+ entity?: EntityRow | readonly EntityRow[];
30
+ /** Direct state — each takes priority over its entity-derived value. */
31
+ player?: ShooterPlayer;
32
+ enemies?: ShooterEnemy[];
33
+ projectiles?: ShooterProjectile[];
34
+ score?: number;
35
+ wave?: number;
36
+ lives?: number;
37
+ result?: 'none' | 'won' | 'lost';
38
+ /** Asset base-url + unit/feature sprite maps + background. */
39
+ assetManifest?: ShooterAssetManifest;
40
+ /** Canvas / arena dimensions in pixels. */
41
+ width?: number;
42
+ height?: number;
43
+ /** Pixel draw-size of sprites. */
44
+ spriteSize?: number;
45
+ /** Closed-circuit event emits (UI:{event}). */
46
+ moveEvent?: EventEmit<{
47
+ dx: number;
48
+ dy: number;
49
+ }>;
50
+ fireEvent?: EventEmit<{
51
+ tx: number;
52
+ ty: number;
53
+ }>;
54
+ playAgainEvent?: EventEmit<Record<string, never>>;
55
+ gameEndEvent?: EventEmit<{
56
+ result: 'won' | 'lost';
57
+ }>;
58
+ className?: string;
59
+ }
60
+ export declare function TopDownShooterBoard({ entity, player: propPlayer, enemies: propEnemies, projectiles: propProjectiles, score: propScore, wave: propWave, lives: propLives, result: propResult, assetManifest: propAssetManifest, width, height, spriteSize, moveEvent, fireEvent, playAgainEvent, gameEndEvent, className, }: TopDownShooterBoardProps): React.JSX.Element;
61
+ export declare namespace TopDownShooterBoard {
62
+ var displayName: string;
63
+ }
64
+ export default TopDownShooterBoard;
@@ -1,6 +1,13 @@
1
1
  import React from 'react';
2
2
  import type { AssetUrl, EventEmit, EntityRow } from '@almadar/core';
3
3
  import type { DisplayStateProps } from '../../core/organisms/types';
4
+ /** Manifest of asset base-url + per-kind sprite maps (UI value DTO). */
5
+ type TowerDefenseAssetManifest = {
6
+ baseUrl?: AssetUrl;
7
+ terrains?: Record<string, AssetUrl>;
8
+ units?: Record<string, AssetUrl>;
9
+ features?: Record<string, AssetUrl>;
10
+ };
4
11
  export interface TowerDefenseTile {
5
12
  x: number;
6
13
  y: number;
@@ -41,6 +48,8 @@ export interface TowerDefenseBoardProps extends DisplayStateProps {
41
48
  path?: TowerDefensePathPoint[];
42
49
  towers?: TowerDefenseTower[];
43
50
  creeps?: TowerDefenseCreep[];
51
+ /** Asset base-url + terrain/unit/feature sprite maps (organism owns asset choice). */
52
+ assetManifest?: TowerDefenseAssetManifest;
44
53
  gold?: number;
45
54
  lives?: number;
46
55
  wave?: number;
@@ -70,7 +79,7 @@ export interface TowerDefenseBoardProps extends DisplayStateProps {
70
79
  }>;
71
80
  className?: string;
72
81
  }
73
- export declare function TowerDefenseBoard({ entity, tiles: propTiles, path: propPath, towers: propTowers, creeps: propCreeps, hero: propHero, gold: propGold, lives: propLives, wave: propWave, maxWaves: propMaxWaves, result: propResult, waveActive: propWaveActive, towerCost, scale, unitScale, spriteHeightRatio, spriteMaxWidthRatio, placeTowerEvent, startWaveEvent, playAgainEvent, gameEndEvent, moveHeroEvent, className, }: TowerDefenseBoardProps): React.JSX.Element;
82
+ export declare function TowerDefenseBoard({ entity, tiles: propTiles, path: propPath, towers: propTowers, creeps: propCreeps, assetManifest: propAssetManifest, hero: propHero, gold: propGold, lives: propLives, wave: propWave, maxWaves: propMaxWaves, result: propResult, waveActive: propWaveActive, towerCost, scale, unitScale, spriteHeightRatio, spriteMaxWidthRatio, placeTowerEvent, startWaveEvent, playAgainEvent, gameEndEvent, moveHeroEvent, className, }: TowerDefenseBoardProps): React.JSX.Element;
74
83
  export declare namespace TowerDefenseBoard {
75
84
  var displayName: string;
76
85
  }
@@ -29,9 +29,7 @@ export type SlotItemData = {
29
29
  description?: string;
30
30
  /** Emoji or text icon */
31
31
  iconEmoji?: string;
32
- /** Image URL icon (takes precedence over iconEmoji)
33
- * @default https://almadar-kflow-assets.web.app/shared/platformer/items/platformPack_item001.png
34
- */
32
+ /** Image URL icon (takes precedence over iconEmoji); falls back to iconEmoji when absent. */
35
33
  iconUrl?: AssetUrl;
36
34
  /** Optional state machine for tooltip display */
37
35
  stateMachine?: TraitStateMachineDefinition;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * VisualNovelBoard
3
+ *
4
+ * Dialogue-scene game board: walks a dialogue graph node-by-node, rendering each
5
+ * node's scene background + character portrait + speaker text + branching choices.
6
+ * Composes the extended `DialogueBox` molecule; resolves every asset key against
7
+ * the `assetManifest` prop (organism owns asset choice — no hardcoded URLs).
8
+ */
9
+ import React from 'react';
10
+ import type { AssetUrl, EventEmit, EntityRow } from '@almadar/core';
11
+ import type { DisplayStateProps } from '../../core/organisms/types';
12
+ /** Manifest of asset base-url + per-key scene + portrait maps (UI value DTO). */
13
+ type VisualNovelAssetManifest = {
14
+ baseUrl?: AssetUrl;
15
+ backgrounds?: Record<string, AssetUrl>;
16
+ portraits?: Record<string, AssetUrl>;
17
+ };
18
+ export interface VisualNovelChoice {
19
+ label: string;
20
+ nextId: string;
21
+ }
22
+ export interface VisualNovelNode {
23
+ id: string;
24
+ speaker: string;
25
+ text: string;
26
+ backgroundKey?: string;
27
+ portraitKey?: string;
28
+ choices?: VisualNovelChoice[];
29
+ }
30
+ export interface VisualNovelBoardProps extends DisplayStateProps {
31
+ entity?: EntityRow | readonly EntityRow[];
32
+ /** Full dialogue graph. */
33
+ nodes?: VisualNovelNode[];
34
+ /** Id of the node currently displayed. */
35
+ currentNodeId?: string;
36
+ /** Asset base-url + scene/portrait sprite maps (organism owns asset choice). */
37
+ assetManifest?: VisualNovelAssetManifest;
38
+ /** Typewriter speed in ms per character (0 = instant). */
39
+ typewriterSpeed?: number;
40
+ /** Portrait draw-size multiplier. */
41
+ portraitScale?: number;
42
+ chooseEvent?: EventEmit<{
43
+ choiceIndex: number;
44
+ }>;
45
+ advanceEvent?: EventEmit<Record<string, never>>;
46
+ restartEvent?: EventEmit<Record<string, never>>;
47
+ className?: string;
48
+ }
49
+ export declare function VisualNovelBoard({ entity, nodes: propNodes, currentNodeId: propCurrentNodeId, assetManifest: propAssetManifest, typewriterSpeed, portraitScale, chooseEvent, advanceEvent, restartEvent, className, }: VisualNovelBoardProps): React.JSX.Element;
50
+ export declare namespace VisualNovelBoard {
51
+ var displayName: string;
52
+ }
53
+ export default VisualNovelBoard;
@@ -21,6 +21,22 @@ interface CameraResult {
21
21
  handleMouseLeave: () => void;
22
22
  /** Wheel handler — zoom in/out */
23
23
  handleWheel: (e: React.WheelEvent, drawFn?: () => void) => void;
24
+ /** Pointer down — starts panning (mouse/touch/pen via Pointer Events). */
25
+ handlePointerDown: (e: React.PointerEvent) => void;
26
+ /** Pointer up — stops panning. */
27
+ handlePointerUp: () => void;
28
+ /** Pointer move — pans camera if dragging, returns true if panning. */
29
+ handlePointerMove: (e: React.PointerEvent, drawFn?: () => void) => boolean;
30
+ /** Apply a two-finger pan delta (screen px) directly to the camera. */
31
+ panBy: (dx: number, dy: number, drawFn?: () => void) => void;
32
+ /**
33
+ * Multiplicative zoom by `factor` keeping the world point under (centerX,centerY)
34
+ * — screen px relative to the canvas — fixed. Used by wheel + pinch.
35
+ */
36
+ zoomAtPoint: (factor: number, centerX: number, centerY: number, viewportSize: {
37
+ width: number;
38
+ height: number;
39
+ }, drawFn?: () => void) => void;
24
40
  /** Convert screen coordinates to world coordinates (inverse camera transform) */
25
41
  screenToWorld: (clientX: number, clientY: number, canvas: HTMLCanvasElement, viewportSize: {
26
42
  width: number;
@@ -28,7 +28,11 @@ export { CastleBoard, type CastleBoardProps, type CastleSlotContext, } from './C
28
28
  export { PlatformerBoard, type PlatformerBoardProps, } from './PlatformerBoard';
29
29
  export { TowerDefenseBoard, type TowerDefenseBoardProps, } from './TowerDefenseBoard';
30
30
  export { RoguelikeBoard, type RoguelikeBoardProps, } from './RoguelikeBoard';
31
+ export { TopDownShooterBoard, type TopDownShooterBoardProps, } from './TopDownShooterBoard';
32
+ export { CityBuilderBoard, type CityBuilderBoardProps, } from './CityBuilderBoard';
31
33
  export { GameBoard3D, type GameBoard3DProps, } from './GameBoard3D';
34
+ export { VisualNovelBoard, type VisualNovelBoardProps, type VisualNovelNode, type VisualNovelChoice, } from './VisualNovelBoard';
35
+ export { CardBattlerBoard, type CardBattlerBoardProps, type CardBattlerCard, } from './CardBattlerBoard';
32
36
  export { TraitStateViewer, type TraitStateViewerProps, type TraitStateMachineDefinition, type TraitTransition, } from './TraitStateViewer';
33
37
  export { TraitSlot, type TraitSlotProps, type SlotItemData, } from './TraitSlot';
34
38
  export { CollapsibleSection, EditorSlider, EditorSelect, EditorCheckbox, EditorTextInput, StatusBar, TerrainPalette, EditorToolbar, TERRAIN_COLORS, FEATURE_TYPES, type EditorMode, type CollapsibleSectionProps, type EditorSliderProps, type EditorSelectProps, type EditorCheckboxProps, type EditorTextInputProps, type StatusBarProps, type TerrainPaletteProps, type EditorToolbarProps, } from './editor';
@@ -0,0 +1,35 @@
1
+ /**
2
+ * CardBattlerTemplate
3
+ *
4
+ * Thin template wrapper: titled header + CardBattlerBoard.
5
+ * All game state is driven by the entity prop (passed through from the orbital trait).
6
+ */
7
+ import React from 'react';
8
+ import type { EventEmit } from '@almadar/core';
9
+ import type { TemplateProps } from '../../core/templates/types';
10
+ import type { CardBattlerBoardProps, CardBattlerCard } from '../organisms/CardBattlerBoard';
11
+ export interface CardBattlerTemplateProps extends TemplateProps {
12
+ title?: string;
13
+ deck?: CardBattlerCard[];
14
+ hand?: CardBattlerCard[];
15
+ board?: CardBattlerCard[];
16
+ mana?: number;
17
+ maxMana?: number;
18
+ turn?: number;
19
+ result?: 'none' | 'won' | 'lost';
20
+ assetManifest?: CardBattlerBoardProps['assetManifest'];
21
+ playCardEvent?: EventEmit<{
22
+ cardId: string;
23
+ }>;
24
+ endTurnEvent?: EventEmit<Record<string, never>>;
25
+ playAgainEvent?: EventEmit<Record<string, never>>;
26
+ gameEndEvent?: EventEmit<{
27
+ result: 'won' | 'lost';
28
+ }>;
29
+ className?: string;
30
+ }
31
+ export declare function CardBattlerTemplate({ entity, title, deck, hand, board, mana, maxMana, turn, result, assetManifest, playCardEvent, endTurnEvent, playAgainEvent, gameEndEvent, className, }: CardBattlerTemplateProps): React.JSX.Element;
32
+ export declare namespace CardBattlerTemplate {
33
+ var displayName: string;
34
+ }
35
+ export default CardBattlerTemplate;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * CityBuilderTemplate
3
+ *
4
+ * Thin template wrapper: titled header + CityBuilderBoard.
5
+ * All game state is driven by the entity prop (passed through from the orbital trait).
6
+ */
7
+ import React from 'react';
8
+ import type { EventEmit } from '@almadar/core';
9
+ import type { TemplateProps } from '../../core/templates/types';
10
+ import type { CityBuilderBoardProps, CityBuilderTile, CityBuilderBuilding, CityBuilderBuildType } from '../organisms/CityBuilderBoard';
11
+ export interface CityBuilderTemplateProps extends TemplateProps {
12
+ title?: string;
13
+ tiles?: CityBuilderTile[];
14
+ buildings?: CityBuilderBuilding[];
15
+ buildTypes?: CityBuilderBuildType[];
16
+ pendingBuildType?: string;
17
+ assetManifest?: CityBuilderBoardProps['assetManifest'];
18
+ gold?: number;
19
+ wood?: number;
20
+ population?: number;
21
+ result?: 'none' | 'won' | 'lost';
22
+ scale?: number;
23
+ unitScale?: number;
24
+ selectBuildTypeEvent?: EventEmit<{
25
+ buildType: string;
26
+ }>;
27
+ placeBuildingEvent?: EventEmit<{
28
+ x: number;
29
+ y: number;
30
+ }>;
31
+ gameEndEvent?: EventEmit<{
32
+ result: 'won' | 'lost';
33
+ }>;
34
+ className?: string;
35
+ }
36
+ export declare function CityBuilderTemplate({ entity, title, tiles, buildings, buildTypes, pendingBuildType, assetManifest, gold, wood, population, result, scale, unitScale, selectBuildTypeEvent, placeBuildingEvent, gameEndEvent, className, }: CityBuilderTemplateProps): React.JSX.Element;
37
+ export declare namespace CityBuilderTemplate {
38
+ var displayName: string;
39
+ }
40
+ export default CityBuilderTemplate;
@@ -20,11 +20,14 @@
20
20
  import React from 'react';
21
21
  import type { IsometricTile, IsometricFeature } from '../organisms/types/isometric';
22
22
  import type { TemplateProps } from '../../core/templates/types';
23
+ import { type Game3DAssetManifest } from './game3dAssetManifest';
23
24
  export interface GameCanvas3DBattleTemplateProps extends TemplateProps {
24
- /** Fallback tile data when no entity is present */
25
+ /** Fallback tile data when no entity is present (layout only — model URLs resolve from assetManifest) */
25
26
  tiles?: IsometricTile[];
26
27
  /** Fallback feature data when no entity is present */
27
28
  features?: IsometricFeature[];
29
+ /** GLB model URLs keyed by terrain — owns all asset choice (no hardcoded URLs in this template). */
30
+ assetManifest?: Game3DAssetManifest;
28
31
  /** 3D camera mode - defaults to perspective for dramatic effect */
29
32
  cameraMode?: 'isometric' | 'perspective' | 'top-down';
30
33
  /** Show grid helper */
@@ -72,7 +75,7 @@ export interface GameCanvas3DBattleTemplateProps extends TemplateProps {
72
75
  * />
73
76
  * ```
74
77
  */
75
- export declare function GameCanvas3DBattleTemplate({ entity, tiles: propTiles, features: propFeatures, cameraMode, backgroundColor, tileClickEvent, unitClickEvent, endTurnEvent, cancelEvent, attackEvent, playAgainEvent, gameEndEvent, unitScale, scale, className, }: GameCanvas3DBattleTemplateProps): React.JSX.Element | null;
78
+ export declare function GameCanvas3DBattleTemplate({ entity, tiles: propTiles, features: propFeatures, assetManifest, cameraMode, backgroundColor, tileClickEvent, unitClickEvent, endTurnEvent, cancelEvent, attackEvent, playAgainEvent, gameEndEvent, unitScale, scale, className, }: GameCanvas3DBattleTemplateProps): React.JSX.Element | null;
76
79
  export declare namespace GameCanvas3DBattleTemplate {
77
80
  var displayName: string;
78
81
  }
@@ -21,11 +21,14 @@
21
21
  import React from 'react';
22
22
  import type { IsometricTile, IsometricFeature } from '../organisms/types/isometric';
23
23
  import type { TemplateProps } from '../../core/templates/types';
24
+ import { type Game3DAssetManifest } from './game3dAssetManifest';
24
25
  export interface GameCanvas3DCastleTemplateProps extends TemplateProps {
25
- /** Fallback tile data when no entity is present */
26
+ /** Fallback tile data when no entity is present (layout only — model URLs resolve from assetManifest) */
26
27
  tiles?: IsometricTile[];
27
28
  /** Fallback feature data when no entity is present */
28
29
  features?: IsometricFeature[];
30
+ /** GLB model URLs keyed by terrain — owns all asset choice (no hardcoded URLs in this template). */
31
+ assetManifest?: Game3DAssetManifest;
29
32
  /** 3D camera mode */
30
33
  cameraMode?: 'isometric' | 'perspective' | 'top-down';
31
34
  /** Show grid helper */
@@ -77,7 +80,7 @@ export interface GameCanvas3DCastleTemplateProps extends TemplateProps {
77
80
  * />
78
81
  * ```
79
82
  */
80
- export declare function GameCanvas3DCastleTemplate({ entity, tiles: propTiles, features: propFeatures, cameraMode, backgroundColor, buildingClickEvent, unitClickEvent, endTurnEvent, cancelEvent, attackEvent, playAgainEvent, gameEndEvent, showHeader, unitScale, scale, className, }: GameCanvas3DCastleTemplateProps): React.JSX.Element | null;
83
+ export declare function GameCanvas3DCastleTemplate({ entity, tiles: propTiles, features: propFeatures, assetManifest, cameraMode, backgroundColor, buildingClickEvent, unitClickEvent, endTurnEvent, cancelEvent, attackEvent, playAgainEvent, gameEndEvent, showHeader, unitScale, scale, className, }: GameCanvas3DCastleTemplateProps): React.JSX.Element | null;
81
84
  export declare namespace GameCanvas3DCastleTemplate {
82
85
  var displayName: string;
83
86
  }
@@ -22,11 +22,14 @@
22
22
  import React from 'react';
23
23
  import type { IsometricTile, IsometricFeature } from '../organisms/types/isometric';
24
24
  import type { TemplateProps } from '../../core/templates/types';
25
+ import { type Game3DAssetManifest } from './game3dAssetManifest';
25
26
  export interface GameCanvas3DWorldMapTemplateProps extends TemplateProps {
26
- /** Fallback tile data when no entity is present */
27
+ /** Fallback tile data when no entity is present (layout only — model URLs resolve from assetManifest) */
27
28
  tiles?: IsometricTile[];
28
29
  /** Fallback feature data when no entity is present */
29
30
  features?: IsometricFeature[];
31
+ /** GLB model URLs keyed by terrain — owns all asset choice (no hardcoded URLs in this template). */
32
+ assetManifest?: Game3DAssetManifest;
30
33
  /** 3D camera mode */
31
34
  cameraMode?: 'isometric' | 'perspective' | 'top-down';
32
35
  /** Show grid helper */
@@ -85,7 +88,7 @@ export interface GameCanvas3DWorldMapTemplateProps extends TemplateProps {
85
88
  * />
86
89
  * ```
87
90
  */
88
- export declare function GameCanvas3DWorldMapTemplate({ entity, tiles: propTiles, features: propFeatures, cameraMode, backgroundColor, tileClickEvent, unitClickEvent, endTurnEvent, cancelEvent, attackEvent, playAgainEvent, gameEndEvent, unitScale, scale, className, }: GameCanvas3DWorldMapTemplateProps): React.JSX.Element | null;
91
+ export declare function GameCanvas3DWorldMapTemplate({ entity, tiles: propTiles, features: propFeatures, assetManifest, cameraMode, backgroundColor, tileClickEvent, unitClickEvent, endTurnEvent, cancelEvent, attackEvent, playAgainEvent, gameEndEvent, unitScale, scale, className, }: GameCanvas3DWorldMapTemplateProps): React.JSX.Element | null;
89
92
  export declare namespace GameCanvas3DWorldMapTemplate {
90
93
  var displayName: string;
91
94
  }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * TopDownShooterTemplate
3
+ *
4
+ * Thin template wrapper: titled header + TopDownShooterBoard.
5
+ * All game state is driven by the entity prop (passed through from the orbital trait).
6
+ */
7
+ import React from 'react';
8
+ import type { EventEmit } from '@almadar/core';
9
+ import type { TemplateProps } from '../../core/templates/types';
10
+ import type { TopDownShooterBoardProps, ShooterPlayer, ShooterEnemy, ShooterProjectile } from '../organisms/TopDownShooterBoard';
11
+ export interface TopDownShooterTemplateProps extends TemplateProps {
12
+ title?: string;
13
+ player?: ShooterPlayer;
14
+ enemies?: ShooterEnemy[];
15
+ projectiles?: ShooterProjectile[];
16
+ score?: number;
17
+ wave?: number;
18
+ lives?: number;
19
+ result?: 'none' | 'won' | 'lost';
20
+ assetManifest?: TopDownShooterBoardProps['assetManifest'];
21
+ width?: number;
22
+ height?: number;
23
+ spriteSize?: number;
24
+ moveEvent?: EventEmit<{
25
+ dx: number;
26
+ dy: number;
27
+ }>;
28
+ fireEvent?: EventEmit<{
29
+ tx: number;
30
+ ty: number;
31
+ }>;
32
+ playAgainEvent?: EventEmit<Record<string, never>>;
33
+ gameEndEvent?: EventEmit<{
34
+ result: 'won' | 'lost';
35
+ }>;
36
+ className?: string;
37
+ }
38
+ export declare function TopDownShooterTemplate({ entity, title, player, enemies, projectiles, score, wave, lives, result, assetManifest, width, height, spriteSize, moveEvent, fireEvent, playAgainEvent, gameEndEvent, className, }: TopDownShooterTemplateProps): React.JSX.Element;
39
+ export declare namespace TopDownShooterTemplate {
40
+ var displayName: string;
41
+ }
42
+ export default TopDownShooterTemplate;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * VisualNovelTemplate
3
+ *
4
+ * Thin template wrapper: titled header + VisualNovelBoard.
5
+ * All scene state is driven by the entity/props passed through from the orbital trait.
6
+ */
7
+ import React from 'react';
8
+ import type { EventEmit } from '@almadar/core';
9
+ import type { TemplateProps } from '../../core/templates/types';
10
+ import type { VisualNovelNode } from '../organisms/VisualNovelBoard';
11
+ export interface VisualNovelTemplateProps extends TemplateProps {
12
+ title?: string;
13
+ nodes?: VisualNovelNode[];
14
+ currentNodeId?: string;
15
+ typewriterSpeed?: number;
16
+ portraitScale?: number;
17
+ chooseEvent?: EventEmit<{
18
+ choiceIndex: number;
19
+ }>;
20
+ advanceEvent?: EventEmit<Record<string, never>>;
21
+ restartEvent?: EventEmit<Record<string, never>>;
22
+ className?: string;
23
+ }
24
+ export declare function VisualNovelTemplate({ entity, title, nodes, currentNodeId, typewriterSpeed, portraitScale, chooseEvent, advanceEvent, restartEvent, className, }: VisualNovelTemplateProps): React.JSX.Element;
25
+ export declare namespace VisualNovelTemplate {
26
+ var displayName: string;
27
+ }
28
+ export default VisualNovelTemplate;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * game3dAssetManifest — shared, asset-URL-free helpers for the 3D game-canvas
3
+ * templates (battle / castle / world-map).
4
+ *
5
+ * Every GLB model URL lives in the lolo `assetManifest` config and arrives via
6
+ * props; these helpers resolve a tile's / feature's `modelUrl` from that manifest
7
+ * by terrain/feature key. NO asset URLs are declared here — the templates and this
8
+ * module stay pure, exactly like the `GameCanvas3D` molecule.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import type { AssetUrl, EntityRow } from '@almadar/core';
13
+ import type { IsometricTile, IsometricFeature } from '../organisms/types/isometric';
14
+ /** GLB model URLs for a 3D board, keyed by terrain "kind" and (optionally) feature type. */
15
+ export interface Game3DAssetManifest {
16
+ /** Base URL prepended to manifest-relative model paths (absolute paths pass through). */
17
+ baseUrl?: AssetUrl;
18
+ /** Floor model URLs by terrain kind ('wall' | 'dirt' | 'open'). */
19
+ models?: Record<string, AssetUrl>;
20
+ /** Feature/structure model URLs by feature type ('gold_mine', 'portal', …). */
21
+ features?: Record<string, AssetUrl>;
22
+ }
23
+ /** Layout-only tile (no model URL): position + terrain kind. */
24
+ export interface Tile3DLayout {
25
+ id?: string;
26
+ x: number;
27
+ y: number;
28
+ z?: number;
29
+ type: string;
30
+ passable?: boolean;
31
+ /** Terrain kind that maps into `assetManifest.models` (wall | dirt | open). */
32
+ kind: string;
33
+ }
34
+ /**
35
+ * Resolve a layout tile array into render-ready `IsometricTile[]`, attaching each
36
+ * tile's `modelUrl` from `assetManifest.models` by terrain kind. Pure: URLs come
37
+ * only from the manifest.
38
+ */
39
+ export declare function resolveTilesWithModels(layout: readonly Tile3DLayout[], manifest: Game3DAssetManifest | undefined): IsometricTile[];
40
+ /**
41
+ * Map prop `IsometricTile[]` (which already carry `type`/`passable` but no model)
42
+ * into render-ready tiles with manifest-resolved model URLs.
43
+ */
44
+ export declare function resolvePropTiles(tiles: readonly IsometricTile[], manifest: Game3DAssetManifest | undefined): IsometricTile[];
45
+ /** Read entity-carried tile rows into render-ready `IsometricTile[]` with manifest-resolved models. */
46
+ export declare function resolveEntityTiles(entity: EntityRow | readonly EntityRow[] | undefined, manifest: Game3DAssetManifest | undefined): IsometricTile[];
47
+ /** Resolve feature model URLs from `assetManifest.features` by feature type. */
48
+ export declare function resolveFeaturesWithModels(features: readonly IsometricFeature[], manifest: Game3DAssetManifest | undefined): IsometricFeature[];
49
+ /** Read entity-carried feature rows into render-ready `IsometricFeature[]` with manifest models. */
50
+ export declare function resolveEntityFeatures(entity: EntityRow | readonly EntityRow[] | undefined, manifest: Game3DAssetManifest | undefined): IsometricFeature[];
@@ -0,0 +1,4 @@
1
+ export { TopDownShooterTemplate, type TopDownShooterTemplateProps, } from './TopDownShooterTemplate';
2
+ export { CityBuilderTemplate, type CityBuilderTemplateProps, } from './CityBuilderTemplate';
3
+ export { VisualNovelTemplate, type VisualNovelTemplateProps, } from './VisualNovelTemplate';
4
+ export { CardBattlerTemplate, type CardBattlerTemplateProps, } from './CardBattlerTemplate';