genshin-world 3.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/dist/style.css ADDED
@@ -0,0 +1,215 @@
1
+
2
+ /* Laid out on the game's 1920 by 1080 unit screen, scaled to fit the window's height or its width, whichever is less, as the game's interface is */
3
+ .startup-loading[data-v-073287fc] {
4
+ position: absolute;
5
+ inset: 0;
6
+ container-type: size;
7
+ background: #fff;
8
+ }
9
+
10
+ /* The row is as wide as its marks, so the lit row's clip is a share of the row rather than of the screen */
11
+ .marks[data-v-073287fc] {
12
+ --unit: min(100cqh / 1080, 100cqw / 1920);
13
+ position: absolute;
14
+ top: 50%;
15
+ left: 50%;
16
+ display: flex;
17
+ gap: calc(var(--unit) * 4.875);
18
+ translate: -50% -50%;
19
+ /* The marks fade in as the screen starts, and out once loading completes */
20
+ animation: marks-fade-in-073287fc calc(var(--v454a2798) * 1ms) linear;
21
+ }
22
+ .complete[data-v-073287fc] {
23
+ opacity: 0;
24
+ transition: opacity calc(var(--v454a2798) * 1ms) linear;
25
+ }
26
+ @keyframes marks-fade-in-073287fc {
27
+ from {
28
+ opacity: 0;
29
+ }
30
+ }
31
+ .mark[data-v-073287fc] {
32
+ width: calc(var(--unit) * 72);
33
+ height: calc(var(--unit) * 72);
34
+ fill: #f4f4f4;
35
+ }
36
+ .lit .mark[data-v-073287fc] {
37
+ fill: #666;
38
+ }
39
+
40
+ .ornament-divider[data-v-350b6469] {
41
+ position: relative;
42
+ height: calc(var(--unit) * 30);
43
+ fill: #d7d7d7;
44
+ }
45
+ .ornament-divider[data-v-350b6469]::before {
46
+ position: absolute;
47
+ top: 50%;
48
+ right: calc(var(--unit) * 4);
49
+ left: calc(var(--unit) * 4);
50
+ height: calc(var(--unit) * 3);
51
+ background: #d7d7d7;
52
+ content: "";
53
+ translate: 0 -50%;
54
+ }
55
+ .end[data-v-350b6469] {
56
+ position: absolute;
57
+ top: 50%;
58
+ left: 0;
59
+ width: calc(var(--unit) * 30);
60
+ height: calc(var(--unit) * 21);
61
+ translate: 0 -50%;
62
+ }
63
+ .right[data-v-350b6469] {
64
+ right: 0;
65
+ left: auto;
66
+ scale: -1 1;
67
+ }
68
+ .middle[data-v-350b6469] {
69
+ position: absolute;
70
+ top: 0;
71
+ left: 50%;
72
+ width: calc(var(--unit) * 45);
73
+ height: calc(var(--unit) * 30);
74
+ translate: -50% 0;
75
+ }
76
+
77
+ /* Laid out on the game's 1920 by 1080 unit screen, scaled to fit the window's height or its width, whichever is less, as the game's interface is. Measured
78
+ From the English client's notice and held against the Japanese one's at 60 frames: the divider spans the screen's
79
+ Width less 190 units a side and the text 20 units inside it, so a wider screen sets the notice in fewer lines. The
80
+ Sizes are the ones that score best against the English client's notice in Signika (heading 58 units, text 40.5), since
81
+ Its letters are proportioned apart from the game's own face. The text's grey is the Japanese recording's, which the English
82
+ Picture's text agrees with; the English heading is near black, darker than the Japanese one's */
83
+ .health-notice[data-v-fa0b9dd7] {
84
+ position: absolute;
85
+ inset: 0;
86
+ display: grid;
87
+ place-items: center;
88
+ container-type: size;
89
+ background: #fff;
90
+ font-family: var(--v6ea45b08);
91
+ }
92
+ .block[data-v-fa0b9dd7] {
93
+ --unit: min(100cqh / 1080, 100cqw / 1920);
94
+ display: flex;
95
+ flex-direction: column;
96
+ align-items: center;
97
+ width: calc(100cqw - var(--unit) * 380);
98
+ text-align: center;
99
+ }
100
+ .title[data-v-fa0b9dd7] {
101
+ margin: 0;
102
+ color: #1d1d1d;
103
+ font-size: calc(var(--unit) * 58);
104
+ font-weight: 600;
105
+ line-height: calc(var(--unit) * 60);
106
+ }
107
+ .divider[data-v-fa0b9dd7] {
108
+ align-self: stretch;
109
+ margin-top: calc(var(--unit) * 14.5);
110
+ }
111
+ .paragraph[data-v-fa0b9dd7] {
112
+ max-width: calc(100cqw - var(--unit) * 420);
113
+ margin: calc(var(--unit) * 12.5) 0 0;
114
+ color: #656565;
115
+ font-size: calc(var(--unit) * 40.5);
116
+ font-weight: 600;
117
+ line-height: calc(var(--unit) * 48.36);
118
+ }
119
+
120
+ /* A blank line between paragraphs, as the notice sets them */
121
+ .paragraph + .paragraph[data-v-fa0b9dd7] {
122
+ margin-top: calc(var(--unit) * 48.36);
123
+ }
124
+
125
+ /* Laid out on the game's 1920 by 1080 unit screen, scaled to fit the window's height or its width, whichever is less, as the game's interface is */
126
+ .publisher-splash[data-v-fde78ea4] {
127
+ position: absolute;
128
+ inset: 0;
129
+ container-type: size;
130
+ background: #fff;
131
+ }
132
+ .logo[data-v-fde78ea4] {
133
+ --unit: min(100cqh / 1080, 100cqw / 1920);
134
+ position: absolute;
135
+ top: calc(var(--unit) * 465.47);
136
+ left: calc(50% - var(--unit) * 443.43);
137
+ width: calc(var(--unit) * 887.7);
138
+ height: calc(var(--unit) * 155.7);
139
+ }
140
+ .letters[data-v-fde78ea4] {
141
+ position: absolute;
142
+ inset: 0;
143
+ fill: #000;
144
+ }
145
+ .ring-box[data-v-fde78ea4] {
146
+ position: absolute;
147
+ top: var(--v04c5d2bf);
148
+ left: var(--d81e8846);
149
+ width: var(--v2a78e6a0);
150
+ height: var(--v53df0f7d);
151
+ }
152
+
153
+ /* The logo's glow is its ring blurred by 8 of its units at half opacity; a filter on the masked element itself would
154
+ Blur the colours before the mask cuts them, so it sits on a wrapper */
155
+ .glow[data-v-fde78ea4] {
156
+ filter: blur(calc(var(--unit) * 6.1));
157
+ opacity: 0.5;
158
+ }
159
+ .ring[data-v-fde78ea4] {
160
+ width: 100%;
161
+ height: 100%;
162
+ background: conic-gradient(
163
+ #9cf4ff 0deg,
164
+ #acfeff 15deg,
165
+ #c1f6ff 30deg,
166
+ #9bf6ff 45deg,
167
+ #d6e3fe 60deg,
168
+ #fbbbf1 75deg,
169
+ #f5b3f0 90deg,
170
+ #b39efb 105deg,
171
+ #a79fff 120deg,
172
+ #b0a9ff 135deg,
173
+ #a7aaff 150deg,
174
+ #93adff 165deg,
175
+ #81b0ff 180deg,
176
+ #7bb1ff 195deg,
177
+ #7ab1ff 210deg,
178
+ #7ab1ff 315deg,
179
+ #7db8ff 330deg,
180
+ #8bd6ff 345deg,
181
+ #9cf4ff 360deg
182
+ );
183
+ mask: var(--d81dba7c) center / 100% 100% no-repeat;
184
+ }
185
+
186
+ /* Laid out on the game's 1920 by 1080 unit screen, scaled to fit the window's height or its width, whichever is less, as the game's interface is */
187
+ .title-splash[data-v-f6484a1d] {
188
+ position: absolute;
189
+ inset: 0;
190
+ container-type: size;
191
+ background: #fff;
192
+ }
193
+
194
+ /* Its box placed so its ink sits where the English client's does: 590 units wide, 420 down, a hair left of centre,
195
+ In the flat grey the game draws its title in on the splash */
196
+ .logo[data-v-f6484a1d] {
197
+ --unit: min(100cqh / 1080, 100cqw / 1920);
198
+ position: absolute;
199
+ top: calc(50% - var(--unit) * 129.55);
200
+ left: calc(50% - var(--unit) * 306.9);
201
+ width: calc(var(--unit) * 611.4);
202
+ aspect-ratio: 3840 / 1453;
203
+ fill: #333;
204
+ }
205
+
206
+ .splash-sequence[data-v-5365cce4] {
207
+ position: absolute;
208
+ inset: 0;
209
+ background: #fff;
210
+ }
211
+ .stage[data-v-5365cce4] {
212
+ position: absolute;
213
+ inset: 0;
214
+ opacity: 0;
215
+ }
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,18 @@
1
+ import { n as getWindriseHeight, t as writeWindriseColor } from "./writeWindriseColor-COtmALzZ.js";
2
+ import { computeTerrainTile } from "genshin-engine";
3
+ //#region src/workers/terrainTile.worker.ts
4
+ self.addEventListener("message", (event) => {
5
+ const terrainTile = computeTerrainTile({
6
+ ...event.data,
7
+ getHeight: getWindriseHeight,
8
+ writeColor: writeWindriseColor
9
+ });
10
+ const { coarsePositions, colors, normals, positions } = terrainTile;
11
+ self.postMessage(terrainTile, { transfer: [
12
+ coarsePositions.buffer,
13
+ colors.buffer,
14
+ normals.buffer,
15
+ positions.buffer
16
+ ] });
17
+ });
18
+ //#endregion
@@ -0,0 +1,249 @@
1
+ import { createSimplexNoise } from "genshin-engine";
2
+ import { Color, Vector2 } from "three";
3
+ //#region src/services/windrise/constants.ts
4
+ const WINDRISE_TERRAIN_OPTIONS = {
5
+ cellsPerSide: 32,
6
+ finestRange: 48,
7
+ finestTileSize: 16,
8
+ levelCount: 6,
9
+ maxHeight: 60,
10
+ minHeight: -10,
11
+ morphShare: .3
12
+ };
13
+ const WINDRISE_SEED = 0;
14
+ const KNOLL_HEIGHT = 9;
15
+ const KNOLL_RADIUS = 40;
16
+ const RIM_HEIGHT = 38;
17
+ const RIM_START_RADIUS = 110;
18
+ const RIM_END_RADIUS = 230;
19
+ const DETAIL_HEIGHT = 1.4;
20
+ const DETAIL_SCALE = 45;
21
+ const EAST_OPENING = .85;
22
+ const LAKE_CENTER_X = 300;
23
+ const LAKE_CENTER_Z = 40;
24
+ const LAKE_RADIUS = 150;
25
+ const LAKE_DEPTH = 14;
26
+ const WATER_LEVEL = -3;
27
+ const WATER_SHALLOW_COLOR = 6280136;
28
+ const WATER_DEEP_COLOR = 1925032;
29
+ const WATER_DEEP_DEPTH = 6;
30
+ const WATER_FOAM_DEPTH = .6;
31
+ const WATER_CAUSTIC_STRENGTH = .35;
32
+ const UNDERWATER_FOG_COLOR = 2062982;
33
+ const UNDERWATER_FOG_DENSITY = .08;
34
+ const SUN_DISTANCE = 120;
35
+ const RIM_STRENGTH = .55;
36
+ const GRASS_LIGHT_COLOR = 10408026;
37
+ const GRASS_DARK_COLOR = 6266427;
38
+ const ROCK_COLOR = 10261638;
39
+ const BARK_COLOR = 7031347;
40
+ const LEAF_COLOR = 7319103;
41
+ const STONE_COLOR = 14275265;
42
+ const ROCK_SLOPE = .3;
43
+ const WINDRISE_RAMP_OPTIONS = {
44
+ resolution: 64,
45
+ softness: .08,
46
+ terminator: .52
47
+ };
48
+ const FOG_DENSITY = .0024;
49
+ const FOG_HEIGHT_FALLOFF = .02;
50
+ const FOG_START_DISTANCE = 60;
51
+ const SHADOW_MAX_FAR = 320;
52
+ const GODRAYS_SHADOW_MAP_SIZE = 1024;
53
+ const GODRAYS_HALF_EXTENT = 160;
54
+ const WINDRISE_GRADE_OPTIONS = {
55
+ contrast: 1.06,
56
+ highlightTint: [
57
+ .03,
58
+ .015,
59
+ -.015
60
+ ],
61
+ saturation: 1.12,
62
+ shadowTint: [
63
+ -.01,
64
+ 0,
65
+ .04
66
+ ],
67
+ size: 32
68
+ };
69
+ const WINDRISE_START_MINUTES = 900;
70
+ const SUN_TILT = .45;
71
+ const CLOUD_COVERAGE = .42;
72
+ const WIND_DIRECTION = new Vector2(.94, .34).normalize();
73
+ const WIND_STRENGTH = .3;
74
+ const WIND_GUST_STRENGTH = .45;
75
+ const WIND_GUST_WIDTH = 30;
76
+ const WIND_GUST_SPEED = 7;
77
+ const GRASS_BLADE_HEIGHT = .5;
78
+ const GRASS_BLADE_WIDTH = .08;
79
+ const NEAR_GRASS_RING = {
80
+ cellsPerSide: 256,
81
+ fadeEnd: 38,
82
+ fadeStart: 28,
83
+ innerRadius: 0,
84
+ scale: 1,
85
+ spacing: .3
86
+ };
87
+ const MIDDLE_GRASS_RING = {
88
+ cellsPerSide: 192,
89
+ fadeEnd: 76,
90
+ fadeStart: 56,
91
+ innerRadius: 30,
92
+ scale: 1.7,
93
+ spacing: .8
94
+ };
95
+ const WINDRISE_SKY_KEYFRAMES = [
96
+ {
97
+ cloudLitColor: new Color(3953288),
98
+ cloudShadeColor: new Color(1911372),
99
+ hemisphereGroundColor: new Color(1714730),
100
+ hemisphereIntensity: .7,
101
+ hemisphereSkyColor: new Color(2901112),
102
+ horizonColor: new Color(2046056),
103
+ lightColor: new Color(9414911),
104
+ lightIntensity: .45,
105
+ minutes: 0,
106
+ starIntensity: 1,
107
+ zenithColor: new Color(727610)
108
+ },
109
+ {
110
+ cloudLitColor: new Color(6974104),
111
+ cloudShadeColor: new Color(3028064),
112
+ hemisphereGroundColor: new Color(2240554),
113
+ hemisphereIntensity: .65,
114
+ hemisphereSkyColor: new Color(3690114),
115
+ horizonColor: new Color(5921418),
116
+ lightColor: new Color(9414911),
117
+ lightIntensity: .3,
118
+ minutes: 300,
119
+ starIntensity: .6,
120
+ zenithColor: new Color(1912158)
121
+ },
122
+ {
123
+ cloudLitColor: new Color(16763048),
124
+ cloudShadeColor: new Color(9075360),
125
+ hemisphereGroundColor: new Color(4872762),
126
+ hemisphereIntensity: .8,
127
+ hemisphereSkyColor: new Color(8031420),
128
+ horizonColor: new Color(15903114),
129
+ lightColor: new Color(16756864),
130
+ lightIntensity: .05,
131
+ minutes: 360,
132
+ starIntensity: .1,
133
+ zenithColor: new Color(4876968)
134
+ },
135
+ {
136
+ cloudLitColor: new Color(16770252),
137
+ cloudShadeColor: new Color(11049144),
138
+ hemisphereGroundColor: new Color(6978116),
139
+ hemisphereIntensity: 1,
140
+ hemisphereSkyColor: new Color(10139872),
141
+ horizonColor: new Color(16764832),
142
+ lightColor: new Color(16763024),
143
+ lightIntensity: 1.4,
144
+ minutes: 420,
145
+ starIntensity: 0,
146
+ zenithColor: new Color(6987480)
147
+ },
148
+ {
149
+ cloudLitColor: new Color(16777215),
150
+ cloudShadeColor: new Color(12110050),
151
+ hemisphereGroundColor: new Color(6127418),
152
+ hemisphereIntensity: 1.3,
153
+ hemisphereSkyColor: new Color(9357567),
154
+ horizonColor: new Color(13625599),
155
+ lightColor: new Color(16774888),
156
+ lightIntensity: 2.8,
157
+ minutes: 720,
158
+ starIntensity: 0,
159
+ zenithColor: new Color(4165606)
160
+ },
161
+ {
162
+ cloudLitColor: new Color(16777215),
163
+ cloudShadeColor: new Color(12372706),
164
+ hemisphereGroundColor: new Color(6127418),
165
+ hemisphereIntensity: 1.3,
166
+ hemisphereSkyColor: new Color(9357567),
167
+ horizonColor: new Color(13625599),
168
+ lightColor: new Color(16774368),
169
+ lightIntensity: 2.6,
170
+ minutes: 900,
171
+ starIntensity: 0,
172
+ zenithColor: new Color(5019884)
173
+ },
174
+ {
175
+ cloudLitColor: new Color(16765096),
176
+ cloudShadeColor: new Color(9074856),
177
+ hemisphereGroundColor: new Color(5922872),
178
+ hemisphereIntensity: 1.05,
179
+ hemisphereSkyColor: new Color(10130632),
180
+ horizonColor: new Color(16759416),
181
+ lightColor: new Color(16756326),
182
+ lightIntensity: 1.5,
183
+ minutes: 1020,
184
+ starIntensity: 0,
185
+ zenithColor: new Color(5929152)
186
+ },
187
+ {
188
+ cloudLitColor: new Color(15243944),
189
+ cloudShadeColor: new Color(5917320),
190
+ hemisphereGroundColor: new Color(3817522),
191
+ hemisphereIntensity: .8,
192
+ hemisphereSkyColor: new Color(6972584),
193
+ horizonColor: new Color(14256800),
194
+ lightColor: new Color(16747120),
195
+ lightIntensity: .05,
196
+ minutes: 1080,
197
+ starIntensity: .2,
198
+ zenithColor: new Color(3816582)
199
+ },
200
+ {
201
+ cloudLitColor: new Color(4872336),
202
+ cloudShadeColor: new Color(2239570),
203
+ hemisphereGroundColor: new Color(1977388),
204
+ hemisphereIntensity: .7,
205
+ hemisphereSkyColor: new Color(3425914),
206
+ horizonColor: new Color(3817336),
207
+ lightColor: new Color(9414911),
208
+ lightIntensity: .35,
209
+ minutes: 1140,
210
+ starIntensity: .8,
211
+ zenithColor: new Color(1450572)
212
+ }
213
+ ];
214
+ //#endregion
215
+ //#region src/services/windrise/getWindriseHeight.ts
216
+ const noise$1 = createSimplexNoise(0);
217
+ const smoothstep = (edge0, edge1, value) => {
218
+ const progress = Math.min(Math.max((value - edge0) / (edge1 - edge0), 0), 1);
219
+ return progress * progress * (3 - 2 * progress);
220
+ };
221
+ const getWindriseHeight = (x, z) => {
222
+ const radius = Math.hypot(x, z);
223
+ const knoll = 9 * Math.exp(-((radius / 40) ** 2));
224
+ const eastness = radius === 0 ? 0 : x / radius;
225
+ const opening = 1 - EAST_OPENING * smoothstep(.3, .9, eastness);
226
+ const rim = 38 * smoothstep(110, 230, radius) * opening;
227
+ const lakeDistance = Math.hypot(x - 300, z - 40);
228
+ const lake = 14 * (1 - smoothstep(60, 150, lakeDistance));
229
+ const detailFade = Math.min(radius / 40, 1);
230
+ return knoll + rim - lake + DETAIL_HEIGHT * detailFade * noise$1(x / 45, z / 45);
231
+ };
232
+ //#endregion
233
+ //#region src/services/windrise/writeWindriseColor.ts
234
+ const GRASS_PATCH_SCALE = 18;
235
+ const noise = createSimplexNoise(1);
236
+ const grassLight = new Color(GRASS_LIGHT_COLOR);
237
+ const grassDark = new Color(GRASS_DARK_COLOR);
238
+ const rock = new Color(ROCK_COLOR);
239
+ const blended = new Color();
240
+ const writeWindriseColor = (colors, offset, _height, slope, x, z) => {
241
+ const patch = (noise(x / GRASS_PATCH_SCALE, z / GRASS_PATCH_SCALE) + 1) / 2;
242
+ blended.lerpColors(grassDark, grassLight, patch);
243
+ if (slope > .3) blended.lerp(rock, Math.min((slope - ROCK_SLOPE) * 4, 1));
244
+ colors[offset] = blended.r;
245
+ colors[offset + 1] = blended.g;
246
+ colors[offset + 2] = blended.b;
247
+ };
248
+ //#endregion
249
+ export { WIND_GUST_WIDTH as $, ROCK_COLOR as A, WATER_DEEP_DEPTH as B, LEAF_COLOR as C, RIM_HEIGHT as D, RIM_END_RADIUS as E, SUN_TILT as F, WINDRISE_RAMP_OPTIONS as G, WATER_LEVEL as H, UNDERWATER_FOG_COLOR as I, WINDRISE_START_MINUTES as J, WINDRISE_SEED as K, UNDERWATER_FOG_DENSITY as L, SHADOW_MAX_FAR as M, STONE_COLOR as N, RIM_START_RADIUS as O, SUN_DISTANCE as P, WIND_GUST_STRENGTH as Q, WATER_CAUSTIC_STRENGTH as R, LAKE_RADIUS as S, NEAR_GRASS_RING as T, WATER_SHALLOW_COLOR as U, WATER_FOAM_DEPTH as V, WINDRISE_GRADE_OPTIONS as W, WIND_DIRECTION as X, WINDRISE_TERRAIN_OPTIONS as Y, WIND_GUST_SPEED as Z, KNOLL_HEIGHT as _, DETAIL_HEIGHT as a, LAKE_CENTER_Z as b, FOG_DENSITY as c, GODRAYS_HALF_EXTENT as d, WIND_STRENGTH as et, GODRAYS_SHADOW_MAP_SIZE as f, GRASS_LIGHT_COLOR as g, GRASS_DARK_COLOR as h, CLOUD_COVERAGE as i, ROCK_SLOPE as j, RIM_STRENGTH as k, FOG_HEIGHT_FALLOFF as l, GRASS_BLADE_WIDTH as m, getWindriseHeight as n, DETAIL_SCALE as o, GRASS_BLADE_HEIGHT as p, WINDRISE_SKY_KEYFRAMES as q, BARK_COLOR as r, EAST_OPENING as s, writeWindriseColor as t, FOG_START_DISTANCE as u, KNOLL_RADIUS as v, MIDDLE_GRASS_RING as w, LAKE_DEPTH as x, LAKE_CENTER_X as y, WATER_DEEP_COLOR as z };
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "genshin-world",
3
+ "version": "3.7.0",
4
+ "description": "Genshin Impact's world as a fan recreation: the catalogue of regions and areas, each region's authored data, and the TresJS components that build it on genshin-engine.",
5
+ "keywords": [
6
+ "genshin-engine",
7
+ "open-world",
8
+ "three",
9
+ "threejs",
10
+ "tresjs",
11
+ "vue",
12
+ "webgpu"
13
+ ],
14
+ "homepage": "https://github.com/Esposter/Esposter/blob/main/packages/genshin-world#readme",
15
+ "bugs": {
16
+ "url": "https://github.com/Esposter/Esposter/issues"
17
+ },
18
+ "license": "Apache-2.0",
19
+ "author": "Jimmy Chen",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/Esposter/Esposter.git"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "type": "module",
28
+ "sideEffects": false,
29
+ "types": "dist/index.d.ts",
30
+ "imports": {
31
+ "#parity/*": "./parity/*.ts",
32
+ "#src/*": "./src/*.ts",
33
+ "#src/*.json": "./src/*.json",
34
+ "#src/*.vue": "./src/*.vue"
35
+ },
36
+ "exports": {
37
+ ".": "./dist/index.js",
38
+ "./terrainTileWorker": "./dist/terrainTileWorker.js",
39
+ "./package.json": "./package.json",
40
+ "./style.css": "./dist/style.css"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "scripts": {
46
+ "build": "tsdown",
47
+ "format": "oxfmt",
48
+ "format:check": "oxfmt --check",
49
+ "lint": "eslint .",
50
+ "lint:fix": "eslint --fix .",
51
+ "parity": "vite --config parity/vite.config.ts --port 3002 --strictPort",
52
+ "test": "vitest",
53
+ "test:visual": "vitest --config vitest.browser.config.ts",
54
+ "typecheck": "vue-tsc"
55
+ },
56
+ "devDependencies": {
57
+ "@esposter/configuration": "3.7.0",
58
+ "@fontsource/signika": "^5.3.0",
59
+ "@tsdown/css": "^0.23.0",
60
+ "@types/node": "^26.6.3",
61
+ "@types/three": "^0.186.0",
62
+ "@vitest/browser-playwright": "^5.0.2",
63
+ "playwright": "^1.63.0",
64
+ "tsdown": "^0.23.0",
65
+ "vite": "^8.3.1",
66
+ "vitest": "^5.0.2",
67
+ "vitest-browser-vue": "^3.1.0",
68
+ "vue-tsc": "^3.3.11"
69
+ },
70
+ "peerDependencies": {
71
+ "@esposter/shared": "3.6.0",
72
+ "@tresjs/cientos": "^5.9.1",
73
+ "@tresjs/core": "^5.9.1",
74
+ "@vueuse/core": "^15.0.0",
75
+ "genshin-engine": "3.6.0",
76
+ "three": "^0.186.1",
77
+ "vue": "^3.5.43",
78
+ "zod": "^4.6.5"
79
+ },
80
+ "gitHead": "7fd06688d06adf6dafff4bd869cd7a33d8028688"
81
+ }