@littlepartytime/sdk 2.1.0 → 2.2.1
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/GAME_DEV_GUIDE.md +137 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/interfaces.d.ts +10 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/GAME_DEV_GUIDE.md
CHANGED
|
@@ -714,8 +714,8 @@ export default function GameRenderer({ platform, state }: GameRendererProps) {
|
|
|
714
714
|
|
|
715
715
|
| Rule | Limit |
|
|
716
716
|
|------|-------|
|
|
717
|
-
| Single file size | ≤
|
|
718
|
-
| Total assets size | ≤
|
|
717
|
+
| Single file size | ≤ 20MB |
|
|
718
|
+
| Total assets size | ≤ 100MB |
|
|
719
719
|
| Allowed file types | `.png`, `.jpg`, `.jpeg`, `.webp`, `.svg`, `.gif`, `.mp3`, `.wav`, `.ogg`, `.json`, `.woff2`, `.woff` |
|
|
720
720
|
| Path rules | No `..`, no spaces |
|
|
721
721
|
|
|
@@ -749,6 +749,46 @@ export default function GameRenderer({ platform, state }: GameRendererProps) {
|
|
|
749
749
|
| `off(event, handler)` | Removes an event listener |
|
|
750
750
|
| `reportResult(result)` | Reports game results (called by platform, not games) |
|
|
751
751
|
| `getAssetUrl(path)` | Returns the runtime URL for a custom asset (e.g., `"cards/king.png"` → CDN URL) |
|
|
752
|
+
| `getDeviceCapabilities()` | Returns `{ haptics: boolean, motion: boolean }` indicating available device features |
|
|
753
|
+
| `haptic(type, option?)` | Triggers haptic feedback. `type`: `'impact'` / `'notification'` / `'selection'`. Silent no-op if unsupported |
|
|
754
|
+
| `onShake(handler)` | Listens for device shake events. Returns an unsubscribe function |
|
|
755
|
+
| `onTilt(handler)` | Streams device tilt data (`{ alpha, beta, gamma }`) at ~60fps. Returns an unsubscribe function |
|
|
756
|
+
|
|
757
|
+
#### Device Capabilities & Graceful Degradation
|
|
758
|
+
|
|
759
|
+
Games can query runtime capabilities via `getDeviceCapabilities()` and provide fallback UI:
|
|
760
|
+
|
|
761
|
+
```tsx
|
|
762
|
+
const caps = platform.getDeviceCapabilities();
|
|
763
|
+
|
|
764
|
+
// Shake: use motion sensor or fall back to a button
|
|
765
|
+
useEffect(() => {
|
|
766
|
+
if (!caps.motion) return;
|
|
767
|
+
return platform.onShake(() => {
|
|
768
|
+
platform.haptic('impact', 'heavy');
|
|
769
|
+
platform.send({ type: 'ROLL_DICE' });
|
|
770
|
+
});
|
|
771
|
+
}, [platform, caps.motion]);
|
|
772
|
+
|
|
773
|
+
// Tilt: stream orientation data for motion-controlled games
|
|
774
|
+
useEffect(() => {
|
|
775
|
+
if (!caps.motion) return;
|
|
776
|
+
return platform.onTilt((tilt) => {
|
|
777
|
+
// tilt.beta = front/back (-180~180), tilt.gamma = left/right (-90~90)
|
|
778
|
+
updateBallPosition(tilt.gamma, tilt.beta);
|
|
779
|
+
});
|
|
780
|
+
}, [platform, caps.motion]);
|
|
781
|
+
|
|
782
|
+
// Haptic feedback on user action (silent no-op if unsupported)
|
|
783
|
+
platform.haptic('impact', 'light');
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
| Environment | Haptics | Motion (Shake/Tilt) |
|
|
787
|
+
|---|---|---|
|
|
788
|
+
| Native App (iOS/Android) | Full support (Impact/Notification/Selection) | Full support |
|
|
789
|
+
| Web (Android Chrome) | Basic vibration | Supported |
|
|
790
|
+
| Web (iOS Safari) | Not supported (silent) | Requires permission (handled by platform) |
|
|
791
|
+
| Dev-kit preview | Not supported (silent) | Not supported |
|
|
752
792
|
|
|
753
793
|
### Events the renderer should listen for
|
|
754
794
|
|
|
@@ -942,6 +982,101 @@ Renderer receives "stateUpdate" event with filtered state
|
|
|
942
982
|
React re-renders with new state
|
|
943
983
|
```
|
|
944
984
|
|
|
985
|
+
## Game Settlement Lifecycle
|
|
986
|
+
|
|
987
|
+
When `isGameOver()` returns `true`, the platform **immediately** takes over: it sends `game:result` to all clients, transitions to the settlement screen, and **unloads the game renderer**. This happens in the same tick as the final `game:state` broadcast:
|
|
988
|
+
|
|
989
|
+
```
|
|
990
|
+
engine.handleAction(state, playerId, action) → newState
|
|
991
|
+
broadcastPlayerViews(newState) ← last game frame sent
|
|
992
|
+
engine.isGameOver(newState) → true
|
|
993
|
+
handleGameEnd() ← platform takes over, renderer unloaded
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
If your game needs an in-game settlement screen (animations, rankings, replay, etc.), you **must not** let `isGameOver()` return `true` until that screen is done.
|
|
997
|
+
|
|
998
|
+
### Two-Phase Settlement Pattern
|
|
999
|
+
|
|
1000
|
+
Split game ending into two phases:
|
|
1001
|
+
|
|
1002
|
+
```
|
|
1003
|
+
playing → (winner decided) → settlement → (player confirms or timer expires) → finished
|
|
1004
|
+
↑ ↑
|
|
1005
|
+
isGameOver = false isGameOver = true
|
|
1006
|
+
game renderer shows platform takes over
|
|
1007
|
+
its own result screen
|
|
1008
|
+
```
|
|
1009
|
+
|
|
1010
|
+
#### Engine Implementation
|
|
1011
|
+
|
|
1012
|
+
```typescript
|
|
1013
|
+
handleAction(state: GameState, playerId: string, action: GameAction): GameState {
|
|
1014
|
+
const data = state.data as MyGameData;
|
|
1015
|
+
|
|
1016
|
+
// 1. Normal gameplay — when winner is decided, enter settlement
|
|
1017
|
+
if (state.phase === "playing" && winnerDecided(data)) {
|
|
1018
|
+
return {
|
|
1019
|
+
...state,
|
|
1020
|
+
phase: "settlement",
|
|
1021
|
+
data: { ...data, rankings: computeRankings(data) },
|
|
1022
|
+
};
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
// 2. Settlement — wait for confirm action, then finish
|
|
1026
|
+
if (state.phase === "settlement" && action.type === "CONFIRM_RESULT") {
|
|
1027
|
+
return { ...state, phase: "finished" };
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
return state;
|
|
1031
|
+
},
|
|
1032
|
+
|
|
1033
|
+
isGameOver(state: GameState): boolean {
|
|
1034
|
+
return state.phase === "finished"; // NOT "settlement"!
|
|
1035
|
+
},
|
|
1036
|
+
|
|
1037
|
+
getPlayerView(state: GameState, playerId: string): Partial<GameState> {
|
|
1038
|
+
if (state.phase === "settlement") {
|
|
1039
|
+
// Return rankings / stats for the in-game result screen
|
|
1040
|
+
return {
|
|
1041
|
+
...state,
|
|
1042
|
+
data: { rankings: (state.data as MyGameData).rankings },
|
|
1043
|
+
};
|
|
1044
|
+
}
|
|
1045
|
+
// ...
|
|
1046
|
+
},
|
|
1047
|
+
```
|
|
1048
|
+
|
|
1049
|
+
#### Renderer Implementation
|
|
1050
|
+
|
|
1051
|
+
```tsx
|
|
1052
|
+
export default function GameRenderer({ platform, state }: GameRendererProps) {
|
|
1053
|
+
if (state.phase === "settlement") {
|
|
1054
|
+
return (
|
|
1055
|
+
<div>
|
|
1056
|
+
{/* Show your in-game result screen here */}
|
|
1057
|
+
<Rankings data={state.data.rankings} />
|
|
1058
|
+
<button onClick={() => platform.send({ type: "CONFIRM_RESULT" })}>
|
|
1059
|
+
确认
|
|
1060
|
+
</button>
|
|
1061
|
+
</div>
|
|
1062
|
+
);
|
|
1063
|
+
}
|
|
1064
|
+
// ... normal gameplay UI
|
|
1065
|
+
}
|
|
1066
|
+
```
|
|
1067
|
+
|
|
1068
|
+
### Common Mistakes
|
|
1069
|
+
|
|
1070
|
+
| Mistake | Consequence |
|
|
1071
|
+
|---------|------------|
|
|
1072
|
+
| `isGameOver()` returns `true` in `settlement` phase | In-game result screen is skipped — platform unloads the renderer immediately |
|
|
1073
|
+
| No `settlement` phase; jumping straight from `playing` to `finished` | Players never see the in-game result animation / ranking |
|
|
1074
|
+
| Calling `platform.reportResult()` from the renderer | No-op — settlement is driven entirely by the server via `isGameOver` + `getResult` |
|
|
1075
|
+
|
|
1076
|
+
### One-Liner Rule
|
|
1077
|
+
|
|
1078
|
+
> **`isGameOver()` is the platform takeover switch. Do not return `true` until your in-game result screen is done.**
|
|
1079
|
+
|
|
945
1080
|
## Complete Example: Number Guessing Game
|
|
946
1081
|
|
|
947
1082
|
See the [`examples/number-guess`](../../examples/number-guess) directory for a complete working example.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { Player, GameAction, GameResult, Platform } from './types';
|
|
1
|
+
export type { Player, GameAction, GameResult, Platform, HapticImpactStyle, HapticNotificationType, DeviceTilt, DeviceCapabilities, } from './types';
|
|
2
2
|
export type { PlayerState, GameState, GameAssets, GameConfig, GameEngine, GameRendererProps } from './interfaces';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,MAAM,EACN,UAAU,EACV,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/interfaces.d.ts
CHANGED
|
@@ -32,6 +32,16 @@ export interface GameConfig {
|
|
|
32
32
|
export interface GameEngine {
|
|
33
33
|
init(players: Player[], options?: Record<string, unknown>): GameState;
|
|
34
34
|
handleAction(state: GameState, playerId: string, action: GameAction): GameState;
|
|
35
|
+
/**
|
|
36
|
+
* Called after every handleAction. When this returns true, the platform
|
|
37
|
+
* immediately sends game:result, unloads the renderer, and shows the
|
|
38
|
+
* platform settlement screen.
|
|
39
|
+
*
|
|
40
|
+
* If your game has an in-game result screen (animations, rankings, etc.),
|
|
41
|
+
* keep returning false during that phase and only return true when the
|
|
42
|
+
* in-game result screen is done. See "Game Settlement Lifecycle" in
|
|
43
|
+
* GAME_DEV_GUIDE.md.
|
|
44
|
+
*/
|
|
35
45
|
isGameOver(state: GameState): boolean;
|
|
36
46
|
getResult(state: GameState): GameResult;
|
|
37
47
|
getPlayerView(state: GameState, playerId: string): Partial<GameState>;
|
package/dist/interfaces.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACtE,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAChF,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IACtC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IACxC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;CAC3B"}
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACtE,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAChF;;;;;;;;;OASG;IACH,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IACtC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IACxC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;CAC3B"}
|
package/dist/types.d.ts
CHANGED
|
@@ -17,6 +17,20 @@ export interface GameResult {
|
|
|
17
17
|
}[];
|
|
18
18
|
data?: Record<string, unknown>;
|
|
19
19
|
}
|
|
20
|
+
export type HapticImpactStyle = 'light' | 'medium' | 'heavy';
|
|
21
|
+
export type HapticNotificationType = 'success' | 'warning' | 'error';
|
|
22
|
+
export interface DeviceTilt {
|
|
23
|
+
/** 绕 z 轴旋转 (0~360) —— 指南针方向 */
|
|
24
|
+
alpha: number;
|
|
25
|
+
/** 绕 x 轴旋转 (-180~180) —— 前后倾斜 */
|
|
26
|
+
beta: number;
|
|
27
|
+
/** 绕 y 轴旋转 (-90~90) —— 左右倾斜 */
|
|
28
|
+
gamma: number;
|
|
29
|
+
}
|
|
30
|
+
export interface DeviceCapabilities {
|
|
31
|
+
haptics: boolean;
|
|
32
|
+
motion: boolean;
|
|
33
|
+
}
|
|
20
34
|
export interface Platform {
|
|
21
35
|
getPlayers(): Player[];
|
|
22
36
|
getLocalPlayer(): Player;
|
|
@@ -30,5 +44,25 @@ export interface Platform {
|
|
|
30
44
|
* @returns 可直接用于 <img src> / <audio src> / fetch() 的完整 URL
|
|
31
45
|
*/
|
|
32
46
|
getAssetUrl(path: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* 查询当前运行环境的设备能力。
|
|
49
|
+
* 游戏可据此决定是否启用某些交互,或提供视觉降级方案。
|
|
50
|
+
*/
|
|
51
|
+
getDeviceCapabilities(): DeviceCapabilities;
|
|
52
|
+
/**
|
|
53
|
+
* 触发震动反馈。不支持时静默忽略。
|
|
54
|
+
*/
|
|
55
|
+
haptic(type: 'impact' | 'notification' | 'selection', option?: HapticImpactStyle | HapticNotificationType): void;
|
|
56
|
+
/**
|
|
57
|
+
* 监听摇晃事件。平台负责处理权限请求和加速度阈值判定。
|
|
58
|
+
* @returns 取消监听的函数
|
|
59
|
+
*/
|
|
60
|
+
onShake(handler: () => void): () => void;
|
|
61
|
+
/**
|
|
62
|
+
* 监听设备倾斜数据流。平台负责处理权限请求。
|
|
63
|
+
* @param handler 约 60fps 回调
|
|
64
|
+
* @returns 取消监听的函数
|
|
65
|
+
*/
|
|
66
|
+
onTilt(handler: (tilt: DeviceTilt) => void): () => void;
|
|
33
67
|
}
|
|
34
68
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,cAAc,IAAI,MAAM,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC7D,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,cAAc,IAAI,MAAM,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAElC;;;OAGG;IACH,qBAAqB,IAAI,kBAAkB,CAAC;IAE5C;;OAEG;IACH,MAAM,CACJ,IAAI,EAAE,QAAQ,GAAG,cAAc,GAAG,WAAW,EAC7C,MAAM,CAAC,EAAE,iBAAiB,GAAG,sBAAsB,GAClD,IAAI,CAAC;IAER;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAEzC;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACzD"}
|
package/package.json
CHANGED