@almadar/shell-web 1.0.0 → 1.1.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 (70) hide show
  1. package/dist/AvlGlyph-PIXU6QH5.js +5 -0
  2. package/dist/AvlStateMachine-CKGMECMG.js +8 -0
  3. package/dist/{AvlTransitionDetail-63SD6GZF.js → AvlTransitionDetail-QZX6G5KJ.js} +4 -5
  4. package/dist/AvlTransitionExplainer-26WLEIC6.js +11 -0
  5. package/dist/BehaviorView-JLZ4PKWY.js +10 -0
  6. package/dist/{FileTree-BCFnBEuQ.d.ts → FileTree-B3GDAjaQ.d.ts} +131 -4
  7. package/dist/{FlowCanvas-AUMTWMNG.js → FlowCanvas-RPII4V24.js} +10 -13
  8. package/dist/{FlowCanvas-3JRMNJLV.css → FlowCanvas-VWUPMBKB.css} +189 -191
  9. package/dist/{GameAudioProvider-ceM_n0ey.d.ts → GameAudioProvider-D7wo5ryN.d.ts} +1 -1
  10. package/dist/{KernelEngineContext-CcxGYtlr.d.ts → KernelEngineContext-CPeWQMAz.d.ts} +15 -2
  11. package/dist/ModuleCard-NJD6JQGD.js +6 -0
  12. package/dist/{OrbInspector-QCPEPUPH.js → OrbInspector-OWWKPOBF.js} +10 -13
  13. package/dist/{OrbInspector-MHLJ6OEE.css → OrbInspector-VMTMZHNQ.css} +189 -191
  14. package/dist/{Select-B-iDdnvE.d.ts → Select-C2Uq6t86.d.ts} +1 -1
  15. package/dist/{UISlotRenderer-KVFO6J7R.css → UISlotRenderer-BIS6KT7T.css} +189 -191
  16. package/dist/{UISlotRenderer-C7WWOK43.js → UISlotRenderer-PY7FIJXN.js} +10 -13
  17. package/dist/avl/index.css +189 -191
  18. package/dist/avl/index.d.ts +19 -7
  19. package/dist/avl/index.js +157 -26
  20. package/dist/{chunk-TUPZWTRE.js → chunk-2WGR4TDJ.js} +464 -35
  21. package/dist/{chunk-SP5CDJ6K.js → chunk-4YJ53G7S.js} +3 -3
  22. package/dist/{chunk-HH5KSMH5.js → chunk-7N6ZPHQ5.js} +1 -1
  23. package/dist/{chunk-CPLN6NBQ.js → chunk-AGVSO4WY.js} +2 -3
  24. package/dist/{chunk-UXLE3IPR.js → chunk-FAKU5F62.js} +205 -4
  25. package/dist/{chunk-TXAUOLWZ.js → chunk-M74BCDBQ.js} +1 -1
  26. package/dist/{chunk-LHP2TK7O.js → chunk-MS4K3K2R.js} +2908 -4574
  27. package/dist/{chunk-K4MOPSEL.js → chunk-OWNG4JZI.js} +3 -4
  28. package/dist/{chunk-AB3X7QTE.js → chunk-PRLHKBXG.js} +1 -2
  29. package/dist/{chunk-X3DMMX27.js → chunk-VHC2M26B.js} +1 -1
  30. package/dist/{chunk-E6KA4J6N.js → chunk-VUIACGDU.js} +3 -4
  31. package/dist/{chunk-ROICKAU7.js → chunk-YYIHRIDH.js} +1 -1
  32. package/dist/{chunk-3VZ36ZKO.js → chunk-ZDRDJKYB.js} +5 -2
  33. package/dist/components/index.css +189 -191
  34. package/dist/components/index.d.ts +417 -173
  35. package/dist/components/index.js +14 -17
  36. package/dist/core.d.ts +3 -3
  37. package/dist/{fx-CmQjnHmT.d.ts → fx-Br8zjvu9.d.ts} +6 -6
  38. package/dist/index.d.ts +4 -0
  39. package/dist/index.js +2 -2
  40. package/dist/{kernel-client-TZKGHJRY.js → kernel-client-JW6OH5FX.js} +24 -3
  41. package/dist/{kernel-wire-wNdAPfhJ.d.ts → kernel-wire-DGAySGhX.d.ts} +7 -0
  42. package/dist/lib/index.d.ts +2 -3
  43. package/dist/lib/index.js +2 -3
  44. package/dist/providers/index.css +189 -191
  45. package/dist/providers/index.d.ts +6 -8
  46. package/dist/providers/index.js +10 -14
  47. package/dist/runtime/index.css +189 -191
  48. package/dist/runtime/index.d.ts +6 -1
  49. package/dist/runtime/index.js +10 -13
  50. package/dist/test-support.js +2 -2
  51. package/dist/{paintDispatch-CuJLsr9Y.d.ts → verificationRegistry-oopV1J1n.d.ts} +127 -15
  52. package/package.json +8 -36
  53. package/dist/AvlGlyph-EPJKFEO3.js +0 -6
  54. package/dist/AvlStateMachine-RKZIKNGC.js +0 -9
  55. package/dist/AvlTransitionExplainer-ZBTLOM3T.js +0 -12
  56. package/dist/BehaviorView-YS5G4GNB.js +0 -11
  57. package/dist/Canvas3DHost-BkZQB5l2.d.ts +0 -552
  58. package/dist/ModuleCard-QHDGK5XK.js +0 -7
  59. package/dist/avl-3d-context-BycmO6tG.d.ts +0 -201
  60. package/dist/avl-schema-parser-CtJxJ9KU.d.ts +0 -132
  61. package/dist/avl-zoom-state-CKMVuBFg.d.ts +0 -17
  62. package/dist/chunk-4T3P43NS.js +0 -1133
  63. package/dist/chunk-DZBQA2OW.js +0 -176
  64. package/dist/chunk-EOWMARUB.js +0 -16
  65. package/dist/chunk-GFXCPUMX.js +0 -1334
  66. package/dist/chunk-ILZ7ORX7.js +0 -432
  67. package/dist/three/index.css +0 -503
  68. package/dist/three/index.d.ts +0 -1185
  69. package/dist/three/index.js +0 -3908
  70. package/dist/verificationRegistry-CVrcxG1s.d.ts +0 -122
@@ -1,29 +1,26 @@
1
1
  "use client";
2
2
  export { assertUniqueSlotsPerHost } from '../chunk-5QTYQTPS.js';
3
- export { BehaviorView } from '../chunk-ROICKAU7.js';
4
- export { ModuleCard } from '../chunk-E6KA4J6N.js';
3
+ export { BehaviorView } from '../chunk-YYIHRIDH.js';
4
+ export { ModuleCard } from '../chunk-VUIACGDU.js';
5
5
  import { JsonTreeEditor } from '../chunk-ILQXJ2AR.js';
6
6
  export { JsonTreeEditor } from '../chunk-ILQXJ2AR.js';
7
7
  export { SharedEntityStoreContext, createSharedEntityStore, runTickFrame, useAgentChat, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useExtensions, useFileEditor, useFileSystem, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, usePreview, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSharedEntityStoreContext, useTickVisibility, useTraitListens, useUIEvents, useValidation } from '../chunk-UU57VNS2.js';
8
- import { resolveSheetDirection, frameRect, GridPicker, FormSection } from '../chunk-LHP2TK7O.js';
9
- export { Card as ActionCard, ActionPalette, ActionTile, ActivationBlock, ActivityRail, AgentActivityFeed, AgentActivityRow, AgentChatFeed, AgentThinkingRow, Alert, AlgoGraphCanvas, AlgorithmCanvas, AnimatedCounter, AuthLayout, BiologyCanvas, BloomQuizBlock, BranchingLogicBuilder, Breadcrumb, ButtonGroup, COMPACT_MEDIA_QUERY, CalendarGrid, Canvas, Canvas2D, Carousel, ChangeList, Chart, ChartLegend, ChatBar, ChemistryCanvas, ChoiceButton, CodeBlock, CodeRunnerPanel, CommandPalette, CommitRow, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ControlButton, ControlGrid, CounterTemplate, DEFAULT_LIKERT_OPTION_KEYS, DEFAULT_MATRIX_COLUMN_KEYS, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DataGrid, DataList, DateRangePicker, DateRangeSelector, DetailPanel, DialogueBubble, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DockLayout, DocumentDetails, DocumentPanel, DocumentViewer, StateMachineView as DomStateMachineVisualizer, DrawShapeLayer, DrawSprite, DrawSpriteLayer, DrawText, DrawTextLayer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EmojiPicker, ErrorBoundary, ErrorState, FEATURE_COLORS, FLOOR_HEIGHT, FeatureCard, FeatureGrid, FilterGroup, Flex, FlipCard, FloatingActionButton, FloatingToolbar, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, FxOverlay, GameAudioContext, GameAudioCue, GameAudioProvider, GameAudioToggle, GameHud, GameMenu, GameShell, Gantt, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, GuestView, Header, HealthBar, IconButton, ImportPreviewTree, ImportProgress, ImportSourcePicker, InputGroup, JazariStateMachine, LearningCanvas, LearningScene3D, Lightbox, LikertScale, LineChart, LoadingState, MachinePanel, MapView, MarkdownContent, MasterDetailLayout, MathCanvas, MatrixQuestion, MediaGallery, Menu, Meter, Modal, ModalSlot, Navigation, NumberStepper, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, PageHeader, PageTransition, Pagination, PhysicsCanvas, PositionedCanvas, ProgressDots, PullToRefresh, QrScanner, QuizBlock, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, RichTextEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreDisplay, SearchInput, Section, SegmentRenderer, SequenceBar, SidePanel, Sidebar, SignaturePad, SimpleGrid, Skeleton, SkeletonTree, SlotContentRenderer, SocialProof, SortableList, Split, SplitPane, StarRating, StatBadge, StatCard, StatDisplay, StateGraph, StateJsonView, StateMachineView, SubagentTracePanel, SwipeableRow, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, TableView, Tabs, TagInput, Timeline, TimerDisplay, Toast, ToastSlot, TopNavItem, TraitFrame, TraitSlot, TraitStateViewer, UISlotComponent, UISlotRenderer, UploadDropZone, VersionDiff, ViolationAlert, VoteStack, WizardContainer, WizardNavigation, WizardProgress, activityRowFacts, applyCompletion, applySuggestions, arrowBetween, billboardLabel, createUnitAnimationState, cylinderBetween, dispatchCommandPaletteCommand, get3DClickPayload, getCurrentFrame, groupIntoConversations, inferDirection, isoToScreen, meshSphere, parseEditFocus, preloadCodeHighlighter, registerCodeLanguageLoader, renderPatternValue, resolveFrame, resolveSheetDirection, sanitizeRichHtml, screenToIso, tickAnimationState, toCodeLanguage, transitionAnimation, useCamera, useCompactLayout, useDockLayout, useGameAudio, useGameAudioContext, useImageCache } from '../chunk-LHP2TK7O.js';
8
+ import { resolveSheetDirection, frameRect, GridPicker, FormSection } from '../chunk-MS4K3K2R.js';
9
+ export { Card as ActionCard, ActionPalette, ActionTile, ActivationBlock, ActivityRail, AgentActivityFeed, AgentActivityRow, AgentChatFeed, AgentThinkingRow, Alert, AlgoGraphCanvas, AlgorithmCanvas, AnimatedCounter, AuthLayout, BiologyCanvas, BloomQuizBlock, BranchingLogicBuilder, Breadcrumb, ButtonGroup, COMPACT_MEDIA_QUERY, CalendarGrid, Canvas, Canvas2D, Carousel, ChangeList, Chart, ChartLegend, ChatBar, ChemistryCanvas, ChoiceButton, CodeBlock, CodeRunnerPanel, CommandPalette, CommitRow, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ControlButton, ControlGrid, CounterTemplate, DEFAULT_LIKERT_OPTION_KEYS, DEFAULT_MATRIX_COLUMN_KEYS, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DataGrid, DataList, DateRangePicker, DateRangeSelector, DetailPanel, DialogueBubble, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DockLayout, DocumentDetails, DocumentPanel, DocumentViewer, StateMachineView as DomStateMachineVisualizer, DrawFxLayer, DrawGroup, DrawMesh, DrawShape, DrawShapeLayer, DrawSkinnedMesh, DrawSprite, DrawSpriteLayer, DrawText, DrawTextLayer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EmojiPicker, ErrorBoundary, ErrorState, FEATURE_COLORS, FLOOR_HEIGHT, FeatureCard, FeatureGrid, FilterGroup, Flex, FlipCard, FloatingActionButton, FloatingToolbar, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, FxOverlay, GameAudioContext, GameAudioCue, GameAudioProvider, GameAudioToggle, GameHud, GameMenu, GameShell, Gantt, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, GuestView, Header, HealthBar, IconButton, ImportPreviewTree, ImportProgress, ImportSourcePicker, InputGroup, JazariStateMachine, LearningCanvas, Lightbox, LikertScale, LineChart, LoadingState, MachinePanel, MapView, MarkdownContent, MasterDetailLayout, MathCanvas, MatrixQuestion, MediaGallery, Menu, Meter, Modal, ModalSlot, Navigation, NumberStepper, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, PageHeader, PageTransition, Pagination, PhysicsCanvas, PositionedCanvas, ProgressDots, PullToRefresh, QrScanner, QuizBlock, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, RichTextEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreDisplay, SearchInput, Section, SegmentRenderer, SequenceBar, SidePanel, Sidebar, SignaturePad, SimpleGrid, Skeleton, SkeletonTree, SlotContentRenderer, SocialProof, SortableList, Split, SplitPane, StarRating, StatBadge, StatCard, StatDisplay, StateGraph, StateJsonView, StateMachineView, SubagentTracePanel, SwipeableRow, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, TableView, Tabs, TagInput, Timeline, TimerDisplay, Toast, ToastSlot, TopNavItem, TraitFrame, TraitSlot, TraitStateViewer, UISlotComponent, UISlotRenderer, UploadDropZone, VersionDiff, ViolationAlert, VoteStack, WizardContainer, WizardNavigation, WizardProgress, activityRowFacts, applyCompletion, applySuggestions, createUnitAnimationState, dispatchCommandPaletteCommand, getCurrentFrame, groupIntoConversations, inferDirection, isoToScreen, parseEditFocus, preloadCodeHighlighter, registerCodeLanguageLoader, renderPatternValue, resolveFrame, resolveSheetDirection, sanitizeRichHtml, screenToIso, tickAnimationState, toCodeLanguage, transitionAnimation, useCamera, useCompactLayout, useDockLayout, useGameAudio, useGameAudioContext, useImageCache } from '../chunk-MS4K3K2R.js';
10
10
  export { FileTree } from '../chunk-57DC34LY.js';
11
- import '../chunk-SP5CDJ6K.js';
12
- import '../chunk-CPLN6NBQ.js';
13
- import '../chunk-HH5KSMH5.js';
11
+ import '../chunk-4YJ53G7S.js';
12
+ import '../chunk-AGVSO4WY.js';
13
+ import '../chunk-7N6ZPHQ5.js';
14
14
  export { Accordion } from '../chunk-REXYVBUO.js';
15
15
  export { EmptyState } from '../chunk-AGXD77SL.js';
16
- import '../chunk-TXAUOLWZ.js';
17
- import { ThemedPortal } from '../chunk-AB3X7QTE.js';
18
- export { Popover, Tooltip } from '../chunk-AB3X7QTE.js';
19
- import '../chunk-DZBQA2OW.js';
20
- export { parseLessonSegments, parseMarkdownWithCodeBlocks } from '../chunk-TUPZWTRE.js';
21
- import '../chunk-TZZBINQY.js';
22
- export { DrawFxLayer, DrawGroup, DrawMesh, DrawShape, DrawSkinnedMesh } from '../chunk-4T3P43NS.js';
16
+ import '../chunk-M74BCDBQ.js';
23
17
  import '../chunk-PCR37T3U.js';
24
- import '../chunk-UXLE3IPR.js';
25
- import '../chunk-ILZ7ORX7.js';
26
- import '../chunk-3VZ36ZKO.js';
18
+ import { ThemedPortal } from '../chunk-PRLHKBXG.js';
19
+ export { Popover, Tooltip } from '../chunk-PRLHKBXG.js';
20
+ import '../chunk-FAKU5F62.js';
21
+ export { parseLessonSegments, parseMarkdownWithCodeBlocks } from '../chunk-2WGR4TDJ.js';
22
+ import '../chunk-TZZBINQY.js';
23
+ import '../chunk-ZDRDJKYB.js';
27
24
  export { claimDelivery, keyChord, mergeCaptureTables, parseQueryBinding, useAuthContext, useCanvasGestures, useDragReorder, useKeyboardRouter, useLongPress, usePageHead, usePullToRefresh, useQuerySingleton, useSwipeGesture } from '../chunk-PRXQGGCO.js';
28
25
  export { ALMADAR_DND_MIME, useDraggable, useDropZone } from '../chunk-VO2TTLS5.js';
29
26
  import '../chunk-AE7VCQB6.js';
package/dist/core.d.ts CHANGED
@@ -2,9 +2,9 @@ import * as React$1 from 'react';
2
2
  import React__default, { RefObject } from 'react';
3
3
  import { A11yProps, AssetUrl, EventKey, TextureAtlas, Tilesheet, SpriteSheetAtlas, EventPayload, EventEmit, FieldValue, SExpr, Asset, OrbitalSchema, OrbitalPage, NavStackEntry, IconFamily as IconFamily$1, JsonValue, SurfaceMode } from '@almadar/core';
4
4
  export { BusEvent, BusEventListener, BusEventSource, BusEventListener as EventListener, SurfaceMode, Unsubscribe, comparePathSpecificity, matchPath, matchPathAmong } from '@almadar/core';
5
- import { I as IconInput } from './fx-CmQjnHmT.js';
6
- export { B as Badge, b as BadgeColor, c as BadgeProps, d as BadgeSize, e as BadgeVariant, C as CONFETTI_BURST_KEYFRAMES, f as CONFETTI_COLORS, g as ColorToken, h as ConfettiParticle, D as DisplayField, i as DisplayFieldFormat, j as DisplayFieldVariant, F as FxItem, k as FxLifecycle, l as FxOverlayItem, m as FxOverlayKind, a as FxPreset, n as FxProceduralShape, o as FxSpace, p as FxView, q as Icon, r as IconAnimation, s as IconProps, t as IconSize, u as ImageSource, L as LinkAction, P as Point, R as Rect, U as UiError, v as createConfettiParticles, w as fxHash01, x as fxLifecycle, y as resolveFxView, z as resolveIcon } from './fx-CmQjnHmT.js';
7
- export { B as Button, a as ButtonProps, b as ButtonSize, c as ButtonVariant, I as Input, d as InputProps, P as PatternTile, e as PatternTileProps, f as PatternVariant, S as Select, g as SelectOption, h as SelectOptionGroup, i as SelectProps, j as getTileDimensions } from './Select-B-iDdnvE.js';
5
+ import { I as IconInput } from './fx-Br8zjvu9.js';
6
+ export { B as Badge, b as BadgeColor, c as BadgeProps, d as BadgeSize, e as BadgeVariant, C as CONFETTI_BURST_KEYFRAMES, f as CONFETTI_COLORS, g as ColorToken, h as ConfettiParticle, D as DisplayField, i as DisplayFieldFormat, j as DisplayFieldVariant, F as FxItem, k as FxLifecycle, l as FxOverlayItem, m as FxOverlayKind, a as FxPreset, n as FxProceduralShape, o as FxSpace, p as FxView, q as Icon, r as IconAnimation, s as IconProps, t as IconSize, u as ImageSource, L as LinkAction, P as Point, R as Rect, U as UiError, v as createConfettiParticles, w as fxHash01, x as fxLifecycle, y as resolveFxView, z as resolveIcon } from './fx-Br8zjvu9.js';
7
+ export { B as Button, a as ButtonProps, b as ButtonSize, c as ButtonVariant, I as Input, d as InputProps, P as PatternTile, e as PatternTileProps, f as PatternVariant, S as Select, g as SelectOption, h as SelectOptionGroup, i as SelectProps, j as getTileDimensions } from './Select-C2Uq6t86.js';
8
8
  export { E as EventBusContext, a as EventBusContextType, b as EventBusContextTypeExtended, c as EventBusProvider, V as VideoEmbed, d as VideoEmbedProps, e as VideoErrorPayload, f as VideoPlayPayload, g as VideoReadyPayload, h as getGlobalEventBus, s as setGlobalEventBus, u as useEmitEvent, i as useEventBus, j as useEventListener, k as useEventSubscription, l as useRootEventBus } from './EventBusProvider-BFFHfN4O.js';
9
9
  import { ClassValue } from 'clsx';
10
10
  import { LucideIcon } from 'lucide-react';
@@ -198,7 +198,7 @@ interface FxItem {
198
198
  id: string;
199
199
  /** Effect-kind key into the consumer-declared `FxPreset[]` table. */
200
200
  type: string;
201
- /** Canonical scene position; when absent the renderer derives it from `x`/`z`/`y`. */
201
+ /** Scene position `{x, y: ground row, z: height}`; the fx mechanic stamps it from `x`/`z`/`y`, and the layer refuses an item without it. */
202
202
  position?: ScenePos;
203
203
  /** Scene x in world units. */
204
204
  x: number;
@@ -253,11 +253,11 @@ interface FxPreset {
253
253
  /** Glow strength — soft shadow blur in world units around procedural particles. */
254
254
  glow?: number;
255
255
  /** Downward acceleration in world-units/sec² applied to the drift. */
256
- gravity?: number;
257
- /** Default drift velocities, world-units/sec. */
258
- vx?: number;
259
- vy?: number;
260
- vz?: number;
256
+ gravity: number;
257
+ /** Drift velocities in world-units/sec; an item's own velocity wins. `vy` is the height axis, read in 3D only. */
258
+ vx: number;
259
+ vy: number;
260
+ vz: number;
261
261
  /** Render substrate routing for this kind. */
262
262
  space?: FxSpace;
263
263
  /** Screen-space render kind for this kind. */
package/dist/index.d.ts CHANGED
@@ -130,6 +130,8 @@ interface BrowserStoreTransportOptions {
130
130
  secretPorts?: SecretPorts;
131
131
  /** The host's `os` port (`createFetchOsHost(fetch)`); absent, every `os` ask of a leg is denied. */
132
132
  os?: OsHostPort;
133
+ /** The browser's GPU answerer (the kernel module's `GpuHost`), installed into the kernel; absent, every `gpu/` ask answers `unsupported`. */
134
+ gpu?: KernelHostPorts['gpu'];
133
135
  }
134
136
  declare function openBrowserStoreTransport(options: BrowserStoreTransportOptions): Promise<EventTransport>;
135
137
  /**
@@ -152,6 +154,8 @@ interface BrowserHostOptions {
152
154
  tabs?: BrowserTabPort;
153
155
  /** The host's `os` port (`createFetchOsHost(fetch)`): the browser's only os operation is `os/fetch`; absent, every `os` ask is denied. */
154
156
  os?: OsHostPort;
157
+ /** The browser's GPU answerer (the kernel module's `GpuHost`), installed into the kernel: every `gpu/` ask is answered there and its bytes never reach this host; absent, a `gpu/` ask answers `unsupported`. */
158
+ gpu?: KernelHostPorts['gpu'];
155
159
  factory?: IDBFactory;
156
160
  /** The viewer's locale: a first visit starts with the entity's `instances` written for it. */
157
161
  locale?: string;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { runTickFrame, createTickDriver } from './chunk-AU7O65OX.js';
3
3
  export { createTickDriver, runTickFrame } from './chunk-AU7O65OX.js';
4
- import { wrapCallbackForEvent, validateSlotContent, local_store_transport_exports, pushPerfEntry, perfTimeAsync, perfTime, perfStore, perfStart, perfGauge, perfEnd, openLocalKernel, openBundledBrowserStore, openBrowserStoreTransport, openBrowserStore, openBrowserHost, nativeMemoryPersistence, getOrbitalVerification, eventRouteKey, ensureVerificationApi, createSlotSetter, createResidenceTransport, collectEmbeddedTraits, clearPerf, buildOrbitalsByTrait, browserStoreName, bindTraitStateGetter, bindEventBus, assertIsSlotManager, assertIsMultiSourceSlotManager, aggregateSlotContent, RendererContractViolationError, PERF_NAMESPACE, webHostActions } from './chunk-3VZ36ZKO.js';
5
- export { PERF_NAMESPACE, RendererContractViolationError, aggregateSlotContent, assertIsMultiSourceSlotManager, assertIsSlotManager, bindEventBus, bindTraitStateGetter, browserStoreName, buildOrbitalsByTrait, clearPerf, collectEmbeddedTraits, createResidenceTransport, createSlotSetter, ensureVerificationApi, eventRouteKey, getOrbitalVerification, nativeMemoryPersistence, openBrowserHost, openBrowserStore, openBrowserStoreTransport, openBundledBrowserStore, openLocalKernel, perfEnd, perfGauge, perfStart, perfStore, perfTime, perfTimeAsync, pushPerfEntry, validateSlotContent, wrapCallbackForEvent } from './chunk-3VZ36ZKO.js';
4
+ import { wrapCallbackForEvent, validateSlotContent, local_store_transport_exports, pushPerfEntry, perfTimeAsync, perfTime, perfStore, perfStart, perfGauge, perfEnd, openLocalKernel, openBundledBrowserStore, openBrowserStoreTransport, openBrowserStore, openBrowserHost, nativeMemoryPersistence, getOrbitalVerification, eventRouteKey, ensureVerificationApi, createSlotSetter, createResidenceTransport, collectEmbeddedTraits, clearPerf, buildOrbitalsByTrait, browserStoreName, bindTraitStateGetter, bindEventBus, assertIsSlotManager, assertIsMultiSourceSlotManager, aggregateSlotContent, RendererContractViolationError, PERF_NAMESPACE, webHostActions } from './chunk-ZDRDJKYB.js';
5
+ export { PERF_NAMESPACE, RendererContractViolationError, aggregateSlotContent, assertIsMultiSourceSlotManager, assertIsSlotManager, bindEventBus, bindTraitStateGetter, browserStoreName, buildOrbitalsByTrait, clearPerf, collectEmbeddedTraits, createResidenceTransport, createSlotSetter, ensureVerificationApi, eventRouteKey, getOrbitalVerification, nativeMemoryPersistence, openBrowserHost, openBrowserStore, openBrowserStoreTransport, openBundledBrowserStore, openLocalKernel, perfEnd, perfGauge, perfStart, perfStore, perfTime, perfTimeAsync, pushPerfEntry, validateSlotContent, wrapCallbackForEvent } from './chunk-ZDRDJKYB.js';
6
6
  import { __export, __reExport } from './chunk-G7DCAZ22.js';
7
7
  export * from '@almadar/shell-runtime/kernel/wire';
8
8
  export * from '@almadar/shell-runtime/kernel/decode';
@@ -2,10 +2,11 @@ import { createTickDriver, runTickFrame } from './chunk-AU7O65OX.js';
2
2
  import { presenceGroup, getTraitPresence } from './chunk-4YXBKHHM.js';
3
3
  import './chunk-G7DCAZ22.js';
4
4
  import { isJsonObject } from '@almadar/core';
5
- import { createLocalFold, traceResponse, paintResponse } from '@almadar/shell-runtime';
5
+ import { createLocalFold, paintResponse, traceResponse } from '@almadar/shell-runtime';
6
6
  import { TraitMountError } from '@almadar/shell-runtime/client/trait-mount-error';
7
7
  import { SessionEndedError } from '@almadar/shell-runtime/client/EventTransport';
8
8
  import { createLogger } from '@almadar/logger';
9
+ import { decodeHeldCompletion } from '@almadar/shell-runtime/kernel/decode';
9
10
 
10
11
  var log = createLogger("almadar:ui:kernel-client");
11
12
  var nextClientSerial = 0;
@@ -27,8 +28,9 @@ function createKernelClient(opts) {
27
28
  const { store, traitIndex, transport } = opts;
28
29
  let loaded;
29
30
  const configs = /* @__PURE__ */ new Map();
30
- const ready = opts.instance.then((k) => {
31
+ const ready = Promise.all([opts.instance, opts.gpu]).then(([k, gpu]) => {
31
32
  loaded = k;
33
+ if (gpu !== void 0) k.installGpu(gpu, (json) => deliverGpuCompletion(k, json));
32
34
  return k;
33
35
  });
34
36
  ready.catch(() => void 0);
@@ -273,13 +275,30 @@ function createKernelClient(opts) {
273
275
  store.notify();
274
276
  return { response, mode: parse(k.dispatchMode(request.runTick.trait)) };
275
277
  }
276
- const wire = parse(k.dispatch(traitName, request.entityId, request.event, payloadJson(request.payload)));
278
+ const wire = parse(request.heldPayload !== void 0 ? k.dispatchHeld(traitName, request.entityId, request.event, request.heldPayload) : k.dispatch(traitName, request.entityId, request.event, payloadJson(request.payload)));
277
279
  try {
278
280
  return await settleDispatch(k, wire, request, hooks, progress);
279
281
  } finally {
280
282
  endFlight(k, wire.flight);
281
283
  }
282
284
  };
285
+ const framePainters = /* @__PURE__ */ new Set();
286
+ const deliverGpuCompletion = (k, json) => {
287
+ const completion = decodeHeldCompletion(json);
288
+ if (completion === null) return;
289
+ const request = {
290
+ event: completion.event,
291
+ targetTrait: completion.traitName,
292
+ heldPayload: completion.heldPayload,
293
+ ...completion.entityId !== void 0 ? { entityId: completion.entityId } : {}
294
+ };
295
+ dispatchOne(request, [], false).then((outcome) => {
296
+ for (const paint of framePainters) paint([outcome]);
297
+ }).catch((error) => {
298
+ k.dropHeldPayload(completion.heldPayload);
299
+ log.error("gpu-completion-failed", { trait: completion.traitName, event: completion.event, error: error.message });
300
+ });
301
+ };
283
302
  const settleDispatch = async (k, wire, request, hooks, progress) => {
284
303
  log.debug("dispatch", { trait: wire.seed.trait, event: request.event, mode: wire.mode, legs: wire.serverLegs.length, success: wire.response.success, states: wire.response.states, effects: (wire.response.clientEffectsByTrait ?? []).map((e) => `${e.traitName}:${e.effect[0]}:${e.effect[1] ?? ""}`), emitted: wire.response.emittedEvents.map((e) => e.event) });
285
304
  trace(k, wire.response);
@@ -441,6 +460,7 @@ function createKernelClient(opts) {
441
460
  framePause: () => loaded?.framePause(),
442
461
  frameResume: () => loaded?.frameResume(),
443
462
  startFrames: (onFrame, schedule = defaultFrameScheduler) => {
463
+ framePainters.add(onFrame);
444
464
  const presence = getTraitPresence();
445
465
  const releases = visibleGroups.map(([, group]) => presence.watch(group));
446
466
  let stopped = false;
@@ -486,6 +506,7 @@ function createKernelClient(opts) {
486
506
  }).catch((error) => log.error("kernel-frame-failed", { error: error.message }));
487
507
  return () => {
488
508
  stopped = true;
509
+ framePainters.delete(onFrame);
489
510
  driver?.stop();
490
511
  releases.forEach((release2) => release2());
491
512
  };
@@ -1,3 +1,4 @@
1
+ import { KernelGpuHost } from '@almadar/shell-runtime/kernel/wire';
1
2
  import { KernelModule as KernelModule$1 } from '@almadar/shell-browser/kv';
2
3
  import './verification-C5pTeMJv.js';
3
4
 
@@ -11,6 +12,12 @@ import './verification-C5pTeMJv.js';
11
12
  /** The `Kernel` class `@almadar/kernel` exports: JSON strings in, JSON strings out. */
12
13
  interface KernelInstance {
13
14
  dispatch(traitName: string, entityId: string | undefined, event: string, payloadJson?: string): string;
15
+ /** Install the GPU answerer: every `gpu/` ask is held in the kernel and answered in ask order, and each outcome's route event reaches `completed` as `HeldGpuCompletion` JSON (`null` when it takes no route) for the host to dispatch with `dispatchHeld`. */
16
+ installGpu(gpu: KernelGpuHost, completed: (completionJson: string) => void): void;
17
+ /** `dispatch` with the payload the kernel holds under `heldPayload` (a gpu completion's), taken once. */
18
+ dispatchHeld(traitName: string, entityId: string | undefined, event: string, heldPayload: number): string;
19
+ /** Drop a held completion payload no dispatch will take. */
20
+ dropHeldPayload(heldPayload: number): boolean;
14
21
  /** A flight for work the kernel did not wire (a dispatch the host ran on its own, a frame's browser leg). */
15
22
  openFlight(): number;
16
23
  /** `applyServerResponse` in flight order (EXEC-CONC-8): a `FoldProgressWire` as JSON, folded now or queued behind an older flight. */
@@ -1,14 +1,13 @@
1
1
  import { FieldValue, EntityRow, EventKey, EnterAnimation } from '@almadar/core';
2
2
  export { AssetLoadStatus, BridgeHealth, CheckStatus, EffectTrace, EventLogEntry, OrbitalVerificationAPI, ServerResponseTrace, TraitStateSnapshot, TransitionTrace, VerificationCheck, VerificationSnapshot, VerificationSummary, getNestedValue } from '@almadar/core';
3
3
  export { p as profilerOnRender, u as usePerfBuffer } from '../perf-CKiBKbkw.js';
4
- export { T as TraitSnapshotGetter, b as bindCanvasCapture, a as bindConfigApplier, c as bindEventBus, d as bindLastDrawables, e as bindTraitStateGetter, f as clearVerification, g as getAllChecks, h as getBridgeHealth, i as getSnapshot, j as getSummary, k as getTraitSnapshots, l as getTransitions, m as getTransitionsForTrait, r as recordOrbitalResponse, n as recordServerResponse, o as recordTransition, p as recordingTransport, q as registerCheck, s as registerTraitSnapshot, t as serverEffectTraces, u as subscribeToVerification, v as updateAssetStatus, w as updateBridgeHealth, x as updateCheck, y as verifierAttached, z as waitForTransition } from '../verificationRegistry-CVrcxG1s.js';
4
+ export { T as TraitSnapshotGetter, b as bindCanvasCapture, a as bindConfigApplier, c as bindEventBus, d as bindLastDrawables, e as bindTraitStateGetter, f as clearVerification, g as getAllChecks, h as getBridgeHealth, i as getSnapshot, j as getSummary, k as getTraitSnapshots, l as getTransitions, m as getTransitionsForTrait, r as recordOrbitalResponse, n as recordServerResponse, o as recordTransition, p as recordingTransport, q as registerCheck, s as registerTraitSnapshot, t as serverEffectTraces, u as subscribeToVerification, v as updateAssetStatus, w as updateBridgeHealth, x as updateCheck, y as verifierAttached, z as waitForTransition } from '../verificationRegistry-oopV1J1n.js';
5
5
  export { A as ApplyOperatorInput, a as ApplyOperatorResult, C as ContentSegment, E as EDITOR_MOTIONS, b as EDITOR_OPERATORS, c as EditorMotion, d as EditorOperator, I as INDENT_UNIT, L as LessonSegment, e as applyMotion, f as applyOperator, i as isEditorMotion, g as isEditorOperator, m as motionRange, p as parseContentSegments, h as parseLessonSegments, j as parseMarkdownWithCodeBlocks } from '../parseLessonSegments-GpCeMrb2.js';
6
6
  export { D as DENSITY_ELEMENT_VARS, a as DENSITY_SPACING_VARS, b as DIAGRAM_VARS, E as ELEVATION_VARS, F as FlatVarEntry, G as GEOMETRY_VARS, I as ICONOGRAPHY_VARS, L as LEGACY_PREFIXES, M as MOTION_DURATION_KEYS, c as MOTION_EASING_KEYS, d as MOTION_INTENT_VARS, e as MOTION_SHAPE_VARS, S as SCENE_VARS, f as SURFACE_VARS, g as StringValueKey, h as TYPE_FAMILY_VARS, i as TYPE_HEADING_VARS, j as TYPE_INTENT_VARS, k as TYPE_SIZE_KEYS, T as ThemeMode, l as enterKeyframe, r as resolveThemeForRuntime, t as themeTokensToCssVars } from '../themeTokens-CRd8AEDF.js';
7
7
  export { a as PERF_NAMESPACE, P as PerfEntry, c as clearPerf, p as perfEnd, g as perfGauge, b as perfStart, d as perfTime, i as perfTimeAsync } from '../perf-Dr28-AgT.js';
8
8
  import 'react';
9
9
  import '../verification-C5pTeMJv.js';
10
- import '../paintDispatch-CuJLsr9Y.js';
11
- import '../fx-CmQjnHmT.js';
10
+ import '../fx-Br8zjvu9.js';
12
11
  import 'lucide-react';
13
12
  import '../EventBusProvider-BFFHfN4O.js';
14
13
  import '@almadar/shell-runtime/client/EventTransport';
package/dist/lib/index.js CHANGED
@@ -1,8 +1,7 @@
1
1
  "use client";
2
- export { EDITOR_MOTIONS, EDITOR_OPERATORS, ENTER_SLOT_CLASS, INDENT_UNIT, MAX_ENTER_DELAY, applyMotion, applyOperator, asEnterAnimation, clearDebugEvents, clearEntityProvider, clearGuardHistory, clearTicks, clearTraits, computeLineDiff, debug, debugCollision, debugError, debugGameState, debugGroup, debugGroupEnd, debugInput, debugPhysics, debugTable, debugTime, debugTimeEnd, debugWarn, enterClassName, getAllTicks, getAllTraits, getDebugEvents, getEntitiesByType, getEntityById, getEntitySnapshot, getEventsBySource, getEventsByType, getGuardEvaluationsForTrait, getGuardHistory, getNestedValue, getRecentEvents, getRecentGuardEvaluations, getTick, getTrait, initDebugShortcut, isDebugEnabled, isEditorMotion, isEditorOperator, logDebugEvent, logEffectExecuted, logError, logEventFired, logInfo, logStateChange, logWarning, motionRange, onDebugToggle, parseContentSegments, parseLessonSegments, parseMarkdownWithCodeBlocks2 as parseMarkdownWithCodeBlocks, profilerOnRender, recordGuardEvaluation, registerTick, registerTrait, resolveImageUrl, setDebugEnabled, setEntityProvider, setTickActive, subscribeToDebugEvents, subscribeToGuardChanges, subscribeToTickChanges, subscribeToTraitChanges, toggleDebug, unregisterTick, unregisterTrait, updateGuardResult, updateTickExecution, updateTraitState, usePerfBuffer } from '../chunk-TUPZWTRE.js';
2
+ export { EDITOR_MOTIONS, EDITOR_OPERATORS, ENTER_SLOT_CLASS, INDENT_UNIT, MAX_ENTER_DELAY, applyMotion, applyOperator, asEnterAnimation, bindCanvasCapture, bindConfigApplier, bindEventBus, bindLastDrawables, bindTraitStateGetter, clearDebugEvents, clearEntityProvider, clearGuardHistory, clearTicks, clearTraits, clearVerification, computeLineDiff, debug, debugCollision, debugError, debugGameState, debugGroup, debugGroupEnd, debugInput, debugPhysics, debugTable, debugTime, debugTimeEnd, debugWarn, enterClassName, getAllChecks, getAllTicks, getAllTraits, getBridgeHealth, getDebugEvents, getEntitiesByType, getEntityById, getEntitySnapshot, getEventsBySource, getEventsByType, getGuardEvaluationsForTrait, getGuardHistory, getNestedValue, getRecentEvents, getRecentGuardEvaluations, getSnapshot, getSummary, getTick, getTrait, getTraitSnapshots, getTransitions, getTransitionsForTrait, initDebugShortcut, isDebugEnabled, isEditableTarget, isEditorMotion, isEditorOperator, keyMapCode, logDebugEvent, logEffectExecuted, logError, logEventFired, logInfo, logStateChange, logWarning, motionRange, onDebugToggle, parseContentSegments, parseLessonSegments, parseMarkdownWithCodeBlocks2 as parseMarkdownWithCodeBlocks, profilerOnRender, recordGuardEvaluation, recordOrbitalResponse, recordServerResponse, recordTransition, recordingTransport, registerCheck, registerTick, registerTrait, registerTraitSnapshot, resolveImageUrl, resolveKeyMapEvent, serverEffectTraces, setDebugEnabled, setEntityProvider, setTickActive, subscribeToDebugEvents, subscribeToGuardChanges, subscribeToTickChanges, subscribeToTraitChanges, subscribeToVerification, toggleDebug, unregisterTick, unregisterTrait, updateAssetStatus, updateBridgeHealth, updateCheck, updateGuardResult, updateTickExecution, updateTraitState, usePerfBuffer, verifierAttached, waitForTransition } from '../chunk-2WGR4TDJ.js';
3
3
  export { arrowheadPath, brainIconPath, eightPointedStarPath, gearTeethPath, lockIconPath, pipeIconPath } from '../chunk-TZZBINQY.js';
4
- export { bindCanvasCapture, bindConfigApplier, bindEventBus, bindLastDrawables, bindTraitStateGetter, clearVerification, getAllChecks, getBridgeHealth, getSnapshot, getSummary, getTraitSnapshots, getTransitions, getTransitionsForTrait, isEditableTarget, keyMapCode, recordOrbitalResponse, recordServerResponse, recordTransition, recordingTransport, registerCheck, registerTraitSnapshot, resolveKeyMapEvent, serverEffectTraces, subscribeToVerification, updateAssetStatus, updateBridgeHealth, updateCheck, verifierAttached, waitForTransition } from '../chunk-ILZ7ORX7.js';
5
- export { PERF_NAMESPACE, clearPerf, perfEnd, perfGauge, perfStart, perfTime, perfTimeAsync } from '../chunk-3VZ36ZKO.js';
4
+ export { PERF_NAMESPACE, clearPerf, perfEnd, perfGauge, perfStart, perfTime, perfTimeAsync } from '../chunk-ZDRDJKYB.js';
6
5
  export { DENSITY_ELEMENT_VARS, DENSITY_SPACING_VARS, DIAGRAM_VARS, ELEVATION_VARS, GEOMETRY_VARS, ICONOGRAPHY_VARS, LEGACY_PREFIXES, MOTION_DURATION_KEYS, MOTION_EASING_KEYS, MOTION_INTENT_VARS, MOTION_SHAPE_VARS, SCENE_VARS, SURFACE_VARS, TYPE_FAMILY_VARS, TYPE_HEADING_VARS, TYPE_INTENT_VARS, TYPE_SIZE_KEYS, enterKeyframe, resolveThemeForRuntime, themeTokensToCssVars } from '../chunk-3BBUBJFF.js';
7
6
  import '../chunk-4YXBKHHM.js';
8
7
  import '../chunk-G7DCAZ22.js';
@@ -1160,7 +1160,195 @@ body {
1160
1160
  counter-reset: katexEqnNo mmlEqnNo;
1161
1161
  }
1162
1162
 
1163
- /* src/lib/drawable/three/Canvas3DLoadingState.css */
1163
+ /* src/lib/drawable/orbital/OrbitalCanvas3D.css */
1164
+ .game-canvas-3d {
1165
+ background: #1a1a2e;
1166
+ border-radius: 8px;
1167
+ }
1168
+ .game-canvas-3d canvas {
1169
+ display: block;
1170
+ width: 100%;
1171
+ height: 100%;
1172
+ }
1173
+ .game-canvas-3d--loading {
1174
+ display: flex;
1175
+ align-items: center;
1176
+ justify-content: center;
1177
+ background:
1178
+ linear-gradient(
1179
+ 135deg,
1180
+ #1a1a2e 0%,
1181
+ #16213e 100%);
1182
+ }
1183
+ .game-canvas-3d__loading {
1184
+ padding: 20px 40px;
1185
+ background: rgba(255, 255, 255, 0.1);
1186
+ border-radius: 8px;
1187
+ color: #ffffff;
1188
+ font-size: 16px;
1189
+ animation: pulse 1.5s ease-in-out infinite;
1190
+ }
1191
+ .game-canvas-3d--error {
1192
+ display: flex;
1193
+ align-items: center;
1194
+ justify-content: center;
1195
+ background:
1196
+ linear-gradient(
1197
+ 135deg,
1198
+ #2e1a1a 0%,
1199
+ #3e1616 100%);
1200
+ }
1201
+ .game-canvas-3d__error {
1202
+ position: relative;
1203
+ z-index: 1;
1204
+ padding: 20px 40px;
1205
+ background: rgba(255, 0, 0, 0.2);
1206
+ border: 1px solid rgba(255, 0, 0, 0.3);
1207
+ border-radius: 8px;
1208
+ color: #ff6b6b;
1209
+ font-size: 14px;
1210
+ }
1211
+ .game-canvas-3d__coordinates {
1212
+ position: absolute;
1213
+ bottom: 20px;
1214
+ left: 20px;
1215
+ padding: 8px 16px;
1216
+ background: rgba(0, 0, 0, 0.7);
1217
+ border-radius: 4px;
1218
+ color: #ffffff;
1219
+ font-family: monospace;
1220
+ font-size: 12px;
1221
+ pointer-events: none;
1222
+ z-index: 10;
1223
+ }
1224
+ .game-canvas-3d__tile-info {
1225
+ position: absolute;
1226
+ top: 20px;
1227
+ left: 20px;
1228
+ padding: 12px 16px;
1229
+ background: rgba(0, 0, 0, 0.8);
1230
+ border-radius: 6px;
1231
+ color: #ffffff;
1232
+ pointer-events: none;
1233
+ z-index: 10;
1234
+ min-width: 120px;
1235
+ }
1236
+ .tile-info__type {
1237
+ font-weight: 600;
1238
+ font-size: 14px;
1239
+ text-transform: capitalize;
1240
+ margin-bottom: 4px;
1241
+ }
1242
+ .tile-info__terrain {
1243
+ font-size: 12px;
1244
+ color: #aaaaaa;
1245
+ }
1246
+ @keyframes pulse {
1247
+ 0%, 100% {
1248
+ opacity: 1;
1249
+ }
1250
+ 50% {
1251
+ opacity: 0.5;
1252
+ }
1253
+ }
1254
+ .game-canvas-3d[data-camera-mode=isometric]::before {
1255
+ content: "Isometric";
1256
+ position: absolute;
1257
+ top: 20px;
1258
+ right: 20px;
1259
+ padding: 6px 12px;
1260
+ background: rgba(0, 0, 0, 0.6);
1261
+ border-radius: 4px;
1262
+ color: #ffffff;
1263
+ font-size: 11px;
1264
+ text-transform: uppercase;
1265
+ letter-spacing: 1px;
1266
+ pointer-events: none;
1267
+ }
1268
+ .game-canvas-3d[data-camera-mode=perspective]::before {
1269
+ content: "Perspective";
1270
+ position: absolute;
1271
+ top: 20px;
1272
+ right: 20px;
1273
+ padding: 6px 12px;
1274
+ background: rgba(0, 0, 0, 0.6);
1275
+ border-radius: 4px;
1276
+ color: #ffffff;
1277
+ font-size: 11px;
1278
+ text-transform: uppercase;
1279
+ letter-spacing: 1px;
1280
+ pointer-events: none;
1281
+ }
1282
+ .game-canvas-3d[data-camera-mode=top-down]::before {
1283
+ content: "Top Down";
1284
+ position: absolute;
1285
+ top: 20px;
1286
+ right: 20px;
1287
+ padding: 6px 12px;
1288
+ background: rgba(0, 0, 0, 0.6);
1289
+ border-radius: 4px;
1290
+ color: #ffffff;
1291
+ font-size: 11px;
1292
+ text-transform: uppercase;
1293
+ letter-spacing: 1px;
1294
+ pointer-events: none;
1295
+ }
1296
+ .game-canvas-3d[data-overlay=hidden] .game-canvas-3d__coordinates,
1297
+ .game-canvas-3d[data-overlay=hidden] .game-canvas-3d__tile-info,
1298
+ .game-canvas-3d[data-overlay=hidden]::before {
1299
+ display: none;
1300
+ }
1301
+ .game-canvas-3d[data-orientation=rotated] {
1302
+ }
1303
+ .game-canvas-3d canvas {
1304
+ cursor: crosshair;
1305
+ }
1306
+ .game-canvas-3d canvas:active {
1307
+ cursor: grabbing;
1308
+ }
1309
+ @media (max-width: 768px) {
1310
+ .game-canvas-3d__coordinates,
1311
+ .game-canvas-3d__tile-info {
1312
+ font-size: 10px;
1313
+ padding: 6px 10px;
1314
+ }
1315
+ .game-canvas-3d::before {
1316
+ font-size: 9px;
1317
+ padding: 4px 8px;
1318
+ }
1319
+ }
1320
+ .game-canvas-3d:focus {
1321
+ outline: 2px solid #4488ff;
1322
+ outline-offset: 2px;
1323
+ }
1324
+ .game-canvas-3d canvas {
1325
+ transition: opacity 0.3s ease;
1326
+ }
1327
+ .game-canvas-3d__context-menu {
1328
+ position: absolute;
1329
+ background: rgba(0, 0, 0, 0.9);
1330
+ border: 1px solid rgba(255, 255, 255, 0.1);
1331
+ border-radius: 6px;
1332
+ padding: 8px 0;
1333
+ min-width: 150px;
1334
+ z-index: 100;
1335
+ }
1336
+ .game-canvas-3d__context-menu-item {
1337
+ padding: 8px 16px;
1338
+ color: #ffffff;
1339
+ cursor: pointer;
1340
+ font-size: 13px;
1341
+ transition: background 0.15s ease;
1342
+ }
1343
+ .game-canvas-3d__context-menu-item:hover {
1344
+ background: rgba(255, 255, 255, 0.1);
1345
+ }
1346
+ .game-canvas-3d__context-menu-item--danger {
1347
+ color: #ff6b6b;
1348
+ }
1349
+ .game-canvas-3d__context-menu-item--danger:hover {
1350
+ background: rgba(255, 0, 0, 0.2);
1351
+ }
1164
1352
  .canvas-3d-loading {
1165
1353
  position: absolute;
1166
1354
  inset: 0;
@@ -1312,8 +1500,6 @@ body {
1312
1500
  font-size: 12px;
1313
1501
  }
1314
1502
  }
1315
-
1316
- /* src/lib/drawable/three/Canvas3DErrorBoundary.css */
1317
1503
  .canvas-3d-error {
1318
1504
  position: absolute;
1319
1505
  inset: 0;
@@ -1476,194 +1662,6 @@ body {
1476
1662
  }
1477
1663
  }
1478
1664
 
1479
- /* src/lib/drawable/three/Canvas3DHost.css */
1480
- .game-canvas-3d {
1481
- background: #1a1a2e;
1482
- border-radius: 8px;
1483
- }
1484
- .game-canvas-3d canvas {
1485
- display: block;
1486
- width: 100%;
1487
- height: 100%;
1488
- }
1489
- .game-canvas-3d--loading {
1490
- display: flex;
1491
- align-items: center;
1492
- justify-content: center;
1493
- background:
1494
- linear-gradient(
1495
- 135deg,
1496
- #1a1a2e 0%,
1497
- #16213e 100%);
1498
- }
1499
- .game-canvas-3d__loading {
1500
- padding: 20px 40px;
1501
- background: rgba(255, 255, 255, 0.1);
1502
- border-radius: 8px;
1503
- color: #ffffff;
1504
- font-size: 16px;
1505
- animation: pulse 1.5s ease-in-out infinite;
1506
- }
1507
- .game-canvas-3d--error {
1508
- display: flex;
1509
- align-items: center;
1510
- justify-content: center;
1511
- background:
1512
- linear-gradient(
1513
- 135deg,
1514
- #2e1a1a 0%,
1515
- #3e1616 100%);
1516
- }
1517
- .game-canvas-3d__error {
1518
- padding: 20px 40px;
1519
- background: rgba(255, 0, 0, 0.2);
1520
- border: 1px solid rgba(255, 0, 0, 0.3);
1521
- border-radius: 8px;
1522
- color: #ff6b6b;
1523
- font-size: 14px;
1524
- }
1525
- .game-canvas-3d__coordinates {
1526
- position: absolute;
1527
- bottom: 20px;
1528
- left: 20px;
1529
- padding: 8px 16px;
1530
- background: rgba(0, 0, 0, 0.7);
1531
- border-radius: 4px;
1532
- color: #ffffff;
1533
- font-family: monospace;
1534
- font-size: 12px;
1535
- pointer-events: none;
1536
- z-index: 10;
1537
- }
1538
- .game-canvas-3d__tile-info {
1539
- position: absolute;
1540
- top: 20px;
1541
- left: 20px;
1542
- padding: 12px 16px;
1543
- background: rgba(0, 0, 0, 0.8);
1544
- border-radius: 6px;
1545
- color: #ffffff;
1546
- pointer-events: none;
1547
- z-index: 10;
1548
- min-width: 120px;
1549
- }
1550
- .tile-info__type {
1551
- font-weight: 600;
1552
- font-size: 14px;
1553
- text-transform: capitalize;
1554
- margin-bottom: 4px;
1555
- }
1556
- .tile-info__terrain {
1557
- font-size: 12px;
1558
- color: #aaaaaa;
1559
- }
1560
- @keyframes pulse {
1561
- 0%, 100% {
1562
- opacity: 1;
1563
- }
1564
- 50% {
1565
- opacity: 0.5;
1566
- }
1567
- }
1568
- .game-canvas-3d[data-camera-mode=isometric]::before {
1569
- content: "Isometric";
1570
- position: absolute;
1571
- top: 20px;
1572
- right: 20px;
1573
- padding: 6px 12px;
1574
- background: rgba(0, 0, 0, 0.6);
1575
- border-radius: 4px;
1576
- color: #ffffff;
1577
- font-size: 11px;
1578
- text-transform: uppercase;
1579
- letter-spacing: 1px;
1580
- pointer-events: none;
1581
- }
1582
- .game-canvas-3d[data-camera-mode=perspective]::before {
1583
- content: "Perspective";
1584
- position: absolute;
1585
- top: 20px;
1586
- right: 20px;
1587
- padding: 6px 12px;
1588
- background: rgba(0, 0, 0, 0.6);
1589
- border-radius: 4px;
1590
- color: #ffffff;
1591
- font-size: 11px;
1592
- text-transform: uppercase;
1593
- letter-spacing: 1px;
1594
- pointer-events: none;
1595
- }
1596
- .game-canvas-3d[data-camera-mode=top-down]::before {
1597
- content: "Top Down";
1598
- position: absolute;
1599
- top: 20px;
1600
- right: 20px;
1601
- padding: 6px 12px;
1602
- background: rgba(0, 0, 0, 0.6);
1603
- border-radius: 4px;
1604
- color: #ffffff;
1605
- font-size: 11px;
1606
- text-transform: uppercase;
1607
- letter-spacing: 1px;
1608
- pointer-events: none;
1609
- }
1610
- .game-canvas-3d[data-overlay=hidden] .game-canvas-3d__coordinates,
1611
- .game-canvas-3d[data-overlay=hidden] .game-canvas-3d__tile-info,
1612
- .game-canvas-3d[data-overlay=hidden]::before {
1613
- display: none;
1614
- }
1615
- .game-canvas-3d[data-orientation=rotated] {
1616
- }
1617
- .game-canvas-3d canvas {
1618
- cursor: crosshair;
1619
- }
1620
- .game-canvas-3d canvas:active {
1621
- cursor: grabbing;
1622
- }
1623
- @media (max-width: 768px) {
1624
- .game-canvas-3d__coordinates,
1625
- .game-canvas-3d__tile-info {
1626
- font-size: 10px;
1627
- padding: 6px 10px;
1628
- }
1629
- .game-canvas-3d::before {
1630
- font-size: 9px;
1631
- padding: 4px 8px;
1632
- }
1633
- }
1634
- .game-canvas-3d:focus {
1635
- outline: 2px solid #4488ff;
1636
- outline-offset: 2px;
1637
- }
1638
- .game-canvas-3d canvas {
1639
- transition: opacity 0.3s ease;
1640
- }
1641
- .game-canvas-3d__context-menu {
1642
- position: absolute;
1643
- background: rgba(0, 0, 0, 0.9);
1644
- border: 1px solid rgba(255, 255, 255, 0.1);
1645
- border-radius: 6px;
1646
- padding: 8px 0;
1647
- min-width: 150px;
1648
- z-index: 100;
1649
- }
1650
- .game-canvas-3d__context-menu-item {
1651
- padding: 8px 16px;
1652
- color: #ffffff;
1653
- cursor: pointer;
1654
- font-size: 13px;
1655
- transition: background 0.15s ease;
1656
- }
1657
- .game-canvas-3d__context-menu-item:hover {
1658
- background: rgba(255, 255, 255, 0.1);
1659
- }
1660
- .game-canvas-3d__context-menu-item--danger {
1661
- color: #ff6b6b;
1662
- }
1663
- .game-canvas-3d__context-menu-item--danger:hover {
1664
- background: rgba(255, 0, 0, 0.2);
1665
- }
1666
-
1667
1665
  /* src/components/core/organisms/debug/RuntimeDebugger.css */
1668
1666
  .runtime-debugger {
1669
1667
  font-family: