@malilion/block-ui-react 0.5.1 → 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 { BlockButton } from "../../actions/BlockButton/BlockButton.js";
3
4
  import { BlockInput } from "../../forms/BlockInput/BlockInput.js";
4
5
  import { BlockSelect } from "../../forms/BlockSelect/BlockSelect.js";
@@ -9,15 +10,16 @@ import { forwardRef, useState } from "react";
9
10
  import { PlusIcon, SearchIcon } from "@malilion/block-ui-icons";
10
11
  import { jsx, jsxs } from "react/jsx-runtime";
11
12
  //#region src/components/cards/WorldBrowser/WorldBrowser.tsx
12
- var SORT_OPTIONS = [{
13
- value: "recent",
14
- label: "Last played"
15
- }, {
16
- value: "name",
17
- label: "Name"
18
- }];
19
13
  /** Singleplayer world list: search, game-mode filter and sort over `WorldCard`s. */
20
- var WorldBrowser = forwardRef(function WorldBrowser({ worlds, onPlay, onCreate, defaultSort = "recent", emptyText = "No worlds yet", label = "World browser", className, ...rest }, ref) {
14
+ var WorldBrowser = forwardRef(function WorldBrowser({ worlds, onPlay, onCreate, defaultSort = "recent", emptyText, label, className, ...rest }, ref) {
15
+ const m = useBlockUIMessages();
16
+ const sortOptions = [{
17
+ value: "recent",
18
+ label: m.worldBrowser.lastPlayed
19
+ }, {
20
+ value: "name",
21
+ label: m.common.name
22
+ }];
21
23
  const [query, setQuery] = useState("");
22
24
  const [mode, setMode] = useState("all");
23
25
  const [sort, setSort] = useState(defaultSort);
@@ -30,7 +32,7 @@ var WorldBrowser = forwardRef(function WorldBrowser({ worlds, onPlay, onCreate,
30
32
  return /* @__PURE__ */ jsxs("div", {
31
33
  ref,
32
34
  role: "region",
33
- "aria-label": label,
35
+ "aria-label": label ?? m.worldBrowser.label,
34
36
  className: cx(browser_module_default.browser, className),
35
37
  ...rest,
36
38
  children: [
@@ -39,19 +41,19 @@ var WorldBrowser = forwardRef(function WorldBrowser({ worlds, onPlay, onCreate,
39
41
  children: [
40
42
  /* @__PURE__ */ jsx(BlockInput, {
41
43
  type: "search",
42
- label: "Search worlds",
44
+ label: m.worldBrowser.search,
43
45
  value: query,
44
46
  onChange: (event) => setQuery(event.target.value),
45
47
  startIcon: /* @__PURE__ */ jsx(SearchIcon, { size: 16 }),
46
48
  wrapperClassName: browser_module_default.search
47
49
  }),
48
50
  modes.length > 1 ? /* @__PURE__ */ jsx(BlockSelect, {
49
- label: "Game mode",
51
+ label: m.worldBrowser.gameMode,
50
52
  value: mode,
51
53
  onChange: (event) => setMode(event.target.value),
52
54
  options: [{
53
55
  value: "all",
54
- label: "All modes"
56
+ label: m.worldBrowser.allModes
55
57
  }, ...modes.map((value) => ({
56
58
  value,
57
59
  label: value
@@ -59,10 +61,10 @@ var WorldBrowser = forwardRef(function WorldBrowser({ worlds, onPlay, onCreate,
59
61
  wrapperClassName: browser_module_default.filter
60
62
  }) : null,
61
63
  /* @__PURE__ */ jsx(BlockSelect, {
62
- label: "Sort by",
64
+ label: m.common.sortBy,
63
65
  value: sort,
64
66
  onChange: (event) => setSort(event.target.value),
65
- options: SORT_OPTIONS,
67
+ options: sortOptions,
66
68
  wrapperClassName: browser_module_default.filter
67
69
  }),
68
70
  onCreate ? /* @__PURE__ */ jsx("div", {
@@ -71,7 +73,7 @@ var WorldBrowser = forwardRef(function WorldBrowser({ worlds, onPlay, onCreate,
71
73
  variant: "grass",
72
74
  startIcon: /* @__PURE__ */ jsx(PlusIcon, { size: 16 }),
73
75
  onClick: onCreate,
74
- children: "Create world"
76
+ children: m.worldBrowser.createWorld
75
77
  })
76
78
  }) : null
77
79
  ]
@@ -79,18 +81,18 @@ var WorldBrowser = forwardRef(function WorldBrowser({ worlds, onPlay, onCreate,
79
81
  /* @__PURE__ */ jsx("p", {
80
82
  className: browser_module_default.count,
81
83
  role: "status",
82
- children: visible.length === 1 ? "1 world" : `${visible.length} worlds`
84
+ children: m.worldBrowser.count(visible.length)
83
85
  }),
84
86
  visible.length > 0 ? /* @__PURE__ */ jsx("ul", {
85
87
  className: browser_module_default.list,
86
- "aria-label": "Worlds",
88
+ "aria-label": m.worldBrowser.worlds,
87
89
  children: visible.map(({ id, lastPlayedAt: _lastPlayedAt, ...world }) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(WorldCard, {
88
90
  ...world,
89
91
  onPlay: onPlay ? () => onPlay(id) : void 0
90
92
  }) }, id))
91
93
  }) : /* @__PURE__ */ jsx("p", {
92
94
  className: browser_module_default.empty,
93
- children: emptyText
95
+ children: emptyText === void 0 ? m.worldBrowser.empty : emptyText
94
96
  })
95
97
  ]
96
98
  });
@@ -1 +1 @@
1
- {"version":3,"file":"WorldBrowser.js","names":["styles"],"sources":["../../../../src/components/cards/WorldBrowser/WorldBrowser.tsx"],"sourcesContent":["import { PlusIcon, SearchIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useState } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockInput } from \"../../forms/BlockInput/BlockInput\";\nimport { BlockSelect } from \"../../forms/BlockSelect/BlockSelect\";\nimport styles from \"../browser.module.css\";\nimport { WorldCard } from \"../WorldCard/WorldCard\";\nimport type { WorldBrowserProps, WorldSort } from \"./WorldBrowser.types\";\nimport { ALL_MODES, browseWorlds, gameModes } from \"./WorldBrowser.utils\";\n\nconst SORT_OPTIONS = [\n { value: \"recent\", label: \"Last played\" },\n { value: \"name\", label: \"Name\" },\n];\n\n/** Singleplayer world list: search, game-mode filter and sort over `WorldCard`s. */\nexport const WorldBrowser = forwardRef<HTMLDivElement, WorldBrowserProps>(function WorldBrowser(\n {\n worlds,\n onPlay,\n onCreate,\n defaultSort = \"recent\",\n emptyText = \"No worlds yet\",\n label = \"World browser\",\n className,\n ...rest\n },\n ref,\n) {\n const [query, setQuery] = useState(\"\");\n const [mode, setMode] = useState(ALL_MODES);\n const [sort, setSort] = useState<WorldSort>(defaultSort);\n const modes = gameModes(worlds);\n const visible = browseWorlds(worlds, { query, mode, sort });\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label}\n className={cx(styles.browser, className)}\n {...rest}\n >\n <div className={styles.toolbar}>\n <BlockInput\n type=\"search\"\n label=\"Search worlds\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n startIcon={<SearchIcon size={16} />}\n wrapperClassName={styles.search}\n />\n {modes.length > 1 ? (\n <BlockSelect\n label=\"Game mode\"\n value={mode}\n onChange={(event) => setMode(event.target.value)}\n options={[\n { value: ALL_MODES, label: \"All modes\" },\n ...modes.map((value) => ({ value, label: value })),\n ]}\n wrapperClassName={styles.filter}\n />\n ) : null}\n <BlockSelect\n label=\"Sort by\"\n value={sort}\n onChange={(event) => setSort(event.target.value as WorldSort)}\n options={SORT_OPTIONS}\n wrapperClassName={styles.filter}\n />\n {onCreate ? (\n <div className={styles.actions}>\n <BlockButton variant=\"grass\" startIcon={<PlusIcon size={16} />} onClick={onCreate}>\n Create world\n </BlockButton>\n </div>\n ) : null}\n </div>\n <p className={styles.count} role=\"status\">\n {visible.length === 1 ? \"1 world\" : `${visible.length} worlds`}\n </p>\n {visible.length > 0 ? (\n <ul className={styles.list} aria-label=\"Worlds\">\n {visible.map(({ id, lastPlayedAt: _lastPlayedAt, ...world }) => (\n <li key={id}>\n <WorldCard {...world} onPlay={onPlay ? () => onPlay(id) : undefined} />\n </li>\n ))}\n </ul>\n ) : (\n <p className={styles.empty}>{emptyText}</p>\n )}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;AAWA,IAAM,eAAe,CACnB;CAAE,OAAO;CAAU,OAAO;AAAc,GACxC;CAAE,OAAO;CAAQ,OAAO;AAAO,CACjC;;AAGA,IAAa,eAAe,WAA8C,SAAS,aACjF,EACE,QACA,QACA,UACA,cAAc,UACd,YAAY,iBACZ,QAAQ,iBACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,MAAM,WAAW,SAAA,KAAkB;CAC1C,MAAM,CAAC,MAAM,WAAW,SAAoB,WAAW;CACvD,MAAM,QAAQ,UAAU,MAAM;CAC9B,MAAM,UAAU,aAAa,QAAQ;EAAE;EAAO;EAAM;CAAK,CAAC;CAE1D,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY;EACZ,WAAW,GAAGA,uBAAO,SAAS,SAAS;EACvC,GAAI;EALN,UAAA;GAOE,qBAAC,OAAD;IAAK,WAAWA,uBAAO;IAAvB,UAAA;KACE,oBAAC,YAAD;MACE,MAAK;MACL,OAAM;MACN,OAAO;MACP,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;MAChD,WAAW,oBAAC,YAAD,EAAY,MAAM,GAAK,CAAA;MAClC,kBAAkBA,uBAAO;KAC1B,CAAA;KACA,MAAM,SAAS,IACd,oBAAC,aAAD;MACE,OAAM;MACN,OAAO;MACP,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAK;MAC/C,SAAS,CACP;OAAE,OAAA;OAAkB,OAAO;MAAY,GACvC,GAAG,MAAM,KAAK,WAAW;OAAE;OAAO,OAAO;MAAM,EAAE,CACnD;MACA,kBAAkBA,uBAAO;KAC1B,CAAA,IACC;KACJ,oBAAC,aAAD;MACE,OAAM;MACN,OAAO;MACP,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAkB;MAC5D,SAAS;MACT,kBAAkBA,uBAAO;KAC1B,CAAA;KACA,WACC,oBAAC,OAAD;MAAK,WAAWA,uBAAO;MACrB,UAAA,oBAAC,aAAD;OAAa,SAAQ;OAAQ,WAAW,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;OAAG,SAAS;OAAU,UAAA;MAEtE,CAAA;KACV,CAAA,IACH;IACD;;GACL,oBAAC,KAAD;IAAG,WAAWA,uBAAO;IAAO,MAAK;IAC9B,UAAA,QAAQ,WAAW,IAAI,YAAY,GAAG,QAAQ,OAAO;GACrD,CAAA;GACF,QAAQ,SAAS,IAChB,oBAAC,MAAD;IAAI,WAAWA,uBAAO;IAAM,cAAW;IACpC,UAAA,QAAQ,KAAK,EAAE,IAAI,cAAc,eAAe,GAAG,YAClD,oBAAC,MAAD,EAAA,UACE,oBAAC,WAAD;KAAW,GAAI;KAAO,QAAQ,eAAe,OAAO,EAAE,IAAI,KAAA;IAAY,CAAA,EACpE,GAFK,EAEL,CACL;GACC,CAAA,IAEJ,oBAAC,KAAD;IAAG,WAAWA,uBAAO;IAAQ,UAAA;GAAa,CAAA;EAEzC;;AAET,CAAC"}
1
+ {"version":3,"file":"WorldBrowser.js","names":["styles"],"sources":["../../../../src/components/cards/WorldBrowser/WorldBrowser.tsx"],"sourcesContent":["import { PlusIcon, SearchIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useState } from \"react\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockInput } from \"../../forms/BlockInput/BlockInput\";\nimport { BlockSelect } from \"../../forms/BlockSelect/BlockSelect\";\nimport styles from \"../browser.module.css\";\nimport { WorldCard } from \"../WorldCard/WorldCard\";\nimport type { WorldBrowserProps, WorldSort } from \"./WorldBrowser.types\";\nimport { ALL_MODES, browseWorlds, gameModes } from \"./WorldBrowser.utils\";\n\n/** Singleplayer world list: search, game-mode filter and sort over `WorldCard`s. */\nexport const WorldBrowser = forwardRef<HTMLDivElement, WorldBrowserProps>(function WorldBrowser(\n { worlds, onPlay, onCreate, defaultSort = \"recent\", emptyText, label, className, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n const sortOptions = [\n { value: \"recent\", label: m.worldBrowser.lastPlayed },\n { value: \"name\", label: m.common.name },\n ];\n const [query, setQuery] = useState(\"\");\n const [mode, setMode] = useState(ALL_MODES);\n const [sort, setSort] = useState<WorldSort>(defaultSort);\n const modes = gameModes(worlds);\n const visible = browseWorlds(worlds, { query, mode, sort });\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label ?? m.worldBrowser.label}\n className={cx(styles.browser, className)}\n {...rest}\n >\n <div className={styles.toolbar}>\n <BlockInput\n type=\"search\"\n label={m.worldBrowser.search}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n startIcon={<SearchIcon size={16} />}\n wrapperClassName={styles.search}\n />\n {modes.length > 1 ? (\n <BlockSelect\n label={m.worldBrowser.gameMode}\n value={mode}\n onChange={(event) => setMode(event.target.value)}\n options={[\n { value: ALL_MODES, label: m.worldBrowser.allModes },\n ...modes.map((value) => ({ value, label: value })),\n ]}\n wrapperClassName={styles.filter}\n />\n ) : null}\n <BlockSelect\n label={m.common.sortBy}\n value={sort}\n onChange={(event) => setSort(event.target.value as WorldSort)}\n options={sortOptions}\n wrapperClassName={styles.filter}\n />\n {onCreate ? (\n <div className={styles.actions}>\n <BlockButton variant=\"grass\" startIcon={<PlusIcon size={16} />} onClick={onCreate}>\n {m.worldBrowser.createWorld}\n </BlockButton>\n </div>\n ) : null}\n </div>\n <p className={styles.count} role=\"status\">\n {m.worldBrowser.count(visible.length)}\n </p>\n {visible.length > 0 ? (\n <ul className={styles.list} aria-label={m.worldBrowser.worlds}>\n {visible.map(({ id, lastPlayedAt: _lastPlayedAt, ...world }) => (\n <li key={id}>\n <WorldCard {...world} onPlay={onPlay ? () => onPlay(id) : undefined} />\n </li>\n ))}\n </ul>\n ) : (\n <p className={styles.empty}>{emptyText === undefined ? m.worldBrowser.empty : emptyText}</p>\n )}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAa,eAAe,WAA8C,SAAS,aACjF,EAAE,QAAQ,QAAQ,UAAU,cAAc,UAAU,WAAW,OAAO,WAAW,GAAG,QACpF,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,cAAc,CAClB;EAAE,OAAO;EAAU,OAAO,EAAE,aAAa;CAAW,GACpD;EAAE,OAAO;EAAQ,OAAO,EAAE,OAAO;CAAK,CACxC;CACA,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,MAAM,WAAW,SAAA,KAAkB;CAC1C,MAAM,CAAC,MAAM,WAAW,SAAoB,WAAW;CACvD,MAAM,QAAQ,UAAU,MAAM;CAC9B,MAAM,UAAU,aAAa,QAAQ;EAAE;EAAO;EAAM;CAAK,CAAC;CAE1D,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY,SAAS,EAAE,aAAa;EACpC,WAAW,GAAGA,uBAAO,SAAS,SAAS;EACvC,GAAI;EALN,UAAA;GAOE,qBAAC,OAAD;IAAK,WAAWA,uBAAO;IAAvB,UAAA;KACE,oBAAC,YAAD;MACE,MAAK;MACL,OAAO,EAAE,aAAa;MACtB,OAAO;MACP,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;MAChD,WAAW,oBAAC,YAAD,EAAY,MAAM,GAAK,CAAA;MAClC,kBAAkBA,uBAAO;KAC1B,CAAA;KACA,MAAM,SAAS,IACd,oBAAC,aAAD;MACE,OAAO,EAAE,aAAa;MACtB,OAAO;MACP,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAK;MAC/C,SAAS,CACP;OAAE,OAAA;OAAkB,OAAO,EAAE,aAAa;MAAS,GACnD,GAAG,MAAM,KAAK,WAAW;OAAE;OAAO,OAAO;MAAM,EAAE,CACnD;MACA,kBAAkBA,uBAAO;KAC1B,CAAA,IACC;KACJ,oBAAC,aAAD;MACE,OAAO,EAAE,OAAO;MAChB,OAAO;MACP,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAkB;MAC5D,SAAS;MACT,kBAAkBA,uBAAO;KAC1B,CAAA;KACA,WACC,oBAAC,OAAD;MAAK,WAAWA,uBAAO;MACrB,UAAA,oBAAC,aAAD;OAAa,SAAQ;OAAQ,WAAW,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;OAAG,SAAS;OACtE,UAAA,EAAE,aAAa;MACL,CAAA;KACV,CAAA,IACH;IACD;;GACL,oBAAC,KAAD;IAAG,WAAWA,uBAAO;IAAO,MAAK;IAC9B,UAAA,EAAE,aAAa,MAAM,QAAQ,MAAM;GACnC,CAAA;GACF,QAAQ,SAAS,IAChB,oBAAC,MAAD;IAAI,WAAWA,uBAAO;IAAM,cAAY,EAAE,aAAa;IACpD,UAAA,QAAQ,KAAK,EAAE,IAAI,cAAc,eAAe,GAAG,YAClD,oBAAC,MAAD,EAAA,UACE,oBAAC,WAAD;KAAW,GAAI;KAAO,QAAQ,eAAe,OAAO,EAAE,IAAI,KAAA;IAAY,CAAA,EACpE,GAFK,EAEL,CACL;GACC,CAAA,IAEJ,oBAAC,KAAD;IAAG,WAAWA,uBAAO;IAAQ,UAAA,cAAc,KAAA,IAAY,EAAE,aAAa,QAAQ;GAAa,CAAA;EAE1F;;AAET,CAAC"}
@@ -14,9 +14,9 @@ export interface WorldBrowserProps extends Omit<HTMLAttributes<HTMLDivElement>,
14
14
  onCreate?: () => void;
15
15
  /** Initial sort. @default "recent" */
16
16
  defaultSort?: WorldSort;
17
- /** Shown when no world matches. @default "No worlds yet" */
17
+ /** Shown when no world matches. @default messages.worldBrowser.empty ("No worlds yet") */
18
18
  emptyText?: ReactNode;
19
- /** Accessible name. @default "World browser" */
19
+ /** Accessible name. @default messages.worldBrowser.label ("World browser") */
20
20
  label?: string;
21
21
  }
22
22
  //# sourceMappingURL=WorldBrowser.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorldBrowser.types.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/WorldBrowser/WorldBrowser.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC;IACvF,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,gEAAgE;IAChE,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,sCAAsC;IACtC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"WorldBrowser.types.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/WorldBrowser/WorldBrowser.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC;IACvF,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,gEAAgE;IAChE,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,sCAAsC;IACtC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"WorldCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/WorldCard/WorldCard.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,6DAA6D;AAC7D,eAAO,MAAM,SAAS,wGAsDpB,CAAC"}
1
+ {"version":3,"file":"WorldCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/WorldCard/WorldCard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,6DAA6D;AAC7D,eAAO,MAAM,SAAS,wGA+DpB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { IconButton } from "../../actions/IconButton/IconButton.js";
3
4
  import { formatNumber } from "../../../utils/number.js";
4
5
  import { BlockCard } from "../BlockCard/BlockCard.js";
@@ -9,11 +10,12 @@ import { PlayIcon } from "@malilion/block-ui-icons";
9
10
  import { jsx, jsxs } from "react/jsx-runtime";
10
11
  //#region src/components/cards/WorldCard/WorldCard.tsx
11
12
  /** Saved world with a preview, details and a Play button. */
12
- var WorldCard = forwardRef(function WorldCard({ name, image, gameMode, day, seed, lastPlayed, onPlay, material = "grass", label = "World", className, ...rest }, ref) {
13
+ var WorldCard = forwardRef(function WorldCard({ name, image, gameMode, day, seed, lastPlayed, onPlay, material = "grass", label, className, ...rest }, ref) {
14
+ const m = useBlockUIMessages();
13
15
  return /* @__PURE__ */ jsxs(BlockCard, {
14
16
  ref,
15
17
  material,
16
- label,
18
+ label: label === void 0 ? m.worldCard.label : label,
17
19
  className: cx(cards_module_default.card, className),
18
20
  ...rest,
19
21
  children: [/* @__PURE__ */ jsx("div", {
@@ -37,20 +39,28 @@ var WorldCard = forwardRef(function WorldCard({ name, image, gameMode, day, seed
37
39
  }),
38
40
  /* @__PURE__ */ jsx("p", {
39
41
  className: cards_module_default.description,
40
- children: [gameMode, day !== void 0 ? `Day ${formatNumber(day)}` : void 0].filter(Boolean).join(" · ")
42
+ children: [gameMode, day !== void 0 ? m.worldCard.day(formatNumber(day)) : void 0].filter(Boolean).join(" · ")
41
43
  }),
42
44
  seed ? /* @__PURE__ */ jsxs("p", {
43
45
  className: cards_module_default.description,
44
- children: ["Seed: ", seed]
46
+ children: [
47
+ m.worldCard.seed,
48
+ " ",
49
+ seed
50
+ ]
45
51
  }) : null,
46
52
  lastPlayed ? /* @__PURE__ */ jsxs("p", {
47
53
  className: cards_module_default.description,
48
- children: ["Last played ", lastPlayed]
54
+ children: [
55
+ m.worldCard.lastPlayed,
56
+ " ",
57
+ lastPlayed
58
+ ]
49
59
  }) : null
50
60
  ]
51
61
  }), onPlay ? /* @__PURE__ */ jsx(IconButton, {
52
62
  icon: /* @__PURE__ */ jsx(PlayIcon, { size: 16 }),
53
- label: `Play ${name}`,
63
+ label: m.worldCard.play(name),
54
64
  variant: "grass",
55
65
  onClick: onPlay,
56
66
  className: WorldCard_module_default.play
@@ -1 +1 @@
1
- {"version":3,"file":"WorldCard.js","names":["styles","worldStyles"],"sources":["../../../../src/components/cards/WorldCard/WorldCard.tsx"],"sourcesContent":["import { PlayIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber } from \"../../../utils/number\";\nimport { IconButton } from \"../../actions/IconButton/IconButton\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport worldStyles from \"./WorldCard.module.css\";\nimport type { WorldCardProps } from \"./WorldCard.types\";\n\n/** Saved world with a preview, details and a Play button. */\nexport const WorldCard = forwardRef<HTMLElement, WorldCardProps>(function WorldCard(\n {\n name,\n image,\n gameMode,\n day,\n seed,\n lastPlayed,\n onPlay,\n material = \"grass\",\n label = \"World\",\n className,\n ...rest\n },\n ref,\n) {\n return (\n <BlockCard\n ref={ref}\n material={material}\n label={label}\n className={cx(styles.card, className)}\n {...rest}\n >\n <div className={worldStyles.preview}>\n {image ? (\n <img src={image} alt=\"\" className={worldStyles.image} />\n ) : (\n <span className={worldStyles.landscape} aria-hidden=\"true\" />\n )}\n </div>\n <div className={worldStyles.info}>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{name}</p>\n <p className={styles.description}>\n {[gameMode, day !== undefined ? `Day ${formatNumber(day)}` : undefined]\n .filter(Boolean)\n .join(\" · \")}\n </p>\n {seed ? <p className={styles.description}>Seed: {seed}</p> : null}\n {lastPlayed ? <p className={styles.description}>Last played {lastPlayed}</p> : null}\n </div>\n {onPlay ? (\n <IconButton\n icon={<PlayIcon size={16} />}\n label={`Play ${name}`}\n variant=\"grass\"\n onClick={onPlay}\n className={worldStyles.play}\n />\n ) : null}\n </div>\n </BlockCard>\n );\n});\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,YAAY,WAAwC,SAAS,UACxE,EACE,MACA,OACA,UACA,KACA,MACA,YACA,QACA,WAAW,SACX,QAAQ,SACR,WACA,GAAG,QAEL,KACA;CACA,OACE,qBAAC,WAAD;EACO;EACK;EACH;EACP,WAAW,GAAGA,qBAAO,MAAM,SAAS;EACpC,GAAI;EALN,UAAA,CAOE,oBAAC,OAAD;GAAK,WAAWC,yBAAY;GACzB,UAAA,QACC,oBAAC,OAAD;IAAK,KAAK;IAAO,KAAI;IAAG,WAAWA,yBAAY;GAAQ,CAAA,IAEvD,oBAAC,QAAD;IAAM,WAAWA,yBAAY;IAAW,eAAY;GAAQ,CAAA;EAE3D,CAAA,GACL,qBAAC,OAAD;GAAK,WAAWA,yBAAY;GAA5B,UAAA,CACE,qBAAC,OAAD;IAAK,WAAWD,qBAAO;IAAvB,UAAA;KACE,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAQ,UAAA;KAAQ,CAAA;KACrC,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAClB,UAAA,CAAC,UAAU,QAAQ,KAAA,IAAY,OAAO,aAAa,GAAG,MAAM,KAAA,CAAS,CAAC,CACpE,OAAO,OAAO,CAAC,CACf,KAAK,KAAK;KACZ,CAAA;KACF,OAAO,qBAAC,KAAD;MAAG,WAAWA,qBAAO;MAArB,UAAA,CAAkC,UAAO,IAAQ;KAAI,CAAA,IAAA;KAC5D,aAAa,qBAAC,KAAD;MAAG,WAAWA,qBAAO;MAArB,UAAA,CAAkC,gBAAa,UAAc;KAAI,CAAA,IAAA;IAC5E;GACJ,CAAA,GAAA,SACC,oBAAC,YAAD;IACE,MAAM,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;IAC3B,OAAO,QAAQ;IACf,SAAQ;IACR,SAAS;IACT,WAAWC,yBAAY;GACxB,CAAA,IACC,IACD;EACI,CAAA,CAAA;;AAEf,CAAC"}
1
+ {"version":3,"file":"WorldCard.js","names":["styles","worldStyles"],"sources":["../../../../src/components/cards/WorldCard/WorldCard.tsx"],"sourcesContent":["import { PlayIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber } from \"../../../utils/number\";\nimport { IconButton } from \"../../actions/IconButton/IconButton\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport worldStyles from \"./WorldCard.module.css\";\nimport type { WorldCardProps } from \"./WorldCard.types\";\n\n/** Saved world with a preview, details and a Play button. */\nexport const WorldCard = forwardRef<HTMLElement, WorldCardProps>(function WorldCard(\n {\n name,\n image,\n gameMode,\n day,\n seed,\n lastPlayed,\n onPlay,\n material = \"grass\",\n label,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n return (\n <BlockCard\n ref={ref}\n material={material}\n label={label === undefined ? m.worldCard.label : label}\n className={cx(styles.card, className)}\n {...rest}\n >\n <div className={worldStyles.preview}>\n {image ? (\n <img src={image} alt=\"\" className={worldStyles.image} />\n ) : (\n <span className={worldStyles.landscape} aria-hidden=\"true\" />\n )}\n </div>\n <div className={worldStyles.info}>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{name}</p>\n <p className={styles.description}>\n {[gameMode, day !== undefined ? m.worldCard.day(formatNumber(day)) : undefined]\n .filter(Boolean)\n .join(\" · \")}\n </p>\n {seed ? (\n <p className={styles.description}>\n {m.worldCard.seed} {seed}\n </p>\n ) : null}\n {lastPlayed ? (\n <p className={styles.description}>\n {m.worldCard.lastPlayed} {lastPlayed}\n </p>\n ) : null}\n </div>\n {onPlay ? (\n <IconButton\n icon={<PlayIcon size={16} />}\n label={m.worldCard.play(name)}\n variant=\"grass\"\n onClick={onPlay}\n className={worldStyles.play}\n />\n ) : null}\n </div>\n </BlockCard>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,YAAY,WAAwC,SAAS,UACxE,EACE,MACA,OACA,UACA,KACA,MACA,YACA,QACA,WAAW,SACX,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,OACE,qBAAC,WAAD;EACO;EACK;EACV,OAAO,UAAU,KAAA,IAAY,EAAE,UAAU,QAAQ;EACjD,WAAW,GAAGA,qBAAO,MAAM,SAAS;EACpC,GAAI;EALN,UAAA,CAOE,oBAAC,OAAD;GAAK,WAAWC,yBAAY;GACzB,UAAA,QACC,oBAAC,OAAD;IAAK,KAAK;IAAO,KAAI;IAAG,WAAWA,yBAAY;GAAQ,CAAA,IAEvD,oBAAC,QAAD;IAAM,WAAWA,yBAAY;IAAW,eAAY;GAAQ,CAAA;EAE3D,CAAA,GACL,qBAAC,OAAD;GAAK,WAAWA,yBAAY;GAA5B,UAAA,CACE,qBAAC,OAAD;IAAK,WAAWD,qBAAO;IAAvB,UAAA;KACE,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAQ,UAAA;KAAQ,CAAA;KACrC,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAClB,UAAA,CAAC,UAAU,QAAQ,KAAA,IAAY,EAAE,UAAU,IAAI,aAAa,GAAG,CAAC,IAAI,KAAA,CAAS,CAAC,CAC5E,OAAO,OAAO,CAAC,CACf,KAAK,KAAK;KACZ,CAAA;KACF,OACC,qBAAC,KAAD;MAAG,WAAWA,qBAAO;MAArB,UAAA;OACG,EAAE,UAAU;OAAK;OAAE;MACnB;KACD,CAAA,IAAA;KACH,aACC,qBAAC,KAAD;MAAG,WAAWA,qBAAO;MAArB,UAAA;OACG,EAAE,UAAU;OAAW;OAAE;MACzB;KACD,CAAA,IAAA;IACD;GACJ,CAAA,GAAA,SACC,oBAAC,YAAD;IACE,MAAM,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;IAC3B,OAAO,EAAE,UAAU,KAAK,IAAI;IAC5B,SAAQ;IACR,SAAS;IACT,WAAWC,yBAAY;GACxB,CAAA,IACC,IACD;EACI,CAAA,CAAA;;AAEf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Anvil.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/Anvil/Anvil.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD;;;GAGG;AACH,eAAO,MAAM,KAAK,uGAiFhB,CAAC"}
1
+ {"version":3,"file":"Anvil.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/Anvil/Anvil.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD;;;GAGG;AACH,eAAO,MAAM,KAAK,uGAsFhB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { BlockInput } from "../../forms/BlockInput/BlockInput.js";
3
4
  import { useControllableState } from "../../../hooks/useControllableState.js";
4
5
  import { InventorySlot } from "../../inventory/InventorySlot/InventorySlot.js";
@@ -14,7 +15,8 @@ var filled = (node) => node !== void 0 && node !== null && node !== false;
14
15
  * Anvil: rename field, two input slots combining into a result, and the
15
16
  * experience cost — red when the player cannot afford it, "Too Expensive!" at the cap.
16
17
  */
17
- var Anvil = forwardRef(function Anvil({ left, right, result, name, defaultName = "", onNameChange, cost, playerLevel, maxCost = 40, onTakeResult, label = "Anvil", className, ...rest }, ref) {
18
+ var Anvil = forwardRef(function Anvil({ left, right, result, name, defaultName = "", onNameChange, cost, playerLevel, maxCost = 40, onTakeResult, label, className, ...rest }, ref) {
19
+ const m = useBlockUIMessages();
18
20
  const costId = useId();
19
21
  const [itemName, setItemName] = useControllableState({
20
22
  value: name,
@@ -27,7 +29,7 @@ var Anvil = forwardRef(function Anvil({ left, right, result, name, defaultName =
27
29
  return /* @__PURE__ */ jsxs("div", {
28
30
  ref,
29
31
  role: "group",
30
- "aria-label": label,
32
+ "aria-label": label ?? m.anvil.label,
31
33
  "data-cost": costState,
32
34
  className: cx(Anvil_module_default.anvil, className),
33
35
  ...rest,
@@ -39,7 +41,7 @@ var Anvil = forwardRef(function Anvil({ left, right, result, name, defaultName =
39
41
  "aria-hidden": "true",
40
42
  children: /* @__PURE__ */ jsx(AnvilIcon, { size: 32 })
41
43
  }), /* @__PURE__ */ jsx(BlockInput, {
42
- label: "Item name",
44
+ label: m.anvil.itemName,
43
45
  value: itemName,
44
46
  onChange: (event) => setItemName(event.target.value),
45
47
  disabled: !hasLeft,
@@ -52,7 +54,7 @@ var Anvil = forwardRef(function Anvil({ left, right, result, name, defaultName =
52
54
  children: [
53
55
  /* @__PURE__ */ jsx(InventorySlot, {
54
56
  size: "lg",
55
- label: hasLeft ? void 0 : "Item: empty",
57
+ label: hasLeft ? void 0 : m.common.emptyNamed(m.anvil.item),
56
58
  children: left
57
59
  }),
58
60
  /* @__PURE__ */ jsx("span", {
@@ -62,7 +64,7 @@ var Anvil = forwardRef(function Anvil({ left, right, result, name, defaultName =
62
64
  }),
63
65
  /* @__PURE__ */ jsx(InventorySlot, {
64
66
  size: "lg",
65
- label: filled(right) ? void 0 : "Material: empty",
67
+ label: filled(right) ? void 0 : m.common.emptyNamed(m.anvil.material),
66
68
  children: right
67
69
  }),
68
70
  /* @__PURE__ */ jsx("span", {
@@ -71,7 +73,7 @@ var Anvil = forwardRef(function Anvil({ left, right, result, name, defaultName =
71
73
  children: /* @__PURE__ */ jsx(ArrowIcon, { size: 32 })
72
74
  }),
73
75
  /* @__PURE__ */ jsx(CraftingResult, {
74
- label: "Result",
76
+ label: m.common.result,
75
77
  onTake: blocked ? void 0 : onTakeResult,
76
78
  disabled: blocked,
77
79
  "aria-describedby": costState === "none" ? void 0 : costId,
@@ -83,7 +85,7 @@ var Anvil = forwardRef(function Anvil({ left, right, result, name, defaultName =
83
85
  id: costId,
84
86
  className: Anvil_module_default.cost,
85
87
  "aria-live": "polite",
86
- children: costState === "tooExpensive" ? "Too Expensive!" : `Enchantment Cost: ${cost}${costState === "unaffordable" ? " (not enough levels)" : ""}`
88
+ children: costState === "tooExpensive" ? m.anvil.tooExpensive : m.anvil.cost(String(cost)) + (costState === "unaffordable" ? m.anvil.notEnoughLevels : "")
87
89
  }) : null
88
90
  ]
89
91
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Anvil.js","names":["styles"],"sources":["../../../../src/components/crafting/Anvil/Anvil.tsx"],"sourcesContent":["import { AnvilIcon, ArrowIcon, PlusIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId } from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockInput } from \"../../forms/BlockInput/BlockInput\";\nimport { InventorySlot } from \"../../inventory/InventorySlot/InventorySlot\";\nimport { CraftingResult } from \"../CraftingResult/CraftingResult\";\nimport styles from \"./Anvil.module.css\";\nimport type { AnvilProps } from \"./Anvil.types\";\nimport { anvilCostState } from \"./Anvil.utils\";\n\nconst filled = (node: unknown) => node !== undefined && node !== null && node !== false;\n\n/**\n * Anvil: rename field, two input slots combining into a result, and the\n * experience cost — red when the player cannot afford it, \"Too Expensive!\" at the cap.\n */\nexport const Anvil = forwardRef<HTMLDivElement, AnvilProps>(function Anvil(\n {\n left,\n right,\n result,\n name,\n defaultName = \"\",\n onNameChange,\n cost,\n playerLevel,\n maxCost = 40,\n onTakeResult,\n label = \"Anvil\",\n className,\n ...rest\n },\n ref,\n) {\n const costId = useId();\n const [itemName, setItemName] = useControllableState({\n value: name,\n defaultValue: defaultName,\n onChange: onNameChange,\n });\n const costState = anvilCostState(cost, playerLevel, maxCost);\n const blocked = costState === \"tooExpensive\" || costState === \"unaffordable\";\n const hasLeft = filled(left);\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={label}\n data-cost={costState}\n className={cx(styles.anvil, className)}\n {...rest}\n >\n <div className={styles.header}>\n <span className={styles.icon} aria-hidden=\"true\">\n <AnvilIcon size={32} />\n </span>\n <BlockInput\n label=\"Item name\"\n value={itemName}\n onChange={(event) => setItemName(event.target.value)}\n disabled={!hasLeft}\n maxLength={50}\n wrapperClassName={styles.name}\n />\n </div>\n <div className={styles.layout}>\n <InventorySlot size=\"lg\" label={hasLeft ? undefined : \"Item: empty\"}>\n {left}\n </InventorySlot>\n <span className={styles.symbol} aria-hidden=\"true\">\n <PlusIcon size={24} />\n </span>\n <InventorySlot size=\"lg\" label={filled(right) ? undefined : \"Material: empty\"}>\n {right}\n </InventorySlot>\n <span className={styles.symbol} aria-hidden=\"true\">\n <ArrowIcon size={32} />\n </span>\n <CraftingResult\n label=\"Result\"\n onTake={blocked ? undefined : onTakeResult}\n disabled={blocked}\n aria-describedby={costState === \"none\" ? undefined : costId}\n >\n {result}\n </CraftingResult>\n </div>\n {costState !== \"none\" ? (\n <p id={costId} className={styles.cost} aria-live=\"polite\">\n {costState === \"tooExpensive\"\n ? \"Too Expensive!\"\n : `Enchantment Cost: ${cost}${costState === \"unaffordable\" ? \" (not enough levels)\" : \"\"}`}\n </p>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;AAWA,IAAM,UAAU,SAAkB,SAAS,KAAA,KAAa,SAAS,QAAQ,SAAS;;;;;AAMlF,IAAa,QAAQ,WAAuC,SAAS,MACnE,EACE,MACA,OACA,QACA,MACA,cAAc,IACd,cACA,MACA,aACA,UAAU,IACV,cACA,QAAQ,SACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,SAAS,MAAM;CACrB,MAAM,CAAC,UAAU,eAAe,qBAAqB;EACnD,OAAO;EACP,cAAc;EACd,UAAU;CACZ,CAAC;CACD,MAAM,YAAY,eAAe,MAAM,aAAa,OAAO;CAC3D,MAAM,UAAU,cAAc,kBAAkB,cAAc;CAC9D,MAAM,UAAU,OAAO,IAAI;CAE3B,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY;EACZ,aAAW;EACX,WAAW,GAAGA,qBAAO,OAAO,SAAS;EACrC,GAAI;EANN,UAAA;GAQE,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAM,eAAY;KACxC,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;IAClB,CAAA,GACN,oBAAC,YAAD;KACE,OAAM;KACN,OAAO;KACP,WAAW,UAAU,YAAY,MAAM,OAAO,KAAK;KACnD,UAAU,CAAC;KACX,WAAW;KACX,kBAAkBA,qBAAO;IAC1B,CAAA,CACE;;GACL,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA;KACE,oBAAC,eAAD;MAAe,MAAK;MAAK,OAAO,UAAU,KAAA,IAAY;MACnD,UAAA;KACY,CAAA;KACf,oBAAC,QAAD;MAAM,WAAWA,qBAAO;MAAQ,eAAY;MAC1C,UAAA,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;KACjB,CAAA;KACN,oBAAC,eAAD;MAAe,MAAK;MAAK,OAAO,OAAO,KAAK,IAAI,KAAA,IAAY;MACzD,UAAA;KACY,CAAA;KACf,oBAAC,QAAD;MAAM,WAAWA,qBAAO;MAAQ,eAAY;MAC1C,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;KAClB,CAAA;KACN,oBAAC,gBAAD;MACE,OAAM;MACN,QAAQ,UAAU,KAAA,IAAY;MAC9B,UAAU;MACV,oBAAkB,cAAc,SAAS,KAAA,IAAY;MAEpD,UAAA;KACa,CAAA;IACb;;GACJ,cAAc,SACb,oBAAC,KAAD;IAAG,IAAI;IAAQ,WAAWA,qBAAO;IAAM,aAAU;IAC9C,UAAA,cAAc,iBACX,mBACA,qBAAqB,OAAO,cAAc,iBAAiB,yBAAyB;GACvF,CAAA,IACD;EACD;;AAET,CAAC"}
1
+ {"version":3,"file":"Anvil.js","names":["styles"],"sources":["../../../../src/components/crafting/Anvil/Anvil.tsx"],"sourcesContent":["import { AnvilIcon, ArrowIcon, PlusIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId } from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockInput } from \"../../forms/BlockInput/BlockInput\";\nimport { InventorySlot } from \"../../inventory/InventorySlot/InventorySlot\";\nimport { CraftingResult } from \"../CraftingResult/CraftingResult\";\nimport styles from \"./Anvil.module.css\";\nimport type { AnvilProps } from \"./Anvil.types\";\nimport { anvilCostState } from \"./Anvil.utils\";\n\nconst filled = (node: unknown) => node !== undefined && node !== null && node !== false;\n\n/**\n * Anvil: rename field, two input slots combining into a result, and the\n * experience cost — red when the player cannot afford it, \"Too Expensive!\" at the cap.\n */\nexport const Anvil = forwardRef<HTMLDivElement, AnvilProps>(function Anvil(\n {\n left,\n right,\n result,\n name,\n defaultName = \"\",\n onNameChange,\n cost,\n playerLevel,\n maxCost = 40,\n onTakeResult,\n label,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const costId = useId();\n const [itemName, setItemName] = useControllableState({\n value: name,\n defaultValue: defaultName,\n onChange: onNameChange,\n });\n const costState = anvilCostState(cost, playerLevel, maxCost);\n const blocked = costState === \"tooExpensive\" || costState === \"unaffordable\";\n const hasLeft = filled(left);\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={label ?? m.anvil.label}\n data-cost={costState}\n className={cx(styles.anvil, className)}\n {...rest}\n >\n <div className={styles.header}>\n <span className={styles.icon} aria-hidden=\"true\">\n <AnvilIcon size={32} />\n </span>\n <BlockInput\n label={m.anvil.itemName}\n value={itemName}\n onChange={(event) => setItemName(event.target.value)}\n disabled={!hasLeft}\n maxLength={50}\n wrapperClassName={styles.name}\n />\n </div>\n <div className={styles.layout}>\n <InventorySlot size=\"lg\" label={hasLeft ? undefined : m.common.emptyNamed(m.anvil.item)}>\n {left}\n </InventorySlot>\n <span className={styles.symbol} aria-hidden=\"true\">\n <PlusIcon size={24} />\n </span>\n <InventorySlot\n size=\"lg\"\n label={filled(right) ? undefined : m.common.emptyNamed(m.anvil.material)}\n >\n {right}\n </InventorySlot>\n <span className={styles.symbol} aria-hidden=\"true\">\n <ArrowIcon size={32} />\n </span>\n <CraftingResult\n label={m.common.result}\n onTake={blocked ? undefined : onTakeResult}\n disabled={blocked}\n aria-describedby={costState === \"none\" ? undefined : costId}\n >\n {result}\n </CraftingResult>\n </div>\n {costState !== \"none\" ? (\n <p id={costId} className={styles.cost} aria-live=\"polite\">\n {costState === \"tooExpensive\"\n ? m.anvil.tooExpensive\n : m.anvil.cost(String(cost)) +\n (costState === \"unaffordable\" ? m.anvil.notEnoughLevels : \"\")}\n </p>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAM,UAAU,SAAkB,SAAS,KAAA,KAAa,SAAS,QAAQ,SAAS;;;;;AAMlF,IAAa,QAAQ,WAAuC,SAAS,MACnE,EACE,MACA,OACA,QACA,MACA,cAAc,IACd,cACA,MACA,aACA,UAAU,IACV,cACA,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,SAAS,MAAM;CACrB,MAAM,CAAC,UAAU,eAAe,qBAAqB;EACnD,OAAO;EACP,cAAc;EACd,UAAU;CACZ,CAAC;CACD,MAAM,YAAY,eAAe,MAAM,aAAa,OAAO;CAC3D,MAAM,UAAU,cAAc,kBAAkB,cAAc;CAC9D,MAAM,UAAU,OAAO,IAAI;CAE3B,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY,SAAS,EAAE,MAAM;EAC7B,aAAW;EACX,WAAW,GAAGA,qBAAO,OAAO,SAAS;EACrC,GAAI;EANN,UAAA;GAQE,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAM,eAAY;KACxC,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;IAClB,CAAA,GACN,oBAAC,YAAD;KACE,OAAO,EAAE,MAAM;KACf,OAAO;KACP,WAAW,UAAU,YAAY,MAAM,OAAO,KAAK;KACnD,UAAU,CAAC;KACX,WAAW;KACX,kBAAkBA,qBAAO;IAC1B,CAAA,CACE;;GACL,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA;KACE,oBAAC,eAAD;MAAe,MAAK;MAAK,OAAO,UAAU,KAAA,IAAY,EAAE,OAAO,WAAW,EAAE,MAAM,IAAI;MACnF,UAAA;KACY,CAAA;KACf,oBAAC,QAAD;MAAM,WAAWA,qBAAO;MAAQ,eAAY;MAC1C,UAAA,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;KACjB,CAAA;KACN,oBAAC,eAAD;MACE,MAAK;MACL,OAAO,OAAO,KAAK,IAAI,KAAA,IAAY,EAAE,OAAO,WAAW,EAAE,MAAM,QAAQ;MAEtE,UAAA;KACY,CAAA;KACf,oBAAC,QAAD;MAAM,WAAWA,qBAAO;MAAQ,eAAY;MAC1C,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;KAClB,CAAA;KACN,oBAAC,gBAAD;MACE,OAAO,EAAE,OAAO;MAChB,QAAQ,UAAU,KAAA,IAAY;MAC9B,UAAU;MACV,oBAAkB,cAAc,SAAS,KAAA,IAAY;MAEpD,UAAA;KACa,CAAA;IACb;;GACJ,cAAc,SACb,oBAAC,KAAD;IAAG,IAAI;IAAQ,WAAWA,qBAAO;IAAM,aAAU;IAC9C,UAAA,cAAc,iBACX,EAAE,MAAM,eACR,EAAE,MAAM,KAAK,OAAO,IAAI,CAAC,KACxB,cAAc,iBAAiB,EAAE,MAAM,kBAAkB;GAC7D,CAAA,IACD;EACD;;AAET,CAAC"}
@@ -19,7 +19,7 @@ export interface AnvilProps extends HTMLAttributes<HTMLDivElement> {
19
19
  maxCost?: number;
20
20
  /** Called when the result is taken. */
21
21
  onTakeResult?: () => void;
22
- /** Accessible name. @default "Anvil" */
22
+ /** Accessible name. @default locale `anvil.label` ("Anvil") */
23
23
  label?: string;
24
24
  }
25
25
  //# sourceMappingURL=Anvil.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Anvil.types.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/Anvil/Anvil.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,cAAc,CAAC;IAChE,sCAAsC;IACtC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kDAAkD;IAClD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,mBAAmB;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"Anvil.types.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/Anvil/Anvil.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,cAAc,CAAC;IAChE,sCAAsC;IACtC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kDAAkD;IAClD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,mBAAmB;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BrewingStand.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/BrewingStand/BrewingStand.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,sBAAsB,CAAC;AAY5E;;;GAGG;AACH,eAAO,MAAM,YAAY,8GAmGvB,CAAC"}
1
+ {"version":3,"file":"BrewingStand.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/BrewingStand/BrewingStand.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D;;;GAGG;AACH,eAAO,MAAM,YAAY,8GA4GvB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { clamp } from "../../../utils/number.js";
3
4
  import { InventorySlot } from "../../inventory/InventorySlot/InventorySlot.js";
4
5
  import BrewingStand_module_default from "./BrewingStand.module.js";
@@ -7,22 +8,12 @@ import { forwardRef } from "react";
7
8
  import { BlazePowderIcon, PotionIcon } from "@malilion/block-ui-icons";
8
9
  import { jsx, jsxs } from "react/jsx-runtime";
9
10
  //#region src/components/crafting/BrewingStand/BrewingStand.tsx
10
- var defaultLabels = {
11
- idle: "Idle",
12
- brewing: "Brewing",
13
- complete: "Complete",
14
- noFuel: "No fuel"
15
- };
16
- var BOTTLE_NAMES = [
17
- "Left bottle",
18
- "Middle bottle",
19
- "Right bottle"
20
- ];
21
11
  /**
22
12
  * Brewing stand: fuel with its gauge, the ingredient on top, a progress bar
23
13
  * filling downwards and three bottle slots. States: idle, brewing, complete, no fuel.
24
14
  */
25
- var BrewingStand = forwardRef(function BrewingStand({ ingredient, fuel, bottles = [], progress = 0, fuelLevel = 0, state, statusLabels, label = "Brewing stand", className, ...rest }, ref) {
15
+ var BrewingStand = forwardRef(function BrewingStand({ ingredient, fuel, bottles = [], progress = 0, fuelLevel = 0, state, statusLabels, label, className, ...rest }, ref) {
16
+ const m = useBlockUIMessages();
26
17
  const current = state ?? getBrewingState({
27
18
  ingredient,
28
19
  bottles,
@@ -32,14 +23,14 @@ var BrewingStand = forwardRef(function BrewingStand({ ingredient, fuel, bottles
32
23
  const pct = clamp(progress, 0, 100);
33
24
  const fuelPct = clamp(fuelLevel, 0, 100);
34
25
  const labels = {
35
- ...defaultLabels,
26
+ ...m.brewingStand.status,
36
27
  ...statusLabels
37
28
  };
38
29
  const statusText = current === "brewing" ? `${labels.brewing} ${Math.round(pct)}%` : labels[current];
39
30
  return /* @__PURE__ */ jsxs("div", {
40
31
  ref,
41
32
  role: "group",
42
- "aria-label": label,
33
+ "aria-label": label ?? m.brewingStand.label,
43
34
  "data-state": current,
44
35
  className: cx(BrewingStand_module_default.stand, className),
45
36
  style: {
@@ -53,7 +44,7 @@ var BrewingStand = forwardRef(function BrewingStand({ ingredient, fuel, bottles
53
44
  className: BrewingStand_module_default.fuel,
54
45
  children: [/* @__PURE__ */ jsx(InventorySlot, {
55
46
  size: "md",
56
- label: isFilled(fuel) ? void 0 : "Fuel: empty",
47
+ label: isFilled(fuel) ? void 0 : m.common.emptyNamed(m.common.fuel),
57
48
  children: fuel ?? /* @__PURE__ */ jsx("span", {
58
49
  className: BrewingStand_module_default.ghost,
59
50
  "aria-hidden": "true",
@@ -61,7 +52,7 @@ var BrewingStand = forwardRef(function BrewingStand({ ingredient, fuel, bottles
61
52
  })
62
53
  }), /* @__PURE__ */ jsx("div", {
63
54
  role: "meter",
64
- "aria-label": "Fuel",
55
+ "aria-label": m.common.fuel,
65
56
  "aria-valuemin": 0,
66
57
  "aria-valuemax": 100,
67
58
  "aria-valuenow": Math.round(fuelPct),
@@ -73,12 +64,12 @@ var BrewingStand = forwardRef(function BrewingStand({ ingredient, fuel, bottles
73
64
  children: [
74
65
  /* @__PURE__ */ jsx(InventorySlot, {
75
66
  size: "lg",
76
- label: isFilled(ingredient) ? void 0 : "Ingredient: empty",
67
+ label: isFilled(ingredient) ? void 0 : m.common.emptyNamed(m.brewingStand.ingredient),
77
68
  children: ingredient
78
69
  }),
79
70
  /* @__PURE__ */ jsx("div", {
80
71
  role: "progressbar",
81
- "aria-label": "Brewing progress",
72
+ "aria-label": m.brewingStand.progress,
82
73
  "aria-valuemin": 0,
83
74
  "aria-valuemax": 100,
84
75
  "aria-valuenow": Math.round(pct),
@@ -87,11 +78,11 @@ var BrewingStand = forwardRef(function BrewingStand({ ingredient, fuel, bottles
87
78
  }),
88
79
  /* @__PURE__ */ jsx("div", {
89
80
  className: BrewingStand_module_default.bottles,
90
- children: BOTTLE_NAMES.map((name, index) => {
81
+ children: m.brewingStand.bottles.map((name, index) => {
91
82
  const bottle = bottles[index];
92
83
  return /* @__PURE__ */ jsx(InventorySlot, {
93
84
  size: "lg",
94
- label: isFilled(bottle) ? void 0 : `${name}: empty`,
85
+ label: isFilled(bottle) ? void 0 : m.common.emptyNamed(name),
95
86
  className: BrewingStand_module_default.bottle,
96
87
  children: isFilled(bottle) ? bottle : /* @__PURE__ */ jsx("span", {
97
88
  className: BrewingStand_module_default.ghost,
@@ -1 +1 @@
1
- {"version":3,"file":"BrewingStand.js","names":["styles"],"sources":["../../../../src/components/crafting/BrewingStand/BrewingStand.tsx"],"sourcesContent":["import { BlazePowderIcon, PotionIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { clamp } from \"../../../utils/number\";\nimport { InventorySlot } from \"../../inventory/InventorySlot/InventorySlot\";\nimport styles from \"./BrewingStand.module.css\";\nimport type { BrewingStandProps, BrewingState } from \"./BrewingStand.types\";\nimport { getBrewingState, isFilled } from \"./BrewingStand.utils\";\n\nconst defaultLabels: Record<BrewingState, string> = {\n idle: \"Idle\",\n brewing: \"Brewing\",\n complete: \"Complete\",\n noFuel: \"No fuel\",\n};\n\nconst BOTTLE_NAMES = [\"Left bottle\", \"Middle bottle\", \"Right bottle\"] as const;\n\n/**\n * Brewing stand: fuel with its gauge, the ingredient on top, a progress bar\n * filling downwards and three bottle slots. States: idle, brewing, complete, no fuel.\n */\nexport const BrewingStand = forwardRef<HTMLDivElement, BrewingStandProps>(function BrewingStand(\n {\n ingredient,\n fuel,\n bottles = [],\n progress = 0,\n fuelLevel = 0,\n state,\n statusLabels,\n label = \"Brewing stand\",\n className,\n ...rest\n },\n ref,\n) {\n const current = state ?? getBrewingState({ ingredient, bottles, progress, fuelLevel });\n const pct = clamp(progress, 0, 100);\n const fuelPct = clamp(fuelLevel, 0, 100);\n const labels = { ...defaultLabels, ...statusLabels };\n const statusText =\n current === \"brewing\" ? `${labels.brewing} ${Math.round(pct)}%` : labels[current];\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={label}\n data-state={current}\n className={cx(styles.stand, className)}\n style={\n {\n \"--block-brew-progress\": `${pct}%`,\n \"--block-brew-fuel\": `${fuelPct}%`,\n } as CSSProperties\n }\n {...rest}\n >\n <div className={styles.layout}>\n <div className={styles.fuel}>\n <InventorySlot size=\"md\" label={isFilled(fuel) ? undefined : \"Fuel: empty\"}>\n {fuel ?? (\n <span className={styles.ghost} aria-hidden=\"true\">\n <BlazePowderIcon size={24} />\n </span>\n )}\n </InventorySlot>\n <div\n role=\"meter\"\n aria-label=\"Fuel\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(fuelPct)}\n className={styles.gauge}\n >\n <span className={styles.gaugeFill} />\n </div>\n </div>\n <div className={styles.center}>\n <InventorySlot size=\"lg\" label={isFilled(ingredient) ? undefined : \"Ingredient: empty\"}>\n {ingredient}\n </InventorySlot>\n <div\n role=\"progressbar\"\n aria-label=\"Brewing progress\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(pct)}\n className={styles.progress}\n >\n <span className={styles.progressFill} />\n </div>\n <div className={styles.bottles}>\n {BOTTLE_NAMES.map((name, index) => {\n const bottle = bottles[index];\n return (\n <InventorySlot\n key={name}\n size=\"lg\"\n label={isFilled(bottle) ? undefined : `${name}: empty`}\n className={styles.bottle}\n >\n {isFilled(bottle) ? (\n bottle\n ) : (\n <span className={styles.ghost} aria-hidden=\"true\">\n <PotionIcon size={32} />\n </span>\n )}\n </InventorySlot>\n );\n })}\n </div>\n </div>\n </div>\n <p className={styles.status} aria-live=\"polite\">\n {statusText}\n </p>\n </div>\n );\n});\n"],"mappings":";;;;;;;;;AASA,IAAM,gBAA8C;CAClD,MAAM;CACN,SAAS;CACT,UAAU;CACV,QAAQ;AACV;AAEA,IAAM,eAAe;CAAC;CAAe;CAAiB;AAAc;;;;;AAMpE,IAAa,eAAe,WAA8C,SAAS,aACjF,EACE,YACA,MACA,UAAU,CAAC,GACX,WAAW,GACX,YAAY,GACZ,OACA,cACA,QAAQ,iBACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,UAAU,SAAS,gBAAgB;EAAE;EAAY;EAAS;EAAU;CAAU,CAAC;CACrF,MAAM,MAAM,MAAM,UAAU,GAAG,GAAG;CAClC,MAAM,UAAU,MAAM,WAAW,GAAG,GAAG;CACvC,MAAM,SAAS;EAAE,GAAG;EAAe,GAAG;CAAa;CACnD,MAAM,aACJ,YAAY,YAAY,GAAG,OAAO,QAAQ,GAAG,KAAK,MAAM,GAAG,EAAE,KAAK,OAAO;CAE3E,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY;EACZ,cAAY;EACZ,WAAW,GAAGA,4BAAO,OAAO,SAAS;EACrC,OACE;GACE,yBAAyB,GAAG,IAAI;GAChC,qBAAqB,GAAG,QAAQ;EAClC;EAEF,GAAI;EAZN,UAAA,CAcE,qBAAC,OAAD;GAAK,WAAWA,4BAAO;GAAvB,UAAA,CACE,qBAAC,OAAD;IAAK,WAAWA,4BAAO;IAAvB,UAAA,CACE,oBAAC,eAAD;KAAe,MAAK;KAAK,OAAO,SAAS,IAAI,IAAI,KAAA,IAAY;KAC1D,UAAA,QACC,oBAAC,QAAD;MAAM,WAAWA,4BAAO;MAAO,eAAY;MACzC,UAAA,oBAAC,iBAAD,EAAiB,MAAM,GAAK,CAAA;KACxB,CAAA;IAEK,CAAA,GACf,oBAAC,OAAD;KACE,MAAK;KACL,cAAW;KACX,iBAAe;KACf,iBAAe;KACf,iBAAe,KAAK,MAAM,OAAO;KACjC,WAAWA,4BAAO;KAElB,UAAA,oBAAC,QAAD,EAAM,WAAWA,4BAAO,UAAY,CAAA;IACjC,CAAA,CACF;GACL,CAAA,GAAA,qBAAC,OAAD;IAAK,WAAWA,4BAAO;IAAvB,UAAA;KACE,oBAAC,eAAD;MAAe,MAAK;MAAK,OAAO,SAAS,UAAU,IAAI,KAAA,IAAY;MAChE,UAAA;KACY,CAAA;KACf,oBAAC,OAAD;MACE,MAAK;MACL,cAAW;MACX,iBAAe;MACf,iBAAe;MACf,iBAAe,KAAK,MAAM,GAAG;MAC7B,WAAWA,4BAAO;MAElB,UAAA,oBAAC,QAAD,EAAM,WAAWA,4BAAO,aAAe,CAAA;KACpC,CAAA;KACL,oBAAC,OAAD;MAAK,WAAWA,4BAAO;MACpB,UAAA,aAAa,KAAK,MAAM,UAAU;OACjC,MAAM,SAAS,QAAQ;OACvB,OACE,oBAAC,eAAD;QAEE,MAAK;QACL,OAAO,SAAS,MAAM,IAAI,KAAA,IAAY,GAAG,KAAK;QAC9C,WAAWA,4BAAO;QAEjB,UAAA,SAAS,MAAM,IACd,SAEA,oBAAC,QAAD;SAAM,WAAWA,4BAAO;SAAO,eAAY;SACzC,UAAA,oBAAC,YAAD,EAAY,MAAM,GAAK,CAAA;QACnB,CAAA;OAEK,GAZR,IAYQ;MAEnB,CAAC;KACE,CAAA;IACF;GACF,CAAA,CAAA;EACL,CAAA,GAAA,oBAAC,KAAD;GAAG,WAAWA,4BAAO;GAAQ,aAAU;GACpC,UAAA;EACA,CAAA,CACA;;AAET,CAAC"}
1
+ {"version":3,"file":"BrewingStand.js","names":["styles"],"sources":["../../../../src/components/crafting/BrewingStand/BrewingStand.tsx"],"sourcesContent":["import { BlazePowderIcon, PotionIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { clamp } from \"../../../utils/number\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { InventorySlot } from \"../../inventory/InventorySlot/InventorySlot\";\nimport styles from \"./BrewingStand.module.css\";\nimport type { BrewingStandProps } from \"./BrewingStand.types\";\nimport { getBrewingState, isFilled } from \"./BrewingStand.utils\";\n\n/**\n * Brewing stand: fuel with its gauge, the ingredient on top, a progress bar\n * filling downwards and three bottle slots. States: idle, brewing, complete, no fuel.\n */\nexport const BrewingStand = forwardRef<HTMLDivElement, BrewingStandProps>(function BrewingStand(\n {\n ingredient,\n fuel,\n bottles = [],\n progress = 0,\n fuelLevel = 0,\n state,\n statusLabels,\n label,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const current = state ?? getBrewingState({ ingredient, bottles, progress, fuelLevel });\n const pct = clamp(progress, 0, 100);\n const fuelPct = clamp(fuelLevel, 0, 100);\n const labels = { ...m.brewingStand.status, ...statusLabels };\n const statusText =\n current === \"brewing\" ? `${labels.brewing} ${Math.round(pct)}%` : labels[current];\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={label ?? m.brewingStand.label}\n data-state={current}\n className={cx(styles.stand, className)}\n style={\n {\n \"--block-brew-progress\": `${pct}%`,\n \"--block-brew-fuel\": `${fuelPct}%`,\n } as CSSProperties\n }\n {...rest}\n >\n <div className={styles.layout}>\n <div className={styles.fuel}>\n <InventorySlot\n size=\"md\"\n label={isFilled(fuel) ? undefined : m.common.emptyNamed(m.common.fuel)}\n >\n {fuel ?? (\n <span className={styles.ghost} aria-hidden=\"true\">\n <BlazePowderIcon size={24} />\n </span>\n )}\n </InventorySlot>\n <div\n role=\"meter\"\n aria-label={m.common.fuel}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(fuelPct)}\n className={styles.gauge}\n >\n <span className={styles.gaugeFill} />\n </div>\n </div>\n <div className={styles.center}>\n <InventorySlot\n size=\"lg\"\n label={\n isFilled(ingredient) ? undefined : m.common.emptyNamed(m.brewingStand.ingredient)\n }\n >\n {ingredient}\n </InventorySlot>\n <div\n role=\"progressbar\"\n aria-label={m.brewingStand.progress}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(pct)}\n className={styles.progress}\n >\n <span className={styles.progressFill} />\n </div>\n <div className={styles.bottles}>\n {m.brewingStand.bottles.map((name, index) => {\n const bottle = bottles[index];\n return (\n <InventorySlot\n key={name}\n size=\"lg\"\n label={isFilled(bottle) ? undefined : m.common.emptyNamed(name)}\n className={styles.bottle}\n >\n {isFilled(bottle) ? (\n bottle\n ) : (\n <span className={styles.ghost} aria-hidden=\"true\">\n <PotionIcon size={32} />\n </span>\n )}\n </InventorySlot>\n );\n })}\n </div>\n </div>\n </div>\n <p className={styles.status} aria-live=\"polite\">\n {statusText}\n </p>\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;AAcA,IAAa,eAAe,WAA8C,SAAS,aACjF,EACE,YACA,MACA,UAAU,CAAC,GACX,WAAW,GACX,YAAY,GACZ,OACA,cACA,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,UAAU,SAAS,gBAAgB;EAAE;EAAY;EAAS;EAAU;CAAU,CAAC;CACrF,MAAM,MAAM,MAAM,UAAU,GAAG,GAAG;CAClC,MAAM,UAAU,MAAM,WAAW,GAAG,GAAG;CACvC,MAAM,SAAS;EAAE,GAAG,EAAE,aAAa;EAAQ,GAAG;CAAa;CAC3D,MAAM,aACJ,YAAY,YAAY,GAAG,OAAO,QAAQ,GAAG,KAAK,MAAM,GAAG,EAAE,KAAK,OAAO;CAE3E,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY,SAAS,EAAE,aAAa;EACpC,cAAY;EACZ,WAAW,GAAGA,4BAAO,OAAO,SAAS;EACrC,OACE;GACE,yBAAyB,GAAG,IAAI;GAChC,qBAAqB,GAAG,QAAQ;EAClC;EAEF,GAAI;EAZN,UAAA,CAcE,qBAAC,OAAD;GAAK,WAAWA,4BAAO;GAAvB,UAAA,CACE,qBAAC,OAAD;IAAK,WAAWA,4BAAO;IAAvB,UAAA,CACE,oBAAC,eAAD;KACE,MAAK;KACL,OAAO,SAAS,IAAI,IAAI,KAAA,IAAY,EAAE,OAAO,WAAW,EAAE,OAAO,IAAI;KAEpE,UAAA,QACC,oBAAC,QAAD;MAAM,WAAWA,4BAAO;MAAO,eAAY;MACzC,UAAA,oBAAC,iBAAD,EAAiB,MAAM,GAAK,CAAA;KACxB,CAAA;IAEK,CAAA,GACf,oBAAC,OAAD;KACE,MAAK;KACL,cAAY,EAAE,OAAO;KACrB,iBAAe;KACf,iBAAe;KACf,iBAAe,KAAK,MAAM,OAAO;KACjC,WAAWA,4BAAO;KAElB,UAAA,oBAAC,QAAD,EAAM,WAAWA,4BAAO,UAAY,CAAA;IACjC,CAAA,CACF;GACL,CAAA,GAAA,qBAAC,OAAD;IAAK,WAAWA,4BAAO;IAAvB,UAAA;KACE,oBAAC,eAAD;MACE,MAAK;MACL,OACE,SAAS,UAAU,IAAI,KAAA,IAAY,EAAE,OAAO,WAAW,EAAE,aAAa,UAAU;MAGjF,UAAA;KACY,CAAA;KACf,oBAAC,OAAD;MACE,MAAK;MACL,cAAY,EAAE,aAAa;MAC3B,iBAAe;MACf,iBAAe;MACf,iBAAe,KAAK,MAAM,GAAG;MAC7B,WAAWA,4BAAO;MAElB,UAAA,oBAAC,QAAD,EAAM,WAAWA,4BAAO,aAAe,CAAA;KACpC,CAAA;KACL,oBAAC,OAAD;MAAK,WAAWA,4BAAO;MACpB,UAAA,EAAE,aAAa,QAAQ,KAAK,MAAM,UAAU;OAC3C,MAAM,SAAS,QAAQ;OACvB,OACE,oBAAC,eAAD;QAEE,MAAK;QACL,OAAO,SAAS,MAAM,IAAI,KAAA,IAAY,EAAE,OAAO,WAAW,IAAI;QAC9D,WAAWA,4BAAO;QAEjB,UAAA,SAAS,MAAM,IACd,SAEA,oBAAC,QAAD;SAAM,WAAWA,4BAAO;SAAO,eAAY;SACzC,UAAA,oBAAC,YAAD,EAAY,MAAM,GAAK,CAAA;QACnB,CAAA;OAEK,GAZR,IAYQ;MAEnB,CAAC;KACE,CAAA;IACF;GACF,CAAA,CAAA;EACL,CAAA,GAAA,oBAAC,KAAD;GAAG,WAAWA,4BAAO;GAAQ,aAAU;GACpC,UAAA;EACA,CAAA,CACA;;AAET,CAAC"}
@@ -16,7 +16,7 @@ export interface BrewingStandProps extends HTMLAttributes<HTMLDivElement> {
16
16
  state?: BrewingState;
17
17
  /** Override status texts. */
18
18
  statusLabels?: Partial<Record<BrewingState, string>>;
19
- /** Accessible name. @default "Brewing stand" */
19
+ /** Accessible name. @default locale `brewingStand.label` ("Brewing stand") */
20
20
  label?: string;
21
21
  }
22
22
  //# sourceMappingURL=BrewingStand.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrewingStand.types.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/BrewingStand/BrewingStand.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,eAAO,MAAM,aAAa,oDAAqD,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACvE,4CAA4C;IAC5C,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,gCAAgC;IAChC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/C,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"BrewingStand.types.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/BrewingStand/BrewingStand.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,eAAO,MAAM,aAAa,oDAAqD,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACvE,4CAA4C;IAC5C,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,gCAAgC;IAChC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/C,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BrewingStand.types.js","names":[],"sources":["../../../../src/components/crafting/BrewingStand/BrewingStand.types.ts"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\n\nexport const brewingStates = [\"idle\", \"brewing\", \"complete\", \"noFuel\"] as const;\n\nexport type BrewingState = (typeof brewingStates)[number];\n\nexport interface BrewingStandProps extends HTMLAttributes<HTMLDivElement> {\n /** Ingredient on top (e.g. nether wart). */\n ingredient?: ReactNode;\n /** Fuel slot (blaze powder). */\n fuel?: ReactNode;\n /** Up to three bottles, left to right. */\n bottles?: [ReactNode?, ReactNode?, ReactNode?];\n /** Brewing progress 0–100. @default 0 */\n progress?: number;\n /** Remaining fuel 0–100. @default 0 */\n fuelLevel?: number;\n /** Override the derived state. */\n state?: BrewingState;\n /** Override status texts. */\n statusLabels?: Partial<Record<BrewingState, string>>;\n /** Accessible name. @default \"Brewing stand\" */\n label?: string;\n}\n"],"mappings":";AAEA,IAAa,gBAAgB;CAAC;CAAQ;CAAW;CAAY;AAAQ"}
1
+ {"version":3,"file":"BrewingStand.types.js","names":[],"sources":["../../../../src/components/crafting/BrewingStand/BrewingStand.types.ts"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\n\nexport const brewingStates = [\"idle\", \"brewing\", \"complete\", \"noFuel\"] as const;\n\nexport type BrewingState = (typeof brewingStates)[number];\n\nexport interface BrewingStandProps extends HTMLAttributes<HTMLDivElement> {\n /** Ingredient on top (e.g. nether wart). */\n ingredient?: ReactNode;\n /** Fuel slot (blaze powder). */\n fuel?: ReactNode;\n /** Up to three bottles, left to right. */\n bottles?: [ReactNode?, ReactNode?, ReactNode?];\n /** Brewing progress 0–100. @default 0 */\n progress?: number;\n /** Remaining fuel 0–100. @default 0 */\n fuelLevel?: number;\n /** Override the derived state. */\n state?: BrewingState;\n /** Override status texts. */\n statusLabels?: Partial<Record<BrewingState, string>>;\n /** Accessible name. @default locale `brewingStand.label` (\"Brewing stand\") */\n label?: string;\n}\n"],"mappings":";AAEA,IAAa,gBAAgB;CAAC;CAAQ;CAAW;CAAY;AAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"CraftingGrid.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/CraftingGrid/CraftingGrid.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,YAAY,8GAuBvB,CAAC"}
1
+ {"version":3,"file":"CraftingGrid.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/CraftingGrid/CraftingGrid.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,YAAY,8GAwBvB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { InventoryGrid } from "../../inventory/InventoryGrid/InventoryGrid.js";
3
4
  import { CraftingSlot } from "../CraftingSlot/CraftingSlot.js";
4
5
  import CraftingGrid_module_default from "./CraftingGrid.module.js";
@@ -9,7 +10,8 @@ import { jsx } from "react/jsx-runtime";
9
10
  * 2 × 2 or 3 × 3 crafting input grid. Missing slots are filled with empty
10
11
  * `CraftingSlot`s; keyboard behaviour matches `InventoryGrid`.
11
12
  */
12
- var CraftingGrid = forwardRef(function CraftingGrid({ size = 3, slotSize = "lg", label = "Crafting grid", className, children, ...rest }, ref) {
13
+ var CraftingGrid = forwardRef(function CraftingGrid({ size = 3, slotSize = "lg", label, className, children, ...rest }, ref) {
14
+ const m = useBlockUIMessages();
13
15
  const filled = Children.toArray(children);
14
16
  const padded = [...filled];
15
17
  for (let i = filled.length; i < size * size; i += 1) padded.push(/* @__PURE__ */ jsx(CraftingSlot, {}, `block-crafting-empty-${i}`));
@@ -17,7 +19,7 @@ var CraftingGrid = forwardRef(function CraftingGrid({ size = 3, slotSize = "lg",
17
19
  ref,
18
20
  columns: size,
19
21
  slotSize,
20
- label,
22
+ label: label ?? m.craftingGrid.label,
21
23
  "data-crafting-size": size,
22
24
  className: cx(CraftingGrid_module_default.craftingGrid, className),
23
25
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"file":"CraftingGrid.js","names":["styles"],"sources":["../../../../src/components/crafting/CraftingGrid/CraftingGrid.tsx"],"sourcesContent":["import { Children, forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { InventoryGrid } from \"../../inventory/InventoryGrid/InventoryGrid\";\nimport { CraftingSlot } from \"../CraftingSlot/CraftingSlot\";\nimport styles from \"./CraftingGrid.module.css\";\nimport type { CraftingGridProps } from \"./CraftingGrid.types\";\n\n/**\n * 2 × 2 or 3 × 3 crafting input grid. Missing slots are filled with empty\n * `CraftingSlot`s; keyboard behaviour matches `InventoryGrid`.\n */\nexport const CraftingGrid = forwardRef<HTMLDivElement, CraftingGridProps>(function CraftingGrid(\n { size = 3, slotSize = \"lg\", label = \"Crafting grid\", className, children, ...rest },\n ref,\n) {\n const filled = Children.toArray(children);\n const padded = [...filled];\n for (let i = filled.length; i < size * size; i += 1) {\n padded.push(<CraftingSlot key={`block-crafting-empty-${i}`} />);\n }\n\n return (\n <InventoryGrid\n ref={ref}\n columns={size}\n slotSize={slotSize}\n label={label}\n data-crafting-size={size}\n className={cx(styles.craftingGrid, className)}\n {...rest}\n >\n {padded}\n </InventoryGrid>\n );\n});\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,eAAe,WAA8C,SAAS,aACjF,EAAE,OAAO,GAAG,WAAW,MAAM,QAAQ,iBAAiB,WAAW,UAAU,GAAG,QAC9E,KACA;CACA,MAAM,SAAS,SAAS,QAAQ,QAAQ;CACxC,MAAM,SAAS,CAAC,GAAG,MAAM;CACzB,KAAK,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,MAAM,KAAK,GAChD,OAAO,KAAK,oBAAC,cAAD,CAAiD,GAA9B,wBAAwB,GAAM,CAAC;CAGhE,OACE,oBAAC,eAAD;EACO;EACL,SAAS;EACC;EACH;EACP,sBAAoB;EACpB,WAAW,GAAGA,4BAAO,cAAc,SAAS;EAC5C,GAAI;EAEH,UAAA;CACY,CAAA;AAEnB,CAAC"}
1
+ {"version":3,"file":"CraftingGrid.js","names":["styles"],"sources":["../../../../src/components/crafting/CraftingGrid/CraftingGrid.tsx"],"sourcesContent":["import { Children, forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { InventoryGrid } from \"../../inventory/InventoryGrid/InventoryGrid\";\nimport { CraftingSlot } from \"../CraftingSlot/CraftingSlot\";\nimport styles from \"./CraftingGrid.module.css\";\nimport type { CraftingGridProps } from \"./CraftingGrid.types\";\n\n/**\n * 2 × 2 or 3 × 3 crafting input grid. Missing slots are filled with empty\n * `CraftingSlot`s; keyboard behaviour matches `InventoryGrid`.\n */\nexport const CraftingGrid = forwardRef<HTMLDivElement, CraftingGridProps>(function CraftingGrid(\n { size = 3, slotSize = \"lg\", label, className, children, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n const filled = Children.toArray(children);\n const padded = [...filled];\n for (let i = filled.length; i < size * size; i += 1) {\n padded.push(<CraftingSlot key={`block-crafting-empty-${i}`} />);\n }\n\n return (\n <InventoryGrid\n ref={ref}\n columns={size}\n slotSize={slotSize}\n label={label ?? m.craftingGrid.label}\n data-crafting-size={size}\n className={cx(styles.craftingGrid, className)}\n {...rest}\n >\n {padded}\n </InventoryGrid>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,eAAe,WAA8C,SAAS,aACjF,EAAE,OAAO,GAAG,WAAW,MAAM,OAAO,WAAW,UAAU,GAAG,QAC5D,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,SAAS,SAAS,QAAQ,QAAQ;CACxC,MAAM,SAAS,CAAC,GAAG,MAAM;CACzB,KAAK,IAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,MAAM,KAAK,GAChD,OAAO,KAAK,oBAAC,cAAD,CAAiD,GAA9B,wBAAwB,GAAM,CAAC;CAGhE,OACE,oBAAC,eAAD;EACO;EACL,SAAS;EACC;EACV,OAAO,SAAS,EAAE,aAAa;EAC/B,sBAAoB;EACpB,WAAW,GAAGA,4BAAO,cAAc,SAAS;EAC5C,GAAI;EAEH,UAAA;CACY,CAAA;AAEnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"CraftingResult.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/CraftingResult/CraftingResult.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,mGAAmG;AACnG,eAAO,MAAM,cAAc,gHA4B1B,CAAC"}
1
+ {"version":3,"file":"CraftingResult.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/CraftingResult/CraftingResult.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,mGAAmG;AACnG,eAAO,MAAM,cAAc,gHA8B1B,CAAC"}
@@ -1,11 +1,14 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { InventorySlot } from "../../inventory/InventorySlot/InventorySlot.js";
3
4
  import CraftingResult_module_default from "./CraftingResult.module.js";
4
5
  import { forwardRef } from "react";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
  //#region src/components/crafting/CraftingResult/CraftingResult.tsx
7
8
  /** The large output slot of a crafting table or furnace. Result changes are announced politely. */
8
- var CraftingResult = forwardRef(function CraftingResult({ children, onTake, label = "Crafting result", disabled = false, className, ...rest }, ref) {
9
+ var CraftingResult = forwardRef(function CraftingResult({ children, onTake, label: labelProp, disabled = false, className, ...rest }, ref) {
10
+ const m = useBlockUIMessages();
11
+ const label = labelProp ?? m.craftingResult.label;
9
12
  const empty = children === void 0 || children === null || children === false;
10
13
  return /* @__PURE__ */ jsx("div", {
11
14
  ref,
@@ -20,7 +23,7 @@ var CraftingResult = forwardRef(function CraftingResult({ children, onTake, labe
20
23
  disabled: disabled || empty,
21
24
  onClick: onTake,
22
25
  className: CraftingResult_module_default.slot,
23
- label: empty ? `${label}: empty` : void 0,
26
+ label: empty ? m.common.emptyNamed(label) : void 0,
24
27
  children
25
28
  })
26
29
  });