@almadar/ui 5.80.0 → 5.82.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.
@@ -2122,6 +2122,7 @@ var init_Button = __esm({
2122
2122
  rightIcon,
2123
2123
  icon: iconProp,
2124
2124
  iconRight: iconRightProp,
2125
+ iconAsset,
2125
2126
  action,
2126
2127
  actionPayload,
2127
2128
  label,
@@ -2133,7 +2134,8 @@ var init_Button = __esm({
2133
2134
  const eventBus = useEventBus();
2134
2135
  const leftIconValue = leftIcon || iconProp;
2135
2136
  const rightIconValue = rightIcon || iconRightProp;
2136
- const resolvedLeftIcon = resolveIconProp(leftIconValue, iconSizeStyles[size]);
2137
+ const px = size === "sm" ? 16 : size === "lg" ? 20 : 16;
2138
+ const resolvedLeftIcon = iconAsset?.url ? /* @__PURE__ */ jsx("img", { src: iconAsset.url, alt: iconAsset.name ?? iconAsset.category ?? "", width: px, height: px, style: { imageRendering: "pixelated", objectFit: "contain", width: px, height: px }, className: "flex-shrink-0" }) : resolveIconProp(leftIconValue, iconSizeStyles[size]);
2137
2139
  const resolvedRightIcon = resolveIconProp(rightIconValue, iconSizeStyles[size]);
2138
2140
  const handleClick = (e) => {
2139
2141
  if (action) {
@@ -2887,13 +2889,14 @@ var init_Badge = __esm({
2887
2889
  lg: "px-3 py-1.5 text-base"
2888
2890
  };
2889
2891
  Badge = React79__default.forwardRef(
2890
- ({ className, variant = "default", size = "sm", amount, label, icon, children, onRemove, removeLabel, ...props }, ref) => {
2892
+ ({ className, variant = "default", size = "sm", amount, label, icon, iconAsset, children, onRemove, removeLabel, ...props }, ref) => {
2891
2893
  const iconSizes3 = {
2892
2894
  sm: "h-icon-default w-icon-default",
2893
2895
  md: "h-icon-default w-icon-default",
2894
2896
  lg: "h-icon-default w-icon-default"
2895
2897
  };
2896
- const resolvedIcon = typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, className: iconSizes3[size] }) : icon ? /* @__PURE__ */ jsx(Icon, { icon, className: iconSizes3[size] }) : null;
2898
+ const iconPx = size === "lg" ? 20 : 16;
2899
+ const resolvedIcon = iconAsset?.url ? /* @__PURE__ */ jsx("img", { src: iconAsset.url, alt: iconAsset.name ?? iconAsset.category ?? "", width: iconPx, height: iconPx, style: { imageRendering: "pixelated", objectFit: "contain", width: iconPx, height: iconPx }, className: "flex-shrink-0" }) : typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, className: iconSizes3[size] }) : icon ? /* @__PURE__ */ jsx(Icon, { icon, className: iconSizes3[size] }) : null;
2897
2900
  return /* @__PURE__ */ jsxs(
2898
2901
  "span",
2899
2902
  {
@@ -7926,6 +7929,38 @@ var init_Accordion = __esm({
7926
7929
  Accordion.displayName = "Accordion";
7927
7930
  }
7928
7931
  });
7932
+ function GameIcon({ assetUrl, icon, size = "md", alt, className }) {
7933
+ const px = typeof size === "number" ? size : sizeMap[size];
7934
+ if (assetUrl?.url) {
7935
+ return /* @__PURE__ */ jsx(
7936
+ "img",
7937
+ {
7938
+ src: assetUrl.url,
7939
+ alt: alt ?? assetUrl.category ?? "",
7940
+ width: px,
7941
+ height: px,
7942
+ style: { imageRendering: "pixelated", objectFit: "contain", width: px, height: px },
7943
+ className: cn("flex-shrink-0", className)
7944
+ }
7945
+ );
7946
+ }
7947
+ const I = typeof icon === "string" ? resolveIcon(icon) : icon;
7948
+ return /* @__PURE__ */ jsx(I, { width: px, height: px, className: cn("flex-shrink-0", className) });
7949
+ }
7950
+ var sizeMap;
7951
+ var init_GameIcon = __esm({
7952
+ "components/game/2d/atoms/GameIcon.tsx"() {
7953
+ "use client";
7954
+ init_cn();
7955
+ init_Icon();
7956
+ sizeMap = {
7957
+ sm: 16,
7958
+ md: 24,
7959
+ lg: 32
7960
+ };
7961
+ GameIcon.displayName = "GameIcon";
7962
+ }
7963
+ });
7929
7964
  function ActionButton({
7930
7965
  assetUrl = DEFAULT_ASSET_URL,
7931
7966
  label = "Attack",
@@ -7940,16 +7975,16 @@ function ActionButton({
7940
7975
  className
7941
7976
  }) {
7942
7977
  const eventBus = useEventBus();
7943
- const sizes = sizeMap[size];
7978
+ const sizes = sizeMap2[size];
7944
7979
  const onCooldown = cooldown > 0;
7945
7980
  const isDisabled = disabled || onCooldown;
7946
7981
  const cooldownDeg = Math.round(cooldown * 360);
7947
7982
  return /* @__PURE__ */ jsxs(
7948
- "button",
7983
+ Button,
7949
7984
  {
7950
- type: "button",
7985
+ variant: variant === "danger" ? "danger" : variant === "secondary" ? "secondary" : "primary",
7951
7986
  disabled: isDisabled,
7952
- onClick: (e) => {
7987
+ onClick: () => {
7953
7988
  if (action) eventBus.emit(`UI:${action}`, {});
7954
7989
  onClick?.();
7955
7990
  },
@@ -7962,9 +7997,10 @@ function ActionButton({
7962
7997
  ),
7963
7998
  children: [
7964
7999
  onCooldown && /* @__PURE__ */ jsx(
7965
- "div",
8000
+ Box,
7966
8001
  {
7967
- className: "absolute inset-0 bg-foreground/40 pointer-events-none",
8002
+ position: "absolute",
8003
+ className: "inset-0 bg-foreground/40 pointer-events-none",
7968
8004
  style: {
7969
8005
  clipPath: `conic-gradient(from 0deg, transparent ${360 - cooldownDeg}deg, black ${360 - cooldownDeg}deg)`,
7970
8006
  WebkitClipPath: `conic-gradient(from 0deg, transparent ${360 - cooldownDeg}deg, black ${360 - cooldownDeg}deg)`,
@@ -7972,27 +8008,18 @@ function ActionButton({
7972
8008
  }
7973
8009
  }
7974
8010
  ),
7975
- assetUrl ? /* @__PURE__ */ jsx(
7976
- "img",
7977
- {
7978
- src: assetUrl.url,
7979
- alt: "",
7980
- width: 16,
7981
- height: 16,
7982
- style: { imageRendering: "pixelated", objectFit: "contain" },
7983
- className: cn("flex-shrink-0", sizes.icon)
7984
- }
7985
- ) : icon ? /* @__PURE__ */ jsx("span", { className: cn("flex-shrink-0", sizes.icon), children: typeof icon === "string" ? (() => {
8011
+ 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" ? (() => {
7986
8012
  const I = resolveIcon(icon);
7987
8013
  return I ? /* @__PURE__ */ jsx(I, { className: "w-4 h-4" }) : null;
7988
8014
  })() : /* @__PURE__ */ (() => {
7989
8015
  const I = icon;
7990
8016
  return /* @__PURE__ */ jsx(I, { className: "w-4 h-4" });
7991
8017
  })() }) : null,
7992
- /* @__PURE__ */ jsx("span", { className: "relative z-10", children: label }),
8018
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "relative z-10", children: label }),
7993
8019
  hotkey && /* @__PURE__ */ jsx(
7994
- "span",
8020
+ Typography,
7995
8021
  {
8022
+ as: "span",
7996
8023
  className: cn(
7997
8024
  "absolute top-0.5 right-0.5 bg-foreground/30 text-primary-foreground rounded font-mono leading-tight",
7998
8025
  sizes.hotkey
@@ -8004,13 +8031,17 @@ function ActionButton({
8004
8031
  }
8005
8032
  );
8006
8033
  }
8007
- var sizeMap, variantStyles7, DEFAULT_ASSET_URL;
8034
+ var sizeMap2, variantStyles7, DEFAULT_ASSET_URL;
8008
8035
  var init_ActionButton = __esm({
8009
8036
  "components/game/2d/atoms/ActionButton.tsx"() {
8010
8037
  init_cn();
8011
8038
  init_Icon();
8012
8039
  init_useEventBus();
8013
- sizeMap = {
8040
+ init_Button();
8041
+ init_Box();
8042
+ init_Typography();
8043
+ init_GameIcon();
8044
+ sizeMap2 = {
8014
8045
  sm: { button: "h-button-sm px-3 text-xs", hotkey: "text-[9px] px-1", icon: "text-xs" },
8015
8046
  md: { button: "h-button-md px-4 text-sm", hotkey: "text-xs px-1.5", icon: "text-sm" },
8016
8047
  lg: { button: "h-button-lg px-5 text-base", hotkey: "text-xs px-2", icon: "text-base" }
@@ -8743,10 +8774,12 @@ function MiniMap({
8743
8774
  return /* @__PURE__ */ jsxs(Fragment, { children: [
8744
8775
  /* @__PURE__ */ jsx("style", { children: `@keyframes minimap-blink{0%,49%{opacity:1}50%,100%{opacity:0}}` }),
8745
8776
  /* @__PURE__ */ jsxs(
8746
- "div",
8777
+ Box,
8747
8778
  {
8779
+ position: "relative",
8780
+ display: "inline-block",
8748
8781
  className: cn(
8749
- "relative inline-block border border-border/20 rounded-container",
8782
+ "border border-border/20 rounded-container",
8750
8783
  className
8751
8784
  ),
8752
8785
  children: [
@@ -8761,10 +8794,10 @@ function MiniMap({
8761
8794
  }
8762
8795
  ),
8763
8796
  playerLeft !== null && playerTop !== null && /* @__PURE__ */ jsx(
8764
- "div",
8797
+ Box,
8765
8798
  {
8799
+ position: "absolute",
8766
8800
  style: {
8767
- position: "absolute",
8768
8801
  left: playerLeft,
8769
8802
  top: playerTop,
8770
8803
  width: 3,
@@ -8785,6 +8818,7 @@ var init_MiniMap = __esm({
8785
8818
  "components/game/2d/atoms/MiniMap.tsx"() {
8786
8819
  "use client";
8787
8820
  init_cn();
8821
+ init_Box();
8788
8822
  DEFAULT_TILES = [
8789
8823
  { x: 10, y: 10, color: "#4ade80" },
8790
8824
  { x: 20, y: 15, color: "#4ade80" },
@@ -8815,12 +8849,13 @@ function HealthBar({
8815
8849
  frameAsset,
8816
8850
  fillAsset
8817
8851
  }) {
8818
- const sizes = sizeMap2[size];
8852
+ const sizes = sizeMap3[size];
8819
8853
  const percentage = max > 0 ? Math.max(0, Math.min(100, current / max * 100)) : 0;
8820
8854
  if (format === "hearts") {
8821
- return /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-1", className), children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsx(
8822
- "span",
8855
+ return /* @__PURE__ */ jsx(Box, { className: cn("flex items-center gap-1", className), children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsx(
8856
+ Box,
8823
8857
  {
8858
+ as: "span",
8824
8859
  className: cn(animated && "transition-transform hover:scale-110"),
8825
8860
  children: heartIcon(i < current, sizes.heart)
8826
8861
  },
@@ -8829,10 +8864,12 @@ function HealthBar({
8829
8864
  }
8830
8865
  if (format === "bar") {
8831
8866
  return /* @__PURE__ */ jsx(
8832
- "div",
8867
+ Box,
8833
8868
  {
8869
+ position: "relative",
8870
+ overflow: "hidden",
8834
8871
  className: cn(
8835
- "relative overflow-hidden rounded-full",
8872
+ "rounded-full",
8836
8873
  !frameAsset && "bg-muted",
8837
8874
  sizes.bar,
8838
8875
  "w-24",
@@ -8840,10 +8877,11 @@ function HealthBar({
8840
8877
  ),
8841
8878
  style: frameAsset ? { backgroundImage: `url(${frameAsset.url})`, backgroundSize: "100% 100%" } : void 0,
8842
8879
  children: /* @__PURE__ */ jsx(
8843
- "div",
8880
+ Box,
8844
8881
  {
8882
+ position: "absolute",
8845
8883
  className: cn(
8846
- "absolute inset-y-0 left-0 rounded-full",
8884
+ "inset-y-0 left-0 rounded-full",
8847
8885
  !fillAsset && (percentage > 66 ? "bg-success" : percentage > 33 ? "bg-warning" : "bg-error"),
8848
8886
  animated && "transition-all duration-300"
8849
8887
  ),
@@ -8857,10 +8895,11 @@ function HealthBar({
8857
8895
  );
8858
8896
  }
8859
8897
  if (format === "progress") {
8860
- return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", className), children: [
8898
+ return /* @__PURE__ */ jsxs(Box, { className: cn("flex items-center gap-2", className), children: [
8861
8899
  level != null && /* @__PURE__ */ jsxs(
8862
- "span",
8900
+ Typography,
8863
8901
  {
8902
+ as: "span",
8864
8903
  className: cn(
8865
8904
  "flex-shrink-0 rounded-interactive font-bold",
8866
8905
  "bg-accent text-accent-foreground border border-accent",
@@ -8872,21 +8911,23 @@ function HealthBar({
8872
8911
  ]
8873
8912
  }
8874
8913
  ),
8875
- /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col gap-0.5", children: [
8914
+ /* @__PURE__ */ jsxs(Box, { className: "flex-1 flex flex-col gap-0.5", children: [
8876
8915
  /* @__PURE__ */ jsx(
8877
- "div",
8916
+ Box,
8878
8917
  {
8918
+ position: "relative",
8879
8919
  className: cn(
8880
- "relative w-full overflow-hidden rounded-full",
8920
+ "w-full overflow-hidden rounded-full",
8881
8921
  !frameAsset && "bg-muted border border-muted",
8882
8922
  sizes.bar
8883
8923
  ),
8884
8924
  style: frameAsset ? { backgroundImage: `url(${frameAsset.url})`, backgroundSize: "100% 100%" } : void 0,
8885
8925
  children: /* @__PURE__ */ jsx(
8886
- "div",
8926
+ Box,
8887
8927
  {
8928
+ position: "absolute",
8888
8929
  className: cn(
8889
- "absolute inset-y-0 left-0 rounded-full",
8930
+ "inset-y-0 left-0 rounded-full",
8890
8931
  !fillAsset && "bg-gradient-to-r from-accent to-info",
8891
8932
  animated && "transition-all duration-500 ease-out"
8892
8933
  ),
@@ -8898,7 +8939,7 @@ function HealthBar({
8898
8939
  )
8899
8940
  }
8900
8941
  ),
8901
- showLabel && /* @__PURE__ */ jsxs("span", { className: cn("text-foreground/70 tabular-nums", sizes.label), children: [
8942
+ showLabel && /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("text-foreground/70 tabular-nums", sizes.label), children: [
8902
8943
  current,
8903
8944
  " / ",
8904
8945
  max,
@@ -8907,16 +8948,18 @@ function HealthBar({
8907
8948
  ] })
8908
8949
  ] });
8909
8950
  }
8910
- return /* @__PURE__ */ jsxs("span", { className: cn("font-mono font-bold", sizes.text, className), children: [
8951
+ return /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("font-mono font-bold", sizes.text, className), children: [
8911
8952
  current,
8912
8953
  "/",
8913
8954
  max
8914
8955
  ] });
8915
8956
  }
8916
- var heartIcon, sizeMap2;
8957
+ var heartIcon, sizeMap3;
8917
8958
  var init_HealthBar = __esm({
8918
8959
  "components/game/2d/atoms/HealthBar.tsx"() {
8919
8960
  init_cn();
8961
+ init_Box();
8962
+ init_Typography();
8920
8963
  heartIcon = (filled, size) => /* @__PURE__ */ jsx(
8921
8964
  "svg",
8922
8965
  {
@@ -8928,7 +8971,7 @@ var init_HealthBar = __esm({
8928
8971
  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" })
8929
8972
  }
8930
8973
  );
8931
- sizeMap2 = {
8974
+ sizeMap3 = {
8932
8975
  sm: { heart: "w-4 h-4", bar: "h-2", text: "text-sm", label: "text-xs", badge: "text-xs px-1.5 py-0.5" },
8933
8976
  md: { heart: "w-6 h-6", bar: "h-3", text: "text-base", label: "text-xs", badge: "text-xs px-2 py-0.5" },
8934
8977
  lg: { heart: "w-8 h-8", bar: "h-4", text: "text-lg", label: "text-sm", badge: "text-sm px-2.5 py-1" }
@@ -10716,10 +10759,11 @@ function Canvas2D({
10716
10759
  }
10717
10760
  }
10718
10761
  ),
10719
- process.env.NODE_ENV !== "production" && /* @__PURE__ */ jsxs("div", { "data-game-actions": "", className: "sr-only", "aria-hidden": "true", children: [
10762
+ process.env.NODE_ENV !== "production" && /* @__PURE__ */ jsxs(Box, { "data-game-actions": "", className: "sr-only", "aria-hidden": "true", children: [
10720
10763
  tileClickEvent && /* @__PURE__ */ jsx(
10721
- "button",
10764
+ Button,
10722
10765
  {
10766
+ variant: "ghost",
10723
10767
  "data-event": tileClickEvent,
10724
10768
  "data-x": "0",
10725
10769
  "data-y": "0",
@@ -10728,8 +10772,9 @@ function Canvas2D({
10728
10772
  }
10729
10773
  ),
10730
10774
  unitClickEvent && units && units.length > 0 && /* @__PURE__ */ jsx(
10731
- "button",
10775
+ Button,
10732
10776
  {
10777
+ variant: "ghost",
10733
10778
  "data-event": unitClickEvent,
10734
10779
  "data-unit-id": units[0].id,
10735
10780
  onClick: () => eventBus.emit(`UI:${unitClickEvent}`, { unitId: units[0].id }),
@@ -10738,15 +10783,17 @@ function Canvas2D({
10738
10783
  )
10739
10784
  ] }),
10740
10785
  unitOverlays.map(({ unit, screenX, screenY }) => /* @__PURE__ */ jsxs(
10741
- "div",
10786
+ Box,
10742
10787
  {
10743
- className: "absolute pointer-events-none",
10788
+ position: "absolute",
10789
+ className: "pointer-events-none",
10744
10790
  style: { left: Math.round(screenX), top: Math.round(screenY), transform: "translate(-50%, 0)", zIndex: 5 },
10745
10791
  children: [
10746
10792
  unit.name && /* @__PURE__ */ jsx(
10747
- "div",
10793
+ Typography,
10748
10794
  {
10749
- className: "text-white text-xs font-bold px-1.5 py-0.5 rounded mb-0.5 whitespace-nowrap",
10795
+ as: "span",
10796
+ className: "text-white text-xs font-bold px-1.5 py-0.5 rounded mb-0.5 whitespace-nowrap block",
10750
10797
  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)" },
10751
10798
  children: unit.name
10752
10799
  }
@@ -10756,7 +10803,7 @@ function Canvas2D({
10756
10803
  },
10757
10804
  unit.id
10758
10805
  )),
10759
- showMinimap && /* @__PURE__ */ jsx("div", { className: "absolute bottom-2 right-2 pointer-events-none", style: { zIndex: 10 }, children: /* @__PURE__ */ jsx(
10806
+ showMinimap && /* @__PURE__ */ jsx(Box, { position: "absolute", className: "bottom-2 right-2 pointer-events-none", style: { zIndex: 10 }, children: /* @__PURE__ */ jsx(
10760
10807
  MiniMap,
10761
10808
  {
10762
10809
  tiles: miniMapTiles,
@@ -10778,6 +10825,7 @@ var init_Canvas2D = __esm({
10778
10825
  init_cn();
10779
10826
  init_useEventBus();
10780
10827
  init_Box();
10828
+ init_Button();
10781
10829
  init_Stack();
10782
10830
  init_Icon();
10783
10831
  init_Typography();
@@ -12808,7 +12856,7 @@ var init_Tabs = __esm({
12808
12856
  isActive ? variant === "pills" ? "text-primary-foreground font-bold" : "text-foreground font-bold" : "text-muted-foreground hover:text-foreground"
12809
12857
  ),
12810
12858
  children: [
12811
- item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: item.icon, size: "sm" }) : /* @__PURE__ */ jsx(Icon, { icon: item.icon, size: "sm" })),
12859
+ item.iconAsset?.url ? /* @__PURE__ */ jsx("img", { src: item.iconAsset.url, alt: item.iconAsset.name ?? item.iconAsset.category ?? "", width: 16, height: 16, style: { imageRendering: "pixelated", objectFit: "contain", width: 16, height: 16 }, className: "flex-shrink-0" }) : item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: item.icon, size: "sm" }) : /* @__PURE__ */ jsx(Icon, { icon: item.icon, size: "sm" })),
12812
12860
  /* @__PURE__ */ jsx(Typography, { variant: "small", weight: isActive ? "semibold" : "normal", className: "!text-inherit", children: item.label }),
12813
12861
  item.badge !== void 0 && /* @__PURE__ */ jsx(Badge, { variant: "default", size: "sm", children: item.badge })
12814
12862
  ]
@@ -17155,38 +17203,6 @@ var init_Breadcrumb = __esm({
17155
17203
  Breadcrumb.displayName = "Breadcrumb";
17156
17204
  }
17157
17205
  });
17158
- function GameIcon({ assetUrl, icon, size = "md", alt, className }) {
17159
- const px = typeof size === "number" ? size : sizeMap3[size];
17160
- if (assetUrl?.url) {
17161
- return /* @__PURE__ */ jsx(
17162
- "img",
17163
- {
17164
- src: assetUrl.url,
17165
- alt: alt ?? assetUrl.category ?? "",
17166
- width: px,
17167
- height: px,
17168
- style: { imageRendering: "pixelated", objectFit: "contain", width: px, height: px },
17169
- className: cn("flex-shrink-0", className)
17170
- }
17171
- );
17172
- }
17173
- const I = typeof icon === "string" ? resolveIcon(icon) : icon;
17174
- return /* @__PURE__ */ jsx(I, { width: px, height: px, className: cn("flex-shrink-0", className) });
17175
- }
17176
- var sizeMap3;
17177
- var init_GameIcon = __esm({
17178
- "components/game/2d/atoms/GameIcon.tsx"() {
17179
- "use client";
17180
- init_cn();
17181
- init_Icon();
17182
- sizeMap3 = {
17183
- sm: 16,
17184
- md: 24,
17185
- lg: 32
17186
- };
17187
- GameIcon.displayName = "GameIcon";
17188
- }
17189
- });
17190
17206
  function BuilderBoard({
17191
17207
  entity,
17192
17208
  completeEvent = "PUZZLE_COMPLETE",
@@ -19000,6 +19016,7 @@ function GameCard({
19000
19016
  id,
19001
19017
  cost,
19002
19018
  art,
19019
+ frameAsset,
19003
19020
  attack,
19004
19021
  defense,
19005
19022
  name,
@@ -19017,16 +19034,19 @@ function GameCard({
19017
19034
  if (clickEvent) eventBus.emit(`UI:${clickEvent}`, { cardId: id });
19018
19035
  }, [disabled, id, onClick, clickEvent, eventBus]);
19019
19036
  const artPx = artPxMap[size];
19037
+ const frameStyle = frameAsset?.url ? { backgroundImage: `url(${frameAsset.url})`, backgroundSize: "100% 100%", backgroundRepeat: "no-repeat" } : {};
19020
19038
  return /* @__PURE__ */ jsxs(
19021
- "button",
19039
+ Button,
19022
19040
  {
19023
- type: "button",
19041
+ variant: "ghost",
19024
19042
  onClick: handleClick,
19025
19043
  disabled,
19026
19044
  title: name,
19045
+ style: frameStyle,
19027
19046
  className: cn(
19028
- "relative flex flex-col items-center rounded-interactive border-2",
19047
+ "relative flex flex-col items-center rounded-interactive",
19029
19048
  "bg-card/90 px-1.5 pt-1.5 pb-1 transition-all duration-150",
19049
+ frameAsset?.url ? "border-0" : "border-2",
19030
19050
  cardSizeMap[size],
19031
19051
  disabled ? "border-border opacity-50 cursor-not-allowed" : "border-accent hover:brightness-125 hover:-translate-y-1 cursor-pointer",
19032
19052
  selected && "ring-2 ring-foreground ring-offset-1 ring-offset-background -translate-y-1",
@@ -19034,8 +19054,9 @@ function GameCard({
19034
19054
  ),
19035
19055
  children: [
19036
19056
  cost != null && /* @__PURE__ */ jsx(
19037
- "span",
19057
+ Typography,
19038
19058
  {
19059
+ as: "span",
19039
19060
  className: cn(
19040
19061
  "absolute -top-2 -left-2 flex items-center justify-center",
19041
19062
  "min-w-[22px] h-[22px] rounded-full px-1",
@@ -19044,17 +19065,7 @@ function GameCard({
19044
19065
  children: cost
19045
19066
  }
19046
19067
  ),
19047
- /* @__PURE__ */ jsx(Box, { className: "flex-1 flex items-center justify-center w-full", children: art ? /* @__PURE__ */ jsx(
19048
- "img",
19049
- {
19050
- src: art.url,
19051
- alt: name ?? id,
19052
- width: artPx,
19053
- height: artPx,
19054
- style: { imageRendering: "pixelated", objectFit: "contain" },
19055
- className: "flex-shrink-0"
19056
- }
19057
- ) : /* @__PURE__ */ jsx(Box, { className: "rounded bg-muted/40", style: { width: artPx, height: artPx } }) }),
19068
+ /* @__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 } }) }),
19058
19069
  name != null && /* @__PURE__ */ jsx(
19059
19070
  Typography,
19060
19071
  {
@@ -19064,8 +19075,8 @@ function GameCard({
19064
19075
  }
19065
19076
  ),
19066
19077
  (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: [
19067
- /* @__PURE__ */ jsx("span", { className: "text-error", children: attack != null ? `\u2694${attack}` : "" }),
19068
- /* @__PURE__ */ jsx("span", { className: "text-info", children: defense != null ? `\u{1F6E1}${defense}` : "" })
19078
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-error", children: attack != null ? `\u2694${attack}` : "" }),
19079
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-info", children: defense != null ? `\u{1F6E1}${defense}` : "" })
19069
19080
  ] })
19070
19081
  ]
19071
19082
  }
@@ -19078,7 +19089,9 @@ var init_GameCard = __esm({
19078
19089
  init_cn();
19079
19090
  init_useEventBus();
19080
19091
  init_Box();
19092
+ init_Button();
19081
19093
  init_Typography();
19094
+ init_GameIcon();
19082
19095
  cardSizeMap = {
19083
19096
  sm: "w-16 h-24",
19084
19097
  md: "w-20 h-28",
@@ -21489,11 +21502,11 @@ function ChoiceButton({
21489
21502
  }) {
21490
21503
  const eventBus = useEventBus();
21491
21504
  return /* @__PURE__ */ jsxs(
21492
- "button",
21505
+ Button,
21493
21506
  {
21494
- type: "button",
21507
+ variant: "ghost",
21495
21508
  disabled,
21496
- onClick: (e) => {
21509
+ onClick: () => {
21497
21510
  if (action) eventBus.emit(`UI:${action}`, {});
21498
21511
  onClick?.();
21499
21512
  },
@@ -21506,8 +21519,9 @@ function ChoiceButton({
21506
21519
  ),
21507
21520
  children: [
21508
21521
  index !== void 0 && /* @__PURE__ */ jsxs(
21509
- "span",
21522
+ Typography,
21510
21523
  {
21524
+ as: "span",
21511
21525
  className: cn(
21512
21526
  "flex-shrink-0 font-mono font-bold text-sm",
21513
21527
  selected ? "text-accent" : "text-muted-foreground"
@@ -21518,24 +21532,14 @@ function ChoiceButton({
21518
21532
  ]
21519
21533
  }
21520
21534
  ),
21521
- assetUrl ? /* @__PURE__ */ jsx(
21522
- "img",
21523
- {
21524
- src: assetUrl.url,
21525
- alt: "",
21526
- width: 16,
21527
- height: 16,
21528
- style: { imageRendering: "pixelated", objectFit: "contain" },
21529
- className: "flex-shrink-0"
21530
- }
21531
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0 text-sm", children: typeof icon === "string" ? (() => {
21535
+ 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" ? (() => {
21532
21536
  const I = resolveIcon(icon);
21533
21537
  return I ? /* @__PURE__ */ jsx(I, { className: "w-4 h-4" }) : null;
21534
21538
  })() : /* @__PURE__ */ (() => {
21535
21539
  const I = icon;
21536
21540
  return /* @__PURE__ */ jsx(I, { className: "w-4 h-4" });
21537
21541
  })() }) : null,
21538
- /* @__PURE__ */ jsx("span", { className: "text-sm leading-snug", children: text })
21542
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-sm leading-snug", children: text })
21539
21543
  ]
21540
21544
  }
21541
21545
  );
@@ -21545,6 +21549,10 @@ var init_ChoiceButton = __esm({
21545
21549
  init_cn();
21546
21550
  init_Icon();
21547
21551
  init_useEventBus();
21552
+ init_Button();
21553
+ init_Box();
21554
+ init_Typography();
21555
+ init_GameIcon();
21548
21556
  ChoiceButton.displayName = "ChoiceButton";
21549
21557
  }
21550
21558
  });
@@ -22222,7 +22230,7 @@ function ComboCounter({
22222
22230
  const sizes = sizeMap4[size];
22223
22231
  if (combo <= 0) return null;
22224
22232
  return /* @__PURE__ */ jsxs(
22225
- "div",
22233
+ Box,
22226
22234
  {
22227
22235
  className: cn(
22228
22236
  "inline-flex flex-col items-center justify-center",
@@ -22232,24 +22240,14 @@ function ComboCounter({
22232
22240
  className
22233
22241
  ),
22234
22242
  children: [
22235
- assetUrl && /* @__PURE__ */ jsx(
22236
- "img",
22237
- {
22238
- src: assetUrl.url,
22239
- alt: "combo",
22240
- width: 24,
22241
- height: 24,
22242
- style: { imageRendering: "pixelated", objectFit: "contain" },
22243
- className: "flex-shrink-0 mb-0.5"
22244
- }
22245
- ),
22246
- /* @__PURE__ */ jsx("span", { className: cn("font-black tabular-nums leading-none", sizes.combo, getComboIntensity(combo)), children: combo }),
22247
- /* @__PURE__ */ jsx("span", { className: cn("font-bold uppercase tracking-wider text-muted-foreground", sizes.label), children: "combo" }),
22248
- multiplier != null && multiplier > 1 && /* @__PURE__ */ jsxs("span", { className: cn("font-bold text-warning tabular-nums", sizes.multiplier), children: [
22243
+ assetUrl && /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 24, className: "flex-shrink-0 mb-0.5" }),
22244
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: cn("font-black tabular-nums leading-none", sizes.combo, getComboIntensity(combo)), children: combo }),
22245
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: cn("font-bold uppercase tracking-wider text-muted-foreground", sizes.label), children: "combo" }),
22246
+ multiplier != null && multiplier > 1 && /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("font-bold text-warning tabular-nums", sizes.multiplier), children: [
22249
22247
  "x",
22250
22248
  multiplier.toFixed(1)
22251
22249
  ] }),
22252
- streak != null && streak > 0 && /* @__PURE__ */ jsxs("span", { className: cn("text-muted-foreground tabular-nums", sizes.label), children: [
22250
+ streak != null && streak > 0 && /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("text-muted-foreground tabular-nums", sizes.label), children: [
22253
22251
  streak,
22254
22252
  " streak"
22255
22253
  ] })
@@ -22261,6 +22259,9 @@ var DEFAULT_ASSET_URL2, sizeMap4;
22261
22259
  var init_ComboCounter = __esm({
22262
22260
  "components/game/2d/atoms/ComboCounter.tsx"() {
22263
22261
  init_cn();
22262
+ init_Box();
22263
+ init_Typography();
22264
+ init_GameIcon();
22264
22265
  DEFAULT_ASSET_URL2 = {
22265
22266
  url: "https://almadar-kflow-assets.web.app/shared/effects/flash/flash00.png",
22266
22267
  role: "effect",
@@ -22510,9 +22511,9 @@ function ControlButton({
22510
22511
  [isPressed, releaseEvent, eventBus, onRelease]
22511
22512
  );
22512
22513
  return /* @__PURE__ */ jsx(
22513
- "button",
22514
+ Button,
22514
22515
  {
22515
- type: "button",
22516
+ variant,
22516
22517
  disabled,
22517
22518
  onPointerDown: handlePointerDown,
22518
22519
  onPointerUp: handlePointerUp,
@@ -22530,23 +22531,13 @@ function ControlButton({
22530
22531
  disabled && "opacity-50 cursor-not-allowed",
22531
22532
  className
22532
22533
  ),
22533
- children: assetUrl ? /* @__PURE__ */ jsx(
22534
- "img",
22535
- {
22536
- src: assetUrl.url,
22537
- alt: "",
22538
- width: 24,
22539
- height: 24,
22540
- style: { imageRendering: "pixelated", objectFit: "contain" },
22541
- className: "flex-shrink-0"
22542
- }
22543
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "text-2xl", children: typeof icon === "string" ? /^[a-zA-Z0-9-]+$/.test(icon) ? (() => {
22534
+ 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) ? (() => {
22544
22535
  const I = resolveIcon(icon);
22545
22536
  return I ? /* @__PURE__ */ jsx(I, { className: "w-6 h-6" }) : null;
22546
22537
  })() : icon : /* @__PURE__ */ (() => {
22547
22538
  const I = icon;
22548
22539
  return /* @__PURE__ */ jsx(I, { className: "w-6 h-6" });
22549
- })() }) : label ? /* @__PURE__ */ jsx("span", { children: label }) : null
22540
+ })() }) : label ? /* @__PURE__ */ jsx(Typography, { as: "span", children: label }) : null
22550
22541
  }
22551
22542
  );
22552
22543
  }
@@ -22557,6 +22548,10 @@ var init_ControlButton = __esm({
22557
22548
  init_cn();
22558
22549
  init_useEventBus();
22559
22550
  init_Icon();
22551
+ init_Button();
22552
+ init_Box();
22553
+ init_Typography();
22554
+ init_GameIcon();
22560
22555
  sizeMap5 = {
22561
22556
  sm: "w-10 h-10 text-sm",
22562
22557
  md: "w-14 h-14 text-base",
@@ -22641,22 +22636,22 @@ function ControlGrid({
22641
22636
  },
22642
22637
  d
22643
22638
  );
22644
- return /* @__PURE__ */ jsxs("div", { className: cn("inline-grid grid-cols-3", ds.gap, ds.container, className), children: [
22645
- /* @__PURE__ */ jsx("div", {}),
22639
+ return /* @__PURE__ */ jsxs(Box, { className: cn("inline-grid grid-cols-3", ds.gap, ds.container, className), children: [
22640
+ /* @__PURE__ */ jsx(Box, {}),
22646
22641
  dir("up"),
22647
- /* @__PURE__ */ jsx("div", {}),
22642
+ /* @__PURE__ */ jsx(Box, {}),
22648
22643
  dir("left"),
22649
- /* @__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" }) }),
22644
+ /* @__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" }) }),
22650
22645
  dir("right"),
22651
- /* @__PURE__ */ jsx("div", {}),
22646
+ /* @__PURE__ */ jsx(Box, {}),
22652
22647
  dir("down"),
22653
- /* @__PURE__ */ jsx("div", {})
22648
+ /* @__PURE__ */ jsx(Box, {})
22654
22649
  ] });
22655
22650
  }
22656
22651
  if (layout === "diamond" && buttons.length === 4) {
22657
22652
  const [top, right, bottom, left] = buttons;
22658
- return /* @__PURE__ */ jsxs("div", { className: cn(layoutClass.diamond, className), children: [
22659
- /* @__PURE__ */ jsx("div", {}),
22653
+ return /* @__PURE__ */ jsxs(Box, { className: cn(layoutClass.diamond, className), children: [
22654
+ /* @__PURE__ */ jsx(Box, {}),
22660
22655
  /* @__PURE__ */ jsx(
22661
22656
  ControlButton,
22662
22657
  {
@@ -22671,7 +22666,7 @@ function ControlGrid({
22671
22666
  disabled
22672
22667
  }
22673
22668
  ),
22674
- /* @__PURE__ */ jsx("div", {}),
22669
+ /* @__PURE__ */ jsx(Box, {}),
22675
22670
  /* @__PURE__ */ jsx(
22676
22671
  ControlButton,
22677
22672
  {
@@ -22686,7 +22681,7 @@ function ControlGrid({
22686
22681
  disabled
22687
22682
  }
22688
22683
  ),
22689
- /* @__PURE__ */ jsx("div", {}),
22684
+ /* @__PURE__ */ jsx(Box, {}),
22690
22685
  /* @__PURE__ */ jsx(
22691
22686
  ControlButton,
22692
22687
  {
@@ -22701,7 +22696,7 @@ function ControlGrid({
22701
22696
  disabled
22702
22697
  }
22703
22698
  ),
22704
- /* @__PURE__ */ jsx("div", {}),
22699
+ /* @__PURE__ */ jsx(Box, {}),
22705
22700
  /* @__PURE__ */ jsx(
22706
22701
  ControlButton,
22707
22702
  {
@@ -22716,10 +22711,10 @@ function ControlGrid({
22716
22711
  disabled
22717
22712
  }
22718
22713
  ),
22719
- /* @__PURE__ */ jsx("div", {})
22714
+ /* @__PURE__ */ jsx(Box, {})
22720
22715
  ] });
22721
22716
  }
22722
- return /* @__PURE__ */ jsx("div", { className: cn(layoutClass[layout], className), children: buttons.map((button) => /* @__PURE__ */ jsx(
22717
+ return /* @__PURE__ */ jsx(Box, { className: cn(layoutClass[layout], className), children: buttons.map((button) => /* @__PURE__ */ jsx(
22723
22718
  ControlButton,
22724
22719
  {
22725
22720
  icon: button.icon,
@@ -22741,6 +22736,7 @@ var init_ControlGrid = __esm({
22741
22736
  "use client";
22742
22737
  init_cn();
22743
22738
  init_useEventBus();
22739
+ init_Box();
22744
22740
  init_ControlButton();
22745
22741
  sizeKey = { sm: "sm", md: "md", lg: "lg" };
22746
22742
  layoutClass = {
@@ -23005,8 +23001,9 @@ function DamageNumber({
23005
23001
  return /* @__PURE__ */ jsxs(Fragment, { children: [
23006
23002
  /* @__PURE__ */ jsx("style", { children: floatKeyframes }),
23007
23003
  /* @__PURE__ */ jsxs(
23008
- "span",
23004
+ Typography,
23009
23005
  {
23006
+ as: "span",
23010
23007
  className: cn(
23011
23008
  "inline-flex items-center gap-0.5 font-mono select-none pointer-events-none",
23012
23009
  sizeMap6[size],
@@ -23015,17 +23012,7 @@ function DamageNumber({
23015
23012
  ),
23016
23013
  style: { animation: "damageFloat 1s ease-out forwards" },
23017
23014
  children: [
23018
- assetUrl && /* @__PURE__ */ jsx(
23019
- "img",
23020
- {
23021
- src: assetUrl.url,
23022
- alt: "",
23023
- width: 14,
23024
- height: 14,
23025
- style: { imageRendering: "pixelated", objectFit: "contain" },
23026
- className: "flex-shrink-0"
23027
- }
23028
- ),
23015
+ assetUrl && /* @__PURE__ */ jsx(GameIcon, { assetUrl, icon: "image", size: 14, className: "flex-shrink-0" }),
23029
23016
  displayText
23030
23017
  ]
23031
23018
  }
@@ -23036,6 +23023,8 @@ var sizeMap6, typeStyles, floatKeyframes, DEFAULT_ASSET_URL4;
23036
23023
  var init_DamageNumber = __esm({
23037
23024
  "components/game/2d/atoms/DamageNumber.tsx"() {
23038
23025
  init_cn();
23026
+ init_Typography();
23027
+ init_GameIcon();
23039
23028
  sizeMap6 = {
23040
23029
  sm: "text-sm",
23041
23030
  md: "text-lg",
@@ -29397,7 +29386,7 @@ function ScoreDisplay({
29397
29386
  const resolvedValue = typeof value === "number" && !Number.isNaN(value) ? value : typeof score === "number" && !Number.isNaN(score) ? score : 0;
29398
29387
  const formattedValue = new Intl.NumberFormat(locale).format(resolvedValue);
29399
29388
  return /* @__PURE__ */ jsxs(
29400
- "div",
29389
+ Box,
29401
29390
  {
29402
29391
  className: cn(
29403
29392
  "flex items-center gap-2 font-bold",
@@ -29405,19 +29394,9 @@ function ScoreDisplay({
29405
29394
  className
29406
29395
  ),
29407
29396
  children: [
29408
- assetUrl ? /* @__PURE__ */ jsx(
29409
- "img",
29410
- {
29411
- src: assetUrl.url,
29412
- alt: "",
29413
- width: 20,
29414
- height: 20,
29415
- style: { imageRendering: "pixelated", objectFit: "contain" },
29416
- className: "flex-shrink-0"
29417
- }
29418
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0", children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) }) : null,
29419
- label && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: label }),
29420
- /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formattedValue })
29397
+ 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,
29398
+ label && /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: label }),
29399
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "tabular-nums", children: formattedValue })
29421
29400
  ]
29422
29401
  }
29423
29402
  );
@@ -29427,6 +29406,9 @@ var init_ScoreDisplay = __esm({
29427
29406
  "components/game/2d/atoms/ScoreDisplay.tsx"() {
29428
29407
  init_cn();
29429
29408
  init_Icon();
29409
+ init_Box();
29410
+ init_Typography();
29411
+ init_GameIcon();
29430
29412
  sizeMap8 = {
29431
29413
  sm: "text-sm",
29432
29414
  md: "text-lg",
@@ -29487,12 +29469,12 @@ function Sprite({
29487
29469
  onClick?.();
29488
29470
  };
29489
29471
  return /* @__PURE__ */ jsx(
29490
- "div",
29472
+ Box,
29491
29473
  {
29474
+ position: "absolute",
29492
29475
  className,
29493
29476
  onClick: action || onClick ? handleClick : void 0,
29494
29477
  style: {
29495
- position: "absolute",
29496
29478
  width: frameWidth,
29497
29479
  height: frameHeight,
29498
29480
  backgroundImage: `url(${spritesheet.url})`,
@@ -29548,6 +29530,7 @@ var init_Sprite = __esm({
29548
29530
  "components/game/2d/atoms/Sprite.tsx"() {
29549
29531
  "use client";
29550
29532
  init_useEventBus();
29533
+ init_Box();
29551
29534
  init_spriteAnimation();
29552
29535
  DEFAULT_SPRITESHEET = {
29553
29536
  url: "https://almadar-kflow-assets.web.app/shared/isometric-blocks/Spritesheet/allTiles_sheet.png",
@@ -29584,17 +29567,7 @@ function StateIndicator({
29584
29567
  className
29585
29568
  ),
29586
29569
  children: [
29587
- /* @__PURE__ */ jsx(Box, { as: "span", children: assetUrl ? /* @__PURE__ */ jsx(
29588
- "img",
29589
- {
29590
- src: assetUrl.url,
29591
- alt: displayLabel,
29592
- width: 16,
29593
- height: 16,
29594
- style: { imageRendering: "pixelated", objectFit: "contain" },
29595
- className: "flex-shrink-0"
29596
- }
29597
- ) : 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 }) }),
29570
+ /* @__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 }) }),
29598
29571
  /* @__PURE__ */ jsx(Box, { as: "span", children: displayLabel })
29599
29572
  ]
29600
29573
  }
@@ -29606,6 +29579,7 @@ var init_StateIndicator = __esm({
29606
29579
  init_Box();
29607
29580
  init_Icon();
29608
29581
  init_cn();
29582
+ init_GameIcon();
29609
29583
  DEFAULT_ASSET_URL6 = {
29610
29584
  url: "https://almadar-kflow-assets.web.app/shared/isometric-dungeon/Isometric/chestClosed_E.png",
29611
29585
  role: "ui",
@@ -29659,7 +29633,7 @@ function TimerDisplay({
29659
29633
  }) {
29660
29634
  const isLow = lowThreshold != null && seconds <= lowThreshold && seconds > 0;
29661
29635
  return /* @__PURE__ */ jsxs(
29662
- "div",
29636
+ Box,
29663
29637
  {
29664
29638
  className: cn(
29665
29639
  "inline-flex items-center gap-1 justify-center rounded-container",
@@ -29671,7 +29645,7 @@ function TimerDisplay({
29671
29645
  className
29672
29646
  ),
29673
29647
  children: [
29674
- iconAsset && /* @__PURE__ */ jsx("img", { src: iconAsset.url, alt: "", className: "w-4 h-4 object-contain flex-shrink-0" }),
29648
+ iconAsset && /* @__PURE__ */ jsx(GameIcon, { assetUrl: iconAsset, icon: "image", size: 16, className: "w-4 h-4 object-contain flex-shrink-0" }),
29675
29649
  formatTime(seconds, format)
29676
29650
  ]
29677
29651
  }
@@ -29681,6 +29655,8 @@ var sizeMap9;
29681
29655
  var init_TimerDisplay = __esm({
29682
29656
  "components/game/2d/atoms/TimerDisplay.tsx"() {
29683
29657
  init_cn();
29658
+ init_Box();
29659
+ init_GameIcon();
29684
29660
  sizeMap9 = {
29685
29661
  sm: "text-sm px-2 py-0.5",
29686
29662
  md: "text-lg px-3 py-1",
@@ -29701,7 +29677,7 @@ function ResourceCounter({
29701
29677
  }) {
29702
29678
  const sizes = sizeMap10[size];
29703
29679
  return /* @__PURE__ */ jsxs(
29704
- "div",
29680
+ Box,
29705
29681
  {
29706
29682
  className: cn(
29707
29683
  "inline-flex items-center rounded-container",
@@ -29710,21 +29686,11 @@ function ResourceCounter({
29710
29686
  className
29711
29687
  ),
29712
29688
  children: [
29713
- assetUrl ? /* @__PURE__ */ jsx(
29714
- "img",
29715
- {
29716
- src: assetUrl.url,
29717
- alt: label,
29718
- width: sizes.img,
29719
- height: sizes.img,
29720
- style: { imageRendering: "pixelated", objectFit: "contain" },
29721
- className: "flex-shrink-0"
29722
- }
29723
- ) : 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,
29724
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: label }),
29725
- /* @__PURE__ */ jsxs("span", { className: cn("font-bold tabular-nums", color && (color in colorTokenClasses2 ? colorTokenClasses2[color] : color)), children: [
29689
+ 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,
29690
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: label }),
29691
+ /* @__PURE__ */ jsxs(Typography, { as: "span", className: cn("font-bold tabular-nums", color && (color in colorTokenClasses2 ? colorTokenClasses2[color] : color)), children: [
29726
29692
  value,
29727
- max != null && /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
29693
+ max != null && /* @__PURE__ */ jsxs(Typography, { as: "span", className: "text-muted-foreground", children: [
29728
29694
  "/",
29729
29695
  max
29730
29696
  ] })
@@ -29738,6 +29704,9 @@ var init_ResourceCounter = __esm({
29738
29704
  "components/game/2d/atoms/ResourceCounter.tsx"() {
29739
29705
  init_cn();
29740
29706
  init_Icon();
29707
+ init_Box();
29708
+ init_Typography();
29709
+ init_GameIcon();
29741
29710
  colorTokenClasses2 = {
29742
29711
  primary: "text-primary",
29743
29712
  secondary: "text-secondary",
@@ -29776,9 +29745,9 @@ function ItemSlot({
29776
29745
  const isClickable = onClick != null || action != null;
29777
29746
  const px = assetSizeMap[size];
29778
29747
  return /* @__PURE__ */ jsx(
29779
- "button",
29748
+ Button,
29780
29749
  {
29781
- type: "button",
29750
+ variant: "ghost",
29782
29751
  onClick: () => {
29783
29752
  if (action) eventBus.emit(`UI:${action}`, {});
29784
29753
  onClick?.();
@@ -29797,21 +29766,12 @@ function ItemSlot({
29797
29766
  !isClickable && "cursor-default",
29798
29767
  className
29799
29768
  ),
29800
- children: empty ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-base", children: "+" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
29801
- assetUrl ? /* @__PURE__ */ jsx(
29802
- "img",
29803
- {
29804
- src: assetUrl?.url,
29805
- alt: label,
29806
- width: px,
29807
- height: px,
29808
- style: { imageRendering: "pixelated", objectFit: "contain" },
29809
- className: "flex-shrink-0"
29810
- }
29811
- ) : icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0", children: typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) }) : null,
29769
+ children: empty ? /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground text-base", children: "+" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
29770
+ 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,
29812
29771
  quantity != null && quantity > 1 && /* @__PURE__ */ jsx(
29813
- "span",
29772
+ Typography,
29814
29773
  {
29774
+ as: "span",
29815
29775
  className: cn(
29816
29776
  "absolute -bottom-1 -right-1 flex items-center justify-center",
29817
29777
  "min-w-[18px] h-[18px] rounded-full px-1",
@@ -29831,6 +29791,10 @@ var init_ItemSlot = __esm({
29831
29791
  init_cn();
29832
29792
  init_Icon();
29833
29793
  init_useEventBus();
29794
+ init_Button();
29795
+ init_Box();
29796
+ init_Typography();
29797
+ init_GameIcon();
29834
29798
  sizeMap11 = {
29835
29799
  sm: "w-10 h-10 text-lg",
29836
29800
  md: "w-14 h-14 text-2xl",
@@ -29874,7 +29838,7 @@ function TurnIndicator({
29874
29838
  }) {
29875
29839
  const sizes = sizeMap12[size];
29876
29840
  return /* @__PURE__ */ jsxs(
29877
- "div",
29841
+ Box,
29878
29842
  {
29879
29843
  className: cn(
29880
29844
  "inline-flex items-center rounded-container",
@@ -29883,32 +29847,22 @@ function TurnIndicator({
29883
29847
  className
29884
29848
  ),
29885
29849
  children: [
29886
- /* @__PURE__ */ jsxs("span", { className: "font-bold tabular-nums", children: [
29850
+ /* @__PURE__ */ jsxs(Typography, { as: "span", className: "font-bold tabular-nums", children: [
29887
29851
  "Turn ",
29888
29852
  currentTurn,
29889
- maxTurns != null && /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
29853
+ maxTurns != null && /* @__PURE__ */ jsxs(Typography, { as: "span", className: "text-muted-foreground", children: [
29890
29854
  "/",
29891
29855
  maxTurns
29892
29856
  ] })
29893
29857
  ] }),
29894
29858
  phase && /* @__PURE__ */ jsxs(Fragment, { children: [
29895
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "|" }),
29896
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: phase })
29859
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: "|" }),
29860
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: phase })
29897
29861
  ] }),
29898
29862
  activeTeam && /* @__PURE__ */ jsxs(Fragment, { children: [
29899
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "|" }),
29900
- assetUrl ? /* @__PURE__ */ jsx(
29901
- "img",
29902
- {
29903
- src: assetUrl.url,
29904
- alt: "",
29905
- width: 12,
29906
- height: 12,
29907
- style: { imageRendering: "pixelated", objectFit: "contain" },
29908
- className: "flex-shrink-0"
29909
- }
29910
- ) : /* @__PURE__ */ jsx("span", { className: cn("rounded-full bg-success/20", sizes.dot) }),
29911
- /* @__PURE__ */ jsx("span", { className: "text-success", children: activeTeam })
29863
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground", children: "|" }),
29864
+ 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) }),
29865
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-success", children: activeTeam })
29912
29866
  ] })
29913
29867
  ]
29914
29868
  }
@@ -29918,6 +29872,9 @@ var sizeMap12, DEFAULT_ASSET_URL9;
29918
29872
  var init_TurnIndicator = __esm({
29919
29873
  "components/game/2d/atoms/TurnIndicator.tsx"() {
29920
29874
  init_cn();
29875
+ init_Box();
29876
+ init_Typography();
29877
+ init_GameIcon();
29921
29878
  sizeMap12 = {
29922
29879
  sm: { wrapper: "text-xs gap-1.5 px-2 py-0.5", dot: "w-1.5 h-1.5" },
29923
29880
  md: { wrapper: "text-sm gap-2 px-3 py-1", dot: "w-2 h-2" },
@@ -29941,53 +29898,47 @@ function WaypointMarker({
29941
29898
  className
29942
29899
  }) {
29943
29900
  const sizes = sizeMap13[size];
29944
- return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col items-center", className), children: [
29945
- /* @__PURE__ */ jsxs("div", { className: "relative flex items-center justify-center", children: [
29901
+ return /* @__PURE__ */ jsxs(Box, { className: cn("flex flex-col items-center", className), children: [
29902
+ /* @__PURE__ */ jsxs(Box, { className: "relative flex items-center justify-center", children: [
29946
29903
  active && /* @__PURE__ */ jsx(
29947
- "div",
29904
+ Box,
29948
29905
  {
29906
+ position: "absolute",
29949
29907
  className: cn(
29950
- "absolute rounded-full border-2 border-info animate-ping opacity-50",
29908
+ "rounded-full border-2 border-info animate-ping opacity-50",
29951
29909
  sizes.ring
29952
29910
  )
29953
29911
  }
29954
29912
  ),
29955
29913
  active && /* @__PURE__ */ jsx(
29956
- "div",
29914
+ Box,
29957
29915
  {
29916
+ position: "absolute",
29958
29917
  className: cn(
29959
- "absolute rounded-full border-2 border-info",
29918
+ "rounded-full border-2 border-info",
29960
29919
  sizes.ring
29961
29920
  )
29962
29921
  }
29963
29922
  ),
29964
29923
  /* @__PURE__ */ jsx(
29965
- "div",
29924
+ Box,
29966
29925
  {
29926
+ position: "relative",
29967
29927
  className: cn(
29968
- "relative flex items-center justify-center rounded-full transition-all duration-200",
29928
+ "flex items-center justify-center rounded-full transition-all duration-200",
29969
29929
  sizes.dot,
29970
29930
  completed && "bg-success text-foreground",
29971
29931
  active && !completed && "bg-info text-foreground",
29972
29932
  !active && !completed && "bg-muted"
29973
29933
  ),
29974
- children: completed ? checkIcon : assetUrl ? /* @__PURE__ */ jsx(
29975
- "img",
29976
- {
29977
- src: assetUrl.url,
29978
- alt: label,
29979
- width: sizes.img,
29980
- height: sizes.img,
29981
- style: { imageRendering: "pixelated", objectFit: "contain" },
29982
- className: "flex-shrink-0"
29983
- }
29984
- ) : icon ? typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon }) : /* @__PURE__ */ jsx(Icon, { icon }) : null
29934
+ 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
29985
29935
  }
29986
29936
  )
29987
29937
  ] }),
29988
29938
  label && /* @__PURE__ */ jsx(
29989
- "span",
29939
+ Typography,
29990
29940
  {
29941
+ as: "span",
29991
29942
  className: cn(
29992
29943
  "text-center whitespace-nowrap",
29993
29944
  sizes.label,
@@ -30003,6 +29954,9 @@ var init_WaypointMarker = __esm({
30003
29954
  "components/game/2d/atoms/WaypointMarker.tsx"() {
30004
29955
  init_cn();
30005
29956
  init_Icon();
29957
+ init_Box();
29958
+ init_Typography();
29959
+ init_GameIcon();
30006
29960
  DEFAULT_ASSET_URL10 = {
30007
29961
  url: "https://almadar-kflow-assets.web.app/shared/world-map/battle_marker.png",
30008
29962
  role: "ui",
@@ -30034,31 +29988,23 @@ function StatusEffect({
30034
29988
  className
30035
29989
  }) {
30036
29990
  const sizes = sizeMap14[size];
30037
- return /* @__PURE__ */ jsxs("div", { className: cn("relative inline-flex flex-col items-center", className), children: [
29991
+ return /* @__PURE__ */ jsxs(Box, { position: "relative", className: cn("inline-flex flex-col items-center", className), children: [
30038
29992
  /* @__PURE__ */ jsxs(
30039
- "div",
29993
+ Box,
30040
29994
  {
29995
+ position: "relative",
30041
29996
  className: cn(
30042
- "relative flex items-center justify-center rounded-interactive border-2",
29997
+ "flex items-center justify-center rounded-interactive border-2",
30043
29998
  sizes.container,
30044
29999
  variantStyles8[variant]
30045
30000
  ),
30046
30001
  title: label,
30047
30002
  children: [
30048
- /* @__PURE__ */ jsx("span", { className: cn("flex items-center justify-center", sizes.icon), children: assetUrl ? /* @__PURE__ */ jsx(
30049
- "img",
30050
- {
30051
- src: assetUrl.url,
30052
- alt: label,
30053
- width: sizes.img,
30054
- height: sizes.img,
30055
- style: { imageRendering: "pixelated", objectFit: "contain" },
30056
- className: "flex-shrink-0"
30057
- }
30058
- ) : icon != null && typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, size: "sm" }) : icon != null ? /* @__PURE__ */ jsx(Icon, { icon, size: "sm" }) : null }),
30003
+ /* @__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 }),
30059
30004
  duration !== void 0 && /* @__PURE__ */ jsx(
30060
- "span",
30005
+ Typography,
30061
30006
  {
30007
+ as: "span",
30062
30008
  className: cn(
30063
30009
  "absolute bottom-0 left-0 right-0 text-center font-mono font-bold text-foreground bg-background/60 leading-tight",
30064
30010
  sizes.timer
@@ -30070,8 +30016,9 @@ function StatusEffect({
30070
30016
  }
30071
30017
  ),
30072
30018
  stacks !== void 0 && stacks > 1 && /* @__PURE__ */ jsx(
30073
- "span",
30019
+ Typography,
30074
30020
  {
30021
+ as: "span",
30075
30022
  className: cn(
30076
30023
  "absolute flex items-center justify-center rounded-full bg-card text-foreground font-bold leading-none",
30077
30024
  sizes.badge
@@ -30079,7 +30026,7 @@ function StatusEffect({
30079
30026
  children: stacks
30080
30027
  }
30081
30028
  ),
30082
- label && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground mt-0.5 text-center whitespace-nowrap", children: label })
30029
+ label && /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-xs text-muted-foreground mt-0.5 text-center whitespace-nowrap", children: label })
30083
30030
  ] });
30084
30031
  }
30085
30032
  var DEFAULT_ASSET_URL11, sizeMap14, variantStyles8;
@@ -30087,6 +30034,9 @@ var init_StatusEffect = __esm({
30087
30034
  "components/game/2d/atoms/StatusEffect.tsx"() {
30088
30035
  init_cn();
30089
30036
  init_Icon();
30037
+ init_Box();
30038
+ init_Typography();
30039
+ init_GameIcon();
30090
30040
  DEFAULT_ASSET_URL11 = {
30091
30041
  url: "https://almadar-kflow-assets.web.app/shared/effects/particles/flame_01.png",
30092
30042
  role: "ui",
@@ -30113,7 +30063,7 @@ function DialogueBubble({
30113
30063
  className
30114
30064
  }) {
30115
30065
  return /* @__PURE__ */ jsxs(
30116
- "div",
30066
+ Box,
30117
30067
  {
30118
30068
  className: cn(
30119
30069
  "flex items-start gap-3 rounded-container bg-background/80 backdrop-blur-sm px-4 py-3 border border-border/10",
@@ -30121,17 +30071,10 @@ function DialogueBubble({
30121
30071
  className
30122
30072
  ),
30123
30073
  children: [
30124
- portrait && /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 w-12 h-12 rounded-full overflow-hidden border-2 border-warning/60", children: /* @__PURE__ */ jsx(
30125
- "img",
30126
- {
30127
- src: portrait?.url,
30128
- alt: speaker ?? "speaker",
30129
- className: "w-full h-full object-cover"
30130
- }
30131
- ) }),
30132
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 min-w-0", children: [
30133
- speaker && /* @__PURE__ */ jsx("span", { className: "text-sm font-bold text-warning", children: speaker }),
30134
- /* @__PURE__ */ jsx("span", { className: "text-sm text-foreground leading-relaxed", children: text })
30074
+ 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" }) }),
30075
+ /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-1 min-w-0", children: [
30076
+ speaker && /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-sm font-bold text-warning", children: speaker }),
30077
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-sm text-foreground leading-relaxed", children: text })
30135
30078
  ] })
30136
30079
  ]
30137
30080
  }
@@ -30141,6 +30084,9 @@ var DEFAULT_PORTRAIT;
30141
30084
  var init_DialogueBubble = __esm({
30142
30085
  "components/game/2d/atoms/DialogueBubble.tsx"() {
30143
30086
  init_cn();
30087
+ init_Box();
30088
+ init_Typography();
30089
+ init_GameIcon();
30144
30090
  DEFAULT_PORTRAIT = {
30145
30091
  url: "https://almadar-kflow-assets.web.app/shared/characters/archetypes/04_hero.png",
30146
30092
  role: "effect",
@@ -30167,7 +30113,7 @@ function StatBadge({
30167
30113
  const numValue = typeof value === "number" ? value : parseInt(String(value), 10) || 0;
30168
30114
  const resolvedAsset = iconUrl ?? assetUrl;
30169
30115
  return /* @__PURE__ */ jsxs(
30170
- "div",
30116
+ Box,
30171
30117
  {
30172
30118
  className: cn(
30173
30119
  "inline-flex items-center gap-2 rounded-container border backdrop-blur-sm",
@@ -30176,18 +30122,8 @@ function StatBadge({
30176
30122
  className
30177
30123
  ),
30178
30124
  children: [
30179
- resolvedAsset ? /* @__PURE__ */ jsx(
30180
- "img",
30181
- {
30182
- src: resolvedAsset.url,
30183
- alt: "",
30184
- width: 16,
30185
- height: 16,
30186
- style: { imageRendering: "pixelated", objectFit: "contain" },
30187
- className: "flex-shrink-0"
30188
- }
30189
- ) : 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,
30190
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-medium", children: label }),
30125
+ 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,
30126
+ /* @__PURE__ */ jsx(Typography, { as: "span", className: "text-muted-foreground font-medium", children: label }),
30191
30127
  format === "hearts" && max && /* @__PURE__ */ jsx(
30192
30128
  HealthBar,
30193
30129
  {
@@ -30213,7 +30149,7 @@ function StatBadge({
30213
30149
  size: size === "lg" ? "md" : "sm"
30214
30150
  }
30215
30151
  ),
30216
- format === "text" && /* @__PURE__ */ jsx("span", { className: "font-bold text-foreground", children: value })
30152
+ format === "text" && /* @__PURE__ */ jsx(Typography, { as: "span", className: "font-bold text-foreground", children: value })
30217
30153
  ]
30218
30154
  }
30219
30155
  );
@@ -30223,6 +30159,9 @@ var init_StatBadge = __esm({
30223
30159
  "components/game/2d/molecules/StatBadge.tsx"() {
30224
30160
  init_cn();
30225
30161
  init_Icon();
30162
+ init_Box();
30163
+ init_Typography();
30164
+ init_GameIcon();
30226
30165
  init_HealthBar();
30227
30166
  init_ScoreDisplay();
30228
30167
  sizeMap15 = {
@@ -30400,9 +30339,9 @@ function GameHud({
30400
30339
  if (position === "corners") {
30401
30340
  const leftStats = stats.slice(0, Math.ceil(stats.length / 2));
30402
30341
  const rightStats = stats.slice(Math.ceil(stats.length / 2));
30403
- return /* @__PURE__ */ jsxs("div", { className: cn("relative", positionMap[position], className), children: [
30404
- /* @__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)) }),
30405
- /* @__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)) })
30342
+ return /* @__PURE__ */ jsxs(Box, { position: "relative", className: cn(positionMap[position], className), children: [
30343
+ /* @__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)) }),
30344
+ /* @__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)) })
30406
30345
  ] });
30407
30346
  }
30408
30347
  if (position === "top" || position === "bottom") {
@@ -30411,7 +30350,7 @@ function GameHud({
30411
30350
  const rightStats = stats.slice(mid);
30412
30351
  const isTop = position === "top";
30413
30352
  return /* @__PURE__ */ jsxs(
30414
- "div",
30353
+ Box,
30415
30354
  {
30416
30355
  className: cn(
30417
30356
  "flex items-center justify-between w-full",
@@ -30421,17 +30360,18 @@ function GameHud({
30421
30360
  className
30422
30361
  ),
30423
30362
  children: [
30424
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-3 flex-shrink-0", children: leftStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) }),
30425
- 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)) })
30363
+ /* @__PURE__ */ jsx(Box, { className: "flex items-center gap-3 flex-shrink-0", children: leftStats.map((stat, i) => /* @__PURE__ */ jsx(StatBadge, { ...stat, size }, i)) }),
30364
+ 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)) })
30426
30365
  ]
30427
30366
  }
30428
30367
  );
30429
30368
  }
30430
30369
  return /* @__PURE__ */ jsx(
30431
- "div",
30370
+ Box,
30432
30371
  {
30372
+ position: "relative",
30433
30373
  className: cn(
30434
- "relative z-10 flex items-center gap-4 px-4 py-2",
30374
+ "z-10 flex items-center gap-4 px-4 py-2",
30435
30375
  transparent ? "bg-black/30 backdrop-blur-sm" : "bg-surface/90 backdrop-blur-sm",
30436
30376
  className
30437
30377
  ),
@@ -30443,6 +30383,7 @@ var positionMap, DEFAULT_HUD_STATS;
30443
30383
  var init_GameHud = __esm({
30444
30384
  "components/game/2d/molecules/GameHud.tsx"() {
30445
30385
  init_cn();
30386
+ init_Box();
30446
30387
  init_StatBadge();
30447
30388
  positionMap = {
30448
30389
  corners: "inset-0 pointer-events-none"
@@ -30483,7 +30424,7 @@ function GameMenu({
30483
30424
  [eventBus, onSelect]
30484
30425
  );
30485
30426
  return /* @__PURE__ */ jsxs(
30486
- "div",
30427
+ Box,
30487
30428
  {
30488
30429
  className: cn(
30489
30430
  "min-h-screen w-full flex flex-col items-center justify-center p-8",
@@ -30493,18 +30434,12 @@ function GameMenu({
30493
30434
  background: background ?? "linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f0e17 100%)"
30494
30435
  },
30495
30436
  children: [
30496
- /* @__PURE__ */ jsxs("div", { className: "text-center mb-12 animate-fade-in", children: [
30497
- logo && /* @__PURE__ */ jsx(
30498
- "img",
30499
- {
30500
- src: logo.url,
30501
- alt: title,
30502
- className: "h-24 w-auto mx-auto mb-6 drop-shadow-2xl"
30503
- }
30504
- ),
30437
+ /* @__PURE__ */ jsxs(Box, { className: "text-center mb-12 animate-fade-in", children: [
30438
+ logo && /* @__PURE__ */ jsx(GameIcon, { assetUrl: logo, icon: "image", size: 96, alt: title, className: "h-24 w-auto mx-auto mb-6 drop-shadow-2xl" }),
30505
30439
  /* @__PURE__ */ jsx(
30506
- "h1",
30440
+ Typography,
30507
30441
  {
30442
+ variant: "h1",
30508
30443
  className: "text-5xl md:text-7xl font-bold text-[var(--color-foreground)] tracking-tight",
30509
30444
  style: {
30510
30445
  textShadow: "0 4px 12px rgba(0,0,0,0.5)"
@@ -30512,9 +30447,9 @@ function GameMenu({
30512
30447
  children: title
30513
30448
  }
30514
30449
  ),
30515
- subtitle && /* @__PURE__ */ jsx("p", { className: "mt-2 text-lg text-muted-foreground tracking-widest uppercase", children: subtitle })
30450
+ subtitle && /* @__PURE__ */ jsx(Typography, { variant: "body", className: "mt-2 text-lg text-muted-foreground tracking-widest uppercase", children: subtitle })
30516
30451
  ] }),
30517
- /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 w-full max-w-md", children: resolvedOptions.map((option, index) => /* @__PURE__ */ jsx(
30452
+ /* @__PURE__ */ jsx(Box, { className: "flex flex-col gap-4 w-full max-w-md", children: resolvedOptions.map((option, index) => /* @__PURE__ */ jsx(
30518
30453
  ChoiceButton,
30519
30454
  {
30520
30455
  text: option.label,
@@ -30525,9 +30460,9 @@ function GameMenu({
30525
30460
  },
30526
30461
  index
30527
30462
  )) }),
30528
- /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 pointer-events-none overflow-hidden", children: [
30529
- /* @__PURE__ */ jsx("div", { className: "absolute top-1/4 left-1/4 w-64 h-64 bg-info/10 rounded-container blur-3xl" }),
30530
- /* @__PURE__ */ jsx("div", { className: "absolute bottom-1/4 right-1/4 w-96 h-96 bg-accent/10 rounded-container blur-3xl" })
30463
+ /* @__PURE__ */ jsxs(Box, { position: "absolute", className: "inset-0 pointer-events-none overflow-hidden", children: [
30464
+ /* @__PURE__ */ jsx(Box, { position: "absolute", className: "top-1/4 left-1/4 w-64 h-64 bg-info/10 rounded-container blur-3xl" }),
30465
+ /* @__PURE__ */ jsx(Box, { position: "absolute", className: "bottom-1/4 right-1/4 w-96 h-96 bg-accent/10 rounded-container blur-3xl" })
30531
30466
  ] })
30532
30467
  ]
30533
30468
  }
@@ -30539,6 +30474,9 @@ var init_GameMenu = __esm({
30539
30474
  "use client";
30540
30475
  init_cn();
30541
30476
  init_useEventBus();
30477
+ init_Box();
30478
+ init_Typography();
30479
+ init_GameIcon();
30542
30480
  init_ChoiceButton();
30543
30481
  DEFAULT_MENU_OPTIONS = [
30544
30482
  { label: "New Game", event: "NEW_GAME", variant: "primary" },
@@ -30977,7 +30915,7 @@ function GameAudioToggle({
30977
30915
  onClick: handleToggle,
30978
30916
  className: cn("text-lg leading-none px-2", className),
30979
30917
  "aria-pressed": muted,
30980
- 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}"
30918
+ 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}"
30981
30919
  }
30982
30920
  );
30983
30921
  }
@@ -30987,6 +30925,7 @@ var init_GameAudioToggle = __esm({
30987
30925
  init_atoms();
30988
30926
  init_cn();
30989
30927
  init_GameAudioProvider();
30928
+ init_GameIcon();
30990
30929
  GameAudioToggle.displayName = "GameAudioToggle";
30991
30930
  }
30992
30931
  });