@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 +1 @@
1
- {"version":3,"file":"ContextMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/ContextMenu/ContextMenu.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAO5D;;;;GAIG;AACH,eAAO,MAAM,WAAW,6GA0GtB,CAAC"}
1
+ {"version":3,"file":"ContextMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/ContextMenu/ContextMenu.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAO5D;;;;GAIG;AACH,eAAO,MAAM,WAAW,6GAkGtB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { useAnchoredPosition } from "../../../hooks/useAnchoredPosition.js";
3
4
  import { mergeRefs } from "../../../utils/refs.js";
4
5
  import { enabledMenuIndexes } from "../BlockMenu/BlockMenu.utils.js";
@@ -12,7 +13,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
12
13
  * pointer, or at the focused element with Shift+F10 / the Menu key; keyboard
13
14
  * behaviour matches `BlockMenu` and focus returns to where it was.
14
15
  */
15
- var ContextMenu = forwardRef(function ContextMenu({ children, items, onSelect, label = "Context menu", disabled = false, onOpenChange, className, ...rest }, ref) {
16
+ var ContextMenu = forwardRef(function ContextMenu({ children, items, onSelect, label, disabled = false, onOpenChange, className, ...rest }, ref) {
17
+ const m = useBlockUIMessages();
16
18
  const menuId = useId();
17
19
  const areaRef = useRef(null);
18
20
  const menuRef = useRef(null);
@@ -87,7 +89,7 @@ var ContextMenu = forwardRef(function ContextMenu({ children, items, onSelect, l
87
89
  focusTarget,
88
90
  menuRef,
89
91
  position,
90
- label,
92
+ label: label ?? m.contextMenu.label,
91
93
  isInside,
92
94
  onClose: close,
93
95
  onChoose: choose
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.js","names":["styles"],"sources":["../../../../src/components/actions/ContextMenu/ContextMenu.tsx"],"sourcesContent":["import { forwardRef, useId, useRef, useState, type KeyboardEvent, type MouseEvent } from \"react\";\nimport { useAnchoredPosition } from \"../../../hooks/useAnchoredPosition\";\nimport { cx } from \"../../../utils/cx\";\nimport { mergeRefs } from \"../../../utils/refs\";\nimport type { BlockMenuItem } from \"../BlockMenu/BlockMenu.types\";\nimport { enabledMenuIndexes } from \"../BlockMenu/BlockMenu.utils\";\nimport { MenuList, type MenuFocusTarget } from \"../BlockMenu/MenuList\";\nimport styles from \"./ContextMenu.module.css\";\nimport type { ContextMenuProps } from \"./ContextMenu.types\";\n\ninterface Point {\n x: number;\n y: number;\n}\n\n/**\n * Right-click menu for an area (an inventory slot, a list row). Opens at the\n * pointer, or at the focused element with Shift+F10 / the Menu key; keyboard\n * behaviour matches `BlockMenu` and focus returns to where it was.\n */\nexport const ContextMenu = forwardRef<HTMLDivElement, ContextMenuProps>(function ContextMenu(\n {\n children,\n items,\n onSelect,\n label = \"Context menu\",\n disabled = false,\n onOpenChange,\n className,\n ...rest\n },\n ref,\n) {\n const menuId = useId();\n const areaRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const returnTo = useRef<HTMLElement | null>(null);\n const point = useRef<Point>({ x: 0, y: 0 });\n const [open, setOpenState] = useState(false);\n const [focusTarget, setFocusTarget] = useState<MenuFocusTarget | null>(null);\n\n // A zero-size \"element\" at the pointer for the shared positioning hook.\n const virtualAnchor = useRef({\n getBoundingClientRect: () =>\n DOMRect.fromRect({ x: point.current.x, y: point.current.y, width: 0, height: 0 }),\n });\n const position = useAnchoredPosition(virtualAnchor, menuRef, open, {\n side: \"bottom\",\n align: \"start\",\n gap: 2,\n });\n\n const setOpen = (next: boolean) => {\n setOpenState(next);\n onOpenChange?.(next);\n };\n\n const openAt = (x: number, y: number) => {\n if (enabledMenuIndexes(items).length === 0) return;\n returnTo.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n point.current = { x, y };\n setOpen(true);\n setFocusTarget(\"first\");\n };\n\n const close = (returnFocus: boolean) => {\n setOpen(false);\n setFocusTarget(null);\n if (returnFocus) returnTo.current?.focus();\n };\n\n const choose = (item: BlockMenuItem) => {\n close(true);\n item.onSelect?.();\n onSelect?.(item.id);\n };\n\n const onContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.preventDefault();\n // Right-clicking does not move focus; remember the clicked control instead when it is focusable.\n const target = (event.target as HTMLElement).closest<HTMLElement>(\n \"button, a[href], input, [tabindex]\",\n );\n target?.focus({ preventScroll: true });\n openAt(event.clientX, event.clientY);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (event.key === \"ContextMenu\" || (event.key === \"F10\" && event.shiftKey)) {\n event.preventDefault();\n const rect = (event.target as HTMLElement).getBoundingClientRect();\n openAt(rect.left + rect.width / 2, rect.top + rect.height / 2);\n }\n };\n\n const isInside = (node: Node | null) => Boolean(node && menuRef.current?.contains(node));\n\n return (\n // The area only listens for right-clicks and the Menu key bubbling up from the controls inside it.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={mergeRefs(ref, areaRef)}\n className={cx(styles.area, className)}\n data-open={open || undefined}\n onContextMenu={onContextMenu}\n onKeyDown={onKeyDown}\n {...rest}\n >\n {children}\n <MenuList\n id={menuId}\n items={items}\n open={open}\n focusTarget={focusTarget}\n menuRef={menuRef}\n position={position}\n label={label}\n isInside={isInside}\n onClose={close}\n onChoose={choose}\n />\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;AAoBA,IAAa,cAAc,WAA6C,SAAS,YAC/E,EACE,UACA,OACA,UACA,QAAQ,gBACR,WAAW,OACX,cACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,SAAS,MAAM;CACrB,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,WAAW,OAA2B,IAAI;CAChD,MAAM,QAAQ,OAAc;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CAC1C,MAAM,CAAC,MAAM,gBAAgB,SAAS,KAAK;CAC3C,MAAM,CAAC,aAAa,kBAAkB,SAAiC,IAAI;CAG3E,MAAM,gBAAgB,OAAO,EAC3B,6BACE,QAAQ,SAAS;EAAE,GAAG,MAAM,QAAQ;EAAG,GAAG,MAAM,QAAQ;EAAG,OAAO;EAAG,QAAQ;CAAE,CAAC,EACpF,CAAC;CACD,MAAM,WAAW,oBAAoB,eAAe,SAAS,MAAM;EACjE,MAAM;EACN,OAAO;EACP,KAAK;CACP,CAAC;CAED,MAAM,WAAW,SAAkB;EACjC,aAAa,IAAI;EACjB,eAAe,IAAI;CACrB;CAEA,MAAM,UAAU,GAAW,MAAc;EACvC,IAAI,mBAAmB,KAAK,CAAC,CAAC,WAAW,GAAG;EAC5C,SAAS,UACP,SAAS,yBAAyB,cAAc,SAAS,gBAAgB;EAC3E,MAAM,UAAU;GAAE;GAAG;EAAE;EACvB,QAAQ,IAAI;EACZ,eAAe,OAAO;CACxB;CAEA,MAAM,SAAS,gBAAyB;EACtC,QAAQ,KAAK;EACb,eAAe,IAAI;EACnB,IAAI,aAAa,SAAS,SAAS,MAAM;CAC3C;CAEA,MAAM,UAAU,SAAwB;EACtC,MAAM,IAAI;EACV,KAAK,WAAW;EAChB,WAAW,KAAK,EAAE;CACpB;CAEA,MAAM,iBAAiB,UAAsC;EAC3D,IAAI,UAAU;EACd,MAAM,eAAe;EAKrB,MAHsB,OAAuB,QAC3C,oCAEF,CAAA,EAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;EACrC,OAAO,MAAM,SAAS,MAAM,OAAO;CACrC;CAEA,MAAM,aAAa,UAAyC;EAC1D,IAAI,UAAU;EACd,IAAI,MAAM,QAAQ,iBAAkB,MAAM,QAAQ,SAAS,MAAM,UAAW;GAC1E,MAAM,eAAe;GACrB,MAAM,OAAQ,MAAM,OAAuB,sBAAsB;GACjE,OAAO,KAAK,OAAO,KAAK,QAAQ,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC;EAC/D;CACF;CAEA,MAAM,YAAY,SAAsB,QAAQ,QAAQ,QAAQ,SAAS,SAAS,IAAI,CAAC;CAEvF,OAGE,qBAAC,OAAD;EACE,KAAK,UAAU,KAAK,OAAO;EAC3B,WAAW,GAAGA,2BAAO,MAAM,SAAS;EACpC,aAAW,QAAQ,KAAA;EACJ;EACJ;EACX,GAAI;EANN,UAAA,CAQG,UACD,oBAAC,UAAD;GACE,IAAI;GACG;GACD;GACO;GACJ;GACC;GACH;GACG;GACV,SAAS;GACT,UAAU;EACX,CAAA,CACE;;AAET,CAAC"}
1
+ {"version":3,"file":"ContextMenu.js","names":["styles"],"sources":["../../../../src/components/actions/ContextMenu/ContextMenu.tsx"],"sourcesContent":["import { forwardRef, useId, useRef, useState, type KeyboardEvent, type MouseEvent } from \"react\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { useAnchoredPosition } from \"../../../hooks/useAnchoredPosition\";\nimport { cx } from \"../../../utils/cx\";\nimport { mergeRefs } from \"../../../utils/refs\";\nimport type { BlockMenuItem } from \"../BlockMenu/BlockMenu.types\";\nimport { enabledMenuIndexes } from \"../BlockMenu/BlockMenu.utils\";\nimport { MenuList, type MenuFocusTarget } from \"../BlockMenu/MenuList\";\nimport styles from \"./ContextMenu.module.css\";\nimport type { ContextMenuProps } from \"./ContextMenu.types\";\n\ninterface Point {\n x: number;\n y: number;\n}\n\n/**\n * Right-click menu for an area (an inventory slot, a list row). Opens at the\n * pointer, or at the focused element with Shift+F10 / the Menu key; keyboard\n * behaviour matches `BlockMenu` and focus returns to where it was.\n */\nexport const ContextMenu = forwardRef<HTMLDivElement, ContextMenuProps>(function ContextMenu(\n { children, items, onSelect, label, disabled = false, onOpenChange, className, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n const menuId = useId();\n const areaRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const returnTo = useRef<HTMLElement | null>(null);\n const point = useRef<Point>({ x: 0, y: 0 });\n const [open, setOpenState] = useState(false);\n const [focusTarget, setFocusTarget] = useState<MenuFocusTarget | null>(null);\n\n // A zero-size \"element\" at the pointer for the shared positioning hook.\n const virtualAnchor = useRef({\n getBoundingClientRect: () =>\n DOMRect.fromRect({ x: point.current.x, y: point.current.y, width: 0, height: 0 }),\n });\n const position = useAnchoredPosition(virtualAnchor, menuRef, open, {\n side: \"bottom\",\n align: \"start\",\n gap: 2,\n });\n\n const setOpen = (next: boolean) => {\n setOpenState(next);\n onOpenChange?.(next);\n };\n\n const openAt = (x: number, y: number) => {\n if (enabledMenuIndexes(items).length === 0) return;\n returnTo.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n point.current = { x, y };\n setOpen(true);\n setFocusTarget(\"first\");\n };\n\n const close = (returnFocus: boolean) => {\n setOpen(false);\n setFocusTarget(null);\n if (returnFocus) returnTo.current?.focus();\n };\n\n const choose = (item: BlockMenuItem) => {\n close(true);\n item.onSelect?.();\n onSelect?.(item.id);\n };\n\n const onContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n event.preventDefault();\n // Right-clicking does not move focus; remember the clicked control instead when it is focusable.\n const target = (event.target as HTMLElement).closest<HTMLElement>(\n \"button, a[href], input, [tabindex]\",\n );\n target?.focus({ preventScroll: true });\n openAt(event.clientX, event.clientY);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (event.key === \"ContextMenu\" || (event.key === \"F10\" && event.shiftKey)) {\n event.preventDefault();\n const rect = (event.target as HTMLElement).getBoundingClientRect();\n openAt(rect.left + rect.width / 2, rect.top + rect.height / 2);\n }\n };\n\n const isInside = (node: Node | null) => Boolean(node && menuRef.current?.contains(node));\n\n return (\n // The area only listens for right-clicks and the Menu key bubbling up from the controls inside it.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={mergeRefs(ref, areaRef)}\n className={cx(styles.area, className)}\n data-open={open || undefined}\n onContextMenu={onContextMenu}\n onKeyDown={onKeyDown}\n {...rest}\n >\n {children}\n <MenuList\n id={menuId}\n items={items}\n open={open}\n focusTarget={focusTarget}\n menuRef={menuRef}\n position={position}\n label={label ?? m.contextMenu.label}\n isInside={isInside}\n onClose={close}\n onChoose={choose}\n />\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,IAAa,cAAc,WAA6C,SAAS,YAC/E,EAAE,UAAU,OAAO,UAAU,OAAO,WAAW,OAAO,cAAc,WAAW,GAAG,QAClF,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,SAAS,MAAM;CACrB,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,WAAW,OAA2B,IAAI;CAChD,MAAM,QAAQ,OAAc;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CAC1C,MAAM,CAAC,MAAM,gBAAgB,SAAS,KAAK;CAC3C,MAAM,CAAC,aAAa,kBAAkB,SAAiC,IAAI;CAG3E,MAAM,gBAAgB,OAAO,EAC3B,6BACE,QAAQ,SAAS;EAAE,GAAG,MAAM,QAAQ;EAAG,GAAG,MAAM,QAAQ;EAAG,OAAO;EAAG,QAAQ;CAAE,CAAC,EACpF,CAAC;CACD,MAAM,WAAW,oBAAoB,eAAe,SAAS,MAAM;EACjE,MAAM;EACN,OAAO;EACP,KAAK;CACP,CAAC;CAED,MAAM,WAAW,SAAkB;EACjC,aAAa,IAAI;EACjB,eAAe,IAAI;CACrB;CAEA,MAAM,UAAU,GAAW,MAAc;EACvC,IAAI,mBAAmB,KAAK,CAAC,CAAC,WAAW,GAAG;EAC5C,SAAS,UACP,SAAS,yBAAyB,cAAc,SAAS,gBAAgB;EAC3E,MAAM,UAAU;GAAE;GAAG;EAAE;EACvB,QAAQ,IAAI;EACZ,eAAe,OAAO;CACxB;CAEA,MAAM,SAAS,gBAAyB;EACtC,QAAQ,KAAK;EACb,eAAe,IAAI;EACnB,IAAI,aAAa,SAAS,SAAS,MAAM;CAC3C;CAEA,MAAM,UAAU,SAAwB;EACtC,MAAM,IAAI;EACV,KAAK,WAAW;EAChB,WAAW,KAAK,EAAE;CACpB;CAEA,MAAM,iBAAiB,UAAsC;EAC3D,IAAI,UAAU;EACd,MAAM,eAAe;EAKrB,MAHsB,OAAuB,QAC3C,oCAEF,CAAA,EAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;EACrC,OAAO,MAAM,SAAS,MAAM,OAAO;CACrC;CAEA,MAAM,aAAa,UAAyC;EAC1D,IAAI,UAAU;EACd,IAAI,MAAM,QAAQ,iBAAkB,MAAM,QAAQ,SAAS,MAAM,UAAW;GAC1E,MAAM,eAAe;GACrB,MAAM,OAAQ,MAAM,OAAuB,sBAAsB;GACjE,OAAO,KAAK,OAAO,KAAK,QAAQ,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC;EAC/D;CACF;CAEA,MAAM,YAAY,SAAsB,QAAQ,QAAQ,QAAQ,SAAS,SAAS,IAAI,CAAC;CAEvF,OAGE,qBAAC,OAAD;EACE,KAAK,UAAU,KAAK,OAAO;EAC3B,WAAW,GAAGA,2BAAO,MAAM,SAAS;EACpC,aAAW,QAAQ,KAAA;EACJ;EACJ;EACX,GAAI;EANN,UAAA,CAQG,UACD,oBAAC,UAAD;GACE,IAAI;GACG;GACD;GACO;GACJ;GACC;GACV,OAAO,SAAS,EAAE,YAAY;GACpB;GACV,SAAS;GACT,UAAU;EACX,CAAA,CACE;;AAET,CAAC"}
@@ -6,7 +6,7 @@ export interface ContextMenuProps extends Omit<HTMLAttributes<HTMLDivElement>, "
6
6
  items: BlockMenuEntry[];
7
7
  /** Called with the item id after any item is chosen. */
8
8
  onSelect?: (id: string) => void;
9
- /** Accessible name of the menu. @default "Context menu" */
9
+ /** Accessible name of the menu. @default messages.contextMenu.label ("Context menu") */
10
10
  label?: string;
11
11
  /** Keep the browser's own menu. */
12
12
  disabled?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.types.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/ContextMenu/ContextMenu.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,gBAAiB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACxF,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC"}
1
+ {"version":3,"file":"ContextMenu.types.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/ContextMenu/ContextMenu.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,gBAAiB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACxF,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,wFAAwF;IACxF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AchievementCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/AchievementCard/AchievementCard.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,+DAA+D;AAC/D,eAAO,MAAM,eAAe,8GA+C3B,CAAC"}
1
+ {"version":3,"file":"AchievementCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/AchievementCard/AchievementCard.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,+DAA+D;AAC/D,eAAO,MAAM,eAAe,8GAoD3B,CAAC"}
@@ -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 { BlockCard } from "../BlockCard/BlockCard.js";
4
5
  import cards_module_default from "../cards.module.js";
@@ -7,11 +8,12 @@ import { AchievementIcon, LockIcon } from "@malilion/block-ui-icons";
7
8
  import { jsx, jsxs } from "react/jsx-runtime";
8
9
  //#region src/components/cards/AchievementCard/AchievementCard.tsx
9
10
  /** Achievement tile — dimmed with a padlock until unlocked. */
10
- var AchievementCard = forwardRef(function AchievementCard({ title, description, icon, unlocked = false, unlockedAt, onView, material = "wood", label = "Achievement", className, ...rest }, ref) {
11
+ var AchievementCard = forwardRef(function AchievementCard({ title, description, icon, unlocked = false, unlockedAt, onView, material = "wood", label, className, ...rest }, ref) {
12
+ const m = useBlockUIMessages();
11
13
  return /* @__PURE__ */ jsxs(BlockCard, {
12
14
  ref,
13
15
  material,
14
- label,
16
+ label: label === void 0 ? m.achievementCard.label : label,
15
17
  "data-unlocked": unlocked || void 0,
16
18
  className: cx(cards_module_default.card, !unlocked && cards_module_default.locked, className),
17
19
  footer: onView ? /* @__PURE__ */ jsx(BlockButton, {
@@ -19,7 +21,7 @@ var AchievementCard = forwardRef(function AchievementCard({ title, description,
19
21
  variant: "wood",
20
22
  onClick: onView,
21
23
  disabled: !unlocked,
22
- children: "View"
24
+ children: m.achievementCard.view
23
25
  }) : void 0,
24
26
  ...rest,
25
27
  children: [/* @__PURE__ */ jsxs("div", {
@@ -40,7 +42,7 @@ var AchievementCard = forwardRef(function AchievementCard({ title, description,
40
42
  })]
41
43
  }), /* @__PURE__ */ jsx("p", {
42
44
  className: cards_module_default.meta,
43
- children: unlocked ? unlockedAt ? `Unlocked on ${unlockedAt}` : "Unlocked" : "Locked"
45
+ children: unlocked ? unlockedAt ? m.achievementCard.unlockedOn(unlockedAt) : m.achievementCard.unlocked : m.achievementCard.locked
44
46
  })]
45
47
  });
46
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AchievementCard.js","names":["styles"],"sources":["../../../../src/components/cards/AchievementCard/AchievementCard.tsx"],"sourcesContent":["import { AchievementIcon, LockIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport type { AchievementCardProps } from \"./AchievementCard.types\";\n\n/** Achievement tile — dimmed with a padlock until unlocked. */\nexport const AchievementCard = forwardRef<HTMLElement, AchievementCardProps>(\n function AchievementCard(\n {\n title,\n description,\n icon,\n unlocked = false,\n unlockedAt,\n onView,\n material = \"wood\",\n label = \"Achievement\",\n className,\n ...rest\n },\n ref,\n ) {\n return (\n <BlockCard\n ref={ref}\n material={material}\n label={label}\n data-unlocked={unlocked || undefined}\n className={cx(styles.card, !unlocked && styles.locked, className)}\n footer={\n onView ? (\n <BlockButton size=\"sm\" variant=\"wood\" onClick={onView} disabled={!unlocked}>\n View\n </BlockButton>\n ) : undefined\n }\n {...rest}\n >\n <div className={styles.headline}>\n <span className={styles.iconBox} aria-hidden=\"true\">\n {unlocked ? (icon ?? <AchievementIcon size={32} />) : <LockIcon size={24} />}\n </span>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{title}</p>\n {description ? <p className={styles.description}>{description}</p> : null}\n </div>\n </div>\n <p className={styles.meta}>\n {unlocked ? (unlockedAt ? `Unlocked on ${unlockedAt}` : \"Unlocked\") : \"Locked\"}\n </p>\n </BlockCard>\n );\n },\n);\n"],"mappings":";;;;;;;;;AASA,IAAa,kBAAkB,WAC7B,SAAS,gBACP,EACE,OACA,aACA,MACA,WAAW,OACX,YACA,QACA,WAAW,QACX,QAAQ,eACR,WACA,GAAG,QAEL,KACA;CACA,OACE,qBAAC,WAAD;EACO;EACK;EACH;EACP,iBAAe,YAAY,KAAA;EAC3B,WAAW,GAAGA,qBAAO,MAAM,CAAC,YAAYA,qBAAO,QAAQ,SAAS;EAChE,QACE,SACE,oBAAC,aAAD;GAAa,MAAK;GAAK,SAAQ;GAAO,SAAS;GAAQ,UAAU,CAAC;GAAU,UAAA;EAE/D,CAAA,IACX,KAAA;EAEN,GAAI;EAbN,UAAA,CAeE,qBAAC,OAAD;GAAK,WAAWA,qBAAO;GAAvB,UAAA,CACE,oBAAC,QAAD;IAAM,WAAWA,qBAAO;IAAS,eAAY;IAC1C,UAAA,WAAY,QAAQ,oBAAC,iBAAD,EAAiB,MAAM,GAAK,CAAA,IAAK,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;GACvE,CAAA,GACN,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,KAAD;KAAG,WAAWA,qBAAO;KAAQ,UAAA;IAAS,CAAA,GACrC,cAAc,oBAAC,KAAD;KAAG,WAAWA,qBAAO;KAAc,UAAA;IAAe,CAAA,IAAI,IAClE;GACF,CAAA,CAAA;EACL,CAAA,GAAA,oBAAC,KAAD;GAAG,WAAWA,qBAAO;GAClB,UAAA,WAAY,aAAa,eAAe,eAAe,aAAc;EACrE,CAAA,CACM;;AAEf,CACF"}
1
+ {"version":3,"file":"AchievementCard.js","names":["styles"],"sources":["../../../../src/components/cards/AchievementCard/AchievementCard.tsx"],"sourcesContent":["import { AchievementIcon, LockIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport type { AchievementCardProps } from \"./AchievementCard.types\";\n\n/** Achievement tile — dimmed with a padlock until unlocked. */\nexport const AchievementCard = forwardRef<HTMLElement, AchievementCardProps>(\n function AchievementCard(\n {\n title,\n description,\n icon,\n unlocked = false,\n unlockedAt,\n onView,\n material = \"wood\",\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.achievementCard.label : label}\n data-unlocked={unlocked || undefined}\n className={cx(styles.card, !unlocked && styles.locked, className)}\n footer={\n onView ? (\n <BlockButton size=\"sm\" variant=\"wood\" onClick={onView} disabled={!unlocked}>\n {m.achievementCard.view}\n </BlockButton>\n ) : undefined\n }\n {...rest}\n >\n <div className={styles.headline}>\n <span className={styles.iconBox} aria-hidden=\"true\">\n {unlocked ? (icon ?? <AchievementIcon size={32} />) : <LockIcon size={24} />}\n </span>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{title}</p>\n {description ? <p className={styles.description}>{description}</p> : null}\n </div>\n </div>\n <p className={styles.meta}>\n {unlocked\n ? unlockedAt\n ? m.achievementCard.unlockedOn(unlockedAt)\n : m.achievementCard.unlocked\n : m.achievementCard.locked}\n </p>\n </BlockCard>\n );\n },\n);\n"],"mappings":";;;;;;;;;;AAUA,IAAa,kBAAkB,WAC7B,SAAS,gBACP,EACE,OACA,aACA,MACA,WAAW,OACX,YACA,QACA,WAAW,QACX,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,OACE,qBAAC,WAAD;EACO;EACK;EACV,OAAO,UAAU,KAAA,IAAY,EAAE,gBAAgB,QAAQ;EACvD,iBAAe,YAAY,KAAA;EAC3B,WAAW,GAAGA,qBAAO,MAAM,CAAC,YAAYA,qBAAO,QAAQ,SAAS;EAChE,QACE,SACE,oBAAC,aAAD;GAAa,MAAK;GAAK,SAAQ;GAAO,SAAS;GAAQ,UAAU,CAAC;GAC/D,UAAA,EAAE,gBAAgB;EACR,CAAA,IACX,KAAA;EAEN,GAAI;EAbN,UAAA,CAeE,qBAAC,OAAD;GAAK,WAAWA,qBAAO;GAAvB,UAAA,CACE,oBAAC,QAAD;IAAM,WAAWA,qBAAO;IAAS,eAAY;IAC1C,UAAA,WAAY,QAAQ,oBAAC,iBAAD,EAAiB,MAAM,GAAK,CAAA,IAAK,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;GACvE,CAAA,GACN,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,KAAD;KAAG,WAAWA,qBAAO;KAAQ,UAAA;IAAS,CAAA,GACrC,cAAc,oBAAC,KAAD;KAAG,WAAWA,qBAAO;KAAc,UAAA;IAAe,CAAA,IAAI,IAClE;GACF,CAAA,CAAA;EACL,CAAA,GAAA,oBAAC,KAAD;GAAG,WAAWA,qBAAO;GAClB,UAAA,WACG,aACE,EAAE,gBAAgB,WAAW,UAAU,IACvC,EAAE,gBAAgB,WACpB,EAAE,gBAAgB;EACrB,CAAA,CACM;;AAEf,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlayerCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/PlayerCard/PlayerCard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAU1D,oEAAoE;AACpE,eAAO,MAAM,UAAU,yGA8DrB,CAAC"}
1
+ {"version":3,"file":"PlayerCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/PlayerCard/PlayerCard.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAU1D,oEAAoE;AACpE,eAAO,MAAM,UAAU,yGAiErB,CAAC"}
@@ -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 { XPBar } from "../../hud/XPBar/XPBar.js";
4
5
  import { BlockCard } from "../BlockCard/BlockCard.js";
@@ -16,17 +17,18 @@ var statusVariant = (status) => {
16
17
  return "stone";
17
18
  };
18
19
  /** Player summary: avatar, level, status, XP and optional stats. */
19
- var PlayerCard = forwardRef(function PlayerCard({ name, avatar, level, status, xp, maxXp, stats, onViewProfile, material = "deepslate", label = "Player", className, ...rest }, ref) {
20
+ var PlayerCard = forwardRef(function PlayerCard({ name, avatar, level, status, xp, maxXp, stats, onViewProfile, material = "deepslate", label, className, ...rest }, ref) {
21
+ const m = useBlockUIMessages();
20
22
  return /* @__PURE__ */ jsxs(BlockCard, {
21
23
  ref,
22
24
  material,
23
- label,
25
+ label: label === void 0 ? m.playerCard.label : label,
24
26
  className: cx(cards_module_default.card, className),
25
27
  footer: onViewProfile ? /* @__PURE__ */ jsx(BlockButton, {
26
28
  size: "sm",
27
29
  variant: "stone",
28
30
  onClick: onViewProfile,
29
- children: "Profile"
31
+ children: m.playerCard.profile
30
32
  }) : void 0,
31
33
  ...rest,
32
34
  children: [
@@ -45,9 +47,9 @@ var PlayerCard = forwardRef(function PlayerCard({ name, avatar, level, status, x
45
47
  className: cards_module_default.title,
46
48
  children: name
47
49
  }),
48
- level !== void 0 ? /* @__PURE__ */ jsxs("p", {
50
+ level !== void 0 ? /* @__PURE__ */ jsx("p", {
49
51
  className: cards_module_default.description,
50
- children: ["Level ", level]
52
+ children: m.playerCard.level(String(level))
51
53
  }) : null,
52
54
  status ? /* @__PURE__ */ jsx(BlockBadge, {
53
55
  size: "sm",
@@ -1 +1 @@
1
- {"version":3,"file":"PlayerCard.js","names":["styles"],"sources":["../../../../src/components/cards/PlayerCard/PlayerCard.tsx"],"sourcesContent":["import { PlayerIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockBadge } from \"../../display/BlockBadge/BlockBadge\";\nimport type { BlockBadgeVariant } from \"../../display/BlockBadge/BlockBadge.types\";\nimport { XPBar } from \"../../hud/XPBar/XPBar\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport type { PlayerCardProps } from \"./PlayerCard.types\";\n\nconst statusVariant = (status: string): BlockBadgeVariant => {\n const value = status.toLowerCase();\n if (value === \"online\") return \"emerald\";\n if (value === \"offline\") return \"redstone\";\n if (value === \"afk\" || value === \"away\" || value === \"idle\") return \"gold\";\n return \"stone\";\n};\n\n/** Player summary: avatar, level, status, XP and optional stats. */\nexport const PlayerCard = forwardRef<HTMLElement, PlayerCardProps>(function PlayerCard(\n {\n name,\n avatar,\n level,\n status,\n xp,\n maxXp,\n stats,\n onViewProfile,\n material = \"deepslate\",\n label = \"Player\",\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 footer={\n onViewProfile ? (\n <BlockButton size=\"sm\" variant=\"stone\" onClick={onViewProfile}>\n Profile\n </BlockButton>\n ) : undefined\n }\n {...rest}\n >\n <div className={styles.headline}>\n <span className={styles.iconBox}>\n {avatar ? <img src={avatar} alt=\"\" /> : <PlayerIcon size={32} />}\n </span>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{name}</p>\n {level !== undefined ? <p className={styles.description}>Level {level}</p> : null}\n {status ? (\n <BlockBadge size=\"sm\" dot variant={statusVariant(status)}>\n {status}\n </BlockBadge>\n ) : null}\n </div>\n </div>\n {xp !== undefined && maxXp !== undefined ? <XPBar value={xp} max={maxXp} showValue /> : null}\n {stats && stats.length > 0 ? (\n <dl className={styles.stats}>\n {stats.map((stat) => (\n <div key={stat.label} className={styles.statRow}>\n <dt>\n {stat.icon ? <span aria-hidden=\"true\">{stat.icon}</span> : null}\n {stat.label}\n </dt>\n <dd>{stat.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n </BlockCard>\n );\n});\n"],"mappings":";;;;;;;;;;AAWA,IAAM,iBAAiB,WAAsC;CAC3D,MAAM,QAAQ,OAAO,YAAY;CACjC,IAAI,UAAU,UAAU,OAAO;CAC/B,IAAI,UAAU,WAAW,OAAO;CAChC,IAAI,UAAU,SAAS,UAAU,UAAU,UAAU,QAAQ,OAAO;CACpE,OAAO;AACT;;AAGA,IAAa,aAAa,WAAyC,SAAS,WAC1E,EACE,MACA,QACA,OACA,QACA,IACA,OACA,OACA,eACA,WAAW,aACX,QAAQ,UACR,WACA,GAAG,QAEL,KACA;CACA,OACE,qBAAC,WAAD;EACO;EACK;EACH;EACP,WAAW,GAAGA,qBAAO,MAAM,SAAS;EACpC,QACE,gBACE,oBAAC,aAAD;GAAa,MAAK;GAAK,SAAQ;GAAQ,SAAS;GAAe,UAAA;EAElD,CAAA,IACX,KAAA;EAEN,GAAI;EAZN,UAAA;GAcE,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KACrB,UAAA,SAAS,oBAAC,OAAD;MAAK,KAAK;MAAQ,KAAI;KAAI,CAAA,IAAI,oBAAC,YAAD,EAAY,MAAM,GAAK,CAAA;IAC3D,CAAA,GACN,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA;MACE,oBAAC,KAAD;OAAG,WAAWA,qBAAO;OAAQ,UAAA;MAAQ,CAAA;MACpC,UAAU,KAAA,IAAY,qBAAC,KAAD;OAAG,WAAWA,qBAAO;OAArB,UAAA,CAAkC,UAAO,KAAS;MAAI,CAAA,IAAA;MAC5E,SACC,oBAAC,YAAD;OAAY,MAAK;OAAK,KAAA;OAAI,SAAS,cAAc,MAAM;OACpD,UAAA;MACS,CAAA,IACV;KACD;IACF,CAAA,CAAA;;GACJ,OAAO,KAAA,KAAa,UAAU,KAAA,IAAY,oBAAC,OAAD;IAAO,OAAO;IAAI,KAAK;IAAO,WAAA;GAAW,CAAA,IAAI;GACvF,SAAS,MAAM,SAAS,IACvB,oBAAC,MAAD;IAAI,WAAWA,qBAAO;IACnB,UAAA,MAAM,KAAK,SACV,qBAAC,OAAD;KAAsB,WAAWA,qBAAO;KAAxC,UAAA,CACE,qBAAC,MAAD,EAAA,UAAA,CACG,KAAK,OAAO,oBAAC,QAAD;MAAM,eAAY;MAAQ,UAAA,KAAK;KAAW,CAAA,IAAI,MAC1D,KAAK,KACJ,EAAA,CAAA,GACJ,oBAAC,MAAD,EAAA,UAAK,KAAK,MAAU,CAAA,CACjB;IANK,GAAA,KAAK,KAMV,CACN;GACC,CAAA,IACF;EACK;;AAEf,CAAC"}
1
+ {"version":3,"file":"PlayerCard.js","names":["styles"],"sources":["../../../../src/components/cards/PlayerCard/PlayerCard.tsx"],"sourcesContent":["import { PlayerIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockBadge } from \"../../display/BlockBadge/BlockBadge\";\nimport type { BlockBadgeVariant } from \"../../display/BlockBadge/BlockBadge.types\";\nimport { XPBar } from \"../../hud/XPBar/XPBar\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport type { PlayerCardProps } from \"./PlayerCard.types\";\n\nconst statusVariant = (status: string): BlockBadgeVariant => {\n const value = status.toLowerCase();\n if (value === \"online\") return \"emerald\";\n if (value === \"offline\") return \"redstone\";\n if (value === \"afk\" || value === \"away\" || value === \"idle\") return \"gold\";\n return \"stone\";\n};\n\n/** Player summary: avatar, level, status, XP and optional stats. */\nexport const PlayerCard = forwardRef<HTMLElement, PlayerCardProps>(function PlayerCard(\n {\n name,\n avatar,\n level,\n status,\n xp,\n maxXp,\n stats,\n onViewProfile,\n material = \"deepslate\",\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.playerCard.label : label}\n className={cx(styles.card, className)}\n footer={\n onViewProfile ? (\n <BlockButton size=\"sm\" variant=\"stone\" onClick={onViewProfile}>\n {m.playerCard.profile}\n </BlockButton>\n ) : undefined\n }\n {...rest}\n >\n <div className={styles.headline}>\n <span className={styles.iconBox}>\n {avatar ? <img src={avatar} alt=\"\" /> : <PlayerIcon size={32} />}\n </span>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{name}</p>\n {level !== undefined ? (\n <p className={styles.description}>{m.playerCard.level(String(level))}</p>\n ) : null}\n {status ? (\n <BlockBadge size=\"sm\" dot variant={statusVariant(status)}>\n {status}\n </BlockBadge>\n ) : null}\n </div>\n </div>\n {xp !== undefined && maxXp !== undefined ? <XPBar value={xp} max={maxXp} showValue /> : null}\n {stats && stats.length > 0 ? (\n <dl className={styles.stats}>\n {stats.map((stat) => (\n <div key={stat.label} className={styles.statRow}>\n <dt>\n {stat.icon ? <span aria-hidden=\"true\">{stat.icon}</span> : null}\n {stat.label}\n </dt>\n <dd>{stat.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n </BlockCard>\n );\n});\n"],"mappings":";;;;;;;;;;;AAYA,IAAM,iBAAiB,WAAsC;CAC3D,MAAM,QAAQ,OAAO,YAAY;CACjC,IAAI,UAAU,UAAU,OAAO;CAC/B,IAAI,UAAU,WAAW,OAAO;CAChC,IAAI,UAAU,SAAS,UAAU,UAAU,UAAU,QAAQ,OAAO;CACpE,OAAO;AACT;;AAGA,IAAa,aAAa,WAAyC,SAAS,WAC1E,EACE,MACA,QACA,OACA,QACA,IACA,OACA,OACA,eACA,WAAW,aACX,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,OACE,qBAAC,WAAD;EACO;EACK;EACV,OAAO,UAAU,KAAA,IAAY,EAAE,WAAW,QAAQ;EAClD,WAAW,GAAGA,qBAAO,MAAM,SAAS;EACpC,QACE,gBACE,oBAAC,aAAD;GAAa,MAAK;GAAK,SAAQ;GAAQ,SAAS;GAC7C,UAAA,EAAE,WAAW;EACH,CAAA,IACX,KAAA;EAEN,GAAI;EAZN,UAAA;GAcE,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KACrB,UAAA,SAAS,oBAAC,OAAD;MAAK,KAAK;MAAQ,KAAI;KAAI,CAAA,IAAI,oBAAC,YAAD,EAAY,MAAM,GAAK,CAAA;IAC3D,CAAA,GACN,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA;MACE,oBAAC,KAAD;OAAG,WAAWA,qBAAO;OAAQ,UAAA;MAAQ,CAAA;MACpC,UAAU,KAAA,IACT,oBAAC,KAAD;OAAG,WAAWA,qBAAO;OAAc,UAAA,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;MAAK,CAAA,IACtE;MACH,SACC,oBAAC,YAAD;OAAY,MAAK;OAAK,KAAA;OAAI,SAAS,cAAc,MAAM;OACpD,UAAA;MACS,CAAA,IACV;KACD;IACF,CAAA,CAAA;;GACJ,OAAO,KAAA,KAAa,UAAU,KAAA,IAAY,oBAAC,OAAD;IAAO,OAAO;IAAI,KAAK;IAAO,WAAA;GAAW,CAAA,IAAI;GACvF,SAAS,MAAM,SAAS,IACvB,oBAAC,MAAD;IAAI,WAAWA,qBAAO;IACnB,UAAA,MAAM,KAAK,SACV,qBAAC,OAAD;KAAsB,WAAWA,qBAAO;KAAxC,UAAA,CACE,qBAAC,MAAD,EAAA,UAAA,CACG,KAAK,OAAO,oBAAC,QAAD;MAAM,eAAY;MAAQ,UAAA,KAAK;KAAW,CAAA,IAAI,MAC1D,KAAK,KACJ,EAAA,CAAA,GACJ,oBAAC,MAAD,EAAA,UAAK,KAAK,MAAU,CAAA,CACjB;IANK,GAAA,KAAK,KAMV,CACN;GACC,CAAA,IACF;EACK;;AAEf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"QuestCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/QuestCard/QuestCard.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,iEAAiE;AACjE,eAAO,MAAM,SAAS,wGAsFpB,CAAC"}
1
+ {"version":3,"file":"QuestCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/QuestCard/QuestCard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,iEAAiE;AACjE,eAAO,MAAM,SAAS,wGAuFpB,CAAC"}
@@ -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 { formatNumber } from "../../../utils/number.js";
4
5
  import { BlockCard } from "../BlockCard/BlockCard.js";
@@ -9,13 +10,14 @@ import { CheckIcon, CoinIcon, QuestIcon, XPOrbIcon } from "@malilion/block-ui-ic
9
10
  import { jsx, jsxs } from "react/jsx-runtime";
10
11
  //#region src/components/cards/QuestCard/QuestCard.tsx
11
12
  /** Quest with progress, XP / coin rewards and a Claim action. */
12
- var QuestCard = forwardRef(function QuestCard({ title, description, progress = 0, max = 1, xp, coins, completed, claimed = false, onClaim, icon, material = "grass", label = "Quest", className, ...rest }, ref) {
13
+ var QuestCard = forwardRef(function QuestCard({ title, description, progress = 0, max = 1, xp, coins, completed, claimed = false, onClaim, icon, material = "grass", label, className, ...rest }, ref) {
14
+ const m = useBlockUIMessages();
13
15
  const done = completed ?? progress >= max;
14
16
  const current = Math.min(progress, max);
15
17
  return /* @__PURE__ */ jsxs(BlockCard, {
16
18
  ref,
17
19
  material,
18
- label,
20
+ label: label === void 0 ? m.questCard.label : label,
19
21
  "data-completed": done || void 0,
20
22
  className: cx(cards_module_default.card, className),
21
23
  footer: onClaim ? /* @__PURE__ */ jsx(BlockButton, {
@@ -24,7 +26,7 @@ var QuestCard = forwardRef(function QuestCard({ title, description, progress = 0
24
26
  disabled: !done || claimed,
25
27
  onClick: onClaim,
26
28
  startIcon: claimed ? /* @__PURE__ */ jsx(CheckIcon, { size: 16 }) : void 0,
27
- children: claimed ? "Claimed" : done ? "Claim" : "In progress"
29
+ children: claimed ? m.questCard.claimed : done ? m.questCard.claim : m.questCard.inProgress
28
30
  }) : void 0,
29
31
  ...rest,
30
32
  children: [
@@ -46,7 +48,7 @@ var QuestCard = forwardRef(function QuestCard({ title, description, progress = 0
46
48
  })]
47
49
  }),
48
50
  /* @__PURE__ */ jsx(BlockProgress, {
49
- label: "Progress",
51
+ label: m.common.progress,
50
52
  value: current,
51
53
  max,
52
54
  variant: done ? "gold" : "grass",
@@ -57,7 +59,7 @@ var QuestCard = forwardRef(function QuestCard({ title, description, progress = 0
57
59
  className: cards_module_default.rewards,
58
60
  children: [/* @__PURE__ */ jsx("span", {
59
61
  className: cards_module_default.rewardsLabel,
60
- children: "Reward"
62
+ children: m.questCard.reward
61
63
  }), /* @__PURE__ */ jsxs("ul", {
62
64
  className: cards_module_default.rewardList,
63
65
  children: [xp !== void 0 ? /* @__PURE__ */ jsxs("li", {
@@ -70,7 +72,7 @@ var QuestCard = forwardRef(function QuestCard({ title, description, progress = 0
70
72
  " ",
71
73
  /* @__PURE__ */ jsx("span", {
72
74
  className: cards_module_default.unit,
73
- children: "XP"
75
+ children: m.questCard.xp
74
76
  })
75
77
  ] })]
76
78
  }) : null, coins !== void 0 ? /* @__PURE__ */ jsxs("li", {
@@ -83,7 +85,7 @@ var QuestCard = forwardRef(function QuestCard({ title, description, progress = 0
83
85
  " ",
84
86
  /* @__PURE__ */ jsx("span", {
85
87
  className: cards_module_default.unit,
86
- children: "coins"
88
+ children: m.questCard.coins
87
89
  })
88
90
  ] })]
89
91
  }) : null]
@@ -1 +1 @@
1
- {"version":3,"file":"QuestCard.js","names":["styles"],"sources":["../../../../src/components/cards/QuestCard/QuestCard.tsx"],"sourcesContent":["import { CheckIcon, CoinIcon, QuestIcon, XPOrbIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber } from \"../../../utils/number\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockProgress } from \"../../feedback/Progress/BlockProgress\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport type { QuestCardProps } from \"./QuestCard.types\";\n\n/** Quest with progress, XP / coin rewards and a Claim action. */\nexport const QuestCard = forwardRef<HTMLElement, QuestCardProps>(function QuestCard(\n {\n title,\n description,\n progress = 0,\n max = 1,\n xp,\n coins,\n completed,\n claimed = false,\n onClaim,\n icon,\n material = \"grass\",\n label = \"Quest\",\n className,\n ...rest\n },\n ref,\n) {\n const done = completed ?? progress >= max;\n const current = Math.min(progress, max);\n\n return (\n <BlockCard\n ref={ref}\n material={material}\n label={label}\n data-completed={done || undefined}\n className={cx(styles.card, className)}\n footer={\n onClaim ? (\n <BlockButton\n variant={done && !claimed ? \"gold\" : \"stone\"}\n size=\"sm\"\n disabled={!done || claimed}\n onClick={onClaim}\n startIcon={claimed ? <CheckIcon size={16} /> : undefined}\n >\n {claimed ? \"Claimed\" : done ? \"Claim\" : \"In progress\"}\n </BlockButton>\n ) : undefined\n }\n {...rest}\n >\n <div className={styles.headline}>\n <span className={styles.iconBox} aria-hidden=\"true\">\n {icon ?? <QuestIcon size={32} />}\n </span>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{title}</p>\n {description ? <p className={styles.description}>{description}</p> : null}\n </div>\n </div>\n <BlockProgress\n label=\"Progress\"\n value={current}\n max={max}\n variant={done ? \"gold\" : \"grass\"}\n showValue\n formatValue={(value, total) => `${formatNumber(value)} / ${formatNumber(total)}`}\n />\n {xp !== undefined || coins !== undefined ? (\n <div className={styles.rewards}>\n <span className={styles.rewardsLabel}>Reward</span>\n <ul className={styles.rewardList}>\n {xp !== undefined ? (\n <li className={styles.reward}>\n <XPOrbIcon size={16} aria-hidden=\"true\" />\n <span>\n {formatNumber(xp)} <span className={styles.unit}>XP</span>\n </span>\n </li>\n ) : null}\n {coins !== undefined ? (\n <li className={styles.reward}>\n <CoinIcon size={16} aria-hidden=\"true\" />\n <span>\n {formatNumber(coins)} <span className={styles.unit}>coins</span>\n </span>\n </li>\n ) : null}\n </ul>\n </div>\n ) : null}\n </BlockCard>\n );\n});\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,YAAY,WAAwC,SAAS,UACxE,EACE,OACA,aACA,WAAW,GACX,MAAM,GACN,IACA,OACA,WACA,UAAU,OACV,SACA,MACA,WAAW,SACX,QAAQ,SACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,OAAO,aAAa,YAAY;CACtC,MAAM,UAAU,KAAK,IAAI,UAAU,GAAG;CAEtC,OACE,qBAAC,WAAD;EACO;EACK;EACH;EACP,kBAAgB,QAAQ,KAAA;EACxB,WAAW,GAAGA,qBAAO,MAAM,SAAS;EACpC,QACE,UACE,oBAAC,aAAD;GACE,SAAS,QAAQ,CAAC,UAAU,SAAS;GACrC,MAAK;GACL,UAAU,CAAC,QAAQ;GACnB,SAAS;GACT,WAAW,UAAU,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA,IAAI,KAAA;GAE9C,UAAA,UAAU,YAAY,OAAO,UAAU;EAC7B,CAAA,IACX,KAAA;EAEN,GAAI;EAnBN,UAAA;GAqBE,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAS,eAAY;KAC1C,UAAA,QAAQ,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;IAC3B,CAAA,GACN,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAQ,UAAA;KAAS,CAAA,GACrC,cAAc,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAc,UAAA;KAAe,CAAA,IAAI,IAClE;IACF,CAAA,CAAA;;GACL,oBAAC,eAAD;IACE,OAAM;IACN,OAAO;IACF;IACL,SAAS,OAAO,SAAS;IACzB,WAAA;IACA,cAAc,OAAO,UAAU,GAAG,aAAa,KAAK,EAAE,KAAK,aAAa,KAAK;GAC9E,CAAA;GACA,OAAO,KAAA,KAAa,UAAU,KAAA,IAC7B,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAc,UAAA;IAAY,CAAA,GAClD,qBAAC,MAAD;KAAI,WAAWA,qBAAO;KAAtB,UAAA,CACG,OAAO,KAAA,IACN,qBAAC,MAAD;MAAI,WAAWA,qBAAO;MAAtB,UAAA,CACE,oBAAC,WAAD;OAAW,MAAM;OAAI,eAAY;MAAQ,CAAA,GACzC,qBAAC,QAAD,EAAA,UAAA;OACG,aAAa,EAAE;OAAE;OAAC,oBAAC,QAAD;QAAM,WAAWA,qBAAO;QAAM,UAAA;OAAQ,CAAA;MACrD,EAAA,CAAA,CACJ;KACF,CAAA,IAAA,MACH,UAAU,KAAA,IACT,qBAAC,MAAD;MAAI,WAAWA,qBAAO;MAAtB,UAAA,CACE,oBAAC,UAAD;OAAU,MAAM;OAAI,eAAY;MAAQ,CAAA,GACxC,qBAAC,QAAD,EAAA,UAAA;OACG,aAAa,KAAK;OAAE;OAAC,oBAAC,QAAD;QAAM,WAAWA,qBAAO;QAAM,UAAA;OAAW,CAAA;MAC3D,EAAA,CAAA,CACJ;KACF,CAAA,IAAA,IACF;IACD,CAAA,CAAA;GACH,CAAA,IAAA;EACK;;AAEf,CAAC"}
1
+ {"version":3,"file":"QuestCard.js","names":["styles"],"sources":["../../../../src/components/cards/QuestCard/QuestCard.tsx"],"sourcesContent":["import { CheckIcon, CoinIcon, QuestIcon, XPOrbIcon } 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 { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockProgress } from \"../../feedback/Progress/BlockProgress\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport type { QuestCardProps } from \"./QuestCard.types\";\n\n/** Quest with progress, XP / coin rewards and a Claim action. */\nexport const QuestCard = forwardRef<HTMLElement, QuestCardProps>(function QuestCard(\n {\n title,\n description,\n progress = 0,\n max = 1,\n xp,\n coins,\n completed,\n claimed = false,\n onClaim,\n icon,\n material = \"grass\",\n label,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const done = completed ?? progress >= max;\n const current = Math.min(progress, max);\n\n return (\n <BlockCard\n ref={ref}\n material={material}\n label={label === undefined ? m.questCard.label : label}\n data-completed={done || undefined}\n className={cx(styles.card, className)}\n footer={\n onClaim ? (\n <BlockButton\n variant={done && !claimed ? \"gold\" : \"stone\"}\n size=\"sm\"\n disabled={!done || claimed}\n onClick={onClaim}\n startIcon={claimed ? <CheckIcon size={16} /> : undefined}\n >\n {claimed ? m.questCard.claimed : done ? m.questCard.claim : m.questCard.inProgress}\n </BlockButton>\n ) : undefined\n }\n {...rest}\n >\n <div className={styles.headline}>\n <span className={styles.iconBox} aria-hidden=\"true\">\n {icon ?? <QuestIcon size={32} />}\n </span>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{title}</p>\n {description ? <p className={styles.description}>{description}</p> : null}\n </div>\n </div>\n <BlockProgress\n label={m.common.progress}\n value={current}\n max={max}\n variant={done ? \"gold\" : \"grass\"}\n showValue\n formatValue={(value, total) => `${formatNumber(value)} / ${formatNumber(total)}`}\n />\n {xp !== undefined || coins !== undefined ? (\n <div className={styles.rewards}>\n <span className={styles.rewardsLabel}>{m.questCard.reward}</span>\n <ul className={styles.rewardList}>\n {xp !== undefined ? (\n <li className={styles.reward}>\n <XPOrbIcon size={16} aria-hidden=\"true\" />\n <span>\n {formatNumber(xp)} <span className={styles.unit}>{m.questCard.xp}</span>\n </span>\n </li>\n ) : null}\n {coins !== undefined ? (\n <li className={styles.reward}>\n <CoinIcon size={16} aria-hidden=\"true\" />\n <span>\n {formatNumber(coins)} <span className={styles.unit}>{m.questCard.coins}</span>\n </span>\n </li>\n ) : null}\n </ul>\n </div>\n ) : null}\n </BlockCard>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,YAAY,WAAwC,SAAS,UACxE,EACE,OACA,aACA,WAAW,GACX,MAAM,GACN,IACA,OACA,WACA,UAAU,OACV,SACA,MACA,WAAW,SACX,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,OAAO,aAAa,YAAY;CACtC,MAAM,UAAU,KAAK,IAAI,UAAU,GAAG;CAEtC,OACE,qBAAC,WAAD;EACO;EACK;EACV,OAAO,UAAU,KAAA,IAAY,EAAE,UAAU,QAAQ;EACjD,kBAAgB,QAAQ,KAAA;EACxB,WAAW,GAAGA,qBAAO,MAAM,SAAS;EACpC,QACE,UACE,oBAAC,aAAD;GACE,SAAS,QAAQ,CAAC,UAAU,SAAS;GACrC,MAAK;GACL,UAAU,CAAC,QAAQ;GACnB,SAAS;GACT,WAAW,UAAU,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA,IAAI,KAAA;GAE9C,UAAA,UAAU,EAAE,UAAU,UAAU,OAAO,EAAE,UAAU,QAAQ,EAAE,UAAU;EAC7D,CAAA,IACX,KAAA;EAEN,GAAI;EAnBN,UAAA;GAqBE,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAS,eAAY;KAC1C,UAAA,QAAQ,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;IAC3B,CAAA,GACN,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAQ,UAAA;KAAS,CAAA,GACrC,cAAc,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAc,UAAA;KAAe,CAAA,IAAI,IAClE;IACF,CAAA,CAAA;;GACL,oBAAC,eAAD;IACE,OAAO,EAAE,OAAO;IAChB,OAAO;IACF;IACL,SAAS,OAAO,SAAS;IACzB,WAAA;IACA,cAAc,OAAO,UAAU,GAAG,aAAa,KAAK,EAAE,KAAK,aAAa,KAAK;GAC9E,CAAA;GACA,OAAO,KAAA,KAAa,UAAU,KAAA,IAC7B,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAe,UAAA,EAAE,UAAU;IAAa,CAAA,GAChE,qBAAC,MAAD;KAAI,WAAWA,qBAAO;KAAtB,UAAA,CACG,OAAO,KAAA,IACN,qBAAC,MAAD;MAAI,WAAWA,qBAAO;MAAtB,UAAA,CACE,oBAAC,WAAD;OAAW,MAAM;OAAI,eAAY;MAAQ,CAAA,GACzC,qBAAC,QAAD,EAAA,UAAA;OACG,aAAa,EAAE;OAAE;OAAC,oBAAC,QAAD;QAAM,WAAWA,qBAAO;QAAO,UAAA,EAAE,UAAU;OAAS,CAAA;MACnE,EAAA,CAAA,CACJ;KACF,CAAA,IAAA,MACH,UAAU,KAAA,IACT,qBAAC,MAAD;MAAI,WAAWA,qBAAO;MAAtB,UAAA,CACE,oBAAC,UAAD;OAAU,MAAM;OAAI,eAAY;MAAQ,CAAA,GACxC,qBAAC,QAAD,EAAA,UAAA;OACG,aAAa,KAAK;OAAE;OAAC,oBAAC,QAAD;QAAM,WAAWA,qBAAO;QAAO,UAAA,EAAE,UAAU;OAAY,CAAA;MACzE,EAAA,CAAA,CACJ;KACF,CAAA,IAAA,IACF;IACD,CAAA,CAAA;GACH,CAAA,IAAA;EACK;;AAEf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ServerBrowser.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/ServerBrowser/ServerBrowser.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAc,MAAM,uBAAuB,CAAC;AAS5E;;;GAGG;AACH,eAAO,MAAM,aAAa,+GAuExB,CAAC"}
1
+ {"version":3,"file":"ServerBrowser.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/ServerBrowser/ServerBrowser.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAc,MAAM,uBAAuB,CAAC;AAG5E;;;GAGG;AACH,eAAO,MAAM,aAAa,+GAqFxB,CAAC"}
@@ -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";
@@ -10,25 +11,26 @@ import { forwardRef, useState } from "react";
10
11
  import { PlusIcon, SearchIcon } from "@malilion/block-ui-icons";
11
12
  import { jsx, jsxs } from "react/jsx-runtime";
12
13
  //#region src/components/cards/ServerBrowser/ServerBrowser.tsx
13
- var SORT_OPTIONS = [
14
- {
15
- value: "players",
16
- label: "Most players"
17
- },
18
- {
19
- value: "ping",
20
- label: "Lowest ping"
21
- },
22
- {
23
- value: "name",
24
- label: "Name"
25
- }
26
- ];
27
14
  /**
28
15
  * Multiplayer server list: search, sort and an "online only" switch over
29
16
  * `ServerCard`s, with optional Refresh and Add server actions.
30
17
  */
31
- var ServerBrowser = forwardRef(function ServerBrowser({ servers, onJoin, onRefresh, onAddServer, defaultSort = "players", emptyText = "No servers found", label = "Server browser", className, ...rest }, ref) {
18
+ var ServerBrowser = forwardRef(function ServerBrowser({ servers, onJoin, onRefresh, onAddServer, defaultSort = "players", emptyText, label, className, ...rest }, ref) {
19
+ const m = useBlockUIMessages();
20
+ const sortOptions = [
21
+ {
22
+ value: "players",
23
+ label: m.serverBrowser.mostPlayers
24
+ },
25
+ {
26
+ value: "ping",
27
+ label: m.serverBrowser.lowestPing
28
+ },
29
+ {
30
+ value: "name",
31
+ label: m.common.name
32
+ }
33
+ ];
32
34
  const [query, setQuery] = useState("");
33
35
  const [onlineOnly, setOnlineOnly] = useState(false);
34
36
  const [sort, setSort] = useState(defaultSort);
@@ -40,7 +42,7 @@ var ServerBrowser = forwardRef(function ServerBrowser({ servers, onJoin, onRefre
40
42
  return /* @__PURE__ */ jsxs("div", {
41
43
  ref,
42
44
  role: "region",
43
- "aria-label": label,
45
+ "aria-label": label ?? m.serverBrowser.label,
44
46
  className: cx(browser_module_default.browser, className),
45
47
  ...rest,
46
48
  children: [
@@ -49,21 +51,21 @@ var ServerBrowser = forwardRef(function ServerBrowser({ servers, onJoin, onRefre
49
51
  children: [
50
52
  /* @__PURE__ */ jsx(BlockInput, {
51
53
  type: "search",
52
- label: "Search servers",
54
+ label: m.serverBrowser.search,
53
55
  value: query,
54
56
  onChange: (event) => setQuery(event.target.value),
55
57
  startIcon: /* @__PURE__ */ jsx(SearchIcon, { size: 16 }),
56
58
  wrapperClassName: browser_module_default.search
57
59
  }),
58
60
  /* @__PURE__ */ jsx(BlockSelect, {
59
- label: "Sort by",
61
+ label: m.common.sortBy,
60
62
  value: sort,
61
63
  onChange: (event) => setSort(event.target.value),
62
- options: SORT_OPTIONS,
64
+ options: sortOptions,
63
65
  wrapperClassName: browser_module_default.filter
64
66
  }),
65
67
  /* @__PURE__ */ jsx(BlockToggle, {
66
- label: "Online only",
68
+ label: m.serverBrowser.onlineOnly,
67
69
  checked: onlineOnly,
68
70
  onCheckedChange: setOnlineOnly
69
71
  }),
@@ -71,12 +73,12 @@ var ServerBrowser = forwardRef(function ServerBrowser({ servers, onJoin, onRefre
71
73
  className: browser_module_default.actions,
72
74
  children: [onRefresh ? /* @__PURE__ */ jsx(BlockButton, {
73
75
  onClick: onRefresh,
74
- children: "Refresh"
76
+ children: m.serverBrowser.refresh
75
77
  }) : null, onAddServer ? /* @__PURE__ */ jsx(BlockButton, {
76
78
  variant: "grass",
77
79
  startIcon: /* @__PURE__ */ jsx(PlusIcon, { size: 16 }),
78
80
  onClick: onAddServer,
79
- children: "Add server"
81
+ children: m.serverBrowser.addServer
80
82
  }) : null]
81
83
  }) : null
82
84
  ]
@@ -84,18 +86,18 @@ var ServerBrowser = forwardRef(function ServerBrowser({ servers, onJoin, onRefre
84
86
  /* @__PURE__ */ jsx("p", {
85
87
  className: browser_module_default.count,
86
88
  role: "status",
87
- children: visible.length === 1 ? "1 server" : `${visible.length} servers`
89
+ children: m.serverBrowser.count(visible.length)
88
90
  }),
89
91
  visible.length > 0 ? /* @__PURE__ */ jsx("ul", {
90
92
  className: browser_module_default.list,
91
- "aria-label": "Servers",
93
+ "aria-label": m.serverBrowser.servers,
92
94
  children: visible.map(({ id, ...server }) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(ServerCard, {
93
95
  ...server,
94
96
  onJoin: onJoin ? () => onJoin(id) : void 0
95
97
  }) }, id))
96
98
  }) : /* @__PURE__ */ jsx("p", {
97
99
  className: browser_module_default.empty,
98
- children: emptyText
100
+ children: emptyText === void 0 ? m.serverBrowser.empty : emptyText
99
101
  })
100
102
  ]
101
103
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ServerBrowser.js","names":["styles"],"sources":["../../../../src/components/cards/ServerBrowser/ServerBrowser.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 { BlockToggle } from \"../../forms/BlockToggle/BlockToggle\";\nimport styles from \"../browser.module.css\";\nimport { ServerCard } from \"../ServerCard/ServerCard\";\nimport type { ServerBrowserProps, ServerSort } from \"./ServerBrowser.types\";\nimport { browseServers } from \"./ServerBrowser.utils\";\n\nconst SORT_OPTIONS = [\n { value: \"players\", label: \"Most players\" },\n { value: \"ping\", label: \"Lowest ping\" },\n { value: \"name\", label: \"Name\" },\n];\n\n/**\n * Multiplayer server list: search, sort and an \"online only\" switch over\n * `ServerCard`s, with optional Refresh and Add server actions.\n */\nexport const ServerBrowser = forwardRef<HTMLDivElement, ServerBrowserProps>(function ServerBrowser(\n {\n servers,\n onJoin,\n onRefresh,\n onAddServer,\n defaultSort = \"players\",\n emptyText = \"No servers found\",\n label = \"Server browser\",\n className,\n ...rest\n },\n ref,\n) {\n const [query, setQuery] = useState(\"\");\n const [onlineOnly, setOnlineOnly] = useState(false);\n const [sort, setSort] = useState<ServerSort>(defaultSort);\n const visible = browseServers(servers, { query, onlineOnly, 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 servers\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n startIcon={<SearchIcon size={16} />}\n wrapperClassName={styles.search}\n />\n <BlockSelect\n label=\"Sort by\"\n value={sort}\n onChange={(event) => setSort(event.target.value as ServerSort)}\n options={SORT_OPTIONS}\n wrapperClassName={styles.filter}\n />\n <BlockToggle label=\"Online only\" checked={onlineOnly} onCheckedChange={setOnlineOnly} />\n {onRefresh || onAddServer ? (\n <div className={styles.actions}>\n {onRefresh ? <BlockButton onClick={onRefresh}>Refresh</BlockButton> : null}\n {onAddServer ? (\n <BlockButton variant=\"grass\" startIcon={<PlusIcon size={16} />} onClick={onAddServer}>\n Add server\n </BlockButton>\n ) : null}\n </div>\n ) : null}\n </div>\n <p className={styles.count} role=\"status\">\n {visible.length === 1 ? \"1 server\" : `${visible.length} servers`}\n </p>\n {visible.length > 0 ? (\n <ul className={styles.list} aria-label=\"Servers\">\n {visible.map(({ id, ...server }) => (\n <li key={id}>\n <ServerCard {...server} onJoin={onJoin ? () => onJoin(id) : undefined} />\n </li>\n ))}\n </ul>\n ) : (\n <p className={styles.empty}>{emptyText}</p>\n )}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAM,eAAe;CACnB;EAAE,OAAO;EAAW,OAAO;CAAe;CAC1C;EAAE,OAAO;EAAQ,OAAO;CAAc;CACtC;EAAE,OAAO;EAAQ,OAAO;CAAO;AACjC;;;;;AAMA,IAAa,gBAAgB,WAA+C,SAAS,cACnF,EACE,SACA,QACA,WACA,aACA,cAAc,WACd,YAAY,oBACZ,QAAQ,kBACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,CAAC,MAAM,WAAW,SAAqB,WAAW;CACxD,MAAM,UAAU,cAAc,SAAS;EAAE;EAAO;EAAY;CAAK,CAAC;CAElE,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;KACD,oBAAC,aAAD;MACE,OAAM;MACN,OAAO;MACP,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAmB;MAC7D,SAAS;MACT,kBAAkBA,uBAAO;KAC1B,CAAA;KACD,oBAAC,aAAD;MAAa,OAAM;MAAc,SAAS;MAAY,iBAAiB;KAAgB,CAAA;KACtF,aAAa,cACZ,qBAAC,OAAD;MAAK,WAAWA,uBAAO;MAAvB,UAAA,CACG,YAAY,oBAAC,aAAD;OAAa,SAAS;OAAW,UAAA;MAAoB,CAAA,IAAI,MACrE,cACC,oBAAC,aAAD;OAAa,SAAQ;OAAQ,WAAW,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;OAAG,SAAS;OAAa,UAAA;MAEzE,CAAA,IACX,IACD;KACH,CAAA,IAAA;IACD;;GACL,oBAAC,KAAD;IAAG,WAAWA,uBAAO;IAAO,MAAK;IAC9B,UAAA,QAAQ,WAAW,IAAI,aAAa,GAAG,QAAQ,OAAO;GACtD,CAAA;GACF,QAAQ,SAAS,IAChB,oBAAC,MAAD;IAAI,WAAWA,uBAAO;IAAM,cAAW;IACpC,UAAA,QAAQ,KAAK,EAAE,IAAI,GAAG,aACrB,oBAAC,MAAD,EAAA,UACE,oBAAC,YAAD;KAAY,GAAI;KAAQ,QAAQ,eAAe,OAAO,EAAE,IAAI,KAAA;IAAY,CAAA,EACtE,GAFK,EAEL,CACL;GACC,CAAA,IAEJ,oBAAC,KAAD;IAAG,WAAWA,uBAAO;IAAQ,UAAA;GAAa,CAAA;EAEzC;;AAET,CAAC"}
1
+ {"version":3,"file":"ServerBrowser.js","names":["styles"],"sources":["../../../../src/components/cards/ServerBrowser/ServerBrowser.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 { BlockToggle } from \"../../forms/BlockToggle/BlockToggle\";\nimport styles from \"../browser.module.css\";\nimport { ServerCard } from \"../ServerCard/ServerCard\";\nimport type { ServerBrowserProps, ServerSort } from \"./ServerBrowser.types\";\nimport { browseServers } from \"./ServerBrowser.utils\";\n\n/**\n * Multiplayer server list: search, sort and an \"online only\" switch over\n * `ServerCard`s, with optional Refresh and Add server actions.\n */\nexport const ServerBrowser = forwardRef<HTMLDivElement, ServerBrowserProps>(function ServerBrowser(\n {\n servers,\n onJoin,\n onRefresh,\n onAddServer,\n defaultSort = \"players\",\n emptyText,\n label,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const sortOptions = [\n { value: \"players\", label: m.serverBrowser.mostPlayers },\n { value: \"ping\", label: m.serverBrowser.lowestPing },\n { value: \"name\", label: m.common.name },\n ];\n const [query, setQuery] = useState(\"\");\n const [onlineOnly, setOnlineOnly] = useState(false);\n const [sort, setSort] = useState<ServerSort>(defaultSort);\n const visible = browseServers(servers, { query, onlineOnly, sort });\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label ?? m.serverBrowser.label}\n className={cx(styles.browser, className)}\n {...rest}\n >\n <div className={styles.toolbar}>\n <BlockInput\n type=\"search\"\n label={m.serverBrowser.search}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n startIcon={<SearchIcon size={16} />}\n wrapperClassName={styles.search}\n />\n <BlockSelect\n label={m.common.sortBy}\n value={sort}\n onChange={(event) => setSort(event.target.value as ServerSort)}\n options={sortOptions}\n wrapperClassName={styles.filter}\n />\n <BlockToggle\n label={m.serverBrowser.onlineOnly}\n checked={onlineOnly}\n onCheckedChange={setOnlineOnly}\n />\n {onRefresh || onAddServer ? (\n <div className={styles.actions}>\n {onRefresh ? (\n <BlockButton onClick={onRefresh}>{m.serverBrowser.refresh}</BlockButton>\n ) : null}\n {onAddServer ? (\n <BlockButton variant=\"grass\" startIcon={<PlusIcon size={16} />} onClick={onAddServer}>\n {m.serverBrowser.addServer}\n </BlockButton>\n ) : null}\n </div>\n ) : null}\n </div>\n <p className={styles.count} role=\"status\">\n {m.serverBrowser.count(visible.length)}\n </p>\n {visible.length > 0 ? (\n <ul className={styles.list} aria-label={m.serverBrowser.servers}>\n {visible.map(({ id, ...server }) => (\n <li key={id}>\n <ServerCard {...server} onJoin={onJoin ? () => onJoin(id) : undefined} />\n </li>\n ))}\n </ul>\n ) : (\n <p className={styles.empty}>\n {emptyText === undefined ? m.serverBrowser.empty : emptyText}\n </p>\n )}\n </div>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,IAAa,gBAAgB,WAA+C,SAAS,cACnF,EACE,SACA,QACA,WACA,aACA,cAAc,WACd,WACA,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,cAAc;EAClB;GAAE,OAAO;GAAW,OAAO,EAAE,cAAc;EAAY;EACvD;GAAE,OAAO;GAAQ,OAAO,EAAE,cAAc;EAAW;EACnD;GAAE,OAAO;GAAQ,OAAO,EAAE,OAAO;EAAK;CACxC;CACA,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,CAAC,MAAM,WAAW,SAAqB,WAAW;CACxD,MAAM,UAAU,cAAc,SAAS;EAAE;EAAO;EAAY;CAAK,CAAC;CAElE,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY,SAAS,EAAE,cAAc;EACrC,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,cAAc;MACvB,OAAO;MACP,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;MAChD,WAAW,oBAAC,YAAD,EAAY,MAAM,GAAK,CAAA;MAClC,kBAAkBA,uBAAO;KAC1B,CAAA;KACD,oBAAC,aAAD;MACE,OAAO,EAAE,OAAO;MAChB,OAAO;MACP,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAmB;MAC7D,SAAS;MACT,kBAAkBA,uBAAO;KAC1B,CAAA;KACD,oBAAC,aAAD;MACE,OAAO,EAAE,cAAc;MACvB,SAAS;MACT,iBAAiB;KAClB,CAAA;KACA,aAAa,cACZ,qBAAC,OAAD;MAAK,WAAWA,uBAAO;MAAvB,UAAA,CACG,YACC,oBAAC,aAAD;OAAa,SAAS;OAAY,UAAA,EAAE,cAAc;MAAqB,CAAA,IACrE,MACH,cACC,oBAAC,aAAD;OAAa,SAAQ;OAAQ,WAAW,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;OAAG,SAAS;OACtE,UAAA,EAAE,cAAc;MACN,CAAA,IACX,IACD;KACH,CAAA,IAAA;IACD;;GACL,oBAAC,KAAD;IAAG,WAAWA,uBAAO;IAAO,MAAK;IAC9B,UAAA,EAAE,cAAc,MAAM,QAAQ,MAAM;GACpC,CAAA;GACF,QAAQ,SAAS,IAChB,oBAAC,MAAD;IAAI,WAAWA,uBAAO;IAAM,cAAY,EAAE,cAAc;IACrD,UAAA,QAAQ,KAAK,EAAE,IAAI,GAAG,aACrB,oBAAC,MAAD,EAAA,UACE,oBAAC,YAAD;KAAY,GAAI;KAAQ,QAAQ,eAAe,OAAO,EAAE,IAAI,KAAA;IAAY,CAAA,EACtE,GAFK,EAEL,CACL;GACC,CAAA,IAEJ,oBAAC,KAAD;IAAG,WAAWA,uBAAO;IAClB,UAAA,cAAc,KAAA,IAAY,EAAE,cAAc,QAAQ;GAClD,CAAA;EAEF;;AAET,CAAC"}
@@ -14,9 +14,9 @@ export interface ServerBrowserProps extends HTMLAttributes<HTMLDivElement> {
14
14
  onAddServer?: () => void;
15
15
  /** Initial sort. @default "players" */
16
16
  defaultSort?: ServerSort;
17
- /** Shown when no server matches. @default "No servers found" */
17
+ /** Shown when no server matches. @default messages.serverBrowser.empty ("No servers found") */
18
18
  emptyText?: ReactNode;
19
- /** Accessible name. @default "Server browser" */
19
+ /** Accessible name. @default messages.serverBrowser.label ("Server browser") */
20
20
  label?: string;
21
21
  }
22
22
  //# sourceMappingURL=ServerBrowser.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServerBrowser.types.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/ServerBrowser/ServerBrowser.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzE,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,kBAAmB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACxE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,iEAAiE;IACjE,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,uCAAuC;IACvC,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,gEAAgE;IAChE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"ServerBrowser.types.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/ServerBrowser/ServerBrowser.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzE,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,kBAAmB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACxE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,iEAAiE;IACjE,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,uCAAuC;IACvC,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ServerCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/ServerCard/ServerCard.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKvE,4EAA4E;AAC5E,eAAO,MAAM,UAAU,yGAuFrB,CAAC"}
1
+ {"version":3,"file":"ServerCard.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/ServerCard/ServerCard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKvE,4EAA4E;AAC5E,eAAO,MAAM,UAAU,yGAyFrB,CAAC"}
@@ -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 { formatNumber } from "../../../utils/number.js";
4
5
  import { BlockCard } from "../BlockCard/BlockCard.js";
@@ -16,13 +17,14 @@ var BARS = {
16
17
  offline: 0
17
18
  };
18
19
  /** Server entry with player count, version, ping bars and a Join action. */
19
- var ServerCard = forwardRef(function ServerCard({ name, onlinePlayers, maxPlayers, version, ping, online = true, motd, icon, onJoin, material = "stone", label = "Server", className, ...rest }, ref) {
20
+ var ServerCard = forwardRef(function ServerCard({ name, onlinePlayers, maxPlayers, version, ping, online = true, motd, icon, onJoin, material = "stone", label, className, ...rest }, ref) {
21
+ const m = useBlockUIMessages();
20
22
  const quality = pingQuality(ping, online);
21
- const pingText = online && ping !== void 0 ? `${ping} ms` : "Offline";
23
+ const pingText = online && ping !== void 0 ? m.serverCard.pingValue(String(ping)) : m.serverCard.offline;
22
24
  return /* @__PURE__ */ jsxs(BlockCard, {
23
25
  ref,
24
26
  material,
25
- label,
27
+ label: label === void 0 ? m.serverCard.label : label,
26
28
  "data-online": online || void 0,
27
29
  className: cx(cards_module_default.card, className),
28
30
  footer: onJoin ? /* @__PURE__ */ jsx(BlockButton, {
@@ -30,7 +32,7 @@ var ServerCard = forwardRef(function ServerCard({ name, onlinePlayers, maxPlayer
30
32
  variant: online ? "grass" : "stone",
31
33
  disabled: !online,
32
34
  onClick: onJoin,
33
- children: "Join"
35
+ children: m.serverCard.join
34
36
  }) : void 0,
35
37
  ...rest,
36
38
  children: [/* @__PURE__ */ jsxs("div", {
@@ -53,7 +55,7 @@ var ServerCard = forwardRef(function ServerCard({ name, onlinePlayers, maxPlayer
53
55
  }),
54
56
  /* @__PURE__ */ jsx("span", {
55
57
  role: "img",
56
- "aria-label": `Ping: ${pingText}`,
58
+ "aria-label": `${m.serverCard.ping}: ${pingText}`,
57
59
  className: ServerCard_module_default.signal,
58
60
  "data-quality": quality,
59
61
  children: [
@@ -72,15 +74,15 @@ var ServerCard = forwardRef(function ServerCard({ name, onlinePlayers, maxPlayer
72
74
  children: [
73
75
  /* @__PURE__ */ jsxs("div", {
74
76
  className: cards_module_default.statRow,
75
- children: [/* @__PURE__ */ jsx("dt", { children: "Online" }), /* @__PURE__ */ jsx("dd", { children: online && onlinePlayers !== void 0 ? `${formatNumber(onlinePlayers)}${maxPlayers !== void 0 ? ` / ${formatNumber(maxPlayers)}` : ""}` : "—" })]
77
+ children: [/* @__PURE__ */ jsx("dt", { children: m.serverCard.online }), /* @__PURE__ */ jsx("dd", { children: online && onlinePlayers !== void 0 ? `${formatNumber(onlinePlayers)}${maxPlayers !== void 0 ? ` / ${formatNumber(maxPlayers)}` : ""}` : "—" })]
76
78
  }),
77
79
  version ? /* @__PURE__ */ jsxs("div", {
78
80
  className: cards_module_default.statRow,
79
- children: [/* @__PURE__ */ jsx("dt", { children: "Version" }), /* @__PURE__ */ jsx("dd", { children: version })]
81
+ children: [/* @__PURE__ */ jsx("dt", { children: m.serverCard.version }), /* @__PURE__ */ jsx("dd", { children: version })]
80
82
  }) : null,
81
83
  /* @__PURE__ */ jsxs("div", {
82
84
  className: cards_module_default.statRow,
83
- children: [/* @__PURE__ */ jsx("dt", { children: "Ping" }), /* @__PURE__ */ jsx("dd", { children: pingText })]
85
+ children: [/* @__PURE__ */ jsx("dt", { children: m.serverCard.ping }), /* @__PURE__ */ jsx("dd", { children: pingText })]
84
86
  })
85
87
  ]
86
88
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"ServerCard.js","names":["styles","serverStyles"],"sources":["../../../../src/components/cards/ServerCard/ServerCard.tsx"],"sourcesContent":["import { GrassBlockIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { formatNumber } from \"../../../utils/number\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport serverStyles from \"./ServerCard.module.css\";\nimport type { PingQuality, ServerCardProps } from \"./ServerCard.types\";\nimport { pingQuality } from \"./ServerCard.utils\";\n\nconst BARS: Record<PingQuality, number> = { good: 4, fair: 3, poor: 1, offline: 0 };\n\n/** Server entry with player count, version, ping bars and a Join action. */\nexport const ServerCard = forwardRef<HTMLElement, ServerCardProps>(function ServerCard(\n {\n name,\n onlinePlayers,\n maxPlayers,\n version,\n ping,\n online = true,\n motd,\n icon,\n onJoin,\n material = \"stone\",\n label = \"Server\",\n className,\n ...rest\n },\n ref,\n) {\n const quality = pingQuality(ping, online);\n const pingText = online && ping !== undefined ? `${ping} ms` : \"Offline\";\n\n return (\n <BlockCard\n ref={ref}\n material={material}\n label={label}\n data-online={online || undefined}\n className={cx(styles.card, className)}\n footer={\n onJoin ? (\n <BlockButton\n size=\"sm\"\n variant={online ? \"grass\" : \"stone\"}\n disabled={!online}\n onClick={onJoin}\n >\n Join\n </BlockButton>\n ) : undefined\n }\n {...rest}\n >\n <div className={styles.headline}>\n <span className={styles.iconBox} aria-hidden=\"true\">\n {icon ?? <GrassBlockIcon size={32} />}\n </span>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{name}</p>\n {motd ? <p className={styles.description}>{motd}</p> : null}\n </div>\n <span\n role=\"img\"\n aria-label={`Ping: ${pingText}`}\n className={serverStyles.signal}\n data-quality={quality}\n >\n {[1, 2, 3, 4].map((bar) => (\n <span\n key={bar}\n className={serverStyles.bar}\n data-on={bar <= BARS[quality] || undefined}\n />\n ))}\n </span>\n </div>\n <dl className={styles.stats}>\n <div className={styles.statRow}>\n <dt>Online</dt>\n <dd>\n {online && onlinePlayers !== undefined\n ? `${formatNumber(onlinePlayers)}${maxPlayers !== undefined ? ` / ${formatNumber(maxPlayers)}` : \"\"}`\n : \"—\"}\n </dd>\n </div>\n {version ? (\n <div className={styles.statRow}>\n <dt>Version</dt>\n <dd>{version}</dd>\n </div>\n ) : null}\n <div className={styles.statRow}>\n <dt>Ping</dt>\n <dd>{pingText}</dd>\n </div>\n </dl>\n </BlockCard>\n );\n});\n"],"mappings":";;;;;;;;;;;AAWA,IAAM,OAAoC;CAAE,MAAM;CAAG,MAAM;CAAG,MAAM;CAAG,SAAS;AAAE;;AAGlF,IAAa,aAAa,WAAyC,SAAS,WAC1E,EACE,MACA,eACA,YACA,SACA,MACA,SAAS,MACT,MACA,MACA,QACA,WAAW,SACX,QAAQ,UACR,WACA,GAAG,QAEL,KACA;CACA,MAAM,UAAU,YAAY,MAAM,MAAM;CACxC,MAAM,WAAW,UAAU,SAAS,KAAA,IAAY,GAAG,KAAK,OAAO;CAE/D,OACE,qBAAC,WAAD;EACO;EACK;EACH;EACP,eAAa,UAAU,KAAA;EACvB,WAAW,GAAGA,qBAAO,MAAM,SAAS;EACpC,QACE,SACE,oBAAC,aAAD;GACE,MAAK;GACL,SAAS,SAAS,UAAU;GAC5B,UAAU,CAAC;GACX,SAAS;GACV,UAAA;EAEY,CAAA,IACX,KAAA;EAEN,GAAI;EAlBN,UAAA,CAoBE,qBAAC,OAAD;GAAK,WAAWA,qBAAO;GAAvB,UAAA;IACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAS,eAAY;KAC1C,UAAA,QAAQ,oBAAC,gBAAD,EAAgB,MAAM,GAAK,CAAA;IAChC,CAAA;IACN,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAQ,UAAA;KAAQ,CAAA,GACpC,OAAO,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAc,UAAA;KAAQ,CAAA,IAAI,IACpD;;IACL,oBAAC,QAAD;KACE,MAAK;KACL,cAAY,SAAS;KACrB,WAAWC,0BAAa;KACxB,gBAAc;KAEb,UAAA;MAAC;MAAG;MAAG;MAAG;KAAC,CAAC,CAAC,KAAK,QACjB,oBAAC,QAAD;MAEE,WAAWA,0BAAa;MACxB,WAAS,OAAO,KAAK,YAAY,KAAA;KAClC,GAHM,GAGN,CACF;IACG,CAAA;GACH;EACL,CAAA,GAAA,qBAAC,MAAD;GAAI,WAAWD,qBAAO;GAAtB,UAAA;IACE,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,MAAD,EAAA,UAAI,SAAU,CAAA,GACd,oBAAC,MAAD,EAAA,UACG,UAAU,kBAAkB,KAAA,IACzB,GAAG,aAAa,aAAa,IAAI,eAAe,KAAA,IAAY,MAAM,aAAa,UAAU,MAAM,OAC/F,IACF,CAAA,CACD;;IACJ,UACC,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,MAAD,EAAA,UAAI,UAAW,CAAA,GACf,oBAAC,MAAD,EAAA,UAAK,QAAY,CAAA,CACd;IACH,CAAA,IAAA;IACJ,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,MAAD,EAAA,UAAI,OAAQ,CAAA,GACZ,oBAAC,MAAD,EAAA,UAAK,SAAa,CAAA,CACf;;GACH;EACK,CAAA,CAAA;;AAEf,CAAC"}
1
+ {"version":3,"file":"ServerCard.js","names":["styles","serverStyles"],"sources":["../../../../src/components/cards/ServerCard/ServerCard.tsx"],"sourcesContent":["import { GrassBlockIcon } 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 { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { BlockCard } from \"../BlockCard/BlockCard\";\nimport styles from \"../cards.module.css\";\nimport serverStyles from \"./ServerCard.module.css\";\nimport type { PingQuality, ServerCardProps } from \"./ServerCard.types\";\nimport { pingQuality } from \"./ServerCard.utils\";\n\nconst BARS: Record<PingQuality, number> = { good: 4, fair: 3, poor: 1, offline: 0 };\n\n/** Server entry with player count, version, ping bars and a Join action. */\nexport const ServerCard = forwardRef<HTMLElement, ServerCardProps>(function ServerCard(\n {\n name,\n onlinePlayers,\n maxPlayers,\n version,\n ping,\n online = true,\n motd,\n icon,\n onJoin,\n material = \"stone\",\n label,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const quality = pingQuality(ping, online);\n const pingText =\n online && ping !== undefined ? m.serverCard.pingValue(String(ping)) : m.serverCard.offline;\n\n return (\n <BlockCard\n ref={ref}\n material={material}\n label={label === undefined ? m.serverCard.label : label}\n data-online={online || undefined}\n className={cx(styles.card, className)}\n footer={\n onJoin ? (\n <BlockButton\n size=\"sm\"\n variant={online ? \"grass\" : \"stone\"}\n disabled={!online}\n onClick={onJoin}\n >\n {m.serverCard.join}\n </BlockButton>\n ) : undefined\n }\n {...rest}\n >\n <div className={styles.headline}>\n <span className={styles.iconBox} aria-hidden=\"true\">\n {icon ?? <GrassBlockIcon size={32} />}\n </span>\n <div className={styles.titleBlock}>\n <p className={styles.title}>{name}</p>\n {motd ? <p className={styles.description}>{motd}</p> : null}\n </div>\n <span\n role=\"img\"\n aria-label={`${m.serverCard.ping}: ${pingText}`}\n className={serverStyles.signal}\n data-quality={quality}\n >\n {[1, 2, 3, 4].map((bar) => (\n <span\n key={bar}\n className={serverStyles.bar}\n data-on={bar <= BARS[quality] || undefined}\n />\n ))}\n </span>\n </div>\n <dl className={styles.stats}>\n <div className={styles.statRow}>\n <dt>{m.serverCard.online}</dt>\n <dd>\n {online && onlinePlayers !== undefined\n ? `${formatNumber(onlinePlayers)}${maxPlayers !== undefined ? ` / ${formatNumber(maxPlayers)}` : \"\"}`\n : \"—\"}\n </dd>\n </div>\n {version ? (\n <div className={styles.statRow}>\n <dt>{m.serverCard.version}</dt>\n <dd>{version}</dd>\n </div>\n ) : null}\n <div className={styles.statRow}>\n <dt>{m.serverCard.ping}</dt>\n <dd>{pingText}</dd>\n </div>\n </dl>\n </BlockCard>\n );\n});\n"],"mappings":";;;;;;;;;;;;AAYA,IAAM,OAAoC;CAAE,MAAM;CAAG,MAAM;CAAG,MAAM;CAAG,SAAS;AAAE;;AAGlF,IAAa,aAAa,WAAyC,SAAS,WAC1E,EACE,MACA,eACA,YACA,SACA,MACA,SAAS,MACT,MACA,MACA,QACA,WAAW,SACX,OACA,WACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,UAAU,YAAY,MAAM,MAAM;CACxC,MAAM,WACJ,UAAU,SAAS,KAAA,IAAY,EAAE,WAAW,UAAU,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW;CAErF,OACE,qBAAC,WAAD;EACO;EACK;EACV,OAAO,UAAU,KAAA,IAAY,EAAE,WAAW,QAAQ;EAClD,eAAa,UAAU,KAAA;EACvB,WAAW,GAAGA,qBAAO,MAAM,SAAS;EACpC,QACE,SACE,oBAAC,aAAD;GACE,MAAK;GACL,SAAS,SAAS,UAAU;GAC5B,UAAU,CAAC;GACX,SAAS;GAER,UAAA,EAAE,WAAW;EACH,CAAA,IACX,KAAA;EAEN,GAAI;EAlBN,UAAA,CAoBE,qBAAC,OAAD;GAAK,WAAWA,qBAAO;GAAvB,UAAA;IACE,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAS,eAAY;KAC1C,UAAA,QAAQ,oBAAC,gBAAD,EAAgB,MAAM,GAAK,CAAA;IAChC,CAAA;IACN,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAQ,UAAA;KAAQ,CAAA,GACpC,OAAO,oBAAC,KAAD;MAAG,WAAWA,qBAAO;MAAc,UAAA;KAAQ,CAAA,IAAI,IACpD;;IACL,oBAAC,QAAD;KACE,MAAK;KACL,cAAY,GAAG,EAAE,WAAW,KAAK,IAAI;KACrC,WAAWC,0BAAa;KACxB,gBAAc;KAEb,UAAA;MAAC;MAAG;MAAG;MAAG;KAAC,CAAC,CAAC,KAAK,QACjB,oBAAC,QAAD;MAEE,WAAWA,0BAAa;MACxB,WAAS,OAAO,KAAK,YAAY,KAAA;KAClC,GAHM,GAGN,CACF;IACG,CAAA;GACH;EACL,CAAA,GAAA,qBAAC,MAAD;GAAI,WAAWD,qBAAO;GAAtB,UAAA;IACE,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,MAAD,EAAA,UAAK,EAAE,WAAW,OAAW,CAAA,GAC7B,oBAAC,MAAD,EAAA,UACG,UAAU,kBAAkB,KAAA,IACzB,GAAG,aAAa,aAAa,IAAI,eAAe,KAAA,IAAY,MAAM,aAAa,UAAU,MAAM,OAC/F,IACF,CAAA,CACD;;IACJ,UACC,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,MAAD,EAAA,UAAK,EAAE,WAAW,QAAY,CAAA,GAC9B,oBAAC,MAAD,EAAA,UAAK,QAAY,CAAA,CACd;IACH,CAAA,IAAA;IACJ,qBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAvB,UAAA,CACE,oBAAC,MAAD,EAAA,UAAK,EAAE,WAAW,KAAS,CAAA,GAC3B,oBAAC,MAAD,EAAA,UAAK,SAAa,CAAA,CACf;;GACH;EACK,CAAA,CAAA;;AAEf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"WorldBrowser.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/WorldBrowser/WorldBrowser.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAa,MAAM,sBAAsB,CAAC;AAQzE,oFAAoF;AACpF,eAAO,MAAM,YAAY,8GA+EvB,CAAC"}
1
+ {"version":3,"file":"WorldBrowser.d.ts","sourceRoot":"","sources":["../../../../src/components/cards/WorldBrowser/WorldBrowser.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAa,MAAM,sBAAsB,CAAC;AAGzE,oFAAoF;AACpF,eAAO,MAAM,YAAY,8GA2EvB,CAAC"}