@dreamboard-games/ui-sdk 0.0.43 → 0.0.45
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/ActionButton.d.ts.map +1 -1
- package/dist/components/ActionButton.js +2 -1
- package/dist/components/Card.d.ts +1 -1
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/DiceRoller.d.ts +3 -2
- package/dist/components/DiceRoller.d.ts.map +1 -1
- package/dist/components/DiceRoller.js +4 -13
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.js +94 -2
- package/dist/components/InteractionForm.d.ts +1 -1
- package/dist/components/InteractionForm.d.ts.map +1 -1
- package/dist/components/InteractionForm.js +29 -15
- package/dist/components/PrimaryActionButton.d.ts.map +1 -1
- package/dist/components/PrimaryActionButton.js +7 -6
- package/dist/components/ResourceCounter.d.ts +59 -25
- package/dist/components/ResourceCounter.d.ts.map +1 -1
- package/dist/components/ResourceCounter.js +106 -115
- package/dist/components/Toast.d.ts +13 -6
- package/dist/components/Toast.d.ts.map +1 -1
- package/dist/components/Toast.js +10 -5
- package/dist/components/board/HexGrid.js +6 -6
- package/dist/components/board/target-layer.d.ts +18 -2
- package/dist/components/board/target-layer.d.ts.map +1 -1
- package/dist/components/board/target-layer.js +20 -3
- package/dist/components/index.d.ts +3 -4
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +3 -4
- package/dist/components/surfaces/InboxSurface.d.ts.map +1 -1
- package/dist/components/surfaces/InboxSurface.js +2 -6
- package/dist/components/surfaces/PlayerCardsSurface.js +2 -2
- package/dist/components/surfaces/internal/CardZoneRoutedForm.d.ts +7 -0
- package/dist/components/surfaces/internal/CardZoneRoutedForm.d.ts.map +1 -0
- package/dist/components/surfaces/internal/CardZoneRoutedForm.js +9 -0
- package/dist/components/surfaces/internal/DefaultInteractionButton.d.ts.map +1 -1
- package/dist/components/surfaces/internal/DefaultInteractionButton.js +5 -8
- package/dist/components/surfaces/internal/useCardZoneInteractions.d.ts +2 -2
- package/dist/components/surfaces/internal/useCardZoneInteractions.d.ts.map +1 -1
- package/dist/components/surfaces/internal/useCardZoneInteractions.js +19 -43
- package/dist/context/InteractionDraftContext.d.ts +11 -2
- package/dist/context/InteractionDraftContext.d.ts.map +1 -1
- package/dist/context/InteractionDraftContext.js +41 -4
- package/dist/defaults/components.d.ts +0 -5
- package/dist/defaults/components.d.ts.map +1 -1
- package/dist/defaults/components.js +7 -11
- package/dist/hooks/useBoardInteractions.d.ts +35 -12
- package/dist/hooks/useBoardInteractions.d.ts.map +1 -1
- package/dist/hooks/useBoardInteractions.js +186 -82
- package/dist/hooks/useInteractionHandle.d.ts +1 -1
- package/dist/hooks/useInteractionHandle.d.ts.map +1 -1
- package/dist/hooks/useInteractionHandle.js +12 -27
- package/dist/index.d.ts +11 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -14
- package/dist/primitives/board.d.ts +53 -3
- package/dist/primitives/board.d.ts.map +1 -1
- package/dist/primitives/board.js +65 -41
- package/dist/primitives/dialog-lifecycle.d.ts +17 -0
- package/dist/primitives/dialog-lifecycle.d.ts.map +1 -0
- package/dist/primitives/dialog-lifecycle.js +24 -0
- package/dist/primitives/dice.d.ts +31 -0
- package/dist/primitives/dice.d.ts.map +1 -0
- package/dist/primitives/dice.js +33 -0
- package/dist/primitives/game.d.ts +55 -0
- package/dist/primitives/game.d.ts.map +1 -0
- package/dist/primitives/game.js +101 -0
- package/dist/primitives/index.d.ts +7 -4
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +7 -4
- package/dist/primitives/interaction-form-binding.d.ts +12 -0
- package/dist/primitives/interaction-form-binding.d.ts.map +1 -0
- package/dist/primitives/interaction-form-binding.js +14 -0
- package/dist/primitives/interaction-submit.d.ts +23 -0
- package/dist/primitives/interaction-submit.d.ts.map +1 -0
- package/dist/primitives/interaction-submit.js +41 -0
- package/dist/primitives/interaction.d.ts +76 -6
- package/dist/primitives/interaction.d.ts.map +1 -1
- package/dist/primitives/interaction.js +210 -26
- package/dist/primitives/player-roster.d.ts +2 -1
- package/dist/primitives/player-roster.d.ts.map +1 -1
- package/dist/primitives/prompt.d.ts +36 -11
- package/dist/primitives/prompt.d.ts.map +1 -1
- package/dist/primitives/prompt.js +29 -17
- package/dist/primitives/ui.d.ts +9 -0
- package/dist/primitives/ui.d.ts.map +1 -0
- package/dist/primitives/ui.js +7 -0
- package/dist/primitives/zone.d.ts +111 -5
- package/dist/primitives/zone.d.ts.map +1 -1
- package/dist/primitives/zone.js +349 -9
- package/dist/reducer.d.ts +2 -14
- package/dist/reducer.d.ts.map +1 -1
- package/dist/reducer.js +1 -14
- package/dist/runtime/createPluginRuntimeAPI.js +1 -1
- package/dist/types/hex-color.d.ts +7 -0
- package/dist/types/hex-color.d.ts.map +1 -0
- package/dist/types/hex-color.js +13 -0
- package/dist/types/player-state.d.ts +28 -14
- package/dist/types/player-state.d.ts.map +1 -1
- package/dist/types/plugin-state.d.ts +9 -3
- package/dist/types/plugin-state.d.ts.map +1 -1
- package/dist/ui-contract.d.ts +119 -14
- package/dist/ui-contract.d.ts.map +1 -1
- package/dist/ui-contract.js +4 -3
- package/dist/ui-sdk.d.ts +1637 -1245
- package/dist/utils/interaction-inputs.d.ts +8 -5
- package/dist/utils/interaction-inputs.d.ts.map +1 -1
- package/dist/utils/interaction-inputs.js +82 -14
- package/dist/utils/interaction-router.d.ts +31 -0
- package/dist/utils/interaction-router.d.ts.map +1 -0
- package/dist/utils/interaction-router.js +114 -0
- package/package.json +1 -1
- package/src/components/ActionButton.tsx +2 -1
- package/src/components/Card.tsx +1 -1
- package/src/components/DiceRoller.tsx +13 -22
- package/src/components/ErrorBoundary.test.tsx +19 -0
- package/src/components/ErrorBoundary.tsx +113 -24
- package/src/components/InteractionForm.test.tsx +24 -0
- package/src/components/InteractionForm.tsx +48 -23
- package/src/components/PrimaryActionButton.tsx +19 -5
- package/src/components/ResourceCounter.test.tsx +13 -13
- package/src/components/ResourceCounter.tsx +238 -244
- package/src/components/Toast.tsx +23 -10
- package/src/components/__fixtures__/ResourceCounter.fixture.tsx +70 -169
- package/src/components/board/HexGrid.tsx +6 -6
- package/src/components/board/target-layer.ts +44 -5
- package/src/components/index.ts +17 -10
- package/src/components/surfaces/InboxSurface.tsx +7 -5
- package/src/components/surfaces/PlayerCardsSurface.tsx +6 -6
- package/src/components/surfaces/internal/CardZoneRoutedForm.tsx +35 -0
- package/src/components/surfaces/internal/DefaultInteractionButton.tsx +17 -7
- package/src/components/surfaces/internal/useCardZoneInteractions.ts +25 -67
- package/src/context/InteractionDraftContext.tsx +51 -5
- package/src/defaults/components.tsx +12 -50
- package/src/defaults/defaults.test.tsx +1 -50
- package/src/hooks/useBoardInteractions.test.tsx +240 -17
- package/src/hooks/useBoardInteractions.ts +330 -105
- package/src/hooks/useInteractionHandle.ts +23 -28
- package/src/index.test.ts +60 -40
- package/src/index.ts +30 -36
- package/src/primitives/board.test.tsx +73 -0
- package/src/primitives/board.tsx +191 -40
- package/src/primitives/dialog-lifecycle.ts +58 -0
- package/src/primitives/dice.test.tsx +47 -0
- package/src/primitives/dice.tsx +79 -0
- package/src/primitives/game.test.tsx +98 -0
- package/src/primitives/game.tsx +213 -0
- package/src/primitives/index.ts +84 -0
- package/src/primitives/interaction-form-binding.tsx +56 -0
- package/src/primitives/interaction-submit.ts +90 -0
- package/src/primitives/interaction.test.tsx +396 -0
- package/src/primitives/interaction.tsx +451 -31
- package/src/primitives/player-roster.tsx +2 -1
- package/src/primitives/prompt.test.tsx +94 -3
- package/src/primitives/prompt.tsx +87 -48
- package/src/primitives/ui.test.tsx +131 -0
- package/src/primitives/ui.tsx +13 -0
- package/src/primitives/zone.test.tsx +305 -0
- package/src/primitives/zone.tsx +660 -12
- package/src/reducer.ts +7 -20
- package/src/runtime/createPluginRuntimeAPI.ts +1 -1
- package/src/types/hex-color.ts +20 -0
- package/src/types/player-state.ts +36 -18
- package/src/types/plugin-state.ts +10 -3
- package/src/ui-contract.ts +253 -21
- package/src/utils/interaction-inputs.test.ts +400 -0
- package/src/utils/interaction-inputs.ts +113 -11
- package/src/utils/interaction-router.ts +200 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../src/components/ActionButton.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../src/components/ActionButton.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAK1E,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAChE,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE,iBAAiB,2CAenB"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { submitInteraction } from "../primitives/interaction-submit.js";
|
|
2
3
|
import { interactionLabel } from "../utils/interaction-labels.js";
|
|
3
4
|
import { ThemedButton } from "./ThemedButton.js";
|
|
4
5
|
export function ActionButton({ handle, children, disabled, title, ...rest }) {
|
|
5
6
|
return (_jsx(ThemedButton, { type: "button", variant: "secondary", disabled: disabled || !handle.available, title: title ?? formatUnavailableReason(handle.unavailableReason), onClick: () => {
|
|
6
|
-
void handle
|
|
7
|
+
void submitInteraction(handle);
|
|
7
8
|
}, ...rest, children: children ?? interactionLabel(handle.descriptor) }));
|
|
8
9
|
}
|
|
9
10
|
function formatUnavailableReason(reason) {
|
|
@@ -15,7 +15,7 @@ export interface CardProps<CardData extends ViewCard = ViewCard> extends Omit<HT
|
|
|
15
15
|
size?: "sm" | "md" | "lg";
|
|
16
16
|
faceDown?: boolean;
|
|
17
17
|
renderContent?: (card: CardData) => React.ReactNode;
|
|
18
|
-
onCardClick?: (cardId:
|
|
18
|
+
onCardClick?: (cardId: CardData["id"]) => void;
|
|
19
19
|
"aria-label"?: string;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAU,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,MAAM,WAAW,SAAS,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,CAC7D,SAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACnD,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC;IACpD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAU,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,MAAM,WAAW,SAAS,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,CAC7D,SAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACnD,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC;IACpD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyLD;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EAAE,EACzD,IAAI,EACJ,QAAgB,EAChB,QAAgB,EAChB,IAAW,EACX,QAAgB,EAChB,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,GAAG,WAAW,EACf,EAAE,SAAS,CAAC,QAAQ,CAAC,2CA2JrB;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
2
|
import type { InteractionHandle, InteractionParamsShape } from "../hooks/useInteractionHandle.js";
|
|
3
|
+
import { type DiceValue } from "../primitives/index.js";
|
|
3
4
|
export interface DiceRollerRenderProps {
|
|
4
|
-
values:
|
|
5
|
+
values: ReadonlyArray<number | undefined> | undefined;
|
|
5
6
|
/** Undefined if any die hasn't been rolled */
|
|
6
7
|
sum: number | undefined;
|
|
7
8
|
diceCount: number;
|
|
@@ -18,7 +19,7 @@ export interface DiceRollerRollAction<Params extends InteractionParamsShape = In
|
|
|
18
19
|
revealHoldMs?: number;
|
|
19
20
|
}
|
|
20
21
|
export interface DiceRollerProps<Params extends InteractionParamsShape = InteractionParamsShape> {
|
|
21
|
-
values?:
|
|
22
|
+
values?: readonly DiceValue[] | null;
|
|
22
23
|
/** Used when values not provided */
|
|
23
24
|
diceCount?: number;
|
|
24
25
|
render?: (props: DiceRollerRenderProps) => ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiceRoller.d.ts","sourceRoot":"","sources":["../../src/components/DiceRoller.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"DiceRoller.d.ts","sourceRoot":"","sources":["../../src/components/DiceRoller.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAI5E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACtD,8CAA8C;IAC9C,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB,CACnC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D,2EAA2E;IAC3E,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe,CAC9B,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACrC,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,CAAC;IACrD,0EAA0E;IAC1E,UAAU,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,UAAU,CACxB,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,EACA,MAAM,EACN,SAAa,EACb,MAAM,EACN,UAAU,EACV,SAAS,GACV,EAAE,eAAe,CAAC,MAAM,CAAC,2CA2BzB"}
|
|
@@ -5,25 +5,16 @@ import { useCallback, useEffect, useRef, useState, } from "react";
|
|
|
5
5
|
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "../internal/ui/dialog.js";
|
|
6
6
|
import { surfaceStyle } from "../theme/derive.js";
|
|
7
7
|
import { useTheme, useThemeCssVars } from "../theme/ThemeProvider.js";
|
|
8
|
+
import { normalizeDiceState } from "../primitives/index.js";
|
|
8
9
|
import { interactionLabel } from "../utils/interaction-labels.js";
|
|
9
10
|
import { ThemedButton } from "./ThemedButton.js";
|
|
10
11
|
const DEFAULT_MIN_SPIN_MS = 1200;
|
|
11
12
|
const DEFAULT_REVEAL_HOLD_MS = 1400;
|
|
12
13
|
const FACE_SEQUENCE = [1, 2, 3, 4, 5, 6];
|
|
13
14
|
export function DiceRoller({ values, diceCount = 2, render, rollAction, className, }) {
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
: undefined;
|
|
18
|
-
const displayCount = values?.length ?? diceCount;
|
|
19
|
-
const renderProps = {
|
|
20
|
-
values,
|
|
21
|
-
sum,
|
|
22
|
-
diceCount: displayCount,
|
|
23
|
-
allRolled,
|
|
24
|
-
};
|
|
25
|
-
return (_jsxs("div", { className: clsx("flex flex-col items-center gap-4", className), role: "region", "aria-label": "Dice roller", children: [render ? render(renderProps) : _jsx(DefaultDiceReadout, { ...renderProps }), rollAction ? (_jsx(DiceRollDialog, { action: rollAction, values: values, diceCount: displayCount })) : null, _jsx("div", { className: "sr-only", "aria-live": "polite", children: allRolled && values
|
|
26
|
-
? `Rolled ${values.join(", ")}. Total: ${sum}`
|
|
15
|
+
const renderProps = normalizeDiceState({ values, count: diceCount });
|
|
16
|
+
return (_jsxs("div", { className: clsx("flex flex-col items-center gap-4", className), role: "region", "aria-label": "Dice roller", children: [render ? render(renderProps) : _jsx(DefaultDiceReadout, { ...renderProps }), rollAction ? (_jsx(DiceRollDialog, { action: rollAction, values: renderProps.values, diceCount: renderProps.diceCount })) : null, _jsx("div", { className: "sr-only", "aria-live": "polite", children: renderProps.allRolled && renderProps.values
|
|
17
|
+
? `Rolled ${renderProps.values.join(", ")}. Total: ${renderProps.sum}`
|
|
27
18
|
: "Dice not rolled yet" })] }));
|
|
28
19
|
}
|
|
29
20
|
function DefaultDiceReadout({ values, sum, diceCount, allRolled, }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,SAAS,EAET,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CACxD;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,qBAAa,aAAc,SAAQ,SAAS,CAC1C,kBAAkB,EAClB,kBAAkB,CACnB;gBACa,KAAK,EAAE,kBAAkB;IAKrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB;IAIjE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAM3D,WAAW,QAAO,IAAI,CAEpB;IAEF,MAAM,IAAI,SAAS;CAgBpB"}
|
|
@@ -4,7 +4,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
4
4
|
*
|
|
5
5
|
* Catches React errors and displays a fallback UI
|
|
6
6
|
*/
|
|
7
|
-
import { Component } from "react";
|
|
7
|
+
import { Component, } from "react";
|
|
8
8
|
import { AlertTriangle, RefreshCw } from "lucide-react";
|
|
9
9
|
export class ErrorBoundary extends Component {
|
|
10
10
|
constructor(props) {
|
|
@@ -33,5 +33,97 @@ export class ErrorBoundary extends Component {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
function DefaultErrorFallback({ error, onReset, }) {
|
|
36
|
-
|
|
36
|
+
const styles = {
|
|
37
|
+
shell: {
|
|
38
|
+
alignItems: "center",
|
|
39
|
+
background: "#fdfbf7",
|
|
40
|
+
boxSizing: "border-box",
|
|
41
|
+
color: "#0f172a",
|
|
42
|
+
display: "flex",
|
|
43
|
+
justifyContent: "center",
|
|
44
|
+
minHeight: "100vh",
|
|
45
|
+
padding: "24px",
|
|
46
|
+
},
|
|
47
|
+
panel: {
|
|
48
|
+
background: "#fff",
|
|
49
|
+
border: "2px solid #0f172a",
|
|
50
|
+
borderRadius: "12px",
|
|
51
|
+
boxShadow: "6px 6px 0 #111827",
|
|
52
|
+
boxSizing: "border-box",
|
|
53
|
+
maxWidth: "520px",
|
|
54
|
+
padding: "28px",
|
|
55
|
+
width: "100%",
|
|
56
|
+
},
|
|
57
|
+
iconWrap: {
|
|
58
|
+
alignItems: "center",
|
|
59
|
+
background: "#fee2e2",
|
|
60
|
+
border: "2px solid #991b1b",
|
|
61
|
+
borderRadius: "999px",
|
|
62
|
+
display: "flex",
|
|
63
|
+
height: "56px",
|
|
64
|
+
justifyContent: "center",
|
|
65
|
+
marginBottom: "18px",
|
|
66
|
+
width: "56px",
|
|
67
|
+
},
|
|
68
|
+
eyebrow: {
|
|
69
|
+
color: "#991b1b",
|
|
70
|
+
fontSize: "12px",
|
|
71
|
+
fontWeight: 800,
|
|
72
|
+
letterSpacing: "0.08em",
|
|
73
|
+
margin: "0 0 8px",
|
|
74
|
+
textTransform: "uppercase",
|
|
75
|
+
},
|
|
76
|
+
title: {
|
|
77
|
+
fontSize: "28px",
|
|
78
|
+
fontWeight: 900,
|
|
79
|
+
lineHeight: 1.1,
|
|
80
|
+
margin: "0 0 12px",
|
|
81
|
+
},
|
|
82
|
+
body: {
|
|
83
|
+
color: "#475569",
|
|
84
|
+
fontSize: "15px",
|
|
85
|
+
lineHeight: 1.5,
|
|
86
|
+
margin: "0 0 20px",
|
|
87
|
+
},
|
|
88
|
+
details: {
|
|
89
|
+
marginBottom: "22px",
|
|
90
|
+
},
|
|
91
|
+
summary: {
|
|
92
|
+
color: "#334155",
|
|
93
|
+
cursor: "pointer",
|
|
94
|
+
fontSize: "14px",
|
|
95
|
+
fontWeight: 700,
|
|
96
|
+
marginBottom: "8px",
|
|
97
|
+
},
|
|
98
|
+
pre: {
|
|
99
|
+
background: "#f8fafc",
|
|
100
|
+
border: "1px solid #cbd5e1",
|
|
101
|
+
borderRadius: "8px",
|
|
102
|
+
color: "#334155",
|
|
103
|
+
fontSize: "12px",
|
|
104
|
+
lineHeight: 1.45,
|
|
105
|
+
margin: 0,
|
|
106
|
+
maxHeight: "180px",
|
|
107
|
+
overflow: "auto",
|
|
108
|
+
padding: "12px",
|
|
109
|
+
whiteSpace: "pre-wrap",
|
|
110
|
+
},
|
|
111
|
+
button: {
|
|
112
|
+
alignItems: "center",
|
|
113
|
+
background: "#0f172a",
|
|
114
|
+
border: "2px solid #0f172a",
|
|
115
|
+
borderRadius: "8px",
|
|
116
|
+
boxShadow: "3px 3px 0 #111827",
|
|
117
|
+
color: "#fff",
|
|
118
|
+
cursor: "pointer",
|
|
119
|
+
display: "inline-flex",
|
|
120
|
+
fontSize: "15px",
|
|
121
|
+
fontWeight: 800,
|
|
122
|
+
gap: "8px",
|
|
123
|
+
justifyContent: "center",
|
|
124
|
+
padding: "12px 16px",
|
|
125
|
+
width: "100%",
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
return (_jsx("div", { style: styles.shell, role: "alert", "aria-live": "assertive", children: _jsxs("div", { style: styles.panel, children: [_jsx("div", { style: styles.iconWrap, children: _jsx(AlertTriangle, { size: 28, color: "#991b1b", strokeWidth: 2.5, "aria-hidden": "true" }) }), _jsx("p", { style: styles.eyebrow, children: "Runtime error" }), _jsx("h1", { style: styles.title, children: "Game failed to start" }), _jsx("p", { style: styles.body, children: "The game encountered an error and couldn't continue. You can try reloading to start fresh." }), _jsxs("details", { style: styles.details, children: [_jsx("summary", { style: styles.summary, children: "Technical details" }), _jsxs("pre", { style: styles.pre, children: [error.message, error.stack && (_jsxs(_Fragment, { children: ["\n\n", error.stack] }))] })] }), _jsxs("button", { type: "button", onClick: onReset, style: styles.button, children: [_jsx(RefreshCw, { size: 18, "aria-hidden": "true" }), "Try again"] })] }) }));
|
|
37
129
|
}
|
|
@@ -46,5 +46,5 @@ export interface InteractionFormProps<Params extends InteractionParamsShape = In
|
|
|
46
46
|
export declare function InteractionForm<Params extends InteractionParamsShape = InteractionParamsShape, DefaultedKeys extends keyof Params & string = never>({ descriptor, handle, fields, hiddenFields, renderFields, title, description, submitLabel, cancelLabel, onCancel, onSubmitSuccess, disabled, accordion, defaultOpen, style, }: InteractionFormProps<Params, DefaultedKeys>): import("react/jsx-runtime").JSX.Element;
|
|
47
47
|
export declare function InteractionField<Params extends InteractionParamsShape = InteractionParamsShape, Key extends keyof Params & string = keyof Params & string>({ descriptor, inputKey, handle, errors, missing, disabled, render, }: InteractionFieldProps<Params, Key>): import("react/jsx-runtime").JSX.Element | null;
|
|
48
48
|
export declare function hasDefaultInteractionFormFields(descriptor: Pick<InteractionDescriptor, "inputs">): boolean;
|
|
49
|
-
export declare function defaultFormInputs(descriptor: Pick<InteractionDescriptor, "inputs"
|
|
49
|
+
export declare function defaultFormInputs(descriptor: Pick<InteractionDescriptor, "inputs">, values?: Readonly<Record<string, unknown>>): InteractionInputDescriptor[];
|
|
50
50
|
//# sourceMappingURL=InteractionForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractionForm.d.ts","sourceRoot":"","sources":["../../src/components/InteractionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAElB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAYf,OAAO,KAAK,EAEV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAEV,qBAAqB,EACrB,0BAA0B,EAE3B,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"InteractionForm.d.ts","sourceRoot":"","sources":["../../src/components/InteractionForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, } from "../internal/u
|
|
|
7
7
|
import { surfaceStyle } from "../theme/derive.js";
|
|
8
8
|
import { useTheme, useThemeCssVars } from "../theme/ThemeProvider.js";
|
|
9
9
|
import { interactionLabel } from "../utils/interaction-labels.js";
|
|
10
|
+
import { resolveInputDomain, resolveInteractionInputs, } from "../utils/interaction-inputs.js";
|
|
10
11
|
import { useChromeSuppression } from "./ChromeSuppressionContext.js";
|
|
11
12
|
import { ThemedButton } from "./ThemedButton.js";
|
|
12
13
|
const EMPTY_FIELD_ERRORS = [];
|
|
@@ -22,13 +23,13 @@ export function InteractionForm({ descriptor, handle, fields, hiddenFields, rend
|
|
|
22
23
|
const hidden = useMemo(() => new Set(hiddenFields ?? []), [hiddenFields]);
|
|
23
24
|
const visibleInputs = useMemo(() => {
|
|
24
25
|
const allowed = fields ? new Set(fields) : null;
|
|
25
|
-
return defaultFormInputs(descriptor).filter((input) => {
|
|
26
|
+
return defaultFormInputs(descriptor, handle.values).filter((input) => {
|
|
26
27
|
const key = input.key;
|
|
27
28
|
if (allowed && !allowed.has(key))
|
|
28
29
|
return false;
|
|
29
30
|
return !hidden.has(key);
|
|
30
31
|
});
|
|
31
|
-
}, [descriptor, fields, hidden]);
|
|
32
|
+
}, [descriptor, fields, hidden, handle.values]);
|
|
32
33
|
const currentValidation = validation;
|
|
33
34
|
const fieldErrors = (currentValidation?.fieldErrors ?? {});
|
|
34
35
|
const missing = new Set(currentValidation?.missing ?? []);
|
|
@@ -94,10 +95,10 @@ export function InteractionForm({ descriptor, handle, fields, hiddenFields, rend
|
|
|
94
95
|
}, children: visibleInputs.map((input) => {
|
|
95
96
|
const key = input.key;
|
|
96
97
|
return (_jsx(InteractionField, { descriptor: descriptor, inputKey: key, handle: handle, errors: fieldErrors[key] ?? [], missing: missing.has(key), disabled: isDisabled, render: renderFields?.[key] }, input.key));
|
|
97
|
-
}) })) :
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
}) })) : null;
|
|
99
|
+
if (visibleInputs.length === 0 && !handle.isReady) {
|
|
100
|
+
throw new Error(`InteractionForm '${descriptor.interactionKey}' has required inputs that cannot be rendered by the default form. Provide renderFields, select on a surface, or use a default-renderable input domain.`);
|
|
101
|
+
}
|
|
101
102
|
const formErrorContent = formErrors.length > 0 ? (_jsx("div", { role: "alert", style: {
|
|
102
103
|
display: "flex",
|
|
103
104
|
flexDirection: "column",
|
|
@@ -140,7 +141,7 @@ export function InteractionField({ descriptor, inputKey, handle, errors = EMPTY_
|
|
|
140
141
|
const input = descriptor.inputs.find((candidate) => candidate.key === inputKey);
|
|
141
142
|
if (!input)
|
|
142
143
|
return null;
|
|
143
|
-
const typedInput = input;
|
|
144
|
+
const typedInput = resolveInputDomain(input, handle.values);
|
|
144
145
|
const value = handle.values[inputKey];
|
|
145
146
|
const props = {
|
|
146
147
|
descriptor,
|
|
@@ -160,8 +161,8 @@ export function InteractionField({ descriptor, inputKey, handle, errors = EMPTY_
|
|
|
160
161
|
export function hasDefaultInteractionFormFields(descriptor) {
|
|
161
162
|
return defaultFormInputs(descriptor).length > 0;
|
|
162
163
|
}
|
|
163
|
-
export function defaultFormInputs(descriptor) {
|
|
164
|
-
return descriptor.
|
|
164
|
+
export function defaultFormInputs(descriptor, values = {}) {
|
|
165
|
+
return resolveInteractionInputs(descriptor, values).filter((input) => {
|
|
165
166
|
switch (input.domain.type) {
|
|
166
167
|
case "choice":
|
|
167
168
|
case "choiceList":
|
|
@@ -252,12 +253,24 @@ function ChoiceDescription({ choice }) {
|
|
|
252
253
|
fontSize: theme.typography.fontSize.xs,
|
|
253
254
|
}, children: message }));
|
|
254
255
|
}
|
|
256
|
+
const NULL_CHOICE_SELECT_VALUE = "__dreamboard_null_choice__";
|
|
257
|
+
function choiceRenderKey(choice) {
|
|
258
|
+
return choice.value === null ? NULL_CHOICE_SELECT_VALUE : choice.value;
|
|
259
|
+
}
|
|
260
|
+
function encodeChoiceSelectValue(value) {
|
|
261
|
+
if (value === null)
|
|
262
|
+
return NULL_CHOICE_SELECT_VALUE;
|
|
263
|
+
return typeof value === "string" ? value : undefined;
|
|
264
|
+
}
|
|
265
|
+
function decodeChoiceSelectValue(value) {
|
|
266
|
+
return value === NULL_CHOICE_SELECT_VALUE ? null : value;
|
|
267
|
+
}
|
|
255
268
|
function ChoiceField({ input, value, setValue, errors, missing, disabled, domain, }) {
|
|
256
269
|
const theme = useTheme();
|
|
257
270
|
const themeCssVars = useThemeCssVars();
|
|
258
271
|
const choices = domain.choices ?? [];
|
|
259
272
|
const controlId = useId();
|
|
260
|
-
const selectedChoice = typeof value === "string"
|
|
273
|
+
const selectedChoice = typeof value === "string" || value === null
|
|
261
274
|
? choices.find((choice) => choice.value === value)
|
|
262
275
|
: undefined;
|
|
263
276
|
if (choices.length > 0 && choices.length <= 3) {
|
|
@@ -267,13 +280,13 @@ function ChoiceField({ input, value, setValue, errors, missing, disabled, domain
|
|
|
267
280
|
gap: theme.space[1],
|
|
268
281
|
}, children: choices.map((choice) => {
|
|
269
282
|
const selected = value === choice.value;
|
|
270
|
-
return (_jsx(ThemedButton, { type: "button", variant: selected ? "primary" : "secondary", size: "sm", disabled: disabled || choice.disabled, "aria-pressed": selected, title: choice.disabledReason ?? choice.description, onClick: () => setValue(choice.value), className: "h-8 px-3 text-sm", children: _jsx(ChoiceOptionLabel, { choice: choice }) }, choice
|
|
283
|
+
return (_jsx(ThemedButton, { type: "button", variant: selected ? "primary" : "secondary", size: "sm", disabled: disabled || choice.disabled, "aria-pressed": selected, title: choice.disabledReason ?? choice.description, onClick: () => setValue(choice.value), className: "h-8 px-3 text-sm", children: _jsx(ChoiceOptionLabel, { choice: choice }) }, choiceRenderKey(choice)));
|
|
271
284
|
}) }) }));
|
|
272
285
|
}
|
|
273
|
-
return (_jsxs(FieldFrame, { label: labelForInput(input), controlId: controlId, errors: errors, missing: missing, children: [_jsxs(Select, { disabled: disabled, value:
|
|
286
|
+
return (_jsxs(FieldFrame, { label: labelForInput(input), controlId: controlId, errors: errors, missing: missing, children: [_jsxs(Select, { disabled: disabled, value: encodeChoiceSelectValue(value), onValueChange: (next) => setValue(decodeChoiceSelectValue(next)), children: [_jsx(SelectTrigger, { id: controlId, size: "sm", className: "w-full bg-white", children: _jsx("span", { "data-slot": "select-value", children: selectedChoice ? (_jsx(ChoiceOptionLabel, { choice: selectedChoice })) : (_jsx("span", { style: { color: theme.semantic.text.muted }, children: "Choose..." })) }) }), _jsx(SelectContent, { style: {
|
|
274
287
|
...themeCssVars,
|
|
275
288
|
fontFamily: theme.typography.fontFamily.body,
|
|
276
|
-
}, children: choices.map((choice) => (_jsx(SelectItem, { value: choice
|
|
289
|
+
}, children: choices.map((choice) => (_jsx(SelectItem, { value: choiceRenderKey(choice), textValue: choice.label, disabled: choice.disabled, children: _jsx(ChoiceOptionLabel, { choice: choice }) }, choiceRenderKey(choice)))) })] }), _jsx(ChoiceDescription, { choice: selectedChoice })] }));
|
|
277
290
|
}
|
|
278
291
|
function ChoiceListField({ input, value, setValue, errors, missing, disabled, domain, }) {
|
|
279
292
|
const theme = useTheme();
|
|
@@ -300,10 +313,11 @@ function ChoiceListField({ input, value, setValue, errors, missing, disabled, do
|
|
|
300
313
|
justifyContent: "space-between",
|
|
301
314
|
gap: theme.space[2],
|
|
302
315
|
}, children: [_jsx("span", { children: labelForInput(input) }), meta ? (_jsx("span", { style: { color: theme.semantic.text.muted }, children: meta })) : null] }), errors: errors, missing: missing, children: _jsx("span", { style: { display: "flex", flexWrap: "wrap", gap: theme.space[1] }, children: (domain.choices ?? []).map((choice) => {
|
|
303
|
-
const
|
|
316
|
+
const value = choice.value;
|
|
317
|
+
const checked = selected.has(value);
|
|
304
318
|
return (_jsx(ThemedButton, { type: "button", variant: checked ? "primary" : "secondary", size: "sm", disabled: disabled ||
|
|
305
319
|
choice.disabled ||
|
|
306
|
-
(!checked && selected.size >= max), "aria-pressed": checked, title: choice.disabledReason ?? choice.description, onClick: () => toggle(
|
|
320
|
+
(!checked && selected.size >= max), "aria-pressed": checked, title: choice.disabledReason ?? choice.description, onClick: () => toggle(value), className: "h-8 px-3 text-sm", children: _jsx(ChoiceOptionLabel, { choice: choice }) }, value));
|
|
307
321
|
}) }) }));
|
|
308
322
|
}
|
|
309
323
|
function ResourceMapField({ input, value, setValue, errors, missing, disabled, domain, }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrimaryActionButton.d.ts","sourceRoot":"","sources":["../../src/components/PrimaryActionButton.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"PrimaryActionButton.d.ts","sourceRoot":"","sources":["../../src/components/PrimaryActionButton.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAO1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAE7F,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,wBAAwB,CACvC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D;;;;;OAKG;IACH,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,sEAAsE;IACtE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,EACA,MAAM,EACN,OAAmB,EACnB,IAAW,EACX,KAAK,EACL,KAAY,EACZ,aAAa,EACb,IAAI,EACJ,MAAM,EACN,SAAkB,EAClB,KAAK,EACL,SAAS,GACV,EAAE,wBAAwB,CAAC,MAAM,CAAC,2CAyLlC"}
|
|
@@ -36,6 +36,7 @@ import { motion } from "framer-motion";
|
|
|
36
36
|
import { useTheme } from "../theme/ThemeProvider.js";
|
|
37
37
|
import { intentForVariant, } from "../theme/derive.js";
|
|
38
38
|
import { interactionLabel } from "../utils/interaction-labels.js";
|
|
39
|
+
import { submitInteractionDraft, submitInteractionParams, } from "../primitives/interaction-submit.js";
|
|
39
40
|
import { ThemedButton } from "./ThemedButton.js";
|
|
40
41
|
/**
|
|
41
42
|
* @see PrimaryActionButtonProps
|
|
@@ -128,16 +129,16 @@ export function PrimaryActionButton({ handle, variant = "primary", size = "lg",
|
|
|
128
129
|
setPending(true);
|
|
129
130
|
try {
|
|
130
131
|
if (params !== undefined) {
|
|
131
|
-
await handle
|
|
132
|
+
await submitInteractionParams(handle, params, {}, {
|
|
133
|
+
unhandledError: "ignore",
|
|
134
|
+
});
|
|
132
135
|
}
|
|
133
136
|
else {
|
|
134
|
-
await handle
|
|
137
|
+
await submitInteractionDraft(handle, {}, {
|
|
138
|
+
unhandledError: "ignore",
|
|
139
|
+
});
|
|
135
140
|
}
|
|
136
141
|
}
|
|
137
|
-
catch {
|
|
138
|
-
// Descriptor availability is authoritative; submit errors
|
|
139
|
-
// surface via the runtime's error channel.
|
|
140
|
-
}
|
|
141
142
|
finally {
|
|
142
143
|
setPending(false);
|
|
143
144
|
}
|
|
@@ -1,38 +1,72 @@
|
|
|
1
|
-
|
|
2
|
-
* Displays resource counts with icons and animated updates.
|
|
3
|
-
*
|
|
4
|
-
* The chip frame (border, fill, shadow, padding, gap) is sourced from
|
|
5
|
-
* the active {@link useTheme}. Authors can still override per-chip
|
|
6
|
-
* colours via {@link ResourceDisplayConfig.bgColor} /
|
|
7
|
-
* {@link ResourceDisplayConfig.iconColor} / {@link ResourceDisplayConfig.textColor}
|
|
8
|
-
* (Tailwind class names) — those win over the theme defaults so existing
|
|
9
|
-
* callers that pass game-specific palettes (Catan: wheat/wood/brick…)
|
|
10
|
-
* keep their look.
|
|
11
|
-
*/
|
|
12
|
-
import { type ComponentType, type ReactNode } from "react";
|
|
1
|
+
import { type ComponentType, type HTMLAttributes, type ReactElement, type ReactNode } from "react";
|
|
13
2
|
import type { ResourceId } from "@dreamboard/manifest-contract";
|
|
14
|
-
|
|
15
|
-
|
|
3
|
+
import { type PrimitiveCommonProps } from "../primitives/index.js";
|
|
4
|
+
export interface ResourceDisplayConfig<Resource extends string = ResourceId> {
|
|
5
|
+
type: Resource;
|
|
16
6
|
label: string;
|
|
17
7
|
icon: ReactNode | ComponentType<{
|
|
18
8
|
className?: string;
|
|
19
9
|
strokeWidth?: number;
|
|
20
|
-
"aria-hidden"?:
|
|
10
|
+
"aria-hidden"?: boolean | "true" | "false";
|
|
21
11
|
}>;
|
|
22
12
|
iconColor?: string;
|
|
23
13
|
bgColor?: string;
|
|
24
14
|
textColor?: string;
|
|
25
15
|
}
|
|
26
|
-
export interface
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
16
|
+
export interface ResourceCounterItemState<Resource extends string = ResourceId> {
|
|
17
|
+
type: Resource;
|
|
18
|
+
label: string;
|
|
19
|
+
icon: ResourceDisplayConfig<Resource>["icon"];
|
|
20
|
+
iconColor?: string;
|
|
21
|
+
bgColor?: string;
|
|
22
|
+
textColor?: string;
|
|
23
|
+
count: number;
|
|
24
|
+
isZero: boolean;
|
|
25
|
+
interactive: boolean;
|
|
26
|
+
select: () => void;
|
|
27
|
+
renderIcon: (props?: ResourceIconProps) => ReactNode;
|
|
28
|
+
dataAttributes: {
|
|
29
|
+
"data-resource-id": Resource;
|
|
30
|
+
"data-resource-count": number;
|
|
31
|
+
"data-resource-zero": boolean | undefined;
|
|
32
|
+
"data-interactive": boolean | undefined;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export interface ResourceIconProps {
|
|
35
36
|
className?: string;
|
|
37
|
+
strokeWidth?: number;
|
|
38
|
+
"aria-hidden"?: boolean | "true" | "false";
|
|
39
|
+
}
|
|
40
|
+
export type ResourceCounterRootProps<Resource extends string = ResourceId> = Omit<PrimitiveCommonProps, "children"> & Omit<HTMLAttributes<HTMLElement>, "children"> & {
|
|
41
|
+
resources: ReadonlyArray<ResourceDisplayConfig<Resource>>;
|
|
42
|
+
counts: Partial<Record<Resource, number>>;
|
|
43
|
+
zero?: "show" | "hide";
|
|
44
|
+
onResourceClick?: (resourceType: Resource) => void;
|
|
45
|
+
children: ReactNode;
|
|
46
|
+
};
|
|
47
|
+
export type BoundResourceCounterRootProps<Resource extends string = ResourceId> = Omit<ResourceCounterRootProps<Resource>, "resources">;
|
|
48
|
+
export type ResourceCounterProps<Resource extends string = ResourceId> = ResourceCounterRootProps<Resource>;
|
|
49
|
+
export type ResourceCounterPartProps<Resource extends string = ResourceId> = Omit<PrimitiveCommonProps, "children"> & Omit<HTMLAttributes<HTMLElement>, "children"> & {
|
|
50
|
+
children?: ReactNode | ((resource: ResourceCounterItemState<Resource>) => ReactNode);
|
|
51
|
+
};
|
|
52
|
+
export declare function ResourceCounterRoot<Resource extends string = ResourceId>({ resources, counts, zero, onResourceClick, children, "aria-label": ariaLabel, ...props }: ResourceCounterRootProps<Resource>): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
53
|
+
export declare function ResourceCounterItem<Resource extends string = ResourceId>({ children, onClick, "aria-label": ariaLabel, ...props }: ResourceCounterPartProps<Resource>): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
54
|
+
export declare function ResourceCounterIcon<Resource extends string = ResourceId>({ className, strokeWidth, "aria-hidden": ariaHidden, }: ResourceIconProps): ReactNode;
|
|
55
|
+
export declare function ResourceCounterCount<Resource extends string = ResourceId>({ children, ...props }: ResourceCounterPartProps<Resource>): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
56
|
+
export declare function ResourceCounterLabel<Resource extends string = ResourceId>({ children, ...props }: ResourceCounterPartProps<Resource>): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
57
|
+
export interface ResourceCounterComponents<Resource extends string = ResourceId> {
|
|
58
|
+
Root(props: BoundResourceCounterRootProps<Resource>): ReactElement;
|
|
59
|
+
Item(props: ResourceCounterPartProps<Resource>): ReactElement;
|
|
60
|
+
Icon(props: ResourceIconProps): ReactNode;
|
|
61
|
+
Count(props: ResourceCounterPartProps<Resource>): ReactElement;
|
|
62
|
+
Label(props: ResourceCounterPartProps<Resource>): ReactElement;
|
|
36
63
|
}
|
|
37
|
-
export declare function
|
|
64
|
+
export declare function createResourceCounter<Resource extends string>(resources: ReadonlyArray<ResourceDisplayConfig<Resource>>): ResourceCounterComponents<Resource>;
|
|
65
|
+
export declare const ResourceCounter: {
|
|
66
|
+
Root: typeof ResourceCounterRoot;
|
|
67
|
+
Item: typeof ResourceCounterItem;
|
|
68
|
+
Icon: typeof ResourceCounterIcon;
|
|
69
|
+
Count: typeof ResourceCounterCount;
|
|
70
|
+
Label: typeof ResourceCounterLabel;
|
|
71
|
+
};
|
|
38
72
|
//# sourceMappingURL=ResourceCounter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceCounter.d.ts","sourceRoot":"","sources":["../../src/components/ResourceCounter.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ResourceCounter.d.ts","sourceRoot":"","sources":["../../src/components/ResourceCounter.tsx"],"names":[],"mappings":"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"}
|