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