@oidoid/void 0.1.0-4 → 0.1.0-7

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.
Files changed (307) hide show
  1. package/dist/meta.json +1 -0
  2. package/dist/package.json +66 -0
  3. package/dist/public/favicon/favicon16.png +0 -0
  4. package/dist/public/favicon/favicon16.webp +0 -0
  5. package/dist/public/favicon/favicon192.png +0 -0
  6. package/dist/public/favicon/favicon192.webp +0 -0
  7. package/dist/public/favicon/favicon32.png +0 -0
  8. package/dist/public/favicon/favicon32.webp +0 -0
  9. package/dist/public/favicon/favicon48.png +0 -0
  10. package/dist/public/favicon/favicon48.webp +0 -0
  11. package/dist/public/favicon/favicon64.png +0 -0
  12. package/dist/public/favicon/favicon64.webp +0 -0
  13. package/dist/public/index.js +98 -0
  14. package/dist/public/index.js.map +7 -0
  15. package/dist/public/preload-atlas.png +0 -0
  16. package/dist/public/preload-atlas.webp +0 -0
  17. package/dist/public/void-v0.1.0-6+20251020.7cdf98d.html +111 -0
  18. package/dist/public/void-v0.1.0-6+20251020.e4e9eef.html +111 -0
  19. package/dist/public/void-v0.1.0-7+20251021.7cdf98d.html +111 -0
  20. package/dist/schema/config-file.d.ts +32 -0
  21. package/dist/schema/config-file.js +41 -0
  22. package/dist/schema/config-file.js.map +1 -0
  23. package/dist/schema/config-file.v0.json +68 -0
  24. package/dist/src/audio.d.ts +7 -0
  25. package/dist/src/audio.js +25 -0
  26. package/dist/src/audio.js.map +1 -0
  27. package/dist/src/demo/assets/manifest.json +41 -0
  28. package/dist/src/demo/assets/preload-atlas.json +193 -0
  29. package/dist/src/demo/ents/clock-ent.d.ts +11 -0
  30. package/dist/src/demo/ents/clock-ent.js +26 -0
  31. package/dist/src/demo/ents/clock-ent.js.map +1 -0
  32. package/dist/src/demo/ents/render-toggle-ent.d.ts +12 -0
  33. package/dist/src/demo/ents/render-toggle-ent.js +41 -0
  34. package/dist/src/demo/ents/render-toggle-ent.js.map +1 -0
  35. package/dist/src/demo/ents/work-counter-ent.d.ts +10 -0
  36. package/dist/src/demo/ents/work-counter-ent.js +20 -0
  37. package/dist/src/demo/ents/work-counter-ent.js.map +1 -0
  38. package/dist/src/demo/game.d.ts +12 -0
  39. package/dist/src/demo/game.js +135 -0
  40. package/dist/src/demo/game.js.map +1 -0
  41. package/dist/src/demo/index.d.ts +1 -0
  42. package/dist/src/demo/index.js +8 -0
  43. package/dist/src/demo/index.js.map +1 -0
  44. package/dist/src/demo/tsconfig.json +15 -0
  45. package/dist/src/demo/types/tag.d.ts +2 -0
  46. package/dist/src/demo/types/tag.js +2 -0
  47. package/dist/src/demo/types/tag.js.map +1 -0
  48. package/dist/src/demo/void.json +11 -0
  49. package/dist/src/ents/button-ent.d.ts +39 -0
  50. package/dist/src/ents/button-ent.js +128 -0
  51. package/dist/src/ents/button-ent.js.map +1 -0
  52. package/dist/src/ents/cursor-ent.d.ts +18 -0
  53. package/dist/src/ents/cursor-ent.js +63 -0
  54. package/dist/src/ents/cursor-ent.js.map +1 -0
  55. package/dist/src/ents/ent.d.ts +7 -0
  56. package/dist/src/ents/ent.js +2 -0
  57. package/dist/src/ents/ent.js.map +1 -0
  58. package/dist/src/ents/follow-cam-ent.d.ts +25 -0
  59. package/dist/src/ents/follow-cam-ent.js +87 -0
  60. package/dist/src/ents/follow-cam-ent.js.map +1 -0
  61. package/dist/src/ents/nine-patch-ent.d.ts +43 -0
  62. package/dist/src/ents/nine-patch-ent.js +143 -0
  63. package/dist/src/ents/nine-patch-ent.js.map +1 -0
  64. package/dist/src/ents/text-ent.d.ts +23 -0
  65. package/dist/src/ents/text-ent.js +109 -0
  66. package/dist/src/ents/text-ent.js.map +1 -0
  67. package/dist/src/ents/zoo.d.ts +17 -0
  68. package/dist/src/ents/zoo.js +45 -0
  69. package/dist/src/ents/zoo.js.map +1 -0
  70. package/dist/src/graphics/atlas-parser.d.ts +4 -0
  71. package/dist/src/graphics/atlas-parser.js +27 -0
  72. package/dist/src/graphics/atlas-parser.js.map +1 -0
  73. package/dist/src/graphics/atlas.d.ts +49 -0
  74. package/dist/src/graphics/atlas.js +7 -0
  75. package/dist/src/graphics/atlas.js.map +1 -0
  76. package/dist/src/graphics/cam.d.ts +89 -0
  77. package/dist/src/graphics/cam.js +220 -0
  78. package/dist/src/graphics/cam.js.map +1 -0
  79. package/dist/src/graphics/gl.d.ts +24 -0
  80. package/dist/src/graphics/gl.js +70 -0
  81. package/dist/src/graphics/gl.js.map +1 -0
  82. package/dist/src/graphics/layer.d.ts +21 -0
  83. package/dist/src/graphics/layer.js +23 -0
  84. package/dist/src/graphics/layer.js.map +1 -0
  85. package/dist/src/graphics/renderer.d.ts +36 -0
  86. package/dist/src/graphics/renderer.js +180 -0
  87. package/dist/src/graphics/renderer.js.map +1 -0
  88. package/dist/src/graphics/sprite-frag.glsl.d.ts +1 -0
  89. package/dist/src/graphics/sprite-frag.glsl.js +35 -0
  90. package/dist/src/graphics/sprite-frag.glsl.js.map +1 -0
  91. package/dist/src/graphics/sprite-vert.glsl.d.ts +1 -0
  92. package/dist/src/graphics/sprite-vert.glsl.js +68 -0
  93. package/dist/src/graphics/sprite-vert.glsl.js.map +1 -0
  94. package/dist/src/graphics/sprite.d.ts +108 -0
  95. package/dist/src/graphics/sprite.js +301 -0
  96. package/dist/src/graphics/sprite.js.map +1 -0
  97. package/dist/src/index.d.ts +30 -0
  98. package/dist/src/index.js +33 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/input/context-menu.d.ts +8 -0
  101. package/dist/src/input/context-menu.js +25 -0
  102. package/dist/src/input/context-menu.js.map +1 -0
  103. package/dist/src/input/gamepad.d.ts +18 -0
  104. package/dist/src/input/gamepad.js +49 -0
  105. package/dist/src/input/gamepad.js.map +1 -0
  106. package/dist/src/input/input.d.ts +148 -0
  107. package/dist/src/input/input.js +383 -0
  108. package/dist/src/input/input.js.map +1 -0
  109. package/dist/src/input/keyboard.d.ts +17 -0
  110. package/dist/src/input/keyboard.js +46 -0
  111. package/dist/src/input/keyboard.js.map +1 -0
  112. package/dist/src/input/pointer.d.ts +53 -0
  113. package/dist/src/input/pointer.js +162 -0
  114. package/dist/src/input/pointer.js.map +1 -0
  115. package/dist/src/input/wheel.d.ts +12 -0
  116. package/dist/src/input/wheel.js +30 -0
  117. package/dist/src/input/wheel.js.map +1 -0
  118. package/dist/src/looper.d.ts +17 -0
  119. package/dist/src/looper.js +51 -0
  120. package/dist/src/looper.js.map +1 -0
  121. package/dist/src/mem/pool.d.ts +31 -0
  122. package/dist/src/mem/pool.js +98 -0
  123. package/dist/src/mem/pool.js.map +1 -0
  124. package/dist/src/random/random.d.ts +8 -0
  125. package/dist/src/random/random.js +23 -0
  126. package/dist/src/random/random.js.map +1 -0
  127. package/dist/src/storage/local-storage.d.ts +3 -0
  128. package/dist/src/storage/local-storage.js +11 -0
  129. package/dist/src/storage/local-storage.js.map +1 -0
  130. package/dist/src/text/font.d.ts +6 -0
  131. package/dist/src/text/font.js +20 -0
  132. package/dist/src/text/font.js.map +1 -0
  133. package/dist/src/text/mem-prop-5x6.json +573 -0
  134. package/dist/src/text/text-layout.d.ts +19 -0
  135. package/dist/src/text/text-layout.js +85 -0
  136. package/dist/src/text/text-layout.js.map +1 -0
  137. package/dist/src/tsconfig.json +15 -0
  138. package/dist/src/types/geo.d.ts +38 -0
  139. package/dist/src/types/geo.js +61 -0
  140. package/dist/src/types/geo.js.map +1 -0
  141. package/dist/src/types/json.d.ts +31 -0
  142. package/dist/src/types/json.js +2 -0
  143. package/dist/src/types/json.js.map +1 -0
  144. package/dist/src/types/time.d.ts +19 -0
  145. package/dist/src/types/time.js +10 -0
  146. package/dist/src/types/time.js.map +1 -0
  147. package/dist/src/types/void-version.d.ts +7 -0
  148. package/dist/src/types/void-version.js +2 -0
  149. package/dist/src/types/void-version.js.map +1 -0
  150. package/dist/src/utils/async-util.d.ts +11 -0
  151. package/dist/src/utils/async-util.js +36 -0
  152. package/dist/src/utils/async-util.js.map +1 -0
  153. package/dist/src/utils/canvas-util.d.ts +7 -0
  154. package/dist/src/utils/canvas-util.js +128 -0
  155. package/dist/src/utils/canvas-util.js.map +1 -0
  156. package/dist/src/utils/color-util.d.ts +1 -0
  157. package/dist/src/utils/color-util.js +4 -0
  158. package/dist/src/utils/color-util.js.map +1 -0
  159. package/dist/src/utils/debug.d.ts +19 -0
  160. package/dist/src/utils/debug.js +35 -0
  161. package/dist/src/utils/debug.js.map +1 -0
  162. package/dist/src/utils/delay-interval.d.ts +7 -0
  163. package/dist/src/utils/delay-interval.js +29 -0
  164. package/dist/src/utils/delay-interval.js.map +1 -0
  165. package/dist/src/utils/dom-util.d.ts +3 -0
  166. package/dist/src/utils/dom-util.js +29 -0
  167. package/dist/src/utils/dom-util.js.map +1 -0
  168. package/dist/src/utils/fetch-util.d.ts +3 -0
  169. package/dist/src/utils/fetch-util.js +24 -0
  170. package/dist/src/utils/fetch-util.js.map +1 -0
  171. package/dist/src/utils/math.d.ts +6 -0
  172. package/dist/src/utils/math.js +18 -0
  173. package/dist/src/utils/math.js.map +1 -0
  174. package/dist/src/utils/vibrate.d.ts +1 -0
  175. package/dist/src/utils/vibrate.js +4 -0
  176. package/dist/src/utils/vibrate.js.map +1 -0
  177. package/dist/src/void.d.ts +48 -0
  178. package/dist/src/void.js +102 -0
  179. package/dist/src/void.js.map +1 -0
  180. package/dist/tools/atlas-pack/aseprite.d.ts +58 -0
  181. package/dist/tools/atlas-pack/aseprite.js +16 -0
  182. package/dist/tools/atlas-pack/aseprite.js.map +1 -0
  183. package/dist/tools/atlas-pack/atlas-json-parser.d.ts +21 -0
  184. package/dist/tools/atlas-pack/atlas-json-parser.js +116 -0
  185. package/dist/tools/atlas-pack/atlas-json-parser.js.map +1 -0
  186. package/dist/tools/atlas-pack/atlas-pack.d.ts +2 -0
  187. package/dist/tools/atlas-pack/atlas-pack.js +22 -0
  188. package/dist/tools/atlas-pack/atlas-pack.js.map +1 -0
  189. package/dist/tools/bundle/bundle.d.ts +3 -0
  190. package/dist/tools/bundle/bundle.js +48 -0
  191. package/dist/tools/bundle/bundle.js.map +1 -0
  192. package/dist/tools/bundle/html-plugin.d.ts +3 -0
  193. package/dist/tools/bundle/html-plugin.js +90 -0
  194. package/dist/tools/bundle/html-plugin.js.map +1 -0
  195. package/dist/tools/tsconfig-base.json +48 -0
  196. package/dist/tools/tsconfig.json +19 -0
  197. package/dist/tools/types/config.d.ts +27 -0
  198. package/dist/tools/types/config.js +31 -0
  199. package/dist/tools/types/config.js.map +1 -0
  200. package/dist/tools/types/package-json.d.ts +4 -0
  201. package/dist/tools/types/package-json.js +2 -0
  202. package/dist/tools/types/package-json.js.map +1 -0
  203. package/dist/tools/utils/argv.d.ts +12 -0
  204. package/dist/tools/utils/argv.js +19 -0
  205. package/dist/tools/utils/argv.js.map +1 -0
  206. package/dist/tools/utils/exec.d.ts +3 -0
  207. package/dist/tools/utils/exec.js +15 -0
  208. package/dist/tools/utils/exec.js.map +1 -0
  209. package/dist/tools/utils/file-util.d.ts +1 -0
  210. package/dist/tools/utils/file-util.js +13 -0
  211. package/dist/tools/utils/file-util.js.map +1 -0
  212. package/dist/tools/utils/html-parser.d.ts +1 -0
  213. package/dist/tools/utils/html-parser.js +10 -0
  214. package/dist/tools/utils/html-parser.js.map +1 -0
  215. package/dist/tools/void.d.ts +15 -0
  216. package/dist/tools/void.js +31 -0
  217. package/dist/tools/void.js.map +1 -0
  218. package/package.json +31 -41
  219. package/readme.md +1 -1
  220. package/schema/config-file.test.ts +55 -0
  221. package/schema/config-file.ts +69 -0
  222. package/schema/config-file.v0.json +68 -0
  223. package/tools/atlas-pack/aseprite.ts +60 -0
  224. package/tools/atlas-pack/atlas-json-parser.test.ts +780 -0
  225. package/tools/atlas-pack/atlas-json-parser.ts +159 -0
  226. package/tools/atlas-pack/atlas-pack.ts +51 -0
  227. package/tools/bundle/bundle.ts +64 -0
  228. package/tools/bundle/html-plugin.ts +135 -0
  229. package/tools/types/config.ts +65 -0
  230. package/tools/types/package-json.ts +4 -0
  231. package/tools/utils/argv.test.ts +41 -0
  232. package/tools/utils/argv.ts +29 -0
  233. package/tools/utils/exec.ts +22 -0
  234. package/tools/utils/file-util.ts +11 -0
  235. package/tools/utils/html-parser.ts +9 -0
  236. package/tools/void.ts +55 -0
  237. package/dist/atlas/anim.d.ts +0 -30
  238. package/dist/atlas/anim.js +0 -16
  239. package/dist/atlas/anim.js.map +0 -1
  240. package/dist/atlas/aseprite.d.ts +0 -37
  241. package/dist/atlas/aseprite.js +0 -2
  242. package/dist/atlas/aseprite.js.map +0 -1
  243. package/dist/atlas/atlas-parser.d.ts +0 -52
  244. package/dist/atlas/atlas-parser.js +0 -109
  245. package/dist/atlas/atlas-parser.js.map +0 -1
  246. package/dist/atlas/atlas.d.ts +0 -4
  247. package/dist/atlas/atlas.js +0 -2
  248. package/dist/atlas/atlas.js.map +0 -1
  249. package/dist/audio/synth.d.ts +0 -4
  250. package/dist/audio/synth.js +0 -21
  251. package/dist/audio/synth.js.map +0 -1
  252. package/dist/graphics/bitmap.d.ts +0 -14
  253. package/dist/graphics/bitmap.js +0 -14
  254. package/dist/graphics/bitmap.js.map +0 -1
  255. package/dist/graphics/cam.d.ts +0 -16
  256. package/dist/graphics/cam.js +0 -42
  257. package/dist/graphics/cam.js.map +0 -1
  258. package/dist/graphics/frag.glsl.d.ts +0 -1
  259. package/dist/graphics/frag.glsl.js +0 -15
  260. package/dist/graphics/frag.glsl.js.map +0 -1
  261. package/dist/graphics/frame-listener.d.ts +0 -16
  262. package/dist/graphics/frame-listener.js +0 -83
  263. package/dist/graphics/frame-listener.js.map +0 -1
  264. package/dist/graphics/renderer.d.ts +0 -12
  265. package/dist/graphics/renderer.js +0 -184
  266. package/dist/graphics/renderer.js.map +0 -1
  267. package/dist/graphics/vert.glsl.d.ts +0 -1
  268. package/dist/graphics/vert.glsl.js +0 -46
  269. package/dist/graphics/vert.glsl.js.map +0 -1
  270. package/dist/index.d.ts +0 -31
  271. package/dist/index.js +0 -79
  272. package/dist/index.js.map +0 -1
  273. package/dist/input/gamepad-poller.d.ts +0 -8
  274. package/dist/input/gamepad-poller.js +0 -38
  275. package/dist/input/gamepad-poller.js.map +0 -1
  276. package/dist/input/input.d.ts +0 -44
  277. package/dist/input/input.js +0 -175
  278. package/dist/input/input.js.map +0 -1
  279. package/dist/input/keyboard-poller.d.ts +0 -7
  280. package/dist/input/keyboard-poller.js +0 -30
  281. package/dist/input/keyboard-poller.js.map +0 -1
  282. package/dist/input/pointer-poller.d.ts +0 -12
  283. package/dist/input/pointer-poller.js +0 -67
  284. package/dist/input/pointer-poller.js.map +0 -1
  285. package/dist/sprite/sprite.d.ts +0 -51
  286. package/dist/sprite/sprite.js +0 -161
  287. package/dist/sprite/sprite.js.map +0 -1
  288. package/dist/storage/json-storage.d.ts +0 -4
  289. package/dist/storage/json-storage.js +0 -13
  290. package/dist/storage/json-storage.js.map +0 -1
  291. package/dist/test/tsconfig.json +0 -14
  292. package/dist/text/font.d.ts +0 -6
  293. package/dist/text/font.js +0 -18
  294. package/dist/text/font.js.map +0 -1
  295. package/dist/text/text-layout.d.ts +0 -11
  296. package/dist/text/text-layout.js +0 -73
  297. package/dist/text/text-layout.js.map +0 -1
  298. package/dist/tsconfig.json +0 -13
  299. package/dist/types/2d.d.ts +0 -9
  300. package/dist/types/2d.js +0 -2
  301. package/dist/types/2d.js.map +0 -1
  302. package/dist/void.js +0 -60
  303. package/dist/void.js.map +0 -7
  304. package/dist/void.meta.json +0 -289
  305. package/src/atlas/anim.js +0 -17
  306. package/tools/atlas-parser.js +0 -120
  307. package/tools/void.js +0 -143
@@ -0,0 +1,38 @@
1
+ export type Box = XY & WH;
2
+ export type WH = {
3
+ w: number;
4
+ h: number;
5
+ };
6
+ export type XY = {
7
+ x: number;
8
+ y: number;
9
+ };
10
+ export type XYZ = {
11
+ x: number;
12
+ y: number;
13
+ z: number;
14
+ };
15
+ export type CardinalDir = 'W' | 'N' | 'E' | 'S';
16
+ export type CompassDir = CardinalDir | 'NE' | 'SE' | 'SW' | 'NW' | 'Origin';
17
+ export declare function boxEq(l: Readonly<Box>, r: Readonly<Box>): boolean;
18
+ export declare function boxHits(l: Readonly<Partial<XY> & WH>, r: Readonly<XY & Partial<WH>>): boolean;
19
+ export declare function whAssign(l: WH, r: Readonly<WH>): void;
20
+ export declare function whEq(l: Readonly<WH>, r: Readonly<WH>): boolean;
21
+ /** l + r. */
22
+ export declare function xyAdd(l: Readonly<XY>, r: Readonly<XY>): XY;
23
+ /** l += r. */
24
+ export declare function xyAddTo(l: XY, r: Readonly<XY>): void;
25
+ export declare function xyAssign(l: XY, r: Readonly<XY>): void;
26
+ /** nonnegative. */
27
+ export declare function xyDistance(from: Readonly<XY>, to: Readonly<XY>): number;
28
+ /** l / r. */
29
+ export declare function xyDiv(l: Readonly<XY>, r: Readonly<XY>): XY;
30
+ export declare function xyEq(l: Readonly<XY>, r: Readonly<XY>): boolean;
31
+ /** nonnegative. */
32
+ export declare function xyMagnitude(xy: Readonly<XY>): number;
33
+ /** the greater of each component. */
34
+ export declare function xyMax(l: Readonly<XY>, r: Readonly<XY>): XY;
35
+ /** the lesser of each component. */
36
+ export declare function xyMin(l: Readonly<XY>, r: Readonly<XY>): XY;
37
+ /** l - r. */
38
+ export declare function xySub(l: Readonly<XY>, r: Readonly<XY>): XY;
@@ -0,0 +1,61 @@
1
+ export function boxEq(l, r) {
2
+ return xyEq(l, r) && whEq(l, r);
3
+ }
4
+ export function boxHits(l, r) {
5
+ const rWH = { w: r.w ?? 1, h: r.h ?? 1 }; // point? an empty box has no w/h.
6
+ if (!l.w || !l.h || !rWH.w || !rWH.h)
7
+ return false; // noncommutative.
8
+ const lXY = { x: l.x ?? 0, y: l.y ?? 0 };
9
+ return (lXY.x < r.x + rWH.w &&
10
+ lXY.x + l.w > r.x &&
11
+ lXY.y < r.y + rWH.h &&
12
+ lXY.y + l.h > r.y);
13
+ }
14
+ export function whAssign(l, r) {
15
+ l.w = r.w;
16
+ l.h = r.h;
17
+ }
18
+ export function whEq(l, r) {
19
+ return l.w === r.w && l.h === r.h;
20
+ }
21
+ /** l + r. */
22
+ export function xyAdd(l, r) {
23
+ return { x: l.x + r.x, y: l.y + r.y };
24
+ }
25
+ /** l += r. */
26
+ export function xyAddTo(l, r) {
27
+ l.x += r.x;
28
+ l.y += r.y;
29
+ }
30
+ export function xyAssign(l, r) {
31
+ l.x = r.x;
32
+ l.y = r.y;
33
+ }
34
+ /** nonnegative. */
35
+ export function xyDistance(from, to) {
36
+ return xyMagnitude(xySub(from, to));
37
+ }
38
+ /** l / r. */
39
+ export function xyDiv(l, r) {
40
+ return { x: l.x / r.x, y: l.y / r.y };
41
+ }
42
+ export function xyEq(l, r) {
43
+ return l.x === r.x && l.y === r.y;
44
+ }
45
+ /** nonnegative. */
46
+ export function xyMagnitude(xy) {
47
+ return Math.hypot(xy.x, xy.y);
48
+ }
49
+ /** the greater of each component. */
50
+ export function xyMax(l, r) {
51
+ return { x: Math.max(l.x, r.x), y: Math.max(l.y, r.y) };
52
+ }
53
+ /** the lesser of each component. */
54
+ export function xyMin(l, r) {
55
+ return { x: Math.min(l.x, r.x), y: Math.min(l.y, r.y) };
56
+ }
57
+ /** l - r. */
58
+ export function xySub(l, r) {
59
+ return { x: l.x - r.x, y: l.y - r.y };
60
+ }
61
+ //# sourceMappingURL=geo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geo.js","sourceRoot":"","sources":["../../../src/types/geo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export type JSONValue = JSONPrimitive | JSONArray | JSONObject;
2
+ export type JSONObject = {
3
+ [k: string]: JSONValue;
4
+ };
5
+ export type JSONArray = JSONValue[];
6
+ export type JSONPrimitive = boolean | null | number | string;
7
+ /**
8
+ * like `JSONValue` but deeply allow lossy undefined values that are easier to
9
+ * type but may de/serialize incorrectly. eg:
10
+ *
11
+ * - `JSON.stringify({a: 1, b: undefined, c: 3})`: `'{"a":1,"c":3}'`.
12
+ * - `JSON.stringify([1, undefined, 3])`: `'[1,null,3]'`.
13
+ * - `JSON.stringify(undefined)`: `undefined`.
14
+ *
15
+ * the last case produces unparseable JSON and must be guarded against.
16
+ *
17
+ * `JSON.stringify()` accepts `any` input so there are no typing guards. prefer
18
+ * plain `JSONValue`.
19
+ *
20
+ * the following inputs all throw but only the last is probable.
21
+ *
22
+ * - `JSON.parse('{a: 1, b: undefined, c: 3}')`.
23
+ * - `JSON.parse('[1, undefined, 3]')`.
24
+ * - `JSON.parse('undefined')`.
25
+ */
26
+ export type PartialJSONValue = PartialJSONPrimitive | PartialJSONArray | PartialJSONObject;
27
+ export type PartialJSONObject = {
28
+ [k in string]?: PartialJSONValue;
29
+ };
30
+ export type PartialJSONArray = PartialJSONValue[];
31
+ export type PartialJSONPrimitive = boolean | null | number | string | undefined;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/types/json.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ declare global {
2
+ interface DateConstructor {
3
+ now(): UTCMillis;
4
+ }
5
+ interface Performance {
6
+ now(): Millis;
7
+ }
8
+ }
9
+ declare const millis: unique symbol;
10
+ /** duration in milliseconds. */
11
+ export type Millis = number & {
12
+ readonly [millis]: never;
13
+ };
14
+ declare const utcMillis: unique symbol;
15
+ export type UTCMillis = number & {
16
+ readonly [utcMillis]: never;
17
+ };
18
+ export declare function dateToTimestamp(date: Readonly<Date>): string;
19
+ export {};
@@ -0,0 +1,10 @@
1
+ export function dateToTimestamp(date) {
2
+ const yyyy = `${date.getFullYear()}`.padStart(4, '0');
3
+ const MM = `${date.getMonth() + 1}`.padStart(2, '0');
4
+ const dd = `${date.getDate()}`.padStart(2, '0');
5
+ const hh = `${date.getHours()}`.padStart(2, '0');
6
+ const mm = `${date.getMinutes()}`.padStart(2, '0');
7
+ const ss = `${date.getSeconds()}`.padStart(2, '0');
8
+ return `${yyyy}${MM}${dd}${hh}${mm}${ss}`;
9
+ }
10
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/types/time.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,eAAe,CAAC,IAAoB;IAClD,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACrD,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACpD,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAChD,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAClD,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAClD,OAAO,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type VoidVersion = {
2
+ /** package.json `published` YYYYMMDD. */
3
+ published: string;
4
+ /** package.json semantic `version`. */
5
+ version: string;
6
+ };
7
+ export declare const voidVersion: VoidVersion;
@@ -0,0 +1,2 @@
1
+ export const voidVersion = globalThis.voidVersion;
2
+ //# sourceMappingURL=void-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"void-version.js","sourceRoot":"","sources":["../../../src/types/void-version.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,WAAW,GAAgB,UAAU,CAAC,WAAW,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { Millis } from '../types/time.ts';
2
+ export declare function debounce<T extends unknown[]>(fn: (this: undefined, ...args: T) => void | Promise<void>, delay: Millis): {
3
+ cancel(): void;
4
+ (...args: T): void;
5
+ };
6
+ export declare function retry<T>(fn: () => Promise<T>, retries: number, delayMillis: Millis): Promise<T>;
7
+ /** schedule a new function call overwriting any previous. */
8
+ export declare function throttle<T extends unknown[]>(fn: (this: undefined, ...args: T) => void, period: Millis): {
9
+ cancel(): void;
10
+ (...args: T): void;
11
+ };
@@ -0,0 +1,36 @@
1
+ export function debounce(fn, delay) {
2
+ let timeout;
3
+ const cancel = () => clearTimeout(timeout);
4
+ return Object.assign((...args) => {
5
+ cancel();
6
+ timeout = setTimeout(() => fn.apply(undefined, args), delay);
7
+ }, { cancel });
8
+ }
9
+ // to-do: cancel.
10
+ export async function retry(fn, retries, delayMillis) {
11
+ for (let i = 0;; i++)
12
+ try {
13
+ return await fn();
14
+ }
15
+ catch (err) {
16
+ if (i >= retries)
17
+ throw err;
18
+ await new Promise(fulfil => setTimeout(fulfil, delayMillis));
19
+ delayMillis = (delayMillis * 2);
20
+ }
21
+ }
22
+ /** schedule a new function call overwriting any previous. */
23
+ export function throttle(fn, period) {
24
+ let exec = 0;
25
+ let timeout;
26
+ const cancel = () => clearTimeout(timeout);
27
+ return Object.assign((...args) => {
28
+ cancel();
29
+ const delay = Math.max(0, period - (performance.now() - exec));
30
+ timeout = setTimeout(() => {
31
+ exec = performance.now();
32
+ fn.apply(undefined, args);
33
+ }, delay);
34
+ }, { cancel });
35
+ }
36
+ //# sourceMappingURL=async-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-util.js","sourceRoot":"","sources":["../../../src/utils/async-util.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CACtB,EAAyD,EACzD,KAAa;IAEb,IAAI,OAA2B,CAAA;IAC/B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,IAAO,EAAE,EAAE;QACb,MAAM,EAAE,CAAA;QACR,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;IAC9D,CAAC,EACD,EAAC,MAAM,EAAC,CACT,CAAA;AACH,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,EAAoB,EACpB,OAAe,EACf,WAAmB;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE;QACnB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,OAAO;gBAAE,MAAM,GAAG,CAAA;YAC3B,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;YAC5D,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAW,CAAA;QAC3C,CAAC;AACL,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CACtB,EAAyC,EACzC,MAAc;IAEd,IAAI,IAAI,GAAW,CAAW,CAAA;IAC9B,IAAI,OAA2B,CAAA;IAC/B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,IAAO,EAAE,EAAE;QACb,MAAM,EAAE,CAAA;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;QAC9D,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YACxB,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAC3B,CAAC,EAAE,KAAK,CAAC,CAAA;IACX,CAAC,EACD,EAAC,MAAM,EAAC,CACT,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function downloadScreenshot(canvas: HTMLCanvasElement, name: string): Promise<void>;
2
+ export declare function initCanvas(canvas: HTMLCanvasElement | undefined, mode: 'Int' | 'Fraction'): HTMLCanvasElement;
3
+ export declare function requestFullscreen(canvas: HTMLCanvasElement): Promise<boolean>;
4
+ /** draws a canvas to a blob URI. */
5
+ export declare function screenshot(canvas: HTMLCanvasElement): Promise<Disposable & {
6
+ uri: string;
7
+ }>;
@@ -0,0 +1,128 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { dateToTimestamp } from "../types/time.js";
54
+ import { download } from "./dom-util.js";
55
+ export async function downloadScreenshot(canvas, name) {
56
+ const env_1 = { stack: [], error: void 0, hasError: false };
57
+ try {
58
+ const img = __addDisposableResource(env_1, await screenshot(canvas), false);
59
+ download(img.uri, `${name}-screenshot-${dateToTimestamp(new Date())}.webp`);
60
+ }
61
+ catch (e_1) {
62
+ env_1.error = e_1;
63
+ env_1.hasError = true;
64
+ }
65
+ finally {
66
+ __disposeResources(env_1);
67
+ }
68
+ }
69
+ export function initCanvas(canvas, mode) {
70
+ canvas ??= document.createElement('canvas');
71
+ canvas.width = 0; // guarantee Renderer.#resize().
72
+ canvas.style.cursor = 'none';
73
+ canvas.style.display = 'block'; // no line height spacing.
74
+ canvas.style.outline = 'none'; // disable focus outline.
75
+ canvas.style.cursor = 'none';
76
+ if (mode === 'Int')
77
+ canvas.style.imageRendering = 'pixelated'; // to-do: why doesn't cam mode set this?
78
+ // update on each pointermove *touch* Event like *mouse* Events.
79
+ canvas.style.touchAction = 'none';
80
+ canvas.tabIndex = 0;
81
+ canvas.focus();
82
+ if (!canvas.parentNode)
83
+ document.body.append(canvas);
84
+ return canvas;
85
+ }
86
+ export async function requestFullscreen(canvas) {
87
+ if (!document.fullscreenEnabled)
88
+ return false;
89
+ if (document.fullscreenElement !== canvas)
90
+ try {
91
+ await canvas.requestFullscreen({ navigationUI: 'hide' });
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ if (!document.pointerLockElement) {
97
+ try {
98
+ await canvas.requestPointerLock({ unadjustedMovement: true });
99
+ }
100
+ catch (err) {
101
+ if (err instanceof Error && err.name === 'NotSupportedError')
102
+ try {
103
+ await canvas.requestPointerLock();
104
+ }
105
+ catch { }
106
+ }
107
+ }
108
+ return true;
109
+ }
110
+ /** draws a canvas to a blob URI. */
111
+ export function screenshot(canvas) {
112
+ return new Promise((fulfil, reject) => {
113
+ canvas.toBlob(blob => {
114
+ if (blob) {
115
+ const img = {
116
+ [Symbol.dispose]() {
117
+ URL.revokeObjectURL(this.uri);
118
+ },
119
+ uri: URL.createObjectURL(blob)
120
+ };
121
+ fulfil(img);
122
+ }
123
+ else
124
+ reject(Error('no blob'));
125
+ }, 'image/webp');
126
+ });
127
+ }
128
+ //# sourceMappingURL=canvas-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-util.js","sourceRoot":"","sources":["../../../src/utils/canvas-util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function rgbaHex(rgba: number): `#${string}`;
@@ -0,0 +1,4 @@
1
+ export function rgbaHex(rgba) {
2
+ return `#${rgba.toString(16).padStart(8, '0')}`;
3
+ }
4
+ //# sourceMappingURL=color-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-util.js","sourceRoot":"","sources":["../../../src/utils/color-util.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AACjD,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * proxy for debug CSV query param with case-insensitive keys. when a key
3
+ * exists, the value is as specified or `'true'` if no value. most void values
4
+ * default to `'true'` when the `debug` param is empty or `'void'` is set (eg,
5
+ * `localhost:1234?debug` or `localhost:1234?debug=void,foo=bar`). all values
6
+ * default to true when `'all'` is set. extend interface for additional types.
7
+ * doesn't handle multiple values like `localhost:1234?debug=a=1,b=2&debug=b=3`.
8
+ */
9
+ export interface Debug {
10
+ cam?: string;
11
+ input?: string;
12
+ /** debug render invalidations. */
13
+ invalid?: string;
14
+ mem?: string;
15
+ render?: 'always' | string;
16
+ }
17
+ export declare const debug: Readonly<Debug> | undefined;
18
+ /** @internal */
19
+ export declare function Debug(url: string | undefined): Debug | undefined;
@@ -0,0 +1,35 @@
1
+ export const debug = Debug(globalThis.location?.href);
2
+ /** @internal */
3
+ export function Debug(url) {
4
+ if (!url)
5
+ return;
6
+ const csv = [...new URL(url).searchParams].find(([k]) => k.toLowerCase() === 'debug')?.[1];
7
+ if (csv == null)
8
+ return;
9
+ const map = Object.fromEntries(csv
10
+ .split(',') // split KV pairs.
11
+ .filter(Boolean) // drop empties.
12
+ .map(kv => kv.split('=')) // split each pair.
13
+ );
14
+ const target = {};
15
+ for (const k in map)
16
+ target[k.toLowerCase()] = map[k] || 'true';
17
+ const voidKeyset = {
18
+ cam: undefined,
19
+ input: undefined,
20
+ mem: undefined,
21
+ render: undefined
22
+ };
23
+ return new Proxy(target, {
24
+ get(target, k) {
25
+ if (typeof k !== 'string')
26
+ return target[k];
27
+ k = k.toLowerCase();
28
+ if (target[k])
29
+ return target[k];
30
+ if (!csv || 'all' in map || (k in voidKeyset && 'void' in map))
31
+ return 'true';
32
+ }
33
+ });
34
+ }
35
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../src/utils/debug.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,KAAK,GAAgC,KAAK,CACrD,UAAU,CAAC,QAAQ,EAAE,IAAI,CAC1B,CAAA;AAED,gBAAgB;AAChB,MAAM,UAAU,KAAK,CAAC,GAAuB;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAM;IAChB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAC7C,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CACrC,EAAE,CAAC,CAAC,CAAC,CAAA;IACN,IAAI,GAAG,IAAI,IAAI;QAAE,OAAM;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAC5B,GAAG;SACA,KAAK,CAAC,GAAG,CAAC,CAAC,kBAAkB;SAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB;SAChC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB;KAChD,CAAA;IAED,MAAM,MAAM,GAA0B,EAAE,CAAA;IACxC,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;IAE/D,MAAM,UAAU,GAAuD;QACrE,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,MAAM,EAAE,SAAS;KAClB,CAAA;IAED,OAAO,IAAI,KAAK,CAAwB,MAAM,EAAE;QAC9C,GAAG,CAAC,MAAM,EAAE,CAAC;YACX,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,MAAM,CAAC,CAAsB,CAAC,CAAA;YAChE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YACnB,IAAI,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,UAAU,IAAI,MAAM,IAAI,GAAG,CAAC;gBAC5D,OAAO,MAAM,CAAA;QACjB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Millis } from '../types/time.ts';
2
+ export declare class DelayInterval {
3
+ #private;
4
+ constructor(delay: () => Millis, interval: Millis, onInterval: () => void);
5
+ register(op: 'add' | 'remove'): this;
6
+ [Symbol.dispose](): void;
7
+ }
@@ -0,0 +1,29 @@
1
+ export class DelayInterval {
2
+ #delay;
3
+ #interval;
4
+ #intervalID = 0;
5
+ #onInterval;
6
+ #timerID = 0;
7
+ constructor(delay, interval, onInterval) {
8
+ this.#delay = delay;
9
+ this.#interval = interval;
10
+ this.#onInterval = onInterval;
11
+ }
12
+ register(op) {
13
+ if (op === 'add') {
14
+ this.#timerID = setTimeout(() => {
15
+ this.#onInterval();
16
+ this.#intervalID = setInterval(this.#onInterval, this.#interval);
17
+ }, this.#delay());
18
+ }
19
+ else {
20
+ clearTimeout(this.#timerID);
21
+ clearInterval(this.#intervalID);
22
+ }
23
+ return this;
24
+ }
25
+ [Symbol.dispose]() {
26
+ this.register('remove');
27
+ }
28
+ }
29
+ //# sourceMappingURL=delay-interval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delay-interval.js","sourceRoot":"","sources":["../../../src/utils/delay-interval.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IACxB,MAAM,CAAc;IACpB,SAAS,CAAQ;IACjB,WAAW,GAAW,CAAC,CAAA;IACvB,WAAW,CAAY;IACvB,QAAQ,GAAW,CAAC,CAAA;IAEpB,YAAY,KAAmB,EAAE,QAAgB,EAAE,UAAsB;QACvE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;IAC/B,CAAC;IAED,QAAQ,CAAC,EAAoB;QAC3B,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,WAAW,EAAE,CAAA;gBAClB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YAClE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC3B,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACjC,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC;QACd,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare function download(uri: string, filename: string): void;
2
+ export declare function initBody(canvas: Readonly<HTMLCanvasElement>, rgba: number): void;
3
+ export declare function initMetaViewport(): void;
@@ -0,0 +1,29 @@
1
+ import { rgbaHex } from "./color-util.js";
2
+ export function download(uri, filename) {
3
+ const a = document.createElement('a');
4
+ a.href = uri;
5
+ a.download = filename;
6
+ a.click();
7
+ a.remove();
8
+ }
9
+ export function initBody(canvas, rgba) {
10
+ if (canvas.parentNode !== document.body)
11
+ return;
12
+ document.body.style.margin = '0';
13
+ // fill the screen except for UI chrome.
14
+ document.body.style.width = '100dvw';
15
+ document.body.style.height = '100dvh';
16
+ document.body.style.overflow = 'hidden';
17
+ document.body.style.background = rgbaHex(rgba);
18
+ }
19
+ export function initMetaViewport() {
20
+ if (document.querySelector('meta[name="viewport"]'))
21
+ return;
22
+ const meta = document.createElement('meta');
23
+ meta.name = 'viewport';
24
+ // don't wait for double-tap scaling on mobile.
25
+ meta.content =
26
+ 'width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no';
27
+ document.head.appendChild(meta);
28
+ }
29
+ //# sourceMappingURL=dom-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-util.js","sourceRoot":"","sources":["../../../src/utils/dom-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAA;AAEvC,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,QAAgB;IACpD,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACrC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAA;IACZ,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACrB,CAAC,CAAC,KAAK,EAAE,CAAA;IACT,CAAC,CAAC,MAAM,EAAE,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,MAAmC,EACnC,IAAY;IAEZ,IAAI,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI;QAAE,OAAM;IAC/C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAA;IAChC,wCAAwC;IACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAA;IACpC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAA;IACrC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACvC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC;QAAE,OAAM;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IAC3C,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;IACtB,+CAA+C;IAC/C,IAAI,CAAC,OAAO;QACV,wEAAwE,CAAA;IAC1E,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function fetchAudio(url: string): Promise<ArrayBuffer>;
2
+ export declare function fetchImage(url: string): Promise<HTMLImageElement>;
3
+ export declare function loadImage(img: HTMLImageElement): Promise<HTMLImageElement>;
@@ -0,0 +1,24 @@
1
+ export async function fetchAudio(url) {
2
+ const rsp = await fetch(url, { headers: { accept: 'audio/mpeg' } });
3
+ if (!rsp.ok)
4
+ throw Error(`fetch error ${rsp.status}: ${rsp.statusText} for ${url}`);
5
+ const type = rsp.headers.get('Content-Type');
6
+ // to-do: ogg
7
+ if (!type?.startsWith('audio/mpeg'))
8
+ throw Error(`bad fetch response type ${type} for ${url}`);
9
+ return await rsp.arrayBuffer();
10
+ }
11
+ export function fetchImage(url) {
12
+ const img = new Image();
13
+ const promise = loadImage(img);
14
+ img.src = url;
15
+ return promise;
16
+ }
17
+ export async function loadImage(img) {
18
+ const promise = new Promise((fulfil, reject) => {
19
+ img.onload = () => fulfil(img);
20
+ img.onerror = () => reject(Error(`image load error for ${img.src}`));
21
+ });
22
+ return img.complete ? img : await promise;
23
+ }
24
+ //# sourceMappingURL=fetch-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-util.js","sourceRoot":"","sources":["../../../src/utils/fetch-util.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAC,OAAO,EAAE,EAAC,MAAM,EAAE,YAAY,EAAC,EAAC,CAAC,CAAA;IAC/D,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,KAAK,CAAC,eAAe,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,QAAQ,GAAG,EAAE,CAAC,CAAA;IACxE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC5C,aAAa;IACb,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;QACjC,MAAM,KAAK,CAAC,2BAA2B,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAA;IAC3D,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAA;IACvB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAC9B,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/D,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9B,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,OAAO,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function clamp(val: number, min: number, max: number): number;
2
+ export declare function closeTo(lhs: number, rhs: number, tolerance: number): boolean;
3
+ /** ratio is [0, 1] to return [start, end]. */
4
+ export declare function lerp(start: number, end: number, ratio: number): number;
5
+ /** returns positive modulo. */
6
+ export declare function mod(dividend: number, divisor: number): number;
@@ -0,0 +1,18 @@
1
+ // to-do: port tests.
2
+ export function clamp(val, min, max) {
3
+ return Math.max(min, Math.min(max, val));
4
+ }
5
+ export function closeTo(lhs, rhs, tolerance) {
6
+ return Math.abs(lhs - rhs) <= tolerance;
7
+ }
8
+ // to-do: port tests.
9
+ /** ratio is [0, 1] to return [start, end]. */
10
+ export function lerp(start, end, ratio) {
11
+ return start + (end - start) * ratio;
12
+ }
13
+ // to-do: test.
14
+ /** returns positive modulo. */
15
+ export function mod(dividend, divisor) {
16
+ return ((dividend % divisor) + divisor) % divisor;
17
+ }
18
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../../src/utils/math.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,MAAM,UAAU,KAAK,CAAC,GAAW,EAAE,GAAW,EAAE,GAAW;IACzD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,SAAiB;IACjE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,SAAS,CAAA;AACzC,CAAC;AAED,qBAAqB;AACrB,8CAA8C;AAC9C,MAAM,UAAU,IAAI,CAAC,KAAa,EAAE,GAAW,EAAE,KAAa;IAC5D,OAAO,KAAK,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,CAAA;AACtC,CAAC;AAED,eAAe;AACf,+BAA+B;AAC/B,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAE,OAAe;IACnD,OAAO,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAA;AACnD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function vibrate(...pattern: number[]): void;
@@ -0,0 +1,4 @@
1
+ export function vibrate(...pattern) {
2
+ navigator.vibrate?.(pattern);
3
+ }
4
+ //# sourceMappingURL=vibrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibrate.js","sourceRoot":"","sources":["../../../src/utils/vibrate.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,GAAG,OAAiB;IAC1C,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC"}