@gamepark/react-game 7.4.1 → 7.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/components/Avatar/SpeechBubble.js +1 -1
  2. package/dist/components/GameProvider/GameProvider.js +33 -1
  3. package/dist/components/GameProvider/GameProvider.js.map +1 -1
  4. package/dist/components/Header/Header.js +10 -7
  5. package/dist/components/Header/Header.js.map +1 -1
  6. package/dist/components/JournalTabs/Chat/ChatTextInput.js +4 -1
  7. package/dist/components/JournalTabs/Chat/ChatTextInput.js.map +1 -1
  8. package/dist/components/JournalTabs/Chat/SignInToChat.js +13 -1
  9. package/dist/components/JournalTabs/Chat/SignInToChat.js.map +1 -1
  10. package/dist/components/JournalTabs/History/History.js +3 -2
  11. package/dist/components/JournalTabs/History/History.js.map +1 -1
  12. package/dist/components/JournalTabs/JournalTabs.js +8 -7
  13. package/dist/components/JournalTabs/JournalTabs.js.map +1 -1
  14. package/dist/components/LoadingScreen/LoadingScreen.js +2 -2
  15. package/dist/components/Log/LiveLogButton.js +2 -2
  16. package/dist/components/Log/LiveLogButton.js.map +1 -1
  17. package/dist/components/PlayerPanel/Counters.js +3 -1
  18. package/dist/components/PlayerPanel/Counters.js.map +1 -1
  19. package/dist/components/PlayerPanel/PlayerPanel.js +9 -7
  20. package/dist/components/PlayerPanel/PlayerPanel.js.map +1 -1
  21. package/dist/components/PlayerPanel/StyledPlayerPanel.js +6 -5
  22. package/dist/components/PlayerPanel/StyledPlayerPanel.js.map +1 -1
  23. package/dist/components/buttons/PlayMoveButton/PlayMoveButton.js +6 -6
  24. package/dist/components/buttons/PlayMoveButton/PlayMoveButton.js.map +1 -1
  25. package/dist/components/dialogs/Dialog.js +6 -5
  26. package/dist/components/dialogs/Dialog.js.map +1 -1
  27. package/dist/components/dialogs/FailuresDialog.js +5 -3
  28. package/dist/components/dialogs/FailuresDialog.js.map +1 -1
  29. package/dist/components/dialogs/ResultDialog/RematchDisplay.js +4 -3
  30. package/dist/components/dialogs/ResultDialog/RematchDisplay.js.map +1 -1
  31. package/dist/components/dialogs/ResultDialog/RematchSection.js +4 -3
  32. package/dist/components/dialogs/ResultDialog/RematchSection.js.map +1 -1
  33. package/dist/components/dialogs/ResultDialog/ResultDialog.js +36 -21
  34. package/dist/components/dialogs/ResultDialog/ResultDialog.js.map +1 -1
  35. package/dist/components/dialogs/RulesDialog/DefaultHelpDisplay.d.ts +2 -0
  36. package/dist/components/dialogs/RulesDialog/DefaultHelpDisplay.js +25 -0
  37. package/dist/components/dialogs/RulesDialog/DefaultHelpDisplay.js.map +1 -0
  38. package/dist/components/dialogs/RulesDialog/LocationRulesDialogContent.js +3 -2
  39. package/dist/components/dialogs/RulesDialog/LocationRulesDialogContent.js.map +1 -1
  40. package/dist/components/dialogs/RulesDialog/MaterialRulesDialogContent.js +8 -25
  41. package/dist/components/dialogs/RulesDialog/MaterialRulesDialogContent.js.map +1 -1
  42. package/dist/components/dialogs/RulesDialog/RulesDialog.js +5 -4
  43. package/dist/components/dialogs/RulesDialog/RulesDialog.js.map +1 -1
  44. package/dist/components/dialogs/RulesDialog/RulesHelpDialogContent.js +4 -3
  45. package/dist/components/dialogs/RulesDialog/RulesHelpDialogContent.js.map +1 -1
  46. package/dist/components/dialogs/RulesDialog/index.d.ts +1 -0
  47. package/dist/components/dialogs/RulesDialog/index.js +1 -0
  48. package/dist/components/dialogs/RulesDialog/index.js.map +1 -1
  49. package/dist/components/material/GameTable/GameTableNavigation.js +1 -1
  50. package/dist/components/material/MaterialDescription.d.ts +13 -0
  51. package/dist/components/material/MaterialDescription.js +7 -0
  52. package/dist/components/material/MaterialDescription.js.map +1 -1
  53. package/dist/components/material/animations/CreateItemAnimations.js +24 -17
  54. package/dist/components/material/animations/CreateItemAnimations.js.map +1 -1
  55. package/dist/components/material/animations/MoveItemAnimations.js +1 -2
  56. package/dist/components/material/animations/MoveItemAnimations.js.map +1 -1
  57. package/dist/components/menus/EjectPlayer/EjectPlayerButton.js +2 -22
  58. package/dist/components/menus/EjectPlayer/EjectPlayerButton.js.map +1 -1
  59. package/dist/components/menus/EjectPlayer/EjectPlayerDialog.js +6 -16
  60. package/dist/components/menus/EjectPlayer/EjectPlayerDialog.js.map +1 -1
  61. package/dist/components/menus/EjectPlayer/EjectPlayerPopButton.js +12 -1
  62. package/dist/components/menus/EjectPlayer/EjectPlayerPopButton.js.map +1 -1
  63. package/dist/components/menus/Fullscreen/FullscreenButton.js +4 -2
  64. package/dist/components/menus/Fullscreen/FullscreenButton.js.map +1 -1
  65. package/dist/components/menus/Fullscreen/FullscreenDialog.js +6 -4
  66. package/dist/components/menus/Fullscreen/FullscreenDialog.js.map +1 -1
  67. package/dist/components/menus/Fullscreen/FullscreenPopButton.js +4 -2
  68. package/dist/components/menus/Fullscreen/FullscreenPopButton.js.map +1 -1
  69. package/dist/components/menus/GiveUpButton/GiveUpButton.js +7 -16
  70. package/dist/components/menus/GiveUpButton/GiveUpButton.js.map +1 -1
  71. package/dist/components/menus/Menu/Menu.js +7 -6
  72. package/dist/components/menus/Menu/Menu.js.map +1 -1
  73. package/dist/components/menus/Menu/NavButton.js +4 -2
  74. package/dist/components/menus/Menu/NavButton.js.map +1 -1
  75. package/dist/components/menus/PlayerQuit/TrackPlayersQuit.js +4 -2
  76. package/dist/components/menus/PlayerQuit/TrackPlayersQuit.js.map +1 -1
  77. package/dist/components/menus/RestartTutorialButton/RestartTutorialButton.js +2 -2
  78. package/dist/components/menus/RestartTutorialButton/RestartTutorialButton.js.map +1 -1
  79. package/dist/components/menus/Result/ResultButton.js +2 -2
  80. package/dist/components/menus/Result/ResultButton.js.map +1 -1
  81. package/dist/components/menus/Result/ResultPopButton.js +4 -2
  82. package/dist/components/menus/Result/ResultPopButton.js.map +1 -1
  83. package/dist/components/menus/SoundButton/SoundButton.js +2 -2
  84. package/dist/components/menus/SoundButton/SoundButton.js.map +1 -1
  85. package/dist/components/menus/TimeStatsButton/TimeStatsButton.js +12 -11
  86. package/dist/components/menus/TimeStatsButton/TimeStatsButton.js.map +1 -1
  87. package/dist/components/menus/UndoButton/UndoButton.js +2 -2
  88. package/dist/components/menus/UndoButton/UndoButton.js.map +1 -1
  89. package/dist/components/menus/UndoButton/UndoPopButton.js +4 -2
  90. package/dist/components/menus/UndoButton/UndoPopButton.js.map +1 -1
  91. package/dist/components/menus/menuCss.d.ts +5 -0
  92. package/dist/components/menus/menuCss.js +58 -5
  93. package/dist/components/menus/menuCss.js.map +1 -1
  94. package/dist/components/tutorial/MaterialTutorialDisplay.js +7 -5
  95. package/dist/components/tutorial/MaterialTutorialDisplay.js.map +1 -1
  96. package/dist/css/GameTheme.d.ts +64 -0
  97. package/dist/css/GameTheme.js +17 -1
  98. package/dist/css/GameTheme.js.map +1 -1
  99. package/dist/css/buttonCss.d.ts +1 -0
  100. package/dist/css/buttonCss.js +25 -0
  101. package/dist/css/buttonCss.js.map +1 -1
  102. package/dist/locators/GridLocator.d.ts +88 -0
  103. package/dist/locators/GridLocator.js +156 -0
  104. package/dist/locators/GridLocator.js.map +1 -0
  105. package/dist/locators/HandLocator.d.ts +1 -1
  106. package/dist/locators/ListLocator.d.ts +1 -1
  107. package/dist/locators/PileLocator.d.ts +1 -1
  108. package/dist/locators/index.d.ts +1 -0
  109. package/dist/locators/index.js +1 -0
  110. package/dist/locators/index.js.map +1 -1
  111. package/dist/utilities/translation.util.js +7 -9
  112. package/dist/utilities/translation.util.js.map +1 -1
  113. package/package.json +3 -3
@@ -32,6 +32,31 @@ export const buttonCss = (color, focus, active) => css `
32
32
  opacity: 0.5;
33
33
  }
34
34
  `;
35
+ export const onSurfaceButtonCss = css `
36
+ ${buttonResetCss};
37
+
38
+ padding: 0.2em 0.5em;
39
+ border-radius: 2em;
40
+ border: 0.05em solid var(--gp-on-surface);
41
+ color: var(--gp-on-surface);
42
+ background: transparent;
43
+
44
+ &:focus, &:hover {
45
+ background: var(--gp-on-surface-focus);
46
+ }
47
+
48
+ &:active {
49
+ background: var(--gp-on-surface-active);
50
+ }
51
+
52
+ &:disabled {
53
+ color: #555555;
54
+ border-color: #555555;
55
+ background: transparent;
56
+ cursor: auto;
57
+ opacity: 0.5;
58
+ }
59
+ `;
35
60
  export const linkButtonCss = css `
36
61
  ${buttonResetCss};
37
62
 
@@ -1 +1 @@
1
- {"version":3,"file":"buttonCss.js","sourceRoot":"","sources":["../../src/css/buttonCss.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;;;;;;;CAOhC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,MAAc,EAAE,EAAE,CAAC,GAAG,CAAA;IAC1E,cAAc;;;;yBAIO,KAAK;WACnB,KAAK;;;;kBAIE,KAAK;;;;kBAIL,MAAM;;;;;;;;;;CAUvB,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;IAC5B,cAAc;;;;;;;;;;CAUjB,CAAA"}
1
+ {"version":3,"file":"buttonCss.js","sourceRoot":"","sources":["../../src/css/buttonCss.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;;;;;;;CAOhC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,MAAc,EAAE,EAAE,CAAC,GAAG,CAAA;IAC1E,cAAc;;;;yBAIO,KAAK;WACnB,KAAK;;;;kBAIE,KAAK;;;;kBAIL,MAAM;;;;;;;;;;CAUvB,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;IACjC,cAAc;;;;;;;;;;;;;;;;;;;;;;;CAuBjB,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;IAC5B,cAAc;;;;;;;;;;CAUjB,CAAA"}
@@ -0,0 +1,88 @@
1
+ import { Coordinates, Location } from '@gamepark/rules-api';
2
+ import { Locator, MaterialContext } from './Locator';
3
+ /**
4
+ * Boundaries of items on the grid, in grid coordinates (not em).
5
+ */
6
+ export type GridBoundaries = {
7
+ xMin: number;
8
+ xMax: number;
9
+ yMin: number;
10
+ yMax: number;
11
+ };
12
+ /**
13
+ * Dimensions of the visible grid window, in cells.
14
+ */
15
+ export type GridSize = {
16
+ columns: number;
17
+ rows: number;
18
+ };
19
+ /**
20
+ * This Locator places items on a rectangular grid with automatic panning.
21
+ *
22
+ * Items are positioned using their `location.x` and `location.y` as grid coordinates.
23
+ * The gap between cells is defined by {@link gap} (in em).
24
+ *
25
+ * When a {@link gridSize} is provided, the locator maintains a stable visible window:
26
+ * as long as all items fit inside, nothing moves. When items exceed the window,
27
+ * the view recenters on the barycentre.
28
+ *
29
+ * Without {@link gridSize}, the grid always centers on the barycentre of the items.
30
+ *
31
+ * Multiple independent grids are supported via {@link getGridId}, following the same
32
+ * pattern as {@link PileLocator.getPileId}.
33
+ *
34
+ * Override {@link getBoundaries} to provide custom boundaries (e.g. from a game helper).
35
+ */
36
+ export declare class GridLocator<P extends number = number, M extends number = number, L extends number = number> extends Locator<P, M, L> {
37
+ constructor(clone?: Partial<GridLocator>);
38
+ /**
39
+ * The gap between two consecutive grid cells, in em.
40
+ */
41
+ gap?: Partial<Coordinates>;
42
+ /**
43
+ * Function to override to provide a {@link gap} that depends on the context.
44
+ * @param _location Location to position
45
+ * @param _context Context of the game
46
+ * @returns The gap between two consecutive grid cells
47
+ */
48
+ getGap(_location: Location<P, L>, _context: MaterialContext<P, M, L>): Partial<Coordinates>;
49
+ /**
50
+ * The size of the visible grid window, in cells.
51
+ * When items fit inside the window, the view does not move.
52
+ * When items exceed it, the view recenters on the barycentre.
53
+ * Without gridSize, the view always centers on the barycentre.
54
+ */
55
+ gridSize?: GridSize;
56
+ /**
57
+ * Function to override to provide a {@link gridSize} that depends on the context.
58
+ * @param _location Location to position
59
+ * @param _context Context of the game
60
+ * @returns The grid size
61
+ */
62
+ getGridSize(_location: Location<P, L>, _context: MaterialContext<P, M, L>): GridSize | undefined;
63
+ /**
64
+ * Identifier for the grid. By default, distinct location areas (different player, id or parent) form distinct grids.
65
+ * @param location Location in the grid
66
+ * @param _context Context of the game
67
+ * @returns A unique identifier for the grid this location belongs to
68
+ */
69
+ getGridId(location: Location<P, L>, _context: MaterialContext<P, M, L>): string;
70
+ /**
71
+ * Compute the boundaries of all items on this grid, in grid coordinates.
72
+ * Override this to provide custom boundaries (e.g. from a game helper).
73
+ *
74
+ * Default implementation scans all item types placed by this locator.
75
+ *
76
+ * @param location A location in the grid area
77
+ * @param context Context of the game
78
+ * @returns The grid boundaries, or undefined if no items exist
79
+ */
80
+ getBoundaries(location: Location<P, L>, context: MaterialContext<P, M, L>): GridBoundaries | undefined;
81
+ private deltas;
82
+ private game?;
83
+ private refreshedGrids;
84
+ private refreshDelta;
85
+ private ensureRefreshed;
86
+ getCoordinates(location: Location<P, L>, context: MaterialContext<P, M, L>): Partial<Coordinates>;
87
+ getPositionDependencies(location: Location<P, L>, context: MaterialContext<P, M, L>): unknown;
88
+ }
@@ -0,0 +1,156 @@
1
+ import { isSameLocationArea } from '@gamepark/rules-api';
2
+ import { Locator } from './Locator';
3
+ /**
4
+ * This Locator places items on a rectangular grid with automatic panning.
5
+ *
6
+ * Items are positioned using their `location.x` and `location.y` as grid coordinates.
7
+ * The gap between cells is defined by {@link gap} (in em).
8
+ *
9
+ * When a {@link gridSize} is provided, the locator maintains a stable visible window:
10
+ * as long as all items fit inside, nothing moves. When items exceed the window,
11
+ * the view recenters on the barycentre.
12
+ *
13
+ * Without {@link gridSize}, the grid always centers on the barycentre of the items.
14
+ *
15
+ * Multiple independent grids are supported via {@link getGridId}, following the same
16
+ * pattern as {@link PileLocator.getPileId}.
17
+ *
18
+ * Override {@link getBoundaries} to provide custom boundaries (e.g. from a game helper).
19
+ */
20
+ export class GridLocator extends Locator {
21
+ constructor(clone) {
22
+ super();
23
+ Object.assign(this, clone);
24
+ }
25
+ /**
26
+ * The gap between two consecutive grid cells, in em.
27
+ */
28
+ gap;
29
+ /**
30
+ * Function to override to provide a {@link gap} that depends on the context.
31
+ * @param _location Location to position
32
+ * @param _context Context of the game
33
+ * @returns The gap between two consecutive grid cells
34
+ */
35
+ getGap(_location, _context) {
36
+ return this.gap ?? {};
37
+ }
38
+ /**
39
+ * The size of the visible grid window, in cells.
40
+ * When items fit inside the window, the view does not move.
41
+ * When items exceed it, the view recenters on the barycentre.
42
+ * Without gridSize, the view always centers on the barycentre.
43
+ */
44
+ gridSize;
45
+ /**
46
+ * Function to override to provide a {@link gridSize} that depends on the context.
47
+ * @param _location Location to position
48
+ * @param _context Context of the game
49
+ * @returns The grid size
50
+ */
51
+ getGridSize(_location, _context) {
52
+ return this.gridSize;
53
+ }
54
+ /**
55
+ * Identifier for the grid. By default, distinct location areas (different player, id or parent) form distinct grids.
56
+ * @param location Location in the grid
57
+ * @param _context Context of the game
58
+ * @returns A unique identifier for the grid this location belongs to
59
+ */
60
+ getGridId(location, _context) {
61
+ return [location.player, location.id, location.parent].filter(part => part !== undefined).join('_');
62
+ }
63
+ /**
64
+ * Compute the boundaries of all items on this grid, in grid coordinates.
65
+ * Override this to provide custom boundaries (e.g. from a game helper).
66
+ *
67
+ * Default implementation scans all item types placed by this locator.
68
+ *
69
+ * @param location A location in the grid area
70
+ * @param context Context of the game
71
+ * @returns The grid boundaries, or undefined if no items exist
72
+ */
73
+ getBoundaries(location, context) {
74
+ const { rules } = context;
75
+ let xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity;
76
+ let found = false;
77
+ for (const type of this.itemTypes) {
78
+ const items = rules.material(type).location(loc => isSameLocationArea(loc, location)).getItems();
79
+ for (const item of items) {
80
+ const x = item.location.x ?? 0;
81
+ const y = item.location.y ?? 0;
82
+ if (x < xMin)
83
+ xMin = x;
84
+ if (x > xMax)
85
+ xMax = x;
86
+ if (y < yMin)
87
+ yMin = y;
88
+ if (y > yMax)
89
+ yMax = y;
90
+ found = true;
91
+ }
92
+ }
93
+ return found ? { xMin, xMax, yMin, yMax } : undefined;
94
+ }
95
+ deltas = new Map();
96
+ game;
97
+ refreshedGrids = new Set();
98
+ refreshDelta(location, context, gridId) {
99
+ const boundaries = this.getBoundaries(location, context);
100
+ if (!boundaries) {
101
+ this.deltas.set(gridId, { deltaX: 0, deltaY: 0 });
102
+ return;
103
+ }
104
+ const centerX = (boundaries.xMin + boundaries.xMax) / 2;
105
+ const centerY = (boundaries.yMin + boundaries.yMax) / 2;
106
+ if (!this.deltas.has(gridId)) {
107
+ this.deltas.set(gridId, { deltaX: centerX, deltaY: centerY });
108
+ return;
109
+ }
110
+ const delta = this.deltas.get(gridId);
111
+ const size = this.getGridSize(location, context);
112
+ if (!size || (boundaries.xMin === boundaries.xMax && boundaries.yMin === boundaries.yMax)) {
113
+ // No gridSize, or single point: always center on barycentre
114
+ delta.deltaX = centerX;
115
+ delta.deltaY = centerY;
116
+ return;
117
+ }
118
+ const halfW = (size.columns - 1) / 2;
119
+ const halfH = (size.rows - 1) / 2;
120
+ // Recenter only the axis that exceeds the window
121
+ if (boundaries.xMin < delta.deltaX - halfW || boundaries.xMax > delta.deltaX + halfW) {
122
+ delta.deltaX = centerX;
123
+ }
124
+ if (boundaries.yMin < delta.deltaY - halfH || boundaries.yMax > delta.deltaY + halfH) {
125
+ delta.deltaY = centerY;
126
+ }
127
+ }
128
+ ensureRefreshed(location, context, gridId) {
129
+ if (context.rules.game !== this.game) {
130
+ this.game = context.rules.game;
131
+ this.refreshedGrids.clear();
132
+ }
133
+ if (!this.refreshedGrids.has(gridId)) {
134
+ this.refreshedGrids.add(gridId);
135
+ this.refreshDelta(location, context, gridId);
136
+ }
137
+ }
138
+ getCoordinates(location, context) {
139
+ const gridId = this.getGridId(location, context);
140
+ this.ensureRefreshed(location, context, gridId);
141
+ const { x: gx = 0, y: gy = 0, z: gz = 0 } = this.getGap(location, context);
142
+ const delta = this.deltas.get(gridId) ?? { deltaX: 0, deltaY: 0 };
143
+ return {
144
+ x: ((location.x ?? 0) - delta.deltaX) * gx,
145
+ y: ((location.y ?? 0) - delta.deltaY) * gy,
146
+ z: (location.z ?? 0) * gz
147
+ };
148
+ }
149
+ getPositionDependencies(location, context) {
150
+ const gridId = this.getGridId(location, context);
151
+ this.ensureRefreshed(location, context, gridId);
152
+ const delta = this.deltas.get(gridId) ?? { deltaX: 0, deltaY: 0 };
153
+ return [delta.deltaX, delta.deltaY];
154
+ }
155
+ }
156
+ //# sourceMappingURL=GridLocator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridLocator.js","sourceRoot":"","sources":["../../src/locators/GridLocator.ts"],"names":[],"mappings":"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"}
@@ -72,7 +72,7 @@ export declare class HandLocator<P extends number = number, M extends number = n
72
72
  * @returns The Z-axis position difference between 2 consecutive items in the hand. Default is 0.05cm.
73
73
  */
74
74
  getDeltaZ(_location: Location<P, L>, _context: MaterialContext<P, M, L>): number;
75
- getPositionDependencies(location: Location<P, L>, context: MaterialContext<P, M, L>): number;
75
+ getPositionDependencies(location: Location<P, L>, context: MaterialContext<P, M, L>): unknown;
76
76
  /**
77
77
  * See {@link Locator.getLocationCoordinates}.
78
78
  * @param location Location to position
@@ -39,7 +39,7 @@ export declare class ListLocator<P extends number = number, M extends number = n
39
39
  * @returns The maximum gap between the first and the last items
40
40
  */
41
41
  getMaxGap(location: Location<P, L>, context: MaterialContext<P, M, L>): Partial<Coordinates>;
42
- getPositionDependencies(location: Location<P, L>, context: MaterialContext<P, M, L>): number;
42
+ getPositionDependencies(location: Location<P, L>, context: MaterialContext<P, M, L>): unknown;
43
43
  /**
44
44
  * The number of items displayed in the list
45
45
  * @param location Location area of the items
@@ -42,7 +42,7 @@ export declare class PileLocator<P extends number = number, M extends number = n
42
42
  * @returns a unique identifier for the pile of items this location goes to
43
43
  */
44
44
  getPileId(item: MaterialItem<P, L>, _context: ItemContext<P, M, L>): string;
45
- getPositionDependencies(location: Location<P, L>, context: MaterialContext<P, M, L>): number;
45
+ getPositionDependencies(location: Location<P, L>, context: MaterialContext<P, M, L>): unknown;
46
46
  getItemCoordinates(item: MaterialItem<P, L>, context: ItemContext<P, M, L>): Partial<Coordinates>;
47
47
  generateItemPosition(item: MaterialItem<P, L>, context: ItemContext<P, M, L>): {
48
48
  x: number;
@@ -2,6 +2,7 @@ export * from './utils';
2
2
  export * from './DeckLocator';
3
3
  export * from './DelegateLocator';
4
4
  export * from './FlexLocator';
5
+ export * from './GridLocator';
5
6
  export * from './HandLocator';
6
7
  export * from './HexagonalGridLocator';
7
8
  export * from './LocationOrigin';
@@ -2,6 +2,7 @@ export * from './utils';
2
2
  export * from './DeckLocator';
3
3
  export * from './DelegateLocator';
4
4
  export * from './FlexLocator';
5
+ export * from './GridLocator';
5
6
  export * from './HandLocator';
6
7
  export * from './HexagonalGridLocator';
7
8
  export * from './LocationOrigin';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/locators/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/locators/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA"}
@@ -36,15 +36,13 @@ export const setupTranslation = (gameId, options) => {
36
36
  const locale = lngs[0];
37
37
  if (!locale || !namespace || !key)
38
38
  return;
39
- // Client-side: send to API endpoint via fetch
40
- const origin = window.location.href;
41
- fetch(`${PLATFORM_URI}/api/translations/missing`, {
42
- method: 'POST',
43
- headers: { 'Content-Type': 'application/json' },
44
- body: JSON.stringify({ locale, namespace, key, defaultValue, origin })
45
- }).catch((error) => {
46
- console.error('[Translation] Failed to report missing key (client):', error);
47
- });
39
+ try {
40
+ const body = JSON.stringify({ locale, namespace, key, defaultValue, origin: window.location.href });
41
+ navigator.sendBeacon(`${PLATFORM_URI}/api/translations/missing`, new Blob([body], { type: 'application/json' }));
42
+ }
43
+ catch (error) {
44
+ console.error('[Translation] Failed to report missing key:', error);
45
+ }
48
46
  },
49
47
  ...options
50
48
  }).catch(error => console.error(error));
@@ -1 +1 @@
1
- {"version":3,"file":"translation.util.js","sourceRoot":"","sources":["../../src/utilities/translation.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,iBAAiB,CAAA;AACxB,OAAO,iBAAiB,CAAA;AACxB,OAAO,iBAAiB,CAAA;AACxB,OAAO,OAAwB,MAAM,SAAS,CAAA;AAC9C,OAAO,WAAW,MAAM,sBAAsB,CAAA;AAC9C,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,IAAI,sBAAsB,GAAG,KAAK,CAAA;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,OAAqB,EAAE,EAAE;IACxE,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAM;IACR,CAAC;IAED,sBAAsB,GAAG,IAAI,CAAA;IAE7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEvD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;IAC1C,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,MAAM,CAAA;IAEtC,OAAO,CAAC,IAAI,CAAC;QACX,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM;QACjD,WAAW,EAAE,IAAI;QACjB,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;QACjC,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE;YACP,QAAQ,EAAE,wDAAwD;SACnE;QACD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACtB,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG;gBAAE,OAAM;YACzC,8CAA8C;YAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAA;YACnC,KAAK,CAAC,GAAG,YAAY,2BAA2B,EAAE;gBAChD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;aACvE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjB,OAAO,CAAC,KAAK,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAA;YAC9E,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,GAAG,OAAO;KACX,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AACtB,CAAC,CAAA"}
1
+ {"version":3,"file":"translation.util.js","sourceRoot":"","sources":["../../src/utilities/translation.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,iBAAiB,CAAA;AACxB,OAAO,iBAAiB,CAAA;AACxB,OAAO,iBAAiB,CAAA;AACxB,OAAO,OAAwB,MAAM,SAAS,CAAA;AAC9C,OAAO,WAAW,MAAM,sBAAsB,CAAA;AAC9C,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,IAAI,sBAAsB,GAAG,KAAK,CAAA;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,OAAqB,EAAE,EAAE;IACxE,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAM;IACR,CAAC;IAED,sBAAsB,GAAG,IAAI,CAAA;IAE7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAEvD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;IAC1C,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,MAAM,CAAA;IAEtC,OAAO,CAAC,IAAI,CAAC;QACX,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM;QACjD,WAAW,EAAE,IAAI;QACjB,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;QACjC,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE;YACP,QAAQ,EAAE,wDAAwD;SACnE;QACD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACtB,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG;gBAAE,OAAM;YACzC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;gBACnG,SAAS,CAAC,UAAU,CAAC,GAAG,YAAY,2BAA2B,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;YAClH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAA;YACrE,CAAC;QACH,CAAC;QACD,GAAG,OAAO;KACX,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AACtB,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gamepark/react-game",
3
- "version": "7.4.1",
3
+ "version": "7.5.0",
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/)",
@@ -25,7 +25,7 @@
25
25
  "@dnd-kit/modifiers": "^9.0.0",
26
26
  "@gamepark/api-types": "^1.0.0",
27
27
  "@gamepark/avataaars": "^3.0.0",
28
- "@gamepark/react-client": "^7.4.1",
28
+ "@gamepark/react-client": "^7.5.0",
29
29
  "dayjs": "^1.11.19",
30
30
  "fscreen": "^1.2.0",
31
31
  "i18next-http-backend": "^3.0.2",
@@ -47,7 +47,7 @@
47
47
  "@fortawesome/free-regular-svg-icons": "^7.2.0",
48
48
  "@fortawesome/free-solid-svg-icons": "^7.2.0",
49
49
  "@fortawesome/react-fontawesome": "^3.2.0",
50
- "@gamepark/rules-api": "^7.4.1",
50
+ "@gamepark/rules-api": "^7.5.0",
51
51
  "@types/fscreen": "^1.0.4",
52
52
  "@types/node": "^25.3.1",
53
53
  "@types/react": "^19.2.14",