@almadar/ui 4.20.0 → 4.22.0

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 (51) hide show
  1. package/dist/avl/index.cjs +5 -1
  2. package/dist/avl/index.js +5 -1
  3. package/dist/components/index.cjs +5 -1
  4. package/dist/components/index.js +5 -1
  5. package/dist/components/molecules/Accordion.d.ts +5 -1
  6. package/dist/components/molecules/CalendarGrid.d.ts +8 -5
  7. package/dist/components/molecules/Card.d.ts +3 -3
  8. package/dist/components/molecules/Carousel.d.ts +4 -1
  9. package/dist/components/molecules/EmptyState.d.ts +2 -1
  10. package/dist/components/molecules/ErrorState.d.ts +2 -1
  11. package/dist/components/molecules/MapView.d.ts +7 -3
  12. package/dist/components/molecules/Modal.d.ts +2 -1
  13. package/dist/components/molecules/Pagination.d.ts +7 -2
  14. package/dist/components/molecules/SidePanel.d.ts +2 -1
  15. package/dist/components/molecules/Tabs.d.ts +7 -2
  16. package/dist/components/molecules/Toast.d.ts +3 -2
  17. package/dist/components/molecules/WizardProgress.d.ts +4 -1
  18. package/dist/components/molecules/game/ActionButtons.d.ts +5 -1
  19. package/dist/components/molecules/game/CraftingRecipe.d.ts +4 -1
  20. package/dist/components/molecules/game/DPad.d.ts +5 -1
  21. package/dist/components/molecules/game/DialogueBox.d.ts +7 -5
  22. package/dist/components/molecules/game/InventoryGrid.d.ts +4 -1
  23. package/dist/components/molecules/game/InventoryPanel.d.ts +12 -6
  24. package/dist/components/molecules/game/IsometricCanvas.d.ts +13 -4
  25. package/dist/components/molecules/game/PlatformerCanvas.d.ts +9 -4
  26. package/dist/components/organisms/GraphCanvas.d.ts +4 -2
  27. package/dist/components/organisms/MediaGallery.d.ts +4 -1
  28. package/dist/components/organisms/PageHeader.d.ts +2 -1
  29. package/dist/components/organisms/Sidebar.d.ts +6 -3
  30. package/dist/components/organisms/SignaturePad.d.ts +5 -2
  31. package/dist/components/organisms/game/BattleBoard.d.ts +20 -8
  32. package/dist/components/organisms/game/CanvasEffect.d.ts +2 -1
  33. package/dist/components/organisms/game/CastleBoard.d.ts +14 -3
  34. package/dist/components/organisms/game/GameCanvas3D.d.ts +52 -8
  35. package/dist/components/organisms/game/TraitSlot.d.ts +7 -2
  36. package/dist/components/organisms/game/WorldMapBoard.d.ts +22 -5
  37. package/dist/components/organisms/game/hooks/useBattleState.d.ts +19 -7
  38. package/dist/components/organisms/game/puzzles/builder/BuilderBoard.d.ts +5 -1
  39. package/dist/components/organisms/game/puzzles/classifier/ClassifierBoard.d.ts +5 -1
  40. package/dist/components/organisms/game/puzzles/debugger/DebuggerBoard.d.ts +5 -1
  41. package/dist/components/organisms/game/puzzles/event-handler/EventHandlerBoard.d.ts +5 -2
  42. package/dist/components/organisms/game/puzzles/negotiator/NegotiatorBoard.d.ts +5 -1
  43. package/dist/components/organisms/game/puzzles/sequencer/SequencerBoard.d.ts +8 -2
  44. package/dist/components/organisms/game/puzzles/simulator/SimulatorBoard.d.ts +5 -1
  45. package/dist/components/organisms/game/puzzles/state-architect/StateArchitectBoard.d.ts +6 -2
  46. package/dist/components/organisms/game/three/hooks/useGameCanvas3DEvents.d.ts +52 -8
  47. package/dist/providers/index.cjs +5 -1
  48. package/dist/providers/index.js +5 -1
  49. package/dist/runtime/index.cjs +5 -1
  50. package/dist/runtime/index.js +5 -1
  51. package/package.json +2 -2
@@ -10,6 +10,7 @@
10
10
  * - logoClickEvent — emitted when logo/brand area clicked
11
11
  */
12
12
  import React from 'react';
13
+ import type { EventEmit } from '@almadar/core';
13
14
  import type { LucideIcon } from 'lucide-react';
14
15
  export interface SidebarItem {
15
16
  /** Item ID */
@@ -55,14 +56,16 @@ export interface SidebarProps {
55
56
  /** Default collapsed state */
56
57
  defaultCollapsed?: boolean;
57
58
  /** Event emitted when collapse state changes, payload: { collapsed: boolean } */
58
- collapseChangeEvent?: string;
59
+ collapseChangeEvent?: EventEmit<{
60
+ collapsed: boolean;
61
+ }>;
59
62
  /** Hide the collapse/expand button */
60
63
  hideCollapseButton?: boolean;
61
64
  /** Show a close button (for mobile) */
62
65
  showCloseButton?: boolean;
63
66
  /** Event emitted when close button is clicked */
64
- closeEvent?: string;
67
+ closeEvent?: EventEmit<Record<string, never>>;
65
68
  /** Event emitted when logo/brand is clicked */
66
- logoClickEvent?: string;
69
+ logoClickEvent?: EventEmit<Record<string, never>>;
67
70
  }
68
71
  export declare const Sidebar: React.FC<SidebarProps>;
@@ -11,6 +11,7 @@
11
11
  * - className for external styling
12
12
  */
13
13
  import React from "react";
14
+ import type { EventEmit } from "@almadar/core";
14
15
  export interface SignaturePadProps {
15
16
  /** Label above the pad */
16
17
  label?: string;
@@ -29,9 +30,11 @@ export interface SignaturePadProps {
29
30
  /** Callback when signature changes */
30
31
  onChange?: (dataUrl: string | null) => void;
31
32
  /** Event to emit on sign */
32
- signEvent?: string;
33
+ signEvent?: EventEmit<{
34
+ signature: string;
35
+ }>;
33
36
  /** Event to emit on clear */
34
- clearEvent?: string;
37
+ clearEvent?: EventEmit<Record<string, never>>;
35
38
  /** Entity name for schema-driven context */
36
39
  entity?: string;
37
40
  /** Loading state */
@@ -18,6 +18,7 @@
18
18
  * @packageDocumentation
19
19
  */
20
20
  import React from 'react';
21
+ import type { EventEmit } from '@almadar/core';
21
22
  import type { EntityDisplayProps } from '../types';
22
23
  import type { IsometricTile, IsometricFeature } from './types/isometric';
23
24
  import type { ResolvedFrame } from './types/spriteAnimation';
@@ -153,19 +154,30 @@ export interface BattleBoardProps extends Omit<EntityDisplayProps, 'entity'> {
153
154
  effectSpriteUrls?: string[];
154
155
  resolveUnitFrame?: (unitId: string) => ResolvedFrame | null;
155
156
  /** Emits UI:{tileClickEvent} with { x, y } on tile click */
156
- tileClickEvent?: string;
157
+ tileClickEvent?: EventEmit<{
158
+ x: number;
159
+ y: number;
160
+ }>;
157
161
  /** Emits UI:{unitClickEvent} with { unitId } on unit click */
158
- unitClickEvent?: string;
162
+ unitClickEvent?: EventEmit<{
163
+ unitId: string;
164
+ }>;
159
165
  /** Emits UI:{endTurnEvent} with {} on end turn */
160
- endTurnEvent?: string;
166
+ endTurnEvent?: EventEmit<Record<string, never>>;
161
167
  /** Emits UI:{cancelEvent} with {} on cancel */
162
- cancelEvent?: string;
163
- /** Emits UI:{gameEndEvent} with { result } on game end */
164
- gameEndEvent?: string;
168
+ cancelEvent?: EventEmit<Record<string, never>>;
169
+ /** Emits UI:{gameEndEvent} with { result: 'victory' | 'defeat' } on game end */
170
+ gameEndEvent?: EventEmit<{
171
+ result: 'victory' | 'defeat';
172
+ }>;
165
173
  /** Emits UI:{playAgainEvent} with {} on play again / reset */
166
- playAgainEvent?: string;
174
+ playAgainEvent?: EventEmit<Record<string, never>>;
167
175
  /** Emits UI:{attackEvent} with { attackerId, targetId, damage } on attack */
168
- attackEvent?: string;
176
+ attackEvent?: EventEmit<{
177
+ attackerId: string;
178
+ targetId: string;
179
+ damage: number;
180
+ }>;
169
181
  className?: string;
170
182
  }
171
183
  export declare function BattleBoard({ entity, scale, unitScale, header, sidebar, actions, overlay, gameOverOverlay, onAttack, onGameEnd, onUnitMove, calculateDamage, onDrawEffects, hasActiveEffects, effectSpriteUrls, resolveUnitFrame, tileClickEvent, unitClickEvent, endTurnEvent, cancelEvent, gameEndEvent, playAgainEvent, attackEvent, className, }: BattleBoardProps): React.JSX.Element;
@@ -24,6 +24,7 @@
24
24
  * @packageDocumentation
25
25
  */
26
26
  import * as React from 'react';
27
+ import type { EventEmit } from '@almadar/core';
27
28
  import type { CombatActionType, EffectAssetManifest } from './types/effects';
28
29
  export type { CombatActionType } from './types/effects';
29
30
  export type { EffectAssetManifest } from './types/effects';
@@ -41,7 +42,7 @@ export interface CanvasEffectProps {
41
42
  /** Callback when the effect animation completes */
42
43
  onComplete?: () => void;
43
44
  /** Declarative event: emits UI:{completeEvent} when the effect animation completes */
44
- completeEvent?: string;
45
+ completeEvent?: EventEmit<Record<string, never>>;
45
46
  /** Additional CSS classes */
46
47
  className?: string;
47
48
  /** Loading state indicator */
@@ -13,6 +13,7 @@
13
13
  * @packageDocumentation
14
14
  */
15
15
  import React from 'react';
16
+ import type { EventEmit } from '@almadar/core';
16
17
  import type { IsometricTile, IsometricUnit, IsometricFeature } from './types/isometric';
17
18
  /** Entity shape consumed by CastleBoard */
18
19
  export interface CastleEntity {
@@ -71,11 +72,21 @@ export interface CastleBoardProps {
71
72
  /** Called when any tile is clicked */
72
73
  onTileClick?: (x: number, y: number) => void;
73
74
  /** Event name to emit via event bus when a feature is clicked (emits UI:{featureClickEvent}) */
74
- featureClickEvent?: string;
75
+ featureClickEvent?: EventEmit<{
76
+ featureId: string;
77
+ featureType: string;
78
+ x: number;
79
+ y: number;
80
+ }>;
75
81
  /** Event name to emit via event bus when a unit is clicked (emits UI:{unitClickEvent}) */
76
- unitClickEvent?: string;
82
+ unitClickEvent?: EventEmit<{
83
+ unitId: string;
84
+ }>;
77
85
  /** Event name to emit via event bus when a tile is clicked (emits UI:{tileClickEvent}) */
78
- tileClickEvent?: string;
86
+ tileClickEvent?: EventEmit<{
87
+ x: number;
88
+ y: number;
89
+ }>;
79
90
  className?: string;
80
91
  }
81
92
  export declare function CastleBoard({ entity, scale, header, sidePanel, overlay, footer, onFeatureClick, onUnitClick, onTileClick, featureClickEvent, unitClickEvent, tileClickEvent, className, }: CastleBoardProps): React.JSX.Element;
@@ -14,6 +14,7 @@
14
14
  * @packageDocumentation
15
15
  */
16
16
  import React from 'react';
17
+ import type { EventEmit } from '@almadar/core';
17
18
  import * as THREE from 'three';
18
19
  import { AssetLoader } from './three/loaders/AssetLoader';
19
20
  import type { IsometricTile, IsometricUnit, IsometricFeature } from './types/isometric';
@@ -106,21 +107,64 @@ export interface GameCanvas3DProps {
106
107
  /** URLs to preload */
107
108
  preloadAssets?: string[];
108
109
  /** Declarative event: tile click */
109
- tileClickEvent?: string;
110
+ tileClickEvent?: EventEmit<{
111
+ tileId: string;
112
+ x: number;
113
+ z: number;
114
+ type?: string;
115
+ terrain?: string;
116
+ elevation?: number;
117
+ }>;
110
118
  /** Declarative event: unit click */
111
- unitClickEvent?: string;
119
+ unitClickEvent?: EventEmit<{
120
+ unitId: string;
121
+ x: number;
122
+ z: number;
123
+ unitType?: string;
124
+ name?: string;
125
+ team?: string;
126
+ faction?: string;
127
+ health?: number;
128
+ maxHealth?: number;
129
+ }>;
112
130
  /** Declarative event: feature click */
113
- featureClickEvent?: string;
131
+ featureClickEvent?: EventEmit<{
132
+ featureId: string;
133
+ x: number;
134
+ z: number;
135
+ type?: string;
136
+ elevation?: number;
137
+ }>;
114
138
  /** Declarative event: canvas click */
115
- canvasClickEvent?: string;
139
+ canvasClickEvent?: EventEmit<{
140
+ clientX: number;
141
+ clientY: number;
142
+ button: number;
143
+ }>;
116
144
  /** Declarative event: tile hover */
117
- tileHoverEvent?: string;
145
+ tileHoverEvent?: EventEmit<{
146
+ tileId: string;
147
+ x: number;
148
+ z: number;
149
+ type?: string;
150
+ }>;
118
151
  /** Declarative event: tile leave */
119
- tileLeaveEvent?: string;
152
+ tileLeaveEvent?: EventEmit<Record<string, never>>;
120
153
  /** Declarative event: unit animation */
121
- unitAnimationEvent?: string;
154
+ unitAnimationEvent?: EventEmit<{
155
+ unitId: string;
156
+ state: string;
157
+ timestamp: number;
158
+ }>;
122
159
  /** Declarative event: camera change */
123
- cameraChangeEvent?: string;
160
+ cameraChangeEvent?: EventEmit<{
161
+ position: {
162
+ x: number;
163
+ y: number;
164
+ z: number;
165
+ };
166
+ timestamp: number;
167
+ }>;
124
168
  /** Loading message */
125
169
  loadingMessage?: string;
126
170
  /** Whether to use instancing for tiles */
@@ -18,6 +18,7 @@
18
18
  * @packageDocumentation
19
19
  */
20
20
  import React from 'react';
21
+ import type { EventEmit } from '@almadar/core';
21
22
  import { type TraitStateMachineDefinition } from './TraitStateViewer';
22
23
  /** Data shape for a slot's equipped item */
23
24
  export interface SlotItemData {
@@ -79,9 +80,13 @@ export interface TraitSlotProps {
79
80
  /** Remove handler */
80
81
  onRemove?: () => void;
81
82
  /** Emits UI:{clickEvent} with { slotNumber } */
82
- clickEvent?: string;
83
+ clickEvent?: EventEmit<{
84
+ slotNumber: number;
85
+ }>;
83
86
  /** Emits UI:{removeEvent} with { slotNumber } */
84
- removeEvent?: string;
87
+ removeEvent?: EventEmit<{
88
+ slotNumber: number;
89
+ }>;
85
90
  }
86
91
  export declare function TraitSlot({ slotNumber, equippedItem, locked, lockLabel, selected, size, showTooltip, categoryColors, tooltipFrameUrl, className, feedback, onItemDrop, draggable, onDragStart, onClick, onRemove, clickEvent, removeEvent, }: TraitSlotProps): React.JSX.Element;
87
92
  export declare namespace TraitSlot {
@@ -19,6 +19,7 @@
19
19
  * @packageDocumentation
20
20
  */
21
21
  import React from 'react';
22
+ import type { EventEmit } from '@almadar/core';
22
23
  import type { IsometricFeature } from './types/isometric';
23
24
  import type { ResolvedFrame } from './types/spriteAnimation';
24
25
  /** A hero on the world map */
@@ -125,15 +126,31 @@ export interface WorldMapBoardProps {
125
126
  y: number;
126
127
  }, range: number) => boolean;
127
128
  /** Emits UI:{heroSelectEvent} with { heroId } */
128
- heroSelectEvent?: string;
129
+ heroSelectEvent?: EventEmit<{
130
+ heroId: string;
131
+ }>;
129
132
  /** Emits UI:{heroMoveEvent} with { heroId, toX, toY } */
130
- heroMoveEvent?: string;
133
+ heroMoveEvent?: EventEmit<{
134
+ heroId: string;
135
+ toX: number;
136
+ toY: number;
137
+ }>;
131
138
  /** Emits UI:{battleEncounterEvent} with { attackerId, defenderId } */
132
- battleEncounterEvent?: string;
139
+ battleEncounterEvent?: EventEmit<{
140
+ attackerId: string;
141
+ defenderId: string;
142
+ }>;
133
143
  /** Emits UI:{featureEnterEvent} with { heroId, feature, hex } */
134
- featureEnterEvent?: string;
144
+ featureEnterEvent?: EventEmit<{
145
+ heroId: string;
146
+ feature: string;
147
+ hex: MapHex;
148
+ }>;
135
149
  /** Emits UI:{tileClickEvent} with { x, y } */
136
- tileClickEvent?: string;
150
+ tileClickEvent?: EventEmit<{
151
+ x: number;
152
+ y: number;
153
+ }>;
137
154
  /** Header / top bar */
138
155
  header?: (ctx: WorldMapSlotContext) => React.ReactNode;
139
156
  /** Side panel (hero detail, hero lists, etc.) */
@@ -1,12 +1,24 @@
1
+ import type { EventEmit } from '@almadar/core';
1
2
  import type { BattleUnit, BattlePhase } from '../BattleBoard';
2
3
  export interface BattleStateEventConfig {
3
- tileClickEvent?: string;
4
- unitClickEvent?: string;
5
- endTurnEvent?: string;
6
- cancelEvent?: string;
7
- gameEndEvent?: string;
8
- playAgainEvent?: string;
9
- attackEvent?: string;
4
+ tileClickEvent?: EventEmit<{
5
+ x: number;
6
+ y: number;
7
+ }>;
8
+ unitClickEvent?: EventEmit<{
9
+ unitId: string;
10
+ }>;
11
+ endTurnEvent?: EventEmit<Record<string, never>>;
12
+ cancelEvent?: EventEmit<Record<string, never>>;
13
+ gameEndEvent?: EventEmit<{
14
+ result: 'victory' | 'defeat';
15
+ }>;
16
+ playAgainEvent?: EventEmit<Record<string, never>>;
17
+ attackEvent?: EventEmit<{
18
+ attackerId: string;
19
+ targetId: string;
20
+ damage: number;
21
+ }>;
10
22
  }
11
23
  export interface BattleStateCallbacks {
12
24
  /** Called when a unit attacks another */
@@ -9,6 +9,7 @@
9
9
  * Events emitted via completeEvent (default UI:PUZZLE_COMPLETE).
10
10
  */
11
11
  import React from 'react';
12
+ import type { EventEmit } from '@almadar/core';
12
13
  import type { EntityDisplayProps } from '../../../types';
13
14
  export interface BuilderComponent {
14
15
  id: string;
@@ -44,7 +45,10 @@ export interface BuilderPuzzleEntity {
44
45
  }
45
46
  export interface BuilderBoardProps extends Omit<EntityDisplayProps, 'entity'> {
46
47
  entity: BuilderPuzzleEntity;
47
- completeEvent?: string;
48
+ completeEvent?: EventEmit<{
49
+ success: boolean;
50
+ attempts: number;
51
+ }>;
48
52
  }
49
53
  export declare function BuilderBoard({ entity, completeEvent, className, }: BuilderBoardProps): React.JSX.Element;
50
54
  export declare namespace BuilderBoard {
@@ -10,6 +10,7 @@
10
10
  * Events emitted via completeEvent (default UI:PUZZLE_COMPLETE).
11
11
  */
12
12
  import React from 'react';
13
+ import type { EventEmit } from '@almadar/core';
13
14
  import type { EntityDisplayProps } from '../../../types';
14
15
  export interface ClassifierItem {
15
16
  id: string;
@@ -45,7 +46,10 @@ export interface ClassifierPuzzleEntity {
45
46
  }
46
47
  export interface ClassifierBoardProps extends Omit<EntityDisplayProps, 'entity'> {
47
48
  entity: ClassifierPuzzleEntity;
48
- completeEvent?: string;
49
+ completeEvent?: EventEmit<{
50
+ success: boolean;
51
+ attempts: number;
52
+ }>;
49
53
  }
50
54
  export declare function ClassifierBoard({ entity, completeEvent, className, }: ClassifierBoardProps): React.JSX.Element;
51
55
  export declare namespace ClassifierBoard {
@@ -9,6 +9,7 @@
9
9
  * Events emitted via completeEvent (default UI:PUZZLE_COMPLETE).
10
10
  */
11
11
  import React from 'react';
12
+ import type { EventEmit } from '@almadar/core';
12
13
  import type { EntityDisplayProps } from '../../../types';
13
14
  export interface DebuggerLine {
14
15
  id: string;
@@ -37,7 +38,10 @@ export interface DebuggerPuzzleEntity {
37
38
  }
38
39
  export interface DebuggerBoardProps extends Omit<EntityDisplayProps, 'entity'> {
39
40
  entity: DebuggerPuzzleEntity;
40
- completeEvent?: string;
41
+ completeEvent?: EventEmit<{
42
+ success: boolean;
43
+ attempts: number;
44
+ }>;
41
45
  }
42
46
  export declare function DebuggerBoard({ entity, completeEvent, className, }: DebuggerBoardProps): React.JSX.Element;
43
47
  export declare namespace DebuggerBoard {
@@ -11,6 +11,7 @@
11
11
  * @packageDocumentation
12
12
  */
13
13
  import React from 'react';
14
+ import type { EventEmit } from '@almadar/core';
14
15
  import type { EntityDisplayProps } from '../../../types';
15
16
  import { type PuzzleObjectDef } from './ObjectRulePanel';
16
17
  export interface EventHandlerPuzzleEntity {
@@ -44,9 +45,11 @@ export interface EventHandlerBoardProps extends Omit<EntityDisplayProps, 'entity
44
45
  /** Playback speed in ms per event */
45
46
  stepDurationMs?: number;
46
47
  /** Emits UI:{playEvent} */
47
- playEvent?: string;
48
+ playEvent?: EventEmit<Record<string, never>>;
48
49
  /** Emits UI:{completeEvent} with { success } */
49
- completeEvent?: string;
50
+ completeEvent?: EventEmit<{
51
+ success: boolean;
52
+ }>;
50
53
  }
51
54
  export declare function EventHandlerBoard({ entity, stepDurationMs, playEvent, completeEvent, className, }: EventHandlerBoardProps): React.JSX.Element;
52
55
  export declare namespace EventHandlerBoard {
@@ -11,6 +11,7 @@
11
11
  * Events emitted via completeEvent (default UI:PUZZLE_COMPLETE).
12
12
  */
13
13
  import React from 'react';
14
+ import type { EventEmit } from '@almadar/core';
14
15
  import type { EntityDisplayProps } from '../../../types';
15
16
  export interface NegotiatorAction {
16
17
  id: string;
@@ -46,7 +47,10 @@ export interface NegotiatorPuzzleEntity {
46
47
  }
47
48
  export interface NegotiatorBoardProps extends Omit<EntityDisplayProps, 'entity'> {
48
49
  entity: NegotiatorPuzzleEntity;
49
- completeEvent?: string;
50
+ completeEvent?: EventEmit<{
51
+ success: boolean;
52
+ score: number;
53
+ }>;
50
54
  }
51
55
  export declare function NegotiatorBoard({ entity, completeEvent, className, }: NegotiatorBoardProps): React.JSX.Element;
52
56
  export declare namespace NegotiatorBoard {
@@ -18,6 +18,7 @@
18
18
  * @packageDocumentation
19
19
  */
20
20
  import React from 'react';
21
+ import type { EventEmit } from '@almadar/core';
21
22
  import type { SlotItemData } from '../../TraitSlot';
22
23
  import type { EntityDisplayProps } from '../../../types';
23
24
  export interface SequencerPuzzleEntity {
@@ -61,9 +62,14 @@ export interface SequencerBoardProps extends Omit<EntityDisplayProps, 'entity'>
61
62
  /** Playback speed in ms per step */
62
63
  stepDurationMs?: number;
63
64
  /** Emits UI:{playEvent} with { sequence: string[] } */
64
- playEvent?: string;
65
+ playEvent?: EventEmit<{
66
+ sequence: string[];
67
+ }>;
65
68
  /** Emits UI:{completeEvent} with { success: boolean } */
66
- completeEvent?: string;
69
+ completeEvent?: EventEmit<{
70
+ success: boolean;
71
+ sequence: string[];
72
+ }>;
67
73
  }
68
74
  export declare function SequencerBoard({ entity, categoryColors, stepDurationMs, playEvent, completeEvent, className, }: SequencerBoardProps): React.JSX.Element;
69
75
  export declare namespace SequencerBoard {
@@ -10,6 +10,7 @@
10
10
  * Events emitted via completeEvent (default UI:PUZZLE_COMPLETE).
11
11
  */
12
12
  import React from 'react';
13
+ import type { EventEmit } from '@almadar/core';
13
14
  import type { EntityDisplayProps } from '../../../types';
14
15
  export interface SimulatorParameter {
15
16
  id: string;
@@ -46,7 +47,10 @@ export interface SimulatorPuzzleEntity {
46
47
  }
47
48
  export interface SimulatorBoardProps extends Omit<EntityDisplayProps, 'entity'> {
48
49
  entity: SimulatorPuzzleEntity;
49
- completeEvent?: string;
50
+ completeEvent?: EventEmit<{
51
+ success: boolean;
52
+ attempts: number;
53
+ }>;
50
54
  }
51
55
  export declare function SimulatorBoard({ entity, completeEvent, className, }: SimulatorBoardProps): React.JSX.Element;
52
56
  export declare namespace SimulatorBoard {
@@ -8,6 +8,7 @@
8
8
  * @packageDocumentation
9
9
  */
10
10
  import React from 'react';
11
+ import type { EventEmit } from '@almadar/core';
11
12
  import type { EntityDisplayProps } from '../../../types';
12
13
  import { type VariableDef } from './VariablePanel';
13
14
  export interface StateArchitectTransition {
@@ -65,9 +66,12 @@ export interface StateArchitectBoardProps extends Omit<EntityDisplayProps, 'enti
65
66
  /** Playback speed */
66
67
  stepDurationMs?: number;
67
68
  /** Emits UI:{testEvent} */
68
- testEvent?: string;
69
+ testEvent?: EventEmit<Record<string, never>>;
69
70
  /** Emits UI:{completeEvent} with { success, passedTests } */
70
- completeEvent?: string;
71
+ completeEvent?: EventEmit<{
72
+ success: boolean;
73
+ passedTests: number;
74
+ }>;
71
75
  }
72
76
  export declare function StateArchitectBoard({ entity, stepDurationMs, testEvent, completeEvent, className, }: StateArchitectBoardProps): React.JSX.Element;
73
77
  export declare namespace StateArchitectBoard {
@@ -1,21 +1,65 @@
1
+ import type { EventEmit } from '@almadar/core';
1
2
  import type { IsometricTile, IsometricUnit, IsometricFeature } from '../../types/isometric';
2
3
  export interface GameCanvas3DEventConfig {
3
4
  /** Event name for tile clicks */
4
- tileClickEvent?: string;
5
+ tileClickEvent?: EventEmit<{
6
+ tileId: string;
7
+ x: number;
8
+ z: number;
9
+ type?: string;
10
+ terrain?: string;
11
+ elevation?: number;
12
+ }>;
5
13
  /** Event name for unit clicks */
6
- unitClickEvent?: string;
14
+ unitClickEvent?: EventEmit<{
15
+ unitId: string;
16
+ x: number;
17
+ z: number;
18
+ unitType?: string;
19
+ name?: string;
20
+ team?: string;
21
+ faction?: string;
22
+ health?: number;
23
+ maxHealth?: number;
24
+ }>;
7
25
  /** Event name for feature clicks */
8
- featureClickEvent?: string;
26
+ featureClickEvent?: EventEmit<{
27
+ featureId: string;
28
+ x: number;
29
+ z: number;
30
+ type?: string;
31
+ elevation?: number;
32
+ }>;
9
33
  /** Event name for canvas clicks */
10
- canvasClickEvent?: string;
34
+ canvasClickEvent?: EventEmit<{
35
+ clientX: number;
36
+ clientY: number;
37
+ button: number;
38
+ }>;
11
39
  /** Event name for tile hover */
12
- tileHoverEvent?: string;
40
+ tileHoverEvent?: EventEmit<{
41
+ tileId: string;
42
+ x: number;
43
+ z: number;
44
+ type?: string;
45
+ }>;
13
46
  /** Event name for tile leave */
14
- tileLeaveEvent?: string;
47
+ tileLeaveEvent?: EventEmit<Record<string, never>>;
15
48
  /** Event name for unit animation changes */
16
- unitAnimationEvent?: string;
49
+ unitAnimationEvent?: EventEmit<{
50
+ unitId: string;
51
+ state: string;
52
+ timestamp: number;
53
+ }>;
17
54
  /** Event name for camera changes */
18
- cameraChangeEvent?: string;
55
+ cameraChangeEvent?: EventEmit<{
56
+ position: {
57
+ x: number;
58
+ y: number;
59
+ z: number;
60
+ };
61
+ timestamp: number;
62
+ }>;
19
63
  }
20
64
  /** Minimal mouse event interface — satisfied by both React.MouseEvent and ThreeEvent<MouseEvent> */
21
65
  export interface MinimalMouseEvent {
@@ -17069,6 +17069,7 @@ var init_Tabs = __esm({
17069
17069
  defaultActiveTab,
17070
17070
  activeTab: controlledActiveTab,
17071
17071
  onTabChange,
17072
+ tabChangeEvent,
17072
17073
  variant = "default",
17073
17074
  orientation = "horizontal",
17074
17075
  className
@@ -17091,6 +17092,9 @@ var init_Tabs = __esm({
17091
17092
  setInternalActiveTab(tabId);
17092
17093
  }
17093
17094
  onTabChange?.(tabId);
17095
+ if (tabChangeEvent) {
17096
+ eventBus.emit(`UI:${tabChangeEvent}`, { tabId });
17097
+ }
17094
17098
  if (tabEvent) {
17095
17099
  eventBus.emit(`UI:${tabEvent}`, { tabId });
17096
17100
  }
@@ -17171,7 +17175,7 @@ var init_Tabs = __esm({
17171
17175
  isActive ? variant === "pills" ? "text-primary-foreground font-bold" : "text-foreground font-bold" : "text-muted-foreground hover:text-foreground"
17172
17176
  ),
17173
17177
  children: [
17174
- item.icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { icon: item.icon, size: "sm" }),
17178
+ item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: item.icon, size: "sm" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { icon: item.icon, size: "sm" })),
17175
17179
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: isActive ? "semibold" : "normal", className: "!text-inherit", children: item.label }),
17176
17180
  item.badge !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", size: "sm", children: item.badge })
17177
17181
  ]
@@ -17024,6 +17024,7 @@ var init_Tabs = __esm({
17024
17024
  defaultActiveTab,
17025
17025
  activeTab: controlledActiveTab,
17026
17026
  onTabChange,
17027
+ tabChangeEvent,
17027
17028
  variant = "default",
17028
17029
  orientation = "horizontal",
17029
17030
  className
@@ -17046,6 +17047,9 @@ var init_Tabs = __esm({
17046
17047
  setInternalActiveTab(tabId);
17047
17048
  }
17048
17049
  onTabChange?.(tabId);
17050
+ if (tabChangeEvent) {
17051
+ eventBus.emit(`UI:${tabChangeEvent}`, { tabId });
17052
+ }
17049
17053
  if (tabEvent) {
17050
17054
  eventBus.emit(`UI:${tabEvent}`, { tabId });
17051
17055
  }
@@ -17126,7 +17130,7 @@ var init_Tabs = __esm({
17126
17130
  isActive ? variant === "pills" ? "text-primary-foreground font-bold" : "text-foreground font-bold" : "text-muted-foreground hover:text-foreground"
17127
17131
  ),
17128
17132
  children: [
17129
- item.icon && /* @__PURE__ */ jsx(Icon, { icon: item.icon, size: "sm" }),
17133
+ item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: item.icon, size: "sm" }) : /* @__PURE__ */ jsx(Icon, { icon: item.icon, size: "sm" })),
17130
17134
  /* @__PURE__ */ jsx(Typography, { variant: "small", weight: isActive ? "semibold" : "normal", className: "!text-inherit", children: item.label }),
17131
17135
  item.badge !== void 0 && /* @__PURE__ */ jsx(Badge, { variant: "default", size: "sm", children: item.badge })
17132
17136
  ]
@@ -16859,6 +16859,7 @@ var init_Tabs = __esm({
16859
16859
  defaultActiveTab,
16860
16860
  activeTab: controlledActiveTab,
16861
16861
  onTabChange,
16862
+ tabChangeEvent,
16862
16863
  variant = "default",
16863
16864
  orientation = "horizontal",
16864
16865
  className
@@ -16881,6 +16882,9 @@ var init_Tabs = __esm({
16881
16882
  setInternalActiveTab(tabId);
16882
16883
  }
16883
16884
  onTabChange?.(tabId);
16885
+ if (tabChangeEvent) {
16886
+ eventBus.emit(`UI:${tabChangeEvent}`, { tabId });
16887
+ }
16884
16888
  if (tabEvent) {
16885
16889
  eventBus.emit(`UI:${tabEvent}`, { tabId });
16886
16890
  }
@@ -16961,7 +16965,7 @@ var init_Tabs = __esm({
16961
16965
  isActive ? variant === "pills" ? "text-primary-foreground font-bold" : "text-foreground font-bold" : "text-muted-foreground hover:text-foreground"
16962
16966
  ),
16963
16967
  children: [
16964
- item.icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { icon: item.icon, size: "sm" }),
16968
+ item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: item.icon, size: "sm" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { icon: item.icon, size: "sm" })),
16965
16969
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: isActive ? "semibold" : "normal", className: "!text-inherit", children: item.label }),
16966
16970
  item.badge !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", size: "sm", children: item.badge })
16967
16971
  ]