@almadar/ui 5.80.0 → 5.81.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.
@@ -8357,6 +8357,38 @@ var init_shared = __esm({
8357
8357
  init_canvasEffects();
8358
8358
  }
8359
8359
  });
8360
+ function GameIcon({ assetUrl, icon, size = "md", alt, className }) {
8361
+ const px = typeof size === "number" ? size : sizeMap[size];
8362
+ if (assetUrl?.url) {
8363
+ return /* @__PURE__ */ jsx(
8364
+ "img",
8365
+ {
8366
+ src: assetUrl.url,
8367
+ alt: alt ?? assetUrl.category ?? "",
8368
+ width: px,
8369
+ height: px,
8370
+ style: { imageRendering: "pixelated", objectFit: "contain", width: px, height: px },
8371
+ className: cn("flex-shrink-0", className)
8372
+ }
8373
+ );
8374
+ }
8375
+ const I = typeof icon === "string" ? resolveIcon(icon) : icon;
8376
+ return /* @__PURE__ */ jsx(I, { width: px, height: px, className: cn("flex-shrink-0", className) });
8377
+ }
8378
+ var sizeMap;
8379
+ var init_GameIcon = __esm({
8380
+ "components/game/2d/atoms/GameIcon.tsx"() {
8381
+ "use client";
8382
+ init_cn();
8383
+ init_Icon();
8384
+ sizeMap = {
8385
+ sm: 16,
8386
+ md: 24,
8387
+ lg: 32
8388
+ };
8389
+ GameIcon.displayName = "GameIcon";
8390
+ }
8391
+ });
8360
8392
  function GameCard({
8361
8393
  id,
8362
8394
  cost,
@@ -8379,9 +8411,9 @@ function GameCard({
8379
8411
  }, [disabled, id, onClick, clickEvent, eventBus]);
8380
8412
  const artPx = artPxMap[size];
8381
8413
  return /* @__PURE__ */ jsxs(
8382
- "button",
8414
+ Button,
8383
8415
  {
8384
- type: "button",
8416
+ variant: "ghost",
8385
8417
  onClick: handleClick,
8386
8418
  disabled,
8387
8419
  title: name,
@@ -8395,8 +8427,9 @@ function GameCard({
8395
8427
  ),
8396
8428
  children: [
8397
8429
  cost != null && /* @__PURE__ */ jsx(
8398
- "span",
8430
+ Typography,
8399
8431
  {
8432
+ as: "span",
8400
8433
  className: cn(
8401
8434
  "absolute -top-2 -left-2 flex items-center justify-center",
8402
8435
  "min-w-[22px] h-[22px] rounded-full px-1",
@@ -8405,17 +8438,7 @@ function GameCard({
8405
8438
  children: cost
8406
8439
  }
8407
8440
  ),
8408
- /* @__PURE__ */ jsx(Box, { className: "flex-1 flex items-center justify-center w-full", children: art ? /* @__PURE__ */ jsx(
8409
- "img",
8410
- {
8411
- src: art.url,
8412
- alt: name ?? id,
8413
- width: artPx,
8414
- height: artPx,
8415
- style: { imageRendering: "pixelated", objectFit: "contain" },
8416
- className: "flex-shrink-0"
8417
- }
8418
- ) : /* @__PURE__ */ jsx(Box, { className: "rounded bg-muted/40", style: { width: artPx, height: artPx } }) }),
8441
+ /* @__PURE__ */ jsx(Box, { className: "flex-1 flex items-center justify-center w-full", children: art ? /* @__PURE__ */ jsx(GameIcon, { assetUrl: art, icon: "image", size: artPx, alt: name ?? id, className: "flex-shrink-0" }) : /* @__PURE__ */ jsx(Box, { className: "rounded bg-muted/40", style: { width: artPx, height: artPx } }) }),
8419
8442
  name != null && /* @__PURE__ */ jsx(
8420
8443
  Typography,
8421
8444
  {
@@ -8425,8 +8448,8 @@ function GameCard({
8425
8448
  }
8426
8449
  ),
8427
8450
  (attack != null || defense != null) && /* @__PURE__ */ jsxs(Box, { className: "flex w-full items-center justify-between px-0.5 text-[10px] font-bold leading-none", children: [
8428
- /* @__PURE__ */ jsx("span", { className: "text-error", children: attack != null ? `\u2694${attack}` : "" }),
8429
- /* @__PURE__ */ jsx("span", { className: "text-info", children: defense != null ? `\u{1F6E1}${defense}` : "" })
8451
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-error", children: attack != null ? `\u2694${attack}` : "" }),
8452
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-info", children: defense != null ? `\u{1F6E1}${defense}` : "" })
8430
8453
  ] })
8431
8454
  ]
8432
8455
  }
@@ -8439,7 +8462,9 @@ var init_GameCard = __esm({
8439
8462
  init_cn();
8440
8463
  init_useEventBus();
8441
8464
  init_Box();
8465
+ init_Button();
8442
8466
  init_Typography();
8467
+ init_GameIcon();
8443
8468
  cardSizeMap = {
8444
8469
  sm: "w-16 h-24",
8445
8470
  md: "w-20 h-28",
@@ -8462,12 +8487,13 @@ function HealthBar({
8462
8487
  frameAsset,
8463
8488
  fillAsset
8464
8489
  }) {
8465
- const sizes = sizeMap[size];
8490
+ const sizes = sizeMap2[size];
8466
8491
  const percentage = max > 0 ? Math.max(0, Math.min(100, current / max * 100)) : 0;
8467
8492
  if (format === "hearts") {
8468
- return /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-1", className), children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsx(
8469
- "span",
8493
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center gap-1", className), children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsx(
8494
+ Box,
8470
8495
  {
8496
+ as: "span",
8471
8497
  className: cn(animated && "transition-transform hover:scale-110"),
8472
8498
  children: heartIcon(i < current, sizes.heart)
8473
8499
  },
@@ -8476,10 +8502,12 @@ function HealthBar({
8476
8502
  }
8477
8503
  if (format === "bar") {
8478
8504
  return /* @__PURE__ */ jsx(
8479
- "div",
8505
+ Box,
8480
8506
  {
8507
+ position: "relative",
8508
+ overflow: "hidden",
8481
8509
  className: cn(
8482
- "relative overflow-hidden rounded-full",
8510
+ "rounded-full",
8483
8511
  !frameAsset && "bg-muted",
8484
8512
  sizes.bar,
8485
8513
  "w-24",
@@ -8487,10 +8515,11 @@ function HealthBar({
8487
8515
  ),
8488
8516
  style: frameAsset ? { backgroundImage: `url(${frameAsset.url})`, backgroundSize: "100% 100%" } : void 0,
8489
8517
  children: /* @__PURE__ */ jsx(
8490
- "div",
8518
+ Box,
8491
8519
  {
8520
+ position: "absolute",
8492
8521
  className: cn(
8493
- "absolute inset-y-0 left-0 rounded-full",
8522
+ "inset-y-0 left-0 rounded-full",
8494
8523
  !fillAsset && (percentage > 66 ? "bg-success" : percentage > 33 ? "bg-warning" : "bg-error"),
8495
8524
  animated && "transition-all duration-300"
8496
8525
  ),
@@ -8504,10 +8533,11 @@ function HealthBar({
8504
8533
  );
8505
8534
  }
8506
8535
  if (format === "progress") {
8507
- return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", className), children: [
8536
+ return /* @__PURE__ */ jsxs(Box, { className: cn("flex items-center gap-2", className), children: [
8508
8537
  level != null && /* @__PURE__ */ jsxs(
8509
- "span",
8538
+ Typography,
8510
8539
  {
8540
+ as: "span",
8511
8541
  className: cn(
8512
8542
  "flex-shrink-0 rounded-interactive font-bold",
8513
8543
  "bg-accent text-accent-foreground border border-accent",
@@ -8519,21 +8549,23 @@ function HealthBar({
8519
8549
  ]
8520
8550
  }
8521
8551
  ),
8522
- /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col gap-0.5", children: [
8552
+ /* @__PURE__ */ jsxs(Box, { className: "flex-1 flex flex-col gap-0.5", children: [
8523
8553
  /* @__PURE__ */ jsx(
8524
- "div",
8554
+ Box,
8525
8555
  {
8556
+ position: "relative",
8526
8557
  className: cn(
8527
- "relative w-full overflow-hidden rounded-full",
8558
+ "w-full overflow-hidden rounded-full",
8528
8559
  !frameAsset && "bg-muted border border-muted",
8529
8560
  sizes.bar
8530
8561
  ),
8531
8562
  style: frameAsset ? { backgroundImage: `url(${frameAsset.url})`, backgroundSize: "100% 100%" } : void 0,
8532
8563
  children: /* @__PURE__ */ jsx(
8533
- "div",
8564
+ Box,
8534
8565
  {
8566
+ position: "absolute",
8535
8567
  className: cn(
8536
- "absolute inset-y-0 left-0 rounded-full",
8568
+ "inset-y-0 left-0 rounded-full",
8537
8569
  !fillAsset && "bg-gradient-to-r from-accent to-info",
8538
8570
  animated && "transition-all duration-500 ease-out"
8539
8571
  ),
@@ -8545,7 +8577,7 @@ function HealthBar({
8545
8577
  )
8546
8578
  }
8547
8579
  ),
8548
- showLabel && /* @__PURE__ */ jsxs("span", { className: cn("text-foreground/70 tabular-nums", sizes.label), children: [
8580
+ showLabel && /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("text-foreground/70 tabular-nums", sizes.label), children: [
8549
8581
  current,
8550
8582
  " / ",
8551
8583
  max,
@@ -8554,16 +8586,18 @@ function HealthBar({
8554
8586
  ] })
8555
8587
  ] });
8556
8588
  }
8557
- return /* @__PURE__ */ jsxs("span", { className: cn("font-mono font-bold", sizes.text, className), children: [
8589
+ return /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("font-mono font-bold", sizes.text, className), children: [
8558
8590
  current,
8559
8591
  "/",
8560
8592
  max
8561
8593
  ] });
8562
8594
  }
8563
- var heartIcon, sizeMap;
8595
+ var heartIcon, sizeMap2;
8564
8596
  var init_HealthBar = __esm({
8565
8597
  "components/game/2d/atoms/HealthBar.tsx"() {
8566
8598
  init_cn();
8599
+ init_Box();
8600
+ init_Typography();
8567
8601
  heartIcon = (filled, size) => /* @__PURE__ */ jsx(
8568
8602
  "svg",
8569
8603
  {
@@ -8575,7 +8609,7 @@ var init_HealthBar = __esm({
8575
8609
  children: /* @__PURE__ */ 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" })
8576
8610
  }
8577
8611
  );
8578
- sizeMap = {
8612
+ sizeMap2 = {
8579
8613
  sm: { heart: "w-4 h-4", bar: "h-2", text: "text-sm", label: "text-xs", badge: "text-xs px-1.5 py-0.5" },
8580
8614
  md: { heart: "w-6 h-6", bar: "h-3", text: "text-base", label: "text-xs", badge: "text-xs px-2 py-0.5" },
8581
8615
  lg: { heart: "w-8 h-8", bar: "h-4", text: "text-lg", label: "text-sm", badge: "text-sm px-2.5 py-1" }
@@ -8596,37 +8630,30 @@ function ScoreDisplay({
8596
8630
  const resolvedValue = typeof value === "number" && !Number.isNaN(value) ? value : typeof score === "number" && !Number.isNaN(score) ? score : 0;
8597
8631
  const formattedValue = new Intl.NumberFormat(locale).format(resolvedValue);
8598
8632
  return /* @__PURE__ */ jsxs(
8599
- "div",
8633
+ Box,
8600
8634
  {
8601
8635
  className: cn(
8602
8636
  "flex items-center gap-2 font-bold",
8603
- sizeMap2[size],
8637
+ sizeMap3[size],
8604
8638
  className
8605
8639
  ),
8606
8640
  children: [
8607
- assetUrl ? /* @__PURE__ */ jsx(
8608
- "img",
8609
- {
8610
- src: assetUrl.url,
8611
- alt: "",
8612
- width: 20,
8613
- height: 20,
8614
- style: { imageRendering: "pixelated", objectFit: "contain" },
8615
- className: "flex-shrink-0"
8616
- }
8617
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0", children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) }) : null,
8618
- label && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: label }),
8619
- /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formattedValue })
8641
+ assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 20, className: "flex-shrink-0" }) : icon ? /* @__PURE__ */ jsx(Box, { as: "span", className: "flex-shrink-0", children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) }) : null,
8642
+ label && /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: label }),
8643
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "tabular-nums", children: formattedValue })
8620
8644
  ]
8621
8645
  }
8622
8646
  );
8623
8647
  }
8624
- var sizeMap2, DEFAULT_ASSET_URL;
8648
+ var sizeMap3, DEFAULT_ASSET_URL;
8625
8649
  var init_ScoreDisplay = __esm({
8626
8650
  "components/game/2d/atoms/ScoreDisplay.tsx"() {
8627
8651
  init_cn();
8628
8652
  init_Icon();
8629
- sizeMap2 = {
8653
+ init_Box();
8654
+ init_Typography();
8655
+ init_GameIcon();
8656
+ sizeMap3 = {
8630
8657
  sm: "text-sm",
8631
8658
  md: "text-lg",
8632
8659
  lg: "text-2xl",
@@ -8689,9 +8716,9 @@ function ControlButton({
8689
8716
  [isPressed, releaseEvent, eventBus, onRelease]
8690
8717
  );
8691
8718
  return /* @__PURE__ */ jsx(
8692
- "button",
8719
+ Button,
8693
8720
  {
8694
- type: "button",
8721
+ variant,
8695
8722
  disabled,
8696
8723
  onPointerDown: handlePointerDown,
8697
8724
  onPointerUp: handlePointerUp,
@@ -8702,41 +8729,35 @@ function ControlButton({
8702
8729
  "select-none touch-none",
8703
8730
  "transition-all duration-100",
8704
8731
  "active:scale-95",
8705
- sizeMap3[size] ?? sizeMap3.md,
8732
+ sizeMap4[size] ?? sizeMap4.md,
8706
8733
  shapeMap[shape] ?? shapeMap.circle,
8707
8734
  variantMap[variant] ?? variantMap.secondary,
8708
8735
  actualPressed && "scale-95 brightness-110 border-foreground",
8709
8736
  disabled && "opacity-50 cursor-not-allowed",
8710
8737
  className
8711
8738
  ),
8712
- children: assetUrl ? /* @__PURE__ */ jsx(
8713
- "img",
8714
- {
8715
- src: assetUrl.url,
8716
- alt: "",
8717
- width: 24,
8718
- height: 24,
8719
- style: { imageRendering: "pixelated", objectFit: "contain" },
8720
- className: "flex-shrink-0"
8721
- }
8722
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "text-2xl", children: typeof icon === "string" ? /^[a-zA-Z0-9-]+$/.test(icon) ? (() => {
8739
+ children: assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 24, className: "flex-shrink-0" }) : icon ? /* @__PURE__ */ jsx(Box, { as: "span", className: "text-2xl", children: typeof icon === "string" ? /^[a-zA-Z0-9-]+$/.test(icon) ? (() => {
8723
8740
  const I = resolveIcon(icon);
8724
8741
  return I ? /* @__PURE__ */ jsx(I, { className: "w-6 h-6" }) : null;
8725
8742
  })() : icon : /* @__PURE__ */ (() => {
8726
8743
  const I = icon;
8727
8744
  return /* @__PURE__ */ jsx(I, { className: "w-6 h-6" });
8728
- })() }) : label ? /* @__PURE__ */ jsx("span", { children: label }) : null
8745
+ })() }) : label ? /* @__PURE__ */ jsx(Typography, { as: "span", children: label }) : null
8729
8746
  }
8730
8747
  );
8731
8748
  }
8732
- var sizeMap3, shapeMap, variantMap, DEFAULT_ASSET_URL2;
8749
+ var sizeMap4, shapeMap, variantMap, DEFAULT_ASSET_URL2;
8733
8750
  var init_ControlButton = __esm({
8734
8751
  "components/game/2d/atoms/ControlButton.tsx"() {
8735
8752
  "use client";
8736
8753
  init_cn();
8737
8754
  init_useEventBus();
8738
8755
  init_Icon();
8739
- sizeMap3 = {
8756
+ init_Button();
8757
+ init_Box();
8758
+ init_Typography();
8759
+ init_GameIcon();
8760
+ sizeMap4 = {
8740
8761
  sm: "w-10 h-10 text-sm",
8741
8762
  md: "w-14 h-14 text-base",
8742
8763
  lg: "w-18 h-18 text-lg",
@@ -8806,12 +8827,12 @@ function Sprite({
8806
8827
  onClick?.();
8807
8828
  };
8808
8829
  return /* @__PURE__ */ jsx(
8809
- "div",
8830
+ Box,
8810
8831
  {
8832
+ position: "absolute",
8811
8833
  className,
8812
8834
  onClick: action || onClick ? handleClick : void 0,
8813
8835
  style: {
8814
- position: "absolute",
8815
8836
  width: frameWidth,
8816
8837
  height: frameHeight,
8817
8838
  backgroundImage: `url(${spritesheet.url})`,
@@ -8832,6 +8853,7 @@ var init_Sprite = __esm({
8832
8853
  "components/game/2d/atoms/Sprite.tsx"() {
8833
8854
  "use client";
8834
8855
  init_useEventBus();
8856
+ init_Box();
8835
8857
  init_spriteAnimation();
8836
8858
  DEFAULT_SPRITESHEET = {
8837
8859
  url: "https://almadar-kflow-assets.web.app/shared/isometric-blocks/Spritesheet/allTiles_sheet.png",
@@ -8868,17 +8890,7 @@ function StateIndicator({
8868
8890
  className
8869
8891
  ),
8870
8892
  children: [
8871
- /* @__PURE__ */ jsx(Box, { as: "span", children: assetUrl ? /* @__PURE__ */ jsx(
8872
- "img",
8873
- {
8874
- src: assetUrl.url,
8875
- alt: displayLabel,
8876
- width: 16,
8877
- height: 16,
8878
- style: { imageRendering: "pixelated", objectFit: "contain" },
8879
- className: "flex-shrink-0"
8880
- }
8881
- ) : typeof config.icon === "string" ? /^[a-zA-Z0-9-]+$/.test(config.icon) ? /* @__PURE__ */ jsx(Icon, { name: config.icon }) : config.icon : /* @__PURE__ */ jsx(Icon, { icon: config.icon }) }),
8893
+ /* @__PURE__ */ jsx(Box, { as: "span", children: assetUrl ? /* @__PURE__ */ 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__ */ jsx(Icon, { name: config.icon }) : config.icon : /* @__PURE__ */ jsx(Icon, { icon: config.icon }) }),
8882
8894
  /* @__PURE__ */ jsx(Box, { as: "span", children: displayLabel })
8883
8895
  ]
8884
8896
  }
@@ -8890,6 +8902,7 @@ var init_StateIndicator = __esm({
8890
8902
  init_Box();
8891
8903
  init_Icon();
8892
8904
  init_cn();
8905
+ init_GameIcon();
8893
8906
  DEFAULT_ASSET_URL3 = {
8894
8907
  url: "https://almadar-kflow-assets.web.app/shared/isometric-dungeon/Isometric/chestClosed_E.png",
8895
8908
  role: "ui",
@@ -8943,29 +8956,31 @@ function TimerDisplay({
8943
8956
  }) {
8944
8957
  const isLow = lowThreshold != null && seconds <= lowThreshold && seconds > 0;
8945
8958
  return /* @__PURE__ */ jsxs(
8946
- "div",
8959
+ Box,
8947
8960
  {
8948
8961
  className: cn(
8949
8962
  "inline-flex items-center gap-1 justify-center rounded-container",
8950
8963
  "bg-card/80 border border-muted font-mono font-bold tabular-nums",
8951
- sizeMap4[size],
8964
+ sizeMap5[size],
8952
8965
  running && "border-success/50",
8953
8966
  isLow && "text-error border-error/50 animate-pulse",
8954
8967
  !isLow && "text-foreground",
8955
8968
  className
8956
8969
  ),
8957
8970
  children: [
8958
- iconAsset && /* @__PURE__ */ jsx("img", { src: iconAsset.url, alt: "", className: "w-4 h-4 object-contain flex-shrink-0" }),
8971
+ iconAsset && /* @__PURE__ */ jsx(GameIcon, { assetUrl: iconAsset, icon: "image", size: 16, className: "w-4 h-4 object-contain flex-shrink-0" }),
8959
8972
  formatTime(seconds, format)
8960
8973
  ]
8961
8974
  }
8962
8975
  );
8963
8976
  }
8964
- var sizeMap4;
8977
+ var sizeMap5;
8965
8978
  var init_TimerDisplay = __esm({
8966
8979
  "components/game/2d/atoms/TimerDisplay.tsx"() {
8967
8980
  init_cn();
8968
- sizeMap4 = {
8981
+ init_Box();
8982
+ init_GameIcon();
8983
+ sizeMap5 = {
8969
8984
  sm: "text-sm px-2 py-0.5",
8970
8985
  md: "text-lg px-3 py-1",
8971
8986
  lg: "text-2xl px-4 py-1.5"
@@ -8983,9 +8998,9 @@ function ResourceCounter({
8983
8998
  size = "md",
8984
8999
  className
8985
9000
  }) {
8986
- const sizes = sizeMap5[size];
9001
+ const sizes = sizeMap6[size];
8987
9002
  return /* @__PURE__ */ jsxs(
8988
- "div",
9003
+ Box,
8989
9004
  {
8990
9005
  className: cn(
8991
9006
  "inline-flex items-center rounded-container",
@@ -8994,21 +9009,11 @@ function ResourceCounter({
8994
9009
  className
8995
9010
  ),
8996
9011
  children: [
8997
- assetUrl ? /* @__PURE__ */ jsx(
8998
- "img",
8999
- {
9000
- src: assetUrl.url,
9001
- alt: label,
9002
- width: sizes.img,
9003
- height: sizes.img,
9004
- style: { imageRendering: "pixelated", objectFit: "contain" },
9005
- className: "flex-shrink-0"
9006
- }
9007
- ) : icon ? /* @__PURE__ */ jsx("span", { className: cn("flex-shrink-0", sizes.icon), children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) }) : null,
9008
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: label }),
9009
- /* @__PURE__ */ jsxs("span", { className: cn("font-bold tabular-nums", color && (color in colorTokenClasses2 ? colorTokenClasses2[color] : color)), children: [
9012
+ assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: sizes.img, alt: label, className: "flex-shrink-0" }) : icon ? /* @__PURE__ */ jsx(Box, { as: "span", className: cn("flex-shrink-0", sizes.icon), children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) }) : null,
9013
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: label }),
9014
+ /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("font-bold tabular-nums", color && (color in colorTokenClasses2 ? colorTokenClasses2[color] : color)), children: [
9010
9015
  value,
9011
- max != null && /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
9016
+ max != null && /* @__PURE__ */ jsxs(Typography, { as: "span", className: "text-muted-foreground", children: [
9012
9017
  "/",
9013
9018
  max
9014
9019
  ] })
@@ -9017,11 +9022,14 @@ function ResourceCounter({
9017
9022
  }
9018
9023
  );
9019
9024
  }
9020
- var colorTokenClasses2, DEFAULT_ASSET_URL4, sizeMap5;
9025
+ var colorTokenClasses2, DEFAULT_ASSET_URL4, sizeMap6;
9021
9026
  var init_ResourceCounter = __esm({
9022
9027
  "components/game/2d/atoms/ResourceCounter.tsx"() {
9023
9028
  init_cn();
9024
9029
  init_Icon();
9030
+ init_Box();
9031
+ init_Typography();
9032
+ init_GameIcon();
9025
9033
  colorTokenClasses2 = {
9026
9034
  primary: "text-primary",
9027
9035
  secondary: "text-secondary",
@@ -9035,7 +9043,7 @@ var init_ResourceCounter = __esm({
9035
9043
  role: "ui",
9036
9044
  category: "coin"
9037
9045
  };
9038
- sizeMap5 = {
9046
+ sizeMap6 = {
9039
9047
  sm: { wrapper: "text-xs gap-1 px-1.5 py-0.5", icon: "text-sm", img: 16 },
9040
9048
  md: { wrapper: "text-sm gap-1.5 px-2 py-1", icon: "text-base", img: 20 },
9041
9049
  lg: { wrapper: "text-base gap-2 px-3 py-1.5", icon: "text-lg", img: 28 }
@@ -9060,9 +9068,9 @@ function ItemSlot({
9060
9068
  const isClickable = onClick != null || action != null;
9061
9069
  const px = assetSizeMap[size];
9062
9070
  return /* @__PURE__ */ jsx(
9063
- "button",
9071
+ Button,
9064
9072
  {
9065
- type: "button",
9073
+ variant: "ghost",
9066
9074
  onClick: () => {
9067
9075
  if (action) eventBus.emit(`UI:${action}`, {});
9068
9076
  onClick?.();
@@ -9072,7 +9080,7 @@ function ItemSlot({
9072
9080
  className: cn(
9073
9081
  "relative flex items-center justify-center rounded-interactive border-2",
9074
9082
  "bg-card/80 transition-all duration-150",
9075
- sizeMap6[size],
9083
+ sizeMap7[size],
9076
9084
  empty ? "border-border bg-card/50" : rarityBorderMap[rarity],
9077
9085
  !empty && rarityGlowMap[rarity],
9078
9086
  selected && "ring-2 ring-foreground ring-offset-1 ring-offset-background",
@@ -9081,21 +9089,12 @@ function ItemSlot({
9081
9089
  !isClickable && "cursor-default",
9082
9090
  className
9083
9091
  ),
9084
- children: empty ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-base", children: "+" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
9085
- assetUrl ? /* @__PURE__ */ jsx(
9086
- "img",
9087
- {
9088
- src: assetUrl?.url,
9089
- alt: label,
9090
- width: px,
9091
- height: px,
9092
- style: { imageRendering: "pixelated", objectFit: "contain" },
9093
- className: "flex-shrink-0"
9094
- }
9095
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0", children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) }) : null,
9092
+ children: empty ? /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground text-base", children: "+" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
9093
+ assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: px, alt: label, className: "flex-shrink-0" }) : icon ? /* @__PURE__ */ jsx(Box, { as: "span", className: "flex-shrink-0", children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) }) : null,
9096
9094
  quantity != null && quantity > 1 && /* @__PURE__ */ jsx(
9097
- "span",
9095
+ Typography,
9098
9096
  {
9097
+ as: "span",
9099
9098
  className: cn(
9100
9099
  "absolute -bottom-1 -right-1 flex items-center justify-center",
9101
9100
  "min-w-[18px] h-[18px] rounded-full px-1",
@@ -9108,14 +9107,18 @@ function ItemSlot({
9108
9107
  }
9109
9108
  );
9110
9109
  }
9111
- var sizeMap6, rarityBorderMap, rarityGlowMap, DEFAULT_ASSET_URL5, assetSizeMap;
9110
+ var sizeMap7, rarityBorderMap, rarityGlowMap, DEFAULT_ASSET_URL5, assetSizeMap;
9112
9111
  var init_ItemSlot = __esm({
9113
9112
  "components/game/2d/atoms/ItemSlot.tsx"() {
9114
9113
  "use client";
9115
9114
  init_cn();
9116
9115
  init_Icon();
9117
9116
  init_useEventBus();
9118
- sizeMap6 = {
9117
+ init_Button();
9118
+ init_Box();
9119
+ init_Typography();
9120
+ init_GameIcon();
9121
+ sizeMap7 = {
9119
9122
  sm: "w-10 h-10 text-lg",
9120
9123
  md: "w-14 h-14 text-2xl",
9121
9124
  lg: "w-18 h-18 text-3xl"
@@ -9156,9 +9159,9 @@ function TurnIndicator({
9156
9159
  size = "md",
9157
9160
  className
9158
9161
  }) {
9159
- const sizes = sizeMap7[size];
9162
+ const sizes = sizeMap8[size];
9160
9163
  return /* @__PURE__ */ jsxs(
9161
- "div",
9164
+ Box,
9162
9165
  {
9163
9166
  className: cn(
9164
9167
  "inline-flex items-center rounded-container",
@@ -9167,42 +9170,35 @@ function TurnIndicator({
9167
9170
  className
9168
9171
  ),
9169
9172
  children: [
9170
- /* @__PURE__ */ jsxs("span", { className: "font-bold tabular-nums", children: [
9173
+ /* @__PURE__ */ jsxs(Typography, { as: "span", className: "font-bold tabular-nums", children: [
9171
9174
  "Turn ",
9172
9175
  currentTurn,
9173
- maxTurns != null && /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
9176
+ maxTurns != null && /* @__PURE__ */ jsxs(Typography, { as: "span", className: "text-muted-foreground", children: [
9174
9177
  "/",
9175
9178
  maxTurns
9176
9179
  ] })
9177
9180
  ] }),
9178
9181
  phase && /* @__PURE__ */ jsxs(Fragment, { children: [
9179
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "|" }),
9180
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: phase })
9182
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: "|" }),
9183
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: phase })
9181
9184
  ] }),
9182
9185
  activeTeam && /* @__PURE__ */ jsxs(Fragment, { children: [
9183
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "|" }),
9184
- assetUrl ? /* @__PURE__ */ jsx(
9185
- "img",
9186
- {
9187
- src: assetUrl.url,
9188
- alt: "",
9189
- width: 12,
9190
- height: 12,
9191
- style: { imageRendering: "pixelated", objectFit: "contain" },
9192
- className: "flex-shrink-0"
9193
- }
9194
- ) : /* @__PURE__ */ jsx("span", { className: cn("rounded-full bg-success/20", sizes.dot) }),
9195
- /* @__PURE__ */ jsx("span", { className: "text-success", children: activeTeam })
9186
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: "|" }),
9187
+ assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 12, className: "flex-shrink-0" }) : /* @__PURE__ */ jsx(Box, { as: "span", className: cn("rounded-full bg-success/20", sizes.dot) }),
9188
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-success", children: activeTeam })
9196
9189
  ] })
9197
9190
  ]
9198
9191
  }
9199
9192
  );
9200
9193
  }
9201
- var sizeMap7, DEFAULT_ASSET_URL6;
9194
+ var sizeMap8, DEFAULT_ASSET_URL6;
9202
9195
  var init_TurnIndicator = __esm({
9203
9196
  "components/game/2d/atoms/TurnIndicator.tsx"() {
9204
9197
  init_cn();
9205
- sizeMap7 = {
9198
+ init_Box();
9199
+ init_Typography();
9200
+ init_GameIcon();
9201
+ sizeMap8 = {
9206
9202
  sm: { wrapper: "text-xs gap-1.5 px-2 py-0.5", dot: "w-1.5 h-1.5" },
9207
9203
  md: { wrapper: "text-sm gap-2 px-3 py-1", dot: "w-2 h-2" },
9208
9204
  lg: { wrapper: "text-base gap-2.5 px-4 py-1.5", dot: "w-2.5 h-2.5" }
@@ -9234,10 +9230,10 @@ function ComboCounter({
9234
9230
  size = "md",
9235
9231
  className
9236
9232
  }) {
9237
- const sizes = sizeMap8[size];
9233
+ const sizes = sizeMap9[size];
9238
9234
  if (combo <= 0) return null;
9239
9235
  return /* @__PURE__ */ jsxs(
9240
- "div",
9236
+ Box,
9241
9237
  {
9242
9238
  className: cn(
9243
9239
  "inline-flex flex-col items-center justify-center",
@@ -9247,24 +9243,14 @@ function ComboCounter({
9247
9243
  className
9248
9244
  ),
9249
9245
  children: [
9250
- assetUrl && /* @__PURE__ */ jsx(
9251
- "img",
9252
- {
9253
- src: assetUrl.url,
9254
- alt: "combo",
9255
- width: 24,
9256
- height: 24,
9257
- style: { imageRendering: "pixelated", objectFit: "contain" },
9258
- className: "flex-shrink-0 mb-0.5"
9259
- }
9260
- ),
9261
- /* @__PURE__ */ jsx("span", { className: cn("font-black tabular-nums leading-none", sizes.combo, getComboIntensity(combo)), children: combo }),
9262
- /* @__PURE__ */ jsx("span", { className: cn("font-bold uppercase tracking-wider text-muted-foreground", sizes.label), children: "combo" }),
9263
- multiplier != null && multiplier > 1 && /* @__PURE__ */ jsxs("span", { className: cn("font-bold text-warning tabular-nums", sizes.multiplier), children: [
9246
+ assetUrl && /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 24, className: "flex-shrink-0 mb-0.5" }),
9247
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: cn("font-black tabular-nums leading-none", sizes.combo, getComboIntensity(combo)), children: combo }),
9248
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: cn("font-bold uppercase tracking-wider text-muted-foreground", sizes.label), children: "combo" }),
9249
+ multiplier != null && multiplier > 1 && /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("font-bold text-warning tabular-nums", sizes.multiplier), children: [
9264
9250
  "x",
9265
9251
  multiplier.toFixed(1)
9266
9252
  ] }),
9267
- streak != null && streak > 0 && /* @__PURE__ */ jsxs("span", { className: cn("text-muted-foreground tabular-nums", sizes.label), children: [
9253
+ streak != null && streak > 0 && /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("text-muted-foreground tabular-nums", sizes.label), children: [
9268
9254
  streak,
9269
9255
  " streak"
9270
9256
  ] })
@@ -9272,16 +9258,19 @@ function ComboCounter({
9272
9258
  }
9273
9259
  );
9274
9260
  }
9275
- var DEFAULT_ASSET_URL7, sizeMap8;
9261
+ var DEFAULT_ASSET_URL7, sizeMap9;
9276
9262
  var init_ComboCounter = __esm({
9277
9263
  "components/game/2d/atoms/ComboCounter.tsx"() {
9278
9264
  init_cn();
9265
+ init_Box();
9266
+ init_Typography();
9267
+ init_GameIcon();
9279
9268
  DEFAULT_ASSET_URL7 = {
9280
9269
  url: "https://almadar-kflow-assets.web.app/shared/effects/flash/flash00.png",
9281
9270
  role: "effect",
9282
9271
  category: "effect"
9283
9272
  };
9284
- sizeMap8 = {
9273
+ sizeMap9 = {
9285
9274
  sm: { combo: "text-lg", label: "text-xs", multiplier: "text-xs" },
9286
9275
  md: { combo: "text-2xl", label: "text-xs", multiplier: "text-sm" },
9287
9276
  lg: { combo: "text-4xl", label: "text-sm", multiplier: "text-base" }
@@ -9298,54 +9287,48 @@ function WaypointMarker({
9298
9287
  size = "md",
9299
9288
  className
9300
9289
  }) {
9301
- const sizes = sizeMap9[size];
9302
- return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col items-center", className), children: [
9303
- /* @__PURE__ */ jsxs("div", { className: "relative flex items-center justify-center", children: [
9290
+ const sizes = sizeMap10[size];
9291
+ return /* @__PURE__ */ jsxs(Box, { className: cn("flex flex-col items-center", className), children: [
9292
+ /* @__PURE__ */ jsxs(Box, { className: "relative flex items-center justify-center", children: [
9304
9293
  active && /* @__PURE__ */ jsx(
9305
- "div",
9294
+ Box,
9306
9295
  {
9296
+ position: "absolute",
9307
9297
  className: cn(
9308
- "absolute rounded-full border-2 border-info animate-ping opacity-50",
9298
+ "rounded-full border-2 border-info animate-ping opacity-50",
9309
9299
  sizes.ring
9310
9300
  )
9311
9301
  }
9312
9302
  ),
9313
9303
  active && /* @__PURE__ */ jsx(
9314
- "div",
9304
+ Box,
9315
9305
  {
9306
+ position: "absolute",
9316
9307
  className: cn(
9317
- "absolute rounded-full border-2 border-info",
9308
+ "rounded-full border-2 border-info",
9318
9309
  sizes.ring
9319
9310
  )
9320
9311
  }
9321
9312
  ),
9322
9313
  /* @__PURE__ */ jsx(
9323
- "div",
9314
+ Box,
9324
9315
  {
9316
+ position: "relative",
9325
9317
  className: cn(
9326
- "relative flex items-center justify-center rounded-full transition-all duration-200",
9318
+ "flex items-center justify-center rounded-full transition-all duration-200",
9327
9319
  sizes.dot,
9328
9320
  completed && "bg-success text-foreground",
9329
9321
  active && !completed && "bg-info text-foreground",
9330
9322
  !active && !completed && "bg-muted"
9331
9323
  ),
9332
- children: completed ? checkIcon : assetUrl ? /* @__PURE__ */ jsx(
9333
- "img",
9334
- {
9335
- src: assetUrl.url,
9336
- alt: label,
9337
- width: sizes.img,
9338
- height: sizes.img,
9339
- style: { imageRendering: "pixelated", objectFit: "contain" },
9340
- className: "flex-shrink-0"
9341
- }
9342
- ) : icon ? typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) : null
9324
+ children: completed ? checkIcon : assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: sizes.img, alt: label, className: "flex-shrink-0" }) : icon ? typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) : null
9343
9325
  }
9344
9326
  )
9345
9327
  ] }),
9346
9328
  label && /* @__PURE__ */ jsx(
9347
- "span",
9329
+ Typography,
9348
9330
  {
9331
+ as: "span",
9349
9332
  className: cn(
9350
9333
  "text-center whitespace-nowrap",
9351
9334
  sizes.label,
@@ -9356,17 +9339,20 @@ function WaypointMarker({
9356
9339
  )
9357
9340
  ] });
9358
9341
  }
9359
- var DEFAULT_ASSET_URL8, sizeMap9, checkIcon;
9342
+ var DEFAULT_ASSET_URL8, sizeMap10, checkIcon;
9360
9343
  var init_WaypointMarker = __esm({
9361
9344
  "components/game/2d/atoms/WaypointMarker.tsx"() {
9362
9345
  init_cn();
9363
9346
  init_Icon();
9347
+ init_Box();
9348
+ init_Typography();
9349
+ init_GameIcon();
9364
9350
  DEFAULT_ASSET_URL8 = {
9365
9351
  url: "https://almadar-kflow-assets.web.app/shared/world-map/battle_marker.png",
9366
9352
  role: "ui",
9367
9353
  category: "waypoint"
9368
9354
  };
9369
- sizeMap9 = {
9355
+ sizeMap10 = {
9370
9356
  sm: { dot: "w-4 h-4", ring: "w-6 h-6", label: "text-xs mt-1", img: 12 },
9371
9357
  md: { dot: "w-6 h-6", ring: "w-8 h-8", label: "text-sm mt-1.5", img: 18 },
9372
9358
  lg: { dot: "w-8 h-8", ring: "w-10 h-10", label: "text-base mt-2", img: 24 }
@@ -9391,32 +9377,24 @@ function StatusEffect({
9391
9377
  size = "md",
9392
9378
  className
9393
9379
  }) {
9394
- const sizes = sizeMap10[size];
9395
- return /* @__PURE__ */ jsxs("div", { className: cn("relative inline-flex flex-col items-center", className), children: [
9380
+ const sizes = sizeMap11[size];
9381
+ return /* @__PURE__ */ jsxs(Box, { position: "relative", className: cn("inline-flex flex-col items-center", className), children: [
9396
9382
  /* @__PURE__ */ jsxs(
9397
- "div",
9383
+ Box,
9398
9384
  {
9385
+ position: "relative",
9399
9386
  className: cn(
9400
- "relative flex items-center justify-center rounded-interactive border-2",
9387
+ "flex items-center justify-center rounded-interactive border-2",
9401
9388
  sizes.container,
9402
9389
  variantStyles7[variant]
9403
9390
  ),
9404
9391
  title: label,
9405
9392
  children: [
9406
- /* @__PURE__ */ jsx("span", { className: cn("flex items-center justify-center", sizes.icon), children: assetUrl ? /* @__PURE__ */ jsx(
9407
- "img",
9408
- {
9409
- src: assetUrl.url,
9410
- alt: label,
9411
- width: sizes.img,
9412
- height: sizes.img,
9413
- style: { imageRendering: "pixelated", objectFit: "contain" },
9414
- className: "flex-shrink-0"
9415
- }
9416
- ) : icon != null && typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, size: "sm" }) : icon != null ? /* @__PURE__ */ jsx(Icon, { icon, size: "sm" }) : null }),
9393
+ /* @__PURE__ */ jsx(Box, { as: "span", className: cn("flex items-center justify-center", sizes.icon), children: assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: sizes.img, alt: label, className: "flex-shrink-0" }) : icon != null && typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, size: "sm" }) : icon != null ? /* @__PURE__ */ jsx(Icon, { icon, size: "sm" }) : null }),
9417
9394
  duration !== void 0 && /* @__PURE__ */ jsx(
9418
- "span",
9395
+ Typography,
9419
9396
  {
9397
+ as: "span",
9420
9398
  className: cn(
9421
9399
  "absolute bottom-0 left-0 right-0 text-center font-mono font-bold text-foreground bg-background/60 leading-tight",
9422
9400
  sizes.timer
@@ -9428,8 +9406,9 @@ function StatusEffect({
9428
9406
  }
9429
9407
  ),
9430
9408
  stacks !== void 0 && stacks > 1 && /* @__PURE__ */ jsx(
9431
- "span",
9409
+ Typography,
9432
9410
  {
9411
+ as: "span",
9433
9412
  className: cn(
9434
9413
  "absolute flex items-center justify-center rounded-full bg-card text-foreground font-bold leading-none",
9435
9414
  sizes.badge
@@ -9437,20 +9416,23 @@ function StatusEffect({
9437
9416
  children: stacks
9438
9417
  }
9439
9418
  ),
9440
- label && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground mt-0.5 text-center whitespace-nowrap", children: label })
9419
+ label && /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-xs text-muted-foreground mt-0.5 text-center whitespace-nowrap", children: label })
9441
9420
  ] });
9442
9421
  }
9443
- var DEFAULT_ASSET_URL9, sizeMap10, variantStyles7;
9422
+ var DEFAULT_ASSET_URL9, sizeMap11, variantStyles7;
9444
9423
  var init_StatusEffect = __esm({
9445
9424
  "components/game/2d/atoms/StatusEffect.tsx"() {
9446
9425
  init_cn();
9447
9426
  init_Icon();
9427
+ init_Box();
9428
+ init_Typography();
9429
+ init_GameIcon();
9448
9430
  DEFAULT_ASSET_URL9 = {
9449
9431
  url: "https://almadar-kflow-assets.web.app/shared/effects/particles/flame_01.png",
9450
9432
  role: "ui",
9451
9433
  category: "effect"
9452
9434
  };
9453
- sizeMap10 = {
9435
+ sizeMap11 = {
9454
9436
  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 },
9455
9437
  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 },
9456
9438
  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 }
@@ -9474,38 +9456,31 @@ function DamageNumber({
9474
9456
  return /* @__PURE__ */ jsxs(Fragment, { children: [
9475
9457
  /* @__PURE__ */ jsx("style", { children: floatKeyframes }),
9476
9458
  /* @__PURE__ */ jsxs(
9477
- "span",
9459
+ Typography,
9478
9460
  {
9461
+ as: "span",
9479
9462
  className: cn(
9480
9463
  "inline-flex items-center gap-0.5 font-mono select-none pointer-events-none",
9481
- sizeMap11[size],
9464
+ sizeMap12[size],
9482
9465
  typeStyles[type],
9483
9466
  className
9484
9467
  ),
9485
9468
  style: { animation: "damageFloat 1s ease-out forwards" },
9486
9469
  children: [
9487
- assetUrl && /* @__PURE__ */ jsx(
9488
- "img",
9489
- {
9490
- src: assetUrl.url,
9491
- alt: "",
9492
- width: 14,
9493
- height: 14,
9494
- style: { imageRendering: "pixelated", objectFit: "contain" },
9495
- className: "flex-shrink-0"
9496
- }
9497
- ),
9470
+ assetUrl && /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 14, className: "flex-shrink-0" }),
9498
9471
  displayText
9499
9472
  ]
9500
9473
  }
9501
9474
  )
9502
9475
  ] });
9503
9476
  }
9504
- var sizeMap11, typeStyles, floatKeyframes, DEFAULT_ASSET_URL10;
9477
+ var sizeMap12, typeStyles, floatKeyframes, DEFAULT_ASSET_URL10;
9505
9478
  var init_DamageNumber = __esm({
9506
9479
  "components/game/2d/atoms/DamageNumber.tsx"() {
9507
9480
  init_cn();
9508
- sizeMap11 = {
9481
+ init_Typography();
9482
+ init_GameIcon();
9483
+ sizeMap12 = {
9509
9484
  sm: "text-sm",
9510
9485
  md: "text-lg",
9511
9486
  lg: "text-2xl"
@@ -9539,7 +9514,7 @@ function DialogueBubble({
9539
9514
  className
9540
9515
  }) {
9541
9516
  return /* @__PURE__ */ jsxs(
9542
- "div",
9517
+ Box,
9543
9518
  {
9544
9519
  className: cn(
9545
9520
  "flex items-start gap-3 rounded-container bg-background/80 backdrop-blur-sm px-4 py-3 border border-border/10",
@@ -9547,17 +9522,10 @@ function DialogueBubble({
9547
9522
  className
9548
9523
  ),
9549
9524
  children: [
9550
- portrait && /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 w-12 h-12 rounded-full overflow-hidden border-2 border-warning/60", children: /* @__PURE__ */ jsx(
9551
- "img",
9552
- {
9553
- src: portrait?.url,
9554
- alt: speaker ?? "speaker",
9555
- className: "w-full h-full object-cover"
9556
- }
9557
- ) }),
9558
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 min-w-0", children: [
9559
- speaker && /* @__PURE__ */ jsx("span", { className: "text-sm font-bold text-warning", children: speaker }),
9560
- /* @__PURE__ */ jsx("span", { className: "text-sm text-foreground leading-relaxed", children: text })
9525
+ portrait && /* @__PURE__ */ jsx(Box, { className: "flex-shrink-0 w-12 h-12 rounded-full overflow-hidden border-2 border-warning/60", children: /* @__PURE__ */ jsx(GameIcon, { assetUrl: portrait, icon: "image", size: 48, alt: speaker ?? "speaker", className: "w-full h-full object-cover" }) }),
9526
+ /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-1 min-w-0", children: [
9527
+ speaker && /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-sm font-bold text-warning", children: speaker }),
9528
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-sm text-foreground leading-relaxed", children: text })
9561
9529
  ] })
9562
9530
  ]
9563
9531
  }
@@ -9567,6 +9535,9 @@ var DEFAULT_PORTRAIT;
9567
9535
  var init_DialogueBubble = __esm({
9568
9536
  "components/game/2d/atoms/DialogueBubble.tsx"() {
9569
9537
  init_cn();
9538
+ init_Box();
9539
+ init_Typography();
9540
+ init_GameIcon();
9570
9541
  DEFAULT_PORTRAIT = {
9571
9542
  url: "https://almadar-kflow-assets.web.app/shared/characters/archetypes/04_hero.png",
9572
9543
  role: "effect",
@@ -9588,11 +9559,11 @@ function ChoiceButton({
9588
9559
  }) {
9589
9560
  const eventBus = useEventBus();
9590
9561
  return /* @__PURE__ */ jsxs(
9591
- "button",
9562
+ Button,
9592
9563
  {
9593
- type: "button",
9564
+ variant: "ghost",
9594
9565
  disabled,
9595
- onClick: (e) => {
9566
+ onClick: () => {
9596
9567
  if (action) eventBus.emit(`UI:${action}`, {});
9597
9568
  onClick?.();
9598
9569
  },
@@ -9605,8 +9576,9 @@ function ChoiceButton({
9605
9576
  ),
9606
9577
  children: [
9607
9578
  index !== void 0 && /* @__PURE__ */ jsxs(
9608
- "span",
9579
+ Typography,
9609
9580
  {
9581
+ as: "span",
9610
9582
  className: cn(
9611
9583
  "flex-shrink-0 font-mono font-bold text-sm",
9612
9584
  selected ? "text-accent" : "text-muted-foreground"
@@ -9617,24 +9589,14 @@ function ChoiceButton({
9617
9589
  ]
9618
9590
  }
9619
9591
  ),
9620
- assetUrl ? /* @__PURE__ */ jsx(
9621
- "img",
9622
- {
9623
- src: assetUrl.url,
9624
- alt: "",
9625
- width: 16,
9626
- height: 16,
9627
- style: { imageRendering: "pixelated", objectFit: "contain" },
9628
- className: "flex-shrink-0"
9629
- }
9630
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0 text-sm", children: typeof icon === "string" ? (() => {
9592
+ assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 16, className: "flex-shrink-0" }) : icon ? /* @__PURE__ */ jsx(Box, { as: "span", className: "flex-shrink-0 text-sm", children: typeof icon === "string" ? (() => {
9631
9593
  const I = resolveIcon(icon);
9632
9594
  return I ? /* @__PURE__ */ jsx(I, { className: "w-4 h-4" }) : null;
9633
9595
  })() : /* @__PURE__ */ (() => {
9634
9596
  const I = icon;
9635
9597
  return /* @__PURE__ */ jsx(I, { className: "w-4 h-4" });
9636
9598
  })() }) : null,
9637
- /* @__PURE__ */ jsx("span", { className: "text-sm leading-snug", children: text })
9599
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-sm leading-snug", children: text })
9638
9600
  ]
9639
9601
  }
9640
9602
  );
@@ -9644,6 +9606,10 @@ var init_ChoiceButton = __esm({
9644
9606
  init_cn();
9645
9607
  init_Icon();
9646
9608
  init_useEventBus();
9609
+ init_Button();
9610
+ init_Box();
9611
+ init_Typography();
9612
+ init_GameIcon();
9647
9613
  ChoiceButton.displayName = "ChoiceButton";
9648
9614
  }
9649
9615
  });
@@ -9661,16 +9627,16 @@ function ActionButton({
9661
9627
  className
9662
9628
  }) {
9663
9629
  const eventBus = useEventBus();
9664
- const sizes = sizeMap12[size];
9630
+ const sizes = sizeMap13[size];
9665
9631
  const onCooldown = cooldown > 0;
9666
9632
  const isDisabled = disabled || onCooldown;
9667
9633
  const cooldownDeg = Math.round(cooldown * 360);
9668
9634
  return /* @__PURE__ */ jsxs(
9669
- "button",
9635
+ Button,
9670
9636
  {
9671
- type: "button",
9637
+ variant: variant === "danger" ? "danger" : variant === "secondary" ? "secondary" : "primary",
9672
9638
  disabled: isDisabled,
9673
- onClick: (e) => {
9639
+ onClick: () => {
9674
9640
  if (action) eventBus.emit(`UI:${action}`, {});
9675
9641
  onClick?.();
9676
9642
  },
@@ -9683,9 +9649,10 @@ function ActionButton({
9683
9649
  ),
9684
9650
  children: [
9685
9651
  onCooldown && /* @__PURE__ */ jsx(
9686
- "div",
9652
+ Box,
9687
9653
  {
9688
- className: "absolute inset-0 bg-foreground/40 pointer-events-none",
9654
+ position: "absolute",
9655
+ className: "inset-0 bg-foreground/40 pointer-events-none",
9689
9656
  style: {
9690
9657
  clipPath: `conic-gradient(from 0deg, transparent ${360 - cooldownDeg}deg, black ${360 - cooldownDeg}deg)`,
9691
9658
  WebkitClipPath: `conic-gradient(from 0deg, transparent ${360 - cooldownDeg}deg, black ${360 - cooldownDeg}deg)`,
@@ -9693,27 +9660,18 @@ function ActionButton({
9693
9660
  }
9694
9661
  }
9695
9662
  ),
9696
- assetUrl ? /* @__PURE__ */ jsx(
9697
- "img",
9698
- {
9699
- src: assetUrl.url,
9700
- alt: "",
9701
- width: 16,
9702
- height: 16,
9703
- style: { imageRendering: "pixelated", objectFit: "contain" },
9704
- className: cn("flex-shrink-0", sizes.icon)
9705
- }
9706
- ) : icon ? /* @__PURE__ */ jsx("span", { className: cn("flex-shrink-0", sizes.icon), children: typeof icon === "string" ? (() => {
9663
+ assetUrl ? /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 16, className: cn("flex-shrink-0", sizes.icon) }) : icon ? /* @__PURE__ */ jsx(Box, { as: "span", className: cn("flex-shrink-0", sizes.icon), children: typeof icon === "string" ? (() => {
9707
9664
  const I = resolveIcon(icon);
9708
9665
  return I ? /* @__PURE__ */ jsx(I, { className: "w-4 h-4" }) : null;
9709
9666
  })() : /* @__PURE__ */ (() => {
9710
9667
  const I = icon;
9711
9668
  return /* @__PURE__ */ jsx(I, { className: "w-4 h-4" });
9712
9669
  })() }) : null,
9713
- /* @__PURE__ */ jsx("span", { className: "relative z-10", children: label }),
9670
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "relative z-10", children: label }),
9714
9671
  hotkey && /* @__PURE__ */ jsx(
9715
- "span",
9672
+ Typography,
9716
9673
  {
9674
+ as: "span",
9717
9675
  className: cn(
9718
9676
  "absolute top-0.5 right-0.5 bg-foreground/30 text-primary-foreground rounded font-mono leading-tight",
9719
9677
  sizes.hotkey
@@ -9725,13 +9683,17 @@ function ActionButton({
9725
9683
  }
9726
9684
  );
9727
9685
  }
9728
- var sizeMap12, variantStyles8, DEFAULT_ASSET_URL11;
9686
+ var sizeMap13, variantStyles8, DEFAULT_ASSET_URL11;
9729
9687
  var init_ActionButton = __esm({
9730
9688
  "components/game/2d/atoms/ActionButton.tsx"() {
9731
9689
  init_cn();
9732
9690
  init_Icon();
9733
9691
  init_useEventBus();
9734
- sizeMap12 = {
9692
+ init_Button();
9693
+ init_Box();
9694
+ init_Typography();
9695
+ init_GameIcon();
9696
+ sizeMap13 = {
9735
9697
  sm: { button: "h-button-sm px-3 text-xs", hotkey: "text-[9px] px-1", icon: "text-xs" },
9736
9698
  md: { button: "h-button-md px-4 text-sm", hotkey: "text-xs px-1.5", icon: "text-sm" },
9737
9699
  lg: { button: "h-button-lg px-5 text-base", hotkey: "text-xs px-2", icon: "text-base" }
@@ -9833,10 +9795,12 @@ function MiniMap({
9833
9795
  return /* @__PURE__ */ jsxs(Fragment, { children: [
9834
9796
  /* @__PURE__ */ jsx("style", { children: `@keyframes minimap-blink{0%,49%{opacity:1}50%,100%{opacity:0}}` }),
9835
9797
  /* @__PURE__ */ jsxs(
9836
- "div",
9798
+ Box,
9837
9799
  {
9800
+ position: "relative",
9801
+ display: "inline-block",
9838
9802
  className: cn(
9839
- "relative inline-block border border-border/20 rounded-container",
9803
+ "border border-border/20 rounded-container",
9840
9804
  className
9841
9805
  ),
9842
9806
  children: [
@@ -9851,10 +9815,10 @@ function MiniMap({
9851
9815
  }
9852
9816
  ),
9853
9817
  playerLeft !== null && playerTop !== null && /* @__PURE__ */ jsx(
9854
- "div",
9818
+ Box,
9855
9819
  {
9820
+ position: "absolute",
9856
9821
  style: {
9857
- position: "absolute",
9858
9822
  left: playerLeft,
9859
9823
  top: playerTop,
9860
9824
  width: 3,
@@ -9875,6 +9839,7 @@ var init_MiniMap = __esm({
9875
9839
  "components/game/2d/atoms/MiniMap.tsx"() {
9876
9840
  "use client";
9877
9841
  init_cn();
9842
+ init_Box();
9878
9843
  DEFAULT_TILES = [
9879
9844
  { x: 10, y: 10, color: "#4ade80" },
9880
9845
  { x: 20, y: 15, color: "#4ade80" },
@@ -9892,38 +9857,6 @@ var init_MiniMap = __esm({
9892
9857
  MiniMap.displayName = "MiniMap";
9893
9858
  }
9894
9859
  });
9895
- function GameIcon({ assetUrl, icon, size = "md", alt, className }) {
9896
- const px = typeof size === "number" ? size : sizeMap13[size];
9897
- if (assetUrl?.url) {
9898
- return /* @__PURE__ */ jsx(
9899
- "img",
9900
- {
9901
- src: assetUrl.url,
9902
- alt: alt ?? assetUrl.category ?? "",
9903
- width: px,
9904
- height: px,
9905
- style: { imageRendering: "pixelated", objectFit: "contain", width: px, height: px },
9906
- className: cn("flex-shrink-0", className)
9907
- }
9908
- );
9909
- }
9910
- const I = typeof icon === "string" ? resolveIcon(icon) : icon;
9911
- return /* @__PURE__ */ jsx(I, { width: px, height: px, className: cn("flex-shrink-0", className) });
9912
- }
9913
- var sizeMap13;
9914
- var init_GameIcon = __esm({
9915
- "components/game/2d/atoms/GameIcon.tsx"() {
9916
- "use client";
9917
- init_cn();
9918
- init_Icon();
9919
- sizeMap13 = {
9920
- sm: 16,
9921
- md: 24,
9922
- lg: 32
9923
- };
9924
- GameIcon.displayName = "GameIcon";
9925
- }
9926
- });
9927
9860
  function ControlGrid({
9928
9861
  kind,
9929
9862
  buttons = DEFAULT_BUTTONS,
@@ -9984,22 +9917,22 @@ function ControlGrid({
9984
9917
  },
9985
9918
  d
9986
9919
  );
9987
- return /* @__PURE__ */ jsxs("div", { className: cn("inline-grid grid-cols-3", ds.gap, ds.container, className), children: [
9988
- /* @__PURE__ */ jsx("div", {}),
9920
+ return /* @__PURE__ */ jsxs(Box, { className: cn("inline-grid grid-cols-3", ds.gap, ds.container, className), children: [
9921
+ /* @__PURE__ */ jsx(Box, {}),
9989
9922
  dir("up"),
9990
- /* @__PURE__ */ jsx("div", {}),
9923
+ /* @__PURE__ */ jsx(Box, {}),
9991
9924
  dir("left"),
9992
- /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: "w-6 h-6 rounded-interactive bg-muted border-2 border-muted-foreground" }) }),
9925
+ /* @__PURE__ */ jsx(Box, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(Box, { className: "w-6 h-6 rounded-interactive bg-muted border-2 border-muted-foreground" }) }),
9993
9926
  dir("right"),
9994
- /* @__PURE__ */ jsx("div", {}),
9927
+ /* @__PURE__ */ jsx(Box, {}),
9995
9928
  dir("down"),
9996
- /* @__PURE__ */ jsx("div", {})
9929
+ /* @__PURE__ */ jsx(Box, {})
9997
9930
  ] });
9998
9931
  }
9999
9932
  if (layout === "diamond" && buttons.length === 4) {
10000
9933
  const [top, right, bottom, left] = buttons;
10001
- return /* @__PURE__ */ jsxs("div", { className: cn(layoutClass.diamond, className), children: [
10002
- /* @__PURE__ */ jsx("div", {}),
9934
+ return /* @__PURE__ */ jsxs(Box, { className: cn(layoutClass.diamond, className), children: [
9935
+ /* @__PURE__ */ jsx(Box, {}),
10003
9936
  /* @__PURE__ */ jsx(
10004
9937
  ControlButton,
10005
9938
  {
@@ -10014,7 +9947,7 @@ function ControlGrid({
10014
9947
  disabled
10015
9948
  }
10016
9949
  ),
10017
- /* @__PURE__ */ jsx("div", {}),
9950
+ /* @__PURE__ */ jsx(Box, {}),
10018
9951
  /* @__PURE__ */ jsx(
10019
9952
  ControlButton,
10020
9953
  {
@@ -10029,7 +9962,7 @@ function ControlGrid({
10029
9962
  disabled
10030
9963
  }
10031
9964
  ),
10032
- /* @__PURE__ */ jsx("div", {}),
9965
+ /* @__PURE__ */ jsx(Box, {}),
10033
9966
  /* @__PURE__ */ jsx(
10034
9967
  ControlButton,
10035
9968
  {
@@ -10044,7 +9977,7 @@ function ControlGrid({
10044
9977
  disabled
10045
9978
  }
10046
9979
  ),
10047
- /* @__PURE__ */ jsx("div", {}),
9980
+ /* @__PURE__ */ jsx(Box, {}),
10048
9981
  /* @__PURE__ */ jsx(
10049
9982
  ControlButton,
10050
9983
  {
@@ -10059,10 +9992,10 @@ function ControlGrid({
10059
9992
  disabled
10060
9993
  }
10061
9994
  ),
10062
- /* @__PURE__ */ jsx("div", {})
9995
+ /* @__PURE__ */ jsx(Box, {})
10063
9996
  ] });
10064
9997
  }
10065
- return /* @__PURE__ */ jsx("div", { className: cn(layoutClass[layout], className), children: buttons.map((button) => /* @__PURE__ */ jsx(
9998
+ return /* @__PURE__ */ jsx(Box, { className: cn(layoutClass[layout], className), children: buttons.map((button) => /* @__PURE__ */ jsx(
10066
9999
  ControlButton,
10067
10000
  {
10068
10001
  icon: button.icon,
@@ -10084,6 +10017,7 @@ var init_ControlGrid = __esm({
10084
10017
  "use client";
10085
10018
  init_cn();
10086
10019
  init_useEventBus();
10020
+ init_Box();
10087
10021
  init_ControlButton();
10088
10022
  sizeKey = { sm: "sm", md: "md", lg: "lg" };
10089
10023
  layoutClass = {
@@ -10128,7 +10062,7 @@ function StatBadge({
10128
10062
  const numValue = typeof value === "number" ? value : parseInt(String(value), 10) || 0;
10129
10063
  const resolvedAsset = iconUrl ?? assetUrl;
10130
10064
  return /* @__PURE__ */ jsxs(
10131
- "div",
10065
+ Box,
10132
10066
  {
10133
10067
  className: cn(
10134
10068
  "inline-flex items-center gap-2 rounded-container border backdrop-blur-sm",
@@ -10137,18 +10071,8 @@ function StatBadge({
10137
10071
  className
10138
10072
  ),
10139
10073
  children: [
10140
- resolvedAsset ? /* @__PURE__ */ jsx(
10141
- "img",
10142
- {
10143
- src: resolvedAsset.url,
10144
- alt: "",
10145
- width: 16,
10146
- height: 16,
10147
- style: { imageRendering: "pixelated", objectFit: "contain" },
10148
- className: "flex-shrink-0"
10149
- }
10150
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0 text-lg", children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, className: "w-4 h-4" }) : /* @__PURE__ */ jsx(Icon, { icon, className: "w-4 h-4" }) }) : null,
10151
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-medium", children: label }),
10074
+ resolvedAsset ? /* @__PURE__ */ jsx(GameIcon, { assetUrl: resolvedAsset, icon: "image", size: 16, className: "flex-shrink-0" }) : icon ? /* @__PURE__ */ jsx(Box, { as: "span", className: "flex-shrink-0 text-lg", children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, className: "w-4 h-4" }) : /* @__PURE__ */ jsx(Icon, { icon, className: "w-4 h-4" }) }) : null,
10075
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground font-medium", children: label }),
10152
10076
  format === "hearts" && max && /* @__PURE__ */ jsx(
10153
10077
  HealthBar,
10154
10078
  {
@@ -10174,7 +10098,7 @@ function StatBadge({
10174
10098
  size: size === "lg" ? "md" : "sm"
10175
10099
  }
10176
10100
  ),
10177
- format === "text" && /* @__PURE__ */ jsx("span", { className: "font-bold text-foreground", children: value })
10101
+ format === "text" && /* @__PURE__ */ jsx(Typography, { as: "span", className: "font-bold text-foreground", children: value })
10178
10102
  ]
10179
10103
  }
10180
10104
  );
@@ -10184,6 +10108,9 @@ var init_StatBadge = __esm({
10184
10108
  "components/game/2d/molecules/StatBadge.tsx"() {
10185
10109
  init_cn();
10186
10110
  init_Icon();
10111
+ init_Box();
10112
+ init_Typography();
10113
+ init_GameIcon();
10187
10114
  init_HealthBar();
10188
10115
  init_ScoreDisplay();
10189
10116
  sizeMap14 = {
@@ -10361,9 +10288,9 @@ function GameHud({
10361
10288
  if (position === "corners") {
10362
10289
  const leftStats = stats.slice(0, Math.ceil(stats.length / 2));
10363
10290
  const rightStats = stats.slice(Math.ceil(stats.length / 2));
10364
- return /* @__PURE__ */ jsxs("div", { className: cn("relative", positionMap[position], className), children: [
10365
- /* @__PURE__ */ jsx("div", { className: "absolute top-4 left-4 flex flex-col gap-2 pointer-events-auto", children: leftStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) }),
10366
- /* @__PURE__ */ jsx("div", { className: "absolute top-4 right-4 flex flex-col gap-2 items-end pointer-events-auto", children: rightStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) })
10291
+ return /* @__PURE__ */ jsxs(Box, { position: "relative", className: cn(positionMap[position], className), children: [
10292
+ /* @__PURE__ */ jsx(Box, { position: "absolute", className: "top-4 left-4 flex flex-col gap-2 pointer-events-auto", children: leftStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) }),
10293
+ /* @__PURE__ */ jsx(Box, { position: "absolute", className: "top-4 right-4 flex flex-col gap-2 items-end pointer-events-auto", children: rightStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) })
10367
10294
  ] });
10368
10295
  }
10369
10296
  if (position === "top" || position === "bottom") {
@@ -10372,7 +10299,7 @@ function GameHud({
10372
10299
  const rightStats = stats.slice(mid);
10373
10300
  const isTop = position === "top";
10374
10301
  return /* @__PURE__ */ jsxs(
10375
- "div",
10302
+ Box,
10376
10303
  {
10377
10304
  className: cn(
10378
10305
  "flex items-center justify-between w-full",
@@ -10382,17 +10309,18 @@ function GameHud({
10382
10309
  className
10383
10310
  ),
10384
10311
  children: [
10385
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-3 flex-shrink-0", children: leftStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) }),
10386
- rightStats.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-3 flex-shrink-0", children: rightStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) })
10312
+ /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-3 flex-shrink-0", children: leftStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) }),
10313
+ rightStats.length > 0 && /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-3 flex-shrink-0", children: rightStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) })
10387
10314
  ]
10388
10315
  }
10389
10316
  );
10390
10317
  }
10391
10318
  return /* @__PURE__ */ jsx(
10392
- "div",
10319
+ Box,
10393
10320
  {
10321
+ position: "relative",
10394
10322
  className: cn(
10395
- "relative z-10 flex items-center gap-4 px-4 py-2",
10323
+ "z-10 flex items-center gap-4 px-4 py-2",
10396
10324
  transparent ? "bg-black/30 backdrop-blur-sm" : "bg-surface/90 backdrop-blur-sm",
10397
10325
  className
10398
10326
  ),
@@ -10404,6 +10332,7 @@ var positionMap, DEFAULT_HUD_STATS;
10404
10332
  var init_GameHud = __esm({
10405
10333
  "components/game/2d/molecules/GameHud.tsx"() {
10406
10334
  init_cn();
10335
+ init_Box();
10407
10336
  init_StatBadge();
10408
10337
  positionMap = {
10409
10338
  corners: "inset-0 pointer-events-none"
@@ -10444,7 +10373,7 @@ function GameMenu({
10444
10373
  [eventBus, onSelect]
10445
10374
  );
10446
10375
  return /* @__PURE__ */ jsxs(
10447
- "div",
10376
+ Box,
10448
10377
  {
10449
10378
  className: cn(
10450
10379
  "min-h-screen w-full flex flex-col items-center justify-center p-8",
@@ -10454,18 +10383,12 @@ function GameMenu({
10454
10383
  background: background ?? "linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f0e17 100%)"
10455
10384
  },
10456
10385
  children: [
10457
- /* @__PURE__ */ jsxs("div", { className: "text-center mb-12 animate-fade-in", children: [
10458
- logo && /* @__PURE__ */ jsx(
10459
- "img",
10460
- {
10461
- src: logo.url,
10462
- alt: title,
10463
- className: "h-24 w-auto mx-auto mb-6 drop-shadow-2xl"
10464
- }
10465
- ),
10386
+ /* @__PURE__ */ jsxs(Box, { className: "text-center mb-12 animate-fade-in", children: [
10387
+ logo && /* @__PURE__ */ jsx(GameIcon, { assetUrl: logo, icon: "image", size: 96, alt: title, className: "h-24 w-auto mx-auto mb-6 drop-shadow-2xl" }),
10466
10388
  /* @__PURE__ */ jsx(
10467
- "h1",
10389
+ Typography,
10468
10390
  {
10391
+ variant: "h1",
10469
10392
  className: "text-5xl md:text-7xl font-bold text-[var(--color-foreground)] tracking-tight",
10470
10393
  style: {
10471
10394
  textShadow: "0 4px 12px rgba(0,0,0,0.5)"
@@ -10473,9 +10396,9 @@ function GameMenu({
10473
10396
  children: title
10474
10397
  }
10475
10398
  ),
10476
- subtitle && /* @__PURE__ */ jsx("p", { className: "mt-2 text-lg text-muted-foreground tracking-widest uppercase", children: subtitle })
10399
+ subtitle && /* @__PURE__ */ jsx(Typography, { variant: "body", className: "mt-2 text-lg text-muted-foreground tracking-widest uppercase", children: subtitle })
10477
10400
  ] }),
10478
- /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 w-full max-w-md", children: resolvedOptions.map((option, index) => /* @__PURE__ */ jsx(
10401
+ /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-4 w-full max-w-md", children: resolvedOptions.map((option, index) => /* @__PURE__ */ jsx(
10479
10402
  ChoiceButton,
10480
10403
  {
10481
10404
  text: option.label,
@@ -10486,9 +10409,9 @@ function GameMenu({
10486
10409
  },
10487
10410
  index
10488
10411
  )) }),
10489
- /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 pointer-events-none overflow-hidden", children: [
10490
- /* @__PURE__ */ jsx("div", { className: "absolute top-1/4 left-1/4 w-64 h-64 bg-info/10 rounded-container blur-3xl" }),
10491
- /* @__PURE__ */ jsx("div", { className: "absolute bottom-1/4 right-1/4 w-96 h-96 bg-accent/10 rounded-container blur-3xl" })
10412
+ /* @__PURE__ */ jsxs(Box, { position: "absolute", className: "inset-0 pointer-events-none overflow-hidden", children: [
10413
+ /* @__PURE__ */ jsx(Box, { position: "absolute", className: "top-1/4 left-1/4 w-64 h-64 bg-info/10 rounded-container blur-3xl" }),
10414
+ /* @__PURE__ */ jsx(Box, { position: "absolute", className: "bottom-1/4 right-1/4 w-96 h-96 bg-accent/10 rounded-container blur-3xl" })
10492
10415
  ] })
10493
10416
  ]
10494
10417
  }
@@ -10500,6 +10423,9 @@ var init_GameMenu = __esm({
10500
10423
  "use client";
10501
10424
  init_cn();
10502
10425
  init_useEventBus();
10426
+ init_Box();
10427
+ init_Typography();
10428
+ init_GameIcon();
10503
10429
  init_ChoiceButton();
10504
10430
  DEFAULT_MENU_OPTIONS = [
10505
10431
  { label: "New Game", event: "NEW_GAME", variant: "primary" },
@@ -11919,10 +11845,11 @@ function Canvas2D({
11919
11845
  }
11920
11846
  }
11921
11847
  ),
11922
- process.env.NODE_ENV !== "production" && /* @__PURE__ */ jsxs("div", { "data-game-actions": "", className: "sr-only", "aria-hidden": "true", children: [
11848
+ process.env.NODE_ENV !== "production" && /* @__PURE__ */ jsxs(Box, { "data-game-actions": "", className: "sr-only", "aria-hidden": "true", children: [
11923
11849
  tileClickEvent && /* @__PURE__ */ jsx(
11924
- "button",
11850
+ Button,
11925
11851
  {
11852
+ variant: "ghost",
11926
11853
  "data-event": tileClickEvent,
11927
11854
  "data-x": "0",
11928
11855
  "data-y": "0",
@@ -11931,8 +11858,9 @@ function Canvas2D({
11931
11858
  }
11932
11859
  ),
11933
11860
  unitClickEvent && units && units.length > 0 && /* @__PURE__ */ jsx(
11934
- "button",
11861
+ Button,
11935
11862
  {
11863
+ variant: "ghost",
11936
11864
  "data-event": unitClickEvent,
11937
11865
  "data-unit-id": units[0].id,
11938
11866
  onClick: () => eventBus.emit(`UI:${unitClickEvent}`, { unitId: units[0].id }),
@@ -11941,15 +11869,17 @@ function Canvas2D({
11941
11869
  )
11942
11870
  ] }),
11943
11871
  unitOverlays.map(({ unit, screenX, screenY }) => /* @__PURE__ */ jsxs(
11944
- "div",
11872
+ Box,
11945
11873
  {
11946
- className: "absolute pointer-events-none",
11874
+ position: "absolute",
11875
+ className: "pointer-events-none",
11947
11876
  style: { left: Math.round(screenX), top: Math.round(screenY), transform: "translate(-50%, 0)", zIndex: 5 },
11948
11877
  children: [
11949
11878
  unit.name && /* @__PURE__ */ jsx(
11950
- "div",
11879
+ Typography,
11951
11880
  {
11952
- className: "text-white text-xs font-bold px-1.5 py-0.5 rounded mb-0.5 whitespace-nowrap",
11881
+ as: "span",
11882
+ className: "text-white text-xs font-bold px-1.5 py-0.5 rounded mb-0.5 whitespace-nowrap block",
11953
11883
  style: { background: unit.team === "player" ? "rgba(59,130,246,0.9)" : unit.team === "enemy" ? "rgba(239,68,68,0.9)" : "rgba(107,114,128,0.9)" },
11954
11884
  children: unit.name
11955
11885
  }
@@ -11959,7 +11889,7 @@ function Canvas2D({
11959
11889
  },
11960
11890
  unit.id
11961
11891
  )),
11962
- showMinimap && /* @__PURE__ */ jsx("div", { className: "absolute bottom-2 right-2 pointer-events-none", style: { zIndex: 10 }, children: /* @__PURE__ */ jsx(
11892
+ showMinimap && /* @__PURE__ */ jsx(Box, { position: "absolute", className: "bottom-2 right-2 pointer-events-none", style: { zIndex: 10 }, children: /* @__PURE__ */ jsx(
11963
11893
  MiniMap,
11964
11894
  {
11965
11895
  tiles: miniMapTiles,
@@ -11981,6 +11911,7 @@ var init_Canvas2D = __esm({
11981
11911
  init_cn();
11982
11912
  init_useEventBus();
11983
11913
  init_Box();
11914
+ init_Button();
11984
11915
  init_Stack();
11985
11916
  init_Icon();
11986
11917
  init_Typography();
@@ -12312,7 +12243,7 @@ function GameAudioToggle({
12312
12243
  onClick: handleToggle,
12313
12244
  className: cn("text-lg leading-none px-2", className),
12314
12245
  "aria-pressed": muted,
12315
- children: activeAsset ? /* @__PURE__ */ jsx("img", { src: activeAsset.url, alt: muted ? "Muted" : "Sound on", className: "w-5 h-5 object-contain" }) : muted ? "\u{1F507}" : "\u{1F50A}"
12246
+ children: activeAsset ? /* @__PURE__ */ 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}"
12316
12247
  }
12317
12248
  );
12318
12249
  }
@@ -12322,6 +12253,7 @@ var init_GameAudioToggle = __esm({
12322
12253
  init_atoms();
12323
12254
  init_cn();
12324
12255
  init_GameAudioProvider();
12256
+ init_GameIcon();
12325
12257
  GameAudioToggle.displayName = "GameAudioToggle";
12326
12258
  }
12327
12259
  });