@malilion/block-ui-react 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/dist/components/actions/ContextMenu/ContextMenu.d.ts.map +1 -1
  2. package/dist/components/actions/ContextMenu/ContextMenu.js +4 -2
  3. package/dist/components/actions/ContextMenu/ContextMenu.js.map +1 -1
  4. package/dist/components/actions/ContextMenu/ContextMenu.types.d.ts +1 -1
  5. package/dist/components/actions/ContextMenu/ContextMenu.types.d.ts.map +1 -1
  6. package/dist/components/cards/AchievementCard/AchievementCard.d.ts.map +1 -1
  7. package/dist/components/cards/AchievementCard/AchievementCard.js +6 -4
  8. package/dist/components/cards/AchievementCard/AchievementCard.js.map +1 -1
  9. package/dist/components/cards/PlayerCard/PlayerCard.d.ts.map +1 -1
  10. package/dist/components/cards/PlayerCard/PlayerCard.js +7 -5
  11. package/dist/components/cards/PlayerCard/PlayerCard.js.map +1 -1
  12. package/dist/components/cards/QuestCard/QuestCard.d.ts.map +1 -1
  13. package/dist/components/cards/QuestCard/QuestCard.js +9 -7
  14. package/dist/components/cards/QuestCard/QuestCard.js.map +1 -1
  15. package/dist/components/cards/ServerBrowser/ServerBrowser.d.ts.map +1 -1
  16. package/dist/components/cards/ServerBrowser/ServerBrowser.js +27 -25
  17. package/dist/components/cards/ServerBrowser/ServerBrowser.js.map +1 -1
  18. package/dist/components/cards/ServerBrowser/ServerBrowser.types.d.ts +2 -2
  19. package/dist/components/cards/ServerBrowser/ServerBrowser.types.d.ts.map +1 -1
  20. package/dist/components/cards/ServerCard/ServerCard.d.ts.map +1 -1
  21. package/dist/components/cards/ServerCard/ServerCard.js +10 -8
  22. package/dist/components/cards/ServerCard/ServerCard.js.map +1 -1
  23. package/dist/components/cards/WorldBrowser/WorldBrowser.d.ts.map +1 -1
  24. package/dist/components/cards/WorldBrowser/WorldBrowser.js +20 -18
  25. package/dist/components/cards/WorldBrowser/WorldBrowser.js.map +1 -1
  26. package/dist/components/cards/WorldBrowser/WorldBrowser.types.d.ts +2 -2
  27. package/dist/components/cards/WorldBrowser/WorldBrowser.types.d.ts.map +1 -1
  28. package/dist/components/cards/WorldCard/WorldCard.d.ts.map +1 -1
  29. package/dist/components/cards/WorldCard/WorldCard.js +16 -6
  30. package/dist/components/cards/WorldCard/WorldCard.js.map +1 -1
  31. package/dist/components/crafting/Anvil/Anvil.d.ts.map +1 -1
  32. package/dist/components/crafting/Anvil/Anvil.js +9 -7
  33. package/dist/components/crafting/Anvil/Anvil.js.map +1 -1
  34. package/dist/components/crafting/Anvil/Anvil.types.d.ts +1 -1
  35. package/dist/components/crafting/Anvil/Anvil.types.d.ts.map +1 -1
  36. package/dist/components/crafting/BrewingStand/BrewingStand.d.ts.map +1 -1
  37. package/dist/components/crafting/BrewingStand/BrewingStand.js +11 -20
  38. package/dist/components/crafting/BrewingStand/BrewingStand.js.map +1 -1
  39. package/dist/components/crafting/BrewingStand/BrewingStand.types.d.ts +1 -1
  40. package/dist/components/crafting/BrewingStand/BrewingStand.types.d.ts.map +1 -1
  41. package/dist/components/crafting/BrewingStand/BrewingStand.types.js.map +1 -1
  42. package/dist/components/crafting/CraftingGrid/CraftingGrid.d.ts.map +1 -1
  43. package/dist/components/crafting/CraftingGrid/CraftingGrid.js +4 -2
  44. package/dist/components/crafting/CraftingGrid/CraftingGrid.js.map +1 -1
  45. package/dist/components/crafting/CraftingResult/CraftingResult.d.ts.map +1 -1
  46. package/dist/components/crafting/CraftingResult/CraftingResult.js +5 -2
  47. package/dist/components/crafting/CraftingResult/CraftingResult.js.map +1 -1
  48. package/dist/components/crafting/CraftingResult/CraftingResult.types.d.ts +1 -1
  49. package/dist/components/crafting/CraftingResult/CraftingResult.types.d.ts.map +1 -1
  50. package/dist/components/crafting/CraftingTable/CraftingTable.d.ts.map +1 -1
  51. package/dist/components/crafting/CraftingTable/CraftingTable.js +5 -3
  52. package/dist/components/crafting/CraftingTable/CraftingTable.js.map +1 -1
  53. package/dist/components/crafting/CraftingTable/CraftingTable.types.d.ts +2 -2
  54. package/dist/components/crafting/CraftingTable/CraftingTable.types.d.ts.map +1 -1
  55. package/dist/components/crafting/EnchantingTable/EnchantingTable.d.ts.map +1 -1
  56. package/dist/components/crafting/EnchantingTable/EnchantingTable.js +15 -13
  57. package/dist/components/crafting/EnchantingTable/EnchantingTable.js.map +1 -1
  58. package/dist/components/crafting/EnchantingTable/EnchantingTable.types.d.ts +1 -1
  59. package/dist/components/crafting/EnchantingTable/EnchantingTable.types.d.ts.map +1 -1
  60. package/dist/components/crafting/Furnace/Furnace.d.ts.map +1 -1
  61. package/dist/components/crafting/Furnace/Furnace.js +11 -16
  62. package/dist/components/crafting/Furnace/Furnace.js.map +1 -1
  63. package/dist/components/crafting/Furnace/Furnace.types.d.ts +1 -1
  64. package/dist/components/crafting/Furnace/Furnace.types.d.ts.map +1 -1
  65. package/dist/components/crafting/Furnace/Furnace.types.js.map +1 -1
  66. package/dist/components/crafting/RecipeBook/RecipeBook.d.ts.map +1 -1
  67. package/dist/components/crafting/RecipeBook/RecipeBook.js +17 -15
  68. package/dist/components/crafting/RecipeBook/RecipeBook.js.map +1 -1
  69. package/dist/components/crafting/RecipeBook/RecipeBook.types.d.ts +1 -1
  70. package/dist/components/crafting/RecipeBook/RecipeBook.types.d.ts.map +1 -1
  71. package/dist/components/crafting/TradingUI/TradingUI.d.ts +1 -1
  72. package/dist/components/crafting/TradingUI/TradingUI.d.ts.map +1 -1
  73. package/dist/components/crafting/TradingUI/TradingUI.js +14 -13
  74. package/dist/components/crafting/TradingUI/TradingUI.js.map +1 -1
  75. package/dist/components/crafting/TradingUI/TradingUI.types.d.ts +1 -1
  76. package/dist/components/crafting/TradingUI/TradingUI.types.d.ts.map +1 -1
  77. package/dist/components/crafting/TradingUI/TradingUI.types.js.map +1 -1
  78. package/dist/components/display/Avatar/Avatar.d.ts.map +1 -1
  79. package/dist/components/display/Avatar/Avatar.js +3 -7
  80. package/dist/components/display/Avatar/Avatar.js.map +1 -1
  81. package/dist/components/display/BlockTable/BlockTable.d.ts.map +1 -1
  82. package/dist/components/display/BlockTable/BlockTable.js +4 -2
  83. package/dist/components/display/BlockTable/BlockTable.js.map +1 -1
  84. package/dist/components/display/BlockTable/BlockTable.types.d.ts +1 -1
  85. package/dist/components/display/BlockTable/BlockTable.types.d.ts.map +1 -1
  86. package/dist/components/display/SkillTree/SkillTree.d.ts.map +1 -1
  87. package/dist/components/display/SkillTree/SkillTree.js +16 -15
  88. package/dist/components/display/SkillTree/SkillTree.js.map +1 -1
  89. package/dist/components/display/SkillTree/SkillTree.types.d.ts +1 -1
  90. package/dist/components/display/SkillTree/SkillTree.types.d.ts.map +1 -1
  91. package/dist/components/feedback/Alert/BlockAlert.d.ts.map +1 -1
  92. package/dist/components/feedback/Alert/BlockAlert.js +4 -2
  93. package/dist/components/feedback/Alert/BlockAlert.js.map +1 -1
  94. package/dist/components/feedback/Alert/BlockAlert.types.d.ts +1 -1
  95. package/dist/components/feedback/Alert/BlockAlert.types.d.ts.map +1 -1
  96. package/dist/components/feedback/Alert/BlockAlert.types.js.map +1 -1
  97. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.d.ts.map +1 -1
  98. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.js +5 -3
  99. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.js.map +1 -1
  100. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.types.d.ts +2 -2
  101. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.types.d.ts.map +1 -1
  102. package/dist/components/feedback/Drawer/Drawer.d.ts.map +1 -1
  103. package/dist/components/feedback/Drawer/Drawer.js +3 -2
  104. package/dist/components/feedback/Drawer/Drawer.js.map +1 -1
  105. package/dist/components/feedback/Loading/BlockLoading.d.ts.map +1 -1
  106. package/dist/components/feedback/Loading/BlockLoading.js +4 -2
  107. package/dist/components/feedback/Loading/BlockLoading.js.map +1 -1
  108. package/dist/components/feedback/Loading/BlockLoading.types.d.ts +1 -1
  109. package/dist/components/feedback/Loading/BlockLoading.types.d.ts.map +1 -1
  110. package/dist/components/feedback/Modal/BlockModal.d.ts.map +1 -1
  111. package/dist/components/feedback/Modal/BlockModal.js +3 -2
  112. package/dist/components/feedback/Modal/BlockModal.js.map +1 -1
  113. package/dist/components/feedback/Progress/BlockProgress.d.ts.map +1 -1
  114. package/dist/components/feedback/Progress/BlockProgress.js +3 -1
  115. package/dist/components/feedback/Progress/BlockProgress.js.map +1 -1
  116. package/dist/components/feedback/Toast/Toast.d.ts +1 -1
  117. package/dist/components/feedback/Toast/Toast.d.ts.map +1 -1
  118. package/dist/components/feedback/Toast/Toast.js +6 -4
  119. package/dist/components/feedback/Toast/Toast.js.map +1 -1
  120. package/dist/components/feedback/Toast/Toast.types.d.ts +1 -1
  121. package/dist/components/feedback/Toast/Toast.types.d.ts.map +1 -1
  122. package/dist/components/forms/NumberInput/NumberInput.d.ts.map +1 -1
  123. package/dist/components/forms/NumberInput/NumberInput.js +4 -2
  124. package/dist/components/forms/NumberInput/NumberInput.js.map +1 -1
  125. package/dist/components/hud/ArmorBar/ArmorBar.d.ts.map +1 -1
  126. package/dist/components/hud/ArmorBar/ArmorBar.js +4 -2
  127. package/dist/components/hud/ArmorBar/ArmorBar.js.map +1 -1
  128. package/dist/components/hud/BiomeIndicator/BiomeIndicator.d.ts.map +1 -1
  129. package/dist/components/hud/BiomeIndicator/BiomeIndicator.js +4 -2
  130. package/dist/components/hud/BiomeIndicator/BiomeIndicator.js.map +1 -1
  131. package/dist/components/hud/CoordinatesHUD/CoordinatesHUD.d.ts.map +1 -1
  132. package/dist/components/hud/CoordinatesHUD/CoordinatesHUD.js +9 -7
  133. package/dist/components/hud/CoordinatesHUD/CoordinatesHUD.js.map +1 -1
  134. package/dist/components/hud/DayNightIndicator/DayNightIndicator.d.ts.map +1 -1
  135. package/dist/components/hud/DayNightIndicator/DayNightIndicator.js +7 -11
  136. package/dist/components/hud/DayNightIndicator/DayNightIndicator.js.map +1 -1
  137. package/dist/components/hud/DayNightIndicator/DayNightIndicator.utils.d.ts +4 -1
  138. package/dist/components/hud/DayNightIndicator/DayNightIndicator.utils.d.ts.map +1 -1
  139. package/dist/components/hud/DayNightIndicator/DayNightIndicator.utils.js +5 -2
  140. package/dist/components/hud/DayNightIndicator/DayNightIndicator.utils.js.map +1 -1
  141. package/dist/components/hud/HealthBar/HealthBar.d.ts.map +1 -1
  142. package/dist/components/hud/HealthBar/HealthBar.js +4 -2
  143. package/dist/components/hud/HealthBar/HealthBar.js.map +1 -1
  144. package/dist/components/hud/HungerBar/HungerBar.d.ts.map +1 -1
  145. package/dist/components/hud/HungerBar/HungerBar.js +4 -2
  146. package/dist/components/hud/HungerBar/HungerBar.js.map +1 -1
  147. package/dist/components/hud/MiniMap/MiniMap.d.ts.map +1 -1
  148. package/dist/components/hud/MiniMap/MiniMap.js +8 -7
  149. package/dist/components/hud/MiniMap/MiniMap.js.map +1 -1
  150. package/dist/components/hud/MiniMap/MiniMap.utils.d.ts +10 -2
  151. package/dist/components/hud/MiniMap/MiniMap.utils.d.ts.map +1 -1
  152. package/dist/components/hud/MiniMap/MiniMap.utils.js +12 -15
  153. package/dist/components/hud/MiniMap/MiniMap.utils.js.map +1 -1
  154. package/dist/components/hud/PlayerHUD/PlayerHUD.d.ts.map +1 -1
  155. package/dist/components/hud/PlayerHUD/PlayerHUD.js +4 -2
  156. package/dist/components/hud/PlayerHUD/PlayerHUD.js.map +1 -1
  157. package/dist/components/hud/PointsBar/PointsBar.d.ts.map +1 -1
  158. package/dist/components/hud/PointsBar/PointsBar.js +3 -1
  159. package/dist/components/hud/PointsBar/PointsBar.js.map +1 -1
  160. package/dist/components/hud/Scoreboard/Scoreboard.d.ts.map +1 -1
  161. package/dist/components/hud/Scoreboard/Scoreboard.js +9 -11
  162. package/dist/components/hud/Scoreboard/Scoreboard.js.map +1 -1
  163. package/dist/components/hud/WeatherIndicator/WeatherIndicator.d.ts.map +1 -1
  164. package/dist/components/hud/WeatherIndicator/WeatherIndicator.js +7 -4
  165. package/dist/components/hud/WeatherIndicator/WeatherIndicator.js.map +1 -1
  166. package/dist/components/hud/WeatherIndicator/WeatherIndicator.utils.js +1 -8
  167. package/dist/components/hud/WeatherIndicator/WeatherIndicator.utils.js.map +1 -1
  168. package/dist/components/hud/XPBar/XPBar.d.ts.map +1 -1
  169. package/dist/components/hud/XPBar/XPBar.js +6 -4
  170. package/dist/components/hud/XPBar/XPBar.js.map +1 -1
  171. package/dist/components/inventory/DurabilityBar/DurabilityBar.d.ts.map +1 -1
  172. package/dist/components/inventory/DurabilityBar/DurabilityBar.js +4 -2
  173. package/dist/components/inventory/DurabilityBar/DurabilityBar.js.map +1 -1
  174. package/dist/components/inventory/Hotbar/Hotbar.d.ts.map +1 -1
  175. package/dist/components/inventory/Hotbar/Hotbar.js +4 -2
  176. package/dist/components/inventory/Hotbar/Hotbar.js.map +1 -1
  177. package/dist/components/inventory/Inventory/Inventory.d.ts.map +1 -1
  178. package/dist/components/inventory/Inventory/Inventory.js +4 -2
  179. package/dist/components/inventory/Inventory/Inventory.js.map +1 -1
  180. package/dist/components/inventory/InventoryGrid/InventoryGrid.d.ts.map +1 -1
  181. package/dist/components/inventory/InventoryGrid/InventoryGrid.js +4 -2
  182. package/dist/components/inventory/InventoryGrid/InventoryGrid.js.map +1 -1
  183. package/dist/components/inventory/InventorySlot/InventorySlot.d.ts.map +1 -1
  184. package/dist/components/inventory/InventorySlot/InventorySlot.js +3 -1
  185. package/dist/components/inventory/InventorySlot/InventorySlot.js.map +1 -1
  186. package/dist/components/inventory/ItemStack/ItemStack.d.ts.map +1 -1
  187. package/dist/components/inventory/ItemStack/ItemStack.js +3 -1
  188. package/dist/components/inventory/ItemStack/ItemStack.js.map +1 -1
  189. package/dist/components/inventory/ItemStack/ItemStack.utils.d.ts +2 -1
  190. package/dist/components/inventory/ItemStack/ItemStack.utils.d.ts.map +1 -1
  191. package/dist/components/inventory/ItemStack/ItemStack.utils.js +6 -2
  192. package/dist/components/inventory/ItemStack/ItemStack.utils.js.map +1 -1
  193. package/dist/components/inventory/ItemTooltip/ItemTooltip.d.ts.map +1 -1
  194. package/dist/components/inventory/ItemTooltip/ItemTooltip.js +3 -1
  195. package/dist/components/inventory/ItemTooltip/ItemTooltip.js.map +1 -1
  196. package/dist/components/navigation/BlockPagination/BlockPagination.d.ts.map +1 -1
  197. package/dist/components/navigation/BlockPagination/BlockPagination.js +9 -12
  198. package/dist/components/navigation/BlockPagination/BlockPagination.js.map +1 -1
  199. package/dist/components/navigation/BlockPagination/BlockPagination.types.d.ts +1 -1
  200. package/dist/components/navigation/BlockPagination/BlockPagination.types.d.ts.map +1 -1
  201. package/dist/components/navigation/BlockSidebar/BlockSidebar.d.ts.map +1 -1
  202. package/dist/components/navigation/BlockSidebar/BlockSidebar.js +4 -2
  203. package/dist/components/navigation/BlockSidebar/BlockSidebar.js.map +1 -1
  204. package/dist/components/navigation/BlockSidebar/BlockSidebar.types.d.ts +1 -1
  205. package/dist/components/navigation/BlockSidebar/BlockSidebar.types.d.ts.map +1 -1
  206. package/dist/components/navigation/BlockStepper/BlockStepper.d.ts.map +1 -1
  207. package/dist/components/navigation/BlockStepper/BlockStepper.js +4 -2
  208. package/dist/components/navigation/BlockStepper/BlockStepper.js.map +1 -1
  209. package/dist/components/navigation/BlockStepper/BlockStepper.types.d.ts +1 -1
  210. package/dist/components/navigation/BlockStepper/BlockStepper.types.d.ts.map +1 -1
  211. package/dist/components/navigation/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  212. package/dist/components/navigation/Breadcrumb/Breadcrumb.js +4 -2
  213. package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -1
  214. package/dist/components/navigation/Breadcrumb/Breadcrumb.types.d.ts +1 -1
  215. package/dist/components/navigation/Breadcrumb/Breadcrumb.types.d.ts.map +1 -1
  216. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.d.ts.map +1 -1
  217. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.js +4 -2
  218. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.js.map +1 -1
  219. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.types.d.ts +1 -1
  220. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.types.d.ts.map +1 -1
  221. package/dist/components/social/ChatWindow/ChatWindow.d.ts.map +1 -1
  222. package/dist/components/social/ChatWindow/ChatWindow.js +10 -7
  223. package/dist/components/social/ChatWindow/ChatWindow.js.map +1 -1
  224. package/dist/components/social/ChatWindow/ChatWindow.types.d.ts +2 -2
  225. package/dist/components/social/ChatWindow/ChatWindow.types.d.ts.map +1 -1
  226. package/dist/components/social/ChatWindow/ChatWindow.types.js.map +1 -1
  227. package/dist/components/social/CommandConsole/CommandConsole.d.ts.map +1 -1
  228. package/dist/components/social/CommandConsole/CommandConsole.js +7 -4
  229. package/dist/components/social/CommandConsole/CommandConsole.js.map +1 -1
  230. package/dist/components/social/CommandConsole/CommandConsole.types.d.ts +1 -1
  231. package/dist/components/social/CommandConsole/CommandConsole.types.d.ts.map +1 -1
  232. package/dist/components/social/CommandConsole/CommandConsole.types.js.map +1 -1
  233. package/dist/index.d.ts +1 -0
  234. package/dist/index.d.ts.map +1 -1
  235. package/dist/index.js +5 -3
  236. package/dist/locale/index.d.ts +4 -0
  237. package/dist/locale/index.d.ts.map +1 -0
  238. package/dist/locale/messages.d.ts +289 -0
  239. package/dist/locale/messages.d.ts.map +1 -0
  240. package/dist/locale/messages.js +341 -0
  241. package/dist/locale/messages.js.map +1 -0
  242. package/dist/locale/zhTW.d.ts +4 -0
  243. package/dist/locale/zhTW.d.ts.map +1 -0
  244. package/dist/locale/zhTW.js +331 -0
  245. package/dist/locale/zhTW.js.map +1 -0
  246. package/dist/provider/BlockUIProvider.d.ts.map +1 -1
  247. package/dist/provider/BlockUIProvider.js +10 -3
  248. package/dist/provider/BlockUIProvider.js.map +1 -1
  249. package/dist/provider/BlockUIProvider.types.d.ts +9 -0
  250. package/dist/provider/BlockUIProvider.types.d.ts.map +1 -1
  251. package/dist/provider/context.d.ts +3 -0
  252. package/dist/provider/context.d.ts.map +1 -1
  253. package/dist/provider/context.js +6 -1
  254. package/dist/provider/context.js.map +1 -1
  255. package/dist/provider/index.d.ts +1 -1
  256. package/dist/provider/index.d.ts.map +1 -1
  257. package/package.json +4 -4
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { formatNumber } from "../../../utils/number.js";
3
4
  import Scoreboard_module_default from "./Scoreboard.module.js";
4
5
  import { entryKey, sortEntries } from "./Scoreboard.utils.js";
@@ -9,7 +10,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
9
10
  * Sidebar scoreboard: an objective title over name / score rows, sorted by
10
11
  * score. A captioned table, so screen readers announce each name with its score.
11
12
  */
12
- var Scoreboard = forwardRef(function Scoreboard({ title, entries, sort = "desc", maxEntries = 15, highlightId, showRank = false, emptyText = "No scores yet", className, ...rest }, ref) {
13
+ var Scoreboard = forwardRef(function Scoreboard({ title, entries, sort = "desc", maxEntries = 15, highlightId, showRank = false, emptyText, className, ...rest }, ref) {
14
+ const m = useBlockUIMessages();
13
15
  const captionId = useId();
14
16
  const sorted = sortEntries(entries, sort);
15
17
  const visible = sorted.slice(0, Math.max(0, maxEntries));
@@ -32,22 +34,22 @@ var Scoreboard = forwardRef(function Scoreboard({ title, entries, sort = "desc",
32
34
  children: /* @__PURE__ */ jsxs("tr", { children: [
33
35
  showRank ? /* @__PURE__ */ jsx("th", {
34
36
  scope: "col",
35
- children: "Rank"
37
+ children: m.scoreboard.rank
36
38
  }) : null,
37
39
  /* @__PURE__ */ jsx("th", {
38
40
  scope: "col",
39
- children: "Name"
41
+ children: m.scoreboard.name
40
42
  }),
41
43
  /* @__PURE__ */ jsx("th", {
42
44
  scope: "col",
43
- children: "Score"
45
+ children: m.scoreboard.score
44
46
  })
45
47
  ] })
46
48
  }),
47
49
  /* @__PURE__ */ jsx("tbody", { children: visible.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
48
50
  colSpan: showRank ? 3 : 2,
49
51
  className: Scoreboard_module_default.empty,
50
- children: emptyText
52
+ children: emptyText ?? m.scoreboard.empty
51
53
  }) }) : visible.map((entry, index) => {
52
54
  const key = entryKey(entry, index);
53
55
  const highlighted = highlightId !== void 0 && key === highlightId;
@@ -73,13 +75,9 @@ var Scoreboard = forwardRef(function Scoreboard({ title, entries, sort = "desc",
73
75
  }, key);
74
76
  }) })
75
77
  ]
76
- }), hidden > 0 ? /* @__PURE__ */ jsxs("p", {
78
+ }), hidden > 0 ? /* @__PURE__ */ jsx("p", {
77
79
  className: Scoreboard_module_default.more,
78
- children: [
79
- "+",
80
- hidden,
81
- " more"
82
- ]
80
+ children: m.scoreboard.more(hidden)
83
81
  }) : null]
84
82
  });
85
83
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Scoreboard.js","names":["styles"],"sources":["../../../../src/components/hud/Scoreboard/Scoreboard.tsx"],"sourcesContent":["import { forwardRef, useId } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber } from \"../../../utils/number\";\nimport styles from \"./Scoreboard.module.css\";\nimport type { ScoreboardProps } from \"./Scoreboard.types\";\nimport { entryKey, sortEntries } from \"./Scoreboard.utils\";\n\n/**\n * Sidebar scoreboard: an objective title over name / score rows, sorted by\n * score. A captioned table, so screen readers announce each name with its score.\n */\nexport const Scoreboard = forwardRef<HTMLDivElement, ScoreboardProps>(function Scoreboard(\n {\n title,\n entries,\n sort = \"desc\",\n maxEntries = 15,\n highlightId,\n showRank = false,\n emptyText = \"No scores yet\",\n className,\n ...rest\n },\n ref,\n) {\n const captionId = useId();\n const sorted = sortEntries(entries, sort);\n const visible = sorted.slice(0, Math.max(0, maxEntries));\n const hidden = sorted.length - visible.length;\n\n return (\n <div ref={ref} className={cx(styles.scoreboard, className)} {...rest}>\n <table className={styles.table} aria-labelledby={captionId}>\n <caption id={captionId} className={styles.title}>\n {title}\n </caption>\n <thead className=\"block-visually-hidden\">\n <tr>\n {showRank ? <th scope=\"col\">Rank</th> : null}\n <th scope=\"col\">Name</th>\n <th scope=\"col\">Score</th>\n </tr>\n </thead>\n <tbody>\n {visible.length === 0 ? (\n <tr>\n <td colSpan={showRank ? 3 : 2} className={styles.empty}>\n {emptyText}\n </td>\n </tr>\n ) : (\n visible.map((entry, index) => {\n const key = entryKey(entry, index);\n const highlighted = highlightId !== undefined && key === highlightId;\n return (\n <tr\n key={key}\n className={styles.row}\n data-highlighted={highlighted || undefined}\n aria-current={highlighted ? \"true\" : undefined}\n >\n {showRank ? <td className={styles.rank}>{index + 1}</td> : null}\n <th scope=\"row\" className={styles.name}>\n {entry.name}\n </th>\n <td className={styles.score}>{formatNumber(entry.score)}</td>\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n {hidden > 0 ? <p className={styles.more}>+{hidden} more</p> : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,aAAa,WAA4C,SAAS,WAC7E,EACE,OACA,SACA,OAAO,QACP,aAAa,IACb,aACA,WAAW,OACX,YAAY,iBACZ,WACA,GAAG,QAEL,KACA;CACA,MAAM,YAAY,MAAM;CACxB,MAAM,SAAS,YAAY,SAAS,IAAI;CACxC,MAAM,UAAU,OAAO,MAAM,GAAG,KAAK,IAAI,GAAG,UAAU,CAAC;CACvD,MAAM,SAAS,OAAO,SAAS,QAAQ;CAEvC,OACE,qBAAC,OAAD;EAAU;EAAK,WAAW,GAAGA,0BAAO,YAAY,SAAS;EAAG,GAAI;EAAhE,UAAA,CACE,qBAAC,SAAD;GAAO,WAAWA,0BAAO;GAAO,mBAAiB;GAAjD,UAAA;IACE,oBAAC,WAAD;KAAS,IAAI;KAAW,WAAWA,0BAAO;KACvC,UAAA;IACM,CAAA;IACT,oBAAC,SAAD;KAAO,WAAU;KACf,UAAA,qBAAC,MAAD,EAAA,UAAA;MACG,WAAW,oBAAC,MAAD;OAAI,OAAM;OAAM,UAAA;MAAQ,CAAA,IAAI;MACxC,oBAAC,MAAD;OAAI,OAAM;OAAM,UAAA;MAAQ,CAAA;MACxB,oBAAC,MAAD;OAAI,OAAM;OAAM,UAAA;MAAS,CAAA;KACvB,EAAA,CAAA;IACC,CAAA;IACP,oBAAC,SAAD,EAAA,UACG,QAAQ,WAAW,IAClB,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;KAAI,SAAS,WAAW,IAAI;KAAG,WAAWA,0BAAO;KAC9C,UAAA;IACC,CAAA,EACF,CAAA,IAEJ,QAAQ,KAAK,OAAO,UAAU;KAC5B,MAAM,MAAM,SAAS,OAAO,KAAK;KACjC,MAAM,cAAc,gBAAgB,KAAA,KAAa,QAAQ;KACzD,OACE,qBAAC,MAAD;MAEE,WAAWA,0BAAO;MAClB,oBAAkB,eAAe,KAAA;MACjC,gBAAc,cAAc,SAAS,KAAA;MAJvC,UAAA;OAMG,WAAW,oBAAC,MAAD;QAAI,WAAWA,0BAAO;QAAO,UAAA,QAAQ;OAAM,CAAA,IAAI;OAC3D,oBAAC,MAAD;QAAI,OAAM;QAAM,WAAWA,0BAAO;QAC/B,UAAA,MAAM;OACL,CAAA;OACJ,oBAAC,MAAD;QAAI,WAAWA,0BAAO;QAAQ,UAAA,aAAa,MAAM,KAAK;OAAM,CAAA;MAC1D;KAVG,GAAA,GAUH;IAER,CAAC,EAEE,CAAA;GACF;EACN,CAAA,GAAA,SAAS,IAAI,qBAAC,KAAD;GAAG,WAAWA,0BAAO;GAArB,UAAA;IAA2B;IAAE;IAAO;GAAQ;EAAI,CAAA,IAAA,IAC3D;;AAET,CAAC"}
1
+ {"version":3,"file":"Scoreboard.js","names":["styles"],"sources":["../../../../src/components/hud/Scoreboard/Scoreboard.tsx"],"sourcesContent":["import { forwardRef, useId } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber } from \"../../../utils/number\";\nimport styles from \"./Scoreboard.module.css\";\nimport type { ScoreboardProps } from \"./Scoreboard.types\";\nimport { entryKey, sortEntries } from \"./Scoreboard.utils\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\n/**\n * Sidebar scoreboard: an objective title over name / score rows, sorted by\n * score. A captioned table, so screen readers announce each name with its score.\n */\nexport const Scoreboard = forwardRef<HTMLDivElement, ScoreboardProps>(function Scoreboard(\n {\n title,\n entries,\n sort = \"desc\",\n maxEntries = 15,\n highlightId,\n showRank = false,\n emptyText,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const captionId = useId();\n const sorted = sortEntries(entries, sort);\n const visible = sorted.slice(0, Math.max(0, maxEntries));\n const hidden = sorted.length - visible.length;\n\n return (\n <div ref={ref} className={cx(styles.scoreboard, className)} {...rest}>\n <table className={styles.table} aria-labelledby={captionId}>\n <caption id={captionId} className={styles.title}>\n {title}\n </caption>\n <thead className=\"block-visually-hidden\">\n <tr>\n {showRank ? <th scope=\"col\">{m.scoreboard.rank}</th> : null}\n <th scope=\"col\">{m.scoreboard.name}</th>\n <th scope=\"col\">{m.scoreboard.score}</th>\n </tr>\n </thead>\n <tbody>\n {visible.length === 0 ? (\n <tr>\n <td colSpan={showRank ? 3 : 2} className={styles.empty}>\n {emptyText ?? m.scoreboard.empty}\n </td>\n </tr>\n ) : (\n visible.map((entry, index) => {\n const key = entryKey(entry, index);\n const highlighted = highlightId !== undefined && key === highlightId;\n return (\n <tr\n key={key}\n className={styles.row}\n data-highlighted={highlighted || undefined}\n aria-current={highlighted ? \"true\" : undefined}\n >\n {showRank ? <td className={styles.rank}>{index + 1}</td> : null}\n <th scope=\"row\" className={styles.name}>\n {entry.name}\n </th>\n <td className={styles.score}>{formatNumber(entry.score)}</td>\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n {hidden > 0 ? <p className={styles.more}>{m.scoreboard.more(hidden)}</p> : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,aAAa,WAA4C,SAAS,WAC7E,EACE,OACA,SACA,OAAO,QACP,aAAa,IACb,aACA,WAAW,OACX,WACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,YAAY,MAAM;CACxB,MAAM,SAAS,YAAY,SAAS,IAAI;CACxC,MAAM,UAAU,OAAO,MAAM,GAAG,KAAK,IAAI,GAAG,UAAU,CAAC;CACvD,MAAM,SAAS,OAAO,SAAS,QAAQ;CAEvC,OACE,qBAAC,OAAD;EAAU;EAAK,WAAW,GAAGA,0BAAO,YAAY,SAAS;EAAG,GAAI;EAAhE,UAAA,CACE,qBAAC,SAAD;GAAO,WAAWA,0BAAO;GAAO,mBAAiB;GAAjD,UAAA;IACE,oBAAC,WAAD;KAAS,IAAI;KAAW,WAAWA,0BAAO;KACvC,UAAA;IACM,CAAA;IACT,oBAAC,SAAD;KAAO,WAAU;KACf,UAAA,qBAAC,MAAD,EAAA,UAAA;MACG,WAAW,oBAAC,MAAD;OAAI,OAAM;OAAO,UAAA,EAAE,WAAW;MAAS,CAAA,IAAI;MACvD,oBAAC,MAAD;OAAI,OAAM;OAAO,UAAA,EAAE,WAAW;MAAS,CAAA;MACvC,oBAAC,MAAD;OAAI,OAAM;OAAO,UAAA,EAAE,WAAW;MAAU,CAAA;KACtC,EAAA,CAAA;IACC,CAAA;IACP,oBAAC,SAAD,EAAA,UACG,QAAQ,WAAW,IAClB,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;KAAI,SAAS,WAAW,IAAI;KAAG,WAAWA,0BAAO;KAC9C,UAAA,aAAa,EAAE,WAAW;IACzB,CAAA,EACF,CAAA,IAEJ,QAAQ,KAAK,OAAO,UAAU;KAC5B,MAAM,MAAM,SAAS,OAAO,KAAK;KACjC,MAAM,cAAc,gBAAgB,KAAA,KAAa,QAAQ;KACzD,OACE,qBAAC,MAAD;MAEE,WAAWA,0BAAO;MAClB,oBAAkB,eAAe,KAAA;MACjC,gBAAc,cAAc,SAAS,KAAA;MAJvC,UAAA;OAMG,WAAW,oBAAC,MAAD;QAAI,WAAWA,0BAAO;QAAO,UAAA,QAAQ;OAAM,CAAA,IAAI;OAC3D,oBAAC,MAAD;QAAI,OAAM;QAAM,WAAWA,0BAAO;QAC/B,UAAA,MAAM;OACL,CAAA;OACJ,oBAAC,MAAD;QAAI,WAAWA,0BAAO;QAAQ,UAAA,aAAa,MAAM,KAAK;OAAM,CAAA;MAC1D;KAVG,GAAA,GAUH;IAER,CAAC,EAEE,CAAA;GACF;EACN,CAAA,GAAA,SAAS,IAAI,oBAAC,KAAD;GAAG,WAAWA,0BAAO;GAAO,UAAA,EAAE,WAAW,KAAK,MAAM;EAAK,CAAA,IAAI,IACxE;;AAET,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"WeatherIndicator.d.ts","sourceRoot":"","sources":["../../../../src/components/hud/WeatherIndicator/WeatherIndicator.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGtE,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,kHA8B5B,CAAC"}
1
+ {"version":3,"file":"WeatherIndicator.d.ts","sourceRoot":"","sources":["../../../../src/components/hud/WeatherIndicator/WeatherIndicator.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAItE,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,kHAoC5B,CAAC"}
@@ -1,12 +1,14 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import hudChip_module_default from "../hudChip.module.js";
3
4
  import WeatherIndicator_module_default from "./WeatherIndicator.module.js";
4
- import { WEATHER_LABEL, weatherIcon } from "./WeatherIndicator.utils.js";
5
+ import { weatherIcon } from "./WeatherIndicator.utils.js";
5
6
  import { forwardRef } from "react";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
8
  //#region src/components/hud/WeatherIndicator/WeatherIndicator.tsx
8
9
  /** Current weather read-out with a pixel icon and an optional time remaining. */
9
10
  var WeatherIndicator = forwardRef(function WeatherIndicator({ weather, name, remaining, night = false, announce = false, size = "md", className, ...rest }, ref) {
11
+ const m = useBlockUIMessages();
10
12
  const Icon = weatherIcon(weather, night);
11
13
  return /* @__PURE__ */ jsxs("div", {
12
14
  ref,
@@ -24,12 +26,12 @@ var WeatherIndicator = forwardRef(function WeatherIndicator({ weather, name, rem
24
26
  /* @__PURE__ */ jsxs("span", { children: [
25
27
  /* @__PURE__ */ jsx("span", {
26
28
  className: hudChip_module_default.label,
27
- children: "Weather"
29
+ children: m.weatherIndicator.weather
28
30
  }),
29
31
  " ",
30
32
  /* @__PURE__ */ jsx("span", {
31
33
  className: WeatherIndicator_module_default.name,
32
- children: name ?? WEATHER_LABEL[weather]
34
+ children: name ?? (night && weather === "clear" ? m.weatherIndicator.clearNight : m.weatherIndicator.names[weather])
33
35
  })
34
36
  ] }),
35
37
  remaining !== void 0 ? /* @__PURE__ */ jsxs("span", {
@@ -40,7 +42,8 @@ var WeatherIndicator = forwardRef(function WeatherIndicator({ weather, name, rem
40
42
  className: hudChip_module_default.value,
41
43
  children: remaining
42
44
  }),
43
- " left"
45
+ " ",
46
+ m.weatherIndicator.remaining
44
47
  ]
45
48
  }) : null
46
49
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"WeatherIndicator.js","names":["chip","styles"],"sources":["../../../../src/components/hud/WeatherIndicator/WeatherIndicator.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport chip from \"../hudChip.module.css\";\nimport styles from \"./WeatherIndicator.module.css\";\nimport type { WeatherIndicatorProps } from \"./WeatherIndicator.types\";\nimport { WEATHER_LABEL, weatherIcon } from \"./WeatherIndicator.utils\";\n\n/** Current weather read-out with a pixel icon and an optional time remaining. */\nexport const WeatherIndicator = forwardRef<HTMLDivElement, WeatherIndicatorProps>(\n function WeatherIndicator(\n { weather, name, remaining, night = false, announce = false, size = \"md\", className, ...rest },\n ref,\n ) {\n const Icon = weatherIcon(weather, night);\n return (\n <div\n ref={ref}\n role={announce ? \"status\" : undefined}\n data-weather={weather}\n data-size={size}\n className={cx(chip.chip, styles.weather, className)}\n {...rest}\n >\n <span className={cx(chip.icon, styles.icon)} aria-hidden=\"true\">\n <Icon size={size === \"lg\" ? 24 : 16} />\n </span>\n <span>\n <span className={chip.label}>Weather</span>{\" \"}\n <span className={styles.name}>{name ?? WEATHER_LABEL[weather]}</span>\n </span>\n {remaining !== undefined ? (\n <span className={chip.label}>\n · <span className={chip.value}>{remaining}</span> left\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;AAQA,IAAa,mBAAmB,WAC9B,SAAS,iBACP,EAAE,SAAS,MAAM,WAAW,QAAQ,OAAO,WAAW,OAAO,OAAO,MAAM,WAAW,GAAG,QACxF,KACA;CACA,MAAM,OAAO,YAAY,SAAS,KAAK;CACvC,OACE,qBAAC,OAAD;EACO;EACL,MAAM,WAAW,WAAW,KAAA;EAC5B,gBAAc;EACd,aAAW;EACX,WAAW,GAAGA,uBAAK,MAAMC,gCAAO,SAAS,SAAS;EAClD,GAAI;EANN,UAAA;GAQE,oBAAC,QAAD;IAAM,WAAW,GAAGD,uBAAK,MAAMC,gCAAO,IAAI;IAAG,eAAY;IACvD,UAAA,oBAAC,MAAD,EAAM,MAAM,SAAS,OAAO,KAAK,GAAK,CAAA;GAClC,CAAA;GACN,qBAAC,QAAD,EAAA,UAAA;IACE,oBAAC,QAAD;KAAM,WAAWD,uBAAK;KAAO,UAAA;IAAa,CAAA;IAAE;IAC5C,oBAAC,QAAD;KAAM,WAAWC,gCAAO;KAAO,UAAA,QAAQ,cAAc;IAAe,CAAA;GAChE,EAAA,CAAA;GACL,cAAc,KAAA,IACb,qBAAC,QAAD;IAAM,WAAWD,uBAAK;IAAtB,UAAA;KAA6B;KACzB,oBAAC,QAAD;MAAM,WAAWA,uBAAK;MAAQ,UAAA;KAAgB,CAAA;KAAC;IAC7C;GACJ,CAAA,IAAA;EACD;;AAET,CACF"}
1
+ {"version":3,"file":"WeatherIndicator.js","names":["chip","styles"],"sources":["../../../../src/components/hud/WeatherIndicator/WeatherIndicator.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport chip from \"../hudChip.module.css\";\nimport styles from \"./WeatherIndicator.module.css\";\nimport type { WeatherIndicatorProps } from \"./WeatherIndicator.types\";\nimport { weatherIcon } from \"./WeatherIndicator.utils\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\n/** Current weather read-out with a pixel icon and an optional time remaining. */\nexport const WeatherIndicator = forwardRef<HTMLDivElement, WeatherIndicatorProps>(\n function WeatherIndicator(\n { weather, name, remaining, night = false, announce = false, size = \"md\", className, ...rest },\n ref,\n ) {\n const m = useBlockUIMessages();\n const Icon = weatherIcon(weather, night);\n return (\n <div\n ref={ref}\n role={announce ? \"status\" : undefined}\n data-weather={weather}\n data-size={size}\n className={cx(chip.chip, styles.weather, className)}\n {...rest}\n >\n <span className={cx(chip.icon, styles.icon)} aria-hidden=\"true\">\n <Icon size={size === \"lg\" ? 24 : 16} />\n </span>\n <span>\n <span className={chip.label}>{m.weatherIndicator.weather}</span>{\" \"}\n <span className={styles.name}>\n {name ??\n (night && weather === \"clear\"\n ? m.weatherIndicator.clearNight\n : m.weatherIndicator.names[weather])}\n </span>\n </span>\n {remaining !== undefined ? (\n <span className={chip.label}>\n · <span className={chip.value}>{remaining}</span> {m.weatherIndicator.remaining}\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;AASA,IAAa,mBAAmB,WAC9B,SAAS,iBACP,EAAE,SAAS,MAAM,WAAW,QAAQ,OAAO,WAAW,OAAO,OAAO,MAAM,WAAW,GAAG,QACxF,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,OAAO,YAAY,SAAS,KAAK;CACvC,OACE,qBAAC,OAAD;EACO;EACL,MAAM,WAAW,WAAW,KAAA;EAC5B,gBAAc;EACd,aAAW;EACX,WAAW,GAAGA,uBAAK,MAAMC,gCAAO,SAAS,SAAS;EAClD,GAAI;EANN,UAAA;GAQE,oBAAC,QAAD;IAAM,WAAW,GAAGD,uBAAK,MAAMC,gCAAO,IAAI;IAAG,eAAY;IACvD,UAAA,oBAAC,MAAD,EAAM,MAAM,SAAS,OAAO,KAAK,GAAK,CAAA;GAClC,CAAA;GACN,qBAAC,QAAD,EAAA,UAAA;IACE,oBAAC,QAAD;KAAM,WAAWD,uBAAK;KAAQ,UAAA,EAAE,iBAAiB;IAAc,CAAA;IAAE;IACjE,oBAAC,QAAD;KAAM,WAAWC,gCAAO;KACrB,UAAA,SACE,SAAS,YAAY,UAClB,EAAE,iBAAiB,aACnB,EAAE,iBAAiB,MAAM;IAC3B,CAAA;GACF,EAAA,CAAA;GACL,cAAc,KAAA,IACb,qBAAC,QAAD;IAAM,WAAWD,uBAAK;IAAtB,UAAA;KAA6B;KACzB,oBAAC,QAAD;MAAM,WAAWA,uBAAK;MAAQ,UAAA;KAAgB,CAAA;KAAC;KAAE,EAAE,iBAAiB;IAClE;GACJ,CAAA,IAAA;EACD;;AAET,CACF"}
@@ -1,12 +1,5 @@
1
1
  import { CloudIcon, MoonIcon, RainIcon, SnowIcon, SunIcon, ThunderIcon } from "@malilion/block-ui-icons";
2
2
  //#region src/components/hud/WeatherIndicator/WeatherIndicator.utils.ts
3
- var WEATHER_LABEL = {
4
- clear: "Clear",
5
- cloudy: "Cloudy",
6
- rain: "Rain",
7
- thunder: "Thunderstorm",
8
- snow: "Snow"
9
- };
10
3
  function weatherIcon(weather, night) {
11
4
  switch (weather) {
12
5
  case "clear": return night ? MoonIcon : SunIcon;
@@ -17,6 +10,6 @@ function weatherIcon(weather, night) {
17
10
  }
18
11
  }
19
12
  //#endregion
20
- export { WEATHER_LABEL, weatherIcon };
13
+ export { weatherIcon };
21
14
 
22
15
  //# sourceMappingURL=WeatherIndicator.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WeatherIndicator.utils.js","names":[],"sources":["../../../../src/components/hud/WeatherIndicator/WeatherIndicator.utils.ts"],"sourcesContent":["import {\n CloudIcon,\n MoonIcon,\n RainIcon,\n SnowIcon,\n SunIcon,\n ThunderIcon,\n type PixelIcon,\n} from \"@malilion/block-ui-icons\";\nimport type { WeatherType } from \"./WeatherIndicator.types\";\n\nexport const WEATHER_LABEL: Record<WeatherType, string> = {\n clear: \"Clear\",\n cloudy: \"Cloudy\",\n rain: \"Rain\",\n thunder: \"Thunderstorm\",\n snow: \"Snow\",\n};\n\nexport function weatherIcon(weather: WeatherType, night: boolean): PixelIcon {\n switch (weather) {\n case \"clear\":\n return night ? MoonIcon : SunIcon;\n case \"cloudy\":\n return CloudIcon;\n case \"rain\":\n return RainIcon;\n case \"thunder\":\n return ThunderIcon;\n case \"snow\":\n return SnowIcon;\n }\n}\n"],"mappings":";;AAWA,IAAa,gBAA6C;CACxD,OAAO;CACP,QAAQ;CACR,MAAM;CACN,SAAS;CACT,MAAM;AACR;AAEA,SAAgB,YAAY,SAAsB,OAA2B;CAC3E,QAAQ,SAAR;EACE,KAAK,SACH,OAAO,QAAQ,WAAW;EAC5B,KAAK,UACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,QACH,OAAO;CACX;AACF"}
1
+ {"version":3,"file":"WeatherIndicator.utils.js","names":[],"sources":["../../../../src/components/hud/WeatherIndicator/WeatherIndicator.utils.ts"],"sourcesContent":["import {\n CloudIcon,\n MoonIcon,\n RainIcon,\n SnowIcon,\n SunIcon,\n ThunderIcon,\n type PixelIcon,\n} from \"@malilion/block-ui-icons\";\nimport type { WeatherType } from \"./WeatherIndicator.types\";\n\nexport const WEATHER_LABEL: Record<WeatherType, string> = {\n clear: \"Clear\",\n cloudy: \"Cloudy\",\n rain: \"Rain\",\n thunder: \"Thunderstorm\",\n snow: \"Snow\",\n};\n\nexport function weatherIcon(weather: WeatherType, night: boolean): PixelIcon {\n switch (weather) {\n case \"clear\":\n return night ? MoonIcon : SunIcon;\n case \"cloudy\":\n return CloudIcon;\n case \"rain\":\n return RainIcon;\n case \"thunder\":\n return ThunderIcon;\n case \"snow\":\n return SnowIcon;\n }\n}\n"],"mappings":";;AAmBA,SAAgB,YAAY,SAAsB,OAA2B;CAC3E,QAAQ,SAAR;EACE,KAAK,SACH,OAAO,QAAQ,WAAW;EAC5B,KAAK,UACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,QACH,OAAO;CACX;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"XPBar.d.ts","sourceRoot":"","sources":["../../../../src/components/hud/XPBar/XPBar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,6DAA6D;AAC7D,eAAO,MAAM,KAAK,uGAsChB,CAAC"}
1
+ {"version":3,"file":"XPBar.d.ts","sourceRoot":"","sources":["../../../../src/components/hud/XPBar/XPBar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,6DAA6D;AAC7D,eAAO,MAAM,KAAK,uGAuChB,CAAC"}
@@ -1,15 +1,17 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { formatNumber, ratio } from "../../../utils/number.js";
3
4
  import XPBar_module_default from "./XPBar.module.js";
4
5
  import { forwardRef } from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
7
  //#region src/components/hud/XPBar/XPBar.tsx
7
8
  /** Segmented experience bar with the level number on top. */
8
- var XPBar = forwardRef(function XPBar({ value, max, level, showValue = false, label = "Experience", className, ...rest }, ref) {
9
+ var XPBar = forwardRef(function XPBar({ value, max, level, showValue = false, label, className, ...rest }, ref) {
10
+ const m = useBlockUIMessages();
9
11
  const percent = ratio(value, max) * 100;
10
12
  const current = Math.max(0, Math.min(value, max));
11
- const valueText = `${formatNumber(current)} / ${formatNumber(max)} XP`;
12
- const fullText = level !== void 0 ? `Level ${level}, ${valueText}` : valueText;
13
+ const valueText = m.hud.xpValue(formatNumber(current), formatNumber(max));
14
+ const fullText = level !== void 0 ? `${m.hud.level(String(level))}, ${valueText}` : valueText;
13
15
  return /* @__PURE__ */ jsxs("div", {
14
16
  className: cx(XPBar_module_default.xp, className),
15
17
  children: [
@@ -21,7 +23,7 @@ var XPBar = forwardRef(function XPBar({ value, max, level, showValue = false, la
21
23
  /* @__PURE__ */ jsxs("div", {
22
24
  ref,
23
25
  role: "progressbar",
24
- "aria-label": label,
26
+ "aria-label": label ?? m.hud.experience,
25
27
  "aria-valuemin": 0,
26
28
  "aria-valuemax": max,
27
29
  "aria-valuenow": current,
@@ -1 +1 @@
1
- {"version":3,"file":"XPBar.js","names":["styles"],"sources":["../../../../src/components/hud/XPBar/XPBar.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber, ratio } from \"../../../utils/number\";\nimport styles from \"./XPBar.module.css\";\nimport type { XPBarProps } from \"./XPBar.types\";\n\n/** Segmented experience bar with the level number on top. */\nexport const XPBar = forwardRef<HTMLDivElement, XPBarProps>(function XPBar(\n { value, max, level, showValue = false, label = \"Experience\", className, ...rest },\n ref,\n) {\n const percent = ratio(value, max) * 100;\n const current = Math.max(0, Math.min(value, max));\n const valueText = `${formatNumber(current)} / ${formatNumber(max)} XP`;\n const fullText = level !== undefined ? `Level ${level}, ${valueText}` : valueText;\n\n return (\n <div className={cx(styles.xp, className)}>\n {level !== undefined ? (\n <span className={styles.level} aria-hidden=\"true\">\n {level}\n </span>\n ) : null}\n <div\n ref={ref}\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={current}\n aria-valuetext={fullText}\n className={styles.track}\n style={{ \"--block-xp\": `${percent}%` } as CSSProperties}\n {...rest}\n >\n <span className={styles.fill} />\n <span className={styles.segments} />\n </div>\n {showValue ? (\n <span className={styles.value} aria-hidden=\"true\">\n {valueText}\n </span>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;AAOA,IAAa,QAAQ,WAAuC,SAAS,MACnE,EAAE,OAAO,KAAK,OAAO,YAAY,OAAO,QAAQ,cAAc,WAAW,GAAG,QAC5E,KACA;CACA,MAAM,UAAU,MAAM,OAAO,GAAG,IAAI;CACpC,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,GAAG,CAAC;CAChD,MAAM,YAAY,GAAG,aAAa,OAAO,EAAE,KAAK,aAAa,GAAG,EAAE;CAClE,MAAM,WAAW,UAAU,KAAA,IAAY,SAAS,MAAM,IAAI,cAAc;CAExE,OACE,qBAAC,OAAD;EAAK,WAAW,GAAGA,qBAAO,IAAI,SAAS;EAAvC,UAAA;GACG,UAAU,KAAA,IACT,oBAAC,QAAD;IAAM,WAAWA,qBAAO;IAAO,eAAY;IACxC,UAAA;GACG,CAAA,IACJ;GACJ,qBAAC,OAAD;IACO;IACL,MAAK;IACL,cAAY;IACZ,iBAAe;IACf,iBAAe;IACf,iBAAe;IACf,kBAAgB;IAChB,WAAWA,qBAAO;IAClB,OAAO,EAAE,cAAc,GAAG,QAAQ,GAAG;IACrC,GAAI;IAVN,UAAA,CAYE,oBAAC,QAAD,EAAM,WAAWA,qBAAO,KAAO,CAAA,GAC/B,oBAAC,QAAD,EAAM,WAAWA,qBAAO,SAAW,CAAA,CAChC;;GACJ,YACC,oBAAC,QAAD;IAAM,WAAWA,qBAAO;IAAO,eAAY;IACxC,UAAA;GACG,CAAA,IACJ;EACD;;AAET,CAAC"}
1
+ {"version":3,"file":"XPBar.js","names":["styles"],"sources":["../../../../src/components/hud/XPBar/XPBar.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber, ratio } from \"../../../utils/number\";\nimport styles from \"./XPBar.module.css\";\nimport type { XPBarProps } from \"./XPBar.types\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\n/** Segmented experience bar with the level number on top. */\nexport const XPBar = forwardRef<HTMLDivElement, XPBarProps>(function XPBar(\n { value, max, level, showValue = false, label, className, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n const percent = ratio(value, max) * 100;\n const current = Math.max(0, Math.min(value, max));\n const valueText = m.hud.xpValue(formatNumber(current), formatNumber(max));\n const fullText = level !== undefined ? `${m.hud.level(String(level))}, ${valueText}` : valueText;\n\n return (\n <div className={cx(styles.xp, className)}>\n {level !== undefined ? (\n <span className={styles.level} aria-hidden=\"true\">\n {level}\n </span>\n ) : null}\n <div\n ref={ref}\n role=\"progressbar\"\n aria-label={label ?? m.hud.experience}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={current}\n aria-valuetext={fullText}\n className={styles.track}\n style={{ \"--block-xp\": `${percent}%` } as CSSProperties}\n {...rest}\n >\n <span className={styles.fill} />\n <span className={styles.segments} />\n </div>\n {showValue ? (\n <span className={styles.value} aria-hidden=\"true\">\n {valueText}\n </span>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;AAQA,IAAa,QAAQ,WAAuC,SAAS,MACnE,EAAE,OAAO,KAAK,OAAO,YAAY,OAAO,OAAO,WAAW,GAAG,QAC7D,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,UAAU,MAAM,OAAO,GAAG,IAAI;CACpC,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,GAAG,CAAC;CAChD,MAAM,YAAY,EAAE,IAAI,QAAQ,aAAa,OAAO,GAAG,aAAa,GAAG,CAAC;CACxE,MAAM,WAAW,UAAU,KAAA,IAAY,GAAG,EAAE,IAAI,MAAM,OAAO,KAAK,CAAC,EAAE,IAAI,cAAc;CAEvF,OACE,qBAAC,OAAD;EAAK,WAAW,GAAGA,qBAAO,IAAI,SAAS;EAAvC,UAAA;GACG,UAAU,KAAA,IACT,oBAAC,QAAD;IAAM,WAAWA,qBAAO;IAAO,eAAY;IACxC,UAAA;GACG,CAAA,IACJ;GACJ,qBAAC,OAAD;IACO;IACL,MAAK;IACL,cAAY,SAAS,EAAE,IAAI;IAC3B,iBAAe;IACf,iBAAe;IACf,iBAAe;IACf,kBAAgB;IAChB,WAAWA,qBAAO;IAClB,OAAO,EAAE,cAAc,GAAG,QAAQ,GAAG;IACrC,GAAI;IAVN,UAAA,CAYE,oBAAC,QAAD,EAAM,WAAWA,qBAAO,KAAO,CAAA,GAC/B,oBAAC,QAAD,EAAM,WAAWA,qBAAO,SAAW,CAAA,CAChC;;GACJ,YACC,oBAAC,QAAD;IAAM,WAAWA,qBAAO;IAAO,eAAY;IACxC,UAAA;GACG,CAAA,IACJ;EACD;;AAET,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"DurabilityBar.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/DurabilityBar/DurabilityBar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,uEAAuE;AACvE,eAAO,MAAM,aAAa,+GA4BxB,CAAC"}
1
+ {"version":3,"file":"DurabilityBar.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/DurabilityBar/DurabilityBar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIhE,uEAAuE;AACvE,eAAO,MAAM,aAAa,+GA6BxB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { formatNumber, ratio } from "../../../utils/number.js";
3
4
  import DurabilityBar_module_default from "./DurabilityBar.module.js";
4
5
  import { durabilityLevel } from "./DurabilityBar.utils.js";
@@ -6,7 +7,8 @@ import { forwardRef } from "react";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
8
  //#region src/components/inventory/DurabilityBar/DurabilityBar.tsx
8
9
  /** Tool durability gauge — green → gold → redstone as it wears out. */
9
- var DurabilityBar = forwardRef(function DurabilityBar({ value, max, label = "Durability", compact = false, showValue = false, className, ...rest }, ref) {
10
+ var DurabilityBar = forwardRef(function DurabilityBar({ value, max, label, compact = false, showValue = false, className, ...rest }, ref) {
11
+ const m = useBlockUIMessages();
10
12
  const level = durabilityLevel(value, max);
11
13
  const percent = ratio(value, max) * 100;
12
14
  const text = `${formatNumber(Math.max(0, Math.round(value)))} / ${formatNumber(max)}`;
@@ -15,7 +17,7 @@ var DurabilityBar = forwardRef(function DurabilityBar({ value, max, label = "Dur
15
17
  children: [/* @__PURE__ */ jsx("div", {
16
18
  ref,
17
19
  role: "meter",
18
- "aria-label": label,
20
+ "aria-label": label ?? m.durability.label,
19
21
  "aria-valuemin": 0,
20
22
  "aria-valuemax": max,
21
23
  "aria-valuenow": Math.max(0, Math.min(value, max)),
@@ -1 +1 @@
1
- {"version":3,"file":"DurabilityBar.js","names":["styles"],"sources":["../../../../src/components/inventory/DurabilityBar/DurabilityBar.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber, ratio } from \"../../../utils/number\";\nimport styles from \"./DurabilityBar.module.css\";\nimport type { DurabilityBarProps } from \"./DurabilityBar.types\";\nimport { durabilityLevel } from \"./DurabilityBar.utils\";\n\n/** Tool durability gauge — green → gold → redstone as it wears out. */\nexport const DurabilityBar = forwardRef<HTMLDivElement, DurabilityBarProps>(function DurabilityBar(\n { value, max, label = \"Durability\", compact = false, showValue = false, className, ...rest },\n ref,\n) {\n const level = durabilityLevel(value, max);\n const percent = ratio(value, max) * 100;\n const text = `${formatNumber(Math.max(0, Math.round(value)))} / ${formatNumber(max)}`;\n\n return (\n <div className={cx(styles.root, compact && styles.compact, className)}>\n <div\n ref={ref}\n role=\"meter\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={Math.max(0, Math.min(value, max))}\n aria-valuetext={text}\n data-level={level}\n className={styles.track}\n style={{ \"--block-durability\": `${percent}%` } as CSSProperties}\n {...rest}\n >\n <span className={styles.fill} />\n </div>\n {showValue && !compact ? <span className={styles.value}>{text}</span> : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;AAQA,IAAa,gBAAgB,WAA+C,SAAS,cACnF,EAAE,OAAO,KAAK,QAAQ,cAAc,UAAU,OAAO,YAAY,OAAO,WAAW,GAAG,QACtF,KACA;CACA,MAAM,QAAQ,gBAAgB,OAAO,GAAG;CACxC,MAAM,UAAU,MAAM,OAAO,GAAG,IAAI;CACpC,MAAM,OAAO,GAAG,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,aAAa,GAAG;CAElF,OACE,qBAAC,OAAD;EAAK,WAAW,GAAGA,6BAAO,MAAM,WAAWA,6BAAO,SAAS,SAAS;EAApE,UAAA,CACE,oBAAC,OAAD;GACO;GACL,MAAK;GACL,cAAY;GACZ,iBAAe;GACf,iBAAe;GACf,iBAAe,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,GAAG,CAAC;GAC/C,kBAAgB;GAChB,cAAY;GACZ,WAAWA,6BAAO;GAClB,OAAO,EAAE,sBAAsB,GAAG,QAAQ,GAAG;GAC7C,GAAI;GAEJ,UAAA,oBAAC,QAAD,EAAM,WAAWA,6BAAO,KAAO,CAAA;EAC5B,CAAA,GACJ,aAAa,CAAC,UAAU,oBAAC,QAAD;GAAM,WAAWA,6BAAO;GAAQ,UAAA;EAAW,CAAA,IAAI,IACrE;;AAET,CAAC"}
1
+ {"version":3,"file":"DurabilityBar.js","names":["styles"],"sources":["../../../../src/components/inventory/DurabilityBar/DurabilityBar.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber, ratio } from \"../../../utils/number\";\nimport styles from \"./DurabilityBar.module.css\";\nimport type { DurabilityBarProps } from \"./DurabilityBar.types\";\nimport { durabilityLevel } from \"./DurabilityBar.utils\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\n/** Tool durability gauge — green → gold → redstone as it wears out. */\nexport const DurabilityBar = forwardRef<HTMLDivElement, DurabilityBarProps>(function DurabilityBar(\n { value, max, label, compact = false, showValue = false, className, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n const level = durabilityLevel(value, max);\n const percent = ratio(value, max) * 100;\n const text = `${formatNumber(Math.max(0, Math.round(value)))} / ${formatNumber(max)}`;\n\n return (\n <div className={cx(styles.root, compact && styles.compact, className)}>\n <div\n ref={ref}\n role=\"meter\"\n aria-label={label ?? m.durability.label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={Math.max(0, Math.min(value, max))}\n aria-valuetext={text}\n data-level={level}\n className={styles.track}\n style={{ \"--block-durability\": `${percent}%` } as CSSProperties}\n {...rest}\n >\n <span className={styles.fill} />\n </div>\n {showValue && !compact ? <span className={styles.value}>{text}</span> : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;AASA,IAAa,gBAAgB,WAA+C,SAAS,cACnF,EAAE,OAAO,KAAK,OAAO,UAAU,OAAO,YAAY,OAAO,WAAW,GAAG,QACvE,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,QAAQ,gBAAgB,OAAO,GAAG;CACxC,MAAM,UAAU,MAAM,OAAO,GAAG,IAAI;CACpC,MAAM,OAAO,GAAG,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,aAAa,GAAG;CAElF,OACE,qBAAC,OAAD;EAAK,WAAW,GAAGA,6BAAO,MAAM,WAAWA,6BAAO,SAAS,SAAS;EAApE,UAAA,CACE,oBAAC,OAAD;GACO;GACL,MAAK;GACL,cAAY,SAAS,EAAE,WAAW;GAClC,iBAAe;GACf,iBAAe;GACf,iBAAe,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,GAAG,CAAC;GAC/C,kBAAgB;GAChB,cAAY;GACZ,WAAWA,6BAAO;GAClB,OAAO,EAAE,sBAAsB,GAAG,QAAQ,GAAG;GAC7C,GAAI;GAEJ,UAAA,oBAAC,QAAD,EAAM,WAAWA,6BAAO,KAAO,CAAA;EAC5B,CAAA,GACJ,aAAa,CAAC,UAAU,oBAAC,QAAD;GAAM,WAAWA,6BAAO;GAAQ,UAAA;EAAW,CAAA,IAAI,IACrE;;AAET,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Hotbar.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/Hotbar/Hotbar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,MAAM,wGA4DjB,CAAC"}
1
+ {"version":3,"file":"Hotbar.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/Hotbar/Hotbar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD;;;GAGG;AACH,eAAO,MAAM,MAAM,wGA6DjB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { useControllableState } from "../../../hooks/useControllableState.js";
3
4
  import { InventoryGrid } from "../InventoryGrid/InventoryGrid.js";
4
5
  import { useDigitHotkeys } from "../../../hooks/useDigitHotkeys.js";
@@ -10,7 +11,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
10
11
  * Nine-slot quick bar. Number keys `1`–`9` select a slot from anywhere on the
11
12
  * page (ignored while typing); arrow keys move the selection and wrap around.
12
13
  */
13
- var Hotbar = forwardRef(function Hotbar({ selectedIndex, defaultSelectedIndex = 0, onSelect, children, slots = 9, hotkeys = true, showKeys = true, slotSize = "md", label = "Hotbar", className, ...rest }, ref) {
14
+ var Hotbar = forwardRef(function Hotbar({ selectedIndex, defaultSelectedIndex = 0, onSelect, children, slots = 9, hotkeys = true, showKeys = true, slotSize = "md", label, className, ...rest }, ref) {
15
+ const m = useBlockUIMessages();
14
16
  const [current, setCurrent] = useControllableState({
15
17
  value: selectedIndex,
16
18
  defaultValue: defaultSelectedIndex,
@@ -30,7 +32,7 @@ var Hotbar = forwardRef(function Hotbar({ selectedIndex, defaultSelectedIndex =
30
32
  onSelectedIndexChange: setCurrent,
31
33
  selectionFollowsFocus: true,
32
34
  wrap: true,
33
- label,
35
+ label: label ?? m.hotbar.label,
34
36
  "aria-keyshortcuts": hotkeys ? Array.from({ length: Math.min(slots, 9) }, (_, i) => i + 1).join(" ") : void 0,
35
37
  ...rest,
36
38
  children
@@ -1 +1 @@
1
- {"version":3,"file":"Hotbar.js","names":["styles"],"sources":["../../../../src/components/inventory/Hotbar/Hotbar.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useDigitHotkeys } from \"../../../hooks/useDigitHotkeys\";\nimport { cx } from \"../../../utils/cx\";\nimport { InventoryGrid } from \"../InventoryGrid/InventoryGrid\";\nimport styles from \"./Hotbar.module.css\";\nimport type { HotbarProps } from \"./Hotbar.types\";\n\n/**\n * Nine-slot quick bar. Number keys `1`–`9` select a slot from anywhere on the\n * page (ignored while typing); arrow keys move the selection and wrap around.\n */\nexport const Hotbar = forwardRef<HTMLDivElement, HotbarProps>(function Hotbar(\n {\n selectedIndex,\n defaultSelectedIndex = 0,\n onSelect,\n children,\n slots = 9,\n hotkeys = true,\n showKeys = true,\n slotSize = \"md\",\n label = \"Hotbar\",\n className,\n ...rest\n },\n ref,\n) {\n const [current, setCurrent] = useControllableState({\n value: selectedIndex,\n defaultValue: defaultSelectedIndex,\n onChange: onSelect,\n });\n\n useDigitHotkeys(hotkeys, slots, setCurrent);\n\n return (\n <div\n className={cx(styles.hotbar, className)}\n data-size={slotSize}\n style={{ \"--block-columns\": slots } as CSSProperties}\n >\n <InventoryGrid\n ref={ref}\n columns={slots}\n rows={1}\n slotSize={slotSize}\n selectedIndex={current}\n onSelectedIndexChange={setCurrent}\n selectionFollowsFocus\n wrap\n label={label}\n aria-keyshortcuts={\n hotkeys\n ? Array.from({ length: Math.min(slots, 9) }, (_, i) => i + 1).join(\" \")\n : undefined\n }\n {...rest}\n >\n {children}\n </InventoryGrid>\n {showKeys ? (\n <div className={styles.keys} aria-hidden=\"true\">\n {Array.from({ length: slots }, (_, index) => (\n <span key={index} className={styles.key} data-selected={index === current || undefined}>\n {index < 9 ? index + 1 : \"\"}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,SAAS,WAAwC,SAAS,OACrE,EACE,eACA,uBAAuB,GACvB,UACA,UACA,QAAQ,GACR,UAAU,MACV,WAAW,MACX,WAAW,MACX,QAAQ,UACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,CAAC,SAAS,cAAc,qBAAqB;EACjD,OAAO;EACP,cAAc;EACd,UAAU;CACZ,CAAC;CAED,gBAAgB,SAAS,OAAO,UAAU;CAE1C,OACE,qBAAC,OAAD;EACE,WAAW,GAAGA,sBAAO,QAAQ,SAAS;EACtC,aAAW;EACX,OAAO,EAAE,mBAAmB,MAAM;EAHpC,UAAA,CAKE,oBAAC,eAAD;GACO;GACL,SAAS;GACT,MAAM;GACI;GACV,eAAe;GACf,uBAAuB;GACvB,uBAAA;GACA,MAAA;GACO;GACP,qBACE,UACI,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IACpE,KAAA;GAEN,GAAI;GAEH;EACY,CAAA,GACd,WACC,oBAAC,OAAD;GAAK,WAAWA,sBAAO;GAAM,eAAY;GACtC,UAAA,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,UACjC,oBAAC,QAAD;IAAkB,WAAWA,sBAAO;IAAK,iBAAe,UAAU,WAAW,KAAA;IAC1E,UAAA,QAAQ,IAAI,QAAQ,IAAI;GACrB,GAFK,KAEL,CACP;EACE,CAAA,IACH,IACD;;AAET,CAAC"}
1
+ {"version":3,"file":"Hotbar.js","names":["styles"],"sources":["../../../../src/components/inventory/Hotbar/Hotbar.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useDigitHotkeys } from \"../../../hooks/useDigitHotkeys\";\nimport { cx } from \"../../../utils/cx\";\nimport { InventoryGrid } from \"../InventoryGrid/InventoryGrid\";\nimport styles from \"./Hotbar.module.css\";\nimport type { HotbarProps } from \"./Hotbar.types\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\n/**\n * Nine-slot quick bar. Number keys `1`–`9` select a slot from anywhere on the\n * page (ignored while typing); arrow keys move the selection and wrap around.\n */\nexport const Hotbar = forwardRef<HTMLDivElement, HotbarProps>(function Hotbar(\n {\n selectedIndex,\n defaultSelectedIndex = 0,\n onSelect,\n children,\n slots = 9,\n hotkeys = true,\n showKeys = true,\n slotSize = \"md\",\n label,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const [current, setCurrent] = useControllableState({\n value: selectedIndex,\n defaultValue: defaultSelectedIndex,\n onChange: onSelect,\n });\n\n useDigitHotkeys(hotkeys, slots, setCurrent);\n\n return (\n <div\n className={cx(styles.hotbar, className)}\n data-size={slotSize}\n style={{ \"--block-columns\": slots } as CSSProperties}\n >\n <InventoryGrid\n ref={ref}\n columns={slots}\n rows={1}\n slotSize={slotSize}\n selectedIndex={current}\n onSelectedIndexChange={setCurrent}\n selectionFollowsFocus\n wrap\n label={label ?? m.hotbar.label}\n aria-keyshortcuts={\n hotkeys\n ? Array.from({ length: Math.min(slots, 9) }, (_, i) => i + 1).join(\" \")\n : undefined\n }\n {...rest}\n >\n {children}\n </InventoryGrid>\n {showKeys ? (\n <div className={styles.keys} aria-hidden=\"true\">\n {Array.from({ length: slots }, (_, index) => (\n <span key={index} className={styles.key} data-selected={index === current || undefined}>\n {index < 9 ? index + 1 : \"\"}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAa,SAAS,WAAwC,SAAS,OACrE,EACE,eACA,uBAAuB,GACvB,UACA,UACA,QAAQ,GACR,UAAU,MACV,WAAW,MACX,WAAW,MACX,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,CAAC,SAAS,cAAc,qBAAqB;EACjD,OAAO;EACP,cAAc;EACd,UAAU;CACZ,CAAC;CAED,gBAAgB,SAAS,OAAO,UAAU;CAE1C,OACE,qBAAC,OAAD;EACE,WAAW,GAAGA,sBAAO,QAAQ,SAAS;EACtC,aAAW;EACX,OAAO,EAAE,mBAAmB,MAAM;EAHpC,UAAA,CAKE,oBAAC,eAAD;GACO;GACL,SAAS;GACT,MAAM;GACI;GACV,eAAe;GACf,uBAAuB;GACvB,uBAAA;GACA,MAAA;GACA,OAAO,SAAS,EAAE,OAAO;GACzB,qBACE,UACI,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IACpE,KAAA;GAEN,GAAI;GAEH;EACY,CAAA,GACd,WACC,oBAAC,OAAD;GAAK,WAAWA,sBAAO;GAAM,eAAY;GACtC,UAAA,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,UACjC,oBAAC,QAAD;IAAkB,WAAWA,sBAAO;IAAK,iBAAe,UAAU,WAAW,KAAA;IAC1E,UAAA,QAAQ,IAAI,QAAQ,IAAI;GACrB,GAFK,KAEL,CACP;EACE,CAAA,IACH,IACD;;AAET,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Inventory.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/Inventory/Inventory.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/E;;;GAGG;AACH,eAAO,MAAM,SAAS,wGAgBpB,CAAC;AAEH,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,kHAoB5B,CAAC"}
1
+ {"version":3,"file":"Inventory.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/Inventory/Inventory.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/E;;;GAGG;AACH,eAAO,MAAM,SAAS,wGAiBpB,CAAC;AAEH,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,kHAoB5B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { BlockPanel } from "../../layout/BlockPanel/BlockPanel.js";
3
4
  import Inventory_module_default from "./Inventory.module.js";
4
5
  import { forwardRef, useId } from "react";
@@ -9,10 +10,11 @@ import { jsx, jsxs } from "react/jsx-runtime";
9
10
  * Inventory window — a panel that stacks `InventorySection`s (grids, hotbar).
10
11
  * Use `variant="chest"` for storage containers.
11
12
  */
12
- var Inventory = forwardRef(function Inventory({ title = "Inventory", variant = "default", icon, className, children, ...rest }, ref) {
13
+ var Inventory = forwardRef(function Inventory({ title, variant = "default", icon, className, children, ...rest }, ref) {
14
+ const m = useBlockUIMessages();
13
15
  return /* @__PURE__ */ jsx(BlockPanel, {
14
16
  ref,
15
- title,
17
+ title: title ?? m.inventory.title,
16
18
  icon: icon ?? (variant === "chest" ? /* @__PURE__ */ jsx(ChestIcon, { size: 24 }) : void 0),
17
19
  "data-inventory": variant,
18
20
  className: cx(Inventory_module_default.inventory, variant === "chest" && Inventory_module_default.chest, className),
@@ -1 +1 @@
1
- {"version":3,"file":"Inventory.js","names":["styles"],"sources":["../../../../src/components/inventory/Inventory/Inventory.tsx"],"sourcesContent":["import { ChestIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockPanel } from \"../../layout/BlockPanel/BlockPanel\";\nimport styles from \"./Inventory.module.css\";\nimport type { InventoryProps, InventorySectionProps } from \"./Inventory.types\";\n\n/**\n * Inventory window — a panel that stacks `InventorySection`s (grids, hotbar).\n * Use `variant=\"chest\"` for storage containers.\n */\nexport const Inventory = forwardRef<HTMLElement, InventoryProps>(function Inventory(\n { title = \"Inventory\", variant = \"default\", icon, className, children, ...rest },\n ref,\n) {\n return (\n <BlockPanel\n ref={ref}\n title={title}\n icon={icon ?? (variant === \"chest\" ? <ChestIcon size={24} /> : undefined)}\n data-inventory={variant}\n className={cx(styles.inventory, variant === \"chest\" && styles.chest, className)}\n {...rest}\n >\n <div className={styles.sections}>{children}</div>\n </BlockPanel>\n );\n});\n\n/** A titled group inside an `Inventory` (e.g. main storage, hotbar). */\nexport const InventorySection = forwardRef<HTMLDivElement, InventorySectionProps>(\n function InventorySection({ title, className, children, ...rest }, ref) {\n const titleId = useId();\n return (\n <div\n ref={ref}\n role={title ? \"group\" : undefined}\n aria-labelledby={title ? titleId : undefined}\n className={cx(styles.section, className)}\n {...rest}\n >\n {title ? (\n <p id={titleId} className={styles.sectionTitle}>\n {title}\n </p>\n ) : null}\n {children}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,YAAY,WAAwC,SAAS,UACxE,EAAE,QAAQ,aAAa,UAAU,WAAW,MAAM,WAAW,UAAU,GAAG,QAC1E,KACA;CACA,OACE,oBAAC,YAAD;EACO;EACE;EACP,MAAM,SAAS,YAAY,UAAU,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA,IAAI,KAAA;EAC/D,kBAAgB;EAChB,WAAW,GAAGA,yBAAO,WAAW,YAAY,WAAWA,yBAAO,OAAO,SAAS;EAC9E,GAAI;EAEJ,UAAA,oBAAC,OAAD;GAAK,WAAWA,yBAAO;GAAW;EAAc,CAAA;CACtC,CAAA;AAEhB,CAAC;;AAGD,IAAa,mBAAmB,WAC9B,SAAS,iBAAiB,EAAE,OAAO,WAAW,UAAU,GAAG,QAAQ,KAAK;CACtE,MAAM,UAAU,MAAM;CACtB,OACE,qBAAC,OAAD;EACO;EACL,MAAM,QAAQ,UAAU,KAAA;EACxB,mBAAiB,QAAQ,UAAU,KAAA;EACnC,WAAW,GAAGA,yBAAO,SAAS,SAAS;EACvC,GAAI;EALN,UAAA,CAOG,QACC,oBAAC,KAAD;GAAG,IAAI;GAAS,WAAWA,yBAAO;GAC/B,UAAA;EACA,CAAA,IACD,MACH,QACE;;AAET,CACF"}
1
+ {"version":3,"file":"Inventory.js","names":["styles"],"sources":["../../../../src/components/inventory/Inventory/Inventory.tsx"],"sourcesContent":["import { ChestIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockPanel } from \"../../layout/BlockPanel/BlockPanel\";\nimport styles from \"./Inventory.module.css\";\nimport type { InventoryProps, InventorySectionProps } from \"./Inventory.types\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\n/**\n * Inventory window — a panel that stacks `InventorySection`s (grids, hotbar).\n * Use `variant=\"chest\"` for storage containers.\n */\nexport const Inventory = forwardRef<HTMLElement, InventoryProps>(function Inventory(\n { title, variant = \"default\", icon, className, children, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n return (\n <BlockPanel\n ref={ref}\n title={title ?? m.inventory.title}\n icon={icon ?? (variant === \"chest\" ? <ChestIcon size={24} /> : undefined)}\n data-inventory={variant}\n className={cx(styles.inventory, variant === \"chest\" && styles.chest, className)}\n {...rest}\n >\n <div className={styles.sections}>{children}</div>\n </BlockPanel>\n );\n});\n\n/** A titled group inside an `Inventory` (e.g. main storage, hotbar). */\nexport const InventorySection = forwardRef<HTMLDivElement, InventorySectionProps>(\n function InventorySection({ title, className, children, ...rest }, ref) {\n const titleId = useId();\n return (\n <div\n ref={ref}\n role={title ? \"group\" : undefined}\n aria-labelledby={title ? titleId : undefined}\n className={cx(styles.section, className)}\n {...rest}\n >\n {title ? (\n <p id={titleId} className={styles.sectionTitle}>\n {title}\n </p>\n ) : null}\n {children}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,YAAY,WAAwC,SAAS,UACxE,EAAE,OAAO,UAAU,WAAW,MAAM,WAAW,UAAU,GAAG,QAC5D,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,OACE,oBAAC,YAAD;EACO;EACL,OAAO,SAAS,EAAE,UAAU;EAC5B,MAAM,SAAS,YAAY,UAAU,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA,IAAI,KAAA;EAC/D,kBAAgB;EAChB,WAAW,GAAGA,yBAAO,WAAW,YAAY,WAAWA,yBAAO,OAAO,SAAS;EAC9E,GAAI;EAEJ,UAAA,oBAAC,OAAD;GAAK,WAAWA,yBAAO;GAAW;EAAc,CAAA;CACtC,CAAA;AAEhB,CAAC;;AAGD,IAAa,mBAAmB,WAC9B,SAAS,iBAAiB,EAAE,OAAO,WAAW,UAAU,GAAG,QAAQ,KAAK;CACtE,MAAM,UAAU,MAAM;CACtB,OACE,qBAAC,OAAD;EACO;EACL,MAAM,QAAQ,UAAU,KAAA;EACxB,mBAAiB,QAAQ,UAAU,KAAA;EACnC,WAAW,GAAGA,yBAAO,SAAS,SAAS;EACvC,GAAI;EALN,UAAA,CAOG,QACC,oBAAC,KAAD;GAAG,IAAI;GAAS,WAAWA,yBAAO;GAC/B,UAAA;EACA,CAAA,IACD,MACH,QACE;;AAET,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"InventoryGrid.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/InventoryGrid/InventoryGrid.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAQhE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,+GAwIxB,CAAC"}
1
+ {"version":3,"file":"InventoryGrid.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/InventoryGrid/InventoryGrid.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAShE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,+GAyIxB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { useControllableState } from "../../../hooks/useControllableState.js";
3
4
  import { InventoryGridContext, SlotIndexContext } from "./context.js";
4
5
  import { InventorySlot } from "../InventorySlot/InventorySlot.js";
@@ -17,7 +18,8 @@ function chunk(items, size) {
17
18
  * Keyboard: arrows move, Home/End jump within a row (Ctrl for the whole grid),
18
19
  * Enter/Space selects, Escape closes a slot tooltip.
19
20
  */
20
- var InventoryGrid = forwardRef(function InventoryGrid({ columns = 9, rows, slotSize = "md", children, selectedIndex, defaultSelectedIndex = null, onSelectedIndexChange, selectionFollowsFocus = false, wrap = false, label = "Inventory", className, onKeyDown, ...rest }, ref) {
21
+ var InventoryGrid = forwardRef(function InventoryGrid({ columns = 9, rows, slotSize = "md", children, selectedIndex, defaultSelectedIndex = null, onSelectedIndexChange, selectionFollowsFocus = false, wrap = false, label, className, onKeyDown, ...rest }, ref) {
22
+ const m = useBlockUIMessages();
21
23
  const cols = Math.max(1, Math.floor(columns));
22
24
  const items = Children.toArray(children);
23
25
  if (rows !== void 0) for (let i = items.length; i < cols * rows; i += 1) items.push(/* @__PURE__ */ jsx(InventorySlot, {}, `block-empty-${i}`));
@@ -100,7 +102,7 @@ var InventoryGrid = forwardRef(function InventoryGrid({ columns = 9, rows, slotS
100
102
  ref,
101
103
  role: "grid",
102
104
  tabIndex: -1,
103
- "aria-label": label,
105
+ "aria-label": label ?? m.inventory.label,
104
106
  "aria-rowcount": Math.ceil(count / cols),
105
107
  "aria-colcount": cols,
106
108
  "data-size": slotSize,
@@ -1 +1 @@
1
- {"version":3,"file":"InventoryGrid.js","names":["styles"],"sources":["../../../../src/components/inventory/InventoryGrid/InventoryGrid.tsx"],"sourcesContent":["import {\n Children,\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { cx } from \"../../../utils/cx\";\nimport { InventorySlot } from \"../InventorySlot/InventorySlot\";\nimport { InventoryGridContext, SlotIndexContext, type InventoryGridContextValue } from \"./context\";\nimport styles from \"./InventoryGrid.module.css\";\nimport type { InventoryGridProps } from \"./InventoryGrid.types\";\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const rows: T[][] = [];\n for (let i = 0; i < items.length; i += size) rows.push(items.slice(i, i + size));\n return rows;\n}\n\n/**\n * CSS-grid inventory with ARIA grid semantics and roving focus.\n *\n * Keyboard: arrows move, Home/End jump within a row (Ctrl for the whole grid),\n * Enter/Space selects, Escape closes a slot tooltip.\n */\nexport const InventoryGrid = forwardRef<HTMLDivElement, InventoryGridProps>(function InventoryGrid(\n {\n columns = 9,\n rows,\n slotSize = \"md\",\n children,\n selectedIndex,\n defaultSelectedIndex = null,\n onSelectedIndexChange,\n selectionFollowsFocus = false,\n wrap = false,\n label = \"Inventory\",\n className,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const cols = Math.max(1, Math.floor(columns));\n const items: ReactNode[] = Children.toArray(children);\n if (rows !== undefined) {\n for (let i = items.length; i < cols * rows; i += 1) {\n items.push(<InventorySlot key={`block-empty-${i}`} />);\n }\n }\n const count = items.length;\n\n const [selected, setSelected] = useControllableState<number | null>({\n value: selectedIndex,\n defaultValue: defaultSelectedIndex,\n onChange: (index) => {\n if (index !== null) onSelectedIndexChange?.(index);\n },\n });\n\n const [focusedIndex, setFocusedIndex] = useState(selected ?? 0);\n const [previousSelected, setPreviousSelected] = useState(selected);\n if (selected !== previousSelected) {\n setPreviousSelected(selected);\n if (selected !== null) setFocusedIndex(selected);\n }\n const tabStop = Math.min(focusedIndex, Math.max(0, count - 1));\n\n const cells = useRef(new Map<number, HTMLElement>());\n const registerCell = useCallback((index: number, element: HTMLElement | null) => {\n if (element) cells.current.set(index, element);\n else cells.current.delete(index);\n }, []);\n\n const context = useMemo<InventoryGridContextValue>(\n () => ({\n focusedIndex: tabStop,\n selectedIndex: selected,\n setFocusedIndex,\n select: setSelected,\n registerCell,\n }),\n [tabStop, selected, setSelected, registerCell],\n );\n\n const moveTo = (index: number) => {\n setFocusedIndex(index);\n cells.current.get(index)?.focus();\n if (selectionFollowsFocus) {\n const cell = cells.current.get(index);\n if (cell?.getAttribute(\"aria-disabled\") !== \"true\") setSelected(index);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || count === 0) return;\n const current = tabStop;\n const rowStart = current - (current % cols);\n const rowEnd = Math.min(rowStart + cols - 1, count - 1);\n let next: number | null = null;\n\n switch (event.key) {\n case \"ArrowRight\":\n next = current < rowEnd ? current + 1 : wrap ? rowStart : current;\n break;\n case \"ArrowLeft\":\n next = current > rowStart ? current - 1 : wrap ? rowEnd : current;\n break;\n case \"ArrowDown\":\n next = current + cols < count ? current + cols : current;\n break;\n case \"ArrowUp\":\n next = current - cols >= 0 ? current - cols : current;\n break;\n case \"Home\":\n next = event.ctrlKey ? 0 : rowStart;\n break;\n case \"End\":\n next = event.ctrlKey ? count - 1 : rowEnd;\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n cells.current.get(current)?.click();\n return;\n default:\n return;\n }\n\n event.preventDefault();\n if (next !== current) moveTo(next);\n };\n\n return (\n <div\n ref={ref}\n role=\"grid\"\n tabIndex={-1}\n aria-label={label}\n aria-rowcount={Math.ceil(count / cols)}\n aria-colcount={cols}\n data-size={slotSize}\n className={cx(styles.grid, className)}\n style={{ \"--block-columns\": cols } as CSSProperties}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <InventoryGridContext.Provider value={context}>\n {chunk(items, cols).map((row, rowIndex) => (\n <div key={rowIndex} role=\"row\" className={styles.row}>\n {row.map((item, colIndex) => (\n <SlotIndexContext.Provider key={colIndex} value={rowIndex * cols + colIndex}>\n {item}\n </SlotIndexContext.Provider>\n ))}\n </div>\n ))}\n </InventoryGridContext.Provider>\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"InventoryGrid.js","names":["styles"],"sources":["../../../../src/components/inventory/InventoryGrid/InventoryGrid.tsx"],"sourcesContent":["import {\n Children,\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { cx } from \"../../../utils/cx\";\nimport { InventorySlot } from \"../InventorySlot/InventorySlot\";\nimport { InventoryGridContext, SlotIndexContext, type InventoryGridContextValue } from \"./context\";\nimport styles from \"./InventoryGrid.module.css\";\nimport type { InventoryGridProps } from \"./InventoryGrid.types\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const rows: T[][] = [];\n for (let i = 0; i < items.length; i += size) rows.push(items.slice(i, i + size));\n return rows;\n}\n\n/**\n * CSS-grid inventory with ARIA grid semantics and roving focus.\n *\n * Keyboard: arrows move, Home/End jump within a row (Ctrl for the whole grid),\n * Enter/Space selects, Escape closes a slot tooltip.\n */\nexport const InventoryGrid = forwardRef<HTMLDivElement, InventoryGridProps>(function InventoryGrid(\n {\n columns = 9,\n rows,\n slotSize = \"md\",\n children,\n selectedIndex,\n defaultSelectedIndex = null,\n onSelectedIndexChange,\n selectionFollowsFocus = false,\n wrap = false,\n label,\n className,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const cols = Math.max(1, Math.floor(columns));\n const items: ReactNode[] = Children.toArray(children);\n if (rows !== undefined) {\n for (let i = items.length; i < cols * rows; i += 1) {\n items.push(<InventorySlot key={`block-empty-${i}`} />);\n }\n }\n const count = items.length;\n\n const [selected, setSelected] = useControllableState<number | null>({\n value: selectedIndex,\n defaultValue: defaultSelectedIndex,\n onChange: (index) => {\n if (index !== null) onSelectedIndexChange?.(index);\n },\n });\n\n const [focusedIndex, setFocusedIndex] = useState(selected ?? 0);\n const [previousSelected, setPreviousSelected] = useState(selected);\n if (selected !== previousSelected) {\n setPreviousSelected(selected);\n if (selected !== null) setFocusedIndex(selected);\n }\n const tabStop = Math.min(focusedIndex, Math.max(0, count - 1));\n\n const cells = useRef(new Map<number, HTMLElement>());\n const registerCell = useCallback((index: number, element: HTMLElement | null) => {\n if (element) cells.current.set(index, element);\n else cells.current.delete(index);\n }, []);\n\n const context = useMemo<InventoryGridContextValue>(\n () => ({\n focusedIndex: tabStop,\n selectedIndex: selected,\n setFocusedIndex,\n select: setSelected,\n registerCell,\n }),\n [tabStop, selected, setSelected, registerCell],\n );\n\n const moveTo = (index: number) => {\n setFocusedIndex(index);\n cells.current.get(index)?.focus();\n if (selectionFollowsFocus) {\n const cell = cells.current.get(index);\n if (cell?.getAttribute(\"aria-disabled\") !== \"true\") setSelected(index);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || count === 0) return;\n const current = tabStop;\n const rowStart = current - (current % cols);\n const rowEnd = Math.min(rowStart + cols - 1, count - 1);\n let next: number | null = null;\n\n switch (event.key) {\n case \"ArrowRight\":\n next = current < rowEnd ? current + 1 : wrap ? rowStart : current;\n break;\n case \"ArrowLeft\":\n next = current > rowStart ? current - 1 : wrap ? rowEnd : current;\n break;\n case \"ArrowDown\":\n next = current + cols < count ? current + cols : current;\n break;\n case \"ArrowUp\":\n next = current - cols >= 0 ? current - cols : current;\n break;\n case \"Home\":\n next = event.ctrlKey ? 0 : rowStart;\n break;\n case \"End\":\n next = event.ctrlKey ? count - 1 : rowEnd;\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n cells.current.get(current)?.click();\n return;\n default:\n return;\n }\n\n event.preventDefault();\n if (next !== current) moveTo(next);\n };\n\n return (\n <div\n ref={ref}\n role=\"grid\"\n tabIndex={-1}\n aria-label={label ?? m.inventory.label}\n aria-rowcount={Math.ceil(count / cols)}\n aria-colcount={cols}\n data-size={slotSize}\n className={cx(styles.grid, className)}\n style={{ \"--block-columns\": cols } as CSSProperties}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <InventoryGridContext.Provider value={context}>\n {chunk(items, cols).map((row, rowIndex) => (\n <div key={rowIndex} role=\"row\" className={styles.row}>\n {row.map((item, colIndex) => (\n <SlotIndexContext.Provider key={colIndex} value={rowIndex * cols + colIndex}>\n {item}\n </SlotIndexContext.Provider>\n ))}\n </div>\n ))}\n </InventoryGridContext.Provider>\n </div>\n );\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"InventorySlot.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/InventorySlot/InventorySlot.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIhE;;;;GAIG;AACH,eAAO,MAAM,aAAa,4GA0KxB,CAAC"}
1
+ {"version":3,"file":"InventorySlot.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/InventorySlot/InventorySlot.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAKhE;;;;GAIG;AACH,eAAO,MAAM,aAAa,4GA2KxB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { mergeRefs } from "../../../utils/refs.js";
3
4
  import { useInventoryGrid, useSlotIndex } from "../InventoryGrid/context.js";
4
5
  import InventorySlot_module_default from "./InventorySlot.module.js";
@@ -12,6 +13,7 @@ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
12
13
  * static well.
13
14
  */
14
15
  var InventorySlot = forwardRef(function InventorySlot({ selected, disabled = false, locked = false, rarity, children, onClick, tooltip, label, size = "md", className, onKeyDown, onMouseEnter, onMouseLeave, onFocus, onBlur, ...rest }, ref) {
16
+ const m = useBlockUIMessages();
15
17
  const grid = useInventoryGrid();
16
18
  const index = useSlotIndex();
17
19
  const inGrid = grid !== null && index >= 0;
@@ -68,7 +70,7 @@ var InventorySlot = forwardRef(function InventorySlot({ selected, disabled = fal
68
70
  }),
69
71
  empty && !label ? /* @__PURE__ */ jsx("span", {
70
72
  className: "block-visually-hidden",
71
- children: "Empty slot"
73
+ children: m.common.emptySlot
72
74
  }) : null,
73
75
  label && staticWell ? /* @__PURE__ */ jsx("span", {
74
76
  className: "block-visually-hidden",
@@ -1 +1 @@
1
- {"version":3,"file":"InventorySlot.js","names":["_Fragment","styles"],"sources":["../../../../src/components/inventory/InventorySlot/InventorySlot.tsx"],"sourcesContent":["import { LockIcon } from \"@malilion/block-ui-icons\";\nimport {\n forwardRef,\n useCallback,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type Ref,\n} from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { mergeRefs } from \"../../../utils/refs\";\nimport { useInventoryGrid, useSlotIndex } from \"../InventoryGrid/context\";\nimport styles from \"./InventorySlot.module.css\";\nimport type { InventorySlotProps } from \"./InventorySlot.types\";\n\ntype Placement = \"right\" | \"left\";\n\n/**\n * A single inventory slot. Inside an `InventoryGrid` it becomes a roving-focus\n * grid cell; standalone it is a toggle button (when `onClick` is set) or a\n * static well.\n */\nexport const InventorySlot = forwardRef<HTMLElement, InventorySlotProps>(function InventorySlot(\n {\n selected,\n disabled = false,\n locked = false,\n rarity,\n children,\n onClick,\n tooltip,\n label,\n size = \"md\",\n className,\n onKeyDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n ...rest\n },\n ref,\n) {\n const grid = useInventoryGrid();\n const index = useSlotIndex();\n const inGrid = grid !== null && index >= 0;\n const inactive = disabled || locked;\n const isSelected = selected ?? (inGrid ? grid.selectedIndex === index : false);\n const empty = children === undefined || children === null || children === false;\n /** Non-interactive wells cannot carry aria-label, so their label is rendered as hidden text. */\n const staticWell = !inGrid && !onClick;\n\n const tooltipId = useId();\n const [tooltipOpen, setTooltipOpen] = useState(false);\n const [placement, setPlacement] = useState<Placement>(\"right\");\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!tooltipOpen || !tooltipRef.current) return;\n const rect = tooltipRef.current.getBoundingClientRect();\n if (placement === \"right\" && rect.right > window.innerWidth - 8) setPlacement(\"left\");\n }, [tooltipOpen, placement]);\n\n const register = useCallback(\n (element: HTMLElement | null) => {\n if (inGrid) grid.registerCell(index, element);\n },\n [grid, inGrid, index],\n );\n\n const openTooltip = () => {\n if (tooltip) setTooltipOpen(true);\n };\n const closeTooltip = () => {\n setTooltipOpen(false);\n setPlacement(\"right\");\n };\n\n const handleClick = () => {\n if (inGrid) {\n grid.setFocusedIndex(index);\n if (!inactive) grid.select(index);\n }\n if (!inactive) onClick?.();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Escape\" && tooltipOpen) {\n event.stopPropagation();\n closeTooltip();\n }\n if (inGrid && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n handleClick();\n }\n onKeyDown?.(event);\n };\n\n const content = (\n <>\n <span className={styles.content}>{children}</span>\n {empty && !label ? <span className=\"block-visually-hidden\">Empty slot</span> : null}\n {label && staticWell ? <span className=\"block-visually-hidden\">{label}</span> : null}\n {locked ? (\n <span className={styles.lock} aria-hidden=\"true\">\n <LockIcon size={16} />\n </span>\n ) : null}\n {tooltip ? (\n <div\n ref={tooltipRef}\n id={tooltipId}\n role=\"tooltip\"\n aria-hidden=\"true\"\n hidden={!tooltipOpen}\n className={styles.tooltip}\n data-placement={placement}\n >\n {tooltip}\n </div>\n ) : null}\n </>\n );\n\n const shared = {\n className: cx(styles.slot, !inGrid && styles[size], className),\n \"data-selected\": isSelected || undefined,\n \"data-disabled\": disabled || undefined,\n \"data-locked\": locked || undefined,\n \"data-rarity\": rarity,\n \"data-empty\": empty || undefined,\n \"aria-label\": staticWell ? undefined : label,\n \"aria-describedby\": tooltip ? tooltipId : undefined,\n onKeyDown: handleKeyDown,\n onMouseEnter: (event: MouseEvent<HTMLElement>) => {\n openTooltip();\n onMouseEnter?.(event);\n },\n onMouseLeave: (event: MouseEvent<HTMLElement>) => {\n closeTooltip();\n onMouseLeave?.(event);\n },\n onFocus: (event: FocusEvent<HTMLElement>) => {\n openTooltip();\n onFocus?.(event);\n },\n onBlur: (event: FocusEvent<HTMLElement>) => {\n closeTooltip();\n onBlur?.(event);\n },\n ...rest,\n };\n\n if (inGrid) {\n return (\n <div\n ref={mergeRefs(ref, register)}\n role=\"gridcell\"\n tabIndex={grid.focusedIndex === index ? 0 : -1}\n aria-selected={isSelected}\n aria-disabled={inactive || undefined}\n onClick={handleClick}\n {...shared}\n onKeyDown={handleKeyDown}\n >\n {content}\n </div>\n );\n }\n\n if (onClick) {\n return (\n <button\n ref={ref as Ref<HTMLButtonElement>}\n type=\"button\"\n aria-pressed={isSelected}\n aria-disabled={inactive || undefined}\n onClick={handleClick}\n {...shared}\n >\n {content}\n </button>\n );\n }\n\n return (\n // Non-interactive slots with tooltips must be focusable so keyboard users can trigger the tooltip\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n <div ref={ref as Ref<HTMLDivElement>} tabIndex={tooltip ? 0 : undefined} {...shared}>\n {content}\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"InventorySlot.js","names":["_Fragment","styles"],"sources":["../../../../src/components/inventory/InventorySlot/InventorySlot.tsx"],"sourcesContent":["import { LockIcon } from \"@malilion/block-ui-icons\";\nimport {\n forwardRef,\n useCallback,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type Ref,\n} from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { mergeRefs } from \"../../../utils/refs\";\nimport { useInventoryGrid, useSlotIndex } from \"../InventoryGrid/context\";\nimport styles from \"./InventorySlot.module.css\";\nimport type { InventorySlotProps } from \"./InventorySlot.types\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\ntype Placement = \"right\" | \"left\";\n\n/**\n * A single inventory slot. Inside an `InventoryGrid` it becomes a roving-focus\n * grid cell; standalone it is a toggle button (when `onClick` is set) or a\n * static well.\n */\nexport const InventorySlot = forwardRef<HTMLElement, InventorySlotProps>(function InventorySlot(\n {\n selected,\n disabled = false,\n locked = false,\n rarity,\n children,\n onClick,\n tooltip,\n label,\n size = \"md\",\n className,\n onKeyDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const grid = useInventoryGrid();\n const index = useSlotIndex();\n const inGrid = grid !== null && index >= 0;\n const inactive = disabled || locked;\n const isSelected = selected ?? (inGrid ? grid.selectedIndex === index : false);\n const empty = children === undefined || children === null || children === false;\n /** Non-interactive wells cannot carry aria-label, so their label is rendered as hidden text. */\n const staticWell = !inGrid && !onClick;\n\n const tooltipId = useId();\n const [tooltipOpen, setTooltipOpen] = useState(false);\n const [placement, setPlacement] = useState<Placement>(\"right\");\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!tooltipOpen || !tooltipRef.current) return;\n const rect = tooltipRef.current.getBoundingClientRect();\n if (placement === \"right\" && rect.right > window.innerWidth - 8) setPlacement(\"left\");\n }, [tooltipOpen, placement]);\n\n const register = useCallback(\n (element: HTMLElement | null) => {\n if (inGrid) grid.registerCell(index, element);\n },\n [grid, inGrid, index],\n );\n\n const openTooltip = () => {\n if (tooltip) setTooltipOpen(true);\n };\n const closeTooltip = () => {\n setTooltipOpen(false);\n setPlacement(\"right\");\n };\n\n const handleClick = () => {\n if (inGrid) {\n grid.setFocusedIndex(index);\n if (!inactive) grid.select(index);\n }\n if (!inactive) onClick?.();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Escape\" && tooltipOpen) {\n event.stopPropagation();\n closeTooltip();\n }\n if (inGrid && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n handleClick();\n }\n onKeyDown?.(event);\n };\n\n const content = (\n <>\n <span className={styles.content}>{children}</span>\n {empty && !label ? <span className=\"block-visually-hidden\">{m.common.emptySlot}</span> : null}\n {label && staticWell ? <span className=\"block-visually-hidden\">{label}</span> : null}\n {locked ? (\n <span className={styles.lock} aria-hidden=\"true\">\n <LockIcon size={16} />\n </span>\n ) : null}\n {tooltip ? (\n <div\n ref={tooltipRef}\n id={tooltipId}\n role=\"tooltip\"\n aria-hidden=\"true\"\n hidden={!tooltipOpen}\n className={styles.tooltip}\n data-placement={placement}\n >\n {tooltip}\n </div>\n ) : null}\n </>\n );\n\n const shared = {\n className: cx(styles.slot, !inGrid && styles[size], className),\n \"data-selected\": isSelected || undefined,\n \"data-disabled\": disabled || undefined,\n \"data-locked\": locked || undefined,\n \"data-rarity\": rarity,\n \"data-empty\": empty || undefined,\n \"aria-label\": staticWell ? undefined : label,\n \"aria-describedby\": tooltip ? tooltipId : undefined,\n onKeyDown: handleKeyDown,\n onMouseEnter: (event: MouseEvent<HTMLElement>) => {\n openTooltip();\n onMouseEnter?.(event);\n },\n onMouseLeave: (event: MouseEvent<HTMLElement>) => {\n closeTooltip();\n onMouseLeave?.(event);\n },\n onFocus: (event: FocusEvent<HTMLElement>) => {\n openTooltip();\n onFocus?.(event);\n },\n onBlur: (event: FocusEvent<HTMLElement>) => {\n closeTooltip();\n onBlur?.(event);\n },\n ...rest,\n };\n\n if (inGrid) {\n return (\n <div\n ref={mergeRefs(ref, register)}\n role=\"gridcell\"\n tabIndex={grid.focusedIndex === index ? 0 : -1}\n aria-selected={isSelected}\n aria-disabled={inactive || undefined}\n onClick={handleClick}\n {...shared}\n onKeyDown={handleKeyDown}\n >\n {content}\n </div>\n );\n }\n\n if (onClick) {\n return (\n <button\n ref={ref as Ref<HTMLButtonElement>}\n type=\"button\"\n aria-pressed={isSelected}\n aria-disabled={inactive || undefined}\n onClick={handleClick}\n {...shared}\n >\n {content}\n </button>\n );\n }\n\n return (\n // Non-interactive slots with tooltips must be focusable so keyboard users can trigger the tooltip\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n <div ref={ref as Ref<HTMLDivElement>} tabIndex={tooltip ? 0 : undefined} {...shared}>\n {content}\n </div>\n );\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ItemStack.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/ItemStack/ItemStack.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD;;;;GAIG;AACH,eAAO,MAAM,SAAS,4GA4BpB,CAAC"}
1
+ {"version":3,"file":"ItemStack.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/ItemStack/ItemStack.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD;;;;GAIG;AACH,eAAO,MAAM,SAAS,4GA6BpB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { DurabilityBar } from "../DurabilityBar/DurabilityBar.js";
3
4
  import ItemStack_module_default from "./ItemStack.module.js";
4
5
  import { describeItemStack } from "./ItemStack.utils.js";
@@ -11,6 +12,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
11
12
  * by a single text description.
12
13
  */
13
14
  var ItemStack = forwardRef(function ItemStack({ icon, amount, maxAmount, durability, maxDurability, name, className, ...rest }, ref) {
15
+ const m = useBlockUIMessages();
14
16
  const showAmount = amount !== void 0 && amount > 1;
15
17
  const full = maxAmount !== void 0 && amount !== void 0 && amount >= maxAmount;
16
18
  const showDurability = durability !== void 0 && maxDurability !== void 0 && durability < maxDurability;
@@ -19,7 +21,7 @@ var ItemStack = forwardRef(function ItemStack({ icon, amount, maxAmount, durabil
19
21
  amount,
20
22
  durability,
21
23
  maxDurability
22
- });
24
+ }, m);
23
25
  return /* @__PURE__ */ jsxs("span", {
24
26
  ref,
25
27
  className: cx(ItemStack_module_default.stack, className),
@@ -1 +1 @@
1
- {"version":3,"file":"ItemStack.js","names":["styles"],"sources":["../../../../src/components/inventory/ItemStack/ItemStack.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { DurabilityBar } from \"../DurabilityBar/DurabilityBar\";\nimport styles from \"./ItemStack.module.css\";\nimport type { ItemStackProps } from \"./ItemStack.types\";\nimport { describeItemStack } from \"./ItemStack.utils\";\n\n/**\n * An item inside a slot: icon, stack amount (bottom-right) and an optional\n * durability bar. Visual details are hidden from screen readers and replaced\n * by a single text description.\n */\nexport const ItemStack = forwardRef<HTMLSpanElement, ItemStackProps>(function ItemStack(\n { icon, amount, maxAmount, durability, maxDurability, name, className, ...rest },\n ref,\n) {\n const showAmount = amount !== undefined && amount > 1;\n const full = maxAmount !== undefined && amount !== undefined && amount >= maxAmount;\n const showDurability =\n durability !== undefined && maxDurability !== undefined && durability < maxDurability;\n const description = describeItemStack({ name, amount, durability, maxDurability });\n\n return (\n <span ref={ref} className={cx(styles.stack, className)} data-full={full || undefined} {...rest}>\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n {showAmount ? (\n <span className={styles.amount} aria-hidden=\"true\">\n {amount}\n </span>\n ) : null}\n {showDurability ? (\n <span className={styles.durability} aria-hidden=\"true\">\n <DurabilityBar value={durability} max={maxDurability} compact />\n </span>\n ) : null}\n {description ? <span className=\"block-visually-hidden\">{description}</span> : null}\n </span>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,YAAY,WAA4C,SAAS,UAC5E,EAAE,MAAM,QAAQ,WAAW,YAAY,eAAe,MAAM,WAAW,GAAG,QAC1E,KACA;CACA,MAAM,aAAa,WAAW,KAAA,KAAa,SAAS;CACpD,MAAM,OAAO,cAAc,KAAA,KAAa,WAAW,KAAA,KAAa,UAAU;CAC1E,MAAM,iBACJ,eAAe,KAAA,KAAa,kBAAkB,KAAA,KAAa,aAAa;CAC1E,MAAM,cAAc,kBAAkB;EAAE;EAAM;EAAQ;EAAY;CAAc,CAAC;CAEjF,OACE,qBAAC,QAAD;EAAW;EAAK,WAAW,GAAGA,yBAAO,OAAO,SAAS;EAAG,aAAW,QAAQ,KAAA;EAAW,GAAI;EAA1F,UAAA;GACE,oBAAC,QAAD;IAAM,WAAWA,yBAAO;IAAM,eAAY;IACvC,UAAA;GACG,CAAA;GACL,aACC,oBAAC,QAAD;IAAM,WAAWA,yBAAO;IAAQ,eAAY;IACzC,UAAA;GACG,CAAA,IACJ;GACH,iBACC,oBAAC,QAAD;IAAM,WAAWA,yBAAO;IAAY,eAAY;IAC9C,UAAA,oBAAC,eAAD;KAAe,OAAO;KAAY,KAAK;KAAe,SAAA;IAAS,CAAA;GAC3D,CAAA,IACJ;GACH,cAAc,oBAAC,QAAD;IAAM,WAAU;IAAyB,UAAA;GAAkB,CAAA,IAAI;EAC1E;;AAEV,CAAC"}
1
+ {"version":3,"file":"ItemStack.js","names":["styles"],"sources":["../../../../src/components/inventory/ItemStack/ItemStack.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { DurabilityBar } from \"../DurabilityBar/DurabilityBar\";\nimport styles from \"./ItemStack.module.css\";\nimport type { ItemStackProps } from \"./ItemStack.types\";\nimport { describeItemStack } from \"./ItemStack.utils\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\n/**\n * An item inside a slot: icon, stack amount (bottom-right) and an optional\n * durability bar. Visual details are hidden from screen readers and replaced\n * by a single text description.\n */\nexport const ItemStack = forwardRef<HTMLSpanElement, ItemStackProps>(function ItemStack(\n { icon, amount, maxAmount, durability, maxDurability, name, className, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n const showAmount = amount !== undefined && amount > 1;\n const full = maxAmount !== undefined && amount !== undefined && amount >= maxAmount;\n const showDurability =\n durability !== undefined && maxDurability !== undefined && durability < maxDurability;\n const description = describeItemStack({ name, amount, durability, maxDurability }, m);\n\n return (\n <span ref={ref} className={cx(styles.stack, className)} data-full={full || undefined} {...rest}>\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n {showAmount ? (\n <span className={styles.amount} aria-hidden=\"true\">\n {amount}\n </span>\n ) : null}\n {showDurability ? (\n <span className={styles.durability} aria-hidden=\"true\">\n <DurabilityBar value={durability} max={maxDurability} compact />\n </span>\n ) : null}\n {description ? <span className=\"block-visually-hidden\">{description}</span> : null}\n </span>\n );\n});\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAa,YAAY,WAA4C,SAAS,UAC5E,EAAE,MAAM,QAAQ,WAAW,YAAY,eAAe,MAAM,WAAW,GAAG,QAC1E,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,aAAa,WAAW,KAAA,KAAa,SAAS;CACpD,MAAM,OAAO,cAAc,KAAA,KAAa,WAAW,KAAA,KAAa,UAAU;CAC1E,MAAM,iBACJ,eAAe,KAAA,KAAa,kBAAkB,KAAA,KAAa,aAAa;CAC1E,MAAM,cAAc,kBAAkB;EAAE;EAAM;EAAQ;EAAY;CAAc,GAAG,CAAC;CAEpF,OACE,qBAAC,QAAD;EAAW;EAAK,WAAW,GAAGA,yBAAO,OAAO,SAAS;EAAG,aAAW,QAAQ,KAAA;EAAW,GAAI;EAA1F,UAAA;GACE,oBAAC,QAAD;IAAM,WAAWA,yBAAO;IAAM,eAAY;IACvC,UAAA;GACG,CAAA;GACL,aACC,oBAAC,QAAD;IAAM,WAAWA,yBAAO;IAAQ,eAAY;IACzC,UAAA;GACG,CAAA,IACJ;GACH,iBACC,oBAAC,QAAD;IAAM,WAAWA,yBAAO;IAAY,eAAY;IAC9C,UAAA,oBAAC,eAAD;KAAe,OAAO;KAAY,KAAK;KAAe,SAAA;IAAS,CAAA;GAC3D,CAAA,IACJ;GACH,cAAc,oBAAC,QAAD;IAAM,WAAU;IAAyB,UAAA;GAAkB,CAAA,IAAI;EAC1E;;AAEV,CAAC"}
@@ -1,4 +1,5 @@
1
+ import { type BlockUIMessages } from "../../../locale/messages";
1
2
  import type { ItemStackProps } from "./ItemStack.types";
2
3
  /** Accessible description of a stack, e.g. "Diamond Pickaxe, durability 126 of 1,561". */
3
- export declare function describeItemStack({ name, amount, durability, maxDurability, }: Pick<ItemStackProps, "name" | "amount" | "durability" | "maxDurability">): string;
4
+ export declare function describeItemStack({ name, amount, durability, maxDurability, }: Pick<ItemStackProps, "name" | "amount" | "durability" | "maxDurability">, messages?: BlockUIMessages): string;
4
5
  //# sourceMappingURL=ItemStack.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ItemStack.utils.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/ItemStack/ItemStack.utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,MAAM,EACN,UAAU,EACV,aAAa,GACd,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,eAAe,CAAC,GAAG,MAAM,CAQnF"}
1
+ {"version":3,"file":"ItemStack.utils.d.ts","sourceRoot":"","sources":["../../../../src/components/inventory/ItemStack/ItemStack.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAC/B,EACE,IAAI,EACJ,MAAM,EACN,UAAU,EACV,aAAa,GACd,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,eAAe,CAAC,EAC3E,QAAQ,GAAE,eAA4B,GACrC,MAAM,CASR"}