@malilion/block-ui-react 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/dist/components/actions/ContextMenu/ContextMenu.d.ts.map +1 -1
  2. package/dist/components/actions/ContextMenu/ContextMenu.js +4 -2
  3. package/dist/components/actions/ContextMenu/ContextMenu.js.map +1 -1
  4. package/dist/components/actions/ContextMenu/ContextMenu.types.d.ts +1 -1
  5. package/dist/components/actions/ContextMenu/ContextMenu.types.d.ts.map +1 -1
  6. package/dist/components/cards/AchievementCard/AchievementCard.d.ts.map +1 -1
  7. package/dist/components/cards/AchievementCard/AchievementCard.js +6 -4
  8. package/dist/components/cards/AchievementCard/AchievementCard.js.map +1 -1
  9. package/dist/components/cards/PlayerCard/PlayerCard.d.ts.map +1 -1
  10. package/dist/components/cards/PlayerCard/PlayerCard.js +7 -5
  11. package/dist/components/cards/PlayerCard/PlayerCard.js.map +1 -1
  12. package/dist/components/cards/QuestCard/QuestCard.d.ts.map +1 -1
  13. package/dist/components/cards/QuestCard/QuestCard.js +9 -7
  14. package/dist/components/cards/QuestCard/QuestCard.js.map +1 -1
  15. package/dist/components/cards/ServerBrowser/ServerBrowser.d.ts.map +1 -1
  16. package/dist/components/cards/ServerBrowser/ServerBrowser.js +27 -25
  17. package/dist/components/cards/ServerBrowser/ServerBrowser.js.map +1 -1
  18. package/dist/components/cards/ServerBrowser/ServerBrowser.types.d.ts +2 -2
  19. package/dist/components/cards/ServerBrowser/ServerBrowser.types.d.ts.map +1 -1
  20. package/dist/components/cards/ServerCard/ServerCard.d.ts.map +1 -1
  21. package/dist/components/cards/ServerCard/ServerCard.js +10 -8
  22. package/dist/components/cards/ServerCard/ServerCard.js.map +1 -1
  23. package/dist/components/cards/WorldBrowser/WorldBrowser.d.ts.map +1 -1
  24. package/dist/components/cards/WorldBrowser/WorldBrowser.js +20 -18
  25. package/dist/components/cards/WorldBrowser/WorldBrowser.js.map +1 -1
  26. package/dist/components/cards/WorldBrowser/WorldBrowser.types.d.ts +2 -2
  27. package/dist/components/cards/WorldBrowser/WorldBrowser.types.d.ts.map +1 -1
  28. package/dist/components/cards/WorldCard/WorldCard.d.ts.map +1 -1
  29. package/dist/components/cards/WorldCard/WorldCard.js +16 -6
  30. package/dist/components/cards/WorldCard/WorldCard.js.map +1 -1
  31. package/dist/components/crafting/Anvil/Anvil.d.ts.map +1 -1
  32. package/dist/components/crafting/Anvil/Anvil.js +9 -7
  33. package/dist/components/crafting/Anvil/Anvil.js.map +1 -1
  34. package/dist/components/crafting/Anvil/Anvil.types.d.ts +1 -1
  35. package/dist/components/crafting/Anvil/Anvil.types.d.ts.map +1 -1
  36. package/dist/components/crafting/BrewingStand/BrewingStand.d.ts.map +1 -1
  37. package/dist/components/crafting/BrewingStand/BrewingStand.js +11 -20
  38. package/dist/components/crafting/BrewingStand/BrewingStand.js.map +1 -1
  39. package/dist/components/crafting/BrewingStand/BrewingStand.types.d.ts +1 -1
  40. package/dist/components/crafting/BrewingStand/BrewingStand.types.d.ts.map +1 -1
  41. package/dist/components/crafting/BrewingStand/BrewingStand.types.js.map +1 -1
  42. package/dist/components/crafting/CraftingGrid/CraftingGrid.d.ts.map +1 -1
  43. package/dist/components/crafting/CraftingGrid/CraftingGrid.js +4 -2
  44. package/dist/components/crafting/CraftingGrid/CraftingGrid.js.map +1 -1
  45. package/dist/components/crafting/CraftingResult/CraftingResult.d.ts.map +1 -1
  46. package/dist/components/crafting/CraftingResult/CraftingResult.js +5 -2
  47. package/dist/components/crafting/CraftingResult/CraftingResult.js.map +1 -1
  48. package/dist/components/crafting/CraftingResult/CraftingResult.types.d.ts +1 -1
  49. package/dist/components/crafting/CraftingResult/CraftingResult.types.d.ts.map +1 -1
  50. package/dist/components/crafting/CraftingTable/CraftingTable.d.ts.map +1 -1
  51. package/dist/components/crafting/CraftingTable/CraftingTable.js +5 -3
  52. package/dist/components/crafting/CraftingTable/CraftingTable.js.map +1 -1
  53. package/dist/components/crafting/CraftingTable/CraftingTable.types.d.ts +2 -2
  54. package/dist/components/crafting/CraftingTable/CraftingTable.types.d.ts.map +1 -1
  55. package/dist/components/crafting/EnchantingTable/EnchantingTable.d.ts.map +1 -1
  56. package/dist/components/crafting/EnchantingTable/EnchantingTable.js +15 -13
  57. package/dist/components/crafting/EnchantingTable/EnchantingTable.js.map +1 -1
  58. package/dist/components/crafting/EnchantingTable/EnchantingTable.types.d.ts +1 -1
  59. package/dist/components/crafting/EnchantingTable/EnchantingTable.types.d.ts.map +1 -1
  60. package/dist/components/crafting/Furnace/Furnace.d.ts.map +1 -1
  61. package/dist/components/crafting/Furnace/Furnace.js +11 -16
  62. package/dist/components/crafting/Furnace/Furnace.js.map +1 -1
  63. package/dist/components/crafting/Furnace/Furnace.types.d.ts +1 -1
  64. package/dist/components/crafting/Furnace/Furnace.types.d.ts.map +1 -1
  65. package/dist/components/crafting/Furnace/Furnace.types.js.map +1 -1
  66. package/dist/components/crafting/RecipeBook/RecipeBook.d.ts.map +1 -1
  67. package/dist/components/crafting/RecipeBook/RecipeBook.js +17 -15
  68. package/dist/components/crafting/RecipeBook/RecipeBook.js.map +1 -1
  69. package/dist/components/crafting/RecipeBook/RecipeBook.types.d.ts +1 -1
  70. package/dist/components/crafting/RecipeBook/RecipeBook.types.d.ts.map +1 -1
  71. package/dist/components/crafting/TradingUI/TradingUI.d.ts +1 -1
  72. package/dist/components/crafting/TradingUI/TradingUI.d.ts.map +1 -1
  73. package/dist/components/crafting/TradingUI/TradingUI.js +14 -13
  74. package/dist/components/crafting/TradingUI/TradingUI.js.map +1 -1
  75. package/dist/components/crafting/TradingUI/TradingUI.types.d.ts +1 -1
  76. package/dist/components/crafting/TradingUI/TradingUI.types.d.ts.map +1 -1
  77. package/dist/components/crafting/TradingUI/TradingUI.types.js.map +1 -1
  78. package/dist/components/display/Avatar/Avatar.d.ts.map +1 -1
  79. package/dist/components/display/Avatar/Avatar.js +3 -7
  80. package/dist/components/display/Avatar/Avatar.js.map +1 -1
  81. package/dist/components/display/BlockTable/BlockTable.d.ts.map +1 -1
  82. package/dist/components/display/BlockTable/BlockTable.js +4 -2
  83. package/dist/components/display/BlockTable/BlockTable.js.map +1 -1
  84. package/dist/components/display/BlockTable/BlockTable.types.d.ts +1 -1
  85. package/dist/components/display/BlockTable/BlockTable.types.d.ts.map +1 -1
  86. package/dist/components/display/SkillTree/SkillTree.d.ts.map +1 -1
  87. package/dist/components/display/SkillTree/SkillTree.js +16 -15
  88. package/dist/components/display/SkillTree/SkillTree.js.map +1 -1
  89. package/dist/components/display/SkillTree/SkillTree.types.d.ts +1 -1
  90. package/dist/components/display/SkillTree/SkillTree.types.d.ts.map +1 -1
  91. package/dist/components/feedback/Alert/BlockAlert.d.ts.map +1 -1
  92. package/dist/components/feedback/Alert/BlockAlert.js +4 -2
  93. package/dist/components/feedback/Alert/BlockAlert.js.map +1 -1
  94. package/dist/components/feedback/Alert/BlockAlert.types.d.ts +1 -1
  95. package/dist/components/feedback/Alert/BlockAlert.types.d.ts.map +1 -1
  96. package/dist/components/feedback/Alert/BlockAlert.types.js.map +1 -1
  97. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.d.ts.map +1 -1
  98. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.js +5 -3
  99. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.js.map +1 -1
  100. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.types.d.ts +2 -2
  101. package/dist/components/feedback/ConfirmDialog/ConfirmDialog.types.d.ts.map +1 -1
  102. package/dist/components/feedback/Drawer/Drawer.d.ts.map +1 -1
  103. package/dist/components/feedback/Drawer/Drawer.js +3 -2
  104. package/dist/components/feedback/Drawer/Drawer.js.map +1 -1
  105. package/dist/components/feedback/Loading/BlockLoading.d.ts.map +1 -1
  106. package/dist/components/feedback/Loading/BlockLoading.js +4 -2
  107. package/dist/components/feedback/Loading/BlockLoading.js.map +1 -1
  108. package/dist/components/feedback/Loading/BlockLoading.types.d.ts +1 -1
  109. package/dist/components/feedback/Loading/BlockLoading.types.d.ts.map +1 -1
  110. package/dist/components/feedback/Modal/BlockModal.d.ts.map +1 -1
  111. package/dist/components/feedback/Modal/BlockModal.js +3 -2
  112. package/dist/components/feedback/Modal/BlockModal.js.map +1 -1
  113. package/dist/components/feedback/Progress/BlockProgress.d.ts.map +1 -1
  114. package/dist/components/feedback/Progress/BlockProgress.js +3 -1
  115. package/dist/components/feedback/Progress/BlockProgress.js.map +1 -1
  116. package/dist/components/feedback/Toast/Toast.d.ts +1 -1
  117. package/dist/components/feedback/Toast/Toast.d.ts.map +1 -1
  118. package/dist/components/feedback/Toast/Toast.js +6 -4
  119. package/dist/components/feedback/Toast/Toast.js.map +1 -1
  120. package/dist/components/feedback/Toast/Toast.types.d.ts +1 -1
  121. package/dist/components/feedback/Toast/Toast.types.d.ts.map +1 -1
  122. package/dist/components/forms/NumberInput/NumberInput.d.ts.map +1 -1
  123. package/dist/components/forms/NumberInput/NumberInput.js +4 -2
  124. package/dist/components/forms/NumberInput/NumberInput.js.map +1 -1
  125. package/dist/components/hud/ArmorBar/ArmorBar.d.ts.map +1 -1
  126. package/dist/components/hud/ArmorBar/ArmorBar.js +4 -2
  127. package/dist/components/hud/ArmorBar/ArmorBar.js.map +1 -1
  128. package/dist/components/hud/BiomeIndicator/BiomeIndicator.d.ts.map +1 -1
  129. package/dist/components/hud/BiomeIndicator/BiomeIndicator.js +4 -2
  130. package/dist/components/hud/BiomeIndicator/BiomeIndicator.js.map +1 -1
  131. package/dist/components/hud/CoordinatesHUD/CoordinatesHUD.d.ts.map +1 -1
  132. package/dist/components/hud/CoordinatesHUD/CoordinatesHUD.js +9 -7
  133. package/dist/components/hud/CoordinatesHUD/CoordinatesHUD.js.map +1 -1
  134. package/dist/components/hud/DayNightIndicator/DayNightIndicator.d.ts.map +1 -1
  135. package/dist/components/hud/DayNightIndicator/DayNightIndicator.js +7 -11
  136. package/dist/components/hud/DayNightIndicator/DayNightIndicator.js.map +1 -1
  137. package/dist/components/hud/DayNightIndicator/DayNightIndicator.utils.d.ts +4 -1
  138. package/dist/components/hud/DayNightIndicator/DayNightIndicator.utils.d.ts.map +1 -1
  139. package/dist/components/hud/DayNightIndicator/DayNightIndicator.utils.js +5 -2
  140. package/dist/components/hud/DayNightIndicator/DayNightIndicator.utils.js.map +1 -1
  141. package/dist/components/hud/HealthBar/HealthBar.d.ts.map +1 -1
  142. package/dist/components/hud/HealthBar/HealthBar.js +4 -2
  143. package/dist/components/hud/HealthBar/HealthBar.js.map +1 -1
  144. package/dist/components/hud/HungerBar/HungerBar.d.ts.map +1 -1
  145. package/dist/components/hud/HungerBar/HungerBar.js +4 -2
  146. package/dist/components/hud/HungerBar/HungerBar.js.map +1 -1
  147. package/dist/components/hud/MiniMap/MiniMap.d.ts.map +1 -1
  148. package/dist/components/hud/MiniMap/MiniMap.js +8 -7
  149. package/dist/components/hud/MiniMap/MiniMap.js.map +1 -1
  150. package/dist/components/hud/MiniMap/MiniMap.utils.d.ts +10 -2
  151. package/dist/components/hud/MiniMap/MiniMap.utils.d.ts.map +1 -1
  152. package/dist/components/hud/MiniMap/MiniMap.utils.js +12 -15
  153. package/dist/components/hud/MiniMap/MiniMap.utils.js.map +1 -1
  154. package/dist/components/hud/PlayerHUD/PlayerHUD.d.ts.map +1 -1
  155. package/dist/components/hud/PlayerHUD/PlayerHUD.js +4 -2
  156. package/dist/components/hud/PlayerHUD/PlayerHUD.js.map +1 -1
  157. package/dist/components/hud/PointsBar/PointsBar.d.ts.map +1 -1
  158. package/dist/components/hud/PointsBar/PointsBar.js +3 -1
  159. package/dist/components/hud/PointsBar/PointsBar.js.map +1 -1
  160. package/dist/components/hud/Scoreboard/Scoreboard.d.ts.map +1 -1
  161. package/dist/components/hud/Scoreboard/Scoreboard.js +9 -11
  162. package/dist/components/hud/Scoreboard/Scoreboard.js.map +1 -1
  163. package/dist/components/hud/WeatherIndicator/WeatherIndicator.d.ts.map +1 -1
  164. package/dist/components/hud/WeatherIndicator/WeatherIndicator.js +7 -4
  165. package/dist/components/hud/WeatherIndicator/WeatherIndicator.js.map +1 -1
  166. package/dist/components/hud/WeatherIndicator/WeatherIndicator.utils.js +1 -8
  167. package/dist/components/hud/WeatherIndicator/WeatherIndicator.utils.js.map +1 -1
  168. package/dist/components/hud/XPBar/XPBar.d.ts.map +1 -1
  169. package/dist/components/hud/XPBar/XPBar.js +6 -4
  170. package/dist/components/hud/XPBar/XPBar.js.map +1 -1
  171. package/dist/components/inventory/DurabilityBar/DurabilityBar.d.ts.map +1 -1
  172. package/dist/components/inventory/DurabilityBar/DurabilityBar.js +4 -2
  173. package/dist/components/inventory/DurabilityBar/DurabilityBar.js.map +1 -1
  174. package/dist/components/inventory/Hotbar/Hotbar.d.ts.map +1 -1
  175. package/dist/components/inventory/Hotbar/Hotbar.js +4 -2
  176. package/dist/components/inventory/Hotbar/Hotbar.js.map +1 -1
  177. package/dist/components/inventory/Inventory/Inventory.d.ts.map +1 -1
  178. package/dist/components/inventory/Inventory/Inventory.js +4 -2
  179. package/dist/components/inventory/Inventory/Inventory.js.map +1 -1
  180. package/dist/components/inventory/InventoryGrid/InventoryGrid.d.ts.map +1 -1
  181. package/dist/components/inventory/InventoryGrid/InventoryGrid.js +4 -2
  182. package/dist/components/inventory/InventoryGrid/InventoryGrid.js.map +1 -1
  183. package/dist/components/inventory/InventorySlot/InventorySlot.d.ts.map +1 -1
  184. package/dist/components/inventory/InventorySlot/InventorySlot.js +3 -1
  185. package/dist/components/inventory/InventorySlot/InventorySlot.js.map +1 -1
  186. package/dist/components/inventory/ItemStack/ItemStack.d.ts.map +1 -1
  187. package/dist/components/inventory/ItemStack/ItemStack.js +3 -1
  188. package/dist/components/inventory/ItemStack/ItemStack.js.map +1 -1
  189. package/dist/components/inventory/ItemStack/ItemStack.utils.d.ts +2 -1
  190. package/dist/components/inventory/ItemStack/ItemStack.utils.d.ts.map +1 -1
  191. package/dist/components/inventory/ItemStack/ItemStack.utils.js +6 -2
  192. package/dist/components/inventory/ItemStack/ItemStack.utils.js.map +1 -1
  193. package/dist/components/inventory/ItemTooltip/ItemTooltip.d.ts.map +1 -1
  194. package/dist/components/inventory/ItemTooltip/ItemTooltip.js +3 -1
  195. package/dist/components/inventory/ItemTooltip/ItemTooltip.js.map +1 -1
  196. package/dist/components/navigation/BlockPagination/BlockPagination.d.ts.map +1 -1
  197. package/dist/components/navigation/BlockPagination/BlockPagination.js +9 -12
  198. package/dist/components/navigation/BlockPagination/BlockPagination.js.map +1 -1
  199. package/dist/components/navigation/BlockPagination/BlockPagination.types.d.ts +1 -1
  200. package/dist/components/navigation/BlockPagination/BlockPagination.types.d.ts.map +1 -1
  201. package/dist/components/navigation/BlockSidebar/BlockSidebar.d.ts.map +1 -1
  202. package/dist/components/navigation/BlockSidebar/BlockSidebar.js +4 -2
  203. package/dist/components/navigation/BlockSidebar/BlockSidebar.js.map +1 -1
  204. package/dist/components/navigation/BlockSidebar/BlockSidebar.types.d.ts +1 -1
  205. package/dist/components/navigation/BlockSidebar/BlockSidebar.types.d.ts.map +1 -1
  206. package/dist/components/navigation/BlockStepper/BlockStepper.d.ts.map +1 -1
  207. package/dist/components/navigation/BlockStepper/BlockStepper.js +4 -2
  208. package/dist/components/navigation/BlockStepper/BlockStepper.js.map +1 -1
  209. package/dist/components/navigation/BlockStepper/BlockStepper.types.d.ts +1 -1
  210. package/dist/components/navigation/BlockStepper/BlockStepper.types.d.ts.map +1 -1
  211. package/dist/components/navigation/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  212. package/dist/components/navigation/Breadcrumb/Breadcrumb.js +4 -2
  213. package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -1
  214. package/dist/components/navigation/Breadcrumb/Breadcrumb.types.d.ts +1 -1
  215. package/dist/components/navigation/Breadcrumb/Breadcrumb.types.d.ts.map +1 -1
  216. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.d.ts.map +1 -1
  217. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.js +4 -2
  218. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.js.map +1 -1
  219. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.types.d.ts +1 -1
  220. package/dist/components/navigation/HotbarNavigation/HotbarNavigation.types.d.ts.map +1 -1
  221. package/dist/components/social/ChatWindow/ChatWindow.d.ts.map +1 -1
  222. package/dist/components/social/ChatWindow/ChatWindow.js +10 -7
  223. package/dist/components/social/ChatWindow/ChatWindow.js.map +1 -1
  224. package/dist/components/social/ChatWindow/ChatWindow.types.d.ts +2 -2
  225. package/dist/components/social/ChatWindow/ChatWindow.types.d.ts.map +1 -1
  226. package/dist/components/social/ChatWindow/ChatWindow.types.js.map +1 -1
  227. package/dist/components/social/CommandConsole/CommandConsole.d.ts.map +1 -1
  228. package/dist/components/social/CommandConsole/CommandConsole.js +7 -4
  229. package/dist/components/social/CommandConsole/CommandConsole.js.map +1 -1
  230. package/dist/components/social/CommandConsole/CommandConsole.types.d.ts +1 -1
  231. package/dist/components/social/CommandConsole/CommandConsole.types.d.ts.map +1 -1
  232. package/dist/components/social/CommandConsole/CommandConsole.types.js.map +1 -1
  233. package/dist/index.d.ts +1 -0
  234. package/dist/index.d.ts.map +1 -1
  235. package/dist/index.js +5 -3
  236. package/dist/locale/index.d.ts +4 -0
  237. package/dist/locale/index.d.ts.map +1 -0
  238. package/dist/locale/messages.d.ts +289 -0
  239. package/dist/locale/messages.d.ts.map +1 -0
  240. package/dist/locale/messages.js +341 -0
  241. package/dist/locale/messages.js.map +1 -0
  242. package/dist/locale/zhTW.d.ts +4 -0
  243. package/dist/locale/zhTW.d.ts.map +1 -0
  244. package/dist/locale/zhTW.js +331 -0
  245. package/dist/locale/zhTW.js.map +1 -0
  246. package/dist/provider/BlockUIProvider.d.ts.map +1 -1
  247. package/dist/provider/BlockUIProvider.js +10 -3
  248. package/dist/provider/BlockUIProvider.js.map +1 -1
  249. package/dist/provider/BlockUIProvider.types.d.ts +9 -0
  250. package/dist/provider/BlockUIProvider.types.d.ts.map +1 -1
  251. package/dist/provider/context.d.ts +3 -0
  252. package/dist/provider/context.d.ts.map +1 -1
  253. package/dist/provider/context.js +6 -1
  254. package/dist/provider/context.js.map +1 -1
  255. package/dist/provider/index.d.ts +1 -1
  256. package/dist/provider/index.d.ts.map +1 -1
  257. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- import { type TradingUIProps } from "./TradingUI.types";
1
+ import type { TradingUIProps } from "./TradingUI.types";
2
2
  /**
3
3
  * Villager trading: a keyboard-navigable list of offers (WAI-ARIA listbox)
4
4
  * beside the selected offer's payment and result slots, plus the villager's level.
@@ -1 +1 @@
1
- {"version":3,"file":"TradingUI.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/TradingUI/TradingUI.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxE;;;GAGG;AACH,eAAO,MAAM,SAAS,2GAyJpB,CAAC"}
1
+ {"version":3,"file":"TradingUI.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/TradingUI/TradingUI.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD;;;GAGG;AACH,eAAO,MAAM,SAAS,2GAwKpB,CAAC"}
@@ -1,10 +1,10 @@
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 { useControllableState } from "../../../hooks/useControllableState.js";
4
5
  import { clamp } from "../../../utils/number.js";
5
6
  import { InventorySlot } from "../../inventory/InventorySlot/InventorySlot.js";
6
7
  import TradingUI_module_default from "./TradingUI.module.js";
7
- import { villagerLevels } from "./TradingUI.types.js";
8
8
  import { isSoldOut } from "./TradingUI.utils.js";
9
9
  import { forwardRef, useId, useRef } from "react";
10
10
  import { ArrowIcon, CloseIcon } from "@malilion/block-ui-icons";
@@ -14,7 +14,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
14
14
  * Villager trading: a keyboard-navigable list of offers (WAI-ARIA listbox)
15
15
  * beside the selected offer's payment and result slots, plus the villager's level.
16
16
  */
17
- var TradingUI = forwardRef(function TradingUI({ trades, value, defaultValue, onValueChange, onTrade, profession, level, levelProgress, label = "Trading", className, ...rest }, ref) {
17
+ var TradingUI = forwardRef(function TradingUI({ trades, value, defaultValue, onValueChange, onTrade, profession, level, levelProgress, label, className, ...rest }, ref) {
18
+ const m = useBlockUIMessages();
18
19
  const baseId = useId();
19
20
  const [selectedId, setSelectedId] = useControllableState({
20
21
  value,
@@ -44,12 +45,12 @@ var TradingUI = forwardRef(function TradingUI({ trades, value, defaultValue, onV
44
45
  return /* @__PURE__ */ jsxs("div", {
45
46
  ref,
46
47
  role: "group",
47
- "aria-label": label,
48
+ "aria-label": label ?? m.tradingUI.label,
48
49
  className: cx(TradingUI_module_default.trading, className),
49
50
  ...rest,
50
51
  children: [/* @__PURE__ */ jsx("ul", {
51
52
  role: "listbox",
52
- "aria-label": "Trades",
53
+ "aria-label": m.tradingUI.trades,
53
54
  className: TradingUI_module_default.list,
54
55
  onKeyDown,
55
56
  children: trades.map((trade, index) => {
@@ -97,7 +98,7 @@ var TradingUI = forwardRef(function TradingUI({ trades, value, defaultValue, onV
97
98
  ]
98
99
  }), /* @__PURE__ */ jsxs("span", {
99
100
  className: "block-visually-hidden",
100
- children: [trade.label, out ? " (sold out)" : ""]
101
+ children: [trade.label, out ? m.tradingUI.soldOutSuffix : ""]
101
102
  })]
102
103
  }, trade.id);
103
104
  })
@@ -116,11 +117,11 @@ var TradingUI = forwardRef(function TradingUI({ trades, value, defaultValue, onV
116
117
  children: [
117
118
  levelIndex + 1,
118
119
  " · ",
119
- villagerLevels[levelIndex]
120
+ m.tradingUI.levels[levelIndex]
120
121
  ]
121
122
  }), levelProgress !== void 0 && levelIndex < 4 ? /* @__PURE__ */ jsx("div", {
122
123
  role: "progressbar",
123
- "aria-label": `Progress to ${villagerLevels[levelIndex + 1]}`,
124
+ "aria-label": m.tradingUI.progressTo(m.tradingUI.levels[levelIndex + 1] ?? ""),
124
125
  "aria-valuemin": 0,
125
126
  "aria-valuemax": 100,
126
127
  "aria-valuenow": Math.round(clamp(levelProgress, 0, 100)),
@@ -136,15 +137,15 @@ var TradingUI = forwardRef(function TradingUI({ trades, value, defaultValue, onV
136
137
  children: [
137
138
  /* @__PURE__ */ jsxs("div", {
138
139
  role: "group",
139
- "aria-label": "Payment",
140
+ "aria-label": m.tradingUI.payment,
140
141
  className: TradingUI_module_default.payment,
141
142
  children: [/* @__PURE__ */ jsx(InventorySlot, {
142
143
  size: "lg",
143
- label: selected ? void 0 : "Payment: empty",
144
+ label: selected ? void 0 : m.common.emptyNamed(m.tradingUI.payment),
144
145
  children: selected?.cost
145
146
  }), /* @__PURE__ */ jsx(InventorySlot, {
146
147
  size: "lg",
147
- label: selected?.cost2 ? void 0 : "Second payment: empty",
148
+ label: selected?.cost2 ? void 0 : m.common.emptyNamed(m.tradingUI.secondPayment),
148
149
  children: selected?.cost2
149
150
  })]
150
151
  }),
@@ -156,10 +157,10 @@ var TradingUI = forwardRef(function TradingUI({ trades, value, defaultValue, onV
156
157
  }),
157
158
  /* @__PURE__ */ jsx("div", {
158
159
  role: "group",
159
- "aria-label": "Result",
160
+ "aria-label": m.common.result,
160
161
  children: /* @__PURE__ */ jsx(InventorySlot, {
161
162
  size: "lg",
162
- label: selected ? void 0 : "Result: empty",
163
+ label: selected ? void 0 : m.common.emptyNamed(m.common.result),
163
164
  children: selected?.result
164
165
  })
165
166
  })
@@ -169,7 +170,7 @@ var TradingUI = forwardRef(function TradingUI({ trades, value, defaultValue, onV
169
170
  variant: "emerald",
170
171
  disabled: !selected || soldOut,
171
172
  onClick: () => selected && onTrade(selected.id),
172
- children: soldOut ? "Sold out" : "Trade"
173
+ children: soldOut ? m.tradingUI.soldOut : m.tradingUI.trade
173
174
  }) : null
174
175
  ]
175
176
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"TradingUI.js","names":["styles"],"sources":["../../../../src/components/crafting/TradingUI/TradingUI.tsx"],"sourcesContent":["import { ArrowIcon, CloseIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId, useRef, type CSSProperties, type KeyboardEvent } from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { cx } from \"../../../utils/cx\";\nimport { clamp } from \"../../../utils/number\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { InventorySlot } from \"../../inventory/InventorySlot/InventorySlot\";\nimport styles from \"./TradingUI.module.css\";\nimport { villagerLevels, type TradingUIProps } from \"./TradingUI.types\";\nimport { isSoldOut } from \"./TradingUI.utils\";\n\n/**\n * Villager trading: a keyboard-navigable list of offers (WAI-ARIA listbox)\n * beside the selected offer's payment and result slots, plus the villager's level.\n */\nexport const TradingUI = forwardRef<HTMLDivElement, TradingUIProps>(function TradingUI(\n {\n trades,\n value,\n defaultValue,\n onValueChange,\n onTrade,\n profession,\n level,\n levelProgress,\n label = \"Trading\",\n className,\n ...rest\n },\n ref,\n) {\n const baseId = useId();\n const [selectedId, setSelectedId] = useControllableState({\n value,\n defaultValue: defaultValue ?? trades[0]?.id ?? \"\",\n onChange: onValueChange,\n });\n const optionRefs = useRef(new Map<string, HTMLLIElement>());\n const selected = trades.find((trade) => trade.id === selectedId);\n const soldOut = selected ? isSoldOut(selected) : false;\n const levelIndex = level !== undefined ? clamp(Math.round(level), 1, 5) - 1 : undefined;\n\n const select = (id: string, focus = false) => {\n setSelectedId(id);\n if (focus) optionRefs.current.get(id)?.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n const index = trades.findIndex((trade) => trade.id === selectedId);\n let next: number | null = null;\n if (event.key === \"ArrowDown\") next = Math.min(index + 1, trades.length - 1);\n else if (event.key === \"ArrowUp\") next = Math.max(index - 1, 0);\n else if (event.key === \"Home\") next = 0;\n else if (event.key === \"End\") next = trades.length - 1;\n if (next === null) return;\n event.preventDefault();\n const trade = trades[next];\n if (trade) select(trade.id, true);\n };\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={label}\n className={cx(styles.trading, className)}\n {...rest}\n >\n <ul role=\"listbox\" aria-label=\"Trades\" className={styles.list} onKeyDown={onKeyDown}>\n {trades.map((trade, index) => {\n const isSelected = trade.id === selectedId;\n const out = isSoldOut(trade);\n const tabbable = isSelected || (!selected && index === 0);\n return (\n <li\n key={trade.id}\n ref={(element) => {\n if (element) optionRefs.current.set(trade.id, element);\n else optionRefs.current.delete(trade.id);\n }}\n id={`${baseId}-${trade.id}`}\n role=\"option\"\n aria-selected={isSelected}\n tabIndex={tabbable ? 0 : -1}\n data-sold-out={out || undefined}\n className={styles.offer}\n onClick={() => select(trade.id)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n select(trade.id);\n }\n }}\n >\n <span className={styles.offerItems} aria-hidden=\"true\">\n <span className={styles.mini}>{trade.cost}</span>\n {trade.cost2 ? <span className={styles.mini}>{trade.cost2}</span> : null}\n <span className={styles.offerArrow}>\n {out ? <CloseIcon size={16} /> : <ArrowIcon size={16} />}\n </span>\n <span className={styles.mini}>{trade.result}</span>\n </span>\n <span className=\"block-visually-hidden\">\n {trade.label}\n {out ? \" (sold out)\" : \"\"}\n </span>\n </li>\n );\n })}\n </ul>\n <div className={styles.detail}>\n {profession || levelIndex !== undefined ? (\n <div className={styles.villager}>\n {profession ? <p className={styles.profession}>{profession}</p> : null}\n {levelIndex !== undefined ? (\n <div className={styles.level}>\n <span className={styles.levelName}>\n {levelIndex + 1} · {villagerLevels[levelIndex]}\n </span>\n {levelProgress !== undefined && levelIndex < 4 ? (\n <div\n role=\"progressbar\"\n aria-label={`Progress to ${villagerLevels[levelIndex + 1]}`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(clamp(levelProgress, 0, 100))}\n className={styles.levelBar}\n style={\n { \"--block-trade-xp\": `${clamp(levelProgress, 0, 100)}%` } as CSSProperties\n }\n >\n <span className={styles.levelFill} />\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className={styles.exchange} aria-live=\"polite\">\n <div role=\"group\" aria-label=\"Payment\" className={styles.payment}>\n <InventorySlot size=\"lg\" label={selected ? undefined : \"Payment: empty\"}>\n {selected?.cost}\n </InventorySlot>\n <InventorySlot size=\"lg\" label={selected?.cost2 ? undefined : \"Second payment: empty\"}>\n {selected?.cost2}\n </InventorySlot>\n </div>\n <span className={styles.arrow} data-sold-out={soldOut || undefined} aria-hidden=\"true\">\n {soldOut ? <CloseIcon size={32} /> : <ArrowIcon size={32} />}\n </span>\n <div role=\"group\" aria-label=\"Result\">\n <InventorySlot size=\"lg\" label={selected ? undefined : \"Result: empty\"}>\n {selected?.result}\n </InventorySlot>\n </div>\n </div>\n {onTrade ? (\n <BlockButton\n variant=\"emerald\"\n disabled={!selected || soldOut}\n onClick={() => selected && onTrade(selected.id)}\n >\n {soldOut ? \"Sold out\" : \"Trade\"}\n </BlockButton>\n ) : null}\n </div>\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"TradingUI.js","names":["styles"],"sources":["../../../../src/components/crafting/TradingUI/TradingUI.tsx"],"sourcesContent":["import { ArrowIcon, CloseIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId, useRef, type CSSProperties, type KeyboardEvent } from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport { clamp } from \"../../../utils/number\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport { InventorySlot } from \"../../inventory/InventorySlot/InventorySlot\";\nimport styles from \"./TradingUI.module.css\";\nimport type { TradingUIProps } from \"./TradingUI.types\";\nimport { isSoldOut } from \"./TradingUI.utils\";\n\n/**\n * Villager trading: a keyboard-navigable list of offers (WAI-ARIA listbox)\n * beside the selected offer's payment and result slots, plus the villager's level.\n */\nexport const TradingUI = forwardRef<HTMLDivElement, TradingUIProps>(function TradingUI(\n {\n trades,\n value,\n defaultValue,\n onValueChange,\n onTrade,\n profession,\n level,\n levelProgress,\n label,\n className,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const baseId = useId();\n const [selectedId, setSelectedId] = useControllableState({\n value,\n defaultValue: defaultValue ?? trades[0]?.id ?? \"\",\n onChange: onValueChange,\n });\n const optionRefs = useRef(new Map<string, HTMLLIElement>());\n const selected = trades.find((trade) => trade.id === selectedId);\n const soldOut = selected ? isSoldOut(selected) : false;\n const levelIndex = level !== undefined ? clamp(Math.round(level), 1, 5) - 1 : undefined;\n\n const select = (id: string, focus = false) => {\n setSelectedId(id);\n if (focus) optionRefs.current.get(id)?.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n const index = trades.findIndex((trade) => trade.id === selectedId);\n let next: number | null = null;\n if (event.key === \"ArrowDown\") next = Math.min(index + 1, trades.length - 1);\n else if (event.key === \"ArrowUp\") next = Math.max(index - 1, 0);\n else if (event.key === \"Home\") next = 0;\n else if (event.key === \"End\") next = trades.length - 1;\n if (next === null) return;\n event.preventDefault();\n const trade = trades[next];\n if (trade) select(trade.id, true);\n };\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={label ?? m.tradingUI.label}\n className={cx(styles.trading, className)}\n {...rest}\n >\n <ul\n role=\"listbox\"\n aria-label={m.tradingUI.trades}\n className={styles.list}\n onKeyDown={onKeyDown}\n >\n {trades.map((trade, index) => {\n const isSelected = trade.id === selectedId;\n const out = isSoldOut(trade);\n const tabbable = isSelected || (!selected && index === 0);\n return (\n <li\n key={trade.id}\n ref={(element) => {\n if (element) optionRefs.current.set(trade.id, element);\n else optionRefs.current.delete(trade.id);\n }}\n id={`${baseId}-${trade.id}`}\n role=\"option\"\n aria-selected={isSelected}\n tabIndex={tabbable ? 0 : -1}\n data-sold-out={out || undefined}\n className={styles.offer}\n onClick={() => select(trade.id)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n select(trade.id);\n }\n }}\n >\n <span className={styles.offerItems} aria-hidden=\"true\">\n <span className={styles.mini}>{trade.cost}</span>\n {trade.cost2 ? <span className={styles.mini}>{trade.cost2}</span> : null}\n <span className={styles.offerArrow}>\n {out ? <CloseIcon size={16} /> : <ArrowIcon size={16} />}\n </span>\n <span className={styles.mini}>{trade.result}</span>\n </span>\n <span className=\"block-visually-hidden\">\n {trade.label}\n {out ? m.tradingUI.soldOutSuffix : \"\"}\n </span>\n </li>\n );\n })}\n </ul>\n <div className={styles.detail}>\n {profession || levelIndex !== undefined ? (\n <div className={styles.villager}>\n {profession ? <p className={styles.profession}>{profession}</p> : null}\n {levelIndex !== undefined ? (\n <div className={styles.level}>\n <span className={styles.levelName}>\n {levelIndex + 1} · {m.tradingUI.levels[levelIndex]}\n </span>\n {levelProgress !== undefined && levelIndex < 4 ? (\n <div\n role=\"progressbar\"\n aria-label={m.tradingUI.progressTo(m.tradingUI.levels[levelIndex + 1] ?? \"\")}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(clamp(levelProgress, 0, 100))}\n className={styles.levelBar}\n style={\n { \"--block-trade-xp\": `${clamp(levelProgress, 0, 100)}%` } as CSSProperties\n }\n >\n <span className={styles.levelFill} />\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className={styles.exchange} aria-live=\"polite\">\n <div role=\"group\" aria-label={m.tradingUI.payment} className={styles.payment}>\n <InventorySlot\n size=\"lg\"\n label={selected ? undefined : m.common.emptyNamed(m.tradingUI.payment)}\n >\n {selected?.cost}\n </InventorySlot>\n <InventorySlot\n size=\"lg\"\n label={selected?.cost2 ? undefined : m.common.emptyNamed(m.tradingUI.secondPayment)}\n >\n {selected?.cost2}\n </InventorySlot>\n </div>\n <span className={styles.arrow} data-sold-out={soldOut || undefined} aria-hidden=\"true\">\n {soldOut ? <CloseIcon size={32} /> : <ArrowIcon size={32} />}\n </span>\n <div role=\"group\" aria-label={m.common.result}>\n <InventorySlot\n size=\"lg\"\n label={selected ? undefined : m.common.emptyNamed(m.common.result)}\n >\n {selected?.result}\n </InventorySlot>\n </div>\n </div>\n {onTrade ? (\n <BlockButton\n variant=\"emerald\"\n disabled={!selected || soldOut}\n onClick={() => selected && onTrade(selected.id)}\n >\n {soldOut ? m.tradingUI.soldOut : m.tradingUI.trade}\n </BlockButton>\n ) : null}\n </div>\n </div>\n );\n});\n"],"mappings":"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"}
@@ -30,7 +30,7 @@ export interface TradingUIProps extends Omit<HTMLAttributes<HTMLDivElement>, "de
30
30
  level?: number;
31
31
  /** Progress to the next level, 0–100. */
32
32
  levelProgress?: number;
33
- /** Accessible name. @default "Trading" */
33
+ /** Accessible name. @default locale `tradingUI.label` ("Trading") */
34
34
  label?: string;
35
35
  }
36
36
  //# sourceMappingURL=TradingUI.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TradingUI.types.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/TradingUI/TradingUI.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,IAAI,EAAE,SAAS,CAAC;IAChB,kCAAkC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gCAAgC;IAChC,MAAM,EAAE,SAAS,CAAC;IAClB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,cAAc,qEAAsE,CAAC;AAElG,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAC1F,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,+DAA+D;IAC/D,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"TradingUI.types.d.ts","sourceRoot":"","sources":["../../../../src/components/crafting/TradingUI/TradingUI.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,IAAI,EAAE,SAAS,CAAC;IAChB,kCAAkC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gCAAgC;IAChC,MAAM,EAAE,SAAS,CAAC;IAClB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,cAAc,qEAAsE,CAAC;AAElG,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAC1F,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,+DAA+D;IAC/D,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"TradingUI.types.js","names":[],"sources":["../../../../src/components/crafting/TradingUI/TradingUI.types.ts"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\n\nexport interface Trade {\n id: string;\n /** Price, usually an `<ItemStack />` (e.g. emeralds). */\n cost: ReactNode;\n /** Optional second price item. */\n cost2?: ReactNode;\n /** What the player receives. */\n result: ReactNode;\n /** Accessible summary, e.g. \"12 emeralds for a diamond sword\". */\n label: string;\n /** Times traded so far. */\n uses?: number;\n /** Uses before the trade sells out. */\n maxUses?: number;\n}\n\nexport const villagerLevels = [\"Novice\", \"Apprentice\", \"Journeyman\", \"Expert\", \"Master\"] as const;\n\nexport interface TradingUIProps extends Omit<HTMLAttributes<HTMLDivElement>, \"defaultValue\"> {\n trades: Trade[];\n /** Controlled selected trade id. */\n value?: string;\n /** Initially selected trade id. @default the first trade */\n defaultValue?: string;\n onValueChange?: (id: string) => void;\n /** Called when the player confirms the selected trade. */\n onTrade?: (id: string) => void;\n /** Villager profession shown in the header, e.g. \"Armorer\". */\n profession?: ReactNode;\n /** Villager level 1–5 (Novice … Master). */\n level?: number;\n /** Progress to the next level, 0–100. */\n levelProgress?: number;\n /** Accessible name. @default \"Trading\" */\n label?: string;\n}\n"],"mappings":";AAkBA,IAAa,iBAAiB;CAAC;CAAU;CAAc;CAAc;CAAU;AAAQ"}
1
+ {"version":3,"file":"TradingUI.types.js","names":[],"sources":["../../../../src/components/crafting/TradingUI/TradingUI.types.ts"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\n\nexport interface Trade {\n id: string;\n /** Price, usually an `<ItemStack />` (e.g. emeralds). */\n cost: ReactNode;\n /** Optional second price item. */\n cost2?: ReactNode;\n /** What the player receives. */\n result: ReactNode;\n /** Accessible summary, e.g. \"12 emeralds for a diamond sword\". */\n label: string;\n /** Times traded so far. */\n uses?: number;\n /** Uses before the trade sells out. */\n maxUses?: number;\n}\n\nexport const villagerLevels = [\"Novice\", \"Apprentice\", \"Journeyman\", \"Expert\", \"Master\"] as const;\n\nexport interface TradingUIProps extends Omit<HTMLAttributes<HTMLDivElement>, \"defaultValue\"> {\n trades: Trade[];\n /** Controlled selected trade id. */\n value?: string;\n /** Initially selected trade id. @default the first trade */\n defaultValue?: string;\n onValueChange?: (id: string) => void;\n /** Called when the player confirms the selected trade. */\n onTrade?: (id: string) => void;\n /** Villager profession shown in the header, e.g. \"Armorer\". */\n profession?: ReactNode;\n /** Villager level 1–5 (Novice … Master). */\n level?: number;\n /** Progress to the next level, 0–100. */\n levelProgress?: number;\n /** Accessible name. @default locale `tradingUI.label` (\"Trading\") */\n label?: string;\n}\n"],"mappings":";AAkBA,IAAa,iBAAiB;CAAC;CAAU;CAAc;CAAc;CAAU;AAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../src/components/display/Avatar/Avatar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD;;;GAGG;AACH,eAAO,MAAM,MAAM,yGAiCjB,CAAC"}
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../../src/components/display/Avatar/Avatar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD;;;GAGG;AACH,eAAO,MAAM,MAAM,yGAkCjB,CAAC"}
@@ -1,23 +1,19 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import Avatar_module_default from "./Avatar.module.js";
3
4
  import { avatarMaterial, initials } from "./Avatar.utils.js";
4
5
  import { forwardRef, useState } from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
7
  //#region src/components/display/Avatar/Avatar.tsx
7
- var STATUS_TEXT = {
8
- online: "online",
9
- away: "away",
10
- busy: "busy",
11
- offline: "offline"
12
- };
13
8
  /**
14
9
  * Square block avatar: a pixelated face image, or initials on a material
15
10
  * colour picked from the name, with an optional presence dot.
16
11
  */
17
12
  var Avatar = forwardRef(function Avatar({ name, src, icon, size = "md", status, decorative = false, className, ...rest }, ref) {
13
+ const m = useBlockUIMessages();
18
14
  const [failedSrc, setFailedSrc] = useState(void 0);
19
15
  const showImage = src !== void 0 && src !== failedSrc;
20
- const accessibleName = status ? `${name} (${STATUS_TEXT[status]})` : name;
16
+ const accessibleName = status ? `${name} (${m.avatar.statuses[status]})` : name;
21
17
  return /* @__PURE__ */ jsxs("span", {
22
18
  ref,
23
19
  role: decorative ? void 0 : "img",
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.js","names":["styles"],"sources":["../../../../src/components/display/Avatar/Avatar.tsx"],"sourcesContent":["import { forwardRef, useState } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./Avatar.module.css\";\nimport type { AvatarProps } from \"./Avatar.types\";\nimport { avatarMaterial, initials } from \"./Avatar.utils\";\n\nconst STATUS_TEXT = { online: \"online\", away: \"away\", busy: \"busy\", offline: \"offline\" } as const;\n\n/**\n * Square block avatar: a pixelated face image, or initials on a material\n * colour picked from the name, with an optional presence dot.\n */\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n { name, src, icon, size = \"md\", status, decorative = false, className, ...rest },\n ref,\n) {\n const [failedSrc, setFailedSrc] = useState<string | undefined>(undefined);\n const showImage = src !== undefined && src !== failedSrc;\n const accessibleName = status ? `${name} (${STATUS_TEXT[status]})` : name;\n\n return (\n <span\n ref={ref}\n role={decorative ? undefined : \"img\"}\n aria-label={decorative ? undefined : accessibleName}\n aria-hidden={decorative || undefined}\n data-size={size}\n data-material={avatarMaterial(name)}\n className={cx(styles.avatar, className)}\n {...rest}\n >\n {showImage ? (\n <img src={src} alt=\"\" className={styles.image} onError={() => setFailedSrc(src)} />\n ) : icon ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n ) : (\n <span className={styles.initials} aria-hidden=\"true\">\n {initials(name)}\n </span>\n )}\n {status ? <span className={styles.status} data-status={status} aria-hidden=\"true\" /> : null}\n </span>\n );\n});\n"],"mappings":";;;;;;AAMA,IAAM,cAAc;CAAE,QAAQ;CAAU,MAAM;CAAQ,MAAM;CAAQ,SAAS;AAAU;;;;;AAMvF,IAAa,SAAS,WAAyC,SAAS,OACtE,EAAE,MAAM,KAAK,MAAM,OAAO,MAAM,QAAQ,aAAa,OAAO,WAAW,GAAG,QAC1E,KACA;CACA,MAAM,CAAC,WAAW,gBAAgB,SAA6B,KAAA,CAAS;CACxE,MAAM,YAAY,QAAQ,KAAA,KAAa,QAAQ;CAC/C,MAAM,iBAAiB,SAAS,GAAG,KAAK,IAAI,YAAY,QAAQ,KAAK;CAErE,OACE,qBAAC,QAAD;EACO;EACL,MAAM,aAAa,KAAA,IAAY;EAC/B,cAAY,aAAa,KAAA,IAAY;EACrC,eAAa,cAAc,KAAA;EAC3B,aAAW;EACX,iBAAe,eAAe,IAAI;EAClC,WAAW,GAAGA,sBAAO,QAAQ,SAAS;EACtC,GAAI;EARN,UAAA,CAUG,YACC,oBAAC,OAAD;GAAU;GAAK,KAAI;GAAG,WAAWA,sBAAO;GAAO,eAAe,aAAa,GAAG;EAAI,CAAA,IAChF,OACF,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAM,eAAY;GACvC,UAAA;EACG,CAAA,IAEN,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAU,eAAY;GAC3C,UAAA,SAAS,IAAI;EACV,CAAA,GAEP,SAAS,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAQ,eAAa;GAAQ,eAAY;EAAQ,CAAA,IAAI,IACnF;;AAEV,CAAC"}
1
+ {"version":3,"file":"Avatar.js","names":["styles"],"sources":["../../../../src/components/display/Avatar/Avatar.tsx"],"sourcesContent":["import { forwardRef, useState } from \"react\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./Avatar.module.css\";\nimport type { AvatarProps } from \"./Avatar.types\";\nimport { avatarMaterial, initials } from \"./Avatar.utils\";\n\n/**\n * Square block avatar: a pixelated face image, or initials on a material\n * colour picked from the name, with an optional presence dot.\n */\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n { name, src, icon, size = \"md\", status, decorative = false, className, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n const [failedSrc, setFailedSrc] = useState<string | undefined>(undefined);\n const showImage = src !== undefined && src !== failedSrc;\n const accessibleName = status ? `${name} (${m.avatar.statuses[status]})` : name;\n\n return (\n <span\n ref={ref}\n role={decorative ? undefined : \"img\"}\n aria-label={decorative ? undefined : accessibleName}\n aria-hidden={decorative || undefined}\n data-size={size}\n data-material={avatarMaterial(name)}\n className={cx(styles.avatar, className)}\n {...rest}\n >\n {showImage ? (\n <img src={src} alt=\"\" className={styles.image} onError={() => setFailedSrc(src)} />\n ) : icon ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n ) : (\n <span className={styles.initials} aria-hidden=\"true\">\n {initials(name)}\n </span>\n )}\n {status ? <span className={styles.status} data-status={status} aria-hidden=\"true\" /> : null}\n </span>\n );\n});\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,SAAS,WAAyC,SAAS,OACtE,EAAE,MAAM,KAAK,MAAM,OAAO,MAAM,QAAQ,aAAa,OAAO,WAAW,GAAG,QAC1E,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,CAAC,WAAW,gBAAgB,SAA6B,KAAA,CAAS;CACxE,MAAM,YAAY,QAAQ,KAAA,KAAa,QAAQ;CAC/C,MAAM,iBAAiB,SAAS,GAAG,KAAK,IAAI,EAAE,OAAO,SAAS,QAAQ,KAAK;CAE3E,OACE,qBAAC,QAAD;EACO;EACL,MAAM,aAAa,KAAA,IAAY;EAC/B,cAAY,aAAa,KAAA,IAAY;EACrC,eAAa,cAAc,KAAA;EAC3B,aAAW;EACX,iBAAe,eAAe,IAAI;EAClC,WAAW,GAAGA,sBAAO,QAAQ,SAAS;EACtC,GAAI;EARN,UAAA,CAUG,YACC,oBAAC,OAAD;GAAU;GAAK,KAAI;GAAG,WAAWA,sBAAO;GAAO,eAAe,aAAa,GAAG;EAAI,CAAA,IAChF,OACF,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAM,eAAY;GACvC,UAAA;EACG,CAAA,IAEN,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAU,eAAY;GAC3C,UAAA,SAAS,IAAI;EACV,CAAA,GAEP,SAAS,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAQ,eAAa;GAAQ,eAAY;EAAQ,CAAA,IAAI,IACnF;;AAEV,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"BlockTable.d.ts","sourceRoot":"","sources":["../../../../src/components/display/BlockTable/BlockTable.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,oBAAoB,CAAC;AA+I1E;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAkC,CAAC,CAAC,EACzD,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,gBAAgB,CAAC,KACxD,YAAY,CAAC"}
1
+ {"version":3,"file":"BlockTable.d.ts","sourceRoot":"","sources":["../../../../src/components/display/BlockTable/BlockTable.tsx"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,oBAAoB,CAAC;AAiJ1E;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAkC,CAAC,CAAC,EACzD,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,gBAAgB,CAAC,KACxD,YAAY,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import { useControllableState } from "../../../hooks/useControllableState.js";
3
4
  import BlockTable_module_default from "./BlockTable.module.js";
4
5
  import { nextSort, readField, sortRows } from "./BlockTable.utils.js";
@@ -10,7 +11,8 @@ var ARIA_SORT = {
10
11
  asc: "ascending",
11
12
  desc: "descending"
12
13
  };
13
- function BlockTableInner({ columns, rows, getRowKey = (_row, index) => index, caption, hideCaption = false, sort, defaultSort = null, onSortChange, manualSort = false, striped = false, size = "md", stickyHeader = false, emptyState = "No data", wrapperClassName, className, ...rest }, ref) {
14
+ function BlockTableInner({ columns, rows, getRowKey = (_row, index) => index, caption, hideCaption = false, sort, defaultSort = null, onSortChange, manualSort = false, striped = false, size = "md", stickyHeader = false, emptyState, wrapperClassName, className, ...rest }, ref) {
15
+ const m = useBlockUIMessages();
14
16
  const captionId = useId();
15
17
  const [activeSort, setSort] = useControllableState({
16
18
  value: sort,
@@ -63,7 +65,7 @@ function BlockTableInner({ columns, rows, getRowKey = (_row, index) => index, ca
63
65
  /* @__PURE__ */ jsx("tbody", { children: visibleRows.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
64
66
  colSpan: columns.length,
65
67
  className: BlockTable_module_default.empty,
66
- children: emptyState
68
+ children: emptyState ?? m.blockTable.empty
67
69
  }) }) : visibleRows.map((row, index) => /* @__PURE__ */ jsx("tr", {
68
70
  className: BlockTable_module_default.row,
69
71
  children: columns.map((column) => {
@@ -1 +1 @@
1
- {"version":3,"file":"BlockTable.js","names":["styles"],"sources":["../../../../src/components/display/BlockTable/BlockTable.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronUpIcon } from \"@malilion/block-ui-icons\";\nimport {\n forwardRef,\n useId,\n type CSSProperties,\n type ForwardedRef,\n type ReactElement,\n type RefAttributes,\n} from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./BlockTable.module.css\";\nimport type { BlockTableProps, BlockTableSort } from \"./BlockTable.types\";\nimport { nextSort, readField, sortRows } from \"./BlockTable.utils\";\n\nconst ARIA_SORT = { asc: \"ascending\", desc: \"descending\" } as const;\n\nfunction BlockTableInner<T>(\n {\n columns,\n rows,\n getRowKey = (_row, index) => index,\n caption,\n hideCaption = false,\n sort,\n defaultSort = null,\n onSortChange,\n manualSort = false,\n striped = false,\n size = \"md\",\n stickyHeader = false,\n emptyState = \"No data\",\n wrapperClassName,\n className,\n ...rest\n }: BlockTableProps<T>,\n ref: ForwardedRef<HTMLTableElement>,\n) {\n const captionId = useId();\n const [activeSort, setSort] = useControllableState<BlockTableSort | null>({\n value: sort,\n defaultValue: defaultSort,\n onChange: onSortChange,\n });\n const visibleRows = manualSort ? rows : sortRows(rows, columns, activeSort);\n const hasWidths = columns.some((column) => column.width);\n\n return (\n <div\n role=\"region\"\n aria-labelledby={captionId}\n // The wrapper scrolls horizontally on narrow screens, so keyboard users must be able to focus it.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n className={cx(styles.wrapper, stickyHeader && styles.sticky, wrapperClassName)}\n >\n <table\n ref={ref}\n data-size={size}\n data-striped={striped || undefined}\n className={cx(styles.table, className)}\n {...rest}\n >\n <caption\n id={captionId}\n className={cx(styles.caption, hideCaption && \"block-visually-hidden\")}\n >\n {caption}\n </caption>\n {hasWidths ? (\n <colgroup>\n {columns.map((column) => (\n <col\n key={column.key}\n className={column.width ? styles.col : undefined}\n style={\n column.width\n ? ({ \"--block-table-col-width\": column.width } as CSSProperties)\n : undefined\n }\n />\n ))}\n </colgroup>\n ) : null}\n <thead>\n <tr>\n {columns.map((column) => {\n const direction = activeSort?.key === column.key ? activeSort.direction : undefined;\n return (\n <th\n key={column.key}\n scope=\"col\"\n data-align={column.align ?? \"start\"}\n aria-sort={column.sortable && direction ? ARIA_SORT[direction] : undefined}\n className={styles.headerCell}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n data-direction={direction}\n onClick={() => setSort(nextSort(activeSort, column.key))}\n >\n <span>{column.header}</span>\n <span className={styles.sortIcon} aria-hidden=\"true\">\n {direction === \"desc\" ? (\n <ChevronDownIcon size={16} />\n ) : (\n <ChevronUpIcon size={16} />\n )}\n </span>\n </button>\n ) : (\n column.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {visibleRows.length === 0 ? (\n <tr>\n <td colSpan={columns.length} className={styles.empty}>\n {emptyState}\n </td>\n </tr>\n ) : (\n visibleRows.map((row, index) => (\n <tr key={getRowKey(row, index)} className={styles.row}>\n {columns.map((column) => {\n const content = column.cell\n ? column.cell(row, index)\n : readField(row, column.key);\n const Cell = column.rowHeader ? \"th\" : \"td\";\n return (\n <Cell\n key={column.key}\n scope={column.rowHeader ? \"row\" : undefined}\n data-align={column.align ?? \"start\"}\n className={cx(styles.cell, column.rowHeader && styles.rowHeader)}\n >\n {content}\n </Cell>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\n/**\n * Data table with a block frame, optional sorting (click a header to cycle\n * ascending → descending → unsorted), striping and a horizontal scroll region.\n */\nexport const BlockTable = forwardRef(BlockTableInner) as <T>(\n props: BlockTableProps<T> & RefAttributes<HTMLTableElement>,\n) => ReactElement;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BlockTable.js","names":["styles"],"sources":["../../../../src/components/display/BlockTable/BlockTable.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronUpIcon } from \"@malilion/block-ui-icons\";\nimport {\n forwardRef,\n useId,\n type CSSProperties,\n type ForwardedRef,\n type ReactElement,\n type RefAttributes,\n} from \"react\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./BlockTable.module.css\";\nimport type { BlockTableProps, BlockTableSort } from \"./BlockTable.types\";\nimport { nextSort, readField, sortRows } from \"./BlockTable.utils\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\nconst ARIA_SORT = { asc: \"ascending\", desc: \"descending\" } as const;\n\nfunction BlockTableInner<T>(\n {\n columns,\n rows,\n getRowKey = (_row, index) => index,\n caption,\n hideCaption = false,\n sort,\n defaultSort = null,\n onSortChange,\n manualSort = false,\n striped = false,\n size = \"md\",\n stickyHeader = false,\n emptyState,\n wrapperClassName,\n className,\n ...rest\n }: BlockTableProps<T>,\n ref: ForwardedRef<HTMLTableElement>,\n) {\n const m = useBlockUIMessages();\n const captionId = useId();\n const [activeSort, setSort] = useControllableState<BlockTableSort | null>({\n value: sort,\n defaultValue: defaultSort,\n onChange: onSortChange,\n });\n const visibleRows = manualSort ? rows : sortRows(rows, columns, activeSort);\n const hasWidths = columns.some((column) => column.width);\n\n return (\n <div\n role=\"region\"\n aria-labelledby={captionId}\n // The wrapper scrolls horizontally on narrow screens, so keyboard users must be able to focus it.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n className={cx(styles.wrapper, stickyHeader && styles.sticky, wrapperClassName)}\n >\n <table\n ref={ref}\n data-size={size}\n data-striped={striped || undefined}\n className={cx(styles.table, className)}\n {...rest}\n >\n <caption\n id={captionId}\n className={cx(styles.caption, hideCaption && \"block-visually-hidden\")}\n >\n {caption}\n </caption>\n {hasWidths ? (\n <colgroup>\n {columns.map((column) => (\n <col\n key={column.key}\n className={column.width ? styles.col : undefined}\n style={\n column.width\n ? ({ \"--block-table-col-width\": column.width } as CSSProperties)\n : undefined\n }\n />\n ))}\n </colgroup>\n ) : null}\n <thead>\n <tr>\n {columns.map((column) => {\n const direction = activeSort?.key === column.key ? activeSort.direction : undefined;\n return (\n <th\n key={column.key}\n scope=\"col\"\n data-align={column.align ?? \"start\"}\n aria-sort={column.sortable && direction ? ARIA_SORT[direction] : undefined}\n className={styles.headerCell}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n data-direction={direction}\n onClick={() => setSort(nextSort(activeSort, column.key))}\n >\n <span>{column.header}</span>\n <span className={styles.sortIcon} aria-hidden=\"true\">\n {direction === \"desc\" ? (\n <ChevronDownIcon size={16} />\n ) : (\n <ChevronUpIcon size={16} />\n )}\n </span>\n </button>\n ) : (\n column.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {visibleRows.length === 0 ? (\n <tr>\n <td colSpan={columns.length} className={styles.empty}>\n {emptyState ?? m.blockTable.empty}\n </td>\n </tr>\n ) : (\n visibleRows.map((row, index) => (\n <tr key={getRowKey(row, index)} className={styles.row}>\n {columns.map((column) => {\n const content = column.cell\n ? column.cell(row, index)\n : readField(row, column.key);\n const Cell = column.rowHeader ? \"th\" : \"td\";\n return (\n <Cell\n key={column.key}\n scope={column.rowHeader ? \"row\" : undefined}\n data-align={column.align ?? \"start\"}\n className={cx(styles.cell, column.rowHeader && styles.rowHeader)}\n >\n {content}\n </Cell>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n\n/**\n * Data table with a block frame, optional sorting (click a header to cycle\n * ascending → descending → unsorted), striping and a horizontal scroll region.\n */\nexport const BlockTable = forwardRef(BlockTableInner) as <T>(\n props: BlockTableProps<T> & RefAttributes<HTMLTableElement>,\n) => ReactElement;\n"],"mappings":"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"}
@@ -41,7 +41,7 @@ export interface BlockTableProps<T> extends Omit<TableHTMLAttributes<HTMLTableEl
41
41
  size?: "sm" | "md";
42
42
  /** Keep the header visible while the page scrolls. */
43
43
  stickyHeader?: boolean;
44
- /** Shown in place of rows when `rows` is empty. @default "No data" */
44
+ /** Shown in place of rows when `rows` is empty. @default messages.blockTable.empty ("No data") */
45
45
  emptyState?: ReactNode;
46
46
  /** Class for the scroll container around the table. */
47
47
  wrapperClassName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"BlockTable.types.d.ts","sourceRoot":"","sources":["../../../../src/components/display/BlockTable/BlockTable.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAEjE,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,CAAC;IAClB,mDAAmD;IACnD,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC5C,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3D,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,IAAI,CAC9C,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,UAAU,CACX;IACC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,sDAAsD;IACtD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC;IAC3C,+DAA+D;IAC/D,OAAO,EAAE,SAAS,CAAC;IACnB,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oBAAoB;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
1
+ {"version":3,"file":"BlockTable.types.d.ts","sourceRoot":"","sources":["../../../../src/components/display/BlockTable/BlockTable.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAEjE,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,CAAC;IAClB,mDAAmD;IACnD,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC5C,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3D,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,IAAI,CAC9C,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,UAAU,CACX;IACC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,sDAAsD;IACtD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC;IAC3C,+DAA+D;IAC/D,OAAO,EAAE,SAAS,CAAC;IACnB,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oBAAoB;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kGAAkG;IAClG,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"SkillTree.d.ts","sourceRoot":"","sources":["../../../../src/components/display/SkillTree/SkillTree.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxD;;;;GAIG;AACH,eAAO,MAAM,SAAS,2GAgIpB,CAAC"}
1
+ {"version":3,"file":"SkillTree.d.ts","sourceRoot":"","sources":["../../../../src/components/display/SkillTree/SkillTree.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD;;;;GAIG;AACH,eAAO,MAAM,SAAS,2GAqIpB,CAAC"}
@@ -1,21 +1,18 @@
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 SkillTree_module_default from "./SkillTree.module.js";
4
5
  import { gridSize, skillState } from "./SkillTree.utils.js";
5
6
  import { forwardRef, useId, useState } from "react";
6
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
8
  //#region src/components/display/SkillTree/SkillTree.tsx
8
- var STATE_TEXT = {
9
- locked: "locked",
10
- available: "available",
11
- unlocked: "unlocked"
12
- };
13
9
  /**
14
10
  * Skill tree: nodes on a grid joined to their prerequisites. Unlocked skills
15
11
  * glow, available ones can be bought with skill points, locked ones show what
16
12
  * they need. Selecting a node shows its details and Unlock button.
17
13
  */
18
- var SkillTree = forwardRef(function SkillTree({ skills, unlocked, points, onUnlock, defaultValue, label = "Skill tree", className, ...rest }, ref) {
14
+ var SkillTree = forwardRef(function SkillTree({ skills, unlocked, points, onUnlock, defaultValue, label, className, ...rest }, ref) {
15
+ const m = useBlockUIMessages();
19
16
  const detailId = useId();
20
17
  const [selectedId, setSelectedId] = useState(defaultValue ?? skills[0]?.id ?? "");
21
18
  const unlockedSet = new Set(unlocked);
@@ -38,13 +35,17 @@ var SkillTree = forwardRef(function SkillTree({ skills, unlocked, points, onUnlo
38
35
  return /* @__PURE__ */ jsxs("div", {
39
36
  ref,
40
37
  role: "group",
41
- "aria-label": label,
38
+ "aria-label": label ?? m.skillTree.label,
42
39
  className: cx(SkillTree_module_default.tree, className),
43
40
  ...rest,
44
41
  children: [
45
42
  points !== void 0 ? /* @__PURE__ */ jsxs("p", {
46
43
  className: SkillTree_module_default.points,
47
- children: ["Skill points: ", /* @__PURE__ */ jsx("strong", { children: points })]
44
+ children: [
45
+ m.skillTree.points,
46
+ " ",
47
+ /* @__PURE__ */ jsx("strong", { children: points })
48
+ ]
48
49
  }) : null,
49
50
  /* @__PURE__ */ jsxs("div", {
50
51
  className: SkillTree_module_default.board,
@@ -67,7 +68,7 @@ var SkillTree = forwardRef(function SkillTree({ skills, unlocked, points, onUnlo
67
68
  }, key))
68
69
  }), /* @__PURE__ */ jsx("ul", {
69
70
  className: SkillTree_module_default.nodes,
70
- "aria-label": "Skills",
71
+ "aria-label": m.skillTree.skills,
71
72
  children: skills.map((skill) => {
72
73
  const state = skillState(skill, unlockedSet);
73
74
  return /* @__PURE__ */ jsx("li", {
@@ -82,7 +83,7 @@ var SkillTree = forwardRef(function SkillTree({ skills, unlocked, points, onUnlo
82
83
  "data-state": state,
83
84
  "aria-pressed": skill.id === selectedId,
84
85
  "aria-controls": detailId,
85
- "aria-label": `${skill.label}, ${STATE_TEXT[state]}`,
86
+ "aria-label": `${skill.label}, ${m.skillTree.states[state]}`,
86
87
  onClick: () => setSelectedId(skill.id),
87
88
  children: /* @__PURE__ */ jsx("span", {
88
89
  className: SkillTree_module_default.icon,
@@ -98,7 +99,7 @@ var SkillTree = forwardRef(function SkillTree({ skills, unlocked, points, onUnlo
98
99
  id: detailId,
99
100
  className: SkillTree_module_default.detail,
100
101
  "aria-live": "polite",
101
- "aria-label": "Skill details",
102
+ "aria-label": m.skillTree.details,
102
103
  children: selected ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
103
104
  /* @__PURE__ */ jsxs("p", {
104
105
  className: SkillTree_module_default.name,
@@ -108,7 +109,7 @@ var SkillTree = forwardRef(function SkillTree({ skills, unlocked, points, onUnlo
108
109
  /* @__PURE__ */ jsx("span", {
109
110
  className: SkillTree_module_default.state,
110
111
  "data-state": selectedState,
111
- children: selectedState
112
+ children: selectedState ? m.skillTree.states[selectedState] : null
112
113
  })
113
114
  ]
114
115
  }),
@@ -116,16 +117,16 @@ var SkillTree = forwardRef(function SkillTree({ skills, unlocked, points, onUnlo
116
117
  className: SkillTree_module_default.description,
117
118
  children: selected.description
118
119
  }) : null,
119
- missing.length > 0 ? /* @__PURE__ */ jsxs("p", {
120
+ missing.length > 0 ? /* @__PURE__ */ jsx("p", {
120
121
  className: SkillTree_module_default.requires,
121
- children: ["Requires: ", missing.join(", ")]
122
+ children: m.skillTree.requires(missing.join(", "))
122
123
  }) : null,
123
124
  selectedState === "available" && onUnlock ? /* @__PURE__ */ jsx(BlockButton, {
124
125
  variant: "emerald",
125
126
  size: "sm",
126
127
  disabled: !affordable,
127
128
  onClick: () => onUnlock(selected.id),
128
- children: affordable ? `Unlock (${selectedCost} ${selectedCost === 1 ? "point" : "points"})` : `Needs ${selectedCost} ${selectedCost === 1 ? "point" : "points"}`
129
+ children: affordable ? m.skillTree.unlock(selectedCost) : m.skillTree.needs(selectedCost)
129
130
  }) : null
130
131
  ] }) : null
131
132
  })
@@ -1 +1 @@
1
- {"version":3,"file":"SkillTree.js","names":["styles","_Fragment"],"sources":["../../../../src/components/display/SkillTree/SkillTree.tsx"],"sourcesContent":["import { forwardRef, useId, useState, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport styles from \"./SkillTree.module.css\";\nimport type { SkillTreeProps } from \"./SkillTree.types\";\nimport { gridSize, skillState } from \"./SkillTree.utils\";\n\nconst STATE_TEXT = { locked: \"locked\", available: \"available\", unlocked: \"unlocked\" } as const;\n\n/**\n * Skill tree: nodes on a grid joined to their prerequisites. Unlocked skills\n * glow, available ones can be bought with skill points, locked ones show what\n * they need. Selecting a node shows its details and Unlock button.\n */\nexport const SkillTree = forwardRef<HTMLDivElement, SkillTreeProps>(function SkillTree(\n { skills, unlocked, points, onUnlock, defaultValue, label = \"Skill tree\", className, ...rest },\n ref,\n) {\n const detailId = useId();\n const [selectedId, setSelectedId] = useState(defaultValue ?? skills[0]?.id ?? \"\");\n const unlockedSet = new Set(unlocked);\n const byId = new Map(skills.map((skill) => [skill.id, skill]));\n const { rows, columns } = gridSize(skills);\n const selected = byId.get(selectedId);\n const selectedState = selected ? skillState(selected, unlockedSet) : undefined;\n const selectedCost = selected?.cost ?? 1;\n const affordable = points === undefined || points >= selectedCost;\n const missing =\n selected && selectedState === \"locked\"\n ? (selected.requires ?? [])\n .filter((id) => !unlockedSet.has(id))\n .map((id) => byId.get(id)?.label ?? id)\n : [];\n\n // Connector centres in grid units (0.5 = middle of the first cell).\n const edges = skills.flatMap((skill) =>\n (skill.requires ?? []).flatMap((id) => {\n const from = byId.get(id);\n return from\n ? [{ key: `${id}-${skill.id}`, from, to: skill, lit: unlockedSet.has(skill.id) }]\n : [];\n }),\n );\n\n return (\n <div ref={ref} role=\"group\" aria-label={label} className={cx(styles.tree, className)} {...rest}>\n {points !== undefined ? (\n <p className={styles.points}>\n Skill points: <strong>{points}</strong>\n </p>\n ) : null}\n <div\n className={styles.board}\n style={{ \"--block-skill-rows\": rows, \"--block-skill-columns\": columns } as CSSProperties}\n >\n <svg\n className={styles.lines}\n viewBox={`0 0 ${columns} ${rows}`}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n {edges.map(({ key, from, to, lit }) => (\n <line\n key={key}\n x1={from.column - 0.5}\n y1={from.row - 0.5}\n x2={to.column - 0.5}\n y2={to.row - 0.5}\n data-lit={lit || undefined}\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n </svg>\n <ul className={styles.nodes} aria-label=\"Skills\">\n {skills.map((skill) => {\n const state = skillState(skill, unlockedSet);\n return (\n <li\n key={skill.id}\n className={styles.cell}\n style={\n {\n \"--block-skill-row\": skill.row,\n \"--block-skill-col\": skill.column,\n } as CSSProperties\n }\n >\n <button\n type=\"button\"\n className={styles.node}\n data-state={state}\n aria-pressed={skill.id === selectedId}\n aria-controls={detailId}\n aria-label={`${skill.label}, ${STATE_TEXT[state]}`}\n onClick={() => setSelectedId(skill.id)}\n >\n <span className={styles.icon} aria-hidden=\"true\">\n {skill.icon}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n <section\n id={detailId}\n className={styles.detail}\n aria-live=\"polite\"\n aria-label=\"Skill details\"\n >\n {selected ? (\n <>\n <p className={styles.name}>\n {selected.label}{\" \"}\n <span className={styles.state} data-state={selectedState}>\n {selectedState}\n </span>\n </p>\n {selected.description ? (\n <p className={styles.description}>{selected.description}</p>\n ) : null}\n {missing.length > 0 ? (\n <p className={styles.requires}>Requires: {missing.join(\", \")}</p>\n ) : null}\n {selectedState === \"available\" && onUnlock ? (\n <BlockButton\n variant=\"emerald\"\n size=\"sm\"\n disabled={!affordable}\n onClick={() => onUnlock(selected.id)}\n >\n {affordable\n ? `Unlock (${selectedCost} ${selectedCost === 1 ? \"point\" : \"points\"})`\n : `Needs ${selectedCost} ${selectedCost === 1 ? \"point\" : \"points\"}`}\n </BlockButton>\n ) : null}\n </>\n ) : null}\n </section>\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"SkillTree.js","names":["styles","_Fragment"],"sources":["../../../../src/components/display/SkillTree/SkillTree.tsx"],"sourcesContent":["import { forwardRef, useId, useState, type CSSProperties } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport { BlockButton } from \"../../actions/BlockButton/BlockButton\";\nimport styles from \"./SkillTree.module.css\";\nimport type { SkillTreeProps } from \"./SkillTree.types\";\nimport { gridSize, skillState } from \"./SkillTree.utils\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\n/**\n * Skill tree: nodes on a grid joined to their prerequisites. Unlocked skills\n * glow, available ones can be bought with skill points, locked ones show what\n * they need. Selecting a node shows its details and Unlock button.\n */\nexport const SkillTree = forwardRef<HTMLDivElement, SkillTreeProps>(function SkillTree(\n { skills, unlocked, points, onUnlock, defaultValue, label, className, ...rest },\n ref,\n) {\n const m = useBlockUIMessages();\n const detailId = useId();\n const [selectedId, setSelectedId] = useState(defaultValue ?? skills[0]?.id ?? \"\");\n const unlockedSet = new Set(unlocked);\n const byId = new Map(skills.map((skill) => [skill.id, skill]));\n const { rows, columns } = gridSize(skills);\n const selected = byId.get(selectedId);\n const selectedState = selected ? skillState(selected, unlockedSet) : undefined;\n const selectedCost = selected?.cost ?? 1;\n const affordable = points === undefined || points >= selectedCost;\n const missing =\n selected && selectedState === \"locked\"\n ? (selected.requires ?? [])\n .filter((id) => !unlockedSet.has(id))\n .map((id) => byId.get(id)?.label ?? id)\n : [];\n\n // Connector centres in grid units (0.5 = middle of the first cell).\n const edges = skills.flatMap((skill) =>\n (skill.requires ?? []).flatMap((id) => {\n const from = byId.get(id);\n return from\n ? [{ key: `${id}-${skill.id}`, from, to: skill, lit: unlockedSet.has(skill.id) }]\n : [];\n }),\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={label ?? m.skillTree.label}\n className={cx(styles.tree, className)}\n {...rest}\n >\n {points !== undefined ? (\n <p className={styles.points}>\n {m.skillTree.points} <strong>{points}</strong>\n </p>\n ) : null}\n <div\n className={styles.board}\n style={{ \"--block-skill-rows\": rows, \"--block-skill-columns\": columns } as CSSProperties}\n >\n <svg\n className={styles.lines}\n viewBox={`0 0 ${columns} ${rows}`}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n {edges.map(({ key, from, to, lit }) => (\n <line\n key={key}\n x1={from.column - 0.5}\n y1={from.row - 0.5}\n x2={to.column - 0.5}\n y2={to.row - 0.5}\n data-lit={lit || undefined}\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n </svg>\n <ul className={styles.nodes} aria-label={m.skillTree.skills}>\n {skills.map((skill) => {\n const state = skillState(skill, unlockedSet);\n return (\n <li\n key={skill.id}\n className={styles.cell}\n style={\n {\n \"--block-skill-row\": skill.row,\n \"--block-skill-col\": skill.column,\n } as CSSProperties\n }\n >\n <button\n type=\"button\"\n className={styles.node}\n data-state={state}\n aria-pressed={skill.id === selectedId}\n aria-controls={detailId}\n aria-label={`${skill.label}, ${m.skillTree.states[state]}`}\n onClick={() => setSelectedId(skill.id)}\n >\n <span className={styles.icon} aria-hidden=\"true\">\n {skill.icon}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n <section\n id={detailId}\n className={styles.detail}\n aria-live=\"polite\"\n aria-label={m.skillTree.details}\n >\n {selected ? (\n <>\n <p className={styles.name}>\n {selected.label}{\" \"}\n <span className={styles.state} data-state={selectedState}>\n {selectedState ? m.skillTree.states[selectedState] : null}\n </span>\n </p>\n {selected.description ? (\n <p className={styles.description}>{selected.description}</p>\n ) : null}\n {missing.length > 0 ? (\n <p className={styles.requires}>{m.skillTree.requires(missing.join(\", \"))}</p>\n ) : null}\n {selectedState === \"available\" && onUnlock ? (\n <BlockButton\n variant=\"emerald\"\n size=\"sm\"\n disabled={!affordable}\n onClick={() => onUnlock(selected.id)}\n >\n {affordable ? m.skillTree.unlock(selectedCost) : m.skillTree.needs(selectedCost)}\n </BlockButton>\n ) : null}\n </>\n ) : null}\n </section>\n </div>\n );\n});\n"],"mappings":"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"}
@@ -23,7 +23,7 @@ export interface SkillTreeProps extends Omit<HTMLAttributes<HTMLDivElement>, "de
23
23
  onUnlock?: (id: string) => void;
24
24
  /** Initially selected skill id. */
25
25
  defaultValue?: string;
26
- /** Accessible name. @default "Skill tree" */
26
+ /** Accessible name. @default messages.skillTree.label ("Skill tree") */
27
27
  label?: string;
28
28
  }
29
29
  //# sourceMappingURL=SkillTree.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SkillTree.types.d.ts","sourceRoot":"","sources":["../../../../src/components/display/SkillTree/SkillTree.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7D,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAC1F,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"SkillTree.types.d.ts","sourceRoot":"","sources":["../../../../src/components/display/SkillTree/SkillTree.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7D,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAC1F,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BlockAlert.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Alert/BlockAlert.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUxE;;;GAGG;AACH,eAAO,MAAM,UAAU,4GAgDrB,CAAC"}
1
+ {"version":3,"file":"BlockAlert.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Alert/BlockAlert.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAWxE;;;GAGG;AACH,eAAO,MAAM,UAAU,4GAsDrB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { cx } from "../../../utils/cx.js";
2
+ import { useBlockUIMessages } from "../../../provider/context.js";
2
3
  import BlockAlert_module_default from "./BlockAlert.module.js";
3
4
  import { alertMaterial } from "./BlockAlert.utils.js";
4
5
  import { forwardRef, useId } from "react";
@@ -15,7 +16,8 @@ var defaultIcons = {
15
16
  * Inline status message. `warning`/`error` use `role="alert"`; `success`/`info`
16
17
  * use `role="status"` so screen readers announce them politely.
17
18
  */
18
- var BlockAlert = forwardRef(function BlockAlert({ variant = "info", title, children, icon, onClose, closeLabel = "Dismiss", action, className, role, ...rest }, ref) {
19
+ var BlockAlert = forwardRef(function BlockAlert({ variant = "info", title, children, icon, onClose, closeLabel, action, className, role, ...rest }, ref) {
20
+ const m = useBlockUIMessages();
19
21
  const titleId = useId();
20
22
  return /* @__PURE__ */ jsxs("div", {
21
23
  ref,
@@ -49,7 +51,7 @@ var BlockAlert = forwardRef(function BlockAlert({ variant = "info", title, child
49
51
  onClose ? /* @__PURE__ */ jsx("button", {
50
52
  type: "button",
51
53
  className: BlockAlert_module_default.close,
52
- "aria-label": closeLabel,
54
+ "aria-label": closeLabel ?? m.common.dismiss,
53
55
  onClick: onClose,
54
56
  children: /* @__PURE__ */ jsx(CloseIcon, { size: 16 })
55
57
  }) : null
@@ -1 +1 @@
1
- {"version":3,"file":"BlockAlert.js","names":["styles"],"sources":["../../../../src/components/feedback/Alert/BlockAlert.tsx"],"sourcesContent":["import { CheckIcon, CloseIcon, ErrorIcon, InfoIcon, WarningIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId, type ReactNode } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./BlockAlert.module.css\";\nimport type { AlertVariant, BlockAlertProps } from \"./BlockAlert.types\";\nimport { alertMaterial } from \"./BlockAlert.utils\";\n\nconst defaultIcons: Record<AlertVariant, ReactNode> = {\n success: <CheckIcon size={20} />,\n info: <InfoIcon size={20} />,\n warning: <WarningIcon size={20} />,\n error: <ErrorIcon size={20} />,\n};\n\n/**\n * Inline status message. `warning`/`error` use `role=\"alert\"`; `success`/`info`\n * use `role=\"status\"` so screen readers announce them politely.\n */\nexport const BlockAlert = forwardRef<HTMLDivElement, BlockAlertProps>(function BlockAlert(\n {\n variant = \"info\",\n title,\n children,\n icon,\n onClose,\n closeLabel = \"Dismiss\",\n action,\n className,\n role,\n ...rest\n },\n ref,\n) {\n const titleId = useId();\n const assertive = variant === \"warning\" || variant === \"error\";\n return (\n <div\n ref={ref}\n role={role ?? (assertive ? \"alert\" : \"status\")}\n aria-labelledby={title ? titleId : undefined}\n data-variant={variant}\n data-material={alertMaterial[variant]}\n className={cx(styles.alert, className)}\n {...rest}\n >\n {icon !== false ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon ?? defaultIcons[variant]}\n </span>\n ) : null}\n <div className={styles.body}>\n {title ? (\n <p id={titleId} className={styles.title}>\n {title}\n </p>\n ) : null}\n {children ? <div className={styles.description}>{children}</div> : null}\n </div>\n {action ? <div className={styles.action}>{action}</div> : null}\n {onClose ? (\n <button type=\"button\" className={styles.close} aria-label={closeLabel} onClick={onClose}>\n <CloseIcon size={16} />\n </button>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;AAOA,IAAM,eAAgD;CACpD,SAAS,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;CAC/B,MAAM,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;CAC3B,SAAS,oBAAC,aAAD,EAAa,MAAM,GAAK,CAAA;CACjC,OAAO,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;AAC/B;;;;;AAMA,IAAa,aAAa,WAA4C,SAAS,WAC7E,EACE,UAAU,QACV,OACA,UACA,MACA,SACA,aAAa,WACb,QACA,WACA,MACA,GAAG,QAEL,KACA;CACA,MAAM,UAAU,MAAM;CAEtB,OACE,qBAAC,OAAD;EACO;EACL,MAAM,SAJQ,YAAY,aAAa,YAAY,UAIxB,UAAU;EACrC,mBAAiB,QAAQ,UAAU,KAAA;EACnC,gBAAc;EACd,iBAAe,cAAc;EAC7B,WAAW,GAAGA,0BAAO,OAAO,SAAS;EACrC,GAAI;EAPN,UAAA;GASG,SAAS,QACR,oBAAC,QAAD;IAAM,WAAWA,0BAAO;IAAM,eAAY;IACvC,UAAA,QAAQ,aAAa;GAClB,CAAA,IACJ;GACJ,qBAAC,OAAD;IAAK,WAAWA,0BAAO;IAAvB,UAAA,CACG,QACC,oBAAC,KAAD;KAAG,IAAI;KAAS,WAAWA,0BAAO;KAC/B,UAAA;IACA,CAAA,IACD,MACH,WAAW,oBAAC,OAAD;KAAK,WAAWA,0BAAO;KAAc;IAAc,CAAA,IAAI,IAChE;;GACJ,SAAS,oBAAC,OAAD;IAAK,WAAWA,0BAAO;IAAS,UAAA;GAAY,CAAA,IAAI;GACzD,UACC,oBAAC,UAAD;IAAQ,MAAK;IAAS,WAAWA,0BAAO;IAAO,cAAY;IAAY,SAAS;IAC9E,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;GAChB,CAAA,IACN;EACD;;AAET,CAAC"}
1
+ {"version":3,"file":"BlockAlert.js","names":["styles"],"sources":["../../../../src/components/feedback/Alert/BlockAlert.tsx"],"sourcesContent":["import { CheckIcon, CloseIcon, ErrorIcon, InfoIcon, WarningIcon } from \"@malilion/block-ui-icons\";\nimport { forwardRef, useId, type ReactNode } from \"react\";\nimport { cx } from \"../../../utils/cx\";\nimport styles from \"./BlockAlert.module.css\";\nimport type { AlertVariant, BlockAlertProps } from \"./BlockAlert.types\";\nimport { alertMaterial } from \"./BlockAlert.utils\";\nimport { useBlockUIMessages } from \"../../../provider/context\";\n\nconst defaultIcons: Record<AlertVariant, ReactNode> = {\n success: <CheckIcon size={20} />,\n info: <InfoIcon size={20} />,\n warning: <WarningIcon size={20} />,\n error: <ErrorIcon size={20} />,\n};\n\n/**\n * Inline status message. `warning`/`error` use `role=\"alert\"`; `success`/`info`\n * use `role=\"status\"` so screen readers announce them politely.\n */\nexport const BlockAlert = forwardRef<HTMLDivElement, BlockAlertProps>(function BlockAlert(\n {\n variant = \"info\",\n title,\n children,\n icon,\n onClose,\n closeLabel,\n action,\n className,\n role,\n ...rest\n },\n ref,\n) {\n const m = useBlockUIMessages();\n const titleId = useId();\n const assertive = variant === \"warning\" || variant === \"error\";\n return (\n <div\n ref={ref}\n role={role ?? (assertive ? \"alert\" : \"status\")}\n aria-labelledby={title ? titleId : undefined}\n data-variant={variant}\n data-material={alertMaterial[variant]}\n className={cx(styles.alert, className)}\n {...rest}\n >\n {icon !== false ? (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon ?? defaultIcons[variant]}\n </span>\n ) : null}\n <div className={styles.body}>\n {title ? (\n <p id={titleId} className={styles.title}>\n {title}\n </p>\n ) : null}\n {children ? <div className={styles.description}>{children}</div> : null}\n </div>\n {action ? <div className={styles.action}>{action}</div> : null}\n {onClose ? (\n <button\n type=\"button\"\n className={styles.close}\n aria-label={closeLabel ?? m.common.dismiss}\n onClick={onClose}\n >\n <CloseIcon size={16} />\n </button>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;;;;AAQA,IAAM,eAAgD;CACpD,SAAS,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;CAC/B,MAAM,oBAAC,UAAD,EAAU,MAAM,GAAK,CAAA;CAC3B,SAAS,oBAAC,aAAD,EAAa,MAAM,GAAK,CAAA;CACjC,OAAO,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;AAC/B;;;;;AAMA,IAAa,aAAa,WAA4C,SAAS,WAC7E,EACE,UAAU,QACV,OACA,UACA,MACA,SACA,YACA,QACA,WACA,MACA,GAAG,QAEL,KACA;CACA,MAAM,IAAI,mBAAmB;CAC7B,MAAM,UAAU,MAAM;CAEtB,OACE,qBAAC,OAAD;EACO;EACL,MAAM,SAJQ,YAAY,aAAa,YAAY,UAIxB,UAAU;EACrC,mBAAiB,QAAQ,UAAU,KAAA;EACnC,gBAAc;EACd,iBAAe,cAAc;EAC7B,WAAW,GAAGA,0BAAO,OAAO,SAAS;EACrC,GAAI;EAPN,UAAA;GASG,SAAS,QACR,oBAAC,QAAD;IAAM,WAAWA,0BAAO;IAAM,eAAY;IACvC,UAAA,QAAQ,aAAa;GAClB,CAAA,IACJ;GACJ,qBAAC,OAAD;IAAK,WAAWA,0BAAO;IAAvB,UAAA,CACG,QACC,oBAAC,KAAD;KAAG,IAAI;KAAS,WAAWA,0BAAO;KAC/B,UAAA;IACA,CAAA,IACD,MACH,WAAW,oBAAC,OAAD;KAAK,WAAWA,0BAAO;KAAc;IAAc,CAAA,IAAI,IAChE;;GACJ,SAAS,oBAAC,OAAD;IAAK,WAAWA,0BAAO;IAAS,UAAA;GAAY,CAAA,IAAI;GACzD,UACC,oBAAC,UAAD;IACE,MAAK;IACL,WAAWA,0BAAO;IAClB,cAAY,cAAc,EAAE,OAAO;IACnC,SAAS;IAET,UAAA,oBAAC,WAAD,EAAW,MAAM,GAAK,CAAA;GAChB,CAAA,IACN;EACD;;AAET,CAAC"}
@@ -11,7 +11,7 @@ export interface BlockAlertProps extends Omit<HTMLAttributes<HTMLDivElement>, "t
11
11
  icon?: ReactNode | false;
12
12
  /** Renders a dismiss button when provided. */
13
13
  onClose?: () => void;
14
- /** Accessible label for the dismiss button. @default "Dismiss" */
14
+ /** Accessible label for the dismiss button. @default messages.common.dismiss ("Dismiss") */
15
15
  closeLabel?: string;
16
16
  /** Extra actions (e.g. a button) shown after the text. */
17
17
  action?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"BlockAlert.types.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Alert/BlockAlert.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,eAAO,MAAM,aAAa,kDAAmD,CAAC;AAE9E,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACpF,sBAAsB;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;IACzB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB"}
1
+ {"version":3,"file":"BlockAlert.types.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/Alert/BlockAlert.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,eAAO,MAAM,aAAa,kDAAmD,CAAC;AAE9E,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACpF,sBAAsB;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;IACzB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BlockAlert.types.js","names":[],"sources":["../../../../src/components/feedback/Alert/BlockAlert.types.ts"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\n\nexport const alertVariants = [\"success\", \"info\", \"warning\", \"error\"] as const;\n\nexport type AlertVariant = (typeof alertVariants)[number];\n\nexport interface BlockAlertProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** @default \"info\" */\n variant?: AlertVariant;\n title?: ReactNode;\n /** Description content. */\n children?: ReactNode;\n /** Custom icon, or `false` to hide it. Defaults to the variant icon. */\n icon?: ReactNode | false;\n /** Renders a dismiss button when provided. */\n onClose?: () => void;\n /** Accessible label for the dismiss button. @default \"Dismiss\" */\n closeLabel?: string;\n /** Extra actions (e.g. a button) shown after the text. */\n action?: ReactNode;\n}\n"],"mappings":";AAEA,IAAa,gBAAgB;CAAC;CAAW;CAAQ;CAAW;AAAO"}
1
+ {"version":3,"file":"BlockAlert.types.js","names":[],"sources":["../../../../src/components/feedback/Alert/BlockAlert.types.ts"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\n\nexport const alertVariants = [\"success\", \"info\", \"warning\", \"error\"] as const;\n\nexport type AlertVariant = (typeof alertVariants)[number];\n\nexport interface BlockAlertProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** @default \"info\" */\n variant?: AlertVariant;\n title?: ReactNode;\n /** Description content. */\n children?: ReactNode;\n /** Custom icon, or `false` to hide it. Defaults to the variant icon. */\n icon?: ReactNode | false;\n /** Renders a dismiss button when provided. */\n onClose?: () => void;\n /** Accessible label for the dismiss button. @default messages.common.dismiss (\"Dismiss\") */\n closeLabel?: string;\n /** Extra actions (e.g. a button) shown after the text. */\n action?: ReactNode;\n}\n"],"mappings":";AAEA,IAAa,gBAAgB;CAAC;CAAW;CAAQ;CAAW;AAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/ConfirmDialog/ConfirmDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,WAAW,EACX,WAAuB,EACvB,UAAqB,EACrB,OAAmB,EACnB,SAAS,EACT,QAAQ,EACR,OAAe,EACf,IAAI,EACJ,QAAQ,EACR,SAAS,GACV,EAAE,kBAAkB,+BAuCpB"}
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/ConfirmDialog/ConfirmDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,OAAmB,EACnB,SAAS,EACT,QAAQ,EACR,OAAe,EACf,IAAI,EACJ,QAAQ,EACR,SAAS,GACV,EAAE,kBAAkB,+BAwCpB"}