create-three-blocks-starter 0.4.1 → 0.4.2-alpha.314.g989237b8fb54

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 CHANGED
@@ -1,5 +1,38 @@
1
1
  # create-three-blocks-starter
2
2
 
3
+ ## 0.4.2-alpha.314.g989237b8fb54
4
+
5
+ - Website: The home setup story now presents the starter, AI skill, and Pro Tools clearly.
6
+
7
+ - Website: The home page now shows the current Three Blocks version.
8
+
9
+ - Website: Email sign-in is open to everyone without a waitlist gate.
10
+
11
+ - Website: Checkout now charges the displayed Pro price for each billing period.
12
+
13
+ - Website: Device authorization waits until the page is ready before accepting clicks.
14
+
15
+ - Website: Mobile examples now retain their intended rendering resolution.
16
+
17
+ - Website: Login now shows the runnable npx command for signing in from a terminal.
18
+
19
+ - Website: Example captions now stay compact on mobile and match the site on desktop.
20
+
21
+ - Library: Baked Motion holds the last complete view while streamed samples load.
22
+
23
+ - Devtools: Long-running commands now show static progress instead of a spinning indicator.
24
+
25
+ - Devtools: Asset optimization compresses models and textures and tracks reusable outputs.
26
+
27
+ - Packages: MSDF text stays crisp and color-accurate across display resolutions.
28
+
29
+ - CLI: Asset optimization adds Vite config status for project models and textures.
30
+
31
+ - CLI: Blender sign-in now tolerates twenty times more redirects before asking you to retry.
32
+
33
+ - Packages: Built from `989237b8fb54`.
34
+
35
+
3
36
  ## 0.4.1
4
37
 
5
38
  ### Patch Changes
package/dist/constants.js CHANGED
@@ -9,7 +9,7 @@ export const GENERATOR_VERSION = (() => {
9
9
  export const RESULT_PROTOCOL_VERSION = 1;
10
10
  export const COMPATIBILITY_VERSIONS = Object.freeze({
11
11
  three: '0.185.1',
12
- threeBlocks: '0.4.0',
12
+ threeBlocks: '0.5.0-alpha.314.g989237b8fb54',
13
13
  lenis: '1.3.25',
14
14
  statsGl: '4.2.3',
15
15
  });
package/dist/generate.js CHANGED
@@ -148,7 +148,7 @@ async function writeResultFile(resultFile, result) {
148
148
  throw error;
149
149
  }
150
150
  }
151
- const DEVTOOLS_SPECIFIER = '@three-blocks/devtools@^0.1.0';
151
+ const DEVTOOLS_SPECIFIER = '@three-blocks/devtools@4.0.0-alpha.314.g989237b8fb54';
152
152
  /**
153
153
  * Best-effort devDependency: a project-local `@three-blocks/devtools` makes
154
154
  * `three-blocks status`, shader capture, and browser smoke instant, offline,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-three-blocks-starter",
3
- "version": "0.4.1",
3
+ "version": "0.4.2-alpha.314.g989237b8fb54",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Create a typed, worker-first Three Blocks project",
@@ -61,5 +61,9 @@
61
61
  "typescript": "^5.9.3",
62
62
  "typescript-eslint": "^8.62.1",
63
63
  "vitest": "^4.1.8"
64
+ },
65
+ "threeBlocks": {
66
+ "channel": "alpha",
67
+ "site": "https://preprod.threejs-blocks.com"
64
68
  }
65
69
  }
@@ -1,74 +1,74 @@
1
1
  {
2
- "runtime": {
3
- "capture": {
4
- "adapter": "WebGPU adapter",
5
- "features": [],
6
- "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/149.0.7827.55 Safari/537.36"
7
- },
8
- "three": "0.185.1",
9
- "threeBlocks": "0.2.0",
10
- "threeBlocksShaderClosure": "64e2e021698f0bbb6e72c59c6112fa003450b50938cd226626eaaae0886dcb00"
11
- },
12
- "scenes": {
13
- "scene": {
14
- "artifact": "scene.webgpu.ts",
15
- "artifactHash": "dba00cdd352fd608996620150a3b0ed1a1f74dbb4d1ab52fdc7609ffdb095329",
16
- "asset": "three-blocks/shaders/scene.webgpu.json",
17
- "assetHash": "6b0791f92e1f1a622f81aa848ffe903c5480d175557ab9cb0645b20b16f28ec9",
18
- "backend": "webgpu",
19
- "bytes": 73871,
20
- "coverage": {
21
- "compute": 0,
22
- "fragment": 6,
23
- "render": 6,
24
- "vertex": 6
25
- },
26
- "inputs": {
27
- "src/assets.ts": "ec86aea62751663409bd59264ddd53f028ae716ede15a30bc699d10ea175a5ca",
28
- "src/look.ts": "c0639402db78e361efb099d5c775246bde7b76050fac0958fc9b7db0d0b1bd5a",
29
- "src/scene.ts": "f5ea470cb0a169221e1fd57bf9623c1c211abb32da5cb7d98bf25740794ada4b"
30
- },
31
- "skipped": {
32
- "compute": 0,
33
- "render": 0
34
- }
35
- },
36
- "scene.webgl": {
37
- "artifact": "scene.webgl.ts",
38
- "artifactHash": "775bbf59e097684fa61ec1b9e4218d0afa2d571502361bb8fe5b67adc8a8f2f8",
39
- "asset": "three-blocks/shaders/scene.webgl.json",
40
- "assetHash": "6072302db1be477c29e01515d321dfa2ab1d7c9fdafed0a331300b353095996c",
41
- "backend": "webgl",
42
- "bytes": 106874,
43
- "coverage": {
44
- "compute": 0,
45
- "fragment": 6,
46
- "render": 6,
47
- "vertex": 6
48
- },
49
- "inputs": {
50
- "src/assets.ts": "ec86aea62751663409bd59264ddd53f028ae716ede15a30bc699d10ea175a5ca",
51
- "src/look.ts": "c0639402db78e361efb099d5c775246bde7b76050fac0958fc9b7db0d0b1bd5a",
52
- "src/scene.ts": "f5ea470cb0a169221e1fd57bf9623c1c211abb32da5cb7d98bf25740794ada4b"
53
- },
54
- "skipped": {
55
- "compute": 0,
56
- "render": 0
57
- }
58
- }
59
- },
60
- "schemaVersion": 2,
61
- "tool": {
62
- "address": 2,
63
- "compatibilities": {
64
- "webgl": "three-webgl-r185-v1",
65
- "webgpu": "three-webgpu-r185-v1"
66
- },
67
- "compatibility": "three-webgpu-r185-v1",
68
- "hydration": 2,
69
- "name": "@three-blocks/devtools",
70
- "recipe": 1,
71
- "transform": 62,
72
- "version": "0.1.0"
73
- }
2
+ "runtime": {
3
+ "capture": {
4
+ "adapter": "WebGPU adapter",
5
+ "features": [],
6
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/149.0.7827.55 Safari/537.36"
7
+ },
8
+ "three": "0.185.1",
9
+ "threeBlocks": "0.5.0-alpha.314.g989237b8fb54",
10
+ "threeBlocksShaderClosure": "64e2e021698f0bbb6e72c59c6112fa003450b50938cd226626eaaae0886dcb00"
11
+ },
12
+ "scenes": {
13
+ "scene": {
14
+ "artifact": "scene.webgpu.ts",
15
+ "artifactHash": "6165b757aa9cc505de60c81e6fae24249f4bc77451475b5c204d0739f2e059fd",
16
+ "asset": "three-blocks/shaders/scene.webgpu.json",
17
+ "assetHash": "b0d70e6ffadaf379deb3fb6a77ffaebe6c888b4208a732c795322da18cafb1e3",
18
+ "backend": "webgpu",
19
+ "bytes": 73895,
20
+ "coverage": {
21
+ "compute": 0,
22
+ "fragment": 6,
23
+ "render": 6,
24
+ "vertex": 6
25
+ },
26
+ "inputs": {
27
+ "src/assets.ts": "ec86aea62751663409bd59264ddd53f028ae716ede15a30bc699d10ea175a5ca",
28
+ "src/look.ts": "c0639402db78e361efb099d5c775246bde7b76050fac0958fc9b7db0d0b1bd5a",
29
+ "src/scene.ts": "f5ea470cb0a169221e1fd57bf9623c1c211abb32da5cb7d98bf25740794ada4b"
30
+ },
31
+ "skipped": {
32
+ "compute": 0,
33
+ "render": 0
34
+ }
35
+ },
36
+ "scene.webgl": {
37
+ "artifact": "scene.webgl.ts",
38
+ "artifactHash": "359cf35e8fc333fba07ccfb8a8325db3352ead4b456e9e63880c657f6f4a2b81",
39
+ "asset": "three-blocks/shaders/scene.webgl.json",
40
+ "assetHash": "b91ad81c9e47ad818f972e63dd57bf7a0321ba89c5048905fe6cb02bb15ea1ba",
41
+ "backend": "webgl",
42
+ "bytes": 106898,
43
+ "coverage": {
44
+ "compute": 0,
45
+ "fragment": 6,
46
+ "render": 6,
47
+ "vertex": 6
48
+ },
49
+ "inputs": {
50
+ "src/assets.ts": "ec86aea62751663409bd59264ddd53f028ae716ede15a30bc699d10ea175a5ca",
51
+ "src/look.ts": "c0639402db78e361efb099d5c775246bde7b76050fac0958fc9b7db0d0b1bd5a",
52
+ "src/scene.ts": "f5ea470cb0a169221e1fd57bf9623c1c211abb32da5cb7d98bf25740794ada4b"
53
+ },
54
+ "skipped": {
55
+ "compute": 0,
56
+ "render": 0
57
+ }
58
+ }
59
+ },
60
+ "schemaVersion": 2,
61
+ "tool": {
62
+ "address": 2,
63
+ "compatibilities": {
64
+ "webgl": "three-webgl-r185-v1",
65
+ "webgpu": "three-webgpu-r185-v1"
66
+ },
67
+ "compatibility": "three-webgpu-r185-v1",
68
+ "hydration": 2,
69
+ "name": "@three-blocks/devtools",
70
+ "recipe": 1,
71
+ "transform": 62,
72
+ "version": "4.0.0-alpha.314.g989237b8fb54"
73
+ }
74
74
  }
@@ -1500,7 +1500,7 @@ export default {
1500
1500
  }
1501
1501
  ],
1502
1502
  "three": "0.185.1",
1503
- "threeBlocks": "0.2.0",
1503
+ "threeBlocks": "0.5.0-alpha.314.g989237b8fb54",
1504
1504
  "updatePlans": [
1505
1505
  [3,6,4,7,8,0,9],
1506
1506
  [],
@@ -883,7 +883,7 @@ export default {
883
883
  }
884
884
  ],
885
885
  "three": "0.185.1",
886
- "threeBlocks": "0.2.0",
886
+ "threeBlocks": "0.5.0-alpha.314.g989237b8fb54",
887
887
  "updatePlans": [
888
888
  [2,5,3,6,7,8],
889
889
  [],
@@ -1,28 +1,28 @@
1
1
  {
2
- "adapter": "WebGL adapter",
3
- "measuredAt": "2026-07-29T10:15:46.559Z",
4
- "platform": "darwin/arm64",
5
- "receiptHash": "85c94a5e7eb14ded22c7a1dbf91f1538b11ecd1695693c33cb58bda928ccae92",
6
- "scenes": {
7
- "scene": {
8
- "avoidedBuildMs": 28.299999952316284,
9
- "builds": 6,
10
- "liveBuildMs": 28.299999952316284,
11
- "precompiledBuildMs": 0,
12
- "runs": 1,
13
- "setupMeasured": false,
14
- "spreadMs": 0
15
- },
16
- "scene.webgl": {
17
- "avoidedBuildMs": 28.600000143051147,
18
- "builds": 6,
19
- "liveBuildMs": 28.600000143051147,
20
- "precompiledBuildMs": 0,
21
- "runs": 1,
22
- "setupMeasured": false,
23
- "spreadMs": 0
24
- }
25
- },
26
- "schemaVersion": 3,
27
- "source": "committed-capture"
2
+ "adapter": "WebGL adapter",
3
+ "measuredAt": "2026-07-29T10:15:46.559Z",
4
+ "platform": "darwin/arm64",
5
+ "receiptHash": "a24d952cf13245e6fd96f4a91f07c403acd5baf506d1a8f9fad8da7dae5626db",
6
+ "scenes": {
7
+ "scene": {
8
+ "avoidedBuildMs": 28.299999952316284,
9
+ "builds": 6,
10
+ "liveBuildMs": 28.299999952316284,
11
+ "precompiledBuildMs": 0,
12
+ "runs": 1,
13
+ "setupMeasured": false,
14
+ "spreadMs": 0
15
+ },
16
+ "scene.webgl": {
17
+ "avoidedBuildMs": 28.600000143051147,
18
+ "builds": 6,
19
+ "liveBuildMs": 28.600000143051147,
20
+ "precompiledBuildMs": 0,
21
+ "runs": 1,
22
+ "setupMeasured": false,
23
+ "spreadMs": 0
24
+ }
25
+ },
26
+ "schemaVersion": 3,
27
+ "source": "committed-capture"
28
28
  }
@@ -1,74 +1,74 @@
1
1
  {
2
- "runtime": {
3
- "capture": {
4
- "adapter": "WebGPU adapter",
5
- "features": [],
6
- "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/149.0.7827.55 Safari/537.36"
7
- },
8
- "three": "0.185.1",
9
- "threeBlocks": "0.2.0",
10
- "threeBlocksShaderClosure": "64e2e021698f0bbb6e72c59c6112fa003450b50938cd226626eaaae0886dcb00"
11
- },
12
- "scenes": {
13
- "text": {
14
- "artifact": "text.webgpu.ts",
15
- "artifactHash": "9d63a4a184ed36f11d9eecf6745cee31cda8ce1411944621981e570aee8b211a",
16
- "asset": "three-blocks/shaders/text.webgpu.json",
17
- "assetHash": "320d7e00455e4f98b89d06548e3c7e040e93a7338f6e844fa31462c0827ea458",
18
- "backend": "webgpu",
19
- "bytes": 105555,
20
- "coverage": {
21
- "compute": 0,
22
- "fragment": 8,
23
- "render": 8,
24
- "vertex": 8
25
- },
26
- "inputs": {
27
- "src/assets.ts": "ec86aea62751663409bd59264ddd53f028ae716ede15a30bc699d10ea175a5ca",
28
- "src/look.ts": "c0639402db78e361efb099d5c775246bde7b76050fac0958fc9b7db0d0b1bd5a",
29
- "src/scene.ts": "359b087788fc51d75eea076e2f0e9d087da6910c77532c87f1441eaddb160c8a"
30
- },
31
- "skipped": {
32
- "compute": 0,
33
- "render": 0
34
- }
35
- },
36
- "text.webgl": {
37
- "artifact": "text.webgl.ts",
38
- "artifactHash": "5a8f14d026642615632c335e34f9d18ebe3ec88dc1ceb86ad3e2bc5d39fe5737",
39
- "asset": "three-blocks/shaders/text.webgl.json",
40
- "assetHash": "d42e8b9ae600efbfa702417e7ed2848a7661fed49a2013807ce37ad2b2ec8cc9",
41
- "backend": "webgl",
42
- "bytes": 107237,
43
- "coverage": {
44
- "compute": 0,
45
- "fragment": 4,
46
- "render": 4,
47
- "vertex": 4
48
- },
49
- "inputs": {
50
- "src/assets.ts": "ec86aea62751663409bd59264ddd53f028ae716ede15a30bc699d10ea175a5ca",
51
- "src/look.ts": "c0639402db78e361efb099d5c775246bde7b76050fac0958fc9b7db0d0b1bd5a",
52
- "src/scene.ts": "359b087788fc51d75eea076e2f0e9d087da6910c77532c87f1441eaddb160c8a"
53
- },
54
- "skipped": {
55
- "compute": 0,
56
- "render": 4
57
- }
58
- }
59
- },
60
- "schemaVersion": 2,
61
- "tool": {
62
- "address": 2,
63
- "compatibilities": {
64
- "webgl": "three-webgl-r185-v1",
65
- "webgpu": "three-webgpu-r185-v1"
66
- },
67
- "compatibility": "three-webgpu-r185-v1",
68
- "hydration": 2,
69
- "name": "@three-blocks/devtools",
70
- "recipe": 1,
71
- "transform": 62,
72
- "version": "0.1.0"
73
- }
2
+ "runtime": {
3
+ "capture": {
4
+ "adapter": "WebGPU adapter",
5
+ "features": [],
6
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/149.0.7827.55 Safari/537.36"
7
+ },
8
+ "three": "0.185.1",
9
+ "threeBlocks": "0.5.0-alpha.314.g989237b8fb54",
10
+ "threeBlocksShaderClosure": "64e2e021698f0bbb6e72c59c6112fa003450b50938cd226626eaaae0886dcb00"
11
+ },
12
+ "scenes": {
13
+ "text": {
14
+ "artifact": "text.webgpu.ts",
15
+ "artifactHash": "d36ce2a36a9792103b79982ec724c1905d67f5d37d11a81da499e65a3c3d81a4",
16
+ "asset": "three-blocks/shaders/text.webgpu.json",
17
+ "assetHash": "412466c147ad419f112ffdb57a184ce21467f1746c67f317f77255ea609b8ee5",
18
+ "backend": "webgpu",
19
+ "bytes": 105579,
20
+ "coverage": {
21
+ "compute": 0,
22
+ "fragment": 8,
23
+ "render": 8,
24
+ "vertex": 8
25
+ },
26
+ "inputs": {
27
+ "src/assets.ts": "ec86aea62751663409bd59264ddd53f028ae716ede15a30bc699d10ea175a5ca",
28
+ "src/look.ts": "c0639402db78e361efb099d5c775246bde7b76050fac0958fc9b7db0d0b1bd5a",
29
+ "src/scene.ts": "359b087788fc51d75eea076e2f0e9d087da6910c77532c87f1441eaddb160c8a"
30
+ },
31
+ "skipped": {
32
+ "compute": 0,
33
+ "render": 0
34
+ }
35
+ },
36
+ "text.webgl": {
37
+ "artifact": "text.webgl.ts",
38
+ "artifactHash": "7b9294083c327268d7b2e50ca569327cac64348c7eccc82fca3b56fb7566f583",
39
+ "asset": "three-blocks/shaders/text.webgl.json",
40
+ "assetHash": "424eac8505846d1c096e66c49a27adc4a476054d6cb87af854d2f9fb4b653025",
41
+ "backend": "webgl",
42
+ "bytes": 107261,
43
+ "coverage": {
44
+ "compute": 0,
45
+ "fragment": 4,
46
+ "render": 4,
47
+ "vertex": 4
48
+ },
49
+ "inputs": {
50
+ "src/assets.ts": "ec86aea62751663409bd59264ddd53f028ae716ede15a30bc699d10ea175a5ca",
51
+ "src/look.ts": "c0639402db78e361efb099d5c775246bde7b76050fac0958fc9b7db0d0b1bd5a",
52
+ "src/scene.ts": "359b087788fc51d75eea076e2f0e9d087da6910c77532c87f1441eaddb160c8a"
53
+ },
54
+ "skipped": {
55
+ "compute": 0,
56
+ "render": 4
57
+ }
58
+ }
59
+ },
60
+ "schemaVersion": 2,
61
+ "tool": {
62
+ "address": 2,
63
+ "compatibilities": {
64
+ "webgl": "three-webgl-r185-v1",
65
+ "webgpu": "three-webgpu-r185-v1"
66
+ },
67
+ "compatibility": "three-webgpu-r185-v1",
68
+ "hydration": 2,
69
+ "name": "@three-blocks/devtools",
70
+ "recipe": 1,
71
+ "transform": 62,
72
+ "version": "4.0.0-alpha.314.g989237b8fb54"
73
+ }
74
74
  }
@@ -1504,7 +1504,7 @@ export default {
1504
1504
  }
1505
1505
  ],
1506
1506
  "three": "0.185.1",
1507
- "threeBlocks": "0.2.0",
1507
+ "threeBlocks": "0.5.0-alpha.314.g989237b8fb54",
1508
1508
  "updatePlans": [
1509
1509
  [3,6,4,7,8,0,9],
1510
1510
  [],
@@ -1827,7 +1827,7 @@ export default {
1827
1827
  }
1828
1828
  ],
1829
1829
  "three": "0.185.1",
1830
- "threeBlocks": "0.2.0",
1830
+ "threeBlocks": "0.5.0-alpha.314.g989237b8fb54",
1831
1831
  "updatePlans": [
1832
1832
  [2,5,3,6,7,8],
1833
1833
  [],
@@ -1,28 +1,28 @@
1
1
  {
2
- "adapter": "WebGL adapter",
3
- "measuredAt": "2026-07-29T10:15:55.615Z",
4
- "platform": "darwin/arm64",
5
- "receiptHash": "e4b1717cc4098bf201e3c5d3ba6dbc28e0057324084473f78cde13be1b32b146",
6
- "scenes": {
7
- "text": {
8
- "avoidedBuildMs": 31.299999952316284,
9
- "builds": 8,
10
- "liveBuildMs": 31.299999952316284,
11
- "precompiledBuildMs": 0,
12
- "runs": 1,
13
- "setupMeasured": false,
14
- "spreadMs": 0
15
- },
16
- "text.webgl": {
17
- "avoidedBuildMs": 37.09999990463257,
18
- "builds": 4,
19
- "liveBuildMs": 37.09999990463257,
20
- "precompiledBuildMs": 0,
21
- "runs": 1,
22
- "setupMeasured": false,
23
- "spreadMs": 0
24
- }
25
- },
26
- "schemaVersion": 3,
27
- "source": "committed-capture"
2
+ "adapter": "WebGL adapter",
3
+ "measuredAt": "2026-07-29T10:15:55.615Z",
4
+ "platform": "darwin/arm64",
5
+ "receiptHash": "b179f9e3b35d0a9454ec80e3636a1cd2b213fa5a2d6d63e2a5c71eb3dfdeb494",
6
+ "scenes": {
7
+ "text": {
8
+ "avoidedBuildMs": 31.299999952316284,
9
+ "builds": 8,
10
+ "liveBuildMs": 31.299999952316284,
11
+ "precompiledBuildMs": 0,
12
+ "runs": 1,
13
+ "setupMeasured": false,
14
+ "spreadMs": 0
15
+ },
16
+ "text.webgl": {
17
+ "avoidedBuildMs": 37.09999990463257,
18
+ "builds": 4,
19
+ "liveBuildMs": 37.09999990463257,
20
+ "precompiledBuildMs": 0,
21
+ "runs": 1,
22
+ "setupMeasured": false,
23
+ "spreadMs": 0
24
+ }
25
+ },
26
+ "schemaVersion": 3,
27
+ "source": "committed-capture"
28
28
  }
@@ -37,7 +37,7 @@ const mobilePerformance = window.matchMedia( '(pointer: coarse)' ).matches || wi
37
37
  const viewport = () => ( {
38
38
  width: window.innerWidth,
39
39
  height: window.innerHeight,
40
- dpr: Math.min( window.devicePixelRatio, mobilePerformance ? 1 : 2 ),
40
+ dpr: threeBlocksText.enabled ? window.devicePixelRatio : Math.min( window.devicePixelRatio, mobilePerformance ? 1 : 2 ),
41
41
  } );
42
42
 
43
43
  shaderParity.sync( worker );
@@ -46,6 +46,7 @@ input.scroll( { progress: 0, position: 0, velocity: 0, direction: 0 } );
46
46
  input.visibility( { visible: document.visibilityState === 'visible' } );
47
47
 
48
48
  let resized = false;
49
+ let lastDpr = window.devicePixelRatio;
49
50
  let pointer: PointerState | undefined;
50
51
 
51
52
  window.addEventListener( 'resize', () => {
@@ -75,9 +76,11 @@ function frame( time: number ): void {
75
76
 
76
77
  shaderParity.sync( worker );
77
78
  lenis.raf( time );
78
- if ( resized ) {
79
+ // Screen moves change DPR without firing resize.
80
+ if ( resized || window.devicePixelRatio !== lastDpr ) {
79
81
 
80
82
  resized = false;
83
+ lastDpr = window.devicePixelRatio;
81
84
  input.viewport( viewport() );
82
85
 
83
86
  }