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.
- package/README.md +185 -11
- package/dist/LICENSE +21 -0
- package/dist/README.md +212 -0
- package/dist/css/move.gl.css +43859 -0
- package/dist/css/move.gl.min.css +19 -0
- package/dist/js/index.cjs +1171 -0
- package/dist/js/index.cjs.map +1 -0
- package/dist/js/index.d.cts +184 -0
- package/dist/js/index.d.ts +184 -0
- package/dist/js/index.mjs +1135 -0
- package/dist/js/index.mjs.map +1 -0
- package/dist/package.json +68 -0
- package/{scss → dist/scss}/classes/_animations.scss +33 -14
- package/dist/scss/classes/_controls.scss +314 -0
- package/dist/scss/classes/_effects.scss +283 -0
- package/dist/scss/classes/_index.scss +28 -0
- package/dist/scss/classes/_loaders.scss +779 -0
- package/dist/scss/classes/_transforms.scss +138 -0
- package/dist/scss/classes/_transitions.scss +264 -0
- package/{scss → dist/scss}/dev/_deprecation.scss +6 -3
- package/{scss → dist/scss}/dev/_modules.scss +5 -6
- package/dist/scss/docs.scss +2344 -0
- package/dist/scss/docs.scss.bak +3133 -0
- package/dist/scss/functions/_index.scss +22 -0
- package/dist/scss/functions/scenes/_bubble.scss +32 -0
- package/dist/scss/functions/scenes/_index.scss +21 -0
- package/dist/scss/index.scss +17 -0
- package/dist/scss/maps/_controls.scss +85 -0
- package/dist/scss/maps/_index.scss +22 -0
- package/{scss → dist/scss}/mixins/_accessibility.scss +24 -3
- package/{scss → dist/scss}/mixins/_boot.scss +4 -4
- package/dist/scss/mixins/_index.scss +41 -0
- package/dist/scss/mixins/_screensaver.scss +228 -0
- package/dist/scss/mixins/_shape.scss +315 -0
- package/dist/scss/mixins/animations/_base.scss +403 -0
- package/dist/scss/mixins/animations/_beat.scss +137 -0
- package/{scss → dist/scss}/mixins/animations/_blink.scss +60 -52
- package/dist/scss/mixins/animations/_bounce.scss +306 -0
- package/{scss → dist/scss}/mixins/animations/_elastic.scss +26 -22
- package/dist/scss/mixins/animations/_fade.scss +393 -0
- package/{scss → dist/scss}/mixins/animations/_flash.scss +53 -61
- package/dist/scss/mixins/animations/_flip.scss +251 -0
- package/{scss → dist/scss}/mixins/animations/_float.scss +47 -32
- package/{scss → dist/scss}/mixins/animations/_glow.scss +69 -58
- package/dist/scss/mixins/animations/_heartbeat.scss +195 -0
- package/dist/scss/mixins/animations/_hinge.scss +118 -0
- package/dist/scss/mixins/animations/_index.scss +97 -0
- package/dist/scss/mixins/animations/_jello.scss +123 -0
- package/dist/scss/mixins/animations/_jiggle.scss +162 -0
- package/dist/scss/mixins/animations/_lightspeed.scss +135 -0
- package/{scss → dist/scss}/mixins/animations/_nod.scss +57 -65
- package/dist/scss/mixins/animations/_pop.scss +153 -0
- package/dist/scss/mixins/animations/_pulse.scss +275 -0
- package/{scss → dist/scss}/mixins/animations/_ripple.scss +47 -55
- package/dist/scss/mixins/animations/_roll.scss +217 -0
- package/dist/scss/mixins/animations/_rotate.scss +728 -0
- package/dist/scss/mixins/animations/_rubber.scss +115 -0
- package/dist/scss/mixins/animations/_scale.scss +382 -0
- package/dist/scss/mixins/animations/_shake.scss +233 -0
- package/dist/scss/mixins/animations/_slide.scss +501 -0
- package/dist/scss/mixins/animations/_spin.scss +322 -0
- package/{scss → dist/scss}/mixins/animations/_sway.scss +32 -49
- package/{scss → dist/scss}/mixins/animations/_swing.scss +47 -49
- package/{scss → dist/scss}/mixins/animations/_tada.scss +44 -42
- package/{scss → dist/scss}/mixins/animations/_twist.scss +40 -55
- package/{scss → dist/scss}/mixins/animations/_wave.scss +36 -53
- package/dist/scss/mixins/animations/_wobble.scss +283 -0
- package/dist/scss/mixins/animations/_zoom.scss +394 -0
- package/{scss/mixins/mouse → dist/scss/mixins/controls}/_cursor.scss +60 -39
- package/dist/scss/mixins/controls/_hover.scss +625 -0
- package/dist/scss/mixins/controls/_index.scss +30 -0
- package/dist/scss/mixins/controls/_keyboard.scss +300 -0
- package/{scss/mixins/mouse → dist/scss/mixins/controls}/_pointer.scss +81 -72
- package/dist/scss/mixins/controls/_scroll.scss +460 -0
- package/{scss/mixins/scroll → dist/scss/mixins/controls}/_scrollbar.scss +50 -16
- package/dist/scss/mixins/controls/_selection.scss +208 -0
- package/dist/scss/mixins/controls/_touch.scss +401 -0
- package/dist/scss/mixins/effects/_blend.scss +128 -0
- package/dist/scss/mixins/effects/_filter.scss +470 -0
- package/dist/scss/mixins/effects/_focus.scss +83 -0
- package/dist/scss/mixins/effects/_gradient.scss +130 -0
- package/dist/scss/mixins/effects/_index.scss +28 -0
- package/dist/scss/mixins/effects/_mask.scss +76 -0
- package/dist/scss/mixins/effects/_opacity.scss +376 -0
- package/dist/scss/mixins/effects/_shadow.scss +429 -0
- package/dist/scss/mixins/keyframes/_base.scss +199 -0
- package/dist/scss/mixins/keyframes/_index.scss +24 -0
- package/dist/scss/mixins/keyframes/animations/_beat.scss +280 -0
- package/dist/scss/mixins/keyframes/animations/_blink.scss +82 -0
- package/dist/scss/mixins/keyframes/animations/_bounce.scss +292 -0
- package/dist/scss/mixins/keyframes/animations/_fade.scss +311 -0
- package/dist/scss/mixins/keyframes/animations/_flash.scss +165 -0
- package/dist/scss/mixins/keyframes/animations/_flip.scss +266 -0
- package/{scss/mixins → dist/scss/mixins/keyframes}/animations/_index.scss +19 -10
- package/dist/scss/mixins/keyframes/animations/_jiggle.scss +85 -0
- package/dist/scss/mixins/keyframes/animations/_lightspeed.scss +73 -0
- package/dist/scss/mixins/keyframes/animations/_nod.scss +79 -0
- package/dist/scss/mixins/keyframes/animations/_pop.scss +78 -0
- package/dist/scss/mixins/keyframes/animations/_pulse.scss +225 -0
- package/dist/scss/mixins/keyframes/animations/_ripple.scss +94 -0
- package/dist/scss/mixins/keyframes/animations/_roll.scss +124 -0
- package/dist/scss/mixins/keyframes/animations/_rotate.scss +360 -0
- package/dist/scss/mixins/keyframes/animations/_rubber.scss +81 -0
- package/dist/scss/mixins/keyframes/animations/_scale.scss +308 -0
- package/dist/scss/mixins/keyframes/animations/_shake.scss +270 -0
- package/dist/scss/mixins/keyframes/animations/_slide.scss +345 -0
- package/dist/scss/mixins/keyframes/animations/_spin.scss +270 -0
- package/dist/scss/mixins/keyframes/animations/_sway.scss +83 -0
- package/dist/scss/mixins/keyframes/animations/_twist.scss +89 -0
- package/dist/scss/mixins/keyframes/animations/_wave.scss +90 -0
- package/dist/scss/mixins/keyframes/animations/_wobble.scss +293 -0
- package/dist/scss/mixins/keyframes/animations/_zoom.scss +345 -0
- package/dist/scss/mixins/loaders/_bars.scss +128 -0
- package/dist/scss/mixins/loaders/_base.scss +39 -0
- package/dist/scss/mixins/loaders/_bubble.scss +395 -0
- package/dist/scss/mixins/loaders/_circle.scss +456 -0
- package/dist/scss/mixins/loaders/_dots.scss +248 -0
- package/dist/scss/mixins/loaders/_graph.scss +542 -0
- package/dist/scss/mixins/loaders/_index.scss +77 -0
- package/dist/scss/mixins/loaders/_line.scss +471 -0
- package/dist/scss/mixins/loaders/_objects.scss +563 -0
- package/dist/scss/mixins/loaders/_progress.scss +477 -0
- package/dist/scss/mixins/loaders/_rect.scss +480 -0
- package/dist/scss/mixins/loaders/_rings.scss +377 -0
- package/dist/scss/mixins/loaders/_skeleton.scss +461 -0
- package/dist/scss/mixins/loaders/_special.scss +611 -0
- package/dist/scss/mixins/loaders/_spinner.scss +175 -0
- package/dist/scss/mixins/loaders/_text.scss +446 -0
- package/{scss → dist/scss}/mixins/transforms/_flip.scss +16 -18
- package/dist/scss/mixins/transforms/_index.scss +28 -0
- package/dist/scss/mixins/transforms/_matrix.scss +18 -0
- package/{scss → dist/scss}/mixins/transforms/_perspective.scss +18 -1
- package/{scss → dist/scss}/mixins/transforms/_rotate.scss +9 -14
- package/{scss → dist/scss}/mixins/transforms/_scale.scss +16 -1
- package/{scss → dist/scss}/mixins/transforms/_skew.scss +16 -2
- package/{scss → dist/scss}/mixins/transforms/_translate.scss +16 -2
- package/dist/scss/mixins/transitions/_index.scss +22 -0
- package/dist/scss/mixins/transitions/_transition.scss +43 -0
- package/dist/scss/variables/_animations.scss +300 -0
- package/dist/scss/variables/_controls.scss +178 -0
- package/dist/scss/variables/_effects.scss +87 -0
- package/dist/scss/variables/_index.scss +27 -0
- package/dist/scss/variables/_keyframes.scss +28 -0
- package/dist/scss/variables/_loaders.scss +75 -0
- package/dist/scss/variables/_transforms.scss +85 -0
- package/dist/scss/variables/_transitions.scss +80 -0
- package/dist/ts/Draggable.ts +143 -0
- package/dist/ts/Gesture.ts +226 -0
- package/dist/ts/Keyboard.ts +195 -0
- package/dist/ts/LoaderManager.ts +662 -0
- package/dist/ts/Screensaver.ts +192 -0
- package/dist/ts/VideoOverlay.ts +205 -0
- package/dist/ts/demo.ts +1108 -0
- package/dist/ts/index.ts +58 -0
- package/package.json +90 -53
- package/src/html/_base.html +138 -0
- package/src/html/base.html +147 -0
- package/src/html/core-concepts.html +282 -0
- package/src/html/demo_base.html +171 -0
- package/src/html/demo_draggable.html +250 -0
- package/src/html/demo_gesture.html +264 -0
- package/src/html/demo_keyboard.html +224 -0
- package/src/html/demo_screensaver.html +258 -0
- package/src/html/demo_video_overlay.html +291 -0
- package/src/html/getting-started.html +242 -0
- package/src/html/index.html +400 -0
- package/src/html/keyboard.html +14 -0
- package/src/html/partials/_demo_links.html +21 -0
- package/src/html/partials/_footer.html +18 -0
- package/src/html/partials/_head.html +21 -0
- package/src/html/partials/_nav.html +84 -0
- package/src/html/partials/_theme_toggle.html +11 -0
- package/src/html/screensaver.html +20 -0
- package/src/html/test_animations.html +813 -0
- package/src/html/test_attention.html +281 -0
- package/src/html/test_bounce.html +201 -0
- package/src/html/test_effects.html +1348 -0
- package/src/html/test_fade.html +213 -0
- package/src/html/test_flip.html +208 -0
- package/src/html/test_keyframes.html +415 -0
- package/src/html/test_loaders.html +1489 -0
- package/src/html/test_mouse.html +516 -0
- package/src/html/test_overview.html +1444 -0
- package/src/html/test_pulse.html +212 -0
- package/src/html/test_scale.html +204 -0
- package/src/html/test_shake.html +232 -0
- package/src/html/test_slide.html +212 -0
- package/src/html/test_special.html +257 -0
- package/src/html/test_spin.html +216 -0
- package/src/html/test_transforms.html +332 -0
- package/src/html/test_transitions.html +245 -0
- package/src/html/test_zoom.html +188 -0
- package/src/html/video_overlay.html +27 -0
- package/src/jinja/_base.html.jinja +50 -0
- package/src/jinja/base.html.jinja +48 -0
- package/src/jinja/core-concepts.html.jinja +148 -0
- package/src/jinja/demo_draggable.html.jinja +114 -0
- package/src/jinja/demo_gesture.html.jinja +128 -0
- package/src/jinja/demo_keyboard.html.jinja +88 -0
- package/src/jinja/demo_screensaver.html.jinja +122 -0
- package/src/jinja/demo_video_overlay.html.jinja +155 -0
- package/src/jinja/getting-started.html.jinja +108 -0
- package/src/jinja/index.html.jinja +268 -0
- package/src/jinja/index.json +5 -0
- package/src/jinja/move.gl.css +7741 -0
- package/src/jinja/partials/_code_block.html.jinja +17 -0
- package/src/jinja/partials/_demo_links.html.jinja +41 -0
- package/src/jinja/partials/_feature_card.html.jinja +20 -0
- package/src/jinja/partials/_footer.html.jinja +22 -0
- package/src/jinja/partials/_head.html.jinja +27 -0
- package/src/jinja/partials/_nav.html.jinja +79 -0
- package/src/jinja/partials/_theme_toggle.html.jinja +15 -0
- package/src/jinja/test_animations.html.jinja +679 -0
- package/src/jinja/test_attention.html.jinja +147 -0
- package/src/jinja/test_bounce.html.jinja +67 -0
- package/src/jinja/test_effects.html.jinja +1218 -0
- package/src/jinja/test_fade.html.jinja +79 -0
- package/src/jinja/test_flip.html.jinja +74 -0
- package/src/jinja/test_keyframes.html.jinja +281 -0
- package/src/jinja/test_loaders.html.jinja +1358 -0
- package/src/jinja/test_mouse.html.jinja +382 -0
- package/src/jinja/test_overview.html.jinja +1313 -0
- package/src/jinja/test_pulse.html.jinja +78 -0
- package/src/jinja/test_scale.html.jinja +70 -0
- package/src/jinja/test_shake.html.jinja +98 -0
- package/src/jinja/test_slide.html.jinja +78 -0
- package/src/jinja/test_special.html.jinja +123 -0
- package/src/jinja/test_spin.html.jinja +82 -0
- package/src/jinja/test_transforms.html.jinja +198 -0
- package/src/jinja/test_transitions.html.jinja +111 -0
- package/src/jinja/test_zoom.html.jinja +54 -0
- package/src/scss/classes/_animations.scss +595 -0
- package/src/scss/classes/_controls.scss +314 -0
- package/src/scss/classes/_effects.scss +283 -0
- package/src/scss/classes/_index.scss +28 -0
- package/src/scss/classes/_loaders.scss +779 -0
- package/src/scss/classes/_transforms.scss +138 -0
- package/src/scss/classes/_transitions.scss +264 -0
- package/src/scss/dev/_banner.scss +36 -0
- package/src/scss/dev/_debug.scss +18 -0
- package/src/scss/dev/_deprecation.scss +13 -0
- package/src/scss/dev/_index.scss +8 -0
- package/src/scss/dev/_modules.scss +23 -0
- package/src/scss/docs.scss +2344 -0
- package/src/scss/docs.scss.bak +3133 -0
- package/src/scss/functions/_index.scss +22 -0
- package/src/scss/functions/scenes/_bubble.scss +32 -0
- package/src/scss/functions/scenes/_index.scss +21 -0
- package/src/scss/index.scss +17 -0
- package/src/scss/maps/_controls.scss +85 -0
- package/src/scss/maps/_index.scss +22 -0
- package/src/scss/mixins/_accessibility.scss +91 -0
- package/src/scss/mixins/_boot.scss +51 -0
- package/src/scss/mixins/_index.scss +41 -0
- package/src/scss/mixins/_screensaver.scss +228 -0
- package/src/scss/mixins/_shape.scss +315 -0
- package/src/scss/mixins/animations/_base.scss +403 -0
- package/src/scss/mixins/animations/_beat.scss +137 -0
- package/src/scss/mixins/animations/_blink.scss +159 -0
- package/src/scss/mixins/animations/_bounce.scss +306 -0
- package/src/scss/mixins/animations/_elastic.scss +69 -0
- package/src/scss/mixins/animations/_fade.scss +393 -0
- package/src/scss/mixins/animations/_flash.scss +169 -0
- package/src/scss/mixins/animations/_flip.scss +251 -0
- package/src/scss/mixins/animations/_float.scss +141 -0
- package/src/scss/mixins/animations/_glow.scss +190 -0
- package/src/scss/mixins/animations/_heartbeat.scss +195 -0
- package/src/scss/mixins/animations/_hinge.scss +118 -0
- package/src/scss/mixins/animations/_index.scss +97 -0
- package/src/scss/mixins/animations/_jello.scss +123 -0
- package/src/scss/mixins/animations/_jiggle.scss +162 -0
- package/src/scss/mixins/animations/_lightspeed.scss +135 -0
- package/src/scss/mixins/animations/_nod.scss +153 -0
- package/src/scss/mixins/animations/_pop.scss +153 -0
- package/src/scss/mixins/animations/_pulse.scss +275 -0
- package/src/scss/mixins/animations/_ripple.scss +161 -0
- package/src/scss/mixins/animations/_roll.scss +217 -0
- package/src/scss/mixins/animations/_rotate.scss +728 -0
- package/src/scss/mixins/animations/_rubber.scss +115 -0
- package/src/scss/mixins/animations/_scale.scss +382 -0
- package/src/scss/mixins/animations/_shake.scss +233 -0
- package/src/scss/mixins/animations/_slide.scss +501 -0
- package/src/scss/mixins/animations/_spin.scss +322 -0
- package/src/scss/mixins/animations/_sway.scss +150 -0
- package/src/scss/mixins/animations/_swing.scss +245 -0
- package/src/scss/mixins/animations/_tada.scss +235 -0
- package/src/scss/mixins/animations/_twist.scss +162 -0
- package/src/scss/mixins/animations/_wave.scss +149 -0
- package/src/scss/mixins/animations/_wobble.scss +283 -0
- package/src/scss/mixins/animations/_zoom.scss +394 -0
- package/src/scss/mixins/controls/_cursor.scss +203 -0
- package/src/scss/mixins/controls/_hover.scss +625 -0
- package/src/scss/mixins/controls/_index.scss +30 -0
- package/src/scss/mixins/controls/_keyboard.scss +300 -0
- package/src/scss/mixins/controls/_pointer.scss +267 -0
- package/src/scss/mixins/controls/_scroll.scss +460 -0
- package/src/scss/mixins/controls/_scrollbar.scss +283 -0
- package/src/scss/mixins/controls/_selection.scss +208 -0
- package/src/scss/mixins/controls/_touch.scss +401 -0
- package/src/scss/mixins/effects/_blend.scss +128 -0
- package/src/scss/mixins/effects/_filter.scss +470 -0
- package/src/scss/mixins/effects/_focus.scss +83 -0
- package/src/scss/mixins/effects/_gradient.scss +130 -0
- package/src/scss/mixins/effects/_index.scss +28 -0
- package/src/scss/mixins/effects/_mask.scss +76 -0
- package/src/scss/mixins/effects/_opacity.scss +376 -0
- package/src/scss/mixins/effects/_shadow.scss +429 -0
- package/src/scss/mixins/keyframes/_base.scss +199 -0
- package/src/scss/mixins/keyframes/_index.scss +24 -0
- package/src/scss/mixins/keyframes/animations/_beat.scss +280 -0
- package/src/scss/mixins/keyframes/animations/_blink.scss +82 -0
- package/src/scss/mixins/keyframes/animations/_bounce.scss +292 -0
- package/src/scss/mixins/keyframes/animations/_fade.scss +311 -0
- package/src/scss/mixins/keyframes/animations/_flash.scss +165 -0
- package/src/scss/mixins/keyframes/animations/_flip.scss +266 -0
- package/src/scss/mixins/keyframes/animations/_index.scss +46 -0
- package/src/scss/mixins/keyframes/animations/_jiggle.scss +85 -0
- package/src/scss/mixins/keyframes/animations/_lightspeed.scss +73 -0
- package/src/scss/mixins/keyframes/animations/_nod.scss +79 -0
- package/src/scss/mixins/keyframes/animations/_pop.scss +78 -0
- package/src/scss/mixins/keyframes/animations/_pulse.scss +225 -0
- package/src/scss/mixins/keyframes/animations/_ripple.scss +94 -0
- package/src/scss/mixins/keyframes/animations/_roll.scss +124 -0
- package/src/scss/mixins/keyframes/animations/_rotate.scss +360 -0
- package/src/scss/mixins/keyframes/animations/_rubber.scss +81 -0
- package/src/scss/mixins/keyframes/animations/_scale.scss +308 -0
- package/src/scss/mixins/keyframes/animations/_shake.scss +270 -0
- package/src/scss/mixins/keyframes/animations/_slide.scss +345 -0
- package/src/scss/mixins/keyframes/animations/_spin.scss +270 -0
- package/src/scss/mixins/keyframes/animations/_sway.scss +83 -0
- package/src/scss/mixins/keyframes/animations/_twist.scss +89 -0
- package/src/scss/mixins/keyframes/animations/_wave.scss +90 -0
- package/src/scss/mixins/keyframes/animations/_wobble.scss +293 -0
- package/src/scss/mixins/keyframes/animations/_zoom.scss +345 -0
- package/src/scss/mixins/loaders/_bars.scss +128 -0
- package/src/scss/mixins/loaders/_base.scss +39 -0
- package/src/scss/mixins/loaders/_bubble.scss +395 -0
- package/src/scss/mixins/loaders/_circle.scss +456 -0
- package/src/scss/mixins/loaders/_dots.scss +248 -0
- package/src/scss/mixins/loaders/_graph.scss +542 -0
- package/src/scss/mixins/loaders/_index.scss +77 -0
- package/src/scss/mixins/loaders/_line.scss +471 -0
- package/src/scss/mixins/loaders/_objects.scss +563 -0
- package/src/scss/mixins/loaders/_progress.scss +477 -0
- package/src/scss/mixins/loaders/_rect.scss +480 -0
- package/src/scss/mixins/loaders/_rings.scss +377 -0
- package/src/scss/mixins/loaders/_skeleton.scss +461 -0
- package/src/scss/mixins/loaders/_special.scss +611 -0
- package/src/scss/mixins/loaders/_spinner.scss +175 -0
- package/src/scss/mixins/loaders/_text.scss +446 -0
- package/src/scss/mixins/transforms/_flip.scss +74 -0
- package/src/scss/mixins/transforms/_index.scss +28 -0
- package/src/scss/mixins/transforms/_matrix.scss +18 -0
- package/src/scss/mixins/transforms/_perspective.scss +28 -0
- package/src/scss/mixins/transforms/_rotate.scss +96 -0
- package/src/scss/mixins/transforms/_scale.scss +26 -0
- package/src/scss/mixins/transforms/_skew.scss +27 -0
- package/src/scss/mixins/transforms/_translate.scss +27 -0
- package/src/scss/mixins/transitions/_index.scss +22 -0
- package/src/scss/mixins/transitions/_transition.scss +43 -0
- package/src/scss/variables/_animations.scss +300 -0
- package/src/scss/variables/_controls.scss +178 -0
- package/src/scss/variables/_effects.scss +87 -0
- package/src/scss/variables/_index.scss +27 -0
- package/src/scss/variables/_keyframes.scss +28 -0
- package/src/scss/variables/_loaders.scss +75 -0
- package/src/scss/variables/_transforms.scss +85 -0
- package/src/scss/variables/_transitions.scss +80 -0
- package/src/ts/Draggable.ts +143 -0
- package/src/ts/Gesture.ts +226 -0
- package/src/ts/Keyboard.ts +195 -0
- package/src/ts/LoaderManager.ts +662 -0
- package/src/ts/Screensaver.ts +192 -0
- package/src/ts/VideoOverlay.ts +205 -0
- package/src/ts/demo.ts +1108 -0
- package/src/ts/index.ts +58 -0
- package/css/move.gl.css +0 -2
- package/css/move.gl.min.css +0 -2
- package/scss/classes/_transforms.scss +0 -124
- package/scss/classes/keyboard.scss +0 -18
- package/scss/classes/screensaver.scss +0 -15
- package/scss/effects/_filter.scss +0 -176
- package/scss/effects/_index.scss +0 -23
- package/scss/effects/_opacity.scss +0 -62
- package/scss/effects/_shadow.scss +0 -175
- package/scss/functions/scenes/_bubble.scss +0 -19
- package/scss/functions/scenes/_index.scss +0 -20
- package/scss/index.scss +0 -0
- package/scss/keyframes/_beat.scss +0 -26
- package/scss/keyframes/_index.scss +0 -0
- package/scss/maps/_index.scss +0 -0
- package/scss/maps/_mouse.scss +0 -96
- package/scss/mixins/_hover.scss +0 -51
- package/scss/mixins/_index.scss +0 -0
- package/scss/mixins/_selection.scss +0 -321
- package/scss/mixins/_shape.scss +0 -44
- package/scss/mixins/_touch.scss +0 -95
- package/scss/mixins/animations/--hover.scss +0 -107
- package/scss/mixins/animations/_base.scss +0 -337
- package/scss/mixins/animations/_beat.scss +0 -119
- package/scss/mixins/animations/_bounce.scss +0 -192
- package/scss/mixins/animations/_fade.scss +0 -154
- package/scss/mixins/animations/_flip.scss +0 -72
- package/scss/mixins/animations/_heartbeat.scss +0 -175
- package/scss/mixins/animations/_hinge.scss +0 -119
- package/scss/mixins/animations/_jello.scss +0 -129
- package/scss/mixins/animations/_jiggle.scss +0 -163
- package/scss/mixins/animations/_lightspeed.scss +0 -130
- package/scss/mixins/animations/_pop.scss +0 -150
- package/scss/mixins/animations/_pulse.scss +0 -213
- package/scss/mixins/animations/_roll.scss +0 -261
- package/scss/mixins/animations/_rotate.scss +0 -428
- package/scss/mixins/animations/_rubber.scss +0 -116
- package/scss/mixins/animations/_scale.scss +0 -113
- package/scss/mixins/animations/_shake.scss +0 -182
- package/scss/mixins/animations/_slide.scss +0 -294
- package/scss/mixins/animations/_spin.scss +0 -219
- package/scss/mixins/animations/_wobble.scss +0 -254
- package/scss/mixins/animations/_zoom.scss +0 -166
- package/scss/mixins/effects/_filter.scss +0 -148
- package/scss/mixins/effects/_index.scss +0 -0
- package/scss/mixins/effects/_shadow.scss +0 -21
- package/scss/mixins/loaders/_index.scss +0 -0
- package/scss/mixins/loaders/_progress.scss +0 -174
- package/scss/mixins/loaders/_spinner.scss +0 -101
- package/scss/mixins/loaders/circle_01.scss +0 -22
- package/scss/mixins/loaders/circle_02.scss +0 -19
- package/scss/mixins/loaders/circle_03.scss +0 -29
- package/scss/mixins/loaders/circle_inner_01.scss +0 -33
- package/scss/mixins/loaders/circle_inner_02.scss +0 -33
- package/scss/mixins/loaders/circle_inner_03.scss +0 -34
- package/scss/mixins/mouse/_index.scss +0 -0
- package/scss/mixins/scroll/_index.scss +0 -0
- package/scss/mixins/scroll/_scroll.scss +0 -104
- package/scss/mixins/transforms/_index.scss +0 -23
- package/scss/mixins/transforms/_matrix.scss +0 -1
- package/scss/mixins/transitions/_index.scss +0 -0
- package/scss/mixins/transitions/_transition.scss +0 -13
- package/scss/variables/_animation.scss +0 -91
- package/scss/variables/_index.scss +0 -0
- package/ts/ARContent.ts +0 -27
- package/ts/ARInteraction.ts +0 -34
- package/ts/AdaptiveUI.ts +0 -25
- package/ts/ContentStreaming.ts +0 -20
- package/ts/Draggable.ts +0 -71
- package/ts/DynamicEnvironment.ts +0 -60
- package/ts/Gesture.ts +0 -168
- package/ts/ImmersiveAudio.ts +0 -40
- package/ts/InteractiveCanvas.ts +0 -177
- package/ts/InteractiveVideo.ts +0 -29
- package/ts/Keyboard.ts +0 -162
- package/ts/RealTimeCollaboration.ts +0 -25
- package/ts/Screensaver.ts +0 -140
- package/ts/SpatialNavigation.ts +0 -38
- package/ts/UserProfile.ts +0 -27
- package/ts/VRExperience.ts +0 -58
- package/ts/VideoOverlay.ts +0 -116
- package/ts/index.ts +0 -0
- /package/{scss → dist/scss}/dev/_banner.scss +0 -0
- /package/{scss → dist/scss}/dev/_debug.scss +0 -0
- /package/{scss → dist/scss}/dev/_index.scss +0 -0
- /package/{scss/classes/_index.scss → src/html/partials/_code_block.html} +0 -0
- /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;
|