@almadar/ui 5.107.0 → 5.108.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 (81) hide show
  1. package/dist/avl/index.cjs +1427 -2828
  2. package/dist/avl/index.js +525 -1926
  3. package/dist/components/{game → core}/atoms/GameIcon.d.ts +1 -1
  4. package/dist/components/core/atoms/index.d.ts +1 -0
  5. package/dist/components/core/templates/index.d.ts +0 -1
  6. package/dist/components/game/molecules/index.d.ts +8 -28
  7. package/dist/components/index.cjs +223 -1691
  8. package/dist/components/index.js +213 -1671
  9. package/dist/lib/drawable/projector.d.ts +1 -1
  10. package/dist/{components/game/three/molecules/GameCanvas3D.d.ts → lib/drawable/three/Canvas3DHost.d.ts} +12 -9
  11. package/dist/lib/drawable/{Drawable3D.d.ts → three/Drawable3D.d.ts} +2 -2
  12. package/dist/lib/drawable/three/GameCamera3D.d.ts +16 -0
  13. package/dist/lib/drawable/three/game3dTheme.d.ts +14 -0
  14. package/dist/{components/game → lib/drawable}/three/hooks/useGameCanvas3DEvents.d.ts +1 -1
  15. package/dist/{components/game → lib/drawable}/three/index.cjs +2019 -2020
  16. package/dist/{components/game → lib/drawable}/three/index.css +3 -3
  17. package/dist/lib/drawable/three/index.d.ts +39 -0
  18. package/dist/{components/game → lib/drawable}/three/index.js +1932 -1934
  19. package/dist/lib/drawable/{mesh3d.d.ts → three/mesh3d.d.ts} +4 -4
  20. package/dist/{components/game/lib → lib}/puzzleObject.d.ts +11 -2
  21. package/dist/{components/game/providers → providers}/GameAudioProvider.d.ts +1 -1
  22. package/dist/providers/index.cjs +1619 -2690
  23. package/dist/providers/index.d.ts +2 -0
  24. package/dist/providers/index.js +827 -1902
  25. package/dist/runtime/index.cjs +1288 -2689
  26. package/dist/runtime/index.js +505 -1906
  27. package/package.json +7 -7
  28. package/dist/components/game/atoms/ActionButton.d.ts +0 -31
  29. package/dist/components/game/atoms/ComboCounter.d.ts +0 -20
  30. package/dist/components/game/atoms/DamageNumber.d.ts +0 -18
  31. package/dist/components/game/atoms/GameCard.d.ts +0 -34
  32. package/dist/components/game/atoms/ItemSlot.d.ts +0 -31
  33. package/dist/components/game/atoms/ResourceCounter.d.ts +0 -26
  34. package/dist/components/game/atoms/Sprite.d.ts +0 -52
  35. package/dist/components/game/atoms/StatusEffect.d.ts +0 -25
  36. package/dist/components/game/atoms/TurnIndicator.d.ts +0 -22
  37. package/dist/components/game/atoms/WaypointMarker.d.ts +0 -23
  38. package/dist/components/game/molecules/EventLog.d.ts +0 -31
  39. package/dist/components/game/molecules/InventoryGrid.d.ts +0 -35
  40. package/dist/components/game/molecules/ObjectRulePanel.d.ts +0 -32
  41. package/dist/components/game/molecules/ResourceBar.d.ts +0 -26
  42. package/dist/components/game/molecules/RuleEditor.d.ts +0 -39
  43. package/dist/components/game/molecules/VariablePanel.d.ts +0 -28
  44. package/dist/components/game/templates/GameTemplate.d.ts +0 -35
  45. package/dist/components/game/three/atoms/SpriteBillboard3D.d.ts +0 -18
  46. package/dist/components/game/three/game3dTheme.d.ts +0 -55
  47. package/dist/components/game/three/index.d.ts +0 -12
  48. package/dist/components/game/three/lib/game3dAssetManifest.d.ts +0 -48
  49. package/dist/components/game/three/molecules/GameCamera3D.d.ts +0 -35
  50. package/dist/components/game/three/molecules/index.d.ts +0 -32
  51. package/dist/components/game/three/patterns.d.ts +0 -16
  52. /package/dist/{components/game/hooks → hooks}/useCamera.d.ts +0 -0
  53. /package/dist/{components/game/hooks → hooks}/useGameAudio.d.ts +0 -0
  54. /package/dist/{components/game/hooks → hooks}/useImageCache.d.ts +0 -0
  55. /package/dist/{components/game/hooks → hooks}/useUnitSpriteAtlas.d.ts +0 -0
  56. /package/dist/{components/game/lib → lib}/boardEntity.d.ts +0 -0
  57. /package/dist/{components/game/three/molecules → lib/drawable/three}/Camera3D.d.ts +0 -0
  58. /package/dist/{components/game/three/molecules → lib/drawable/three}/Canvas3DErrorBoundary.d.ts +0 -0
  59. /package/dist/{components/game/three/molecules → lib/drawable/three}/Canvas3DLoadingState.d.ts +0 -0
  60. /package/dist/{components/game/three/molecules → lib/drawable/three}/Lighting3D.d.ts +0 -0
  61. /package/dist/{components/game/three/molecules → lib/drawable/three}/ModelLoader.d.ts +0 -0
  62. /package/dist/{components/game/three/molecules → lib/drawable/three}/Scene3D.d.ts +0 -0
  63. /package/dist/{components/game → lib/drawable}/three/hooks/useAssetLoader.d.ts +0 -0
  64. /package/dist/{components/game → lib/drawable}/three/hooks/useRaycaster.d.ts +0 -0
  65. /package/dist/{components/game → lib/drawable}/three/hooks/useSceneGraph.d.ts +0 -0
  66. /package/dist/{components/game → lib/drawable}/three/hooks/useThree.d.ts +0 -0
  67. /package/dist/{components/game → lib/drawable}/three/lib/AssetLoader.d.ts +0 -0
  68. /package/dist/{components/game → lib/drawable}/three/lib/culling.d.ts +0 -0
  69. /package/dist/{components/game → lib/drawable}/three/lib/grid3D.d.ts +0 -0
  70. /package/dist/{components/game/lib → lib}/editorUtils.d.ts +0 -0
  71. /package/dist/{components/game/lib → lib}/game.d.ts +0 -0
  72. /package/dist/{components/game/lib/index.d.ts → lib/gameShared.d.ts} +0 -0
  73. /package/dist/{components/game/lib → lib}/isometric.d.ts +0 -0
  74. /package/dist/{components/game/lib → lib}/isometricTypes.d.ts +0 -0
  75. /package/dist/{components/game/lib → lib}/makeAsset.d.ts +0 -0
  76. /package/dist/{components/game/lib → lib}/mechanics.d.ts +0 -0
  77. /package/dist/{components/game/lib → lib}/physicsPresets.d.ts +0 -0
  78. /package/dist/{components/game/lib → lib}/physicsTypes.d.ts +0 -0
  79. /package/dist/{components/game/lib → lib}/spriteAnimation.d.ts +0 -0
  80. /package/dist/{components/game/lib → lib}/spriteAnimationTypes.d.ts +0 -0
  81. /package/dist/{components/game/lib → lib}/spriteSheetConstants.d.ts +0 -0
@@ -3190,6 +3190,38 @@ var init_Badge = __esm({
3190
3190
  exports.Badge.displayName = "Badge";
3191
3191
  }
3192
3192
  });
3193
+ function GameIcon({ assetUrl, icon, size = "md", alt, className }) {
3194
+ const px = typeof size === "number" ? size : sizeMap[size];
3195
+ const family = useIconFamily();
3196
+ if (assetUrl?.url) {
3197
+ return /* @__PURE__ */ jsxRuntime.jsx(
3198
+ AtlasImage,
3199
+ {
3200
+ asset: assetUrl,
3201
+ size: px,
3202
+ alt: alt ?? assetUrl.category ?? "",
3203
+ className: cn("flex-shrink-0", className)
3204
+ }
3205
+ );
3206
+ }
3207
+ const I = typeof icon === "string" ? resolveIconForFamily(icon, family) : icon;
3208
+ return /* @__PURE__ */ jsxRuntime.jsx(I, { width: px, height: px, className: cn("flex-shrink-0", className) });
3209
+ }
3210
+ var sizeMap;
3211
+ var init_GameIcon = __esm({
3212
+ "components/core/atoms/GameIcon.tsx"() {
3213
+ "use client";
3214
+ init_cn();
3215
+ init_iconFamily();
3216
+ init_AtlasImage();
3217
+ sizeMap = {
3218
+ sm: 16,
3219
+ md: 24,
3220
+ lg: 32
3221
+ };
3222
+ GameIcon.displayName = "GameIcon";
3223
+ }
3224
+ });
3193
3225
  var variantStyles4, sizeStyles4, iconSizes; exports.FilterPill = void 0;
3194
3226
  var init_FilterPill = __esm({
3195
3227
  "components/core/atoms/FilterPill.tsx"() {
@@ -4430,7 +4462,7 @@ var init_TextHighlight = __esm({
4430
4462
  }) => {
4431
4463
  const eventBus = useEventBus();
4432
4464
  const baseStyles = "cursor-pointer transition-all duration-150";
4433
- const typeStyles2 = {
4465
+ const typeStyles = {
4434
4466
  question: cn(
4435
4467
  // Blue border for questions
4436
4468
  "bg-card border-b-2 border-primary-600",
@@ -4450,7 +4482,7 @@ var init_TextHighlight = __esm({
4450
4482
  "data-highlight": "true",
4451
4483
  "data-highlight-type": highlightType,
4452
4484
  "data-annotation-id": annotationId,
4453
- className: cn(baseStyles, typeStyles2[highlightType], className),
4485
+ className: cn(baseStyles, typeStyles[highlightType], className),
4454
4486
  onClick: () => {
4455
4487
  if (action) eventBus.emit(`UI:${action}`, { annotationId });
4456
4488
  onClick?.();
@@ -8191,135 +8223,6 @@ var init_Accordion = __esm({
8191
8223
  exports.Accordion.displayName = "Accordion";
8192
8224
  }
8193
8225
  });
8194
- function GameIcon({ assetUrl, icon, size = "md", alt, className }) {
8195
- const px = typeof size === "number" ? size : sizeMap[size];
8196
- if (assetUrl?.url) {
8197
- return /* @__PURE__ */ jsxRuntime.jsx(
8198
- AtlasImage,
8199
- {
8200
- asset: assetUrl,
8201
- size: px,
8202
- alt: alt ?? assetUrl.category ?? "",
8203
- className: cn("flex-shrink-0", className)
8204
- }
8205
- );
8206
- }
8207
- const I = typeof icon === "string" ? resolveIcon(icon) : icon;
8208
- return /* @__PURE__ */ jsxRuntime.jsx(I, { width: px, height: px, className: cn("flex-shrink-0", className) });
8209
- }
8210
- var sizeMap;
8211
- var init_GameIcon = __esm({
8212
- "components/game/atoms/GameIcon.tsx"() {
8213
- "use client";
8214
- init_cn();
8215
- init_Icon();
8216
- init_AtlasImage();
8217
- sizeMap = {
8218
- sm: 16,
8219
- md: 24,
8220
- lg: 32
8221
- };
8222
- GameIcon.displayName = "GameIcon";
8223
- }
8224
- });
8225
- function ActionButton({
8226
- assetUrl = DEFAULT_ASSET_URL,
8227
- label = "Attack",
8228
- icon,
8229
- cooldown = 0,
8230
- disabled = false,
8231
- hotkey,
8232
- size = "md",
8233
- variant = "primary",
8234
- onClick,
8235
- action,
8236
- className
8237
- }) {
8238
- const eventBus = useEventBus();
8239
- const sizes = sizeMap2[size];
8240
- const onCooldown = cooldown > 0;
8241
- const isDisabled = disabled || onCooldown;
8242
- const cooldownDeg = Math.round(cooldown * 360);
8243
- return /* @__PURE__ */ jsxRuntime.jsxs(
8244
- exports.Button,
8245
- {
8246
- variant: variant === "danger" ? "danger" : variant === "secondary" ? "secondary" : "primary",
8247
- disabled: isDisabled,
8248
- onClick: () => {
8249
- if (action) eventBus.emit(`UI:${action}`, {});
8250
- onClick?.();
8251
- },
8252
- className: cn(
8253
- "relative inline-flex items-center gap-1.5 rounded-interactive border font-medium overflow-hidden transition-colors duration-150",
8254
- sizes.button,
8255
- variantStyles7[variant],
8256
- isDisabled && "opacity-60 cursor-not-allowed",
8257
- className
8258
- ),
8259
- children: [
8260
- onCooldown && /* @__PURE__ */ jsxRuntime.jsx(
8261
- exports.Box,
8262
- {
8263
- position: "absolute",
8264
- className: "inset-0 bg-foreground/40 pointer-events-none",
8265
- style: {
8266
- clipPath: `conic-gradient(from 0deg, transparent ${360 - cooldownDeg}deg, black ${360 - cooldownDeg}deg)`,
8267
- WebkitClipPath: `conic-gradient(from 0deg, transparent ${360 - cooldownDeg}deg, black ${360 - cooldownDeg}deg)`,
8268
- background: `conic-gradient(from 0deg, transparent ${360 - cooldownDeg}deg, rgba(0,0,0,0.6) ${360 - cooldownDeg}deg)`
8269
- }
8270
- }
8271
- ),
8272
- assetUrl ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: 16, className: cn("flex-shrink-0", sizes.icon) }) : icon ? /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", className: cn("flex-shrink-0", sizes.icon), children: typeof icon === "string" ? (() => {
8273
- const I = resolveIcon(icon);
8274
- return I ? /* @__PURE__ */ jsxRuntime.jsx(I, { className: "w-4 h-4" }) : null;
8275
- })() : /* @__PURE__ */ (() => {
8276
- const I = icon;
8277
- return /* @__PURE__ */ jsxRuntime.jsx(I, { className: "w-4 h-4" });
8278
- })() }) : null,
8279
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "relative z-10", children: label }),
8280
- hotkey && /* @__PURE__ */ jsxRuntime.jsx(
8281
- exports.Typography,
8282
- {
8283
- as: "span",
8284
- className: cn(
8285
- "absolute top-0.5 right-0.5 bg-foreground/30 text-primary-foreground rounded font-mono leading-tight",
8286
- sizes.hotkey
8287
- ),
8288
- children: hotkey
8289
- }
8290
- )
8291
- ]
8292
- }
8293
- );
8294
- }
8295
- var sizeMap2, variantStyles7, DEFAULT_ASSET_URL;
8296
- var init_ActionButton = __esm({
8297
- "components/game/atoms/ActionButton.tsx"() {
8298
- init_cn();
8299
- init_Icon();
8300
- init_useEventBus();
8301
- init_Button();
8302
- init_Box();
8303
- init_Typography();
8304
- init_GameIcon();
8305
- sizeMap2 = {
8306
- sm: { button: "h-button-sm px-3 text-xs", hotkey: "text-[9px] px-1", icon: "text-xs" },
8307
- md: { button: "h-button-md px-4 text-sm", hotkey: "text-xs px-1.5", icon: "text-sm" },
8308
- lg: { button: "h-button-lg px-5 text-base", hotkey: "text-xs px-2", icon: "text-base" }
8309
- };
8310
- variantStyles7 = {
8311
- primary: "bg-primary text-primary-foreground hover:bg-primary-hover border-primary",
8312
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary-hover border-border",
8313
- danger: "bg-error text-error-foreground hover:bg-error/90 border-error"
8314
- };
8315
- DEFAULT_ASSET_URL = {
8316
- url: "https://almadar-kflow-assets.web.app/shared/effects/particles/slash_01.png",
8317
- role: "ui",
8318
- category: "action"
8319
- };
8320
- ActionButton.displayName = "ActionButton";
8321
- }
8322
- });
8323
8226
  function ActionTile({
8324
8227
  action,
8325
8228
  size = "md",
@@ -14163,14 +14066,14 @@ function SpacerPattern({ size = "flex" }) {
14163
14066
  if (size === "flex") {
14164
14067
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Spacer, {});
14165
14068
  }
14166
- const sizeMap16 = {
14069
+ const sizeMap8 = {
14167
14070
  xs: "0.25rem",
14168
14071
  sm: "0.5rem",
14169
14072
  md: "1rem",
14170
14073
  lg: "1.5rem",
14171
14074
  xl: "2rem"
14172
14075
  };
14173
- return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { style: { width: sizeMap16[size], height: sizeMap16[size], flexShrink: 0 } });
14076
+ return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { style: { width: sizeMap8[size], height: sizeMap8[size], flexShrink: 0 } });
14174
14077
  }
14175
14078
  function DividerPattern({
14176
14079
  orientation = "horizontal",
@@ -15456,7 +15359,7 @@ function useImageCache(urls) {
15456
15359
  };
15457
15360
  }
15458
15361
  var init_useImageCache = __esm({
15459
- "components/game/hooks/useImageCache.ts"() {
15362
+ "hooks/useImageCache.ts"() {
15460
15363
  "use client";
15461
15364
  init_verificationRegistry();
15462
15365
  }
@@ -15570,7 +15473,7 @@ function useCamera() {
15570
15473
  };
15571
15474
  }
15572
15475
  var init_useCamera = __esm({
15573
- "components/game/hooks/useCamera.ts"() {
15476
+ "hooks/useCamera.ts"() {
15574
15477
  "use client";
15575
15478
  }
15576
15479
  });
@@ -15834,7 +15737,7 @@ var init_webPainter2d = __esm({
15834
15737
  }
15835
15738
  });
15836
15739
 
15837
- // components/game/lib/isometric.ts
15740
+ // lib/isometric.ts
15838
15741
  function isoToScreen(tileX, tileY, scale, baseOffsetX, layout = "isometric") {
15839
15742
  const scaledTileWidth = exports.TILE_WIDTH * scale;
15840
15743
  const scaledFloorHeight = exports.FLOOR_HEIGHT * scale;
@@ -15872,7 +15775,7 @@ function screenToIso(screenX, screenY, scale, baseOffsetX, layout = "isometric")
15872
15775
  }
15873
15776
  exports.TILE_WIDTH = void 0; exports.TILE_HEIGHT = void 0; exports.FLOOR_HEIGHT = void 0; exports.DIAMOND_TOP_Y = void 0; exports.FEATURE_COLORS = void 0; var BACKGROUND_FALLBACK_COLOR, MINIMAP_TERRAIN_COLORS;
15874
15777
  var init_isometric = __esm({
15875
- "components/game/lib/isometric.ts"() {
15778
+ "lib/isometric.ts"() {
15876
15779
  exports.TILE_WIDTH = 256;
15877
15780
  exports.TILE_HEIGHT = 512;
15878
15781
  exports.FLOOR_HEIGHT = 128;
@@ -16618,7 +16521,7 @@ function Canvas({
16618
16521
  keyMap,
16619
16522
  keyUpMap
16620
16523
  };
16621
- return /* @__PURE__ */ jsxRuntime.jsx(React73.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(GameCanvas3D, { ...props3d }) });
16524
+ return /* @__PURE__ */ jsxRuntime.jsx(React73.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(Canvas3DHost, { ...props3d }) });
16622
16525
  }
16623
16526
  return /* @__PURE__ */ jsxRuntime.jsx(
16624
16527
  Canvas2D,
@@ -16642,13 +16545,13 @@ function Canvas({
16642
16545
  }
16643
16546
  );
16644
16547
  }
16645
- var GameCanvas3D;
16548
+ var Canvas3DHost;
16646
16549
  var init_Canvas = __esm({
16647
16550
  "components/game/molecules/Canvas.tsx"() {
16648
16551
  "use client";
16649
16552
  init_Canvas2D();
16650
- GameCanvas3D = React73.lazy(
16651
- () => import('@almadar/ui/components/molecules/game/three').then((m) => ({ default: m.GameCanvas3D }))
16553
+ Canvas3DHost = React73.lazy(
16554
+ () => import('@almadar/ui/components/molecules/game/three').then((m) => ({ default: m.Canvas3DHost }))
16652
16555
  );
16653
16556
  Canvas.displayName = "Canvas";
16654
16557
  }
@@ -18516,16 +18419,14 @@ function ChoiceButton({
18516
18419
  payload,
18517
18420
  className
18518
18421
  }) {
18519
- const eventBus = useEventBus();
18520
18422
  return /* @__PURE__ */ jsxRuntime.jsxs(
18521
18423
  exports.Button,
18522
18424
  {
18523
18425
  variant: "ghost",
18524
18426
  disabled,
18525
- onClick: () => {
18526
- if (action) eventBus.emit(`UI:${action}`, payload ?? {});
18527
- onClick?.();
18528
- },
18427
+ action,
18428
+ actionPayload: payload,
18429
+ onClick,
18529
18430
  className: cn(
18530
18431
  "w-full text-left px-4 py-2.5 rounded-interactive border transition-all duration-150",
18531
18432
  "flex items-center gap-2",
@@ -18564,7 +18465,6 @@ var init_ChoiceButton = __esm({
18564
18465
  "components/game/atoms/ChoiceButton.tsx"() {
18565
18466
  init_cn();
18566
18467
  init_Icon();
18567
- init_useEventBus();
18568
18468
  init_Button();
18569
18469
  init_Box();
18570
18470
  init_Typography();
@@ -18735,73 +18635,6 @@ var init_CodeRunnerPanel = __esm({
18735
18635
  exports.CodeRunnerPanel.displayName = "CodeRunnerPanel";
18736
18636
  }
18737
18637
  });
18738
- function getComboIntensity(combo) {
18739
- if (combo >= 10) return "text-error animate-pulse";
18740
- if (combo >= 7) return "text-warning";
18741
- if (combo >= 4) return "text-warning";
18742
- return "text-foreground";
18743
- }
18744
- function getComboScale(combo) {
18745
- if (combo >= 10) return "scale-110";
18746
- if (combo >= 5) return "scale-105";
18747
- return "";
18748
- }
18749
- function ComboCounter({
18750
- assetUrl = DEFAULT_ASSET_URL2,
18751
- combo = 5,
18752
- multiplier,
18753
- streak,
18754
- size = "md",
18755
- className
18756
- }) {
18757
- const sizes = sizeMap3[size];
18758
- if (combo <= 0) return null;
18759
- return /* @__PURE__ */ jsxRuntime.jsxs(
18760
- exports.Box,
18761
- {
18762
- className: cn(
18763
- "inline-flex flex-col items-center justify-center",
18764
- "rounded-container bg-card/80 border border-muted px-3 py-1.5",
18765
- "transition-transform duration-200",
18766
- getComboScale(combo),
18767
- className
18768
- ),
18769
- children: [
18770
- assetUrl && /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: 24, className: "flex-shrink-0 mb-0.5" }),
18771
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: cn("font-black tabular-nums leading-none", sizes.combo, getComboIntensity(combo)), children: combo }),
18772
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: cn("font-bold uppercase tracking-wider text-muted-foreground", sizes.label), children: "combo" }),
18773
- multiplier != null && multiplier > 1 && /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { as: "span", className: cn("font-bold text-warning tabular-nums", sizes.multiplier), children: [
18774
- "x",
18775
- multiplier.toFixed(1)
18776
- ] }),
18777
- streak != null && streak > 0 && /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { as: "span", className: cn("text-muted-foreground tabular-nums", sizes.label), children: [
18778
- streak,
18779
- " streak"
18780
- ] })
18781
- ]
18782
- }
18783
- );
18784
- }
18785
- var DEFAULT_ASSET_URL2, sizeMap3;
18786
- var init_ComboCounter = __esm({
18787
- "components/game/atoms/ComboCounter.tsx"() {
18788
- init_cn();
18789
- init_Box();
18790
- init_Typography();
18791
- init_GameIcon();
18792
- DEFAULT_ASSET_URL2 = {
18793
- url: "https://almadar-kflow-assets.web.app/shared/effects/flash/flash00.png",
18794
- role: "effect",
18795
- category: "effect"
18796
- };
18797
- sizeMap3 = {
18798
- sm: { combo: "text-lg", label: "text-xs", multiplier: "text-xs" },
18799
- md: { combo: "text-2xl", label: "text-xs", multiplier: "text-sm" },
18800
- lg: { combo: "text-4xl", label: "text-sm", multiplier: "text-base" }
18801
- };
18802
- ComboCounter.displayName = "ComboCounter";
18803
- }
18804
- });
18805
18638
  function formatCount(count) {
18806
18639
  if (count >= 1e3) {
18807
18640
  return `${(count / 1e3).toFixed(1)}k`;
@@ -19051,7 +18884,7 @@ function ControlButton({
19051
18884
  "select-none touch-none",
19052
18885
  "transition-all duration-100",
19053
18886
  "active:scale-95",
19054
- sizeMap4[size] ?? sizeMap4.md,
18887
+ sizeMap2[size] ?? sizeMap2.md,
19055
18888
  shapeMap[shape] ?? shapeMap.circle,
19056
18889
  variantMap[variant] ?? variantMap.secondary,
19057
18890
  actualPressed && "scale-95 brightness-110 border-foreground",
@@ -19068,7 +18901,7 @@ function ControlButton({
19068
18901
  }
19069
18902
  );
19070
18903
  }
19071
- var sizeMap4, shapeMap, variantMap;
18904
+ var sizeMap2, shapeMap, variantMap;
19072
18905
  var init_ControlButton = __esm({
19073
18906
  "components/game/atoms/ControlButton.tsx"() {
19074
18907
  "use client";
@@ -19079,7 +18912,7 @@ var init_ControlButton = __esm({
19079
18912
  init_Box();
19080
18913
  init_Typography();
19081
18914
  init_GameIcon();
19082
- sizeMap4 = {
18915
+ sizeMap2 = {
19083
18916
  sm: "w-10 h-10 text-sm",
19084
18917
  md: "w-14 h-14 text-base",
19085
18918
  lg: "w-18 h-18 text-lg",
@@ -19520,67 +19353,6 @@ var init_CounterTemplate = __esm({
19520
19353
  exports.CounterTemplate.displayName = "CounterTemplate";
19521
19354
  }
19522
19355
  });
19523
- function DamageNumber({
19524
- assetUrl = DEFAULT_ASSET_URL3,
19525
- value = 42,
19526
- type = "damage",
19527
- size = "md",
19528
- className
19529
- }) {
19530
- const displayText = type === "miss" ? "MISS" : type === "heal" ? `+${value}` : `${value}`;
19531
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19532
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: floatKeyframes }),
19533
- /* @__PURE__ */ jsxRuntime.jsxs(
19534
- exports.Typography,
19535
- {
19536
- as: "span",
19537
- className: cn(
19538
- "inline-flex items-center gap-0.5 font-mono select-none pointer-events-none",
19539
- sizeMap5[size],
19540
- typeStyles[type],
19541
- className
19542
- ),
19543
- style: { animation: "damageFloat 1s ease-out forwards" },
19544
- children: [
19545
- assetUrl && /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: 14, className: "flex-shrink-0" }),
19546
- displayText
19547
- ]
19548
- }
19549
- )
19550
- ] });
19551
- }
19552
- var sizeMap5, typeStyles, floatKeyframes, DEFAULT_ASSET_URL3;
19553
- var init_DamageNumber = __esm({
19554
- "components/game/atoms/DamageNumber.tsx"() {
19555
- init_cn();
19556
- init_Typography();
19557
- init_GameIcon();
19558
- sizeMap5 = {
19559
- sm: "text-sm",
19560
- md: "text-lg",
19561
- lg: "text-2xl"
19562
- };
19563
- typeStyles = {
19564
- damage: "text-error font-bold",
19565
- heal: "text-success font-bold",
19566
- crit: "text-warning font-extrabold",
19567
- miss: "text-muted-foreground italic"
19568
- };
19569
- floatKeyframes = `
19570
- @keyframes damageFloat {
19571
- 0% { opacity: 1; transform: translateY(0) scale(1); }
19572
- 20% { transform: translateY(-8px) scale(1.1); }
19573
- 100% { opacity: 0; transform: translateY(-32px) scale(0.8); }
19574
- }
19575
- `;
19576
- DEFAULT_ASSET_URL3 = {
19577
- url: "https://almadar-kflow-assets.web.app/shared/effects/particles/spark_01.png",
19578
- role: "effect",
19579
- category: "effect"
19580
- };
19581
- DamageNumber.displayName = "DamageNumber";
19582
- }
19583
- });
19584
19356
  var gapStyles4, columnStyles, colSpanStyles, rowSpanStyles; exports.DashboardGrid = void 0;
19585
19357
  var init_DashboardGrid = __esm({
19586
19358
  "components/core/organisms/layout/DashboardGrid.tsx"() {
@@ -25755,13 +25527,13 @@ var init_LineChart = __esm({
25755
25527
  exports.LineChart.displayName = "LineChart";
25756
25528
  }
25757
25529
  });
25758
- var sizeMap6, stateColors; exports.ProgressDots = void 0;
25530
+ var sizeMap3, stateColors; exports.ProgressDots = void 0;
25759
25531
  var init_ProgressDots = __esm({
25760
25532
  "components/core/molecules/ProgressDots.tsx"() {
25761
25533
  "use client";
25762
25534
  init_cn();
25763
25535
  init_atoms();
25764
- sizeMap6 = {
25536
+ sizeMap3 = {
25765
25537
  sm: { dot: 6, active: 8 },
25766
25538
  md: { dot: 8, active: 10 },
25767
25539
  lg: { dot: 10, active: 14 }
@@ -25787,7 +25559,7 @@ var init_ProgressDots = __esm({
25787
25559
  [currentIndex]
25788
25560
  );
25789
25561
  const resolveState = getState2 ?? defaultGetState;
25790
- const dims = sizeMap6[size];
25562
+ const dims = sizeMap3[size];
25791
25563
  return /* @__PURE__ */ jsxRuntime.jsx(exports.HStack, { gap: "xs", align: "center", className: cn(className), children: Array.from({ length: count }, (_, index) => {
25792
25564
  const state = resolveState(index);
25793
25565
  const isActive = state === "active";
@@ -25815,7 +25587,7 @@ var init_ProgressDots = __esm({
25815
25587
  }
25816
25588
  });
25817
25589
 
25818
- // components/game/lib/game.ts
25590
+ // lib/game.ts
25819
25591
  function createInitialGameState(width, height, units, defaultTerrain = "floorStone") {
25820
25592
  const board = Array.from(
25821
25593
  { length: height },
@@ -25885,11 +25657,11 @@ function calculateAttackTargets(state, unitId) {
25885
25657
  return targets;
25886
25658
  }
25887
25659
  var init_game = __esm({
25888
- "components/game/lib/game.ts"() {
25660
+ "lib/game.ts"() {
25889
25661
  }
25890
25662
  });
25891
25663
 
25892
- // components/game/lib/boardEntity.ts
25664
+ // lib/boardEntity.ts
25893
25665
  function boardEntity(entity) {
25894
25666
  if (!entity) return void 0;
25895
25667
  return Array.isArray(entity) ? entity[0] : entity;
@@ -25921,11 +25693,11 @@ function unitHealth(u) {
25921
25693
  return num(u.health);
25922
25694
  }
25923
25695
  var init_boardEntity = __esm({
25924
- "components/game/lib/boardEntity.ts"() {
25696
+ "lib/boardEntity.ts"() {
25925
25697
  }
25926
25698
  });
25927
25699
 
25928
- // components/game/lib/makeAsset.ts
25700
+ // lib/makeAsset.ts
25929
25701
  function makeAsset(url, role, overrides = {}) {
25930
25702
  const defaults = ROLE_DEFAULTS[role] ?? { dimension: "2d", animations: ["static"], aspect: "1:1" };
25931
25703
  return {
@@ -25945,7 +25717,7 @@ function makeAssetMap(record, role, overrides = {}) {
25945
25717
  }
25946
25718
  var ROLE_DEFAULTS;
25947
25719
  var init_makeAsset = __esm({
25948
- "components/game/lib/makeAsset.ts"() {
25720
+ "lib/makeAsset.ts"() {
25949
25721
  ROLE_DEFAULTS = {
25950
25722
  tile: { dimension: "2d", animations: ["static"], aspect: "1:1" },
25951
25723
  decoration: { dimension: "2d", animations: ["static"], aspect: "1:1" },
@@ -25961,10 +25733,10 @@ var init_makeAsset = __esm({
25961
25733
  }
25962
25734
  });
25963
25735
 
25964
- // components/game/lib/spriteSheetConstants.ts
25736
+ // lib/spriteSheetConstants.ts
25965
25737
  exports.SHEET_COLUMNS = void 0; exports.SPRITE_SHEET_LAYOUT = void 0;
25966
25738
  var init_spriteSheetConstants = __esm({
25967
- "components/game/lib/spriteSheetConstants.ts"() {
25739
+ "lib/spriteSheetConstants.ts"() {
25968
25740
  exports.SHEET_COLUMNS = 8;
25969
25741
  exports.SPRITE_SHEET_LAYOUT = {
25970
25742
  idle: { row: 0, frames: 4, frameRate: 6, loop: true },
@@ -25976,7 +25748,7 @@ var init_spriteSheetConstants = __esm({
25976
25748
  }
25977
25749
  });
25978
25750
 
25979
- // components/game/lib/spriteAnimation.ts
25751
+ // lib/spriteAnimation.ts
25980
25752
  function inferDirection(dx, dy) {
25981
25753
  if (dx === 0 && dy === 0) return "se";
25982
25754
  if (dx >= 0 && dy >= 0) return "se";
@@ -26084,14 +25856,14 @@ function tickAnimationState(state, deltaMs) {
26084
25856
  return { ...state, elapsed: newElapsed, frame, finished };
26085
25857
  }
26086
25858
  var init_spriteAnimation = __esm({
26087
- "components/game/lib/spriteAnimation.ts"() {
25859
+ "lib/spriteAnimation.ts"() {
26088
25860
  init_spriteSheetConstants();
26089
25861
  }
26090
25862
  });
26091
25863
 
26092
- // components/game/lib/index.ts
26093
- var init_lib = __esm({
26094
- "components/game/lib/index.ts"() {
25864
+ // lib/gameShared.ts
25865
+ var init_gameShared = __esm({
25866
+ "lib/gameShared.ts"() {
26095
25867
  init_game();
26096
25868
  init_boardEntity();
26097
25869
  init_makeAsset();
@@ -26101,103 +25873,6 @@ var init_lib = __esm({
26101
25873
  init_spriteSheetConstants();
26102
25874
  }
26103
25875
  });
26104
- function GameCard({
26105
- id,
26106
- cost,
26107
- art,
26108
- frameAsset,
26109
- attack,
26110
- defense,
26111
- name,
26112
- selected = false,
26113
- disabled = false,
26114
- size = "md",
26115
- animState = "idle",
26116
- onClick,
26117
- clickEvent,
26118
- className
26119
- }) {
26120
- const eventBus = useEventBus();
26121
- const handleClick = React73__namespace.useCallback(() => {
26122
- if (disabled) return;
26123
- onClick?.(id);
26124
- if (clickEvent) eventBus.emit(`UI:${clickEvent}`, { cardId: id });
26125
- }, [disabled, id, onClick, clickEvent, eventBus]);
26126
- const artPx = artPxMap[size];
26127
- return /* @__PURE__ */ jsxRuntime.jsxs(
26128
- exports.Button,
26129
- {
26130
- variant: "ghost",
26131
- onClick: handleClick,
26132
- disabled,
26133
- title: name,
26134
- className: cn(
26135
- "relative isolate flex flex-col items-center rounded-interactive",
26136
- "px-1.5 pt-1.5 pb-1 transition-all duration-150",
26137
- frameAsset?.url ? "border-0" : "border-2 bg-card/90",
26138
- cardSizeMap[size],
26139
- disabled ? "border-border opacity-50 cursor-not-allowed" : "border-accent hover:brightness-125 hover:-translate-y-1 cursor-pointer",
26140
- selected && "ring-2 ring-foreground ring-offset-1 ring-offset-background -translate-y-1",
26141
- ANIM_STATE_CLASS[animState],
26142
- className
26143
- ),
26144
- children: [
26145
- frameAsset?.url && /* @__PURE__ */ jsxRuntime.jsx(AtlasImage, { asset: frameAsset, fill: true, fit: "fill", "aria-hidden": true, style: { zIndex: -1 } }),
26146
- cost != null && /* @__PURE__ */ jsxRuntime.jsx(
26147
- exports.Typography,
26148
- {
26149
- as: "span",
26150
- className: cn(
26151
- "absolute -top-2 -left-2 flex items-center justify-center",
26152
- "min-w-[22px] h-[22px] rounded-full px-1",
26153
- "bg-info text-foreground text-xs font-bold border border-background"
26154
- ),
26155
- children: cost
26156
- }
26157
- ),
26158
- /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "flex-1 flex items-center justify-center w-full", children: art ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl: art, icon: "image", size: artPx, alt: name ?? id, className: "flex-shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: "rounded bg-muted/40", style: { width: artPx, height: artPx } }) }),
26159
- name != null && /* @__PURE__ */ jsxRuntime.jsx(
26160
- exports.Typography,
26161
- {
26162
- variant: "small",
26163
- className: "w-full truncate text-center text-[10px] leading-tight font-semibold",
26164
- children: name
26165
- }
26166
- ),
26167
- (attack != null || defense != null) && /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "flex w-full items-center justify-between px-0.5 text-[10px] font-bold leading-none", children: [
26168
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-error", children: attack != null ? `\u2694${attack}` : "" }),
26169
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-info", children: defense != null ? `\u{1F6E1}${defense}` : "" })
26170
- ] })
26171
- ]
26172
- }
26173
- );
26174
- }
26175
- var cardSizeMap, artPxMap, ANIM_STATE_CLASS;
26176
- var init_GameCard = __esm({
26177
- "components/game/atoms/GameCard.tsx"() {
26178
- "use client";
26179
- init_cn();
26180
- init_useEventBus();
26181
- init_Box();
26182
- init_Button();
26183
- init_Typography();
26184
- init_AtlasImage();
26185
- init_GameIcon();
26186
- cardSizeMap = {
26187
- sm: "w-16 h-24",
26188
- md: "w-20 h-28",
26189
- lg: "w-24 h-36"
26190
- };
26191
- artPxMap = { sm: 40, md: 52, lg: 64 };
26192
- ANIM_STATE_CLASS = {
26193
- idle: "",
26194
- drawn: "scale-105",
26195
- played: "-translate-y-2 opacity-80",
26196
- flipped: "scale-x-0"
26197
- };
26198
- GameCard.displayName = "GameCard";
26199
- }
26200
- });
26201
25876
  function HealthBar({
26202
25877
  current = 3,
26203
25878
  max = 5,
@@ -26211,7 +25886,7 @@ function HealthBar({
26211
25886
  frameAsset,
26212
25887
  fillAsset
26213
25888
  }) {
26214
- const sizes = sizeMap7[size];
25889
+ const sizes = sizeMap4[size];
26215
25890
  const percentage = max > 0 ? Math.max(0, Math.min(100, current / max * 100)) : 0;
26216
25891
  if (format === "hearts") {
26217
25892
  return /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { className: cn("flex items-center gap-1", className), children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -26316,7 +25991,7 @@ function HealthBar({
26316
25991
  max
26317
25992
  ] });
26318
25993
  }
26319
- var heartIcon, sizeMap7;
25994
+ var heartIcon, sizeMap4;
26320
25995
  var init_HealthBar = __esm({
26321
25996
  "components/game/atoms/HealthBar.tsx"() {
26322
25997
  init_cn();
@@ -26333,7 +26008,7 @@ var init_HealthBar = __esm({
26333
26008
  children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" })
26334
26009
  }
26335
26010
  );
26336
- sizeMap7 = {
26011
+ sizeMap4 = {
26337
26012
  sm: { heart: "w-4 h-4", bar: "h-2", text: "text-sm", label: "text-xs", badge: "text-xs px-1.5 py-0.5" },
26338
26013
  md: { heart: "w-6 h-6", bar: "h-3", text: "text-base", label: "text-xs", badge: "text-xs px-2 py-0.5" },
26339
26014
  lg: { heart: "w-8 h-8", bar: "h-4", text: "text-lg", label: "text-sm", badge: "text-sm px-2.5 py-1" }
@@ -26358,7 +26033,7 @@ function ScoreDisplay({
26358
26033
  {
26359
26034
  className: cn(
26360
26035
  "flex items-center gap-2 font-bold",
26361
- sizeMap8[size],
26036
+ sizeMap5[size],
26362
26037
  className
26363
26038
  ),
26364
26039
  children: [
@@ -26369,7 +26044,7 @@ function ScoreDisplay({
26369
26044
  }
26370
26045
  );
26371
26046
  }
26372
- var sizeMap8;
26047
+ var sizeMap5;
26373
26048
  var init_ScoreDisplay = __esm({
26374
26049
  "components/game/atoms/ScoreDisplay.tsx"() {
26375
26050
  init_cn();
@@ -26377,7 +26052,7 @@ var init_ScoreDisplay = __esm({
26377
26052
  init_Box();
26378
26053
  init_Typography();
26379
26054
  init_GameIcon();
26380
- sizeMap8 = {
26055
+ sizeMap5 = {
26381
26056
  sm: "text-sm",
26382
26057
  md: "text-lg",
26383
26058
  lg: "text-2xl",
@@ -26386,192 +26061,6 @@ var init_ScoreDisplay = __esm({
26386
26061
  ScoreDisplay.displayName = "ScoreDisplay";
26387
26062
  }
26388
26063
  });
26389
- function Sprite({
26390
- spritesheet = DEFAULT_SPRITESHEET,
26391
- frameWidth = 64,
26392
- frameHeight = 64,
26393
- frame = 0,
26394
- x = 0,
26395
- y = 0,
26396
- scale = 1,
26397
- flipX = false,
26398
- flipY = false,
26399
- rotation = 0,
26400
- opacity = 1,
26401
- zIndex = 0,
26402
- columns = 16,
26403
- animState: _animState,
26404
- frameRate: _frameRate,
26405
- className,
26406
- onClick,
26407
- action
26408
- }) {
26409
- const eventBus = useEventBus();
26410
- const sourcePosition = React73.useMemo(() => {
26411
- const { sx, sy } = frameRect(frame, Math.floor(frame / columns), columns, frameWidth, frameHeight);
26412
- return { x: sx, y: sy };
26413
- }, [frame, columns, frameWidth, frameHeight]);
26414
- const transform = React73.useMemo(() => {
26415
- const transforms = [
26416
- `translate(${x}px, ${y}px)`
26417
- ];
26418
- if (scale !== 1) {
26419
- transforms.push(`scale(${scale})`);
26420
- }
26421
- if (flipX || flipY) {
26422
- transforms.push(`scale(${flipX ? -1 : 1}, ${flipY ? -1 : 1})`);
26423
- }
26424
- if (rotation !== 0) {
26425
- transforms.push(`rotate(${rotation}deg)`);
26426
- }
26427
- return transforms.join(" ");
26428
- }, [x, y, scale, flipX, flipY, rotation]);
26429
- const backgroundPosition = `-${sourcePosition.x}px -${sourcePosition.y}px`;
26430
- const handleClick = () => {
26431
- if (action) eventBus.emit(`UI:${action}`, {});
26432
- onClick?.();
26433
- };
26434
- return /* @__PURE__ */ jsxRuntime.jsx(
26435
- exports.Box,
26436
- {
26437
- position: "absolute",
26438
- className,
26439
- onClick: action || onClick ? handleClick : void 0,
26440
- style: {
26441
- width: frameWidth,
26442
- height: frameHeight,
26443
- backgroundImage: `url(${spritesheet.url})`,
26444
- backgroundPosition,
26445
- backgroundRepeat: "no-repeat",
26446
- imageRendering: "pixelated",
26447
- transform,
26448
- transformOrigin: "center center",
26449
- opacity,
26450
- zIndex,
26451
- pointerEvents: action || onClick ? "auto" : "none"
26452
- }
26453
- }
26454
- );
26455
- }
26456
- function drawSprite(ctx, image, props) {
26457
- const {
26458
- frameWidth,
26459
- frameHeight,
26460
- frame,
26461
- x,
26462
- y,
26463
- scale = 1,
26464
- flipX = false,
26465
- flipY = false,
26466
- rotation = 0,
26467
- opacity = 1,
26468
- columns = 16
26469
- } = props;
26470
- const { sx: sourceX, sy: sourceY } = frameRect(frame, Math.floor(frame / columns), columns, frameWidth, frameHeight);
26471
- ctx.save();
26472
- ctx.globalAlpha = opacity;
26473
- ctx.translate(x + frameWidth / 2, y + frameHeight / 2);
26474
- if (rotation !== 0) {
26475
- ctx.rotate(rotation * Math.PI / 180);
26476
- }
26477
- ctx.scale(scale * (flipX ? -1 : 1), scale * (flipY ? -1 : 1));
26478
- ctx.drawImage(
26479
- image,
26480
- sourceX,
26481
- sourceY,
26482
- frameWidth,
26483
- frameHeight,
26484
- -frameWidth / 2,
26485
- -frameHeight / 2,
26486
- frameWidth,
26487
- frameHeight
26488
- );
26489
- ctx.restore();
26490
- }
26491
- var DEFAULT_SPRITESHEET;
26492
- var init_Sprite = __esm({
26493
- "components/game/atoms/Sprite.tsx"() {
26494
- "use client";
26495
- init_useEventBus();
26496
- init_Box();
26497
- init_spriteAnimation();
26498
- DEFAULT_SPRITESHEET = {
26499
- url: "https://almadar-kflow-assets.web.app/shared/isometric-blocks/Spritesheet/allTiles_sheet.png",
26500
- role: "tile",
26501
- category: "tile"
26502
- };
26503
- }
26504
- });
26505
- function isKnownState(s) {
26506
- return s in DEFAULT_STATE_STYLES;
26507
- }
26508
- function StateIndicator({
26509
- assetUrl = DEFAULT_ASSET_URL4,
26510
- state = "idle",
26511
- label,
26512
- size = "md",
26513
- animated = true,
26514
- stateStyles,
26515
- className
26516
- }) {
26517
- const mergedStyles = stateStyles ? { ...DEFAULT_STATE_STYLES, ...stateStyles } : DEFAULT_STATE_STYLES;
26518
- const knownState = isKnownState(state) ? state : null;
26519
- const config = knownState !== null ? mergedStyles[knownState] ?? DEFAULT_STYLE : DEFAULT_STYLE;
26520
- const displayLabel = label ?? state.charAt(0).toUpperCase() + state.slice(1);
26521
- return /* @__PURE__ */ jsxRuntime.jsxs(
26522
- exports.Box,
26523
- {
26524
- display: "inline-flex",
26525
- className: cn(
26526
- "items-center gap-1 rounded-full text-foreground font-medium",
26527
- config.bgClass,
26528
- SIZE_CLASSES[size],
26529
- animated && (knownState === null || !STATIC_STATES.has(knownState)) && "animate-pulse",
26530
- className
26531
- ),
26532
- children: [
26533
- /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", children: assetUrl ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: 16, alt: displayLabel, className: "flex-shrink-0" }) : typeof config.icon === "string" ? /^[a-zA-Z0-9-]+$/.test(config.icon) ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: config.icon }) : config.icon : /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { icon: config.icon }) }),
26534
- /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", children: displayLabel })
26535
- ]
26536
- }
26537
- );
26538
- }
26539
- var DEFAULT_ASSET_URL4, DEFAULT_STATE_STYLES, DEFAULT_STYLE, STATIC_STATES, SIZE_CLASSES;
26540
- var init_StateIndicator = __esm({
26541
- "components/game/atoms/StateIndicator.tsx"() {
26542
- init_Box();
26543
- init_Icon();
26544
- init_cn();
26545
- init_GameIcon();
26546
- DEFAULT_ASSET_URL4 = {
26547
- url: "https://almadar-kflow-assets.web.app/shared/isometric-dungeon/Isometric/chestClosed_E.png",
26548
- role: "ui",
26549
- category: "state"
26550
- };
26551
- DEFAULT_STATE_STYLES = {
26552
- idle: { icon: "\u23F8", bgClass: "bg-muted" },
26553
- active: { icon: "\u25B6", bgClass: "bg-success" },
26554
- sleeping: { icon: "\u{1F4A4}", bgClass: "bg-muted" },
26555
- moving: { icon: "\u{1F6B6}", bgClass: "bg-info" },
26556
- eating: { icon: "\u{1F37D}\uFE0F", bgClass: "bg-success" },
26557
- waiting: { icon: "\u23F3", bgClass: "bg-warning" },
26558
- happy: { icon: "\u{1F60A}", bgClass: "bg-success" },
26559
- scared: { icon: "\u{1F628}", bgClass: "bg-error" },
26560
- done: { icon: "\u2713", bgClass: "bg-success" },
26561
- error: { icon: "\u2717", bgClass: "bg-error" },
26562
- ready: { icon: "\u2713", bgClass: "bg-success" },
26563
- cooldown: { icon: "\u{1F504}", bgClass: "bg-warning" }
26564
- };
26565
- DEFAULT_STYLE = { icon: "?", bgClass: "bg-muted" };
26566
- STATIC_STATES = /* @__PURE__ */ new Set(["idle", "done"]);
26567
- SIZE_CLASSES = {
26568
- sm: "text-xs px-1.5 py-0.5",
26569
- md: "text-sm px-2 py-1",
26570
- lg: "text-base px-3 py-1.5"
26571
- };
26572
- StateIndicator.displayName = "StateIndicator";
26573
- }
26574
- });
26575
26064
  function formatTime(seconds, format) {
26576
26065
  const clamped = Math.max(0, Math.floor(seconds));
26577
26066
  if (format === "ss") {
@@ -26601,7 +26090,7 @@ function TimerDisplay({
26601
26090
  className: cn(
26602
26091
  "inline-flex items-center gap-1 justify-center rounded-container",
26603
26092
  "bg-card/80 border border-muted font-mono font-bold tabular-nums",
26604
- sizeMap9[size],
26093
+ sizeMap6[size],
26605
26094
  running && "border-success/50",
26606
26095
  isLow && "text-error border-error/50 animate-pulse",
26607
26096
  !isLow && "text-foreground",
@@ -26614,13 +26103,13 @@ function TimerDisplay({
26614
26103
  }
26615
26104
  );
26616
26105
  }
26617
- var sizeMap9;
26106
+ var sizeMap6;
26618
26107
  var init_TimerDisplay = __esm({
26619
26108
  "components/game/atoms/TimerDisplay.tsx"() {
26620
26109
  init_cn();
26621
26110
  init_Box();
26622
26111
  init_GameIcon();
26623
- sizeMap9 = {
26112
+ sizeMap6 = {
26624
26113
  sm: "text-sm px-2 py-0.5",
26625
26114
  md: "text-lg px-3 py-1",
26626
26115
  lg: "text-2xl px-4 py-1.5"
@@ -26628,396 +26117,6 @@ var init_TimerDisplay = __esm({
26628
26117
  TimerDisplay.displayName = "TimerDisplay";
26629
26118
  }
26630
26119
  });
26631
- function ResourceCounter({
26632
- assetUrl = DEFAULT_ASSET_URL5,
26633
- icon,
26634
- label = "Gold",
26635
- value = 250,
26636
- max,
26637
- color,
26638
- size = "md",
26639
- className
26640
- }) {
26641
- const sizes = sizeMap10[size];
26642
- return /* @__PURE__ */ jsxRuntime.jsxs(
26643
- exports.Box,
26644
- {
26645
- className: cn(
26646
- "inline-flex items-center rounded-container",
26647
- "bg-card/80 border border-muted font-medium text-foreground",
26648
- sizes.wrapper,
26649
- className
26650
- ),
26651
- children: [
26652
- assetUrl ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: sizes.img, alt: label, className: "flex-shrink-0" }) : icon ? /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", className: cn("flex-shrink-0", sizes.icon), children: typeof icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: icon }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { icon }) }) : null,
26653
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-muted-foreground", children: label }),
26654
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { as: "span", className: cn("font-bold tabular-nums", color && (color in colorTokenClasses2 ? colorTokenClasses2[color] : color)), children: [
26655
- value,
26656
- max != null && /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { as: "span", className: "text-muted-foreground", children: [
26657
- "/",
26658
- max
26659
- ] })
26660
- ] })
26661
- ]
26662
- }
26663
- );
26664
- }
26665
- var colorTokenClasses2, DEFAULT_ASSET_URL5, sizeMap10;
26666
- var init_ResourceCounter = __esm({
26667
- "components/game/atoms/ResourceCounter.tsx"() {
26668
- init_cn();
26669
- init_Icon();
26670
- init_Box();
26671
- init_Typography();
26672
- init_GameIcon();
26673
- colorTokenClasses2 = {
26674
- primary: "text-primary",
26675
- secondary: "text-secondary",
26676
- success: "text-success",
26677
- warning: "text-warning",
26678
- error: "text-error",
26679
- muted: "text-muted-foreground"
26680
- };
26681
- DEFAULT_ASSET_URL5 = {
26682
- url: "https://almadar-kflow-assets.web.app/shared/world-map/gold_mine.png",
26683
- role: "ui",
26684
- category: "coin"
26685
- };
26686
- sizeMap10 = {
26687
- sm: { wrapper: "text-xs gap-1 px-1.5 py-0.5", icon: "text-sm", img: 16 },
26688
- md: { wrapper: "text-sm gap-1.5 px-2 py-1", icon: "text-base", img: 20 },
26689
- lg: { wrapper: "text-base gap-2 px-3 py-1.5", icon: "text-lg", img: 28 }
26690
- };
26691
- ResourceCounter.displayName = "ResourceCounter";
26692
- }
26693
- });
26694
- function ItemSlot({
26695
- assetUrl = DEFAULT_ASSET_URL6,
26696
- icon = "sword",
26697
- label = "Iron Sword",
26698
- quantity,
26699
- rarity = "uncommon",
26700
- empty,
26701
- size = "md",
26702
- selected,
26703
- onClick,
26704
- action,
26705
- className
26706
- }) {
26707
- const eventBus = useEventBus();
26708
- const isClickable = onClick != null || action != null;
26709
- const px = assetSizeMap[size];
26710
- return /* @__PURE__ */ jsxRuntime.jsx(
26711
- exports.Button,
26712
- {
26713
- variant: "ghost",
26714
- onClick: () => {
26715
- if (action) eventBus.emit(`UI:${action}`, {});
26716
- onClick?.();
26717
- },
26718
- disabled: !isClickable,
26719
- title: label,
26720
- className: cn(
26721
- "relative flex items-center justify-center rounded-interactive border-2",
26722
- "bg-card/80 transition-all duration-150",
26723
- sizeMap11[size],
26724
- empty ? "border-border bg-card/50" : rarityBorderMap[rarity],
26725
- !empty && rarityGlowMap[rarity],
26726
- selected && "ring-2 ring-foreground ring-offset-1 ring-offset-background",
26727
- isClickable && !empty && "hover:brightness-125 cursor-pointer",
26728
- isClickable && empty && "hover:border-muted cursor-pointer",
26729
- !isClickable && "cursor-default",
26730
- className
26731
- ),
26732
- children: empty ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-muted-foreground text-base", children: "+" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
26733
- assetUrl ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: px, alt: label, className: "flex-shrink-0" }) : icon ? /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", className: "flex-shrink-0", children: typeof icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: icon }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { icon }) }) : null,
26734
- quantity != null && quantity > 1 && /* @__PURE__ */ jsxRuntime.jsx(
26735
- exports.Typography,
26736
- {
26737
- as: "span",
26738
- className: cn(
26739
- "absolute -bottom-1 -right-1 flex items-center justify-center",
26740
- "min-w-[18px] h-[18px] rounded-full px-1",
26741
- "bg-surface border border-muted text-xs font-bold text-foreground"
26742
- ),
26743
- children: quantity
26744
- }
26745
- )
26746
- ] })
26747
- }
26748
- );
26749
- }
26750
- var sizeMap11, rarityBorderMap, rarityGlowMap, DEFAULT_ASSET_URL6, assetSizeMap;
26751
- var init_ItemSlot = __esm({
26752
- "components/game/atoms/ItemSlot.tsx"() {
26753
- "use client";
26754
- init_cn();
26755
- init_Icon();
26756
- init_useEventBus();
26757
- init_Button();
26758
- init_Box();
26759
- init_Typography();
26760
- init_GameIcon();
26761
- sizeMap11 = {
26762
- sm: "w-10 h-10 text-lg",
26763
- md: "w-14 h-14 text-2xl",
26764
- lg: "w-18 h-18 text-3xl"
26765
- };
26766
- rarityBorderMap = {
26767
- common: "border-muted",
26768
- uncommon: "border-success",
26769
- rare: "border-info",
26770
- epic: "border-accent",
26771
- legendary: "border-warning"
26772
- };
26773
- rarityGlowMap = {
26774
- common: "",
26775
- uncommon: "",
26776
- rare: "shadow-sm",
26777
- epic: "shadow-lg",
26778
- legendary: "shadow-lg"
26779
- };
26780
- DEFAULT_ASSET_URL6 = {
26781
- url: "https://almadar-kflow-assets.web.app/shared/isometric-dungeon/Isometric/chestClosed_E.png",
26782
- role: "item",
26783
- category: "item"
26784
- };
26785
- assetSizeMap = {
26786
- sm: 28,
26787
- md: 40,
26788
- lg: 56
26789
- };
26790
- ItemSlot.displayName = "ItemSlot";
26791
- }
26792
- });
26793
- function TurnIndicator({
26794
- assetUrl = DEFAULT_ASSET_URL7,
26795
- currentTurn = 1,
26796
- maxTurns,
26797
- activeTeam,
26798
- phase,
26799
- size = "md",
26800
- className
26801
- }) {
26802
- const sizes = sizeMap12[size];
26803
- return /* @__PURE__ */ jsxRuntime.jsxs(
26804
- exports.Box,
26805
- {
26806
- className: cn(
26807
- "inline-flex items-center rounded-container",
26808
- "bg-card/80 border border-muted font-medium text-foreground",
26809
- sizes.wrapper,
26810
- className
26811
- ),
26812
- children: [
26813
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { as: "span", className: "font-bold tabular-nums", children: [
26814
- "Turn ",
26815
- currentTurn,
26816
- maxTurns != null && /* @__PURE__ */ jsxRuntime.jsxs(exports.Typography, { as: "span", className: "text-muted-foreground", children: [
26817
- "/",
26818
- maxTurns
26819
- ] })
26820
- ] }),
26821
- phase && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
26822
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-muted-foreground", children: "|" }),
26823
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-muted-foreground", children: phase })
26824
- ] }),
26825
- activeTeam && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
26826
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-muted-foreground", children: "|" }),
26827
- assetUrl ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: 12, className: "flex-shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", className: cn("rounded-full bg-success/20", sizes.dot) }),
26828
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-success", children: activeTeam })
26829
- ] })
26830
- ]
26831
- }
26832
- );
26833
- }
26834
- var sizeMap12, DEFAULT_ASSET_URL7;
26835
- var init_TurnIndicator = __esm({
26836
- "components/game/atoms/TurnIndicator.tsx"() {
26837
- init_cn();
26838
- init_Box();
26839
- init_Typography();
26840
- init_GameIcon();
26841
- sizeMap12 = {
26842
- sm: { wrapper: "text-xs gap-1.5 px-2 py-0.5", dot: "w-1.5 h-1.5" },
26843
- md: { wrapper: "text-sm gap-2 px-3 py-1", dot: "w-2 h-2" },
26844
- lg: { wrapper: "text-base gap-2.5 px-4 py-1.5", dot: "w-2.5 h-2.5" }
26845
- };
26846
- DEFAULT_ASSET_URL7 = {
26847
- url: "https://almadar-kflow-assets.web.app/shared/effects/particles/symbol_01.png",
26848
- role: "ui",
26849
- category: "turn"
26850
- };
26851
- TurnIndicator.displayName = "TurnIndicator";
26852
- }
26853
- });
26854
- function WaypointMarker({
26855
- assetUrl = DEFAULT_ASSET_URL8,
26856
- label,
26857
- icon,
26858
- active = true,
26859
- completed = false,
26860
- size = "md",
26861
- className
26862
- }) {
26863
- const sizes = sizeMap13[size];
26864
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: cn("flex flex-col items-center", className), children: [
26865
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { className: "relative flex items-center justify-center", children: [
26866
- active && /* @__PURE__ */ jsxRuntime.jsx(
26867
- exports.Box,
26868
- {
26869
- position: "absolute",
26870
- className: cn(
26871
- "rounded-full border-2 border-info animate-ping opacity-50",
26872
- sizes.ring
26873
- )
26874
- }
26875
- ),
26876
- active && /* @__PURE__ */ jsxRuntime.jsx(
26877
- exports.Box,
26878
- {
26879
- position: "absolute",
26880
- className: cn(
26881
- "rounded-full border-2 border-info",
26882
- sizes.ring
26883
- )
26884
- }
26885
- ),
26886
- /* @__PURE__ */ jsxRuntime.jsx(
26887
- exports.Box,
26888
- {
26889
- position: "relative",
26890
- className: cn(
26891
- "flex items-center justify-center rounded-full transition-all duration-200",
26892
- sizes.dot,
26893
- completed && "bg-success text-foreground",
26894
- active && !completed && "bg-info text-foreground",
26895
- !active && !completed && "bg-muted"
26896
- ),
26897
- children: completed ? checkIcon : assetUrl ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: sizes.img, alt: label, className: "flex-shrink-0" }) : icon ? typeof icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: icon }) : /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { icon }) : null
26898
- }
26899
- )
26900
- ] }),
26901
- label && /* @__PURE__ */ jsxRuntime.jsx(
26902
- exports.Typography,
26903
- {
26904
- as: "span",
26905
- className: cn(
26906
- "text-center whitespace-nowrap",
26907
- sizes.label,
26908
- completed ? "text-success" : active ? "text-info" : "text-muted-foreground"
26909
- ),
26910
- children: label
26911
- }
26912
- )
26913
- ] });
26914
- }
26915
- var DEFAULT_ASSET_URL8, sizeMap13, checkIcon;
26916
- var init_WaypointMarker = __esm({
26917
- "components/game/atoms/WaypointMarker.tsx"() {
26918
- init_cn();
26919
- init_Icon();
26920
- init_Box();
26921
- init_Typography();
26922
- init_GameIcon();
26923
- DEFAULT_ASSET_URL8 = {
26924
- url: "https://almadar-kflow-assets.web.app/shared/world-map/battle_marker.png",
26925
- role: "ui",
26926
- category: "waypoint"
26927
- };
26928
- sizeMap13 = {
26929
- sm: { dot: "w-4 h-4", ring: "w-6 h-6", label: "text-xs mt-1", img: 12 },
26930
- md: { dot: "w-6 h-6", ring: "w-8 h-8", label: "text-sm mt-1.5", img: 18 },
26931
- lg: { dot: "w-8 h-8", ring: "w-10 h-10", label: "text-base mt-2", img: 24 }
26932
- };
26933
- checkIcon = /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 3, className: "w-3/5 h-3/5", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 13l4 4L19 7", strokeLinecap: "round", strokeLinejoin: "round" }) });
26934
- WaypointMarker.displayName = "WaypointMarker";
26935
- }
26936
- });
26937
- function formatDuration(seconds) {
26938
- if (seconds >= 60) {
26939
- return `${Math.floor(seconds / 60)}m`;
26940
- }
26941
- return `${Math.round(seconds)}s`;
26942
- }
26943
- function StatusEffect({
26944
- assetUrl = DEFAULT_ASSET_URL9,
26945
- icon,
26946
- label = "Shield",
26947
- duration = 30,
26948
- stacks,
26949
- variant = "buff",
26950
- size = "md",
26951
- className
26952
- }) {
26953
- const sizes = sizeMap14[size];
26954
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { position: "relative", className: cn("inline-flex flex-col items-center", className), children: [
26955
- /* @__PURE__ */ jsxRuntime.jsxs(
26956
- exports.Box,
26957
- {
26958
- position: "relative",
26959
- className: cn(
26960
- "flex items-center justify-center rounded-interactive border-2",
26961
- sizes.container,
26962
- variantStyles8[variant]
26963
- ),
26964
- title: label,
26965
- children: [
26966
- /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", className: cn("flex items-center justify-center", sizes.icon), children: assetUrl ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: sizes.img, alt: label, className: "flex-shrink-0" }) : icon != null && typeof icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: icon, size: "sm" }) : icon != null ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { icon, size: "sm" }) : null }),
26967
- duration !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(
26968
- exports.Typography,
26969
- {
26970
- as: "span",
26971
- className: cn(
26972
- "absolute bottom-0 left-0 right-0 text-center font-mono font-bold text-foreground bg-background/60 leading-tight",
26973
- sizes.timer
26974
- ),
26975
- children: formatDuration(duration)
26976
- }
26977
- )
26978
- ]
26979
- }
26980
- ),
26981
- stacks !== void 0 && stacks > 1 && /* @__PURE__ */ jsxRuntime.jsx(
26982
- exports.Typography,
26983
- {
26984
- as: "span",
26985
- className: cn(
26986
- "absolute flex items-center justify-center rounded-full bg-card text-foreground font-bold leading-none",
26987
- sizes.badge
26988
- ),
26989
- children: stacks
26990
- }
26991
- ),
26992
- label && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { as: "span", className: "text-xs text-muted-foreground mt-0.5 text-center whitespace-nowrap", children: label })
26993
- ] });
26994
- }
26995
- var DEFAULT_ASSET_URL9, sizeMap14, variantStyles8;
26996
- var init_StatusEffect = __esm({
26997
- "components/game/atoms/StatusEffect.tsx"() {
26998
- init_cn();
26999
- init_Icon();
27000
- init_Box();
27001
- init_Typography();
27002
- init_GameIcon();
27003
- DEFAULT_ASSET_URL9 = {
27004
- url: "https://almadar-kflow-assets.web.app/shared/effects/particles/flame_01.png",
27005
- role: "ui",
27006
- category: "effect"
27007
- };
27008
- sizeMap14 = {
27009
- sm: { container: "w-8 h-8", icon: "text-sm", badge: "text-xs -top-1 -right-1 w-4 h-4", timer: "text-[9px]", img: 20 },
27010
- md: { container: "w-10 h-10", icon: "text-base", badge: "text-xs -top-1 -right-1 w-5 h-5", timer: "text-xs", img: 28 },
27011
- lg: { container: "w-12 h-12", icon: "text-lg", badge: "text-sm -top-1.5 -right-1.5 w-6 h-6", timer: "text-xs", img: 36 }
27012
- };
27013
- variantStyles8 = {
27014
- buff: "border-success bg-success/20",
27015
- debuff: "border-error bg-error/20",
27016
- neutral: "border-muted bg-muted/20"
27017
- };
27018
- StatusEffect.displayName = "StatusEffect";
27019
- }
27020
- });
27021
26120
  function DialogueBubble({
27022
26121
  speaker = "Hero",
27023
26122
  text = "The dungeon awaits. Choose your path wisely.",
@@ -27089,7 +26188,7 @@ function StatBadge({
27089
26188
  {
27090
26189
  className: cn(
27091
26190
  "inline-flex items-center gap-2 rounded-container border backdrop-blur-sm",
27092
- sizeMap15[size] ?? sizeMap15.md,
26191
+ sizeMap7[size] ?? sizeMap7.md,
27093
26192
  variantMap2[variant] ?? variantMap2.default,
27094
26193
  className
27095
26194
  ),
@@ -27126,7 +26225,7 @@ function StatBadge({
27126
26225
  }
27127
26226
  );
27128
26227
  }
27129
- var sizeMap15, variantMap2;
26228
+ var sizeMap7, variantMap2;
27130
26229
  var init_StatBadge = __esm({
27131
26230
  "components/game/molecules/StatBadge.tsx"() {
27132
26231
  init_cn();
@@ -27136,7 +26235,7 @@ var init_StatBadge = __esm({
27136
26235
  init_GameIcon();
27137
26236
  init_HealthBar();
27138
26237
  init_ScoreDisplay();
27139
- sizeMap15 = {
26238
+ sizeMap7 = {
27140
26239
  sm: "text-xs px-2 py-1",
27141
26240
  md: "text-sm px-3 py-1.5",
27142
26241
  lg: "text-base px-4 py-2"
@@ -27151,129 +26250,6 @@ var init_StatBadge = __esm({
27151
26250
  StatBadge.displayName = "StatBadge";
27152
26251
  }
27153
26252
  });
27154
- function InventoryGrid({
27155
- items = DEFAULT_GRID_ITEMS,
27156
- columns = 4,
27157
- totalSlots = 12,
27158
- selectedId = "",
27159
- onSelect,
27160
- selectEvent,
27161
- size = "md",
27162
- className
27163
- }) {
27164
- const eventBus = useEventBus();
27165
- const slotCount = totalSlots ?? items.length;
27166
- const emptySlotCount = Math.max(0, slotCount - items.length);
27167
- const handleSelect = React73__namespace.useCallback(
27168
- (id) => {
27169
- onSelect?.(id);
27170
- if (selectEvent) {
27171
- eventBus.emit(`UI:${selectEvent}`, { id });
27172
- }
27173
- },
27174
- [onSelect, selectEvent, eventBus]
27175
- );
27176
- const gridClass = columnMap[columns] ?? `grid-cols-${columns}`;
27177
- return /* @__PURE__ */ jsxRuntime.jsxs(
27178
- exports.Box,
27179
- {
27180
- className: cn("grid gap-2", gridClass, className),
27181
- children: [
27182
- items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
27183
- ItemSlot,
27184
- {
27185
- icon: item.icon,
27186
- assetUrl: item.assetUrl,
27187
- label: item.label,
27188
- quantity: item.quantity,
27189
- rarity: item.rarity,
27190
- size,
27191
- selected: selectedId === item.id,
27192
- onClick: () => handleSelect(item.id)
27193
- },
27194
- item.id
27195
- )),
27196
- Array.from({ length: emptySlotCount }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
27197
- ItemSlot,
27198
- {
27199
- empty: true,
27200
- size
27201
- },
27202
- `empty-${index}`
27203
- ))
27204
- ]
27205
- }
27206
- );
27207
- }
27208
- var columnMap, DEFAULT_GRID_ITEMS;
27209
- var init_InventoryGrid = __esm({
27210
- "components/game/molecules/InventoryGrid.tsx"() {
27211
- "use client";
27212
- init_cn();
27213
- init_useEventBus();
27214
- init_ItemSlot();
27215
- init_Box();
27216
- columnMap = {
27217
- 2: "grid-cols-2",
27218
- 3: "grid-cols-3",
27219
- 4: "grid-cols-4",
27220
- 5: "grid-cols-5",
27221
- 6: "grid-cols-6",
27222
- 7: "grid-cols-7",
27223
- 8: "grid-cols-8"
27224
- };
27225
- DEFAULT_GRID_ITEMS = [
27226
- { id: "grid-1", icon: "sword", label: "Iron Sword", quantity: 1, rarity: "common" },
27227
- { id: "grid-2", icon: "flask-conical", label: "Health Potion", quantity: 3, rarity: "uncommon" },
27228
- { id: "grid-3", icon: "shield", label: "Wooden Shield", quantity: 1, rarity: "common" },
27229
- { id: "grid-4", icon: "gem", label: "Ruby Gem", quantity: 2, rarity: "rare" }
27230
- ];
27231
- InventoryGrid.displayName = "InventoryGrid";
27232
- }
27233
- });
27234
- function ResourceBar({
27235
- resources = DEFAULT_RESOURCES,
27236
- size = "md",
27237
- className
27238
- }) {
27239
- return /* @__PURE__ */ jsxRuntime.jsx(
27240
- exports.Box,
27241
- {
27242
- className: cn(
27243
- "flex items-center gap-2 flex-wrap",
27244
- className
27245
- ),
27246
- children: resources.map((resource, i) => /* @__PURE__ */ jsxRuntime.jsx(
27247
- StatBadge,
27248
- {
27249
- label: resource.label,
27250
- value: resource.value,
27251
- max: resource.max,
27252
- format: resource.max != null ? "bar" : "number",
27253
- icon: resource.icon,
27254
- assetUrl: resource.assetUrl,
27255
- size
27256
- },
27257
- i
27258
- ))
27259
- }
27260
- );
27261
- }
27262
- var DEFAULT_RESOURCES;
27263
- var init_ResourceBar = __esm({
27264
- "components/game/molecules/ResourceBar.tsx"() {
27265
- "use client";
27266
- init_cn();
27267
- init_StatBadge();
27268
- init_Box();
27269
- DEFAULT_RESOURCES = [
27270
- { icon: "coins", label: "Gold", value: 320 },
27271
- { icon: "zap", label: "Energy", value: 7, max: 10 },
27272
- { icon: "gem", label: "Crystals", value: 15 }
27273
- ];
27274
- ResourceBar.displayName = "ResourceBar";
27275
- }
27276
- });
27277
26253
  function convertElementsToStats(elements) {
27278
26254
  return elements.map((el) => {
27279
26255
  const [source, field] = el.bind?.split(".") ?? [];
@@ -27756,11 +26732,46 @@ function useUnitSpriteAtlas(units) {
27756
26732
  return { sheetUrls, resolveUnitFrame, pendingCount };
27757
26733
  }
27758
26734
  var init_useUnitSpriteAtlas = __esm({
27759
- "components/game/hooks/useUnitSpriteAtlas.ts"() {
26735
+ "hooks/useUnitSpriteAtlas.ts"() {
27760
26736
  "use client";
27761
26737
  init_spriteAnimation();
27762
26738
  }
27763
26739
  });
26740
+ function GameAudioToggle({
26741
+ size = "sm",
26742
+ className,
26743
+ onAsset,
26744
+ offAsset
26745
+ }) {
26746
+ const ctx = providers.useGameAudioContextOptional();
26747
+ const [localMuted, setLocalMuted] = React73.useState(false);
26748
+ const muted = ctx ? ctx.muted : localMuted;
26749
+ const setMuted = ctx ? ctx.setMuted : setLocalMuted;
26750
+ const handleToggle = React73.useCallback(() => {
26751
+ setMuted(!muted);
26752
+ }, [muted, setMuted]);
26753
+ const activeAsset = muted ? offAsset : onAsset;
26754
+ return /* @__PURE__ */ jsxRuntime.jsx(
26755
+ exports.Button,
26756
+ {
26757
+ variant: "ghost",
26758
+ size,
26759
+ onClick: handleToggle,
26760
+ className: cn("text-lg leading-none px-2", className),
26761
+ "aria-pressed": muted,
26762
+ children: activeAsset ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl: activeAsset, icon: "image", size: 20, alt: muted ? "Muted" : "Sound on", className: "w-5 h-5 object-contain" }) : muted ? "\u{1F507}" : "\u{1F50A}"
26763
+ }
26764
+ );
26765
+ }
26766
+ var init_GameAudioToggle = __esm({
26767
+ "components/game/atoms/GameAudioToggle.tsx"() {
26768
+ "use client";
26769
+ init_atoms();
26770
+ init_cn();
26771
+ init_GameIcon();
26772
+ GameAudioToggle.displayName = "GameAudioToggle";
26773
+ }
26774
+ });
27764
26775
  function pickPath(entry) {
27765
26776
  if (Array.isArray(entry.path)) {
27766
26777
  return entry.path[Math.floor(Math.random() * entry.path.length)];
@@ -28023,108 +27034,79 @@ function useGameAudio({
28023
27034
  };
28024
27035
  }
28025
27036
  var init_useGameAudio = __esm({
28026
- "components/game/hooks/useGameAudio.ts"() {
27037
+ "hooks/useGameAudio.ts"() {
28027
27038
  "use client";
28028
27039
  useGameAudio.displayName = "useGameAudio";
28029
27040
  }
28030
27041
  });
28031
- function useGameAudioContext() {
28032
- const ctx = React73.useContext(exports.GameAudioContext);
28033
- if (!ctx) {
28034
- throw new Error("useGameAudioContext must be used inside <GameAudioProvider>");
28035
- }
28036
- return ctx;
28037
- }
28038
- function useGameAudioContextOptional() {
28039
- return React73.useContext(exports.GameAudioContext);
27042
+ function isKnownState(s) {
27043
+ return s in DEFAULT_STATE_STYLES;
28040
27044
  }
28041
- function GameAudioProvider({
28042
- manifest,
28043
- baseUrl = "",
28044
- children,
28045
- initialMuted = false
28046
- }) {
28047
- const eventBus = useEventBus();
28048
- const { play, stop, stopAll, playMusic, stopMusic, muted, setMuted, masterVolume, setMasterVolume } = useGameAudio({ manifest, baseUrl, initialMuted });
28049
- React73.useEffect(() => {
28050
- const unsubPlay = eventBus.on("UI:PLAY_SOUND", (event) => {
28051
- const key = event.payload?.key;
28052
- if (key) play(key);
28053
- });
28054
- const unsubStop = eventBus.on("UI:STOP_SOUND", (event) => {
28055
- const key = event.payload?.key;
28056
- if (key) {
28057
- stop(key);
28058
- } else {
28059
- stopAll();
28060
- }
28061
- });
28062
- const unsubChangeMusic = eventBus.on("UI:CHANGE_MUSIC", (event) => {
28063
- const key = event.payload?.key;
28064
- if (key) {
28065
- playMusic(key);
28066
- } else {
28067
- stopMusic();
28068
- }
28069
- });
28070
- const unsubStopMusic = eventBus.on("UI:STOP_MUSIC", () => {
28071
- stopMusic();
28072
- });
28073
- return () => {
28074
- unsubPlay();
28075
- unsubStop();
28076
- unsubChangeMusic();
28077
- unsubStopMusic();
28078
- };
28079
- }, [eventBus, play, stop, stopAll, playMusic, stopMusic]);
28080
- const value = { muted, setMuted, masterVolume, setMasterVolume, play, playMusic, stopMusic };
28081
- return /* @__PURE__ */ jsxRuntime.jsx(exports.GameAudioContext.Provider, { value, children });
28082
- }
28083
- exports.GameAudioContext = void 0;
28084
- var init_GameAudioProvider = __esm({
28085
- "components/game/providers/GameAudioProvider.tsx"() {
28086
- "use client";
28087
- init_useEventBus();
28088
- init_useGameAudio();
28089
- exports.GameAudioContext = React73.createContext(null);
28090
- exports.GameAudioContext.displayName = "GameAudioContext";
28091
- GameAudioProvider.displayName = "GameAudioProvider";
28092
- }
28093
- });
28094
- function GameAudioToggle({
28095
- size = "sm",
28096
- className,
28097
- onAsset,
28098
- offAsset
27045
+ function StateIndicator({
27046
+ assetUrl = DEFAULT_ASSET_URL,
27047
+ state = "idle",
27048
+ label,
27049
+ size = "md",
27050
+ animated = true,
27051
+ stateStyles,
27052
+ className
28099
27053
  }) {
28100
- const ctx = useGameAudioContextOptional();
28101
- const [localMuted, setLocalMuted] = React73.useState(false);
28102
- const muted = ctx ? ctx.muted : localMuted;
28103
- const setMuted = ctx ? ctx.setMuted : setLocalMuted;
28104
- const handleToggle = React73.useCallback(() => {
28105
- setMuted(!muted);
28106
- }, [muted, setMuted]);
28107
- const activeAsset = muted ? offAsset : onAsset;
28108
- return /* @__PURE__ */ jsxRuntime.jsx(
28109
- exports.Button,
27054
+ const mergedStyles = stateStyles ? { ...DEFAULT_STATE_STYLES, ...stateStyles } : DEFAULT_STATE_STYLES;
27055
+ const knownState = isKnownState(state) ? state : null;
27056
+ const config = knownState !== null ? mergedStyles[knownState] ?? DEFAULT_STYLE : DEFAULT_STYLE;
27057
+ const displayLabel = label ?? state.charAt(0).toUpperCase() + state.slice(1);
27058
+ return /* @__PURE__ */ jsxRuntime.jsxs(
27059
+ exports.Box,
28110
27060
  {
28111
- variant: "ghost",
28112
- size,
28113
- onClick: handleToggle,
28114
- className: cn("text-lg leading-none px-2", className),
28115
- "aria-pressed": muted,
28116
- children: activeAsset ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl: activeAsset, icon: "image", size: 20, alt: muted ? "Muted" : "Sound on", className: "w-5 h-5 object-contain" }) : muted ? "\u{1F507}" : "\u{1F50A}"
27061
+ display: "inline-flex",
27062
+ className: cn(
27063
+ "items-center gap-1 rounded-full text-foreground font-medium",
27064
+ config.bgClass,
27065
+ SIZE_CLASSES[size],
27066
+ animated && (knownState === null || !STATIC_STATES.has(knownState)) && "animate-pulse",
27067
+ className
27068
+ ),
27069
+ children: [
27070
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", children: assetUrl ? /* @__PURE__ */ jsxRuntime.jsx(GameIcon, { assetUrl, icon: "image", size: 16, alt: displayLabel, className: "flex-shrink-0" }) : typeof config.icon === "string" ? /^[a-zA-Z0-9-]+$/.test(config.icon) ? /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { name: config.icon }) : config.icon : /* @__PURE__ */ jsxRuntime.jsx(exports.Icon, { icon: config.icon }) }),
27071
+ /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { as: "span", children: displayLabel })
27072
+ ]
28117
27073
  }
28118
27074
  );
28119
27075
  }
28120
- var init_GameAudioToggle = __esm({
28121
- "components/game/atoms/GameAudioToggle.tsx"() {
28122
- "use client";
28123
- init_atoms();
27076
+ var DEFAULT_ASSET_URL, DEFAULT_STATE_STYLES, DEFAULT_STYLE, STATIC_STATES, SIZE_CLASSES;
27077
+ var init_StateIndicator = __esm({
27078
+ "components/game/atoms/StateIndicator.tsx"() {
27079
+ init_Box();
27080
+ init_Icon();
28124
27081
  init_cn();
28125
- init_GameAudioProvider();
28126
27082
  init_GameIcon();
28127
- GameAudioToggle.displayName = "GameAudioToggle";
27083
+ DEFAULT_ASSET_URL = {
27084
+ url: "https://almadar-kflow-assets.web.app/shared/isometric-dungeon/Isometric/chestClosed_E.png",
27085
+ role: "ui",
27086
+ category: "state"
27087
+ };
27088
+ DEFAULT_STATE_STYLES = {
27089
+ idle: { icon: "\u23F8", bgClass: "bg-muted" },
27090
+ active: { icon: "\u25B6", bgClass: "bg-success" },
27091
+ sleeping: { icon: "\u{1F4A4}", bgClass: "bg-muted" },
27092
+ moving: { icon: "\u{1F6B6}", bgClass: "bg-info" },
27093
+ eating: { icon: "\u{1F37D}\uFE0F", bgClass: "bg-success" },
27094
+ waiting: { icon: "\u23F3", bgClass: "bg-warning" },
27095
+ happy: { icon: "\u{1F60A}", bgClass: "bg-success" },
27096
+ scared: { icon: "\u{1F628}", bgClass: "bg-error" },
27097
+ done: { icon: "\u2713", bgClass: "bg-success" },
27098
+ error: { icon: "\u2717", bgClass: "bg-error" },
27099
+ ready: { icon: "\u2713", bgClass: "bg-success" },
27100
+ cooldown: { icon: "\u{1F504}", bgClass: "bg-warning" }
27101
+ };
27102
+ DEFAULT_STYLE = { icon: "?", bgClass: "bg-muted" };
27103
+ STATIC_STATES = /* @__PURE__ */ new Set(["idle", "done"]);
27104
+ SIZE_CLASSES = {
27105
+ sm: "text-xs px-1.5 py-0.5",
27106
+ md: "text-sm px-2 py-1",
27107
+ lg: "text-base px-3 py-1.5"
27108
+ };
27109
+ StateIndicator.displayName = "StateIndicator";
28128
27110
  }
28129
27111
  });
28130
27112
  function LinearView({
@@ -28697,7 +27679,7 @@ function EditorToolbar({ mode, onModeChange, className }) {
28697
27679
  }
28698
27680
  exports.TERRAIN_COLORS = void 0; exports.FEATURE_TYPES = void 0; var MODE_LABELS;
28699
27681
  var init_editorUtils = __esm({
28700
- "components/game/lib/editorUtils.tsx"() {
27682
+ "lib/editorUtils.tsx"() {
28701
27683
  init_Box();
28702
27684
  init_Stack();
28703
27685
  init_Typography();
@@ -28809,110 +27791,8 @@ var init_SequenceBar = __esm({
28809
27791
  SequenceBar.displayName = "SequenceBar";
28810
27792
  }
28811
27793
  });
28812
- function RuleEditor({
28813
- rule,
28814
- availableEvents,
28815
- availableActions,
28816
- onChange,
28817
- onRemove,
28818
- disabled = false,
28819
- className
28820
- }) {
28821
- const { t } = hooks.useTranslate();
28822
- const handleWhenChange = React73.useCallback((v) => {
28823
- onChange({ ...rule, whenEvent: v });
28824
- }, [rule, onChange]);
28825
- const handleThenChange = React73.useCallback((v) => {
28826
- onChange({ ...rule, thenAction: v });
28827
- }, [rule, onChange]);
28828
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { className: cn("items-center p-2 rounded-lg bg-muted/50 border border-border", className), gap: "sm", children: [
28829
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-primary font-bold whitespace-nowrap", children: t("eventHandler.when") }),
28830
- /* @__PURE__ */ jsxRuntime.jsx(
28831
- exports.Select,
28832
- {
28833
- value: rule.whenEvent,
28834
- onValueChange: handleWhenChange,
28835
- options: availableEvents,
28836
- disabled,
28837
- className: "flex-1 min-w-0"
28838
- }
28839
- ),
28840
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-accent font-bold whitespace-nowrap", children: "\u2192 " + t("eventHandler.then") }),
28841
- /* @__PURE__ */ jsxRuntime.jsx(
28842
- exports.Select,
28843
- {
28844
- value: rule.thenAction,
28845
- onValueChange: handleThenChange,
28846
- options: availableActions,
28847
- disabled,
28848
- className: "flex-1 min-w-0"
28849
- }
28850
- ),
28851
- onRemove && /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", onClick: onRemove, disabled, className: "shrink-0", children: "\xD7" })
28852
- ] });
28853
- }
28854
- var init_RuleEditor = __esm({
28855
- "components/game/molecules/RuleEditor.tsx"() {
28856
- init_atoms();
28857
- init_cn();
28858
- RuleEditor.displayName = "RuleEditor";
28859
- }
28860
- });
28861
- function EventLog({
28862
- entries,
28863
- maxHeight = 200,
28864
- label,
28865
- className
28866
- }) {
28867
- const { t } = hooks.useTranslate();
28868
- const scrollRef = React73.useRef(null);
28869
- React73.useEffect(() => {
28870
- if (scrollRef.current) {
28871
- scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
28872
- }
28873
- }, [entries.length]);
28874
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { className: cn("p-3 rounded-lg bg-card border border-border", className), gap: "sm", children: [
28875
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", className: "text-muted-foreground font-medium", children: label ?? t("eventHandler.eventLog") }),
28876
- /* @__PURE__ */ jsxRuntime.jsx(
28877
- exports.Box,
28878
- {
28879
- ref: scrollRef,
28880
- className: "overflow-y-auto",
28881
- style: { maxHeight },
28882
- children: /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "xs", children: [
28883
- entries.length === 0 && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-muted-foreground italic", children: t("eventHandler.noEvents") }),
28884
- entries.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { className: "items-start", gap: "xs", children: [
28885
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: STATUS_STYLES[entry.status], children: STATUS_DOTS[entry.status] }),
28886
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-foreground", children: entry.icon }),
28887
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: cn("flex-1", STATUS_STYLES[entry.status]), children: entry.message })
28888
- ] }, entry.id))
28889
- ] })
28890
- }
28891
- )
28892
- ] });
28893
- }
28894
- var STATUS_STYLES, STATUS_DOTS;
28895
- var init_EventLog = __esm({
28896
- "components/game/molecules/EventLog.tsx"() {
28897
- init_atoms();
28898
- init_cn();
28899
- STATUS_STYLES = {
28900
- pending: "text-muted-foreground",
28901
- active: "text-primary animate-pulse",
28902
- done: "text-success",
28903
- error: "text-error"
28904
- };
28905
- STATUS_DOTS = {
28906
- pending: "\u25CB",
28907
- active: "\u25CF",
28908
- done: "\u2714",
28909
- error: "\u2717"
28910
- };
28911
- EventLog.displayName = "EventLog";
28912
- }
28913
- });
28914
27794
 
28915
- // components/game/lib/puzzleObject.ts
27795
+ // lib/puzzleObject.ts
28916
27796
  function objId(o) {
28917
27797
  return o.id == null ? "" : String(o.id);
28918
27798
  }
@@ -28942,121 +27822,7 @@ function objMaxRules(o) {
28942
27822
  return Number.isFinite(n) && n > 0 ? n : 3;
28943
27823
  }
28944
27824
  var init_puzzleObject = __esm({
28945
- "components/game/lib/puzzleObject.ts"() {
28946
- }
28947
- });
28948
- function ObjectRulePanel({
28949
- object,
28950
- onRulesChange,
28951
- rulesChangeEvent,
28952
- disabled = false,
28953
- className
28954
- }) {
28955
- const { t } = hooks.useTranslate();
28956
- const { emit } = useEventBus();
28957
- const id = objId(object);
28958
- const name = objName(object);
28959
- const icon = objIcon(object);
28960
- const states = objStates(object);
28961
- const currentState = objCurrentState(object);
28962
- const availableEvents = objAvailableEvents(object);
28963
- const availableActions = objAvailableActions(object);
28964
- const rules = objRules(object);
28965
- const maxRules = objMaxRules(object);
28966
- const canAdd = rules.length < maxRules;
28967
- const emitRules = React73.useCallback((newRules) => {
28968
- if (rulesChangeEvent) emit(`UI:${rulesChangeEvent}`, { objectId: id, rules: newRules });
28969
- else onRulesChange?.(id, newRules);
28970
- }, [rulesChangeEvent, emit, id, onRulesChange]);
28971
- const handleRuleChange = React73.useCallback((index, updatedRule) => {
28972
- const newRules = [...rules];
28973
- newRules[index] = updatedRule;
28974
- emitRules(newRules);
28975
- }, [rules, emitRules]);
28976
- const handleRuleRemove = React73.useCallback((index) => {
28977
- const newRules = rules.filter((_, i) => i !== index);
28978
- emitRules(newRules);
28979
- }, [rules, emitRules]);
28980
- const handleAddRule = React73.useCallback(() => {
28981
- if (!canAdd || disabled) return;
28982
- const firstEvent = availableEvents[0]?.value || "";
28983
- const firstAction = availableActions[0]?.value || "";
28984
- const newRule = {
28985
- id: `rule-${nextRuleId++}`,
28986
- whenEvent: firstEvent,
28987
- thenAction: firstAction
28988
- };
28989
- emitRules([...rules, newRule]);
28990
- }, [canAdd, disabled, rules, availableEvents, availableActions, emitRules]);
28991
- const machine = {
28992
- name,
28993
- states,
28994
- currentState,
28995
- transitions: rules.map((r) => ({
28996
- from: currentState,
28997
- to: states.find((s) => s !== currentState) || currentState,
28998
- event: r.whenEvent
28999
- }))
29000
- };
29001
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { className: cn("p-4 rounded-lg bg-card border border-border", className), gap: "sm", children: [
29002
- /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { className: "items-center", gap: "sm", children: [
29003
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h5", children: icon }),
29004
- /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "none", children: [
29005
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body1", className: "text-foreground font-bold", children: name }),
29006
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-muted-foreground", children: t("eventHandler.state") + ": " + currentState })
29007
- ] })
29008
- ] }),
29009
- /* @__PURE__ */ jsxRuntime.jsx(TraitStateViewer, { trait: machine, variant: "compact", size: "sm" }),
29010
- /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "xs", children: [
29011
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", className: "text-muted-foreground font-medium", children: t("eventHandler.rules", { count: rules.length, max: maxRules }) + ":" }),
29012
- rules.map((rule, i) => /* @__PURE__ */ jsxRuntime.jsx(
29013
- RuleEditor,
29014
- {
29015
- rule,
29016
- availableEvents,
29017
- availableActions,
29018
- onChange: (r) => handleRuleChange(i, r),
29019
- onRemove: () => handleRuleRemove(i),
29020
- disabled
29021
- },
29022
- rule.id
29023
- )),
29024
- canAdd && !disabled && /* @__PURE__ */ jsxRuntime.jsx(exports.Button, { variant: "ghost", onClick: handleAddRule, className: "self-start", children: t("eventHandler.addRule") })
29025
- ] })
29026
- ] });
29027
- }
29028
- var nextRuleId;
29029
- var init_ObjectRulePanel = __esm({
29030
- "components/game/molecules/ObjectRulePanel.tsx"() {
29031
- init_atoms();
29032
- init_cn();
29033
- init_useEventBus();
29034
- init_TraitStateViewer();
29035
- init_RuleEditor();
29036
- init_puzzleObject();
29037
- nextRuleId = 1;
29038
- ObjectRulePanel.displayName = "ObjectRulePanel";
29039
- }
29040
- });
29041
- function VariablePanel({
29042
- entityName,
29043
- variables,
29044
- className
29045
- }) {
29046
- const { t } = hooks.useTranslate();
29047
- return /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { className: cn("p-3 rounded-lg bg-card border border-border", className), gap: "sm", children: [
29048
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "body2", className: "text-muted-foreground font-medium", children: t("stateArchitect.variables", { name: entityName }) }),
29049
- (variables ?? []).map((v) => /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { className: "items-center justify-between", children: [
29050
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-foreground font-medium", children: v.name }),
29051
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", className: "text-accent font-mono", children: v.value })
29052
- ] }, v.name))
29053
- ] });
29054
- }
29055
- var init_VariablePanel = __esm({
29056
- "components/game/molecules/VariablePanel.tsx"() {
29057
- init_atoms();
29058
- init_cn();
29059
- VariablePanel.displayName = "VariablePanel";
27825
+ "lib/puzzleObject.ts"() {
29060
27826
  }
29061
27827
  });
29062
27828
  function StateJsonView({
@@ -29098,10 +27864,10 @@ var init_StateJsonView = __esm({
29098
27864
  }
29099
27865
  });
29100
27866
 
29101
- // components/game/lib/mechanics.ts
27867
+ // lib/mechanics.ts
29102
27868
  exports.projectileMotion = void 0; exports.pendulum = void 0; exports.springOscillator = void 0;
29103
27869
  var init_mechanics = __esm({
29104
- "components/game/lib/mechanics.ts"() {
27870
+ "lib/mechanics.ts"() {
29105
27871
  exports.projectileMotion = {
29106
27872
  id: "mechanics-projectile",
29107
27873
  name: "Projectile Motion",
@@ -29156,10 +27922,10 @@ var init_mechanics = __esm({
29156
27922
  }
29157
27923
  });
29158
27924
 
29159
- // components/game/lib/physicsPresets.ts
27925
+ // lib/physicsPresets.ts
29160
27926
  exports.ALL_PRESETS = void 0;
29161
27927
  var init_physicsPresets = __esm({
29162
- "components/game/lib/physicsPresets.ts"() {
27928
+ "lib/physicsPresets.ts"() {
29163
27929
  init_mechanics();
29164
27930
  init_mechanics();
29165
27931
  exports.ALL_PRESETS = [
@@ -29169,125 +27935,6 @@ var init_physicsPresets = __esm({
29169
27935
  ];
29170
27936
  }
29171
27937
  });
29172
- exports.GameTemplate = void 0;
29173
- var init_GameTemplate = __esm({
29174
- "components/game/templates/GameTemplate.tsx"() {
29175
- init_cn();
29176
- init_Box();
29177
- init_Stack();
29178
- init_Typography();
29179
- init_Button();
29180
- exports.GameTemplate = ({
29181
- entity,
29182
- title = "Game",
29183
- children,
29184
- hud,
29185
- debugPanel,
29186
- showDebugPanel = false,
29187
- controls,
29188
- className,
29189
- backgroundAsset
29190
- }) => {
29191
- return /* @__PURE__ */ jsxRuntime.jsxs(
29192
- exports.Box,
29193
- {
29194
- display: "flex",
29195
- fullHeight: true,
29196
- className: cn("flex-col lg:flex-row", className),
29197
- children: [
29198
- /* @__PURE__ */ jsxRuntime.jsxs(exports.Box, { display: "flex", className: "flex-1 flex-col", children: [
29199
- /* @__PURE__ */ jsxRuntime.jsxs(
29200
- exports.Box,
29201
- {
29202
- padding: "md",
29203
- border: true,
29204
- className: "border-b-2 border-x-0 border-t-0 border-border flex items-center justify-between",
29205
- children: [
29206
- /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h4", children: title }),
29207
- controls && /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "sm", align: "center", children: [
29208
- controls.isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(
29209
- exports.Button,
29210
- {
29211
- variant: "secondary",
29212
- size: "sm",
29213
- icon: "pause",
29214
- onClick: controls.onPause,
29215
- children: "Pause"
29216
- }
29217
- ) : /* @__PURE__ */ jsxRuntime.jsx(
29218
- exports.Button,
29219
- {
29220
- variant: "primary",
29221
- size: "sm",
29222
- icon: "play",
29223
- onClick: controls.onPlay,
29224
- children: "Play"
29225
- }
29226
- ),
29227
- /* @__PURE__ */ jsxRuntime.jsx(
29228
- exports.Button,
29229
- {
29230
- variant: "ghost",
29231
- size: "sm",
29232
- icon: "rotate-ccw",
29233
- onClick: controls.onReset,
29234
- children: "Reset"
29235
- }
29236
- )
29237
- ] })
29238
- ]
29239
- }
29240
- ),
29241
- /* @__PURE__ */ jsxRuntime.jsxs(
29242
- exports.Box,
29243
- {
29244
- position: "relative",
29245
- fullWidth: true,
29246
- className: backgroundAsset ? "flex-1" : "flex-1 bg-muted",
29247
- style: backgroundAsset ? { backgroundImage: `url(${backgroundAsset.url})`, backgroundSize: "cover", backgroundPosition: "center" } : void 0,
29248
- children: [
29249
- children,
29250
- hud && /* @__PURE__ */ jsxRuntime.jsx(
29251
- exports.Box,
29252
- {
29253
- position: "absolute",
29254
- className: "top-0 left-0 right-0 pointer-events-none",
29255
- children: /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { padding: "md", className: "pointer-events-auto w-fit", children: hud })
29256
- }
29257
- )
29258
- ]
29259
- }
29260
- )
29261
- ] }),
29262
- showDebugPanel && debugPanel && /* @__PURE__ */ jsxRuntime.jsxs(
29263
- exports.Box,
29264
- {
29265
- bg: "surface",
29266
- border: true,
29267
- shadow: "sm",
29268
- overflow: "auto",
29269
- className: "w-full lg:w-80 lg:border-l-2 lg:border-t-0 border-t-2 border-border",
29270
- children: [
29271
- /* @__PURE__ */ jsxRuntime.jsx(
29272
- exports.Box,
29273
- {
29274
- padding: "md",
29275
- border: true,
29276
- className: "border-b-2 border-x-0 border-t-0 border-border",
29277
- children: /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h6", children: "Debug Panel" })
29278
- }
29279
- ),
29280
- /* @__PURE__ */ jsxRuntime.jsx(exports.Box, { padding: "md", children: debugPanel })
29281
- ]
29282
- }
29283
- )
29284
- ]
29285
- }
29286
- );
29287
- };
29288
- exports.GameTemplate.displayName = "GameTemplate";
29289
- }
29290
- });
29291
27938
  var FONT_BASE, GAME_FONTS, FONT_FACES; exports.GameShell = void 0;
29292
27939
  var init_GameShell = __esm({
29293
27940
  "components/game/templates/GameShell.tsx"() {
@@ -29458,41 +28105,23 @@ var init_GameShell = __esm({
29458
28105
  exports.GameShell.displayName = "GameShell";
29459
28106
  }
29460
28107
  });
29461
-
29462
- // components/game/molecules/index.ts
29463
28108
  var init_molecules = __esm({
29464
28109
  "components/game/molecules/index.ts"() {
29465
- init_lib();
29466
- init_GameCard();
28110
+ init_gameShared();
29467
28111
  init_HealthBar();
29468
28112
  init_ScoreDisplay();
29469
28113
  init_ControlButton();
29470
- init_Sprite();
29471
- init_StateIndicator();
29472
28114
  init_TimerDisplay();
29473
- init_ResourceCounter();
29474
- init_ItemSlot();
29475
- init_TurnIndicator();
29476
- init_ComboCounter();
29477
- init_WaypointMarker();
29478
- init_StatusEffect();
29479
- init_DamageNumber();
29480
28115
  init_DialogueBubble();
29481
28116
  init_ChoiceButton();
29482
- init_ActionButton();
29483
- init_MiniMap();
29484
- init_GameIcon();
29485
28117
  init_ControlGrid();
29486
28118
  init_StatBadge();
29487
- init_InventoryGrid();
29488
- init_ResourceBar();
29489
28119
  init_GameHud();
29490
28120
  init_GameMenu();
29491
28121
  init_StateGraph();
29492
28122
  init_Canvas2D();
29493
28123
  init_Canvas();
29494
28124
  init_useUnitSpriteAtlas();
29495
- init_GameAudioProvider();
29496
28125
  init_GameAudioToggle();
29497
28126
  init_useGameAudio();
29498
28127
  init_useCamera();
@@ -29502,16 +28131,11 @@ var init_molecules = __esm({
29502
28131
  init_ActionTile();
29503
28132
  init_ActionPalette();
29504
28133
  init_SequenceBar();
29505
- init_RuleEditor();
29506
- init_EventLog();
29507
- init_ObjectRulePanel();
29508
28134
  init_puzzleObject();
29509
28135
  init_StateNode();
29510
28136
  init_TransitionArrow();
29511
- init_VariablePanel();
29512
28137
  init_StateJsonView();
29513
28138
  init_physicsPresets();
29514
- init_GameTemplate();
29515
28139
  init_GameShell();
29516
28140
  }
29517
28141
  });
@@ -30114,13 +28738,13 @@ var init_MapView = __esm({
30114
28738
  shadowSize: [41, 41]
30115
28739
  });
30116
28740
  L.Marker.prototype.options.icon = defaultIcon;
30117
- const { useEffect: useEffect66, useRef: useRef62, useCallback: useCallback108, useState: useState100 } = React73__namespace.default;
28741
+ const { useEffect: useEffect64, useRef: useRef61, useCallback: useCallback104, useState: useState100 } = React73__namespace.default;
30118
28742
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
30119
28743
  const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
30120
28744
  function MapUpdater({ centerLat, centerLng, zoom }) {
30121
28745
  const map = useMap();
30122
- const prevRef = useRef62({ centerLat, centerLng, zoom });
30123
- useEffect66(() => {
28746
+ const prevRef = useRef61({ centerLat, centerLng, zoom });
28747
+ useEffect64(() => {
30124
28748
  const prev = prevRef.current;
30125
28749
  if (prev.centerLat !== centerLat || prev.centerLng !== centerLng || prev.zoom !== zoom) {
30126
28750
  map.setView([centerLat, centerLng], zoom);
@@ -30131,7 +28755,7 @@ var init_MapView = __esm({
30131
28755
  }
30132
28756
  function MapClickHandler({ onMapClick }) {
30133
28757
  const map = useMap();
30134
- useEffect66(() => {
28758
+ useEffect64(() => {
30135
28759
  if (!onMapClick) return;
30136
28760
  const handler = (e) => {
30137
28761
  onMapClick(e.latlng.lat, e.latlng.lng);
@@ -30160,7 +28784,7 @@ var init_MapView = __esm({
30160
28784
  }) {
30161
28785
  const eventBus = useEventBus2();
30162
28786
  const [clickedPosition, setClickedPosition] = useState100(null);
30163
- const handleMapClick = useCallback108((lat, lng) => {
28787
+ const handleMapClick = useCallback104((lat, lng) => {
30164
28788
  if (showClickedPin) {
30165
28789
  setClickedPosition({ lat, lng });
30166
28790
  }
@@ -30169,7 +28793,7 @@ var init_MapView = __esm({
30169
28793
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
30170
28794
  }
30171
28795
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
30172
- const handleMarkerClick = useCallback108((marker) => {
28796
+ const handleMarkerClick = useCallback104((marker) => {
30173
28797
  onMarkerClick?.(marker);
30174
28798
  if (markerClickEvent) {
30175
28799
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -37267,7 +35891,7 @@ var init_Navigation = __esm({
37267
35891
  exports.Navigation.displayName = "Navigation";
37268
35892
  }
37269
35893
  });
37270
- var paddingStyles4, variantStyles9; exports.Section = void 0;
35894
+ var paddingStyles4, variantStyles7; exports.Section = void 0;
37271
35895
  var init_Section = __esm({
37272
35896
  "components/core/molecules/Section.tsx"() {
37273
35897
  init_cn();
@@ -37280,7 +35904,7 @@ var init_Section = __esm({
37280
35904
  lg: "p-6",
37281
35905
  xl: "p-8"
37282
35906
  };
37283
- variantStyles9 = {
35907
+ variantStyles7 = {
37284
35908
  default: "",
37285
35909
  card: [
37286
35910
  "bg-card",
@@ -37313,7 +35937,7 @@ var init_Section = __esm({
37313
35937
  {
37314
35938
  className: cn(
37315
35939
  paddingStyles4[padding],
37316
- variantStyles9[variant],
35940
+ variantStyles7[variant],
37317
35941
  className
37318
35942
  )
37319
35943
  },
@@ -41489,18 +40113,18 @@ function entityFieldsFromListItem(item) {
41489
40113
  function getStatusStyle(fieldName, value) {
41490
40114
  const val = String(value).toLowerCase();
41491
40115
  if (val.includes("complete") || val.includes("done"))
41492
- return STATUS_STYLES2.complete;
40116
+ return STATUS_STYLES.complete;
41493
40117
  if (val.includes("active") || val.includes("progress"))
41494
- return STATUS_STYLES2.active;
40118
+ return STATUS_STYLES.active;
41495
40119
  if (val.includes("pending") || val.includes("waiting"))
41496
- return STATUS_STYLES2.pending;
40120
+ return STATUS_STYLES.pending;
41497
40121
  if (val.includes("block") || val.includes("cancel"))
41498
- return STATUS_STYLES2.blocked;
41499
- if (val.includes("high") || val.includes("urgent")) return STATUS_STYLES2.high;
40122
+ return STATUS_STYLES.blocked;
40123
+ if (val.includes("high") || val.includes("urgent")) return STATUS_STYLES.high;
41500
40124
  if (val.includes("medium") || val.includes("normal"))
41501
- return STATUS_STYLES2.medium;
41502
- if (val.includes("low")) return STATUS_STYLES2.low;
41503
- return STATUS_STYLES2.default;
40125
+ return STATUS_STYLES.medium;
40126
+ if (val.includes("low")) return STATUS_STYLES.low;
40127
+ return STATUS_STYLES.default;
41504
40128
  }
41505
40129
  function formatValue3(value, fieldName) {
41506
40130
  if (typeof value === "number") {
@@ -41533,7 +40157,7 @@ function formatValue3(value, fieldName) {
41533
40157
  function formatFieldLabel2(fieldName) {
41534
40158
  return fieldName.replace(/([A-Z])/g, " $1").replace(/^./, (str2) => str2.toUpperCase()).replace(/Id$/, "").trim();
41535
40159
  }
41536
- var STATUS_STYLES2, StatusBadge, ProgressIndicator; exports.List = void 0;
40160
+ var STATUS_STYLES, StatusBadge, ProgressIndicator; exports.List = void 0;
41537
40161
  var init_List = __esm({
41538
40162
  "components/core/organisms/List.tsx"() {
41539
40163
  "use client";
@@ -41546,7 +40170,7 @@ var init_List = __esm({
41546
40170
  init_getNestedValue();
41547
40171
  init_useEventBus();
41548
40172
  init_types2();
41549
- STATUS_STYLES2 = {
40173
+ STATUS_STYLES = {
41550
40174
  complete: {
41551
40175
  bg: "bg-success/10",
41552
40176
  text: "text-success",
@@ -45730,7 +44354,7 @@ var init_TeamOrganism = __esm({
45730
44354
  exports.TeamOrganism.displayName = "TeamOrganism";
45731
44355
  }
45732
44356
  });
45733
- var lookStyles10, STATUS_STYLES3; exports.Timeline = void 0;
44357
+ var lookStyles10, STATUS_STYLES2; exports.Timeline = void 0;
45734
44358
  var init_Timeline = __esm({
45735
44359
  "components/core/organisms/Timeline.tsx"() {
45736
44360
  "use client";
@@ -45746,7 +44370,7 @@ var init_Timeline = __esm({
45746
44370
  horizontal: "flex-row [&>*]:flex-row [&>*]:items-center",
45747
44371
  swimlane: "flex-row gap-6 [&>*]:flex-row [&>*]:items-center"
45748
44372
  };
45749
- STATUS_STYLES3 = {
44373
+ STATUS_STYLES2 = {
45750
44374
  complete: {
45751
44375
  dotColor: "text-success",
45752
44376
  lineColor: "bg-success",
@@ -45830,7 +44454,7 @@ var init_Timeline = __esm({
45830
44454
  title && /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "h5", weight: "semibold", children: title }),
45831
44455
  /* @__PURE__ */ jsxRuntime.jsx(exports.VStack, { gap: "none", className: cn("relative", lookStyles10[look]), children: items.map((item, idx) => {
45832
44456
  const status = item.status || "pending";
45833
- const style = STATUS_STYLES3[status] || STATUS_STYLES3.pending;
44457
+ const style = STATUS_STYLES2[status] || STATUS_STYLES2.pending;
45834
44458
  const ItemIcon = item.icon || style.icon;
45835
44459
  const isLast = idx === items.length - 1;
45836
44460
  return /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "md", align: "start", className: "relative", children: [
@@ -45941,38 +44565,13 @@ var init_ToastSlot = __esm({
45941
44565
  exports.ToastSlot.displayName = "ToastSlot";
45942
44566
  }
45943
44567
  });
45944
- function lazyThree(name, loader) {
45945
- const Lazy = React73__namespace.default.lazy(
45946
- () => loader().then((m) => {
45947
- const Resolved = m[name];
45948
- if (!Resolved) {
45949
- throw new Error(
45950
- `[@almadar/ui] 3D component "${name}" was not found in the three subpath bundle.`
45951
- );
45952
- }
45953
- return { default: Resolved };
45954
- })
45955
- );
45956
- function ThreeWrapper(props) {
45957
- return React73__namespace.default.createElement(
45958
- ThreeBoundary,
45959
- { name },
45960
- React73__namespace.default.createElement(
45961
- React73__namespace.default.Suspense,
45962
- { fallback: null },
45963
- React73__namespace.default.createElement(Lazy, props)
45964
- )
45965
- );
45966
- }
45967
- ThreeWrapper.displayName = `Lazy(${name})`;
45968
- return ThreeWrapper;
45969
- }
45970
- var ThreeBoundary, GameCanvas3D2, COMPONENT_REGISTRY;
44568
+
44569
+ // components/core/organisms/component-registry.generated.ts
44570
+ var COMPONENT_REGISTRY;
45971
44571
  var init_component_registry_generated = __esm({
45972
44572
  "components/core/organisms/component-registry.generated.ts"() {
45973
44573
  init_AboutPageTemplate();
45974
44574
  init_Accordion();
45975
- init_ActionButton();
45976
44575
  init_ActionPalette();
45977
44576
  init_ActionTile();
45978
44577
  init_ActivationBlock();
@@ -46016,7 +44615,6 @@ var init_component_registry_generated = __esm({
46016
44615
  init_ChoiceButton();
46017
44616
  init_CodeBlock();
46018
44617
  init_CodeRunnerPanel();
46019
- init_ComboCounter();
46020
44618
  init_CommunityLinks();
46021
44619
  init_ConditionalWrapper();
46022
44620
  init_ConfettiEffect();
@@ -46028,7 +44626,6 @@ var init_component_registry_generated = __esm({
46028
44626
  init_ControlButton();
46029
44627
  init_ControlGrid();
46030
44628
  init_CounterTemplate();
46031
- init_DamageNumber();
46032
44629
  init_DashboardGrid();
46033
44630
  init_DashboardLayout();
46034
44631
  init_DataGrid();
@@ -46058,7 +44655,6 @@ var init_component_registry_generated = __esm({
46058
44655
  init_EmptyState();
46059
44656
  init_ErrorBoundary();
46060
44657
  init_ErrorState();
46061
- init_EventLog();
46062
44658
  init_FeatureCard();
46063
44659
  init_FeatureDetailPageTemplate();
46064
44660
  init_FeatureGrid();
@@ -46075,12 +44671,10 @@ var init_component_registry_generated = __esm({
46075
44671
  init_FormField();
46076
44672
  init_FormSectionHeader();
46077
44673
  init_GameAudioToggle();
46078
- init_GameCard();
46079
44674
  init_GameHud();
46080
44675
  init_GameIcon();
46081
44676
  init_GameMenu();
46082
44677
  init_GameShell();
46083
- init_GameTemplate();
46084
44678
  init_GenericAppTemplate();
46085
44679
  init_GeometricPattern();
46086
44680
  init_GradientDivider();
@@ -46097,8 +44691,6 @@ var init_component_registry_generated = __esm({
46097
44691
  init_Input();
46098
44692
  init_InputGroup();
46099
44693
  init_InstallBox();
46100
- init_InventoryGrid();
46101
- init_ItemSlot();
46102
44694
  init_JazariStateMachine();
46103
44695
  init_LandingPageTemplate();
46104
44696
  init_LawReferenceTooltip();
@@ -46119,13 +44711,11 @@ var init_component_registry_generated = __esm({
46119
44711
  init_MediaGallery();
46120
44712
  init_Menu();
46121
44713
  init_Meter();
46122
- init_MiniMap();
46123
44714
  init_Modal();
46124
44715
  init_ModalSlot();
46125
44716
  init_ModuleCard();
46126
44717
  init_Navigation();
46127
44718
  init_NumberStepper();
46128
- init_ObjectRulePanel();
46129
44719
  init_OptionConstraintGroup();
46130
44720
  init_OrbitalVisualization();
46131
44721
  init_Overlay();
@@ -46151,8 +44741,6 @@ var init_component_registry_generated = __esm({
46151
44741
  init_RelationSelect();
46152
44742
  init_RepeatableFormSection();
46153
44743
  init_ReplyTree();
46154
- init_ResourceBar();
46155
- init_ResourceCounter();
46156
44744
  init_RichBlockEditor();
46157
44745
  init_RuntimeDebugger2();
46158
44746
  init_ScaledDiagram();
@@ -46178,19 +44766,16 @@ var init_component_registry_generated = __esm({
46178
44766
  init_Split();
46179
44767
  init_SplitPane();
46180
44768
  init_SplitSection();
46181
- init_Sprite();
46182
44769
  init_StarRating();
46183
44770
  init_StatBadge();
46184
44771
  init_StatCard();
46185
44772
  init_StatDisplay();
46186
44773
  init_StateGraph();
46187
- init_StateIndicator();
46188
44774
  init_StateJsonView();
46189
44775
  init_StateMachineView();
46190
44776
  init_StatsGrid();
46191
44777
  init_StatsOrganism();
46192
44778
  init_StatusDot();
46193
- init_StatusEffect();
46194
44779
  init_StepFlow();
46195
44780
  init_StepFlowOrganism();
46196
44781
  init_SubagentTracePanel();
@@ -46227,46 +44812,19 @@ var init_component_registry_generated = __esm({
46227
44812
  init_TraitFrame();
46228
44813
  init_TraitSlot();
46229
44814
  init_TrendIndicator();
46230
- init_TurnIndicator();
46231
44815
  init_TypewriterText();
46232
44816
  init_Typography();
46233
44817
  init_UISlotRenderer();
46234
44818
  init_UploadDropZone();
46235
- init_VariablePanel();
46236
44819
  init_VersionDiff();
46237
44820
  init_ViolationAlert();
46238
44821
  init_VoteStack();
46239
- init_WaypointMarker();
46240
44822
  init_WizardContainer();
46241
44823
  init_WizardNavigation();
46242
44824
  init_WizardProgress();
46243
- ThreeBoundary = class extends React73__namespace.default.Component {
46244
- constructor() {
46245
- super(...arguments);
46246
- __publicField(this, "state", { failed: false });
46247
- }
46248
- static getDerivedStateFromError() {
46249
- return { failed: true };
46250
- }
46251
- render() {
46252
- if (this.state.failed) {
46253
- return React73__namespace.default.createElement(
46254
- "div",
46255
- {
46256
- "data-testid": "three-unavailable",
46257
- style: { padding: 16, fontSize: 13, lineHeight: 1.5, opacity: 0.7 }
46258
- },
46259
- `3D pattern "${this.props.name}" requires three.js. Install the optional peers three + @react-three/fiber + @react-three/drei (matching the host React major) to render it.`
46260
- );
46261
- }
46262
- return this.props.children;
46263
- }
46264
- };
46265
- GameCanvas3D2 = lazyThree("GameCanvas3D", () => import('@almadar/ui/components/molecules/game/three'));
46266
44825
  COMPONENT_REGISTRY = {
46267
44826
  "AboutPageTemplate": exports.AboutPageTemplate,
46268
44827
  "Accordion": exports.Accordion,
46269
- "ActionButton": ActionButton,
46270
44828
  "ActionPalette": ActionPalette,
46271
44829
  "ActionTile": ActionTile,
46272
44830
  "ActivationBlock": exports.ActivationBlock,
@@ -46315,7 +44873,6 @@ var init_component_registry_generated = __esm({
46315
44873
  "ChoiceButton": ChoiceButton,
46316
44874
  "CodeBlock": exports.CodeBlock,
46317
44875
  "CodeRunnerPanel": exports.CodeRunnerPanel,
46318
- "ComboCounter": ComboCounter,
46319
44876
  "CommunityLinks": exports.CommunityLinks,
46320
44877
  "ConditionalWrapper": exports.ConditionalWrapper,
46321
44878
  "ConfettiEffect": exports.ConfettiEffect,
@@ -46327,7 +44884,6 @@ var init_component_registry_generated = __esm({
46327
44884
  "ControlButton": ControlButton,
46328
44885
  "ControlGrid": ControlGrid,
46329
44886
  "CounterTemplate": exports.CounterTemplate,
46330
- "DamageNumber": DamageNumber,
46331
44887
  "DashboardGrid": exports.DashboardGrid,
46332
44888
  "DashboardLayout": exports.DashboardLayout,
46333
44889
  "DataGrid": DataGrid,
@@ -46359,7 +44915,6 @@ var init_component_registry_generated = __esm({
46359
44915
  "EmptyState": exports.EmptyState,
46360
44916
  "ErrorBoundary": exports.ErrorBoundary,
46361
44917
  "ErrorState": exports.ErrorState,
46362
- "EventLog": EventLog,
46363
44918
  "FeatureCard": exports.FeatureCard,
46364
44919
  "FeatureDetailPageTemplate": exports.FeatureDetailPageTemplate,
46365
44920
  "FeatureGrid": exports.FeatureGrid,
@@ -46377,13 +44932,10 @@ var init_component_registry_generated = __esm({
46377
44932
  "FormLayout": exports.FormLayout,
46378
44933
  "FormSectionHeader": exports.FormSectionHeader,
46379
44934
  "GameAudioToggle": GameAudioToggle,
46380
- "GameCanvas3D": GameCanvas3D2,
46381
- "GameCard": GameCard,
46382
44935
  "GameHud": GameHud,
46383
44936
  "GameIcon": GameIcon,
46384
44937
  "GameMenu": GameMenu,
46385
44938
  "GameShell": exports.GameShell,
46386
- "GameTemplate": exports.GameTemplate,
46387
44939
  "GenericAppTemplate": exports.GenericAppTemplate,
46388
44940
  "GeometricPattern": exports.GeometricPattern,
46389
44941
  "GradientDivider": exports.GradientDivider,
@@ -46400,8 +44952,6 @@ var init_component_registry_generated = __esm({
46400
44952
  "Input": exports.Input,
46401
44953
  "InputGroup": exports.InputGroup,
46402
44954
  "InstallBox": exports.InstallBox,
46403
- "InventoryGrid": InventoryGrid,
46404
- "ItemSlot": ItemSlot,
46405
44955
  "JazariStateMachine": exports.JazariStateMachine,
46406
44956
  "Label": LabelPattern,
46407
44957
  "LabelPattern": LabelPattern,
@@ -46424,13 +44974,11 @@ var init_component_registry_generated = __esm({
46424
44974
  "MediaGallery": exports.MediaGallery,
46425
44975
  "Menu": exports.Menu,
46426
44976
  "Meter": exports.Meter,
46427
- "MiniMap": MiniMap,
46428
44977
  "Modal": exports.Modal,
46429
44978
  "ModalSlot": exports.ModalSlot,
46430
44979
  "ModuleCard": exports.ModuleCard,
46431
44980
  "Navigation": exports.Navigation,
46432
44981
  "NumberStepper": exports.NumberStepper,
46433
- "ObjectRulePanel": ObjectRulePanel,
46434
44982
  "OptionConstraintGroup": exports.OptionConstraintGroup,
46435
44983
  "OrbitalVisualization": exports.OrbitalVisualization,
46436
44984
  "Overlay": exports.Overlay,
@@ -46456,8 +45004,6 @@ var init_component_registry_generated = __esm({
46456
45004
  "RelationSelect": exports.RelationSelect,
46457
45005
  "RepeatableFormSection": exports.RepeatableFormSection,
46458
45006
  "ReplyTree": exports.ReplyTree,
46459
- "ResourceBar": ResourceBar,
46460
- "ResourceCounter": ResourceCounter,
46461
45007
  "RichBlockEditor": exports.RichBlockEditor,
46462
45008
  "RuntimeDebugger": RuntimeDebugger,
46463
45009
  "ScaledDiagram": exports.ScaledDiagram,
@@ -46485,20 +45031,17 @@ var init_component_registry_generated = __esm({
46485
45031
  "Split": exports.Split,
46486
45032
  "SplitPane": exports.SplitPane,
46487
45033
  "SplitSection": exports.SplitSection,
46488
- "Sprite": Sprite,
46489
45034
  "Stack": exports.Stack,
46490
45035
  "StarRating": exports.StarRating,
46491
45036
  "StatBadge": StatBadge,
46492
45037
  "StatCard": exports.StatCard,
46493
45038
  "StatDisplay": exports.StatDisplay,
46494
45039
  "StateGraph": StateGraph,
46495
- "StateIndicator": StateIndicator,
46496
45040
  "StateJsonView": StateJsonView,
46497
45041
  "StateMachineView": exports.StateMachineView,
46498
45042
  "StatsGrid": exports.StatsGrid,
46499
45043
  "StatsOrganism": exports.StatsOrganism,
46500
45044
  "StatusDot": exports.StatusDot,
46501
- "StatusEffect": StatusEffect,
46502
45045
  "StepFlow": exports.StepFlow,
46503
45046
  "StepFlowOrganism": exports.StepFlowOrganism,
46504
45047
  "SubagentTracePanel": exports.SubagentTracePanel,
@@ -46535,17 +45078,14 @@ var init_component_registry_generated = __esm({
46535
45078
  "TraitFrame": TraitFrame,
46536
45079
  "TraitSlot": TraitSlot,
46537
45080
  "TrendIndicator": exports.TrendIndicator,
46538
- "TurnIndicator": TurnIndicator,
46539
45081
  "TypewriterText": exports.TypewriterText,
46540
45082
  "Typography": exports.Typography,
46541
45083
  "UISlotRenderer": UISlotRenderer,
46542
45084
  "UploadDropZone": exports.UploadDropZone,
46543
45085
  "VStack": exports.VStack,
46544
- "VariablePanel": VariablePanel,
46545
45086
  "VersionDiff": exports.VersionDiff,
46546
45087
  "ViolationAlert": exports.ViolationAlert,
46547
45088
  "VoteStack": exports.VoteStack,
46548
- "WaypointMarker": WaypointMarker,
46549
45089
  "WizardContainer": exports.WizardContainer,
46550
45090
  "WizardNavigation": exports.WizardNavigation,
46551
45091
  "WizardProgress": exports.WizardProgress,
@@ -47562,6 +46102,7 @@ var init_atoms = __esm({
47562
46102
  init_Card();
47563
46103
  init_Badge();
47564
46104
  init_AtlasImage();
46105
+ init_GameIcon();
47565
46106
  init_FilterPill();
47566
46107
  init_Spinner();
47567
46108
  init_Avatar();
@@ -49670,7 +48211,7 @@ var I18nContext = React73.createContext({
49670
48211
  });
49671
48212
  I18nContext.displayName = "I18nContext";
49672
48213
  var I18nProvider = I18nContext.Provider;
49673
- function useTranslate119() {
48214
+ function useTranslate115() {
49674
48215
  return React73.useContext(I18nContext);
49675
48216
  }
49676
48217
  function createTranslate(messages) {
@@ -49935,8 +48476,19 @@ function useGitHubBranches(owner, repo, enabled = true) {
49935
48476
  });
49936
48477
  }
49937
48478
 
48479
+ Object.defineProperty(exports, "GameAudioContext", {
48480
+ enumerable: true,
48481
+ get: function () { return providers.GameAudioContext; }
48482
+ });
48483
+ Object.defineProperty(exports, "GameAudioProvider", {
48484
+ enumerable: true,
48485
+ get: function () { return providers.GameAudioProvider; }
48486
+ });
48487
+ Object.defineProperty(exports, "useGameAudioContext", {
48488
+ enumerable: true,
48489
+ get: function () { return providers.useGameAudioContext; }
48490
+ });
49938
48491
  exports.ALMADAR_DND_MIME = ALMADAR_DND_MIME;
49939
- exports.ActionButton = ActionButton;
49940
48492
  exports.ActionCard = Card2;
49941
48493
  exports.ActionPalette = ActionPalette;
49942
48494
  exports.ActionTile = ActionTile;
@@ -49948,11 +48500,9 @@ exports.Canvas2D = Canvas2D;
49948
48500
  exports.ChatBar = ChatBar;
49949
48501
  exports.ChoiceButton = ChoiceButton;
49950
48502
  exports.CollapsibleSection = CollapsibleSection;
49951
- exports.ComboCounter = ComboCounter;
49952
48503
  exports.ControlButton = ControlButton;
49953
48504
  exports.ControlGrid = ControlGrid;
49954
48505
  exports.DEFAULT_SLOTS = DEFAULT_SLOTS;
49955
- exports.DamageNumber = DamageNumber;
49956
48506
  exports.DataGrid = DataGrid;
49957
48507
  exports.DataList = DataList;
49958
48508
  exports.DataTable = DataTable;
@@ -49966,39 +48516,26 @@ exports.EditorSelect = EditorSelect;
49966
48516
  exports.EditorSlider = EditorSlider;
49967
48517
  exports.EditorTextInput = EditorTextInput;
49968
48518
  exports.EditorToolbar = EditorToolbar;
49969
- exports.EventLog = EventLog;
49970
- exports.GameAudioProvider = GameAudioProvider;
49971
48519
  exports.GameAudioToggle = GameAudioToggle;
49972
- exports.GameCard = GameCard;
49973
48520
  exports.GameHud = GameHud;
49974
48521
  exports.GameIcon = GameIcon;
49975
48522
  exports.GameMenu = GameMenu;
49976
48523
  exports.HealthBar = HealthBar;
49977
48524
  exports.I18nProvider = I18nProvider;
49978
- exports.InventoryGrid = InventoryGrid;
49979
- exports.ItemSlot = ItemSlot;
49980
48525
  exports.MapView = MapView;
49981
48526
  exports.MasterDetail = MasterDetail;
49982
- exports.MiniMap = MiniMap;
49983
48527
  exports.NotifyListener = NotifyListener;
49984
- exports.ObjectRulePanel = ObjectRulePanel;
49985
48528
  exports.OrbitalStateMachineView = exports.StateMachineView;
49986
- exports.ResourceBar = ResourceBar;
49987
- exports.ResourceCounter = ResourceCounter;
49988
- exports.RuleEditor = RuleEditor;
49989
48529
  exports.RuntimeDebugger = RuntimeDebugger;
49990
48530
  exports.ScoreDisplay = ScoreDisplay;
49991
48531
  exports.SequenceBar = SequenceBar;
49992
48532
  exports.Skeleton = Skeleton;
49993
48533
  exports.SlotContentRenderer = SlotContentRenderer;
49994
- exports.Sprite = Sprite;
49995
48534
  exports.StatBadge = StatBadge;
49996
48535
  exports.StateGraph = StateGraph;
49997
- exports.StateIndicator = StateIndicator;
49998
48536
  exports.StateJsonView = StateJsonView;
49999
48537
  exports.StateNode = StateNode2;
50000
48538
  exports.StatusBar = StatusBar;
50001
- exports.StatusEffect = StatusEffect;
50002
48539
  exports.TableView = TableView;
50003
48540
  exports.TerrainPalette = TerrainPalette;
50004
48541
  exports.TimeSlotCell = TimeSlotCell;
@@ -50007,11 +48544,8 @@ exports.TraitFrame = TraitFrame;
50007
48544
  exports.TraitSlot = TraitSlot;
50008
48545
  exports.TraitStateViewer = TraitStateViewer;
50009
48546
  exports.TransitionArrow = TransitionArrow;
50010
- exports.TurnIndicator = TurnIndicator;
50011
48547
  exports.UISlotComponent = UISlotComponent;
50012
48548
  exports.UISlotRenderer = UISlotRenderer;
50013
- exports.VariablePanel = VariablePanel;
50014
- exports.WaypointMarker = WaypointMarker;
50015
48549
  exports.boardEntity = boardEntity;
50016
48550
  exports.bool = bool;
50017
48551
  exports.calculateAttackTargets = calculateAttackTargets;
@@ -50021,7 +48555,6 @@ exports.createInitialGameState = createInitialGameState;
50021
48555
  exports.createSharedEntityStore = createSharedEntityStore;
50022
48556
  exports.createTranslate = createTranslate;
50023
48557
  exports.createUnitAnimationState = createUnitAnimationState;
50024
- exports.drawSprite = drawSprite;
50025
48558
  exports.getCurrentFrame = getCurrentFrame;
50026
48559
  exports.getTileDimensions = getTileDimensions;
50027
48560
  exports.inferDirection = inferDirection;
@@ -50076,7 +48609,6 @@ exports.useExtensions = useExtensions;
50076
48609
  exports.useFileEditor = useFileEditor;
50077
48610
  exports.useFileSystem = useFileSystem;
50078
48611
  exports.useGameAudio = useGameAudio;
50079
- exports.useGameAudioContext = useGameAudioContext;
50080
48612
  exports.useGitHubBranches = useGitHubBranches;
50081
48613
  exports.useGitHubRepo = useGitHubRepo;
50082
48614
  exports.useGitHubRepos = useGitHubRepos;
@@ -50094,7 +48626,7 @@ exports.useSharedEntityStore = useSharedEntityStore;
50094
48626
  exports.useSwipeGesture = useSwipeGesture;
50095
48627
  exports.useTapReveal = useTapReveal;
50096
48628
  exports.useTraitListens = useTraitListens;
50097
- exports.useTranslate = useTranslate119;
48629
+ exports.useTranslate = useTranslate115;
50098
48630
  exports.useUIEvents = useUIEvents;
50099
48631
  exports.useUISlotManager = useUISlotManager;
50100
48632
  exports.useUnitSpriteAtlas = useUnitSpriteAtlas;