@gamepark/react-game 7.7.20 → 7.7.23
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/README.md +41 -41
- package/dist/components/GameProvider/GameErrorBoundary.js +108 -108
- package/dist/components/GameProvider/GameInternalProviders.d.ts +6 -0
- package/dist/components/GameProvider/GameInternalProviders.js +10 -0
- package/dist/components/GameProvider/GameInternalProviders.js.map +1 -0
- package/dist/components/GameProvider/LogHistoryBridge.d.ts +7 -0
- package/dist/components/GameProvider/LogHistoryBridge.js +23 -0
- package/dist/components/GameProvider/LogHistoryBridge.js.map +1 -0
- package/dist/components/JournalTabs/History/LazyLogItem.js +1 -1
- package/dist/components/JournalTabs/History/LazyLogItem.js.map +1 -1
- package/dist/components/JournalTabs/History/SetupLogItem.js +19 -19
- package/dist/components/JournalTabs/History/VirtualizedLogItem.d.ts +12 -0
- package/dist/components/JournalTabs/History/VirtualizedLogItem.js +6 -0
- package/dist/components/JournalTabs/History/VirtualizedLogItem.js.map +1 -0
- package/dist/components/Log/LogHistoryProvider.d.ts +7 -0
- package/dist/components/Log/LogHistoryProvider.js +22 -0
- package/dist/components/Log/LogHistoryProvider.js.map +1 -0
- package/dist/components/dialogs/FailuresDialog.js +11 -11
- package/dist/components/dialogs/ResultDialog/ResultDialog.js +1 -1
- package/dist/components/dialogs/ResultDialog/ResultDialog.js.map +1 -1
- package/dist/components/material/Dices/OctahedralDiceDescription.d.ts +48 -0
- package/dist/components/material/Dices/OctahedralDiceDescription.js +142 -0
- package/dist/components/material/Dices/OctahedralDiceDescription.js.map +1 -0
- package/dist/components/material/GameTable/DevToolEntry.d.ts +17 -0
- package/dist/components/material/GameTable/DevToolEntry.js +13 -0
- package/dist/components/material/GameTable/DevToolEntry.js.map +1 -0
- package/dist/components/material/GameTable/DevTools/DevToolsStyles.d.ts +58 -0
- package/dist/components/material/GameTable/DevTools/DevToolsStyles.js +706 -0
- package/dist/components/material/GameTable/DevTools/DevToolsStyles.js.map +1 -0
- package/dist/components/material/GameTable/DevToolsHub.d.ts +4 -21
- package/dist/components/material/GameTable/DevToolsHub.js +24 -830
- package/dist/components/material/GameTable/DevToolsHub.js.map +1 -1
- package/dist/components/material/GameTable/DevToolsStyles.d.ts +67 -0
- package/dist/components/material/GameTable/DevToolsStyles.js +752 -0
- package/dist/components/material/GameTable/DevToolsStyles.js.map +1 -0
- package/dist/components/material/GameTable/JsonHighlighter.d.ts +3 -0
- package/dist/components/material/GameTable/JsonHighlighter.js +37 -0
- package/dist/components/material/GameTable/JsonHighlighter.js.map +1 -0
- package/dist/components/material/sound/bellSound.d.ts +1 -0
- package/dist/components/material/sound/bellSound.js +2 -0
- package/dist/components/material/sound/bellSound.js.map +1 -0
- package/dist/components/menus/Menu/Menu.js +1 -1
- package/dist/components/menus/Menu/Menu.js.map +1 -1
- package/dist/css/backgroundCss.js +3 -3
- package/dist/css/cursorCss.js +6 -6
- package/dist/css/fadeIn.js +6 -6
- package/dist/css/shineEffect.js +28 -28
- package/dist/css/transformCss.js +4 -4
- package/dist/hooks/LogHistoryContext.d.ts +6 -0
- package/dist/hooks/LogHistoryContext.js +4 -0
- package/dist/hooks/LogHistoryContext.js.map +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useAutoViewOnDrag.d.ts +21 -0
- package/dist/hooks/useAutoViewOnDrag.js +54 -0
- package/dist/hooks/useAutoViewOnDrag.js.map +1 -0
- package/dist/hooks/useBackgroundTabHandler.d.ts +1 -0
- package/dist/hooks/useBackgroundTabHandler.js +38 -0
- package/dist/hooks/useBackgroundTabHandler.js.map +1 -0
- package/dist/hooks/useFastAnimationsOnReturn.d.ts +1 -0
- package/dist/hooks/useFastAnimationsOnReturn.js +38 -0
- package/dist/hooks/useFastAnimationsOnReturn.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/GameProvider/GameLoadingErrorScreen.d.ts +0 -1
- package/dist/components/GameProvider/GameLoadingErrorScreen.js +0 -82
- package/dist/components/GameProvider/GameLoadingErrorScreen.js.map +0 -1
- package/dist/components/material/Wheel/WheelContent.d.ts +0 -13
- package/dist/components/material/Wheel/WheelContent.js +0 -37
- package/dist/components/material/Wheel/WheelContent.js.map +0 -1
- package/dist/hooks/useFailures.d.ts +0 -1
- package/dist/hooks/useFailures.js +0 -11
- package/dist/hooks/useFailures.js.map +0 -1
- package/dist/hooks/useWebP.d.ts +0 -1
- package/dist/hooks/useWebP.js +0 -13
- package/dist/hooks/useWebP.js.map +0 -1
- package/dist/vite.d.ts +0 -3
- package/dist/vite.js +0 -34
- package/dist/vite.js.map +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Function called at drag start to compute the view value to assign
|
|
3
|
+
* to `game.view`. Return `undefined` to skip the view switch (e.g. the
|
|
4
|
+
* dragging player is already viewed).
|
|
5
|
+
*/
|
|
6
|
+
export type ViewSwitchResolver = (me: number) => number | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Hook for games that auto-switch the viewed player when a drag starts.
|
|
9
|
+
*
|
|
10
|
+
* It plays a transient `changeView` move at drag start using the value
|
|
11
|
+
* returned by `resolve`, then refreshes dnd-kit's drop-zone rects after
|
|
12
|
+
* `remeasureDelay` ms — long enough for the layout transition to have
|
|
13
|
+
* finished. This lets games keep a smooth CSS transition on view
|
|
14
|
+
* switches without breaking drag-and-drop detection (dnd-kit caches
|
|
15
|
+
* rects at drag start by default).
|
|
16
|
+
*
|
|
17
|
+
* Pass a custom `resolve` to encode multi-slot views (left/right, etc).
|
|
18
|
+
* For the simple case (just switch to the dragging player), the default
|
|
19
|
+
* resolver returns the current player id.
|
|
20
|
+
*/
|
|
21
|
+
export declare const useAutoViewOnDrag: (resolve?: ViewSwitchResolver, remeasureDelay?: number) => void;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { useDndContext, useDndMonitor } from '@dnd-kit/core';
|
|
2
|
+
import { MaterialMoveBuilder } from '@gamepark/rules-api';
|
|
3
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
4
|
+
import { usePlay } from './usePlay';
|
|
5
|
+
import { usePlayerId } from './usePlayerId';
|
|
6
|
+
/** Default delay (ms) before refreshing dnd-kit's drop-zone rects.
|
|
7
|
+
* Should be greater than the longest layout transition the game uses. */
|
|
8
|
+
const DEFAULT_REMEASURE_DELAY = 300;
|
|
9
|
+
/**
|
|
10
|
+
* Hook for games that auto-switch the viewed player when a drag starts.
|
|
11
|
+
*
|
|
12
|
+
* It plays a transient `changeView` move at drag start using the value
|
|
13
|
+
* returned by `resolve`, then refreshes dnd-kit's drop-zone rects after
|
|
14
|
+
* `remeasureDelay` ms — long enough for the layout transition to have
|
|
15
|
+
* finished. This lets games keep a smooth CSS transition on view
|
|
16
|
+
* switches without breaking drag-and-drop detection (dnd-kit caches
|
|
17
|
+
* rects at drag start by default).
|
|
18
|
+
*
|
|
19
|
+
* Pass a custom `resolve` to encode multi-slot views (left/right, etc).
|
|
20
|
+
* For the simple case (just switch to the dragging player), the default
|
|
21
|
+
* resolver returns the current player id.
|
|
22
|
+
*/
|
|
23
|
+
export const useAutoViewOnDrag = (resolve = (me) => me, remeasureDelay = DEFAULT_REMEASURE_DELAY) => {
|
|
24
|
+
const me = usePlayerId();
|
|
25
|
+
const play = usePlay();
|
|
26
|
+
const { measureDroppableContainers, droppableContainers } = useDndContext();
|
|
27
|
+
const remeasureTimeout = useRef(null);
|
|
28
|
+
const remeasure = useCallback(() => {
|
|
29
|
+
measureDroppableContainers(droppableContainers.getEnabled().map((c) => c.id));
|
|
30
|
+
}, [measureDroppableContainers, droppableContainers]);
|
|
31
|
+
const onDragStart = useCallback(() => {
|
|
32
|
+
if (me === undefined)
|
|
33
|
+
return;
|
|
34
|
+
const view = resolve(me);
|
|
35
|
+
if (view === undefined)
|
|
36
|
+
return;
|
|
37
|
+
play(MaterialMoveBuilder.changeView(view), { transient: true });
|
|
38
|
+
if (remeasureTimeout.current)
|
|
39
|
+
clearTimeout(remeasureTimeout.current);
|
|
40
|
+
remeasureTimeout.current = setTimeout(() => {
|
|
41
|
+
remeasure();
|
|
42
|
+
remeasureTimeout.current = null;
|
|
43
|
+
}, remeasureDelay);
|
|
44
|
+
}, [me, resolve, play, remeasure, remeasureDelay]);
|
|
45
|
+
const cleanup = useCallback(() => {
|
|
46
|
+
if (remeasureTimeout.current) {
|
|
47
|
+
clearTimeout(remeasureTimeout.current);
|
|
48
|
+
remeasureTimeout.current = null;
|
|
49
|
+
}
|
|
50
|
+
}, []);
|
|
51
|
+
useEffect(() => cleanup, [cleanup]);
|
|
52
|
+
useDndMonitor({ onDragStart, onDragEnd: cleanup, onDragCancel: cleanup });
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=useAutoViewOnDrag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAutoViewOnDrag.js","sourceRoot":"","sources":["../../src/hooks/useAutoViewOnDrag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAS3C;0EAC0E;AAC1E,MAAM,uBAAuB,GAAG,GAAG,CAAA;AAEnC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,UAA8B,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EACxC,iBAAyB,uBAAuB,EAChD,EAAE;IACF,MAAM,EAAE,GAAG,WAAW,EAAU,CAAA;IAChC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,MAAM,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,GAAG,aAAa,EAAE,CAAA;IAE3E,MAAM,gBAAgB,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAA;IAE3E,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,0BAA0B,CAAC,mBAAmB,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/E,CAAC,EAAE,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAErD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,EAAE,KAAK,SAAS;YAAE,OAAM;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;QACxB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAM;QAC9B,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAE/D,IAAI,gBAAgB,CAAC,OAAO;YAAE,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACpE,gBAAgB,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACzC,SAAS,EAAE,CAAA;YACX,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAA;QACjC,CAAC,EAAE,cAAc,CAAC,CAAA;IACpB,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;IAElD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC7B,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;YACtC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAA;QACjC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEnC,aAAa,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAA;AAC3E,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useBackgroundTabHandler: () => void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { isActionToAnimate, setAnimationsSpeed, store } from '@gamepark/react-client';
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
const SKIP_SPEED = 0;
|
|
4
|
+
export const useBackgroundTabHandler = () => {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
let speededUp = false;
|
|
7
|
+
const onVisibilityChange = () => {
|
|
8
|
+
if (document.visibilityState !== 'visible')
|
|
9
|
+
return;
|
|
10
|
+
const { actions } = store.getState();
|
|
11
|
+
if (!actions)
|
|
12
|
+
return;
|
|
13
|
+
const hasPendingAnimations = actions.some(a => a.animation || isActionToAnimate(a));
|
|
14
|
+
if (hasPendingAnimations) {
|
|
15
|
+
speededUp = true;
|
|
16
|
+
store.dispatch(setAnimationsSpeed(SKIP_SPEED));
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const unsubscribe = store.subscribe(() => {
|
|
20
|
+
if (!speededUp)
|
|
21
|
+
return;
|
|
22
|
+
const { actions } = store.getState();
|
|
23
|
+
if (!actions)
|
|
24
|
+
return;
|
|
25
|
+
const hasPendingAnimations = actions.some(a => a.animation || isActionToAnimate(a));
|
|
26
|
+
if (!hasPendingAnimations) {
|
|
27
|
+
speededUp = false;
|
|
28
|
+
store.dispatch(setAnimationsSpeed(1));
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
document.addEventListener('visibilitychange', onVisibilityChange);
|
|
32
|
+
return () => {
|
|
33
|
+
document.removeEventListener('visibilitychange', onVisibilityChange);
|
|
34
|
+
unsubscribe();
|
|
35
|
+
};
|
|
36
|
+
}, []);
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=useBackgroundTabHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBackgroundTabHandler.js","sourceRoot":"","sources":["../../src/hooks/useBackgroundTabHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,MAAM,UAAU,GAAG,CAAC,CAAA;AAEpB,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAA;QAErB,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS;gBAAE,OAAM;YAClD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAM;YAEpB,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,IAAI,oBAAoB,EAAE,CAAC;gBACzB,SAAS,GAAG,IAAI,CAAA;gBAChB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAA;YAChD,CAAC;QACH,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,SAAS;gBAAE,OAAM;YACtB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAM;YAEpB,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,SAAS,GAAG,KAAK,CAAA;gBACjB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;QACjE,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;YACpE,WAAW,EAAE,CAAA;QACf,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useFastAnimationsOnReturn: () => void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { isActionToAnimate, setAnimationsSpeed, store } from '@gamepark/react-client';
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
const SKIP_SPEED = 0;
|
|
4
|
+
export const useFastAnimationsOnReturn = () => {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
let speededUp = false;
|
|
7
|
+
const onVisibilityChange = () => {
|
|
8
|
+
if (document.visibilityState !== 'visible')
|
|
9
|
+
return;
|
|
10
|
+
const { actions } = store.getState();
|
|
11
|
+
if (!actions)
|
|
12
|
+
return;
|
|
13
|
+
const hasPendingAnimations = actions.some(a => a.animation || isActionToAnimate(a));
|
|
14
|
+
if (hasPendingAnimations) {
|
|
15
|
+
speededUp = true;
|
|
16
|
+
store.dispatch(setAnimationsSpeed(SKIP_SPEED));
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const unsubscribe = store.subscribe(() => {
|
|
20
|
+
if (!speededUp)
|
|
21
|
+
return;
|
|
22
|
+
const { actions } = store.getState();
|
|
23
|
+
if (!actions)
|
|
24
|
+
return;
|
|
25
|
+
const hasPendingAnimations = actions.some(a => a.animation || isActionToAnimate(a));
|
|
26
|
+
if (!hasPendingAnimations) {
|
|
27
|
+
speededUp = false;
|
|
28
|
+
store.dispatch(setAnimationsSpeed(1));
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
document.addEventListener('visibilitychange', onVisibilityChange);
|
|
32
|
+
return () => {
|
|
33
|
+
document.removeEventListener('visibilitychange', onVisibilityChange);
|
|
34
|
+
unsubscribe();
|
|
35
|
+
};
|
|
36
|
+
}, []);
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=useFastAnimationsOnReturn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFastAnimationsOnReturn.js","sourceRoot":"","sources":["../../src/hooks/useFastAnimationsOnReturn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,MAAM,UAAU,GAAG,CAAC,CAAA;AAEpB,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAA;QAErB,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS;gBAAE,OAAM;YAClD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAM;YAEpB,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,IAAI,oBAAoB,EAAE,CAAC;gBACzB,SAAS,GAAG,IAAI,CAAA;gBAChB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAA;YAChD,CAAC;QACH,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,SAAS;gBAAE,OAAM;YACtB,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAM;YAEpB,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;YACnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,SAAS,GAAG,KAAK,CAAA;gBACjB,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;QACjE,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;YACpE,WAAW,EAAE,CAAA;QACf,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gamepark/react-game",
|
|
3
|
-
"version": "7.7.
|
|
3
|
+
"version": "7.7.23",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "React components & tools to create a Board Game user interface for Game Park",
|
|
6
6
|
"author": "Romain Fromi <romain@game-park.com> (https://game-park.com/)",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const GameLoadingErrorScreen: () => import("@emotion/react/jsx-runtime").JSX.Element | null;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
-
/** @jsxImportSource @emotion/react */
|
|
3
|
-
import { css, keyframes } from '@emotion/react';
|
|
4
|
-
import { faTriangleExclamation } from '@fortawesome/free-solid-svg-icons';
|
|
5
|
-
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
6
|
-
import { GameLoadingError, PLATFORM_URI, useGameLoadingError } from '@gamepark/react-client';
|
|
7
|
-
import { useContext } from 'react';
|
|
8
|
-
import { Trans, useTranslation } from 'react-i18next';
|
|
9
|
-
import { NavButton } from '../menus/Menu/NavButton';
|
|
10
|
-
import { gameContext } from './GameContext';
|
|
11
|
-
const query = new URLSearchParams(window.location.search);
|
|
12
|
-
const locale = query.get('locale') || 'en';
|
|
13
|
-
export const GameLoadingErrorScreen = () => {
|
|
14
|
-
const error = useGameLoadingError();
|
|
15
|
-
const { t } = useTranslation('common');
|
|
16
|
-
const { game } = useContext(gameContext);
|
|
17
|
-
if (!error)
|
|
18
|
-
return null;
|
|
19
|
-
const isNotFound = error === GameLoadingError.NotFound;
|
|
20
|
-
return (_jsx("div", { css: containerCss, children: _jsxs("div", { css: cardCss, children: [_jsx("div", { css: iconContainerCss, children: _jsx(FontAwesomeIcon, { icon: faTriangleExclamation, css: iconCss }) }), _jsx("p", { css: messageCss, children: _jsx(Trans, { i18nKey: isNotFound ? 'error.game-not-found.title' : 'error.game-load.title', ns: "common" }) }), _jsx("p", { css: hintCss, children: _jsx(Trans, { i18nKey: isNotFound ? 'error.game-not-found.hint' : 'error.game-load.hint', ns: "common" }) }), _jsx(NavButton, { url: `${PLATFORM_URI}/${locale}/board-games/${game}`, children: t('Back to Game Park') })] }) }));
|
|
21
|
-
};
|
|
22
|
-
const fadeIn = keyframes `
|
|
23
|
-
from {
|
|
24
|
-
opacity: 0;
|
|
25
|
-
transform: translateY(16px);
|
|
26
|
-
}
|
|
27
|
-
to {
|
|
28
|
-
opacity: 1;
|
|
29
|
-
transform: translateY(0);
|
|
30
|
-
}
|
|
31
|
-
`;
|
|
32
|
-
const containerCss = css `
|
|
33
|
-
position: absolute;
|
|
34
|
-
inset: 0;
|
|
35
|
-
display: flex;
|
|
36
|
-
align-items: center;
|
|
37
|
-
justify-content: center;
|
|
38
|
-
padding: 2em;
|
|
39
|
-
box-sizing: border-box;
|
|
40
|
-
font-family: "Mulish", sans-serif;
|
|
41
|
-
z-index: 2000;
|
|
42
|
-
`;
|
|
43
|
-
const cardCss = css `
|
|
44
|
-
display: flex;
|
|
45
|
-
flex-direction: column;
|
|
46
|
-
align-items: center;
|
|
47
|
-
max-width: 460px;
|
|
48
|
-
padding: 2.5em 2.5em 2em;
|
|
49
|
-
border-radius: 1.2em;
|
|
50
|
-
background: #002448;
|
|
51
|
-
color: #eee;
|
|
52
|
-
text-align: center;
|
|
53
|
-
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
|
|
54
|
-
animation: ${fadeIn} 0.4s ease-out;
|
|
55
|
-
`;
|
|
56
|
-
const iconContainerCss = css `
|
|
57
|
-
display: flex;
|
|
58
|
-
align-items: center;
|
|
59
|
-
justify-content: center;
|
|
60
|
-
width: 64px;
|
|
61
|
-
height: 64px;
|
|
62
|
-
border-radius: 50%;
|
|
63
|
-
background: rgba(40, 184, 206, 0.15);
|
|
64
|
-
margin-bottom: 1.2em;
|
|
65
|
-
`;
|
|
66
|
-
const iconCss = css `
|
|
67
|
-
font-size: 32px;
|
|
68
|
-
color: #28B8CE;
|
|
69
|
-
`;
|
|
70
|
-
const messageCss = css `
|
|
71
|
-
font-size: 1.05em;
|
|
72
|
-
font-weight: 600;
|
|
73
|
-
line-height: 1.5;
|
|
74
|
-
margin: 0 0 0.3em;
|
|
75
|
-
`;
|
|
76
|
-
const hintCss = css `
|
|
77
|
-
font-size: 0.95em;
|
|
78
|
-
line-height: 1.5;
|
|
79
|
-
margin: 0 0 1.2em;
|
|
80
|
-
opacity: 0.8;
|
|
81
|
-
`;
|
|
82
|
-
//# sourceMappingURL=GameLoadingErrorScreen.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GameLoadingErrorScreen.js","sourceRoot":"","sources":["../../../src/components/GameProvider/GameLoadingErrorScreen.tsx"],"names":[],"mappings":";AAAA,sCAAsC;AACtC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AACzD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAA;IACnC,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,UAAU,GAAG,KAAK,KAAK,gBAAgB,CAAC,QAAQ,CAAA;IACtD,OAAO,CACL,cAAK,GAAG,EAAE,YAAY,YACpB,eAAK,GAAG,EAAE,OAAO,aACf,cAAK,GAAG,EAAE,gBAAgB,YACxB,KAAC,eAAe,IAAC,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,GAAG,GACzD,EACN,YAAG,GAAG,EAAE,UAAU,YAChB,KAAC,KAAK,IAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAAE,EAAC,QAAQ,GAAE,GAChG,EACJ,YAAG,GAAG,EAAE,OAAO,YACb,KAAC,KAAK,IAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,sBAAsB,EAAE,EAAE,EAAC,QAAQ,GAAE,GAC9F,EACJ,KAAC,SAAS,IAAC,GAAG,EAAE,GAAG,YAAY,IAAI,MAAM,gBAAgB,IAAI,EAAE,YAAG,CAAC,CAAC,mBAAmB,CAAC,GAAa,IACjG,GACF,CACP,CAAA;AACH,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,SAAS,CAAA;;;;;;;;;CASvB,CAAA;AAED,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;CAUvB,CAAA;AAED,MAAM,OAAO,GAAG,GAAG,CAAA;;;;;;;;;;;eAWJ,MAAM;CACpB,CAAA;AAED,MAAM,gBAAgB,GAAG,GAAG,CAAA;;;;;;;;;CAS3B,CAAA;AAED,MAAM,OAAO,GAAG,GAAG,CAAA;;;CAGlB,CAAA;AAED,MAAM,UAAU,GAAG,GAAG,CAAA;;;;;CAKrB,CAAA;AAED,MAAM,OAAO,GAAG,GAAG,CAAA;;;;;CAKlB,CAAA"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Interpolation, Theme } from '@emotion/react';
|
|
2
|
-
import { FC } from 'react';
|
|
3
|
-
import { MaterialContentProps } from '../MaterialDescription';
|
|
4
|
-
import { ComponentSize } from '../ComponentDescription';
|
|
5
|
-
export type WheelContentProps = {
|
|
6
|
-
size: ComponentSize;
|
|
7
|
-
image?: string;
|
|
8
|
-
wheelImage?: string;
|
|
9
|
-
borderRadius?: number;
|
|
10
|
-
extraCss?: Interpolation<Theme>;
|
|
11
|
-
wheelExtraCss?: Interpolation<Theme>;
|
|
12
|
-
} & MaterialContentProps;
|
|
13
|
-
export declare const WheelContent: FC<WheelContentProps>;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
-
import { css } from '@emotion/react';
|
|
3
|
-
import { backgroundCss, borderRadiusCss, shadowCss, shadowEffect, shineEffect, sizeCss } from '../../../css';
|
|
4
|
-
export const WheelContent = (props) => {
|
|
5
|
-
const { playDown, highlight, size, image, wheelImage, borderRadius, extraCss, wheelExtraCss, children } = props;
|
|
6
|
-
return _jsxs(_Fragment, { children: [_jsx("div", { css: [
|
|
7
|
-
faceCss,
|
|
8
|
-
extraCss,
|
|
9
|
-
sizeCss(size.width, size.height),
|
|
10
|
-
wheelImage && [backgroundCss(wheelImage), shadowCss(wheelImage)],
|
|
11
|
-
borderRadius && borderRadiusCss(borderRadius),
|
|
12
|
-
highlight ? shineEffect : (playDown && playDownCss(image))
|
|
13
|
-
], children: children }), image && _jsx("div", { css: [
|
|
14
|
-
faceCss,
|
|
15
|
-
wheelExtraCss,
|
|
16
|
-
sizeCss(size.width, size.height),
|
|
17
|
-
backgroundCss(image),
|
|
18
|
-
borderRadius && borderRadiusCss(borderRadius),
|
|
19
|
-
highlight ? shineEffect : (playDown && playDownCss(image))
|
|
20
|
-
] })] });
|
|
21
|
-
};
|
|
22
|
-
const faceCss = css `
|
|
23
|
-
position: absolute;
|
|
24
|
-
transform-style: preserve-3d;
|
|
25
|
-
backface-visibility: hidden;
|
|
26
|
-
`;
|
|
27
|
-
const playDownCss = (image) => {
|
|
28
|
-
if (image?.endsWith('.jpg')) {
|
|
29
|
-
return shadowEffect;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
return css `
|
|
33
|
-
filter: brightness(0.5);
|
|
34
|
-
`;
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
//# sourceMappingURL=WheelContent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WheelContent.js","sourceRoot":"","sources":["../../../../src/components/material/Wheel/WheelContent.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAwB,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAc5G,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,KAAK,EAAE,EAAE;IAC3D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAC/G,OAAO,8BACL,cAAK,GAAG,EAAE;oBACR,OAAO;oBACP,QAAQ;oBACR,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;oBAChC,UAAU,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;oBAChE,YAAY,IAAI,eAAe,CAAC,YAAY,CAAC;oBAC7C,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;iBAC3D,YACE,QAAQ,GACL,EACL,KAAK,IAAI,cAAK,GAAG,EAAE;oBAClB,OAAO;oBACP,aAAa;oBACb,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;oBAChC,aAAa,CAAC,KAAK,CAAC;oBACpB,YAAY,IAAI,eAAe,CAAC,YAAY,CAAC;oBAC7C,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;iBAC3D,GAAG,IACH,CAAA;AACL,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,GAAG,CAAA;;;;CAIlB,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,KAAc,EAAE,EAAE;IACrC,IAAI,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAA;IACrB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,CAAA;;KAET,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const useFailures: <Move = any>() => [string[], () => {}];
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useFailures = void 0;
|
|
4
|
-
var react_client_1 = require("@gamepark/react-client");
|
|
5
|
-
var react_redux_1 = require("react-redux");
|
|
6
|
-
var useFailures = function () {
|
|
7
|
-
var dispatch = (0, react_redux_1.useDispatch)();
|
|
8
|
-
return [(0, react_redux_1.useSelector)(function (state) { return state.failures; }), function () { return dispatch((0, react_client_1.clearFailures)()); }];
|
|
9
|
-
};
|
|
10
|
-
exports.useFailures = useFailures;
|
|
11
|
-
//# sourceMappingURL=useFailures.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useFailures.js","sourceRoot":"","sources":["../../src/hooks/useFailures.ts"],"names":[],"mappings":";;;AAAA,uDAAqE;AACrE,2CAAsD;AAE/C,IAAM,WAAW,GAAG;IACzB,IAAM,QAAQ,GAAG,IAAA,yBAAW,GAAE,CAAA;IAC9B,OAAO,CAAC,IAAA,yBAAW,EAAC,UAAC,KAA+B,IAAK,OAAA,KAAK,CAAC,QAAQ,EAAd,CAAc,CAAC,EAAE,cAAM,OAAA,QAAQ,CAAC,IAAA,4BAAa,GAAE,CAAC,EAAzB,CAAyB,CAAC,CAAA;AAC5G,CAAC,CAAA;AAHY,QAAA,WAAW,eAGvB"}
|
package/dist/hooks/useWebP.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const useWebP: () => boolean | undefined;
|
package/dist/hooks/useWebP.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
2
|
-
import webPCheck from 'supports-webp';
|
|
3
|
-
export const useWebP = () => {
|
|
4
|
-
const [webP, setWebP] = useState();
|
|
5
|
-
useEffect(() => {
|
|
6
|
-
(async () => {
|
|
7
|
-
const webP = await webPCheck;
|
|
8
|
-
setWebP(webP);
|
|
9
|
-
})();
|
|
10
|
-
}, [webPCheck, setWebP]);
|
|
11
|
-
return webP;
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=useWebP.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useWebP.js","sourceRoot":"","sources":["../../src/hooks/useWebP.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,SAAS,MAAM,eAAe,CAAA;AAErC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAwB,EAAE;IAC/C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAW,CAAA;IAE3C,SAAS,CAAC,GAAG,EAAE;QACb,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,IAAI,GAAG,MAAM,SAAS,CAAA;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAA;QACf,CAAC,CAAC,EAAE,CAAA;IACN,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IAExB,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
package/dist/vite.d.ts
DELETED
package/dist/vite.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
export function translationHmrPlugin() {
|
|
3
|
-
return {
|
|
4
|
-
name: 'gamepark-translation-hmr',
|
|
5
|
-
configureServer(server) {
|
|
6
|
-
const translationDir = path.resolve(server.config.root, 'public/translation');
|
|
7
|
-
let timeout;
|
|
8
|
-
server.watcher.on('change', (file) => {
|
|
9
|
-
if (file.startsWith(translationDir) && file.endsWith('.json')) {
|
|
10
|
-
clearTimeout(timeout);
|
|
11
|
-
timeout = setTimeout(() => {
|
|
12
|
-
server.ws.send({ type: 'custom', event: 'translation-update' });
|
|
13
|
-
}, 100);
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export function localeUrlPlugin() {
|
|
20
|
-
return {
|
|
21
|
-
name: 'gamepark-locale-url',
|
|
22
|
-
configureServer(server) {
|
|
23
|
-
const locale = Intl.DateTimeFormat().resolvedOptions().locale.split('-')[0];
|
|
24
|
-
server.printUrls = () => {
|
|
25
|
-
const address = server.resolvedUrls;
|
|
26
|
-
if (address) {
|
|
27
|
-
const url = address.local[0] ?? `http://localhost:3000/`;
|
|
28
|
-
console.log(` ➜ Game: \x1b[36m${url}?locale=${locale}\x1b[0m`);
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=vite.js.map
|
package/dist/vite.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,eAAe,CAAC,MAAM;YACpB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;YAC7E,IAAI,OAAsC,CAAA;YAC1C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACnC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC9D,YAAY,CAAC,OAAO,CAAC,CAAA;oBACrB,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;wBACxB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAA;oBACjE,CAAC,EAAE,GAAG,CAAC,CAAA;gBACT,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,eAAe,CAAC,MAAM;YACpB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3E,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE;gBACtB,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAA;gBACnC,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,wBAAwB,CAAA;oBACxD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,WAAW,MAAM,SAAS,CAAC,CAAA;gBAClE,CAAC;YACH,CAAC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|