@almadar/ui 2.4.0 → 2.5.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.
@@ -2,9 +2,9 @@ import { useAuthContext } from '../chunk-42WRQA7T.js';
2
2
  export { ENTITY_EVENTS, useAgentChat, useAuthContext, useCompile, useConnectGitHub, useCreateEntity, useDeepAgentGeneration, useDeleteEntity, useDisconnectGitHub, useEntities, useEntitiesByType, useEntity as useEntityById, useEntityMutations, useExtensions, useFileEditor, useFileSystem, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useInput, useOrbitalHistory, useOrbitalMutations, usePhysics, usePlayer, usePreview, useResolvedEntity, useSelectedEntity, useSendOrbitalEvent, useSingletonEntity, useUIEvents, useUpdateEntity, useValidation } from '../chunk-42WRQA7T.js';
3
3
  import { DEFAULT_CONFIG, renderStateMachineToDomData, parseContentSegments } from '../chunk-N6DJVKZ6.js';
4
4
  import '../chunk-3HJHHULT.js';
5
- import { VStack, HStack, Typography, Button, Icon, Box, Card, Avatar, Badge, SearchInput, Checkbox, Menu as Menu$1, Pagination, LoadingState, EmptyState, Modal, ErrorState, QuizBlock, CodeBlock, ScaledDiagram, MarkdownContent, Divider, ProgressBar, Stack, Select, Drawer, Toast, Tabs, Input, ThemeToggle, EntityDisplayEvents, HealthBar, ScoreDisplay, StateIndicator, Container } from '../chunk-HWZL7IZG.js';
6
- export { Accordion, Card2 as ActionCard, Alert, Avatar, Badge, Box, Breadcrumb, Button, ButtonGroup, CalendarGrid, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Center, ChartLegend, Checkbox, CodeBlock, ConditionalWrapper, Container, ControlButton, DataGrid, DataList, DataTable, DateRangeSelector, DayCell, DetailPanel, Divider, Drawer, EmptyState, EntityDisplayEvents, ErrorBoundary, ErrorState, FilterGroup, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormField, FormSectionHeader, GraphView, Grid, HStack, Heading, HealthBar, Icon, Input, InputGroup, Label, LawReferenceTooltip, LineChart, LoadingState, MarkdownContent, MasterDetail, Menu, Modal, Overlay, PageHeader, Pagination, Popover, ProgressBar, ProgressDots, QuizBlock, Radio, RelationSelect, RepeatableFormSection, ScaledDiagram, ScoreDisplay, SearchInput, Select, SidePanel, SimpleGrid, Skeleton, SlotContentRenderer, Spacer, Spinner, Sprite, Stack, StatCard, StateIndicator, Switch, Tabs, Text, TextHighlight, Textarea, ThemeSelector, ThemeToggle, TimeSlotCell, Toast, Tooltip, Typography, UISlotComponent, UISlotRenderer, VStack, ViolationAlert, WizardNavigation, WizardProgress, drawSprite } from '../chunk-HWZL7IZG.js';
7
- import '../chunk-DKQN5FVU.js';
5
+ import { VStack, HStack, Typography, Button, Icon, Box, Card, Avatar, Badge, SearchInput, Checkbox, Menu as Menu$1, Pagination, LoadingState, EmptyState, Modal, ErrorState, QuizBlock, CodeBlock, ScaledDiagram, MarkdownContent, Divider, ProgressBar, StatBadge, Stack, Select, Drawer, Toast, Tabs, Input, ThemeToggle, EntityDisplayEvents, StateIndicator, Container } from '../chunk-FYYU3CHN.js';
6
+ export { Accordion, ActionButtons, Card2 as ActionCard, Alert, Avatar, Badge, Box, Breadcrumb, Button, ButtonGroup, CalendarGrid, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Center, ChartLegend, Checkbox, CodeBlock, ConditionalWrapper, Container, ControlButton, DPad, DataGrid, DataList, DataTable, DateRangeSelector, DayCell, DetailPanel, Divider, Drawer, EmptyState, EntityDisplayEvents, ErrorBoundary, ErrorState, FilterGroup, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormField, FormSectionHeader, GraphView, Grid, HStack, Heading, HealthBar, Icon, Input, InputGroup, Label, LawReferenceTooltip, LineChart, LoadingState, MapView, MarkdownContent, MasterDetail, Menu, Modal, Overlay, PageHeader, Pagination, Popover, ProgressBar, ProgressDots, QuizBlock, Radio, RelationSelect, RepeatableFormSection, ScaledDiagram, ScoreDisplay, SearchInput, Select, SidePanel, SimpleGrid, Skeleton, SlotContentRenderer, Spacer, Spinner, Sprite, Stack, StatBadge, StatCard, StateIndicator, Switch, Tabs, Text, TextHighlight, Textarea, ThemeSelector, ThemeToggle, TimeSlotCell, Toast, Tooltip, Typography, UISlotComponent, UISlotRenderer, VStack, ViolationAlert, WizardNavigation, WizardProgress, drawSprite } from '../chunk-FYYU3CHN.js';
7
+ import '../chunk-YLKXEXBP.js';
8
8
  import { useTranslate } from '../chunk-GOZKH7QW.js';
9
9
  export { EntityDataProvider, I18nProvider, createTranslate, entityDataKeys, parseQueryBinding, useEntity, useEntityDataAdapter, useEntityDetail, useEntityList, useEntityListSuspense, useEntitySuspense, useQuerySingleton, useTranslate } from '../chunk-GOZKH7QW.js';
10
10
  import { useEventBus, useEventListener } from '../chunk-YXZM3WCF.js';
@@ -4598,6 +4598,193 @@ function IsometricCanvas({
4598
4598
  }
4599
4599
  IsometricCanvas.displayName = "IsometricCanvas";
4600
4600
  var IsometricCanvas_default = IsometricCanvas;
4601
+ var PLATFORM_COLORS = {
4602
+ ground: "#4a7c59",
4603
+ platform: "#7c6b4a",
4604
+ hazard: "#c0392b",
4605
+ goal: "#f1c40f"
4606
+ };
4607
+ var PLAYER_COLOR = "#3498db";
4608
+ var PLAYER_EYE_COLOR = "#ffffff";
4609
+ var SKY_GRADIENT_TOP = "#1a1a2e";
4610
+ var SKY_GRADIENT_BOTTOM = "#16213e";
4611
+ var GRID_COLOR = "rgba(255, 255, 255, 0.03)";
4612
+ function PlatformerCanvas({
4613
+ player,
4614
+ platforms = [],
4615
+ worldWidth = 800,
4616
+ worldHeight = 400,
4617
+ canvasWidth = 800,
4618
+ canvasHeight = 400,
4619
+ followCamera = true,
4620
+ bgColor,
4621
+ leftEvent = "MOVE_LEFT",
4622
+ rightEvent = "MOVE_RIGHT",
4623
+ jumpEvent = "JUMP",
4624
+ stopEvent = "STOP",
4625
+ className,
4626
+ entity
4627
+ }) {
4628
+ const canvasRef = useRef(null);
4629
+ const eventBus = useEventBus();
4630
+ const keysRef = useRef(/* @__PURE__ */ new Set());
4631
+ const resolvedPlayer = player ?? {
4632
+ x: entity?.x ?? 50,
4633
+ y: entity?.y ?? 300,
4634
+ width: entity?.width ?? 24,
4635
+ height: entity?.height ?? 32,
4636
+ vx: entity?.vx ?? 0,
4637
+ vy: entity?.vy ?? 0,
4638
+ grounded: entity?.grounded ?? false,
4639
+ facingRight: entity?.facingRight ?? true
4640
+ };
4641
+ const handleKeyDown = useCallback((e) => {
4642
+ if (keysRef.current.has(e.code)) return;
4643
+ keysRef.current.add(e.code);
4644
+ switch (e.code) {
4645
+ case "ArrowLeft":
4646
+ case "KeyA":
4647
+ eventBus.emit(`UI:${leftEvent}`, { direction: -1 });
4648
+ break;
4649
+ case "ArrowRight":
4650
+ case "KeyD":
4651
+ eventBus.emit(`UI:${rightEvent}`, { direction: 1 });
4652
+ break;
4653
+ case "ArrowUp":
4654
+ case "KeyW":
4655
+ case "Space":
4656
+ eventBus.emit(`UI:${jumpEvent}`, {});
4657
+ e.preventDefault();
4658
+ break;
4659
+ }
4660
+ }, [eventBus, leftEvent, rightEvent, jumpEvent]);
4661
+ const handleKeyUp = useCallback((e) => {
4662
+ keysRef.current.delete(e.code);
4663
+ switch (e.code) {
4664
+ case "ArrowLeft":
4665
+ case "KeyA":
4666
+ case "ArrowRight":
4667
+ case "KeyD":
4668
+ eventBus.emit(`UI:${stopEvent}`, {});
4669
+ break;
4670
+ }
4671
+ }, [eventBus, stopEvent]);
4672
+ useEffect(() => {
4673
+ window.addEventListener("keydown", handleKeyDown);
4674
+ window.addEventListener("keyup", handleKeyUp);
4675
+ return () => {
4676
+ window.removeEventListener("keydown", handleKeyDown);
4677
+ window.removeEventListener("keyup", handleKeyUp);
4678
+ };
4679
+ }, [handleKeyDown, handleKeyUp]);
4680
+ useEffect(() => {
4681
+ const canvas = canvasRef.current;
4682
+ if (!canvas) return;
4683
+ const ctx = canvas.getContext("2d");
4684
+ if (!ctx) return;
4685
+ const dpr = window.devicePixelRatio || 1;
4686
+ canvas.width = canvasWidth * dpr;
4687
+ canvas.height = canvasHeight * dpr;
4688
+ ctx.scale(dpr, dpr);
4689
+ let camX = 0;
4690
+ let camY = 0;
4691
+ if (followCamera) {
4692
+ camX = Math.max(0, Math.min(resolvedPlayer.x - canvasWidth / 2, worldWidth - canvasWidth));
4693
+ camY = Math.max(0, Math.min(resolvedPlayer.y - canvasHeight / 2 - 50, worldHeight - canvasHeight));
4694
+ }
4695
+ if (bgColor) {
4696
+ ctx.fillStyle = bgColor;
4697
+ ctx.fillRect(0, 0, canvasWidth, canvasHeight);
4698
+ } else {
4699
+ const grad = ctx.createLinearGradient(0, 0, 0, canvasHeight);
4700
+ grad.addColorStop(0, SKY_GRADIENT_TOP);
4701
+ grad.addColorStop(1, SKY_GRADIENT_BOTTOM);
4702
+ ctx.fillStyle = grad;
4703
+ ctx.fillRect(0, 0, canvasWidth, canvasHeight);
4704
+ }
4705
+ ctx.strokeStyle = GRID_COLOR;
4706
+ ctx.lineWidth = 1;
4707
+ const gridSize = 32;
4708
+ for (let gx = -camX % gridSize; gx < canvasWidth; gx += gridSize) {
4709
+ ctx.beginPath();
4710
+ ctx.moveTo(gx, 0);
4711
+ ctx.lineTo(gx, canvasHeight);
4712
+ ctx.stroke();
4713
+ }
4714
+ for (let gy = -camY % gridSize; gy < canvasHeight; gy += gridSize) {
4715
+ ctx.beginPath();
4716
+ ctx.moveTo(0, gy);
4717
+ ctx.lineTo(canvasWidth, gy);
4718
+ ctx.stroke();
4719
+ }
4720
+ for (const plat of platforms) {
4721
+ const px = plat.x - camX;
4722
+ const py = plat.y - camY;
4723
+ const color = PLATFORM_COLORS[plat.type ?? "ground"] ?? PLATFORM_COLORS.ground;
4724
+ ctx.fillStyle = color;
4725
+ ctx.fillRect(px, py, plat.width, plat.height);
4726
+ ctx.fillStyle = "rgba(255, 255, 255, 0.15)";
4727
+ ctx.fillRect(px, py, plat.width, 3);
4728
+ ctx.fillStyle = "rgba(0, 0, 0, 0.3)";
4729
+ ctx.fillRect(px, py + plat.height - 2, plat.width, 2);
4730
+ if (plat.type === "hazard") {
4731
+ ctx.strokeStyle = "#e74c3c";
4732
+ ctx.lineWidth = 2;
4733
+ for (let sx = px; sx < px + plat.width; sx += 12) {
4734
+ ctx.beginPath();
4735
+ ctx.moveTo(sx, py);
4736
+ ctx.lineTo(sx + 6, py + plat.height);
4737
+ ctx.stroke();
4738
+ }
4739
+ }
4740
+ if (plat.type === "goal") {
4741
+ ctx.fillStyle = "rgba(241, 196, 15, 0.5)";
4742
+ ctx.beginPath();
4743
+ ctx.arc(px + plat.width / 2, py - 10, 8, 0, Math.PI * 2);
4744
+ ctx.fill();
4745
+ }
4746
+ }
4747
+ const pw = resolvedPlayer.width ?? 24;
4748
+ const ph = resolvedPlayer.height ?? 32;
4749
+ const ppx = resolvedPlayer.x - camX;
4750
+ const ppy = resolvedPlayer.y - camY;
4751
+ ctx.fillStyle = PLAYER_COLOR;
4752
+ const radius = Math.min(pw, ph) * 0.25;
4753
+ ctx.beginPath();
4754
+ ctx.moveTo(ppx + radius, ppy);
4755
+ ctx.lineTo(ppx + pw - radius, ppy);
4756
+ ctx.quadraticCurveTo(ppx + pw, ppy, ppx + pw, ppy + radius);
4757
+ ctx.lineTo(ppx + pw, ppy + ph - radius);
4758
+ ctx.quadraticCurveTo(ppx + pw, ppy + ph, ppx + pw - radius, ppy + ph);
4759
+ ctx.lineTo(ppx + radius, ppy + ph);
4760
+ ctx.quadraticCurveTo(ppx, ppy + ph, ppx, ppy + ph - radius);
4761
+ ctx.lineTo(ppx, ppy + radius);
4762
+ ctx.quadraticCurveTo(ppx, ppy, ppx + radius, ppy);
4763
+ ctx.fill();
4764
+ const eyeY = ppy + ph * 0.3;
4765
+ const eyeSize = 3;
4766
+ const facingRight = resolvedPlayer.facingRight ?? true;
4767
+ const eyeOffsetX = facingRight ? pw * 0.55 : pw * 0.2;
4768
+ ctx.fillStyle = PLAYER_EYE_COLOR;
4769
+ ctx.beginPath();
4770
+ ctx.arc(ppx + eyeOffsetX, eyeY, eyeSize, 0, Math.PI * 2);
4771
+ ctx.fill();
4772
+ ctx.beginPath();
4773
+ ctx.arc(ppx + eyeOffsetX + 7, eyeY, eyeSize, 0, Math.PI * 2);
4774
+ ctx.fill();
4775
+ });
4776
+ return /* @__PURE__ */ jsx(
4777
+ "canvas",
4778
+ {
4779
+ ref: canvasRef,
4780
+ style: { width: canvasWidth, height: canvasHeight },
4781
+ className: cn("block rounded-lg border border-white/10", className),
4782
+ "data-testid": "platformer-canvas",
4783
+ tabIndex: 0
4784
+ }
4785
+ );
4786
+ }
4787
+ PlatformerCanvas.displayName = "PlatformerCanvas";
4601
4788
 
4602
4789
  // components/organisms/game/types/effects.ts
4603
4790
  var EMPTY_EFFECT_STATE = {
@@ -6644,76 +6831,6 @@ function usePhysics2D(options = {}) {
6644
6831
  reset
6645
6832
  };
6646
6833
  }
6647
- var sizeMap = {
6648
- sm: "text-xs px-2 py-1",
6649
- md: "text-sm px-3 py-1.5",
6650
- lg: "text-base px-4 py-2"
6651
- };
6652
- var variantMap = {
6653
- default: "bg-gray-800/80 border-gray-700",
6654
- primary: "bg-blue-900/80 border-blue-700",
6655
- success: "bg-green-900/80 border-green-700",
6656
- warning: "bg-yellow-900/80 border-yellow-700",
6657
- danger: "bg-red-900/80 border-red-700"
6658
- };
6659
- function StatBadge({
6660
- label,
6661
- value = 0,
6662
- max,
6663
- format = "number",
6664
- icon,
6665
- size = "md",
6666
- variant = "default",
6667
- className,
6668
- // Ignored config props (used for schema binding)
6669
- source: _source,
6670
- field: _field
6671
- }) {
6672
- const numValue = typeof value === "number" ? value : parseInt(String(value), 10) || 0;
6673
- return /* @__PURE__ */ jsxs(
6674
- "div",
6675
- {
6676
- className: cn(
6677
- "inline-flex items-center gap-2 rounded-lg border backdrop-blur-sm",
6678
- sizeMap[size] ?? sizeMap.md,
6679
- variantMap[variant] ?? variantMap.default,
6680
- className
6681
- ),
6682
- children: [
6683
- icon && /* @__PURE__ */ jsx("span", { className: "flex-shrink-0 text-lg", children: icon }),
6684
- /* @__PURE__ */ jsx("span", { className: "text-gray-400 font-medium", children: label }),
6685
- format === "hearts" && max && /* @__PURE__ */ jsx(
6686
- HealthBar,
6687
- {
6688
- current: numValue,
6689
- max,
6690
- format: "hearts",
6691
- size: size === "lg" ? "md" : "sm"
6692
- }
6693
- ),
6694
- format === "bar" && max && /* @__PURE__ */ jsx(
6695
- HealthBar,
6696
- {
6697
- current: numValue,
6698
- max,
6699
- format: "bar",
6700
- size: size === "lg" ? "md" : "sm"
6701
- }
6702
- ),
6703
- format === "number" && /* @__PURE__ */ jsx(
6704
- ScoreDisplay,
6705
- {
6706
- value: numValue,
6707
- size: size === "lg" ? "md" : "sm",
6708
- animated: true
6709
- }
6710
- ),
6711
- format === "text" && /* @__PURE__ */ jsx("span", { className: "font-bold text-white", children: value })
6712
- ]
6713
- }
6714
- );
6715
- }
6716
- StatBadge.displayName = "StatBadge";
6717
6834
  var positionMap = {
6718
6835
  top: "top-0 left-0 right-0 flex justify-between items-start p-4",
6719
6836
  bottom: "bottom-0 left-0 right-0 flex justify-between items-end p-4",
@@ -6729,9 +6846,14 @@ function convertElementsToStats(elements) {
6729
6846
  timer: "Time"
6730
6847
  };
6731
6848
  return {
6732
- label: el.label || labelMap[el.type] || el.type,
6849
+ label: el.label || labelMap[el.type ?? ""] || el.type || "",
6733
6850
  source,
6734
- field
6851
+ field,
6852
+ // Pass through direct values from compiled render-ui effects
6853
+ ...el.value !== void 0 && { value: el.value },
6854
+ ...el.icon !== void 0 && { icon: el.icon },
6855
+ ...el.format !== void 0 && { format: el.format },
6856
+ ...el.max !== void 0 && { max: el.max }
6735
6857
  };
6736
6858
  });
6737
6859
  }
@@ -6770,7 +6892,7 @@ function GameHud({
6770
6892
  );
6771
6893
  }
6772
6894
  GameHud.displayName = "GameHud";
6773
- var variantMap2 = {
6895
+ var variantMap = {
6774
6896
  primary: "bg-blue-600 hover:bg-blue-500 text-white border-blue-400 shadow-lg shadow-blue-500/25",
6775
6897
  secondary: "bg-gray-700 hover:bg-gray-600 text-white border-gray-500",
6776
6898
  ghost: "bg-transparent hover:bg-white/10 text-white border-white/20"
@@ -6849,7 +6971,7 @@ function GameMenu({
6849
6971
  "transition-all duration-200 transform",
6850
6972
  "hover:scale-105 active:scale-95",
6851
6973
  "focus:outline-none focus:ring-4 focus:ring-white/25",
6852
- variantMap2[option.variant ?? "secondary"] ?? variantMap2.secondary,
6974
+ variantMap[option.variant ?? "secondary"] ?? variantMap.secondary,
6853
6975
  option.disabled && "opacity-50 cursor-not-allowed hover:scale-100"
6854
6976
  ),
6855
6977
  style: {
@@ -13931,4 +14053,4 @@ function WorldMapTemplate({
13931
14053
  }
13932
14054
  WorldMapTemplate.displayName = "WorldMapTemplate";
13933
14055
 
13934
- export { ALL_PRESETS, AR_BOOK_FIELDS, ActionPalette, ActionTile, AuthLayout, BattleBoard, BattleTemplate, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, BuilderBoard, CanvasEffect, CastleBoard, CastleTemplate, Chart, ClassifierBoard, CodeView, CodeViewer, CollapsibleSection, CombatLog, ConfirmDialog, ContentRenderer, CounterTemplate, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DebuggerBoard, DialogueBox, DocumentViewer, StateMachineView as DomStateMachineVisualizer, DrawerSlot, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EventHandlerBoard, EventLog, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FormActions, FormLayout, FormSection, GameAudioContext, GameAudioProvider, GameAudioToggle, GameHud, GameMenu, GameOverScreen, GameShell, GameTemplate, GenericAppTemplate, GraphCanvas, Header, IDENTITY_BOOK_FIELDS, InventoryPanel, IsometricCanvas, JazariStateMachine, List, MediaGallery, Meter, ModalSlot, Navigation, NegotiatorBoard, NotifyListener, ObjectRulePanel, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, PhysicsManager, RuleEditor, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, Section, SequenceBar, SequencerBoard, Sidebar, SignaturePad, SimulationCanvas, SimulationControls, SimulationGraph, SimulatorBoard, Split, SplitPane, StateArchitectBoard, StateMachineView, StateNode2 as StateNode, StatusBar, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, Table, TerrainPalette, Timeline, ToastSlot, TraitSlot, TraitStateViewer, TransitionArrow, UncontrolledBattleBoard, VariablePanel, WizardContainer, WorldMapBoard, WorldMapTemplate, applyTemporaryEffect, calculateAttackTargets, calculateDamage, calculateValidMoves, combatAnimations, combatClasses, combatEffects, createInitialGameState, createUnitAnimationState, generateCombatMessage, getCurrentFrame, inferDirection, isoToScreen, mapBookData, pendulum, projectileMotion, resolveFieldMap, resolveFrame, resolveSheetDirection, screenToIso, springOscillator, tickAnimationState, transitionAnimation, useBattleState, useCamera, useGameAudio, useGameAudioContext, useImageCache, usePhysics2D, useSpriteAnimations };
14056
+ export { ALL_PRESETS, AR_BOOK_FIELDS, ActionPalette, ActionTile, AuthLayout, BattleBoard, BattleTemplate, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, BuilderBoard, CanvasEffect, CastleBoard, CastleTemplate, Chart, ClassifierBoard, CodeView, CodeViewer, CollapsibleSection, CombatLog, ConfirmDialog, ContentRenderer, CounterTemplate, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DebuggerBoard, DialogueBox, DocumentViewer, StateMachineView as DomStateMachineVisualizer, DrawerSlot, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EventHandlerBoard, EventLog, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FormActions, FormLayout, FormSection, GameAudioContext, GameAudioProvider, GameAudioToggle, GameHud, GameMenu, GameOverScreen, GameShell, GameTemplate, GenericAppTemplate, GraphCanvas, Header, IDENTITY_BOOK_FIELDS, InventoryPanel, IsometricCanvas, JazariStateMachine, List, MediaGallery, Meter, ModalSlot, Navigation, NegotiatorBoard, NotifyListener, ObjectRulePanel, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, PhysicsManager, PlatformerCanvas, RuleEditor, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, Section, SequenceBar, SequencerBoard, Sidebar, SignaturePad, SimulationCanvas, SimulationControls, SimulationGraph, SimulatorBoard, Split, SplitPane, StateArchitectBoard, StateMachineView, StateNode2 as StateNode, StatusBar, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, Table, TerrainPalette, Timeline, ToastSlot, TraitSlot, TraitStateViewer, TransitionArrow, UncontrolledBattleBoard, VariablePanel, WizardContainer, WorldMapBoard, WorldMapTemplate, applyTemporaryEffect, calculateAttackTargets, calculateDamage, calculateValidMoves, combatAnimations, combatClasses, combatEffects, createInitialGameState, createUnitAnimationState, generateCombatMessage, getCurrentFrame, inferDirection, isoToScreen, mapBookData, pendulum, projectileMotion, resolveFieldMap, resolveFrame, resolveSheetDirection, screenToIso, springOscillator, tickAnimationState, transitionAnimation, useBattleState, useCamera, useGameAudio, useGameAudioContext, useImageCache, usePhysics2D, useSpriteAnimations };
@@ -1,5 +1,5 @@
1
- import { ThemeProvider, useTheme } from '../chunk-DKQN5FVU.js';
2
- export { BUILT_IN_THEMES, ThemeContext_default as ThemeContext, ThemeProvider, UISlotContext, UISlotProvider, useSlotContent, useSlotHasContent, useTheme, useUISlots } from '../chunk-DKQN5FVU.js';
1
+ import { ThemeProvider, useTheme } from '../chunk-YLKXEXBP.js';
2
+ export { BUILT_IN_THEMES, ThemeContext_default as ThemeContext, ThemeProvider, UISlotContext, UISlotProvider, useSlotContent, useSlotHasContent, useTheme, useUISlots } from '../chunk-YLKXEXBP.js';
3
3
  import '../chunk-3JGAROCW.js';
4
4
  import '../chunk-PKBMQBKP.js';
5
5
  import { createContext, useCallback, useMemo, useContext } from 'react';
@@ -1,5 +1,5 @@
1
- import { SuspenseConfigProvider } from '../chunk-HWZL7IZG.js';
2
- import { ThemeProvider } from '../chunk-DKQN5FVU.js';
1
+ import { SuspenseConfigProvider } from '../chunk-FYYU3CHN.js';
2
+ import { ThemeProvider } from '../chunk-YLKXEXBP.js';
3
3
  import { SelectionProvider, EntityDataProvider } from '../chunk-GOZKH7QW.js';
4
4
  export { SelectionContext, SelectionProvider, useSelection, useSelectionOptional } from '../chunk-GOZKH7QW.js';
5
5
  import { useEventBus, EventBusProvider } from '../chunk-YXZM3WCF.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "main": "./dist/components/index.js",
@@ -74,60 +74,63 @@
74
74
  "@almadar/evaluator": ">=2.0.0",
75
75
  "@almadar/patterns": ">=2.0.0",
76
76
  "clsx": "^2.1.0",
77
- "tailwind-merge": "^2.2.0",
77
+ "leaflet": "1.9.4",
78
78
  "lucide-react": "^0.344.0",
79
+ "react-leaflet": "^4.2.1",
79
80
  "react-markdown": "^9.0.0",
81
+ "react-syntax-highlighter": "^16.1.0",
82
+ "rehype-katex": "^7.0.0",
80
83
  "remark-gfm": "^4.0.0",
81
84
  "remark-math": "^6.0.0",
82
- "rehype-katex": "^7.0.0",
83
- "react-syntax-highlighter": "^16.1.0"
85
+ "tailwind-merge": "^2.2.0"
84
86
  },
85
87
  "peerDependencies": {
88
+ "@react-three/drei": "^9.92.0 || ^10.0.0",
89
+ "@react-three/fiber": "^8.15.0",
90
+ "@tanstack/react-query": "^5.0.0",
86
91
  "react": ">=18.0.0",
87
92
  "react-dom": ">=18.0.0",
88
93
  "react-router-dom": "^7.0.0",
89
- "@tanstack/react-query": "^5.0.0",
90
- "three": "^0.160.0",
91
- "@react-three/fiber": "^8.15.0",
92
- "@react-three/drei": "^9.92.0 || ^10.0.0"
94
+ "three": "^0.160.0"
93
95
  },
94
96
  "devDependencies": {
95
- "react": "^19.0.0",
96
- "react-dom": "^19.0.0",
97
- "react-router-dom": "^7.13.0",
98
- "@tanstack/react-query": "^5.0.0",
99
- "@types/react": "^19.0.0",
100
- "@types/react-dom": "^19.0.0",
101
- "@types/three": "^0.160.0",
97
+ "@almadar/eslint-plugin": ">=2.3.0",
98
+ "@storybook/addon-docs": "^10.2.6",
102
99
  "@storybook/addon-links": "^10.2.6",
103
100
  "@storybook/addon-themes": "^10.2.6",
104
101
  "@storybook/react": "^10.2.6",
105
102
  "@storybook/react-vite": "^10.2.6",
106
- "storybook": "^10.2.6",
103
+ "@tanstack/react-query": "^5.0.0",
104
+ "@testing-library/jest-dom": "^6.4.0",
105
+ "@testing-library/react": "^14.2.0",
106
+ "@testing-library/user-event": "^14.5.0",
107
+ "@types/leaflet": "1.9.21",
108
+ "@types/node": "^22.0.0",
109
+ "@types/react": "^19.0.0",
110
+ "@types/react-dom": "^19.0.0",
111
+ "@types/react-syntax-highlighter": "^15.5.0",
112
+ "@types/three": "^0.160.0",
113
+ "@typescript-eslint/parser": "8.56.0",
107
114
  "@vitejs/plugin-react": "^4.2.0",
108
- "babel-plugin-react-compiler": "19.0.0-beta-af1b7da-20250417",
109
- "react-compiler-runtime": "19.0.0-beta-af1b7da-20250417",
115
+ "@vitest/ui": "^1.4.0",
110
116
  "autoprefixer": "^10.4.0",
117
+ "babel-plugin-react-compiler": "19.0.0-beta-af1b7da-20250417",
118
+ "eslint": "10.0.0",
119
+ "eslint-plugin-react-compiler": "19.1.0-rc.2",
120
+ "jsdom": "^24.0.0",
121
+ "katex": "^0.16.0",
111
122
  "postcss": "^8.4.35",
123
+ "react": "^19.0.0",
124
+ "react-compiler-runtime": "19.0.0-beta-af1b7da-20250417",
125
+ "react-dom": "^19.0.0",
126
+ "react-router-dom": "^7.13.0",
127
+ "storybook": "^10.2.6",
112
128
  "tailwindcss": "^3.4.0",
113
129
  "tsup": "^8.0.0",
130
+ "tsx": "^4.7.0",
114
131
  "typescript": "^5.4.0",
115
132
  "vite": "^5.2.0",
116
- "tsx": "^4.7.0",
117
- "vitest": "^1.4.0",
118
- "@testing-library/react": "^14.2.0",
119
- "@testing-library/jest-dom": "^6.4.0",
120
- "@testing-library/user-event": "^14.5.0",
121
- "@vitest/ui": "^1.4.0",
122
- "jsdom": "^24.0.0",
123
- "@storybook/addon-docs": "^10.2.6",
124
- "@types/react-syntax-highlighter": "^15.5.0",
125
- "katex": "^0.16.0",
126
- "@types/node": "^22.0.0",
127
- "eslint": "10.0.0",
128
- "@typescript-eslint/parser": "8.56.0",
129
- "@almadar/eslint-plugin": ">=2.3.0",
130
- "eslint-plugin-react-compiler": "19.1.0-rc.2"
133
+ "vitest": "^1.4.0"
131
134
  },
132
135
  "repository": {
133
136
  "type": "git",