move.gl 0.0.1 → 0.0.2

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 (463) hide show
  1. package/README.md +185 -11
  2. package/dist/LICENSE +21 -0
  3. package/dist/README.md +212 -0
  4. package/dist/css/move.gl.css +43859 -0
  5. package/dist/css/move.gl.min.css +19 -0
  6. package/dist/js/index.cjs +1171 -0
  7. package/dist/js/index.cjs.map +1 -0
  8. package/dist/js/index.d.cts +184 -0
  9. package/dist/js/index.d.ts +184 -0
  10. package/dist/js/index.mjs +1135 -0
  11. package/dist/js/index.mjs.map +1 -0
  12. package/dist/package.json +68 -0
  13. package/{scss → dist/scss}/classes/_animations.scss +33 -14
  14. package/dist/scss/classes/_controls.scss +314 -0
  15. package/dist/scss/classes/_effects.scss +283 -0
  16. package/dist/scss/classes/_index.scss +28 -0
  17. package/dist/scss/classes/_loaders.scss +779 -0
  18. package/dist/scss/classes/_transforms.scss +138 -0
  19. package/dist/scss/classes/_transitions.scss +264 -0
  20. package/{scss → dist/scss}/dev/_deprecation.scss +6 -3
  21. package/{scss → dist/scss}/dev/_modules.scss +5 -6
  22. package/dist/scss/docs.scss +2344 -0
  23. package/dist/scss/docs.scss.bak +3133 -0
  24. package/dist/scss/functions/_index.scss +22 -0
  25. package/dist/scss/functions/scenes/_bubble.scss +32 -0
  26. package/dist/scss/functions/scenes/_index.scss +21 -0
  27. package/dist/scss/index.scss +17 -0
  28. package/dist/scss/maps/_controls.scss +85 -0
  29. package/dist/scss/maps/_index.scss +22 -0
  30. package/{scss → dist/scss}/mixins/_accessibility.scss +24 -3
  31. package/{scss → dist/scss}/mixins/_boot.scss +4 -4
  32. package/dist/scss/mixins/_index.scss +41 -0
  33. package/dist/scss/mixins/_screensaver.scss +228 -0
  34. package/dist/scss/mixins/_shape.scss +315 -0
  35. package/dist/scss/mixins/animations/_base.scss +403 -0
  36. package/dist/scss/mixins/animations/_beat.scss +137 -0
  37. package/{scss → dist/scss}/mixins/animations/_blink.scss +60 -52
  38. package/dist/scss/mixins/animations/_bounce.scss +306 -0
  39. package/{scss → dist/scss}/mixins/animations/_elastic.scss +26 -22
  40. package/dist/scss/mixins/animations/_fade.scss +393 -0
  41. package/{scss → dist/scss}/mixins/animations/_flash.scss +53 -61
  42. package/dist/scss/mixins/animations/_flip.scss +251 -0
  43. package/{scss → dist/scss}/mixins/animations/_float.scss +47 -32
  44. package/{scss → dist/scss}/mixins/animations/_glow.scss +69 -58
  45. package/dist/scss/mixins/animations/_heartbeat.scss +195 -0
  46. package/dist/scss/mixins/animations/_hinge.scss +118 -0
  47. package/dist/scss/mixins/animations/_index.scss +97 -0
  48. package/dist/scss/mixins/animations/_jello.scss +123 -0
  49. package/dist/scss/mixins/animations/_jiggle.scss +162 -0
  50. package/dist/scss/mixins/animations/_lightspeed.scss +135 -0
  51. package/{scss → dist/scss}/mixins/animations/_nod.scss +57 -65
  52. package/dist/scss/mixins/animations/_pop.scss +153 -0
  53. package/dist/scss/mixins/animations/_pulse.scss +275 -0
  54. package/{scss → dist/scss}/mixins/animations/_ripple.scss +47 -55
  55. package/dist/scss/mixins/animations/_roll.scss +217 -0
  56. package/dist/scss/mixins/animations/_rotate.scss +728 -0
  57. package/dist/scss/mixins/animations/_rubber.scss +115 -0
  58. package/dist/scss/mixins/animations/_scale.scss +382 -0
  59. package/dist/scss/mixins/animations/_shake.scss +233 -0
  60. package/dist/scss/mixins/animations/_slide.scss +501 -0
  61. package/dist/scss/mixins/animations/_spin.scss +322 -0
  62. package/{scss → dist/scss}/mixins/animations/_sway.scss +32 -49
  63. package/{scss → dist/scss}/mixins/animations/_swing.scss +47 -49
  64. package/{scss → dist/scss}/mixins/animations/_tada.scss +44 -42
  65. package/{scss → dist/scss}/mixins/animations/_twist.scss +40 -55
  66. package/{scss → dist/scss}/mixins/animations/_wave.scss +36 -53
  67. package/dist/scss/mixins/animations/_wobble.scss +283 -0
  68. package/dist/scss/mixins/animations/_zoom.scss +394 -0
  69. package/{scss/mixins/mouse → dist/scss/mixins/controls}/_cursor.scss +60 -39
  70. package/dist/scss/mixins/controls/_hover.scss +625 -0
  71. package/dist/scss/mixins/controls/_index.scss +30 -0
  72. package/dist/scss/mixins/controls/_keyboard.scss +300 -0
  73. package/{scss/mixins/mouse → dist/scss/mixins/controls}/_pointer.scss +81 -72
  74. package/dist/scss/mixins/controls/_scroll.scss +460 -0
  75. package/{scss/mixins/scroll → dist/scss/mixins/controls}/_scrollbar.scss +50 -16
  76. package/dist/scss/mixins/controls/_selection.scss +208 -0
  77. package/dist/scss/mixins/controls/_touch.scss +401 -0
  78. package/dist/scss/mixins/effects/_blend.scss +128 -0
  79. package/dist/scss/mixins/effects/_filter.scss +470 -0
  80. package/dist/scss/mixins/effects/_focus.scss +83 -0
  81. package/dist/scss/mixins/effects/_gradient.scss +130 -0
  82. package/dist/scss/mixins/effects/_index.scss +28 -0
  83. package/dist/scss/mixins/effects/_mask.scss +76 -0
  84. package/dist/scss/mixins/effects/_opacity.scss +376 -0
  85. package/dist/scss/mixins/effects/_shadow.scss +429 -0
  86. package/dist/scss/mixins/keyframes/_base.scss +199 -0
  87. package/dist/scss/mixins/keyframes/_index.scss +24 -0
  88. package/dist/scss/mixins/keyframes/animations/_beat.scss +280 -0
  89. package/dist/scss/mixins/keyframes/animations/_blink.scss +82 -0
  90. package/dist/scss/mixins/keyframes/animations/_bounce.scss +292 -0
  91. package/dist/scss/mixins/keyframes/animations/_fade.scss +311 -0
  92. package/dist/scss/mixins/keyframes/animations/_flash.scss +165 -0
  93. package/dist/scss/mixins/keyframes/animations/_flip.scss +266 -0
  94. package/{scss/mixins → dist/scss/mixins/keyframes}/animations/_index.scss +19 -10
  95. package/dist/scss/mixins/keyframes/animations/_jiggle.scss +85 -0
  96. package/dist/scss/mixins/keyframes/animations/_lightspeed.scss +73 -0
  97. package/dist/scss/mixins/keyframes/animations/_nod.scss +79 -0
  98. package/dist/scss/mixins/keyframes/animations/_pop.scss +78 -0
  99. package/dist/scss/mixins/keyframes/animations/_pulse.scss +225 -0
  100. package/dist/scss/mixins/keyframes/animations/_ripple.scss +94 -0
  101. package/dist/scss/mixins/keyframes/animations/_roll.scss +124 -0
  102. package/dist/scss/mixins/keyframes/animations/_rotate.scss +360 -0
  103. package/dist/scss/mixins/keyframes/animations/_rubber.scss +81 -0
  104. package/dist/scss/mixins/keyframes/animations/_scale.scss +308 -0
  105. package/dist/scss/mixins/keyframes/animations/_shake.scss +270 -0
  106. package/dist/scss/mixins/keyframes/animations/_slide.scss +345 -0
  107. package/dist/scss/mixins/keyframes/animations/_spin.scss +270 -0
  108. package/dist/scss/mixins/keyframes/animations/_sway.scss +83 -0
  109. package/dist/scss/mixins/keyframes/animations/_twist.scss +89 -0
  110. package/dist/scss/mixins/keyframes/animations/_wave.scss +90 -0
  111. package/dist/scss/mixins/keyframes/animations/_wobble.scss +293 -0
  112. package/dist/scss/mixins/keyframes/animations/_zoom.scss +345 -0
  113. package/dist/scss/mixins/loaders/_bars.scss +128 -0
  114. package/dist/scss/mixins/loaders/_base.scss +39 -0
  115. package/dist/scss/mixins/loaders/_bubble.scss +395 -0
  116. package/dist/scss/mixins/loaders/_circle.scss +456 -0
  117. package/dist/scss/mixins/loaders/_dots.scss +248 -0
  118. package/dist/scss/mixins/loaders/_graph.scss +542 -0
  119. package/dist/scss/mixins/loaders/_index.scss +77 -0
  120. package/dist/scss/mixins/loaders/_line.scss +471 -0
  121. package/dist/scss/mixins/loaders/_objects.scss +563 -0
  122. package/dist/scss/mixins/loaders/_progress.scss +477 -0
  123. package/dist/scss/mixins/loaders/_rect.scss +480 -0
  124. package/dist/scss/mixins/loaders/_rings.scss +377 -0
  125. package/dist/scss/mixins/loaders/_skeleton.scss +461 -0
  126. package/dist/scss/mixins/loaders/_special.scss +611 -0
  127. package/dist/scss/mixins/loaders/_spinner.scss +175 -0
  128. package/dist/scss/mixins/loaders/_text.scss +446 -0
  129. package/{scss → dist/scss}/mixins/transforms/_flip.scss +16 -18
  130. package/dist/scss/mixins/transforms/_index.scss +28 -0
  131. package/dist/scss/mixins/transforms/_matrix.scss +18 -0
  132. package/{scss → dist/scss}/mixins/transforms/_perspective.scss +18 -1
  133. package/{scss → dist/scss}/mixins/transforms/_rotate.scss +9 -14
  134. package/{scss → dist/scss}/mixins/transforms/_scale.scss +16 -1
  135. package/{scss → dist/scss}/mixins/transforms/_skew.scss +16 -2
  136. package/{scss → dist/scss}/mixins/transforms/_translate.scss +16 -2
  137. package/dist/scss/mixins/transitions/_index.scss +22 -0
  138. package/dist/scss/mixins/transitions/_transition.scss +43 -0
  139. package/dist/scss/variables/_animations.scss +300 -0
  140. package/dist/scss/variables/_controls.scss +178 -0
  141. package/dist/scss/variables/_effects.scss +87 -0
  142. package/dist/scss/variables/_index.scss +27 -0
  143. package/dist/scss/variables/_keyframes.scss +28 -0
  144. package/dist/scss/variables/_loaders.scss +75 -0
  145. package/dist/scss/variables/_transforms.scss +85 -0
  146. package/dist/scss/variables/_transitions.scss +80 -0
  147. package/dist/ts/Draggable.ts +143 -0
  148. package/dist/ts/Gesture.ts +226 -0
  149. package/dist/ts/Keyboard.ts +195 -0
  150. package/dist/ts/LoaderManager.ts +662 -0
  151. package/dist/ts/Screensaver.ts +192 -0
  152. package/dist/ts/VideoOverlay.ts +205 -0
  153. package/dist/ts/demo.ts +1108 -0
  154. package/dist/ts/index.ts +58 -0
  155. package/package.json +90 -53
  156. package/src/html/_base.html +138 -0
  157. package/src/html/base.html +147 -0
  158. package/src/html/core-concepts.html +282 -0
  159. package/src/html/demo_base.html +171 -0
  160. package/src/html/demo_draggable.html +250 -0
  161. package/src/html/demo_gesture.html +264 -0
  162. package/src/html/demo_keyboard.html +224 -0
  163. package/src/html/demo_screensaver.html +258 -0
  164. package/src/html/demo_video_overlay.html +291 -0
  165. package/src/html/getting-started.html +242 -0
  166. package/src/html/index.html +400 -0
  167. package/src/html/keyboard.html +14 -0
  168. package/src/html/partials/_demo_links.html +21 -0
  169. package/src/html/partials/_footer.html +18 -0
  170. package/src/html/partials/_head.html +21 -0
  171. package/src/html/partials/_nav.html +84 -0
  172. package/src/html/partials/_theme_toggle.html +11 -0
  173. package/src/html/screensaver.html +20 -0
  174. package/src/html/test_animations.html +813 -0
  175. package/src/html/test_attention.html +281 -0
  176. package/src/html/test_bounce.html +201 -0
  177. package/src/html/test_effects.html +1348 -0
  178. package/src/html/test_fade.html +213 -0
  179. package/src/html/test_flip.html +208 -0
  180. package/src/html/test_keyframes.html +415 -0
  181. package/src/html/test_loaders.html +1489 -0
  182. package/src/html/test_mouse.html +516 -0
  183. package/src/html/test_overview.html +1444 -0
  184. package/src/html/test_pulse.html +212 -0
  185. package/src/html/test_scale.html +204 -0
  186. package/src/html/test_shake.html +232 -0
  187. package/src/html/test_slide.html +212 -0
  188. package/src/html/test_special.html +257 -0
  189. package/src/html/test_spin.html +216 -0
  190. package/src/html/test_transforms.html +332 -0
  191. package/src/html/test_transitions.html +245 -0
  192. package/src/html/test_zoom.html +188 -0
  193. package/src/html/video_overlay.html +27 -0
  194. package/src/jinja/_base.html.jinja +50 -0
  195. package/src/jinja/base.html.jinja +48 -0
  196. package/src/jinja/core-concepts.html.jinja +148 -0
  197. package/src/jinja/demo_draggable.html.jinja +114 -0
  198. package/src/jinja/demo_gesture.html.jinja +128 -0
  199. package/src/jinja/demo_keyboard.html.jinja +88 -0
  200. package/src/jinja/demo_screensaver.html.jinja +122 -0
  201. package/src/jinja/demo_video_overlay.html.jinja +155 -0
  202. package/src/jinja/getting-started.html.jinja +108 -0
  203. package/src/jinja/index.html.jinja +268 -0
  204. package/src/jinja/index.json +5 -0
  205. package/src/jinja/move.gl.css +7741 -0
  206. package/src/jinja/partials/_code_block.html.jinja +17 -0
  207. package/src/jinja/partials/_demo_links.html.jinja +41 -0
  208. package/src/jinja/partials/_feature_card.html.jinja +20 -0
  209. package/src/jinja/partials/_footer.html.jinja +22 -0
  210. package/src/jinja/partials/_head.html.jinja +27 -0
  211. package/src/jinja/partials/_nav.html.jinja +79 -0
  212. package/src/jinja/partials/_theme_toggle.html.jinja +15 -0
  213. package/src/jinja/test_animations.html.jinja +679 -0
  214. package/src/jinja/test_attention.html.jinja +147 -0
  215. package/src/jinja/test_bounce.html.jinja +67 -0
  216. package/src/jinja/test_effects.html.jinja +1218 -0
  217. package/src/jinja/test_fade.html.jinja +79 -0
  218. package/src/jinja/test_flip.html.jinja +74 -0
  219. package/src/jinja/test_keyframes.html.jinja +281 -0
  220. package/src/jinja/test_loaders.html.jinja +1358 -0
  221. package/src/jinja/test_mouse.html.jinja +382 -0
  222. package/src/jinja/test_overview.html.jinja +1313 -0
  223. package/src/jinja/test_pulse.html.jinja +78 -0
  224. package/src/jinja/test_scale.html.jinja +70 -0
  225. package/src/jinja/test_shake.html.jinja +98 -0
  226. package/src/jinja/test_slide.html.jinja +78 -0
  227. package/src/jinja/test_special.html.jinja +123 -0
  228. package/src/jinja/test_spin.html.jinja +82 -0
  229. package/src/jinja/test_transforms.html.jinja +198 -0
  230. package/src/jinja/test_transitions.html.jinja +111 -0
  231. package/src/jinja/test_zoom.html.jinja +54 -0
  232. package/src/scss/classes/_animations.scss +595 -0
  233. package/src/scss/classes/_controls.scss +314 -0
  234. package/src/scss/classes/_effects.scss +283 -0
  235. package/src/scss/classes/_index.scss +28 -0
  236. package/src/scss/classes/_loaders.scss +779 -0
  237. package/src/scss/classes/_transforms.scss +138 -0
  238. package/src/scss/classes/_transitions.scss +264 -0
  239. package/src/scss/dev/_banner.scss +36 -0
  240. package/src/scss/dev/_debug.scss +18 -0
  241. package/src/scss/dev/_deprecation.scss +13 -0
  242. package/src/scss/dev/_index.scss +8 -0
  243. package/src/scss/dev/_modules.scss +23 -0
  244. package/src/scss/docs.scss +2344 -0
  245. package/src/scss/docs.scss.bak +3133 -0
  246. package/src/scss/functions/_index.scss +22 -0
  247. package/src/scss/functions/scenes/_bubble.scss +32 -0
  248. package/src/scss/functions/scenes/_index.scss +21 -0
  249. package/src/scss/index.scss +17 -0
  250. package/src/scss/maps/_controls.scss +85 -0
  251. package/src/scss/maps/_index.scss +22 -0
  252. package/src/scss/mixins/_accessibility.scss +91 -0
  253. package/src/scss/mixins/_boot.scss +51 -0
  254. package/src/scss/mixins/_index.scss +41 -0
  255. package/src/scss/mixins/_screensaver.scss +228 -0
  256. package/src/scss/mixins/_shape.scss +315 -0
  257. package/src/scss/mixins/animations/_base.scss +403 -0
  258. package/src/scss/mixins/animations/_beat.scss +137 -0
  259. package/src/scss/mixins/animations/_blink.scss +159 -0
  260. package/src/scss/mixins/animations/_bounce.scss +306 -0
  261. package/src/scss/mixins/animations/_elastic.scss +69 -0
  262. package/src/scss/mixins/animations/_fade.scss +393 -0
  263. package/src/scss/mixins/animations/_flash.scss +169 -0
  264. package/src/scss/mixins/animations/_flip.scss +251 -0
  265. package/src/scss/mixins/animations/_float.scss +141 -0
  266. package/src/scss/mixins/animations/_glow.scss +190 -0
  267. package/src/scss/mixins/animations/_heartbeat.scss +195 -0
  268. package/src/scss/mixins/animations/_hinge.scss +118 -0
  269. package/src/scss/mixins/animations/_index.scss +97 -0
  270. package/src/scss/mixins/animations/_jello.scss +123 -0
  271. package/src/scss/mixins/animations/_jiggle.scss +162 -0
  272. package/src/scss/mixins/animations/_lightspeed.scss +135 -0
  273. package/src/scss/mixins/animations/_nod.scss +153 -0
  274. package/src/scss/mixins/animations/_pop.scss +153 -0
  275. package/src/scss/mixins/animations/_pulse.scss +275 -0
  276. package/src/scss/mixins/animations/_ripple.scss +161 -0
  277. package/src/scss/mixins/animations/_roll.scss +217 -0
  278. package/src/scss/mixins/animations/_rotate.scss +728 -0
  279. package/src/scss/mixins/animations/_rubber.scss +115 -0
  280. package/src/scss/mixins/animations/_scale.scss +382 -0
  281. package/src/scss/mixins/animations/_shake.scss +233 -0
  282. package/src/scss/mixins/animations/_slide.scss +501 -0
  283. package/src/scss/mixins/animations/_spin.scss +322 -0
  284. package/src/scss/mixins/animations/_sway.scss +150 -0
  285. package/src/scss/mixins/animations/_swing.scss +245 -0
  286. package/src/scss/mixins/animations/_tada.scss +235 -0
  287. package/src/scss/mixins/animations/_twist.scss +162 -0
  288. package/src/scss/mixins/animations/_wave.scss +149 -0
  289. package/src/scss/mixins/animations/_wobble.scss +283 -0
  290. package/src/scss/mixins/animations/_zoom.scss +394 -0
  291. package/src/scss/mixins/controls/_cursor.scss +203 -0
  292. package/src/scss/mixins/controls/_hover.scss +625 -0
  293. package/src/scss/mixins/controls/_index.scss +30 -0
  294. package/src/scss/mixins/controls/_keyboard.scss +300 -0
  295. package/src/scss/mixins/controls/_pointer.scss +267 -0
  296. package/src/scss/mixins/controls/_scroll.scss +460 -0
  297. package/src/scss/mixins/controls/_scrollbar.scss +283 -0
  298. package/src/scss/mixins/controls/_selection.scss +208 -0
  299. package/src/scss/mixins/controls/_touch.scss +401 -0
  300. package/src/scss/mixins/effects/_blend.scss +128 -0
  301. package/src/scss/mixins/effects/_filter.scss +470 -0
  302. package/src/scss/mixins/effects/_focus.scss +83 -0
  303. package/src/scss/mixins/effects/_gradient.scss +130 -0
  304. package/src/scss/mixins/effects/_index.scss +28 -0
  305. package/src/scss/mixins/effects/_mask.scss +76 -0
  306. package/src/scss/mixins/effects/_opacity.scss +376 -0
  307. package/src/scss/mixins/effects/_shadow.scss +429 -0
  308. package/src/scss/mixins/keyframes/_base.scss +199 -0
  309. package/src/scss/mixins/keyframes/_index.scss +24 -0
  310. package/src/scss/mixins/keyframes/animations/_beat.scss +280 -0
  311. package/src/scss/mixins/keyframes/animations/_blink.scss +82 -0
  312. package/src/scss/mixins/keyframes/animations/_bounce.scss +292 -0
  313. package/src/scss/mixins/keyframes/animations/_fade.scss +311 -0
  314. package/src/scss/mixins/keyframes/animations/_flash.scss +165 -0
  315. package/src/scss/mixins/keyframes/animations/_flip.scss +266 -0
  316. package/src/scss/mixins/keyframes/animations/_index.scss +46 -0
  317. package/src/scss/mixins/keyframes/animations/_jiggle.scss +85 -0
  318. package/src/scss/mixins/keyframes/animations/_lightspeed.scss +73 -0
  319. package/src/scss/mixins/keyframes/animations/_nod.scss +79 -0
  320. package/src/scss/mixins/keyframes/animations/_pop.scss +78 -0
  321. package/src/scss/mixins/keyframes/animations/_pulse.scss +225 -0
  322. package/src/scss/mixins/keyframes/animations/_ripple.scss +94 -0
  323. package/src/scss/mixins/keyframes/animations/_roll.scss +124 -0
  324. package/src/scss/mixins/keyframes/animations/_rotate.scss +360 -0
  325. package/src/scss/mixins/keyframes/animations/_rubber.scss +81 -0
  326. package/src/scss/mixins/keyframes/animations/_scale.scss +308 -0
  327. package/src/scss/mixins/keyframes/animations/_shake.scss +270 -0
  328. package/src/scss/mixins/keyframes/animations/_slide.scss +345 -0
  329. package/src/scss/mixins/keyframes/animations/_spin.scss +270 -0
  330. package/src/scss/mixins/keyframes/animations/_sway.scss +83 -0
  331. package/src/scss/mixins/keyframes/animations/_twist.scss +89 -0
  332. package/src/scss/mixins/keyframes/animations/_wave.scss +90 -0
  333. package/src/scss/mixins/keyframes/animations/_wobble.scss +293 -0
  334. package/src/scss/mixins/keyframes/animations/_zoom.scss +345 -0
  335. package/src/scss/mixins/loaders/_bars.scss +128 -0
  336. package/src/scss/mixins/loaders/_base.scss +39 -0
  337. package/src/scss/mixins/loaders/_bubble.scss +395 -0
  338. package/src/scss/mixins/loaders/_circle.scss +456 -0
  339. package/src/scss/mixins/loaders/_dots.scss +248 -0
  340. package/src/scss/mixins/loaders/_graph.scss +542 -0
  341. package/src/scss/mixins/loaders/_index.scss +77 -0
  342. package/src/scss/mixins/loaders/_line.scss +471 -0
  343. package/src/scss/mixins/loaders/_objects.scss +563 -0
  344. package/src/scss/mixins/loaders/_progress.scss +477 -0
  345. package/src/scss/mixins/loaders/_rect.scss +480 -0
  346. package/src/scss/mixins/loaders/_rings.scss +377 -0
  347. package/src/scss/mixins/loaders/_skeleton.scss +461 -0
  348. package/src/scss/mixins/loaders/_special.scss +611 -0
  349. package/src/scss/mixins/loaders/_spinner.scss +175 -0
  350. package/src/scss/mixins/loaders/_text.scss +446 -0
  351. package/src/scss/mixins/transforms/_flip.scss +74 -0
  352. package/src/scss/mixins/transforms/_index.scss +28 -0
  353. package/src/scss/mixins/transforms/_matrix.scss +18 -0
  354. package/src/scss/mixins/transforms/_perspective.scss +28 -0
  355. package/src/scss/mixins/transforms/_rotate.scss +96 -0
  356. package/src/scss/mixins/transforms/_scale.scss +26 -0
  357. package/src/scss/mixins/transforms/_skew.scss +27 -0
  358. package/src/scss/mixins/transforms/_translate.scss +27 -0
  359. package/src/scss/mixins/transitions/_index.scss +22 -0
  360. package/src/scss/mixins/transitions/_transition.scss +43 -0
  361. package/src/scss/variables/_animations.scss +300 -0
  362. package/src/scss/variables/_controls.scss +178 -0
  363. package/src/scss/variables/_effects.scss +87 -0
  364. package/src/scss/variables/_index.scss +27 -0
  365. package/src/scss/variables/_keyframes.scss +28 -0
  366. package/src/scss/variables/_loaders.scss +75 -0
  367. package/src/scss/variables/_transforms.scss +85 -0
  368. package/src/scss/variables/_transitions.scss +80 -0
  369. package/src/ts/Draggable.ts +143 -0
  370. package/src/ts/Gesture.ts +226 -0
  371. package/src/ts/Keyboard.ts +195 -0
  372. package/src/ts/LoaderManager.ts +662 -0
  373. package/src/ts/Screensaver.ts +192 -0
  374. package/src/ts/VideoOverlay.ts +205 -0
  375. package/src/ts/demo.ts +1108 -0
  376. package/src/ts/index.ts +58 -0
  377. package/css/move.gl.css +0 -2
  378. package/css/move.gl.min.css +0 -2
  379. package/scss/classes/_transforms.scss +0 -124
  380. package/scss/classes/keyboard.scss +0 -18
  381. package/scss/classes/screensaver.scss +0 -15
  382. package/scss/effects/_filter.scss +0 -176
  383. package/scss/effects/_index.scss +0 -23
  384. package/scss/effects/_opacity.scss +0 -62
  385. package/scss/effects/_shadow.scss +0 -175
  386. package/scss/functions/scenes/_bubble.scss +0 -19
  387. package/scss/functions/scenes/_index.scss +0 -20
  388. package/scss/index.scss +0 -0
  389. package/scss/keyframes/_beat.scss +0 -26
  390. package/scss/keyframes/_index.scss +0 -0
  391. package/scss/maps/_index.scss +0 -0
  392. package/scss/maps/_mouse.scss +0 -96
  393. package/scss/mixins/_hover.scss +0 -51
  394. package/scss/mixins/_index.scss +0 -0
  395. package/scss/mixins/_selection.scss +0 -321
  396. package/scss/mixins/_shape.scss +0 -44
  397. package/scss/mixins/_touch.scss +0 -95
  398. package/scss/mixins/animations/--hover.scss +0 -107
  399. package/scss/mixins/animations/_base.scss +0 -337
  400. package/scss/mixins/animations/_beat.scss +0 -119
  401. package/scss/mixins/animations/_bounce.scss +0 -192
  402. package/scss/mixins/animations/_fade.scss +0 -154
  403. package/scss/mixins/animations/_flip.scss +0 -72
  404. package/scss/mixins/animations/_heartbeat.scss +0 -175
  405. package/scss/mixins/animations/_hinge.scss +0 -119
  406. package/scss/mixins/animations/_jello.scss +0 -129
  407. package/scss/mixins/animations/_jiggle.scss +0 -163
  408. package/scss/mixins/animations/_lightspeed.scss +0 -130
  409. package/scss/mixins/animations/_pop.scss +0 -150
  410. package/scss/mixins/animations/_pulse.scss +0 -213
  411. package/scss/mixins/animations/_roll.scss +0 -261
  412. package/scss/mixins/animations/_rotate.scss +0 -428
  413. package/scss/mixins/animations/_rubber.scss +0 -116
  414. package/scss/mixins/animations/_scale.scss +0 -113
  415. package/scss/mixins/animations/_shake.scss +0 -182
  416. package/scss/mixins/animations/_slide.scss +0 -294
  417. package/scss/mixins/animations/_spin.scss +0 -219
  418. package/scss/mixins/animations/_wobble.scss +0 -254
  419. package/scss/mixins/animations/_zoom.scss +0 -166
  420. package/scss/mixins/effects/_filter.scss +0 -148
  421. package/scss/mixins/effects/_index.scss +0 -0
  422. package/scss/mixins/effects/_shadow.scss +0 -21
  423. package/scss/mixins/loaders/_index.scss +0 -0
  424. package/scss/mixins/loaders/_progress.scss +0 -174
  425. package/scss/mixins/loaders/_spinner.scss +0 -101
  426. package/scss/mixins/loaders/circle_01.scss +0 -22
  427. package/scss/mixins/loaders/circle_02.scss +0 -19
  428. package/scss/mixins/loaders/circle_03.scss +0 -29
  429. package/scss/mixins/loaders/circle_inner_01.scss +0 -33
  430. package/scss/mixins/loaders/circle_inner_02.scss +0 -33
  431. package/scss/mixins/loaders/circle_inner_03.scss +0 -34
  432. package/scss/mixins/mouse/_index.scss +0 -0
  433. package/scss/mixins/scroll/_index.scss +0 -0
  434. package/scss/mixins/scroll/_scroll.scss +0 -104
  435. package/scss/mixins/transforms/_index.scss +0 -23
  436. package/scss/mixins/transforms/_matrix.scss +0 -1
  437. package/scss/mixins/transitions/_index.scss +0 -0
  438. package/scss/mixins/transitions/_transition.scss +0 -13
  439. package/scss/variables/_animation.scss +0 -91
  440. package/scss/variables/_index.scss +0 -0
  441. package/ts/ARContent.ts +0 -27
  442. package/ts/ARInteraction.ts +0 -34
  443. package/ts/AdaptiveUI.ts +0 -25
  444. package/ts/ContentStreaming.ts +0 -20
  445. package/ts/Draggable.ts +0 -71
  446. package/ts/DynamicEnvironment.ts +0 -60
  447. package/ts/Gesture.ts +0 -168
  448. package/ts/ImmersiveAudio.ts +0 -40
  449. package/ts/InteractiveCanvas.ts +0 -177
  450. package/ts/InteractiveVideo.ts +0 -29
  451. package/ts/Keyboard.ts +0 -162
  452. package/ts/RealTimeCollaboration.ts +0 -25
  453. package/ts/Screensaver.ts +0 -140
  454. package/ts/SpatialNavigation.ts +0 -38
  455. package/ts/UserProfile.ts +0 -27
  456. package/ts/VRExperience.ts +0 -58
  457. package/ts/VideoOverlay.ts +0 -116
  458. package/ts/index.ts +0 -0
  459. /package/{scss → dist/scss}/dev/_banner.scss +0 -0
  460. /package/{scss → dist/scss}/dev/_debug.scss +0 -0
  461. /package/{scss → dist/scss}/dev/_index.scss +0 -0
  462. /package/{scss/classes/_index.scss → src/html/partials/_code_block.html} +0 -0
  463. /package/{scss/functions/_index.scss → src/html/partials/_feature_card.html} +0 -0
@@ -0,0 +1,143 @@
1
+ // ============================================================================
2
+ // move.gl | Draggable
3
+ // ============================================================================
4
+ // Copyright 2025 Scape Agency BV
5
+ // Licensed under MIT License
6
+ // ============================================================================
7
+
8
+ /**
9
+ * Options for the Draggable class
10
+ */
11
+ export interface DraggableOptions {
12
+ /** Whether to constrain dragging to parent bounds */
13
+ constrainToParent?: boolean;
14
+ /** CSS cursor style during drag */
15
+ dragCursor?: string;
16
+ /** Callback when drag starts */
17
+ onDragStart?: (x: number, y: number) => void;
18
+ /** Callback during drag */
19
+ onDrag?: (x: number, y: number) => void;
20
+ /** Callback when drag ends */
21
+ onDragEnd?: (x: number, y: number) => void;
22
+ }
23
+
24
+ /**
25
+ * Draggable Element Handler
26
+ *
27
+ * Provides functionality to make an element draggable within the confines
28
+ * of its parent container. Supports both mouse and touch interactions,
29
+ * ensuring usability across different devices.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const draggable = new Draggable('myElement');
34
+ * // Element with id="myElement" is now draggable
35
+ * ```
36
+ */
37
+ export class Draggable {
38
+ private element: HTMLElement;
39
+ private isDragging: boolean = false;
40
+ private startX: number = 0;
41
+ private startY: number = 0;
42
+ private boundRect: DOMRect;
43
+
44
+ /**
45
+ * Creates a new Draggable instance.
46
+ * @param elementId - The ID of the HTML element to make draggable.
47
+ * @throws Error if element or parent element is not found.
48
+ */
49
+ constructor(elementId: string) {
50
+ const element = document.getElementById(elementId);
51
+ if (!element) {
52
+ throw new Error(`Element with id "${elementId}" not found`);
53
+ }
54
+ this.element = element;
55
+
56
+ const parent = this.element.parentElement;
57
+ if (!parent) {
58
+ throw new Error('Draggable element must have a parent element');
59
+ }
60
+ this.boundRect = parent.getBoundingClientRect();
61
+ this.attachEventListeners();
62
+ }
63
+
64
+ /**
65
+ * Attaches all necessary event listeners for drag functionality.
66
+ */
67
+ private attachEventListeners(): void {
68
+ this.element.addEventListener('mousedown', this.startDrag);
69
+ this.element.addEventListener('touchstart', this.startDrag, { passive: false });
70
+
71
+ document.addEventListener('mouseup', this.stopDrag);
72
+ document.addEventListener('touchend', this.stopDrag);
73
+
74
+ document.addEventListener('mousemove', this.drag);
75
+ document.addEventListener('touchmove', this.drag, { passive: false });
76
+ }
77
+
78
+ /**
79
+ * Gets the client coordinates from a mouse or touch event.
80
+ */
81
+ private getClientCoordinates(event: MouseEvent | TouchEvent): { clientX: number; clientY: number } {
82
+ if ('touches' in event && event.touches.length > 0) {
83
+ return {
84
+ clientX: event.touches[0].clientX,
85
+ clientY: event.touches[0].clientY
86
+ };
87
+ }
88
+ return {
89
+ clientX: (event as MouseEvent).clientX,
90
+ clientY: (event as MouseEvent).clientY
91
+ };
92
+ }
93
+
94
+ /**
95
+ * Initiates the drag operation.
96
+ */
97
+ private startDrag = (event: MouseEvent | TouchEvent): void => {
98
+ const coords = this.getClientCoordinates(event);
99
+ this.isDragging = true;
100
+ this.startX = coords.clientX - this.element.offsetLeft;
101
+ this.startY = coords.clientY - this.element.offsetTop;
102
+ event.preventDefault();
103
+ };
104
+
105
+ /**
106
+ * Handles the drag movement.
107
+ */
108
+ private drag = (event: MouseEvent | TouchEvent): void => {
109
+ if (!this.isDragging) return;
110
+
111
+ const coords = this.getClientCoordinates(event);
112
+ let x = coords.clientX - this.startX;
113
+ let y = coords.clientY - this.startY;
114
+
115
+ // Constrain the movement within the bounds of the element's parent
116
+ x = Math.max(this.boundRect.left, Math.min(x, this.boundRect.right - this.element.offsetWidth));
117
+ y = Math.max(this.boundRect.top, Math.min(y, this.boundRect.bottom - this.element.offsetHeight));
118
+
119
+ this.element.style.left = `${x}px`;
120
+ this.element.style.top = `${y}px`;
121
+ };
122
+
123
+ /**
124
+ * Stops the drag operation.
125
+ */
126
+ private stopDrag = (): void => {
127
+ this.isDragging = false;
128
+ };
129
+
130
+ /**
131
+ * Removes all event listeners and cleans up.
132
+ */
133
+ public destroy(): void {
134
+ this.element.removeEventListener('mousedown', this.startDrag);
135
+ this.element.removeEventListener('touchstart', this.startDrag);
136
+ document.removeEventListener('mouseup', this.stopDrag);
137
+ document.removeEventListener('touchend', this.stopDrag);
138
+ document.removeEventListener('mousemove', this.drag);
139
+ document.removeEventListener('touchmove', this.drag);
140
+ }
141
+ }
142
+
143
+ export default Draggable;
@@ -0,0 +1,226 @@
1
+ // ============================================================================
2
+ // move.gl | Gesture Handlers
3
+ // ============================================================================
4
+ // Copyright 2025 Scape Agency BV
5
+ // Licensed under MIT License
6
+ // ============================================================================
7
+
8
+ /**
9
+ * Swipe direction type
10
+ */
11
+ export type SwipeDirection = 'left' | 'right' | 'up' | 'down';
12
+
13
+ /**
14
+ * Gesture event callbacks
15
+ */
16
+ export interface GestureCallbacks {
17
+ onTap?: () => void;
18
+ onSwipe?: (direction: SwipeDirection, deltaX: number, deltaY: number) => void;
19
+ onPinch?: (scale: number) => void;
20
+ onRotate?: (angle: number) => void;
21
+ }
22
+
23
+ /**
24
+ * Touch Gesture Handler Class
25
+ *
26
+ * Manages touch interactions on a specified element, interpreting various
27
+ * gestures like taps, swipes, and pinches.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const gesture = new TouchGestureHandler('myElement', {
32
+ * onSwipe: (dir, dx, dy) => console.log(`Swiped ${dir}`),
33
+ * onPinch: (scale) => console.log(`Pinch scale: ${scale}`)
34
+ * });
35
+ * ```
36
+ */
37
+ export class TouchGestureHandler {
38
+ private element: HTMLElement;
39
+ private startTouches: Touch[] | null = null;
40
+ private lastTouches: Touch[] | null = null;
41
+ private isSwiping = false;
42
+ private isPinching = false;
43
+ private callbacks: GestureCallbacks;
44
+
45
+ /**
46
+ * Creates a new TouchGestureHandler instance.
47
+ * @param elementId - The ID of the element to attach gesture handling to.
48
+ * @param callbacks - Optional callback functions for gesture events.
49
+ */
50
+ constructor(elementId: string, callbacks: GestureCallbacks = {}) {
51
+ const element = document.getElementById(elementId);
52
+ if (!element) {
53
+ throw new Error(`Element with id "${elementId}" not found`);
54
+ }
55
+ this.element = element;
56
+ this.callbacks = callbacks;
57
+ this.addTouchListeners();
58
+ }
59
+
60
+ private addTouchListeners(): void {
61
+ this.element.addEventListener('touchstart', this.handleTouchStart, false);
62
+ this.element.addEventListener('touchmove', this.handleTouchMove, false);
63
+ this.element.addEventListener('touchend', this.handleTouchEnd, false);
64
+ }
65
+
66
+ private handleTouchStart = (event: TouchEvent): void => {
67
+ if (event.touches.length === 1) {
68
+ this.startTouches = Array.from(event.touches);
69
+ } else if (event.touches.length > 1) {
70
+ this.startTouches = Array.from(event.touches);
71
+ this.isPinching = true;
72
+ }
73
+ };
74
+
75
+ private handleTouchMove = (event: TouchEvent): void => {
76
+ if (!this.startTouches) return;
77
+
78
+ this.lastTouches = Array.from(event.touches);
79
+
80
+ if (event.touches.length === 1 && !this.isPinching) {
81
+ const dx = event.touches[0].clientX - this.startTouches[0].clientX;
82
+ const dy = event.touches[0].clientY - this.startTouches[0].clientY;
83
+ if (Math.abs(dx) > 10 || Math.abs(dy) > 10) {
84
+ this.isSwiping = true;
85
+ }
86
+ } else if (event.touches.length > 1 && this.isPinching && this.startTouches.length > 1) {
87
+ const startDistance = this.getDistance(this.startTouches[0], this.startTouches[1]);
88
+ const currentDistance = this.getDistance(event.touches[0], event.touches[1]);
89
+ const scale = currentDistance / startDistance;
90
+ this.callbacks.onPinch?.(scale);
91
+ }
92
+ };
93
+
94
+ private handleTouchEnd = (): void => {
95
+ if (this.isSwiping && this.startTouches && this.lastTouches) {
96
+ const dx = this.lastTouches[0].clientX - this.startTouches[0].clientX;
97
+ const dy = this.lastTouches[0].clientY - this.startTouches[0].clientY;
98
+ const direction = this.getSwipeDirection(dx, dy);
99
+ this.callbacks.onSwipe?.(direction, dx, dy);
100
+ this.isSwiping = false;
101
+ } else if (this.isPinching) {
102
+ this.isPinching = false;
103
+ } else {
104
+ this.callbacks.onTap?.();
105
+ }
106
+ this.startTouches = null;
107
+ this.lastTouches = null;
108
+ };
109
+
110
+ /**
111
+ * Determines swipe direction based on deltas.
112
+ */
113
+ private getSwipeDirection(dx: number, dy: number): SwipeDirection {
114
+ if (Math.abs(dx) > Math.abs(dy)) {
115
+ return dx > 0 ? 'right' : 'left';
116
+ }
117
+ return dy > 0 ? 'down' : 'up';
118
+ }
119
+
120
+ /**
121
+ * Calculates the distance between two touch points.
122
+ */
123
+ private getDistance(touch1: Touch, touch2: Touch): number {
124
+ const dx = touch2.clientX - touch1.clientX;
125
+ const dy = touch2.clientY - touch1.clientY;
126
+ return Math.sqrt(dx * dx + dy * dy);
127
+ }
128
+
129
+ /**
130
+ * Removes all event listeners and cleans up.
131
+ */
132
+ public destroy(): void {
133
+ this.element.removeEventListener('touchstart', this.handleTouchStart);
134
+ this.element.removeEventListener('touchmove', this.handleTouchMove);
135
+ this.element.removeEventListener('touchend', this.handleTouchEnd);
136
+ }
137
+ }
138
+
139
+
140
+ /**
141
+ * Pointer event callbacks
142
+ */
143
+ export interface PointerGestureCallbacks {
144
+ onGestureStart?: (event: PointerEvent) => void;
145
+ onGestureMove?: (deltaX: number, deltaY: number, event: PointerEvent) => void;
146
+ onGestureEnd?: (event: PointerEvent) => void;
147
+ }
148
+
149
+ /**
150
+ * Advanced Gesture Recognition Handler
151
+ *
152
+ * Handles complex gestures for interactive applications using pointer events.
153
+ * Works with mouse, touch, and pen input.
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * const gesture = new AdvancedGestureRecognition('myElement', {
158
+ * onGestureMove: (dx, dy) => console.log(`Moved ${dx}px, ${dy}px`)
159
+ * });
160
+ * ```
161
+ */
162
+ export class AdvancedGestureRecognition {
163
+ private element: HTMLElement;
164
+ private ongoingTouches: Map<number, PointerEvent> = new Map();
165
+ private callbacks: PointerGestureCallbacks;
166
+
167
+ /**
168
+ * Creates a new AdvancedGestureRecognition instance.
169
+ * @param elementId - The ID of the element to attach gesture handling to.
170
+ * @param callbacks - Optional callback functions for gesture events.
171
+ */
172
+ constructor(elementId: string, callbacks: PointerGestureCallbacks = {}) {
173
+ const element = document.getElementById(elementId);
174
+ if (!element) {
175
+ throw new Error(`Element with id "${elementId}" not found`);
176
+ }
177
+ this.element = element;
178
+ this.callbacks = callbacks;
179
+ this.attachEventListeners();
180
+ }
181
+
182
+ private attachEventListeners(): void {
183
+ this.element.addEventListener('pointerdown', this.handleGestureStart, { passive: false });
184
+ this.element.addEventListener('pointermove', this.handleGestureMove, { passive: false });
185
+ this.element.addEventListener('pointerup', this.handleGestureEnd, { passive: false });
186
+ this.element.addEventListener('pointercancel', this.handleGestureEnd, { passive: false });
187
+ }
188
+
189
+ private handleGestureStart = (event: PointerEvent): void => {
190
+ this.ongoingTouches.set(event.pointerId, event);
191
+ this.callbacks.onGestureStart?.(event);
192
+ };
193
+
194
+ private handleGestureMove = (event: PointerEvent): void => {
195
+ if (this.ongoingTouches.has(event.pointerId)) {
196
+ const startEvent = this.ongoingTouches.get(event.pointerId)!;
197
+ const dx = event.clientX - startEvent.clientX;
198
+ const dy = event.clientY - startEvent.clientY;
199
+ this.callbacks.onGestureMove?.(dx, dy, event);
200
+ }
201
+ };
202
+
203
+ private handleGestureEnd = (event: PointerEvent): void => {
204
+ this.ongoingTouches.delete(event.pointerId);
205
+ this.callbacks.onGestureEnd?.(event);
206
+ };
207
+
208
+ /**
209
+ * Removes all event listeners and cleans up.
210
+ */
211
+ public destroy(): void {
212
+ this.element.removeEventListener('pointerdown', this.handleGestureStart);
213
+ this.element.removeEventListener('pointermove', this.handleGestureMove);
214
+ this.element.removeEventListener('pointerup', this.handleGestureEnd);
215
+ this.element.removeEventListener('pointercancel', this.handleGestureEnd);
216
+ }
217
+ }
218
+
219
+ export default {
220
+ TouchGestureHandler,
221
+ AdvancedGestureRecognition
222
+ };
223
+
224
+
225
+
226
+
@@ -0,0 +1,195 @@
1
+ // ============================================================================
2
+ // move.gl | Virtual Keyboard
3
+ // ============================================================================
4
+ // Copyright 2025 Scape Agency BV
5
+ // Licensed under MIT License
6
+ // ============================================================================
7
+
8
+ /**
9
+ * Keyboard layout configuration
10
+ */
11
+ export interface KeyboardLayout {
12
+ [mode: string]: string[][];
13
+ }
14
+
15
+ /**
16
+ * Virtual Keyboard Configuration Options
17
+ */
18
+ export interface VirtualKeyboardOptions {
19
+ /** Custom keyboard layout */
20
+ layout?: KeyboardLayout;
21
+ /** Callback when a key is pressed */
22
+ onKeyPress?: (key: string) => void;
23
+ }
24
+
25
+ /**
26
+ * Virtual Keyboard
27
+ *
28
+ * Manages the rendering and interaction of a virtual keyboard on the web.
29
+ * Supports multiple layouts (default, shift, special) and handles both
30
+ * mouse and keyboard inputs, including touch support.
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * const keyboard = new VirtualKeyboard('textInput', 'keyboard');
35
+ * keyboard.switchMode('special');
36
+ * ```
37
+ */
38
+ export class VirtualKeyboard {
39
+
40
+ private keys: { [mode: string]: string[][] } = {
41
+ "default": [
42
+ ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
43
+ ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"],
44
+ ["a", "s", "d", "f", "g", "h", "j", "k", "l"],
45
+ ["z", "x", "c", "v", "b", "n", "m", "Backspace"]
46
+ ],
47
+ "shift": [
48
+ ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")"],
49
+ ["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
50
+ ["A", "S", "D", "F", "G", "H", "J", "K", "L"],
51
+ ["Z", "X", "C", "V", "B", "N", "M", "Backspace"]
52
+ ],
53
+ "special": [
54
+ ["[", "]", "{", "}", "#", "%", "^", "*", "+", "="],
55
+ ["_", "\\", "|", "~", "<", ">", "€", "£", "¥"],
56
+ [".", ",", "?", "!", "'", '"', ":", ";", "Backspace"]
57
+ ]
58
+ };
59
+ private currentMode = "default";
60
+ private inputElement: HTMLInputElement;
61
+ private keyboardElement: HTMLElement;
62
+
63
+ /**
64
+ * @notice Initializes the virtual keyboard with specific input and
65
+ * keyboard element IDs.
66
+ * @param inputId The ID of the HTML input element to which the keyboard
67
+ * will be linked.
68
+ * @param keyboardId The ID of the container element where the keyboard
69
+ * will be rendered.
70
+ */
71
+ constructor(inputId: string, keyboardId: string) {
72
+ this.inputElement = document.getElementById(
73
+ inputId
74
+ ) as HTMLInputElement;
75
+ this.keyboardElement = document.getElementById(
76
+ keyboardId
77
+ ) as HTMLElement;
78
+ this.renderKeyboard();
79
+ this.attachEventListeners();
80
+ }
81
+
82
+ /**
83
+ * @notice Renders the keyboard based on the current mode (default, shift,
84
+ * or special).
85
+ * @dev Dynamically creates HTML for keyboard keys and appends them to the
86
+ * keyboardElement.
87
+ */
88
+ private renderKeyboard() {
89
+ // Clear existing keys
90
+ this.keyboardElement.innerHTML = "";
91
+ this.keys[this.currentMode].forEach(row => {
92
+ const rowElement = document.createElement("div");
93
+ rowElement.className = "keyboard__row";
94
+ row.forEach(key => {
95
+ const keyElement = document.createElement("div");
96
+ keyElement.textContent = key;
97
+ // Assign a class for easier CSS styling
98
+ keyElement.className = "key";
99
+ keyElement.addEventListener(
100
+ "click", () => this.handleKeyPress(key)
101
+ );
102
+ rowElement.appendChild(keyElement);
103
+ });
104
+ this.keyboardElement.appendChild(rowElement);
105
+ });
106
+ }
107
+
108
+ /**
109
+ * @notice Handles key presses on the virtual keyboard.
110
+ * @param key The key character or function (like "Backspace") that was
111
+ * pressed.
112
+ */
113
+ private handleKeyPress(key: string) {
114
+ if (key === "Backspace") {
115
+ this.inputElement.value = this.inputElement.value.slice(0, -1);
116
+ } else if (key === "Shift" || key === "CapsLock") {
117
+ this.toggleShift();
118
+ } else {
119
+ this.inputElement.value += key;
120
+ }
121
+ }
122
+
123
+ /**
124
+ * @notice Toggles the keyboard between "default" and "shift" modes.
125
+ * @dev This method is called when the "Shift" or "CapsLock" key is pressed.
126
+ */
127
+ private toggleShift() {
128
+ this.currentMode = this.currentMode === "default" ? "shift" : "default";
129
+ this.renderKeyboard();
130
+ }
131
+
132
+ /**
133
+ * @notice Attaches necessary event listeners to handle both physical
134
+ * keyboard and touch inputs.
135
+ */
136
+ private attachEventListeners() {
137
+ document.addEventListener("keydown", this.handlePhysicalKeyPress);
138
+ this.keyboardElement.addEventListener(
139
+ "touchstart", this.handleTouchStart, false
140
+ );
141
+ }
142
+
143
+ /**
144
+ * @notice Handles physical keyboard events and maps them to virtual key
145
+ * presses.
146
+ * @param event The keyboard event captured from the user"s physical
147
+ * keyboard.
148
+ */
149
+ private handlePhysicalKeyPress = (event: KeyboardEvent) => {
150
+ const key = event.key;
151
+ if (key === "Shift" || key === "CapsLock") {
152
+ this.toggleShift();
153
+ event.preventDefault();
154
+ } else if (key === "Enter" || key === "Tab") {
155
+ // Optional: Implement behavior for Enter and Tab if needed
156
+ } else {
157
+ this.handleKeyPress(key);
158
+ }
159
+ };
160
+
161
+ /**
162
+ * @notice Handles touch events on the keyboard element.
163
+ * @param event The touch event on the virtual keyboard.
164
+ */
165
+ private handleTouchStart = (event: TouchEvent) => {
166
+ event.preventDefault(); // Prevents emulating mouse events
167
+ const keyElement = event.target as HTMLElement;
168
+ if (keyElement.classList.contains("key")) {
169
+ this.handleKeyPress(keyElement.textContent || "");
170
+ }
171
+ };
172
+
173
+ /**
174
+ * @notice Switches the keyboard layout to a specified mode.
175
+ * @param mode The mode to which the keyboard layout should switch
176
+ * ("default", "shift", or "special").
177
+ */
178
+ public switchMode(mode: string) {
179
+ if (this.keys[mode]) {
180
+ this.currentMode = mode;
181
+ this.renderKeyboard();
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Removes all event listeners and cleans up.
187
+ */
188
+ public destroy(): void {
189
+ document.removeEventListener('keydown', this.handlePhysicalKeyPress);
190
+ this.keyboardElement.removeEventListener('touchstart', this.handleTouchStart);
191
+ this.keyboardElement.innerHTML = '';
192
+ }
193
+ }
194
+
195
+ export default VirtualKeyboard;