@crapthings/run3d 0.2.9 → 0.2.11

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/README.md CHANGED
@@ -53,6 +53,8 @@ Drag to orbit the scene, scroll to zoom, and right-drag to pan. Edit `src/Scenes
53
53
 
54
54
  ### Media
55
55
 
56
+ - [Elementary](https://github.com/elemaudio/elementary) — creates declarative audio DSP graphs with `@elemaudio/core` and runs them in the browser with `@elemaudio/web-renderer`.
57
+ - [Howler.js](https://github.com/goldfire/howler.js#documentation) — plays audio with volume controls, sound sprites, and 3D spatial sound.
56
58
  - [Mediabunny](https://mediabunny.dev/) — reads, writes, and converts audio and video files in the browser.
57
59
 
58
60
  ### Interface
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.2.9",
6
+ "version": "0.2.11",
7
7
  "description": "From idea to interactive 3D prototype in one command. A JavaScript starter with Vite, React Three Fiber, and tools for creative experimentation.",
8
8
  "type": "module",
9
9
  "bin": {
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="%BASE_URL%favicon.svg" type="image/svg+xml" />
9
9
  <title>Run3D</title>
10
10
  </head>
11
- <body>
11
+ <body class="select-none">
12
12
  <div id="root"></div>
13
13
  <script type="module" src="/src/main.jsx"></script>
14
14
  </body>
@@ -13,6 +13,8 @@
13
13
  "preview": "vite preview"
14
14
  },
15
15
  "dependencies": {
16
+ "@elemaudio/core": "^4.0.1",
17
+ "@elemaudio/web-renderer": "^4.0.3",
16
18
  "@floating-ui/react": "^0.27.20",
17
19
  "@gsap/react": "^2.1.2",
18
20
  "@headlessui/react": "^2.2.10",
@@ -24,6 +26,7 @@
24
26
  "d3": "^7.9.0",
25
27
  "fastnoise-lite": "^1.1.1",
26
28
  "gsap": "^3.15.0",
29
+ "howler": "^2.2.4",
27
30
  "koota": "^0.6.6",
28
31
  "math": "0.1.0",
29
32
  "mediabunny": "^1.61.6",
@@ -166,6 +166,12 @@ importers:
166
166
 
167
167
  .:
168
168
  dependencies:
169
+ '@elemaudio/core':
170
+ specifier: ^4.0.1
171
+ version: 4.0.1
172
+ '@elemaudio/web-renderer':
173
+ specifier: ^4.0.3
174
+ version: 4.0.3
169
175
  '@floating-ui/react':
170
176
  specifier: ^0.27.20
171
177
  version: 0.27.20(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
@@ -199,6 +205,9 @@ importers:
199
205
  gsap:
200
206
  specifier: ^3.15.0
201
207
  version: 3.15.0
208
+ howler:
209
+ specifier: ^2.2.4
210
+ version: 2.2.4
202
211
  koota:
203
212
  specifier: ^0.6.6
204
213
  version: 0.6.6(@types/react@19.3.0)(react@19.2.8)
@@ -276,6 +285,12 @@ packages:
276
285
  '@dimforge/rapier3d-compat@0.19.2':
277
286
  resolution: {integrity: sha512-AZHL1jqUF55QJkJyU1yKeh4ImX2J93bVLIezT1+o0FZqTix6O06MOaqpKoJ4MmbDCsoZmwO+qc471/SDMDm2AA==}
278
287
 
288
+ '@elemaudio/core@4.0.1':
289
+ resolution: {integrity: sha512-O58CaR5ttxzPt1LwkJoXVipPLlZ8lZmOIHhJFiih3rWkfCZ3/H1X2XTG0HM2jAn3BokoP5jYSbnbEiQybyvRGw==}
290
+
291
+ '@elemaudio/web-renderer@4.0.3':
292
+ resolution: {integrity: sha512-mvMt6SsUzcOEx97SGsf0u1/kafMkxWKtEa1FOuzwdzkmcdLAQIwouzZ87PExf452gi4tJqhMF0RDFb62LJqfZg==}
293
+
279
294
  '@floating-ui/core@1.8.0':
280
295
  resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==}
281
296
 
@@ -983,6 +998,9 @@ packages:
983
998
  eventemitter3@4.0.7:
984
999
  resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
985
1000
 
1001
+ eventemitter3@5.0.4:
1002
+ resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
1003
+
986
1004
  fastnoise-lite@1.1.1:
987
1005
  resolution: {integrity: sha512-3XEk16gmVq1HUL0+BdoR+/wD/tfB6VQjpliqQ7rSSE2omh23wrJGidQ5Mfr4mECCUtBGtcEov44BGIyVqs+U4w==}
988
1006
 
@@ -1021,6 +1039,9 @@ packages:
1021
1039
  hls.js@1.7.3:
1022
1040
  resolution: {integrity: sha512-MsPlx6yVW4Qv4C7mEVou4/gk/5cN2dVxOTnrNjPSmyH2f0Ln+/UkG10Ax1PE6OvrmTVPKgQYozTtBaPOuCzq7A==}
1023
1041
 
1042
+ howler@2.2.4:
1043
+ resolution: {integrity: sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==}
1044
+
1024
1045
  i18next-browser-languagedetector@4.3.1:
1025
1046
  resolution: {integrity: sha512-KIToAzf8zwWvacgnRwJp63ase26o24AuNUlfNVJ5YZAFmdGhsJpmFClxXPuk9rv1FMI4lnc8zLSqgZPEZMrW4g==}
1026
1047
 
@@ -1041,6 +1062,9 @@ packages:
1041
1062
  resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
1042
1063
  engines: {node: '>=12'}
1043
1064
 
1065
+ invariant@2.2.4:
1066
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
1067
+
1044
1068
  is-promise@2.2.2:
1045
1069
  resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
1046
1070
 
@@ -1411,6 +1435,9 @@ packages:
1411
1435
  scheduler@0.28.0:
1412
1436
  resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
1413
1437
 
1438
+ shallowequal@1.1.0:
1439
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
1440
+
1414
1441
  shebang-command@2.0.0:
1415
1442
  resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1416
1443
  engines: {node: '>=8'}
@@ -1616,6 +1643,17 @@ snapshots:
1616
1643
 
1617
1644
  '@dimforge/rapier3d-compat@0.19.2': {}
1618
1645
 
1646
+ '@elemaudio/core@4.0.1':
1647
+ dependencies:
1648
+ eventemitter3: 5.0.4
1649
+ invariant: 2.2.4
1650
+ shallowequal: 1.1.0
1651
+
1652
+ '@elemaudio/web-renderer@4.0.3':
1653
+ dependencies:
1654
+ '@elemaudio/core': 4.0.1
1655
+ invariant: 2.2.4
1656
+
1619
1657
  '@floating-ui/core@1.8.0':
1620
1658
  dependencies:
1621
1659
  '@floating-ui/utils': 0.2.12
@@ -2306,6 +2344,8 @@ snapshots:
2306
2344
 
2307
2345
  eventemitter3@4.0.7: {}
2308
2346
 
2347
+ eventemitter3@5.0.4: {}
2348
+
2309
2349
  fastnoise-lite@1.1.1: {}
2310
2350
 
2311
2351
  fdir@6.5.0(picomatch@4.0.7):
@@ -2329,6 +2369,8 @@ snapshots:
2329
2369
 
2330
2370
  hls.js@1.7.3: {}
2331
2371
 
2372
+ howler@2.2.4: {}
2373
+
2332
2374
  i18next-browser-languagedetector@4.3.1:
2333
2375
  dependencies:
2334
2376
  '@babel/runtime': 7.29.7
@@ -2347,6 +2389,10 @@ snapshots:
2347
2389
 
2348
2390
  internmap@2.0.3: {}
2349
2391
 
2392
+ invariant@2.2.4:
2393
+ dependencies:
2394
+ loose-envify: 1.4.0
2395
+
2350
2396
  is-promise@2.2.2: {}
2351
2397
 
2352
2398
  isexe@2.0.0: {}
@@ -2676,6 +2722,8 @@ snapshots:
2676
2722
 
2677
2723
  scheduler@0.28.0: {}
2678
2724
 
2725
+ shallowequal@1.1.0: {}
2726
+
2679
2727
  shebang-command@2.0.0:
2680
2728
  dependencies:
2681
2729
  shebang-regex: 3.0.0
@@ -4,6 +4,22 @@ import { createRoot } from 'react-dom/client'
4
4
  import { App } from '@/App'
5
5
  import '@/styles.css'
6
6
 
7
+ // Keep Tab available to game controls without moving focus outside editable fields.
8
+ function preventTabFocus (event) {
9
+ if (event.key !== 'Tab') return
10
+ if (!(event.target instanceof window.Element)) return
11
+ if (event.target.closest('input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"]')) return
12
+ event.preventDefault()
13
+ }
14
+
15
+ window.addEventListener('keydown', preventTabFocus)
16
+
17
+ if (import.meta.hot) {
18
+ import.meta.hot.dispose(() => {
19
+ window.removeEventListener('keydown', preventTabFocus)
20
+ })
21
+ }
22
+
7
23
  createRoot(document.getElementById('root')).render(
8
24
  <StrictMode>
9
25
  <App />
@@ -1 +1,11 @@
1
1
  @import "tailwindcss";
2
+
3
+ @layer base {
4
+ body {
5
+ -webkit-tap-highlight-color: transparent;
6
+ }
7
+
8
+ :focus {
9
+ @apply outline-none ring-0;
10
+ }
11
+ }