@ankhorage/zora-game 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -2
- package/dist/ZORA_GAME_COMPONENT_META.d.ts +212 -0
- package/dist/ZORA_GAME_COMPONENT_META.d.ts.map +1 -1
- package/dist/ZORA_GAME_PLUGIN.d.ts +212 -0
- package/dist/ZORA_GAME_PLUGIN.d.ts.map +1 -1
- package/dist/ZORA_PLUGIN_METADATA.d.ts +212 -0
- package/dist/ZORA_PLUGIN_METADATA.d.ts.map +1 -1
- package/dist/features/game-presentation/adapters/inbound/GameEntity.d.ts +1 -1
- package/dist/features/game-presentation/adapters/inbound/GameEntity.d.ts.map +1 -1
- package/dist/features/game-presentation/adapters/inbound/GameEntity.js +15 -28
- package/dist/features/game-presentation/adapters/inbound/GameEntity.js.map +1 -1
- package/dist/features/game-presentation/meta/gameEntityMeta.d.ts +212 -0
- package/dist/features/game-presentation/meta/gameEntityMeta.d.ts.map +1 -1
- package/dist/features/game-presentation/meta/gameEntityMeta.js +114 -0
- package/dist/features/game-presentation/meta/gameEntityMeta.js.map +1 -1
- package/dist/features/game-presentation/public.d.ts +1 -1
- package/dist/features/game-presentation/public.d.ts.map +1 -1
- package/dist/features/game-presentation/public.js.map +1 -1
- package/dist/features/game-presentation/utils/resolveGameEntityMotionPlan.d.ts +15 -0
- package/dist/features/game-presentation/utils/resolveGameEntityMotionPlan.d.ts.map +1 -0
- package/dist/features/game-presentation/utils/resolveGameEntityMotionPlan.js +31 -0
- package/dist/features/game-presentation/utils/resolveGameEntityMotionPlan.js.map +1 -0
- package/dist/features/game-presentation/utils/useAnimatedGameEntityValue.d.ts +5 -0
- package/dist/features/game-presentation/utils/useAnimatedGameEntityValue.d.ts.map +1 -0
- package/dist/features/game-presentation/utils/useAnimatedGameEntityValue.js +33 -0
- package/dist/features/game-presentation/utils/useAnimatedGameEntityValue.js.map +1 -0
- package/dist/features/game-presentation/utils/useGameEntityAnimatedStyle.d.ts +16 -0
- package/dist/features/game-presentation/utils/useGameEntityAnimatedStyle.d.ts.map +1 -0
- package/dist/features/game-presentation/utils/useGameEntityAnimatedStyle.js +52 -0
- package/dist/features/game-presentation/utils/useGameEntityAnimatedStyle.js.map +1 -0
- package/dist/features/game-presentation/utils/useGameEntityMeasurement.d.ts +5 -0
- package/dist/features/game-presentation/utils/useGameEntityMeasurement.d.ts.map +1 -0
- package/dist/features/game-presentation/utils/useGameEntityMeasurement.js +14 -0
- package/dist/features/game-presentation/utils/useGameEntityMeasurement.js.map +1 -0
- package/dist/features/game-presentation/utils/useGameEntityMotionProgress.d.ts +5 -0
- package/dist/features/game-presentation/utils/useGameEntityMotionProgress.d.ts.map +1 -0
- package/dist/features/game-presentation/utils/useGameEntityMotionProgress.js +87 -0
- package/dist/features/game-presentation/utils/useGameEntityMotionProgress.js.map +1 -0
- package/dist/features/game-presentation/utils/useGameReducedMotion.d.ts +3 -0
- package/dist/features/game-presentation/utils/useGameReducedMotion.d.ts.map +1 -0
- package/dist/features/game-presentation/utils/useGameReducedMotion.js +13 -0
- package/dist/features/game-presentation/utils/useGameReducedMotion.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/gamePresentation.d.ts +18 -1
- package/dist/types/gamePresentation.d.ts.map +1 -1
- package/dist/types/gamePresentation.js.map +1 -1
- package/package.json +1 -1
- package/src/ZORA_PLUGIN_METADATA.test.ts +17 -0
- package/src/features/game-presentation/adapters/inbound/GameEntity.tsx +19 -69
- package/src/features/game-presentation/meta/gameEntityMeta.ts +115 -0
- package/src/features/game-presentation/public.ts +2 -0
- package/src/features/game-presentation/utils/resolveGameEntityMotionPlan.test.ts +63 -0
- package/src/features/game-presentation/utils/resolveGameEntityMotionPlan.ts +53 -0
- package/src/features/game-presentation/utils/useAnimatedGameEntityValue.ts +41 -0
- package/src/features/game-presentation/utils/useGameEntityAnimatedStyle.ts +87 -0
- package/src/features/game-presentation/utils/useGameEntityMeasurement.ts +19 -0
- package/src/features/game-presentation/utils/useGameEntityMotionProgress.ts +114 -0
- package/src/features/game-presentation/utils/useGameReducedMotion.ts +15 -0
- package/src/index.ts +2 -0
- package/src/types/gamePresentation.ts +19 -1
|
@@ -21,6 +21,20 @@ export const gameEntityMeta = {
|
|
|
21
21
|
zIndex: { value: { type: 'number' }, acceptsFallback: true },
|
|
22
22
|
hidden: { value: { type: 'boolean' }, acceptsFallback: true },
|
|
23
23
|
measurementId: { value: { type: 'string' }, acceptsFallback: true },
|
|
24
|
+
transitionDurationMs: { value: { type: 'number' }, acceptsFallback: true },
|
|
25
|
+
transitionEasing: { value: { type: 'string' }, acceptsFallback: true },
|
|
26
|
+
motionOffsetX: { value: { type: 'number' }, acceptsFallback: true },
|
|
27
|
+
motionOffsetY: { value: { type: 'number' }, acceptsFallback: true },
|
|
28
|
+
motionOpacityDelta: { value: { type: 'number' }, acceptsFallback: true },
|
|
29
|
+
motionScaleDelta: { value: { type: 'number' }, acceptsFallback: true },
|
|
30
|
+
motionRotationDelta: { value: { type: 'number' }, acceptsFallback: true },
|
|
31
|
+
motionDurationMs: { value: { type: 'number' }, acceptsFallback: true },
|
|
32
|
+
motionDelayMs: { value: { type: 'number' }, acceptsFallback: true },
|
|
33
|
+
motionEasing: { value: { type: 'string' }, acceptsFallback: true },
|
|
34
|
+
motionRepeat: { value: { type: 'boolean' }, acceptsFallback: true },
|
|
35
|
+
motionAlternate: { value: { type: 'boolean' }, acceptsFallback: true },
|
|
36
|
+
motionPaused: { value: { type: 'boolean' }, acceptsFallback: true },
|
|
37
|
+
motionEssential: { value: { type: 'boolean' }, acceptsFallback: true },
|
|
24
38
|
},
|
|
25
39
|
},
|
|
26
40
|
props: {
|
|
@@ -99,6 +113,106 @@ export const gameEntityMeta = {
|
|
|
99
113
|
label: 'Measurement id',
|
|
100
114
|
authoring: { authority: 'instance' },
|
|
101
115
|
},
|
|
116
|
+
transitionDurationMs: {
|
|
117
|
+
type: 'number',
|
|
118
|
+
category: 'Motion',
|
|
119
|
+
label: 'Transition duration (ms)',
|
|
120
|
+
default: 0,
|
|
121
|
+
authoring: { authority: 'instance' },
|
|
122
|
+
},
|
|
123
|
+
transitionEasing: {
|
|
124
|
+
type: 'enum',
|
|
125
|
+
category: 'Motion',
|
|
126
|
+
label: 'Transition easing',
|
|
127
|
+
enum: ['linear', 'ease-in', 'ease-out', 'ease-in-out'],
|
|
128
|
+
default: 'linear',
|
|
129
|
+
authoring: { authority: 'instance' },
|
|
130
|
+
},
|
|
131
|
+
motionOffsetX: {
|
|
132
|
+
type: 'number',
|
|
133
|
+
category: 'Motion',
|
|
134
|
+
label: 'Motion X offset (%)',
|
|
135
|
+
default: 0,
|
|
136
|
+
authoring: { authority: 'instance' },
|
|
137
|
+
},
|
|
138
|
+
motionOffsetY: {
|
|
139
|
+
type: 'number',
|
|
140
|
+
category: 'Motion',
|
|
141
|
+
label: 'Motion Y offset (%)',
|
|
142
|
+
default: 0,
|
|
143
|
+
authoring: { authority: 'instance' },
|
|
144
|
+
},
|
|
145
|
+
motionOpacityDelta: {
|
|
146
|
+
type: 'number',
|
|
147
|
+
category: 'Motion',
|
|
148
|
+
label: 'Motion opacity delta',
|
|
149
|
+
default: 0,
|
|
150
|
+
authoring: { authority: 'instance' },
|
|
151
|
+
},
|
|
152
|
+
motionScaleDelta: {
|
|
153
|
+
type: 'number',
|
|
154
|
+
category: 'Motion',
|
|
155
|
+
label: 'Motion scale delta',
|
|
156
|
+
default: 0,
|
|
157
|
+
authoring: { authority: 'instance' },
|
|
158
|
+
},
|
|
159
|
+
motionRotationDelta: {
|
|
160
|
+
type: 'number',
|
|
161
|
+
category: 'Motion',
|
|
162
|
+
label: 'Motion rotation delta',
|
|
163
|
+
default: 0,
|
|
164
|
+
authoring: { authority: 'instance' },
|
|
165
|
+
},
|
|
166
|
+
motionDurationMs: {
|
|
167
|
+
type: 'number',
|
|
168
|
+
category: 'Motion',
|
|
169
|
+
label: 'Motion duration (ms)',
|
|
170
|
+
default: 0,
|
|
171
|
+
authoring: { authority: 'instance' },
|
|
172
|
+
},
|
|
173
|
+
motionDelayMs: {
|
|
174
|
+
type: 'number',
|
|
175
|
+
category: 'Motion',
|
|
176
|
+
label: 'Motion delay (ms)',
|
|
177
|
+
default: 0,
|
|
178
|
+
authoring: { authority: 'instance' },
|
|
179
|
+
},
|
|
180
|
+
motionEasing: {
|
|
181
|
+
type: 'enum',
|
|
182
|
+
category: 'Motion',
|
|
183
|
+
label: 'Motion easing',
|
|
184
|
+
enum: ['linear', 'ease-in', 'ease-out', 'ease-in-out'],
|
|
185
|
+
default: 'linear',
|
|
186
|
+
authoring: { authority: 'instance' },
|
|
187
|
+
},
|
|
188
|
+
motionRepeat: {
|
|
189
|
+
type: 'boolean',
|
|
190
|
+
category: 'Motion',
|
|
191
|
+
label: 'Repeat motion',
|
|
192
|
+
default: false,
|
|
193
|
+
authoring: { authority: 'instance' },
|
|
194
|
+
},
|
|
195
|
+
motionAlternate: {
|
|
196
|
+
type: 'boolean',
|
|
197
|
+
category: 'Motion',
|
|
198
|
+
label: 'Alternate motion',
|
|
199
|
+
default: false,
|
|
200
|
+
authoring: { authority: 'instance' },
|
|
201
|
+
},
|
|
202
|
+
motionPaused: {
|
|
203
|
+
type: 'boolean',
|
|
204
|
+
category: 'Motion',
|
|
205
|
+
label: 'Pause motion',
|
|
206
|
+
default: false,
|
|
207
|
+
authoring: { authority: 'instance' },
|
|
208
|
+
},
|
|
209
|
+
motionEssential: {
|
|
210
|
+
type: 'boolean',
|
|
211
|
+
category: 'Motion',
|
|
212
|
+
label: 'Essential motion',
|
|
213
|
+
default: false,
|
|
214
|
+
authoring: { authority: 'instance' },
|
|
215
|
+
},
|
|
102
216
|
accessibilityLabel: {
|
|
103
217
|
type: 'string',
|
|
104
218
|
category: 'Accessibility',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gameEntityMeta.js","sourceRoot":"","sources":["../../../../src/features/game-presentation/meta/gameEntityMeta.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,kFAAkF;IAC/F,kBAAkB,EAAE,IAAI;IACxB,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IAC3D,SAAS,EAAE;QACT,KAAK,EAAE,aAAa;QACpB,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;KAC3E;IACD,QAAQ,EAAE;QACR,KAAK,EAAE;YACL,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YACvD,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YACvD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YAC3D,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YAC5D,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YAC7D,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YAC3D,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YAC9D,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YAC5D,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YAC7D,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;SACpE;KACF;IACD,KAAK,EAAE;QACL,CAAC,EAAE;YACD,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,CAAC,EAAE;YACD,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,aAAa,EAAE;YACb,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC;YAC9C,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,aAAa,EAAE;YACb,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,gBAAgB;YACvB,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;QACD,kBAAkB,EAAE;YAClB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,qBAAqB;YAC5B,SAAS,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SACrC;KACF;CACmC,CAAC","sourcesContent":["import type { ZoraComponentMeta } from '@ankhorage/zora/metadata';\n\n/*** Describe one positioned generic game entity for ZORA authoring tools. */\nexport const gameEntityMeta = {\n name: 'GameEntity',\n category: 'component',\n description: 'Positions arbitrary visual content inside a GameField without owning game rules.',\n directManifestNode: true,\n allowedChildren: ['Badge', 'Icon', 'Image', 'Text', 'View'],\n blueprint: {\n label: 'Game entity',\n defaultProps: { x: 0, y: 0, opacity: 1, scale: 1, rotation: 0, zIndex: 0 },\n },\n bindings: {\n props: {\n x: { value: { type: 'number' }, acceptsFallback: true },\n y: { value: { type: 'number' }, acceptsFallback: true },\n width: { value: { type: 'number' }, acceptsFallback: true },\n height: { value: { type: 'number' }, acceptsFallback: true },\n opacity: { value: { type: 'number' }, acceptsFallback: true },\n scale: { value: { type: 'number' }, acceptsFallback: true },\n rotation: { value: { type: 'number' }, acceptsFallback: true },\n zIndex: { value: { type: 'number' }, acceptsFallback: true },\n hidden: { value: { type: 'boolean' }, acceptsFallback: true },\n measurementId: { value: { type: 'string' }, acceptsFallback: true },\n },\n },\n props: {\n x: {\n type: 'number',\n category: 'Position',\n label: 'X (%)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n y: {\n type: 'number',\n category: 'Position',\n label: 'Y (%)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n width: {\n type: 'number',\n category: 'Size',\n label: 'Width',\n authoring: { authority: 'instance' },\n },\n height: {\n type: 'number',\n category: 'Size',\n label: 'Height',\n authoring: { authority: 'instance' },\n },\n opacity: {\n type: 'number',\n category: 'Appearance',\n label: 'Opacity',\n default: 1,\n authoring: { authority: 'instance' },\n },\n scale: {\n type: 'number',\n category: 'Transform',\n label: 'Scale',\n default: 1,\n authoring: { authority: 'instance' },\n },\n rotation: {\n type: 'number',\n category: 'Transform',\n label: 'Rotation',\n default: 0,\n authoring: { authority: 'instance' },\n },\n zIndex: {\n type: 'number',\n category: 'Position',\n label: 'Z index',\n default: 0,\n authoring: { authority: 'instance' },\n },\n hidden: {\n type: 'boolean',\n category: 'State',\n label: 'Hidden',\n default: false,\n authoring: { authority: 'instance' },\n },\n pointerEvents: {\n type: 'enum',\n category: 'Interaction',\n label: 'Pointer events',\n enum: ['auto', 'box-none', 'box-only', 'none'],\n default: 'auto',\n authoring: { authority: 'instance' },\n },\n measurementId: {\n type: 'string',\n category: 'Measurement',\n label: 'Measurement id',\n authoring: { authority: 'instance' },\n },\n accessibilityLabel: {\n type: 'string',\n category: 'Accessibility',\n label: 'Accessibility label',\n authoring: { authority: 'instance' },\n },\n },\n} as const satisfies ZoraComponentMeta;\n"]}
|
|
1
|
+
{"version":3,"file":"gameEntityMeta.js","sourceRoot":"","sources":["../../../../src/features/game-presentation/meta/gameEntityMeta.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ZoraComponentMeta } from '@ankhorage/zora/metadata';\n\n/*** Describe one positioned generic game entity for ZORA authoring tools. */\nexport const gameEntityMeta = {\n name: 'GameEntity',\n category: 'component',\n description: 'Positions arbitrary visual content inside a GameField without owning game rules.',\n directManifestNode: true,\n allowedChildren: ['Badge', 'Icon', 'Image', 'Text', 'View'],\n blueprint: {\n label: 'Game entity',\n defaultProps: { x: 0, y: 0, opacity: 1, scale: 1, rotation: 0, zIndex: 0 },\n },\n bindings: {\n props: {\n x: { value: { type: 'number' }, acceptsFallback: true },\n y: { value: { type: 'number' }, acceptsFallback: true },\n width: { value: { type: 'number' }, acceptsFallback: true },\n height: { value: { type: 'number' }, acceptsFallback: true },\n opacity: { value: { type: 'number' }, acceptsFallback: true },\n scale: { value: { type: 'number' }, acceptsFallback: true },\n rotation: { value: { type: 'number' }, acceptsFallback: true },\n zIndex: { value: { type: 'number' }, acceptsFallback: true },\n hidden: { value: { type: 'boolean' }, acceptsFallback: true },\n measurementId: { value: { type: 'string' }, acceptsFallback: true },\n transitionDurationMs: { value: { type: 'number' }, acceptsFallback: true },\n transitionEasing: { value: { type: 'string' }, acceptsFallback: true },\n motionOffsetX: { value: { type: 'number' }, acceptsFallback: true },\n motionOffsetY: { value: { type: 'number' }, acceptsFallback: true },\n motionOpacityDelta: { value: { type: 'number' }, acceptsFallback: true },\n motionScaleDelta: { value: { type: 'number' }, acceptsFallback: true },\n motionRotationDelta: { value: { type: 'number' }, acceptsFallback: true },\n motionDurationMs: { value: { type: 'number' }, acceptsFallback: true },\n motionDelayMs: { value: { type: 'number' }, acceptsFallback: true },\n motionEasing: { value: { type: 'string' }, acceptsFallback: true },\n motionRepeat: { value: { type: 'boolean' }, acceptsFallback: true },\n motionAlternate: { value: { type: 'boolean' }, acceptsFallback: true },\n motionPaused: { value: { type: 'boolean' }, acceptsFallback: true },\n motionEssential: { value: { type: 'boolean' }, acceptsFallback: true },\n },\n },\n props: {\n x: {\n type: 'number',\n category: 'Position',\n label: 'X (%)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n y: {\n type: 'number',\n category: 'Position',\n label: 'Y (%)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n width: {\n type: 'number',\n category: 'Size',\n label: 'Width',\n authoring: { authority: 'instance' },\n },\n height: {\n type: 'number',\n category: 'Size',\n label: 'Height',\n authoring: { authority: 'instance' },\n },\n opacity: {\n type: 'number',\n category: 'Appearance',\n label: 'Opacity',\n default: 1,\n authoring: { authority: 'instance' },\n },\n scale: {\n type: 'number',\n category: 'Transform',\n label: 'Scale',\n default: 1,\n authoring: { authority: 'instance' },\n },\n rotation: {\n type: 'number',\n category: 'Transform',\n label: 'Rotation',\n default: 0,\n authoring: { authority: 'instance' },\n },\n zIndex: {\n type: 'number',\n category: 'Position',\n label: 'Z index',\n default: 0,\n authoring: { authority: 'instance' },\n },\n hidden: {\n type: 'boolean',\n category: 'State',\n label: 'Hidden',\n default: false,\n authoring: { authority: 'instance' },\n },\n pointerEvents: {\n type: 'enum',\n category: 'Interaction',\n label: 'Pointer events',\n enum: ['auto', 'box-none', 'box-only', 'none'],\n default: 'auto',\n authoring: { authority: 'instance' },\n },\n measurementId: {\n type: 'string',\n category: 'Measurement',\n label: 'Measurement id',\n authoring: { authority: 'instance' },\n },\n\n transitionDurationMs: {\n type: 'number',\n category: 'Motion',\n label: 'Transition duration (ms)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n transitionEasing: {\n type: 'enum',\n category: 'Motion',\n label: 'Transition easing',\n enum: ['linear', 'ease-in', 'ease-out', 'ease-in-out'],\n default: 'linear',\n authoring: { authority: 'instance' },\n },\n motionOffsetX: {\n type: 'number',\n category: 'Motion',\n label: 'Motion X offset (%)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n motionOffsetY: {\n type: 'number',\n category: 'Motion',\n label: 'Motion Y offset (%)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n motionOpacityDelta: {\n type: 'number',\n category: 'Motion',\n label: 'Motion opacity delta',\n default: 0,\n authoring: { authority: 'instance' },\n },\n motionScaleDelta: {\n type: 'number',\n category: 'Motion',\n label: 'Motion scale delta',\n default: 0,\n authoring: { authority: 'instance' },\n },\n motionRotationDelta: {\n type: 'number',\n category: 'Motion',\n label: 'Motion rotation delta',\n default: 0,\n authoring: { authority: 'instance' },\n },\n motionDurationMs: {\n type: 'number',\n category: 'Motion',\n label: 'Motion duration (ms)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n motionDelayMs: {\n type: 'number',\n category: 'Motion',\n label: 'Motion delay (ms)',\n default: 0,\n authoring: { authority: 'instance' },\n },\n motionEasing: {\n type: 'enum',\n category: 'Motion',\n label: 'Motion easing',\n enum: ['linear', 'ease-in', 'ease-out', 'ease-in-out'],\n default: 'linear',\n authoring: { authority: 'instance' },\n },\n motionRepeat: {\n type: 'boolean',\n category: 'Motion',\n label: 'Repeat motion',\n default: false,\n authoring: { authority: 'instance' },\n },\n motionAlternate: {\n type: 'boolean',\n category: 'Motion',\n label: 'Alternate motion',\n default: false,\n authoring: { authority: 'instance' },\n },\n motionPaused: {\n type: 'boolean',\n category: 'Motion',\n label: 'Pause motion',\n default: false,\n authoring: { authority: 'instance' },\n },\n motionEssential: {\n type: 'boolean',\n category: 'Motion',\n label: 'Essential motion',\n default: false,\n authoring: { authority: 'instance' },\n },\n accessibilityLabel: {\n type: 'string',\n category: 'Accessibility',\n label: 'Accessibility label',\n authoring: { authority: 'instance' },\n },\n },\n} as const satisfies ZoraComponentMeta;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { GameEntityProps, GameFieldProps, GameInputZoneProps, GameKeyboardBinding, GameMeasurementProbeProps, GameOverlayPlacement, GameOverlayProps, GamePointerEvents, GameProps, } from '../../types/gamePresentation';
|
|
1
|
+
export type { GameEntityEasing, GameEntityMotionProps, GameEntityProps, GameFieldProps, GameInputZoneProps, GameKeyboardBinding, GameMeasurementProbeProps, GameOverlayPlacement, GameOverlayProps, GamePointerEvents, GameProps, } from '../../types/gamePresentation';
|
|
2
2
|
export { Game } from './adapters/inbound/Game';
|
|
3
3
|
export { GameEntity } from './adapters/inbound/GameEntity';
|
|
4
4
|
export { GameField } from './adapters/inbound/GameField';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/features/game-presentation/public.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,GACV,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/features/game-presentation/public.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,GACV,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/features/game-presentation/public.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/features/game-presentation/public.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export type {\n GameEntityEasing,\n GameEntityMotionProps,\n GameEntityProps,\n GameFieldProps,\n GameInputZoneProps,\n GameKeyboardBinding,\n GameMeasurementProbeProps,\n GameOverlayPlacement,\n GameOverlayProps,\n GamePointerEvents,\n GameProps,\n} from '../../types/gamePresentation';\nexport { Game } from './adapters/inbound/Game';\nexport { GameEntity } from './adapters/inbound/GameEntity';\nexport { GameField } from './adapters/inbound/GameField';\nexport { GameInputZone } from './adapters/inbound/GameInputZone';\nexport { GameMeasurementProbe } from './adapters/inbound/GameMeasurementProbe';\nexport { GameOverlay } from './adapters/inbound/GameOverlay';\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GameEntityEasing, GameEntityMotionProps } from '../../../types/gamePresentation';
|
|
2
|
+
export interface GameEntityMotionPlan {
|
|
3
|
+
readonly transitionDurationMs: number;
|
|
4
|
+
readonly transitionEasing: GameEntityEasing;
|
|
5
|
+
readonly motionDurationMs: number;
|
|
6
|
+
readonly motionDelayMs: number;
|
|
7
|
+
readonly motionEasing: GameEntityEasing;
|
|
8
|
+
readonly motionEnabled: boolean;
|
|
9
|
+
readonly motionRepeat: boolean;
|
|
10
|
+
readonly motionAlternate: boolean;
|
|
11
|
+
readonly motionPaused: boolean;
|
|
12
|
+
}
|
|
13
|
+
/*** Normalize serializable GameEntity motion props against the current reduced-motion preference. */
|
|
14
|
+
export declare function resolveGameEntityMotionPlan(props: GameEntityMotionProps, reduceMotion: boolean): GameEntityMotionPlan;
|
|
15
|
+
//# sourceMappingURL=resolveGameEntityMotionPlan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveGameEntityMotionPlan.d.ts","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/resolveGameEntityMotionPlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE/F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,qGAAqG;AACrG,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,qBAAqB,EAC5B,YAAY,EAAE,OAAO,GACpB,oBAAoB,CAkBtB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*** Normalize serializable GameEntity motion props against the current reduced-motion preference. */
|
|
2
|
+
export function resolveGameEntityMotionPlan(props, reduceMotion) {
|
|
3
|
+
const essential = props.motionEssential === true;
|
|
4
|
+
const motionEnabled = hasMotionOffset(props) &&
|
|
5
|
+
normalizeDuration(props.motionDurationMs) > 0 &&
|
|
6
|
+
(!reduceMotion || essential);
|
|
7
|
+
return {
|
|
8
|
+
transitionDurationMs: reduceMotion ? 0 : normalizeDuration(props.transitionDurationMs),
|
|
9
|
+
transitionEasing: props.transitionEasing ?? 'linear',
|
|
10
|
+
motionDurationMs: normalizeDuration(props.motionDurationMs),
|
|
11
|
+
motionDelayMs: normalizeDuration(props.motionDelayMs),
|
|
12
|
+
motionEasing: props.motionEasing ?? 'linear',
|
|
13
|
+
motionEnabled,
|
|
14
|
+
motionRepeat: props.motionRepeat === true,
|
|
15
|
+
motionAlternate: props.motionRepeat === true && props.motionAlternate === true,
|
|
16
|
+
motionPaused: props.motionPaused === true,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/*** Return whether any relative presentation offset requires a motion timeline. */
|
|
20
|
+
function hasMotionOffset(props) {
|
|
21
|
+
return ((props.motionOffsetX ?? 0) !== 0 ||
|
|
22
|
+
(props.motionOffsetY ?? 0) !== 0 ||
|
|
23
|
+
(props.motionOpacityDelta ?? 0) !== 0 ||
|
|
24
|
+
(props.motionScaleDelta ?? 0) !== 0 ||
|
|
25
|
+
(props.motionRotationDelta ?? 0) !== 0);
|
|
26
|
+
}
|
|
27
|
+
/*** Clamp an optional duration to a finite non-negative millisecond value. */
|
|
28
|
+
function normalizeDuration(value) {
|
|
29
|
+
return value === undefined || !Number.isFinite(value) ? 0 : Math.max(0, value);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=resolveGameEntityMotionPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveGameEntityMotionPlan.js","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/resolveGameEntityMotionPlan.ts"],"names":[],"mappings":"AAcA,qGAAqG;AACrG,MAAM,UAAU,2BAA2B,CACzC,KAA4B,EAC5B,YAAqB;IAErB,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC;IACjD,MAAM,aAAa,GACjB,eAAe,CAAC,KAAK,CAAC;QACtB,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC;QAC7C,CAAC,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC;IAE/B,OAAO;QACL,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,CAAC;QACtF,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,QAAQ;QACpD,gBAAgB,EAAE,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAC3D,aAAa,EAAE,iBAAiB,CAAC,KAAK,CAAC,aAAa,CAAC;QACrD,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,QAAQ;QAC5C,aAAa;QACb,YAAY,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI;QACzC,eAAe,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI;QAC9E,YAAY,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI;KAC1C,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,eAAe,CAAC,KAA4B;IACnD,OAAO,CACL,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,KAAK,CAAC;QAChC,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,KAAK,CAAC;QAChC,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAC,KAAK,CAAC;QACrC,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,KAAK,CAAC;QACnC,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC,KAAK,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,iBAAiB,CAAC,KAAyB;IAClD,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACjF,CAAC","sourcesContent":["import type { GameEntityEasing, GameEntityMotionProps } from '../../../types/gamePresentation';\n\nexport interface GameEntityMotionPlan {\n readonly transitionDurationMs: number;\n readonly transitionEasing: GameEntityEasing;\n readonly motionDurationMs: number;\n readonly motionDelayMs: number;\n readonly motionEasing: GameEntityEasing;\n readonly motionEnabled: boolean;\n readonly motionRepeat: boolean;\n readonly motionAlternate: boolean;\n readonly motionPaused: boolean;\n}\n\n/*** Normalize serializable GameEntity motion props against the current reduced-motion preference. */\nexport function resolveGameEntityMotionPlan(\n props: GameEntityMotionProps,\n reduceMotion: boolean,\n): GameEntityMotionPlan {\n const essential = props.motionEssential === true;\n const motionEnabled =\n hasMotionOffset(props) &&\n normalizeDuration(props.motionDurationMs) > 0 &&\n (!reduceMotion || essential);\n\n return {\n transitionDurationMs: reduceMotion ? 0 : normalizeDuration(props.transitionDurationMs),\n transitionEasing: props.transitionEasing ?? 'linear',\n motionDurationMs: normalizeDuration(props.motionDurationMs),\n motionDelayMs: normalizeDuration(props.motionDelayMs),\n motionEasing: props.motionEasing ?? 'linear',\n motionEnabled,\n motionRepeat: props.motionRepeat === true,\n motionAlternate: props.motionRepeat === true && props.motionAlternate === true,\n motionPaused: props.motionPaused === true,\n };\n}\n\n/*** Return whether any relative presentation offset requires a motion timeline. */\nfunction hasMotionOffset(props: GameEntityMotionProps): boolean {\n return (\n (props.motionOffsetX ?? 0) !== 0 ||\n (props.motionOffsetY ?? 0) !== 0 ||\n (props.motionOpacityDelta ?? 0) !== 0 ||\n (props.motionScaleDelta ?? 0) !== 0 ||\n (props.motionRotationDelta ?? 0) !== 0\n );\n}\n\n/*** Clamp an optional duration to a finite non-negative millisecond value. */\nfunction normalizeDuration(value: number | undefined): number {\n return value === undefined || !Number.isFinite(value) ? 0 : Math.max(0, value);\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Animated } from 'react-native';
|
|
2
|
+
import type { GameEntityEasing } from '../../../types/gamePresentation';
|
|
3
|
+
/*** Animate one bound numeric GameEntity presentation value toward its latest session-driven target. */
|
|
4
|
+
export declare function useAnimatedGameEntityValue(target: number, durationMs: number, easing: GameEntityEasing): Animated.Value;
|
|
5
|
+
//# sourceMappingURL=useAnimatedGameEntityValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnimatedGameEntityValue.d.ts","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useAnimatedGameEntityValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAU,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,wGAAwG;AACxG,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,GACvB,QAAQ,CAAC,KAAK,CAsBhB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Animated, Easing } from 'react-native';
|
|
3
|
+
/*** Animate one bound numeric GameEntity presentation value toward its latest session-driven target. */
|
|
4
|
+
export function useAnimatedGameEntityValue(target, durationMs, easing) {
|
|
5
|
+
const [value] = React.useState(() => new Animated.Value(target));
|
|
6
|
+
React.useEffect(() => {
|
|
7
|
+
value.stopAnimation();
|
|
8
|
+
if (durationMs === 0) {
|
|
9
|
+
value.setValue(target);
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
const animation = Animated.timing(value, {
|
|
13
|
+
toValue: target,
|
|
14
|
+
duration: durationMs,
|
|
15
|
+
easing: resolveGameEntityEasing(easing),
|
|
16
|
+
useNativeDriver: false,
|
|
17
|
+
});
|
|
18
|
+
animation.start();
|
|
19
|
+
return () => animation.stop();
|
|
20
|
+
}, [durationMs, easing, target, value]);
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
/*** Map serializable easing names onto React Native easing functions. */
|
|
24
|
+
function resolveGameEntityEasing(easing) {
|
|
25
|
+
if (easing === 'ease-in')
|
|
26
|
+
return Easing.in(Easing.ease);
|
|
27
|
+
if (easing === 'ease-out')
|
|
28
|
+
return Easing.out(Easing.ease);
|
|
29
|
+
if (easing === 'ease-in-out')
|
|
30
|
+
return Easing.inOut(Easing.ease);
|
|
31
|
+
return Easing.linear;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=useAnimatedGameEntityValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnimatedGameEntityValue.js","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useAnimatedGameEntityValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAIhD,wGAAwG;AACxG,MAAM,UAAU,0BAA0B,CACxC,MAAc,EACd,UAAkB,EAClB,MAAwB;IAExB,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,CAAC,aAAa,EAAE,CAAC;QAEtB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE;YACvC,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC;YACvC,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAExC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,SAAS,uBAAuB,CAAC,MAAwB;IACvD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC","sourcesContent":["import React from 'react';\nimport { Animated, Easing } from 'react-native';\n\nimport type { GameEntityEasing } from '../../../types/gamePresentation';\n\n/*** Animate one bound numeric GameEntity presentation value toward its latest session-driven target. */\nexport function useAnimatedGameEntityValue(\n target: number,\n durationMs: number,\n easing: GameEntityEasing,\n): Animated.Value {\n const [value] = React.useState(() => new Animated.Value(target));\n\n React.useEffect(() => {\n value.stopAnimation();\n\n if (durationMs === 0) {\n value.setValue(target);\n return undefined;\n }\n\n const animation = Animated.timing(value, {\n toValue: target,\n duration: durationMs,\n easing: resolveGameEntityEasing(easing),\n useNativeDriver: false,\n });\n animation.start();\n return () => animation.stop();\n }, [durationMs, easing, target, value]);\n\n return value;\n}\n\n/*** Map serializable easing names onto React Native easing functions. */\nfunction resolveGameEntityEasing(easing: GameEntityEasing) {\n if (easing === 'ease-in') return Easing.in(Easing.ease);\n if (easing === 'ease-out') return Easing.out(Easing.ease);\n if (easing === 'ease-in-out') return Easing.inOut(Easing.ease);\n return Easing.linear;\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Animated } from 'react-native';
|
|
2
|
+
import type { GameEntityProps } from '../../../types/gamePresentation';
|
|
3
|
+
/*** Compose bound GameEntity values with optional relative presentation motion. */
|
|
4
|
+
export declare function useGameEntityAnimatedStyle(input: GameEntityProps): {
|
|
5
|
+
left: Animated.AnimatedInterpolation<string | number>;
|
|
6
|
+
top: Animated.AnimatedInterpolation<string | number>;
|
|
7
|
+
opacity: Animated.AnimatedInterpolation<string | number>;
|
|
8
|
+
transform: ({
|
|
9
|
+
scale: Animated.AnimatedAddition<string | number>;
|
|
10
|
+
rotate?: never;
|
|
11
|
+
} | {
|
|
12
|
+
rotate: Animated.AnimatedInterpolation<string | number>;
|
|
13
|
+
scale?: never;
|
|
14
|
+
})[];
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=useGameEntityAnimatedStyle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameEntityAnimatedStyle.d.ts","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useGameEntityAnimatedStyle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAevE,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;EAyBhE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Animated } from 'react-native';
|
|
2
|
+
import { resolveGameEntityMotionPlan } from './resolveGameEntityMotionPlan';
|
|
3
|
+
import { useAnimatedGameEntityValue } from './useAnimatedGameEntityValue';
|
|
4
|
+
import { useGameEntityMotionProgress } from './useGameEntityMotionProgress';
|
|
5
|
+
import { useGameReducedMotion } from './useGameReducedMotion';
|
|
6
|
+
/*** Compose bound GameEntity values with optional relative presentation motion. */
|
|
7
|
+
export function useGameEntityAnimatedStyle(input) {
|
|
8
|
+
const reduceMotion = useGameReducedMotion();
|
|
9
|
+
const plan = resolveGameEntityMotionPlan(input, reduceMotion);
|
|
10
|
+
const values = {
|
|
11
|
+
x: useAnimatedGameEntityValue(input.x ?? 0, plan.transitionDurationMs, plan.transitionEasing),
|
|
12
|
+
y: useAnimatedGameEntityValue(input.y ?? 0, plan.transitionDurationMs, plan.transitionEasing),
|
|
13
|
+
opacity: useAnimatedGameEntityValue(input.opacity ?? 1, plan.transitionDurationMs, plan.transitionEasing),
|
|
14
|
+
scale: useAnimatedGameEntityValue(input.scale ?? 1, plan.transitionDurationMs, plan.transitionEasing),
|
|
15
|
+
rotation: useAnimatedGameEntityValue(input.rotation ?? 0, plan.transitionDurationMs, plan.transitionEasing),
|
|
16
|
+
progress: useGameEntityMotionProgress(plan),
|
|
17
|
+
};
|
|
18
|
+
return createGameEntityAnimatedStyle(values, input);
|
|
19
|
+
}
|
|
20
|
+
/*** Build one animated React Native style from base values and relative motion progress. */
|
|
21
|
+
function createGameEntityAnimatedStyle(values, input) {
|
|
22
|
+
const left = Animated.add(values.x, Animated.multiply(values.progress, input.motionOffsetX ?? 0));
|
|
23
|
+
const top = Animated.add(values.y, Animated.multiply(values.progress, input.motionOffsetY ?? 0));
|
|
24
|
+
const opacity = Animated.add(values.opacity, Animated.multiply(values.progress, input.motionOpacityDelta ?? 0));
|
|
25
|
+
const scale = Animated.add(values.scale, Animated.multiply(values.progress, input.motionScaleDelta ?? 0));
|
|
26
|
+
const rotation = Animated.add(values.rotation, Animated.multiply(values.progress, input.motionRotationDelta ?? 0));
|
|
27
|
+
return {
|
|
28
|
+
left: left.interpolate({
|
|
29
|
+
inputRange: [-10_000, 10_000],
|
|
30
|
+
outputRange: ['-10000%', '10000%'],
|
|
31
|
+
}),
|
|
32
|
+
top: top.interpolate({
|
|
33
|
+
inputRange: [-10_000, 10_000],
|
|
34
|
+
outputRange: ['-10000%', '10000%'],
|
|
35
|
+
}),
|
|
36
|
+
opacity: opacity.interpolate({
|
|
37
|
+
inputRange: [0, 1],
|
|
38
|
+
outputRange: [0, 1],
|
|
39
|
+
extrapolate: 'clamp',
|
|
40
|
+
}),
|
|
41
|
+
transform: [
|
|
42
|
+
{ scale },
|
|
43
|
+
{
|
|
44
|
+
rotate: rotation.interpolate({
|
|
45
|
+
inputRange: [-36_000, 36_000],
|
|
46
|
+
outputRange: ['-36000deg', '36000deg'],
|
|
47
|
+
}),
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=useGameEntityAnimatedStyle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameEntityAnimatedStyle.js","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useGameEntityAnimatedStyle.ts"],"names":[],"mappings":"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","sourcesContent":["import { Animated } from 'react-native';\n\nimport type { GameEntityProps } from '../../../types/gamePresentation';\nimport { resolveGameEntityMotionPlan } from './resolveGameEntityMotionPlan';\nimport { useAnimatedGameEntityValue } from './useAnimatedGameEntityValue';\nimport { useGameEntityMotionProgress } from './useGameEntityMotionProgress';\nimport { useGameReducedMotion } from './useGameReducedMotion';\n\ninterface GameEntityAnimatedValues {\n readonly x: Animated.Value;\n readonly y: Animated.Value;\n readonly opacity: Animated.Value;\n readonly scale: Animated.Value;\n readonly rotation: Animated.Value;\n readonly progress: Animated.Value;\n}\n\n/*** Compose bound GameEntity values with optional relative presentation motion. */\nexport function useGameEntityAnimatedStyle(input: GameEntityProps) {\n const reduceMotion = useGameReducedMotion();\n const plan = resolveGameEntityMotionPlan(input, reduceMotion);\n const values: GameEntityAnimatedValues = {\n x: useAnimatedGameEntityValue(input.x ?? 0, plan.transitionDurationMs, plan.transitionEasing),\n y: useAnimatedGameEntityValue(input.y ?? 0, plan.transitionDurationMs, plan.transitionEasing),\n opacity: useAnimatedGameEntityValue(\n input.opacity ?? 1,\n plan.transitionDurationMs,\n plan.transitionEasing,\n ),\n scale: useAnimatedGameEntityValue(\n input.scale ?? 1,\n plan.transitionDurationMs,\n plan.transitionEasing,\n ),\n rotation: useAnimatedGameEntityValue(\n input.rotation ?? 0,\n plan.transitionDurationMs,\n plan.transitionEasing,\n ),\n progress: useGameEntityMotionProgress(plan),\n };\n\n return createGameEntityAnimatedStyle(values, input);\n}\n\n/*** Build one animated React Native style from base values and relative motion progress. */\nfunction createGameEntityAnimatedStyle(values: GameEntityAnimatedValues, input: GameEntityProps) {\n const left = Animated.add(values.x, Animated.multiply(values.progress, input.motionOffsetX ?? 0));\n const top = Animated.add(values.y, Animated.multiply(values.progress, input.motionOffsetY ?? 0));\n const opacity = Animated.add(\n values.opacity,\n Animated.multiply(values.progress, input.motionOpacityDelta ?? 0),\n );\n const scale = Animated.add(\n values.scale,\n Animated.multiply(values.progress, input.motionScaleDelta ?? 0),\n );\n const rotation = Animated.add(\n values.rotation,\n Animated.multiply(values.progress, input.motionRotationDelta ?? 0),\n );\n\n return {\n left: left.interpolate({\n inputRange: [-10_000, 10_000],\n outputRange: ['-10000%', '10000%'],\n }),\n top: top.interpolate({\n inputRange: [-10_000, 10_000],\n outputRange: ['-10000%', '10000%'],\n }),\n opacity: opacity.interpolate({\n inputRange: [0, 1],\n outputRange: [0, 1],\n extrapolate: 'clamp',\n }),\n transform: [\n { scale },\n {\n rotate: rotation.interpolate({\n inputRange: [-36_000, 36_000],\n outputRange: ['-36000deg', '36000deg'],\n }),\n },\n ],\n };\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { View } from 'react-native';
|
|
3
|
+
/*** Register one optional measurable GameEntity view inside its local Game scope. */
|
|
4
|
+
export declare function useGameEntityMeasurement(elementRef: React.RefObject<View | null>, measurementId: string | undefined): void;
|
|
5
|
+
//# sourceMappingURL=useGameEntityMeasurement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameEntityMeasurement.d.ts","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useGameEntityMeasurement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAKzC,qFAAqF;AACrF,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,EACxC,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,IAAI,CAQN"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { measureGameEntity } from '../adapters/inbound/measureGameEntity';
|
|
3
|
+
import { GameRuntimeContext } from '../composition/GameRuntimeContext';
|
|
4
|
+
/*** Register one optional measurable GameEntity view inside its local Game scope. */
|
|
5
|
+
export function useGameEntityMeasurement(elementRef, measurementId) {
|
|
6
|
+
const runtime = React.useContext(GameRuntimeContext);
|
|
7
|
+
const registerMeasurement = runtime?.registerMeasurement;
|
|
8
|
+
React.useEffect(() => {
|
|
9
|
+
if (measurementId === undefined || registerMeasurement === undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
return registerMeasurement(measurementId, () => measureGameEntity(elementRef.current));
|
|
12
|
+
}, [elementRef, measurementId, registerMeasurement]);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=useGameEntityMeasurement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameEntityMeasurement.js","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useGameEntityMeasurement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,qFAAqF;AACrF,MAAM,UAAU,wBAAwB,CACtC,UAAwC,EACxC,aAAiC;IAEjC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACrD,MAAM,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,CAAC;IAEzD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,aAAa,KAAK,SAAS,IAAI,mBAAmB,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACvF,OAAO,mBAAmB,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACzF,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import React from 'react';\nimport type { View } from 'react-native';\n\nimport { measureGameEntity } from '../adapters/inbound/measureGameEntity';\nimport { GameRuntimeContext } from '../composition/GameRuntimeContext';\n\n/*** Register one optional measurable GameEntity view inside its local Game scope. */\nexport function useGameEntityMeasurement(\n elementRef: React.RefObject<View | null>,\n measurementId: string | undefined,\n): void {\n const runtime = React.useContext(GameRuntimeContext);\n const registerMeasurement = runtime?.registerMeasurement;\n\n React.useEffect(() => {\n if (measurementId === undefined || registerMeasurement === undefined) return undefined;\n return registerMeasurement(measurementId, () => measureGameEntity(elementRef.current));\n }, [elementRef, measurementId, registerMeasurement]);\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Animated } from 'react-native';
|
|
2
|
+
import type { GameEntityMotionPlan } from './resolveGameEntityMotionPlan';
|
|
3
|
+
/*** Drive one optional relative GameEntity motion timeline without changing game-session state. */
|
|
4
|
+
export declare function useGameEntityMotionProgress(plan: GameEntityMotionPlan): Animated.Value;
|
|
5
|
+
//# sourceMappingURL=useGameEntityMotionProgress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameEntityMotionProgress.d.ts","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useGameEntityMotionProgress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAU,MAAM,cAAc,CAAC;AAGhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAU1E,mGAAmG;AACnG,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,oBAAoB,GAAG,QAAQ,CAAC,KAAK,CAmDtF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Animated, Easing } from 'react-native';
|
|
3
|
+
/*** Drive one optional relative GameEntity motion timeline without changing game-session state. */
|
|
4
|
+
export function useGameEntityMotionProgress(plan) {
|
|
5
|
+
const [progress] = React.useState(() => new Animated.Value(0));
|
|
6
|
+
const signature = createMotionSignature(plan);
|
|
7
|
+
const previousSignature = React.useRef(signature);
|
|
8
|
+
const { motionEnabled, motionPaused, motionDurationMs, motionDelayMs, motionEasing, motionRepeat, motionAlternate, } = plan;
|
|
9
|
+
React.useEffect(() => {
|
|
10
|
+
progress.stopAnimation();
|
|
11
|
+
if (!motionEnabled) {
|
|
12
|
+
progress.setValue(0);
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
if (previousSignature.current !== signature) {
|
|
16
|
+
progress.setValue(0);
|
|
17
|
+
previousSignature.current = signature;
|
|
18
|
+
}
|
|
19
|
+
if (motionPaused)
|
|
20
|
+
return undefined;
|
|
21
|
+
const animation = createMotionAnimation(progress, {
|
|
22
|
+
durationMs: motionDurationMs,
|
|
23
|
+
delayMs: motionDelayMs,
|
|
24
|
+
easing: motionEasing,
|
|
25
|
+
repeat: motionRepeat,
|
|
26
|
+
alternate: motionAlternate,
|
|
27
|
+
});
|
|
28
|
+
animation.start();
|
|
29
|
+
return () => animation.stop();
|
|
30
|
+
}, [
|
|
31
|
+
motionAlternate,
|
|
32
|
+
motionDelayMs,
|
|
33
|
+
motionDurationMs,
|
|
34
|
+
motionEasing,
|
|
35
|
+
motionEnabled,
|
|
36
|
+
motionPaused,
|
|
37
|
+
motionRepeat,
|
|
38
|
+
progress,
|
|
39
|
+
signature,
|
|
40
|
+
]);
|
|
41
|
+
return progress;
|
|
42
|
+
}
|
|
43
|
+
/*** Create the one-shot or repeating React Native motion sequence for one entity. */
|
|
44
|
+
function createMotionAnimation(progress, input) {
|
|
45
|
+
const forward = () => Animated.timing(progress, {
|
|
46
|
+
toValue: 1,
|
|
47
|
+
duration: input.durationMs,
|
|
48
|
+
easing: resolveMotionEasing(input.easing),
|
|
49
|
+
useNativeDriver: false,
|
|
50
|
+
});
|
|
51
|
+
const reverse = () => Animated.timing(progress, {
|
|
52
|
+
toValue: 0,
|
|
53
|
+
duration: input.durationMs,
|
|
54
|
+
easing: resolveMotionEasing(input.easing),
|
|
55
|
+
useNativeDriver: false,
|
|
56
|
+
});
|
|
57
|
+
const movement = input.alternate
|
|
58
|
+
? Animated.loop(Animated.sequence([forward(), reverse()]))
|
|
59
|
+
: input.repeat
|
|
60
|
+
? Animated.loop(forward())
|
|
61
|
+
: forward();
|
|
62
|
+
return input.delayMs === 0
|
|
63
|
+
? movement
|
|
64
|
+
: Animated.sequence([Animated.delay(input.delayMs), movement]);
|
|
65
|
+
}
|
|
66
|
+
/*** Create a stable signature for motion parameters that should restart the relative timeline. */
|
|
67
|
+
function createMotionSignature(plan) {
|
|
68
|
+
return [
|
|
69
|
+
plan.motionDurationMs,
|
|
70
|
+
plan.motionDelayMs,
|
|
71
|
+
plan.motionEasing,
|
|
72
|
+
plan.motionEnabled,
|
|
73
|
+
plan.motionRepeat,
|
|
74
|
+
plan.motionAlternate,
|
|
75
|
+
].join(':');
|
|
76
|
+
}
|
|
77
|
+
/*** Map serializable timeline easing names onto React Native easing functions. */
|
|
78
|
+
function resolveMotionEasing(easing) {
|
|
79
|
+
if (easing === 'ease-in')
|
|
80
|
+
return Easing.in(Easing.ease);
|
|
81
|
+
if (easing === 'ease-out')
|
|
82
|
+
return Easing.out(Easing.ease);
|
|
83
|
+
if (easing === 'ease-in-out')
|
|
84
|
+
return Easing.inOut(Easing.ease);
|
|
85
|
+
return Easing.linear;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=useGameEntityMotionProgress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameEntityMotionProgress.js","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useGameEntityMotionProgress.ts"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Animated, Easing } from 'react-native';\n\nimport type { GameEntityEasing } from '../../../types/gamePresentation';\nimport type { GameEntityMotionPlan } from './resolveGameEntityMotionPlan';\n\ninterface MotionAnimationInput {\n readonly durationMs: number;\n readonly delayMs: number;\n readonly easing: GameEntityEasing;\n readonly repeat: boolean;\n readonly alternate: boolean;\n}\n\n/*** Drive one optional relative GameEntity motion timeline without changing game-session state. */\nexport function useGameEntityMotionProgress(plan: GameEntityMotionPlan): Animated.Value {\n const [progress] = React.useState(() => new Animated.Value(0));\n const signature = createMotionSignature(plan);\n const previousSignature = React.useRef(signature);\n const {\n motionEnabled,\n motionPaused,\n motionDurationMs,\n motionDelayMs,\n motionEasing,\n motionRepeat,\n motionAlternate,\n } = plan;\n\n React.useEffect(() => {\n progress.stopAnimation();\n\n if (!motionEnabled) {\n progress.setValue(0);\n return undefined;\n }\n\n if (previousSignature.current !== signature) {\n progress.setValue(0);\n previousSignature.current = signature;\n }\n\n if (motionPaused) return undefined;\n\n const animation = createMotionAnimation(progress, {\n durationMs: motionDurationMs,\n delayMs: motionDelayMs,\n easing: motionEasing,\n repeat: motionRepeat,\n alternate: motionAlternate,\n });\n animation.start();\n return () => animation.stop();\n }, [\n motionAlternate,\n motionDelayMs,\n motionDurationMs,\n motionEasing,\n motionEnabled,\n motionPaused,\n motionRepeat,\n progress,\n signature,\n ]);\n\n return progress;\n}\n\n/*** Create the one-shot or repeating React Native motion sequence for one entity. */\nfunction createMotionAnimation(progress: Animated.Value, input: MotionAnimationInput) {\n const forward = () =>\n Animated.timing(progress, {\n toValue: 1,\n duration: input.durationMs,\n easing: resolveMotionEasing(input.easing),\n useNativeDriver: false,\n });\n const reverse = () =>\n Animated.timing(progress, {\n toValue: 0,\n duration: input.durationMs,\n easing: resolveMotionEasing(input.easing),\n useNativeDriver: false,\n });\n const movement = input.alternate\n ? Animated.loop(Animated.sequence([forward(), reverse()]))\n : input.repeat\n ? Animated.loop(forward())\n : forward();\n\n return input.delayMs === 0\n ? movement\n : Animated.sequence([Animated.delay(input.delayMs), movement]);\n}\n\n/*** Create a stable signature for motion parameters that should restart the relative timeline. */\nfunction createMotionSignature(plan: GameEntityMotionPlan): string {\n return [\n plan.motionDurationMs,\n plan.motionDelayMs,\n plan.motionEasing,\n plan.motionEnabled,\n plan.motionRepeat,\n plan.motionAlternate,\n ].join(':');\n}\n\n/*** Map serializable timeline easing names onto React Native easing functions. */\nfunction resolveMotionEasing(easing: GameEntityEasing) {\n if (easing === 'ease-in') return Easing.in(Easing.ease);\n if (easing === 'ease-out') return Easing.out(Easing.ease);\n if (easing === 'ease-in-out') return Easing.inOut(Easing.ease);\n return Easing.linear;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameReducedMotion.d.ts","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useGameReducedMotion.ts"],"names":[],"mappings":"AAGA,wFAAwF;AACxF,wBAAgB,oBAAoB,IAAI,OAAO,CAU9C"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AccessibilityInfo } from 'react-native';
|
|
3
|
+
/*** Track the cross-platform system reduced-motion preference for game presentation. */
|
|
4
|
+
export function useGameReducedMotion() {
|
|
5
|
+
const [reduceMotion, setReduceMotion] = React.useState(false);
|
|
6
|
+
React.useEffect(() => {
|
|
7
|
+
void AccessibilityInfo.isReduceMotionEnabled().then(setReduceMotion);
|
|
8
|
+
const subscription = AccessibilityInfo.addEventListener('reduceMotionChanged', setReduceMotion);
|
|
9
|
+
return () => subscription.remove();
|
|
10
|
+
}, []);
|
|
11
|
+
return reduceMotion;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=useGameReducedMotion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameReducedMotion.js","sourceRoot":"","sources":["../../../../src/features/game-presentation/utils/useGameReducedMotion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,wFAAwF;AACxF,MAAM,UAAU,oBAAoB;IAClC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,iBAAiB,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC;QAChG,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import React from 'react';\nimport { AccessibilityInfo } from 'react-native';\n\n/*** Track the cross-platform system reduced-motion preference for game presentation. */\nexport function useGameReducedMotion(): boolean {\n const [reduceMotion, setReduceMotion] = React.useState(false);\n\n React.useEffect(() => {\n void AccessibilityInfo.isReduceMotionEnabled().then(setReduceMotion);\n const subscription = AccessibilityInfo.addEventListener('reduceMotionChanged', setReduceMotion);\n return () => subscription.remove();\n }, []);\n\n return reduceMotion;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { GameEntityProps, GameFieldProps, GameInputZoneProps, GameKeyboardBinding, GameMeasurementProbeProps, GameOverlayPlacement, GameOverlayProps, GamePointerEvents, GameProps, } from './features/game-presentation/public';
|
|
1
|
+
export type { GameEntityEasing, GameEntityMotionProps, GameEntityProps, GameFieldProps, GameInputZoneProps, GameKeyboardBinding, GameMeasurementProbeProps, GameOverlayPlacement, GameOverlayProps, GamePointerEvents, GameProps, } from './features/game-presentation/public';
|
|
2
2
|
export { Game, GameEntity, GameField, GameInputZone, GameMeasurementProbe, GameOverlay, } from './features/game-presentation/public';
|
|
3
3
|
export { ZORA_GAME_PLUGIN } from './ZORA_GAME_PLUGIN';
|
|
4
4
|
//# 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,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,GACV,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,WAAW,GACZ,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,GACV,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,WAAW,GACZ,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,WAAW,GACZ,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["export type {\n GameEntityEasing,\n GameEntityMotionProps,\n GameEntityProps,\n GameFieldProps,\n GameInputZoneProps,\n GameKeyboardBinding,\n GameMeasurementProbeProps,\n GameOverlayPlacement,\n GameOverlayProps,\n GamePointerEvents,\n GameProps,\n} from './features/game-presentation/public';\nexport {\n Game,\n GameEntity,\n GameField,\n GameInputZone,\n GameMeasurementProbe,\n GameOverlay,\n} from './features/game-presentation/public';\nexport { ZORA_GAME_PLUGIN } from './ZORA_GAME_PLUGIN';\n"]}
|