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,1135 @@
|
|
|
1
|
+
// src/ts/Draggable.ts
|
|
2
|
+
var Draggable = class {
|
|
3
|
+
/**
|
|
4
|
+
* Creates a new Draggable instance.
|
|
5
|
+
* @param elementId - The ID of the HTML element to make draggable.
|
|
6
|
+
* @throws Error if element or parent element is not found.
|
|
7
|
+
*/
|
|
8
|
+
constructor(elementId) {
|
|
9
|
+
this.isDragging = false;
|
|
10
|
+
this.startX = 0;
|
|
11
|
+
this.startY = 0;
|
|
12
|
+
/**
|
|
13
|
+
* Initiates the drag operation.
|
|
14
|
+
*/
|
|
15
|
+
this.startDrag = (event) => {
|
|
16
|
+
const coords = this.getClientCoordinates(event);
|
|
17
|
+
this.isDragging = true;
|
|
18
|
+
this.startX = coords.clientX - this.element.offsetLeft;
|
|
19
|
+
this.startY = coords.clientY - this.element.offsetTop;
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Handles the drag movement.
|
|
24
|
+
*/
|
|
25
|
+
this.drag = (event) => {
|
|
26
|
+
if (!this.isDragging) return;
|
|
27
|
+
const coords = this.getClientCoordinates(event);
|
|
28
|
+
let x = coords.clientX - this.startX;
|
|
29
|
+
let y = coords.clientY - this.startY;
|
|
30
|
+
x = Math.max(this.boundRect.left, Math.min(x, this.boundRect.right - this.element.offsetWidth));
|
|
31
|
+
y = Math.max(this.boundRect.top, Math.min(y, this.boundRect.bottom - this.element.offsetHeight));
|
|
32
|
+
this.element.style.left = `${x}px`;
|
|
33
|
+
this.element.style.top = `${y}px`;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Stops the drag operation.
|
|
37
|
+
*/
|
|
38
|
+
this.stopDrag = () => {
|
|
39
|
+
this.isDragging = false;
|
|
40
|
+
};
|
|
41
|
+
const element = document.getElementById(elementId);
|
|
42
|
+
if (!element) {
|
|
43
|
+
throw new Error(`Element with id "${elementId}" not found`);
|
|
44
|
+
}
|
|
45
|
+
this.element = element;
|
|
46
|
+
const parent = this.element.parentElement;
|
|
47
|
+
if (!parent) {
|
|
48
|
+
throw new Error("Draggable element must have a parent element");
|
|
49
|
+
}
|
|
50
|
+
this.boundRect = parent.getBoundingClientRect();
|
|
51
|
+
this.attachEventListeners();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Attaches all necessary event listeners for drag functionality.
|
|
55
|
+
*/
|
|
56
|
+
attachEventListeners() {
|
|
57
|
+
this.element.addEventListener("mousedown", this.startDrag);
|
|
58
|
+
this.element.addEventListener("touchstart", this.startDrag, { passive: false });
|
|
59
|
+
document.addEventListener("mouseup", this.stopDrag);
|
|
60
|
+
document.addEventListener("touchend", this.stopDrag);
|
|
61
|
+
document.addEventListener("mousemove", this.drag);
|
|
62
|
+
document.addEventListener("touchmove", this.drag, { passive: false });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Gets the client coordinates from a mouse or touch event.
|
|
66
|
+
*/
|
|
67
|
+
getClientCoordinates(event) {
|
|
68
|
+
if ("touches" in event && event.touches.length > 0) {
|
|
69
|
+
return {
|
|
70
|
+
clientX: event.touches[0].clientX,
|
|
71
|
+
clientY: event.touches[0].clientY
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
clientX: event.clientX,
|
|
76
|
+
clientY: event.clientY
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Removes all event listeners and cleans up.
|
|
81
|
+
*/
|
|
82
|
+
destroy() {
|
|
83
|
+
this.element.removeEventListener("mousedown", this.startDrag);
|
|
84
|
+
this.element.removeEventListener("touchstart", this.startDrag);
|
|
85
|
+
document.removeEventListener("mouseup", this.stopDrag);
|
|
86
|
+
document.removeEventListener("touchend", this.stopDrag);
|
|
87
|
+
document.removeEventListener("mousemove", this.drag);
|
|
88
|
+
document.removeEventListener("touchmove", this.drag);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// src/ts/Screensaver.ts
|
|
93
|
+
var Screensaver = class {
|
|
94
|
+
/**
|
|
95
|
+
* Creates a new Screensaver instance.
|
|
96
|
+
* @param options - Configuration options for the screensaver.
|
|
97
|
+
*/
|
|
98
|
+
constructor(options) {
|
|
99
|
+
this.screensaverElement = null;
|
|
100
|
+
this.videoElement = null;
|
|
101
|
+
this.audioElement = null;
|
|
102
|
+
this.isActive = false;
|
|
103
|
+
/**
|
|
104
|
+
* @notice Resets the screensaver timer and stops the screensaver if
|
|
105
|
+
* active.
|
|
106
|
+
* @dev Called upon user interactions detected by event listeners.
|
|
107
|
+
*/
|
|
108
|
+
this.resetScreensaver = () => {
|
|
109
|
+
if (this.isActive) {
|
|
110
|
+
this.stopScreensaver();
|
|
111
|
+
}
|
|
112
|
+
this.startScreensaverTimeout();
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Activates the screensaver, displaying elements and playing media.
|
|
116
|
+
*/
|
|
117
|
+
this.activateScreensaver = () => {
|
|
118
|
+
if (this.screensaverElement) {
|
|
119
|
+
this.screensaverElement.style.display = "block";
|
|
120
|
+
}
|
|
121
|
+
this.videoElement?.play();
|
|
122
|
+
this.audioElement?.play();
|
|
123
|
+
this.isActive = true;
|
|
124
|
+
};
|
|
125
|
+
this.options = {
|
|
126
|
+
containerId: "screensaver",
|
|
127
|
+
videoId: "screensaverVideo",
|
|
128
|
+
audioId: "screensaverAudio",
|
|
129
|
+
...options
|
|
130
|
+
};
|
|
131
|
+
this.timeout = options.timeout;
|
|
132
|
+
this.initializeElements();
|
|
133
|
+
if (options.videoUrl && options.audioUrl) {
|
|
134
|
+
this.loadMedia(options.videoUrl, options.audioUrl);
|
|
135
|
+
}
|
|
136
|
+
this.setupEventListeners();
|
|
137
|
+
this.startScreensaverTimeout();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Initializes HTML elements from the DOM.
|
|
141
|
+
*/
|
|
142
|
+
initializeElements() {
|
|
143
|
+
this.screensaverElement = document.getElementById(this.options.containerId);
|
|
144
|
+
this.videoElement = document.getElementById(this.options.videoId);
|
|
145
|
+
this.audioElement = document.getElementById(this.options.audioId);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Loads media sources into the video and audio elements.
|
|
149
|
+
* @param videoUrl - The source URL of the video.
|
|
150
|
+
* @param audioUrl - The source URL of the audio.
|
|
151
|
+
*/
|
|
152
|
+
loadMedia(videoUrl, audioUrl) {
|
|
153
|
+
if (this.videoElement) {
|
|
154
|
+
this.videoElement.src = videoUrl;
|
|
155
|
+
}
|
|
156
|
+
if (this.audioElement) {
|
|
157
|
+
this.audioElement.src = audioUrl;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* @notice Sets up event listeners for user interaction to prevent
|
|
162
|
+
* screensaver activation.
|
|
163
|
+
* @dev Listens for 'mousemove', 'keydown', and 'touchstart' events
|
|
164
|
+
* to reset the screensaver timer.
|
|
165
|
+
*/
|
|
166
|
+
setupEventListeners() {
|
|
167
|
+
["mousemove", "keydown", "touchstart"].forEach((event) => {
|
|
168
|
+
document.addEventListener(event, this.resetScreensaver);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* @notice Starts or restarts the screensaver timeout.
|
|
173
|
+
* @dev Resets any existing timeout and sets a new timeout to activate
|
|
174
|
+
* the screensaver.
|
|
175
|
+
*/
|
|
176
|
+
startScreensaverTimeout() {
|
|
177
|
+
this.stopScreensaver();
|
|
178
|
+
this.timeoutId = window.setTimeout(
|
|
179
|
+
() => this.activateScreensaver(),
|
|
180
|
+
this.timeout
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Stops the screensaver and hides its elements.
|
|
185
|
+
*/
|
|
186
|
+
stopScreensaver() {
|
|
187
|
+
if (this.screensaverElement) {
|
|
188
|
+
this.screensaverElement.style.display = "none";
|
|
189
|
+
}
|
|
190
|
+
this.videoElement?.pause();
|
|
191
|
+
this.audioElement?.pause();
|
|
192
|
+
this.isActive = false;
|
|
193
|
+
if (this.timeoutId !== void 0) {
|
|
194
|
+
clearTimeout(this.timeoutId);
|
|
195
|
+
this.timeoutId = void 0;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Sets the volume for both video and audio elements.
|
|
200
|
+
* @param volume - A number between 0.0 and 1.0 indicating the volume level.
|
|
201
|
+
*/
|
|
202
|
+
setVolume(volume) {
|
|
203
|
+
const clampedVolume = Math.max(0, Math.min(1, volume));
|
|
204
|
+
if (this.videoElement) {
|
|
205
|
+
this.videoElement.volume = clampedVolume;
|
|
206
|
+
}
|
|
207
|
+
if (this.audioElement) {
|
|
208
|
+
this.audioElement.volume = clampedVolume;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Returns whether the screensaver is currently active.
|
|
213
|
+
*/
|
|
214
|
+
getIsActive() {
|
|
215
|
+
return this.isActive;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Cleans up event listeners and stops the screensaver.
|
|
219
|
+
*/
|
|
220
|
+
destroy() {
|
|
221
|
+
this.stopScreensaver();
|
|
222
|
+
["mousemove", "keydown", "touchstart"].forEach((event) => {
|
|
223
|
+
document.removeEventListener(event, this.resetScreensaver);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
// src/ts/Keyboard.ts
|
|
229
|
+
var VirtualKeyboard = class {
|
|
230
|
+
/**
|
|
231
|
+
* @notice Initializes the virtual keyboard with specific input and
|
|
232
|
+
* keyboard element IDs.
|
|
233
|
+
* @param inputId The ID of the HTML input element to which the keyboard
|
|
234
|
+
* will be linked.
|
|
235
|
+
* @param keyboardId The ID of the container element where the keyboard
|
|
236
|
+
* will be rendered.
|
|
237
|
+
*/
|
|
238
|
+
constructor(inputId, keyboardId) {
|
|
239
|
+
this.keys = {
|
|
240
|
+
"default": [
|
|
241
|
+
["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
|
|
242
|
+
["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"],
|
|
243
|
+
["a", "s", "d", "f", "g", "h", "j", "k", "l"],
|
|
244
|
+
["z", "x", "c", "v", "b", "n", "m", "Backspace"]
|
|
245
|
+
],
|
|
246
|
+
"shift": [
|
|
247
|
+
["!", "@", "#", "$", "%", "^", "&", "*", "(", ")"],
|
|
248
|
+
["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
|
|
249
|
+
["A", "S", "D", "F", "G", "H", "J", "K", "L"],
|
|
250
|
+
["Z", "X", "C", "V", "B", "N", "M", "Backspace"]
|
|
251
|
+
],
|
|
252
|
+
"special": [
|
|
253
|
+
["[", "]", "{", "}", "#", "%", "^", "*", "+", "="],
|
|
254
|
+
["_", "\\", "|", "~", "<", ">", "\u20AC", "\xA3", "\xA5"],
|
|
255
|
+
[".", ",", "?", "!", "'", '"', ":", ";", "Backspace"]
|
|
256
|
+
]
|
|
257
|
+
};
|
|
258
|
+
this.currentMode = "default";
|
|
259
|
+
/**
|
|
260
|
+
* @notice Handles physical keyboard events and maps them to virtual key
|
|
261
|
+
* presses.
|
|
262
|
+
* @param event The keyboard event captured from the user"s physical
|
|
263
|
+
* keyboard.
|
|
264
|
+
*/
|
|
265
|
+
this.handlePhysicalKeyPress = (event) => {
|
|
266
|
+
const key = event.key;
|
|
267
|
+
if (key === "Shift" || key === "CapsLock") {
|
|
268
|
+
this.toggleShift();
|
|
269
|
+
event.preventDefault();
|
|
270
|
+
} else if (key === "Enter" || key === "Tab") {
|
|
271
|
+
} else {
|
|
272
|
+
this.handleKeyPress(key);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
/**
|
|
276
|
+
* @notice Handles touch events on the keyboard element.
|
|
277
|
+
* @param event The touch event on the virtual keyboard.
|
|
278
|
+
*/
|
|
279
|
+
this.handleTouchStart = (event) => {
|
|
280
|
+
event.preventDefault();
|
|
281
|
+
const keyElement = event.target;
|
|
282
|
+
if (keyElement.classList.contains("key")) {
|
|
283
|
+
this.handleKeyPress(keyElement.textContent || "");
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
this.inputElement = document.getElementById(
|
|
287
|
+
inputId
|
|
288
|
+
);
|
|
289
|
+
this.keyboardElement = document.getElementById(
|
|
290
|
+
keyboardId
|
|
291
|
+
);
|
|
292
|
+
this.renderKeyboard();
|
|
293
|
+
this.attachEventListeners();
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* @notice Renders the keyboard based on the current mode (default, shift,
|
|
297
|
+
* or special).
|
|
298
|
+
* @dev Dynamically creates HTML for keyboard keys and appends them to the
|
|
299
|
+
* keyboardElement.
|
|
300
|
+
*/
|
|
301
|
+
renderKeyboard() {
|
|
302
|
+
this.keyboardElement.innerHTML = "";
|
|
303
|
+
this.keys[this.currentMode].forEach((row) => {
|
|
304
|
+
const rowElement = document.createElement("div");
|
|
305
|
+
rowElement.className = "keyboard__row";
|
|
306
|
+
row.forEach((key) => {
|
|
307
|
+
const keyElement = document.createElement("div");
|
|
308
|
+
keyElement.textContent = key;
|
|
309
|
+
keyElement.className = "key";
|
|
310
|
+
keyElement.addEventListener(
|
|
311
|
+
"click",
|
|
312
|
+
() => this.handleKeyPress(key)
|
|
313
|
+
);
|
|
314
|
+
rowElement.appendChild(keyElement);
|
|
315
|
+
});
|
|
316
|
+
this.keyboardElement.appendChild(rowElement);
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* @notice Handles key presses on the virtual keyboard.
|
|
321
|
+
* @param key The key character or function (like "Backspace") that was
|
|
322
|
+
* pressed.
|
|
323
|
+
*/
|
|
324
|
+
handleKeyPress(key) {
|
|
325
|
+
if (key === "Backspace") {
|
|
326
|
+
this.inputElement.value = this.inputElement.value.slice(0, -1);
|
|
327
|
+
} else if (key === "Shift" || key === "CapsLock") {
|
|
328
|
+
this.toggleShift();
|
|
329
|
+
} else {
|
|
330
|
+
this.inputElement.value += key;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* @notice Toggles the keyboard between "default" and "shift" modes.
|
|
335
|
+
* @dev This method is called when the "Shift" or "CapsLock" key is pressed.
|
|
336
|
+
*/
|
|
337
|
+
toggleShift() {
|
|
338
|
+
this.currentMode = this.currentMode === "default" ? "shift" : "default";
|
|
339
|
+
this.renderKeyboard();
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* @notice Attaches necessary event listeners to handle both physical
|
|
343
|
+
* keyboard and touch inputs.
|
|
344
|
+
*/
|
|
345
|
+
attachEventListeners() {
|
|
346
|
+
document.addEventListener("keydown", this.handlePhysicalKeyPress);
|
|
347
|
+
this.keyboardElement.addEventListener(
|
|
348
|
+
"touchstart",
|
|
349
|
+
this.handleTouchStart,
|
|
350
|
+
false
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* @notice Switches the keyboard layout to a specified mode.
|
|
355
|
+
* @param mode The mode to which the keyboard layout should switch
|
|
356
|
+
* ("default", "shift", or "special").
|
|
357
|
+
*/
|
|
358
|
+
switchMode(mode) {
|
|
359
|
+
if (this.keys[mode]) {
|
|
360
|
+
this.currentMode = mode;
|
|
361
|
+
this.renderKeyboard();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Removes all event listeners and cleans up.
|
|
366
|
+
*/
|
|
367
|
+
destroy() {
|
|
368
|
+
document.removeEventListener("keydown", this.handlePhysicalKeyPress);
|
|
369
|
+
this.keyboardElement.removeEventListener("touchstart", this.handleTouchStart);
|
|
370
|
+
this.keyboardElement.innerHTML = "";
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
// src/ts/Gesture.ts
|
|
375
|
+
var TouchGestureHandler = class {
|
|
376
|
+
/**
|
|
377
|
+
* Creates a new TouchGestureHandler instance.
|
|
378
|
+
* @param elementId - The ID of the element to attach gesture handling to.
|
|
379
|
+
* @param callbacks - Optional callback functions for gesture events.
|
|
380
|
+
*/
|
|
381
|
+
constructor(elementId, callbacks = {}) {
|
|
382
|
+
this.startTouches = null;
|
|
383
|
+
this.lastTouches = null;
|
|
384
|
+
this.isSwiping = false;
|
|
385
|
+
this.isPinching = false;
|
|
386
|
+
this.handleTouchStart = (event) => {
|
|
387
|
+
if (event.touches.length === 1) {
|
|
388
|
+
this.startTouches = Array.from(event.touches);
|
|
389
|
+
} else if (event.touches.length > 1) {
|
|
390
|
+
this.startTouches = Array.from(event.touches);
|
|
391
|
+
this.isPinching = true;
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
this.handleTouchMove = (event) => {
|
|
395
|
+
if (!this.startTouches) return;
|
|
396
|
+
this.lastTouches = Array.from(event.touches);
|
|
397
|
+
if (event.touches.length === 1 && !this.isPinching) {
|
|
398
|
+
const dx = event.touches[0].clientX - this.startTouches[0].clientX;
|
|
399
|
+
const dy = event.touches[0].clientY - this.startTouches[0].clientY;
|
|
400
|
+
if (Math.abs(dx) > 10 || Math.abs(dy) > 10) {
|
|
401
|
+
this.isSwiping = true;
|
|
402
|
+
}
|
|
403
|
+
} else if (event.touches.length > 1 && this.isPinching && this.startTouches.length > 1) {
|
|
404
|
+
const startDistance = this.getDistance(this.startTouches[0], this.startTouches[1]);
|
|
405
|
+
const currentDistance = this.getDistance(event.touches[0], event.touches[1]);
|
|
406
|
+
const scale = currentDistance / startDistance;
|
|
407
|
+
this.callbacks.onPinch?.(scale);
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
this.handleTouchEnd = () => {
|
|
411
|
+
if (this.isSwiping && this.startTouches && this.lastTouches) {
|
|
412
|
+
const dx = this.lastTouches[0].clientX - this.startTouches[0].clientX;
|
|
413
|
+
const dy = this.lastTouches[0].clientY - this.startTouches[0].clientY;
|
|
414
|
+
const direction = this.getSwipeDirection(dx, dy);
|
|
415
|
+
this.callbacks.onSwipe?.(direction, dx, dy);
|
|
416
|
+
this.isSwiping = false;
|
|
417
|
+
} else if (this.isPinching) {
|
|
418
|
+
this.isPinching = false;
|
|
419
|
+
} else {
|
|
420
|
+
this.callbacks.onTap?.();
|
|
421
|
+
}
|
|
422
|
+
this.startTouches = null;
|
|
423
|
+
this.lastTouches = null;
|
|
424
|
+
};
|
|
425
|
+
const element = document.getElementById(elementId);
|
|
426
|
+
if (!element) {
|
|
427
|
+
throw new Error(`Element with id "${elementId}" not found`);
|
|
428
|
+
}
|
|
429
|
+
this.element = element;
|
|
430
|
+
this.callbacks = callbacks;
|
|
431
|
+
this.addTouchListeners();
|
|
432
|
+
}
|
|
433
|
+
addTouchListeners() {
|
|
434
|
+
this.element.addEventListener("touchstart", this.handleTouchStart, false);
|
|
435
|
+
this.element.addEventListener("touchmove", this.handleTouchMove, false);
|
|
436
|
+
this.element.addEventListener("touchend", this.handleTouchEnd, false);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Determines swipe direction based on deltas.
|
|
440
|
+
*/
|
|
441
|
+
getSwipeDirection(dx, dy) {
|
|
442
|
+
if (Math.abs(dx) > Math.abs(dy)) {
|
|
443
|
+
return dx > 0 ? "right" : "left";
|
|
444
|
+
}
|
|
445
|
+
return dy > 0 ? "down" : "up";
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Calculates the distance between two touch points.
|
|
449
|
+
*/
|
|
450
|
+
getDistance(touch1, touch2) {
|
|
451
|
+
const dx = touch2.clientX - touch1.clientX;
|
|
452
|
+
const dy = touch2.clientY - touch1.clientY;
|
|
453
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Removes all event listeners and cleans up.
|
|
457
|
+
*/
|
|
458
|
+
destroy() {
|
|
459
|
+
this.element.removeEventListener("touchstart", this.handleTouchStart);
|
|
460
|
+
this.element.removeEventListener("touchmove", this.handleTouchMove);
|
|
461
|
+
this.element.removeEventListener("touchend", this.handleTouchEnd);
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
var AdvancedGestureRecognition = class {
|
|
465
|
+
/**
|
|
466
|
+
* Creates a new AdvancedGestureRecognition instance.
|
|
467
|
+
* @param elementId - The ID of the element to attach gesture handling to.
|
|
468
|
+
* @param callbacks - Optional callback functions for gesture events.
|
|
469
|
+
*/
|
|
470
|
+
constructor(elementId, callbacks = {}) {
|
|
471
|
+
this.ongoingTouches = /* @__PURE__ */ new Map();
|
|
472
|
+
this.handleGestureStart = (event) => {
|
|
473
|
+
this.ongoingTouches.set(event.pointerId, event);
|
|
474
|
+
this.callbacks.onGestureStart?.(event);
|
|
475
|
+
};
|
|
476
|
+
this.handleGestureMove = (event) => {
|
|
477
|
+
if (this.ongoingTouches.has(event.pointerId)) {
|
|
478
|
+
const startEvent = this.ongoingTouches.get(event.pointerId);
|
|
479
|
+
const dx = event.clientX - startEvent.clientX;
|
|
480
|
+
const dy = event.clientY - startEvent.clientY;
|
|
481
|
+
this.callbacks.onGestureMove?.(dx, dy, event);
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
this.handleGestureEnd = (event) => {
|
|
485
|
+
this.ongoingTouches.delete(event.pointerId);
|
|
486
|
+
this.callbacks.onGestureEnd?.(event);
|
|
487
|
+
};
|
|
488
|
+
const element = document.getElementById(elementId);
|
|
489
|
+
if (!element) {
|
|
490
|
+
throw new Error(`Element with id "${elementId}" not found`);
|
|
491
|
+
}
|
|
492
|
+
this.element = element;
|
|
493
|
+
this.callbacks = callbacks;
|
|
494
|
+
this.attachEventListeners();
|
|
495
|
+
}
|
|
496
|
+
attachEventListeners() {
|
|
497
|
+
this.element.addEventListener("pointerdown", this.handleGestureStart, { passive: false });
|
|
498
|
+
this.element.addEventListener("pointermove", this.handleGestureMove, { passive: false });
|
|
499
|
+
this.element.addEventListener("pointerup", this.handleGestureEnd, { passive: false });
|
|
500
|
+
this.element.addEventListener("pointercancel", this.handleGestureEnd, { passive: false });
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Removes all event listeners and cleans up.
|
|
504
|
+
*/
|
|
505
|
+
destroy() {
|
|
506
|
+
this.element.removeEventListener("pointerdown", this.handleGestureStart);
|
|
507
|
+
this.element.removeEventListener("pointermove", this.handleGestureMove);
|
|
508
|
+
this.element.removeEventListener("pointerup", this.handleGestureEnd);
|
|
509
|
+
this.element.removeEventListener("pointercancel", this.handleGestureEnd);
|
|
510
|
+
}
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
// src/ts/VideoOverlay.ts
|
|
514
|
+
var TransparentVideoOverlay = class {
|
|
515
|
+
/**
|
|
516
|
+
* Creates a new TransparentVideoOverlay instance.
|
|
517
|
+
* @param videoElementId - The ID of the video element to manage.
|
|
518
|
+
* @param options - Optional configuration options.
|
|
519
|
+
*/
|
|
520
|
+
constructor(videoElementId, options = {}) {
|
|
521
|
+
this.videoElement = null;
|
|
522
|
+
this.isVisible = false;
|
|
523
|
+
const element = document.getElementById(videoElementId);
|
|
524
|
+
if (element instanceof HTMLVideoElement) {
|
|
525
|
+
this.videoElement = element;
|
|
526
|
+
} else {
|
|
527
|
+
console.warn(`Element with id "${videoElementId}" is not a video element`);
|
|
528
|
+
}
|
|
529
|
+
this.fadeTransitionDuration = options.fadeTransitionDuration ?? 500;
|
|
530
|
+
this.loop = options.loop ?? true;
|
|
531
|
+
if (this.videoElement) {
|
|
532
|
+
this.setupVideo();
|
|
533
|
+
if (options.initialSource) {
|
|
534
|
+
this.changeVideoSource(options.initialSource, false);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Initializes video settings and event listeners.
|
|
540
|
+
*/
|
|
541
|
+
setupVideo() {
|
|
542
|
+
if (!this.videoElement) return;
|
|
543
|
+
if (this.loop) {
|
|
544
|
+
this.videoElement.addEventListener("ended", () => {
|
|
545
|
+
this.videoElement?.play();
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
this.videoElement.addEventListener("loadeddata", () => {
|
|
549
|
+
console.log("Video loaded successfully.");
|
|
550
|
+
});
|
|
551
|
+
this.videoElement.addEventListener("error", (e) => {
|
|
552
|
+
console.error("Error loading video:", e);
|
|
553
|
+
});
|
|
554
|
+
this.videoElement.style.transition = `opacity ${this.fadeTransitionDuration}ms ease`;
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Shows the video overlay with a fade-in effect.
|
|
558
|
+
*/
|
|
559
|
+
showOverlay() {
|
|
560
|
+
if (!this.videoElement) return;
|
|
561
|
+
this.videoElement.style.display = "block";
|
|
562
|
+
this.videoElement.style.opacity = "0";
|
|
563
|
+
requestAnimationFrame(() => {
|
|
564
|
+
if (this.videoElement) {
|
|
565
|
+
this.videoElement.style.opacity = "1";
|
|
566
|
+
this.videoElement.play().catch((err) => {
|
|
567
|
+
console.warn("Auto-play prevented:", err);
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
});
|
|
571
|
+
this.isVisible = true;
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Hides the video overlay with a fade-out effect.
|
|
575
|
+
*/
|
|
576
|
+
hideOverlay() {
|
|
577
|
+
if (!this.videoElement) return;
|
|
578
|
+
this.videoElement.style.opacity = "0";
|
|
579
|
+
setTimeout(() => {
|
|
580
|
+
if (this.videoElement) {
|
|
581
|
+
this.videoElement.style.display = "none";
|
|
582
|
+
this.videoElement.pause();
|
|
583
|
+
}
|
|
584
|
+
}, this.fadeTransitionDuration);
|
|
585
|
+
this.isVisible = false;
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Toggles the visibility of the video overlay.
|
|
589
|
+
*/
|
|
590
|
+
toggleOverlay() {
|
|
591
|
+
if (this.isVisible) {
|
|
592
|
+
this.hideOverlay();
|
|
593
|
+
} else {
|
|
594
|
+
this.showOverlay();
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Changes the video source and optionally plays it immediately.
|
|
599
|
+
* @param videoUrl - The URL of the new video source.
|
|
600
|
+
* @param autoPlay - Whether the video should play immediately after loading.
|
|
601
|
+
*/
|
|
602
|
+
changeVideoSource(videoUrl, autoPlay = true) {
|
|
603
|
+
if (!this.videoElement) return;
|
|
604
|
+
this.videoElement.src = videoUrl;
|
|
605
|
+
this.videoElement.load();
|
|
606
|
+
if (autoPlay) {
|
|
607
|
+
this.showOverlay();
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Gets the visibility state of the overlay.
|
|
612
|
+
*/
|
|
613
|
+
getIsVisible() {
|
|
614
|
+
return this.isVisible;
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Cleans up the video overlay instance.
|
|
618
|
+
*/
|
|
619
|
+
destroy() {
|
|
620
|
+
if (this.videoElement) {
|
|
621
|
+
this.videoElement.pause();
|
|
622
|
+
this.videoElement.src = "";
|
|
623
|
+
this.videoElement = null;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
};
|
|
627
|
+
function supportsHEVCAlpha() {
|
|
628
|
+
const navigator = window.navigator;
|
|
629
|
+
const ua = navigator.userAgent.toLowerCase();
|
|
630
|
+
const hasMediaCapabilities = !!(navigator.mediaCapabilities && navigator.mediaCapabilities.decodingInfo);
|
|
631
|
+
const isSafari = ua.indexOf("safari") !== -1 && ua.indexOf("chrome") === -1 && ua.indexOf("version/") !== -1;
|
|
632
|
+
return isSafari && hasMediaCapabilities;
|
|
633
|
+
}
|
|
634
|
+
function getOptimalVideoSource(hevcSource, webmSource) {
|
|
635
|
+
return supportsHEVCAlpha() ? hevcSource : webmSource;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
// src/ts/LoaderManager.ts
|
|
639
|
+
var LoaderManager = class {
|
|
640
|
+
// ========================================================================
|
|
641
|
+
// Constructor
|
|
642
|
+
// ========================================================================
|
|
643
|
+
/**
|
|
644
|
+
* Creates a new LoaderManager instance.
|
|
645
|
+
* @param preloadBuiltins - Whether to preload built-in loaders (default: true)
|
|
646
|
+
*/
|
|
647
|
+
constructor(preloadBuiltins = true) {
|
|
648
|
+
// ========================================================================
|
|
649
|
+
// Properties
|
|
650
|
+
// ========================================================================
|
|
651
|
+
/** Registry of loader configurations */
|
|
652
|
+
this.loaders = /* @__PURE__ */ new Map();
|
|
653
|
+
/** Active loader instances */
|
|
654
|
+
this.activeLoaders = /* @__PURE__ */ new Map();
|
|
655
|
+
/** Default CSS variables for customization */
|
|
656
|
+
this.defaultVars = {
|
|
657
|
+
"--loader-size": "48px",
|
|
658
|
+
"--loader-color": "#FFF",
|
|
659
|
+
"--loader-accent": "#FF3D00",
|
|
660
|
+
"--loader-speed": "1s"
|
|
661
|
+
};
|
|
662
|
+
if (preloadBuiltins) {
|
|
663
|
+
this.registerBuiltinLoaders();
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
// ========================================================================
|
|
667
|
+
// Public Methods
|
|
668
|
+
// ========================================================================
|
|
669
|
+
/**
|
|
670
|
+
* Registers a loader configuration.
|
|
671
|
+
* @param config - The loader configuration to register
|
|
672
|
+
* @returns The LoaderManager instance for chaining
|
|
673
|
+
*/
|
|
674
|
+
register(config) {
|
|
675
|
+
this.loaders.set(config.id, config);
|
|
676
|
+
return this;
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Registers multiple loader configurations.
|
|
680
|
+
* @param configs - Array of loader configurations
|
|
681
|
+
* @returns The LoaderManager instance for chaining
|
|
682
|
+
*/
|
|
683
|
+
registerAll(configs) {
|
|
684
|
+
configs.forEach((config) => this.register(config));
|
|
685
|
+
return this;
|
|
686
|
+
}
|
|
687
|
+
/**
|
|
688
|
+
* Creates and mounts a loader element.
|
|
689
|
+
* @param loaderId - ID of the registered loader to create
|
|
690
|
+
* @param options - Creation options
|
|
691
|
+
* @returns The created loader element
|
|
692
|
+
*/
|
|
693
|
+
create(loaderId, options = {}) {
|
|
694
|
+
const config = this.loaders.get(loaderId);
|
|
695
|
+
if (!config) {
|
|
696
|
+
throw new Error(`Loader "${loaderId}" not found. Register it first.`);
|
|
697
|
+
}
|
|
698
|
+
const {
|
|
699
|
+
container,
|
|
700
|
+
useShadowDOM = true,
|
|
701
|
+
className = "",
|
|
702
|
+
size,
|
|
703
|
+
color,
|
|
704
|
+
accentColor
|
|
705
|
+
} = options;
|
|
706
|
+
const wrapper = document.createElement("div");
|
|
707
|
+
wrapper.className = `loader-wrapper ${className}`.trim();
|
|
708
|
+
wrapper.setAttribute("data-loader-id", loaderId);
|
|
709
|
+
if (size) {
|
|
710
|
+
wrapper.style.setProperty("--loader-size", typeof size === "number" ? `${size}px` : size);
|
|
711
|
+
}
|
|
712
|
+
if (color) {
|
|
713
|
+
wrapper.style.setProperty("--loader-color", color);
|
|
714
|
+
}
|
|
715
|
+
if (accentColor) {
|
|
716
|
+
wrapper.style.setProperty("--loader-accent", accentColor);
|
|
717
|
+
}
|
|
718
|
+
if (useShadowDOM) {
|
|
719
|
+
const shadowRoot = wrapper.attachShadow({ mode: "open" });
|
|
720
|
+
const styleEl = document.createElement("style");
|
|
721
|
+
styleEl.textContent = this.processCSS(config.css, options);
|
|
722
|
+
shadowRoot.appendChild(styleEl);
|
|
723
|
+
const loaderEl = document.createElement("span");
|
|
724
|
+
loaderEl.className = "loader";
|
|
725
|
+
if (config.content) {
|
|
726
|
+
loaderEl.innerHTML = config.content;
|
|
727
|
+
}
|
|
728
|
+
shadowRoot.appendChild(loaderEl);
|
|
729
|
+
this.activeLoaders.set(wrapper, { id: loaderId, shadowRoot });
|
|
730
|
+
} else {
|
|
731
|
+
const styleEl = document.createElement("style");
|
|
732
|
+
styleEl.textContent = this.scopeCSS(config.css, wrapper, loaderId);
|
|
733
|
+
wrapper.appendChild(styleEl);
|
|
734
|
+
const loaderEl = document.createElement("span");
|
|
735
|
+
loaderEl.className = `loader loader-${loaderId}`;
|
|
736
|
+
if (config.content) {
|
|
737
|
+
loaderEl.innerHTML = config.content;
|
|
738
|
+
}
|
|
739
|
+
wrapper.appendChild(loaderEl);
|
|
740
|
+
this.activeLoaders.set(wrapper, { id: loaderId });
|
|
741
|
+
}
|
|
742
|
+
if (container) {
|
|
743
|
+
const containerEl = typeof container === "string" ? document.querySelector(container) : container;
|
|
744
|
+
containerEl?.appendChild(wrapper);
|
|
745
|
+
}
|
|
746
|
+
return wrapper;
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Creates a full-screen overlay loader.
|
|
750
|
+
* @param loaderId - ID of the registered loader
|
|
751
|
+
* @param options - Creation options
|
|
752
|
+
* @returns The created overlay element
|
|
753
|
+
*/
|
|
754
|
+
createOverlay(loaderId, options = {}) {
|
|
755
|
+
const overlay = document.createElement("div");
|
|
756
|
+
overlay.className = "loader-overlay";
|
|
757
|
+
overlay.style.cssText = `
|
|
758
|
+
position: fixed;
|
|
759
|
+
inset: 0;
|
|
760
|
+
display: flex;
|
|
761
|
+
align-items: center;
|
|
762
|
+
justify-content: center;
|
|
763
|
+
background: rgba(0, 0, 0, 0.7);
|
|
764
|
+
z-index: 9999;
|
|
765
|
+
`;
|
|
766
|
+
const loader = this.create(loaderId, { ...options, container: overlay });
|
|
767
|
+
document.body.appendChild(overlay);
|
|
768
|
+
this.activeLoaders.set(overlay, { id: `overlay-${loaderId}` });
|
|
769
|
+
return overlay;
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* Shows a loader in an existing element, replacing its content.
|
|
773
|
+
* @param loaderId - ID of the registered loader
|
|
774
|
+
* @param target - Target element or selector
|
|
775
|
+
* @param options - Creation options
|
|
776
|
+
* @returns The created loader element
|
|
777
|
+
*/
|
|
778
|
+
showIn(loaderId, target, options = {}) {
|
|
779
|
+
const targetEl = typeof target === "string" ? document.querySelector(target) : target;
|
|
780
|
+
if (!targetEl) {
|
|
781
|
+
throw new Error(`Target element not found: ${target}`);
|
|
782
|
+
}
|
|
783
|
+
const originalContent = targetEl.innerHTML;
|
|
784
|
+
targetEl.setAttribute("data-original-content", originalContent);
|
|
785
|
+
targetEl.innerHTML = "";
|
|
786
|
+
const loader = this.create(loaderId, { ...options, container: targetEl });
|
|
787
|
+
return loader;
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* Hides a loader and restores original content.
|
|
791
|
+
* @param target - Target element or selector
|
|
792
|
+
*/
|
|
793
|
+
hideIn(target) {
|
|
794
|
+
const targetEl = typeof target === "string" ? document.querySelector(target) : target;
|
|
795
|
+
if (!targetEl) return;
|
|
796
|
+
const originalContent = targetEl.getAttribute("data-original-content");
|
|
797
|
+
if (originalContent !== null) {
|
|
798
|
+
targetEl.innerHTML = originalContent;
|
|
799
|
+
targetEl.removeAttribute("data-original-content");
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Destroys a loader element.
|
|
804
|
+
* @param loader - The loader element to destroy
|
|
805
|
+
*/
|
|
806
|
+
destroy(loader) {
|
|
807
|
+
this.activeLoaders.delete(loader);
|
|
808
|
+
loader.remove();
|
|
809
|
+
}
|
|
810
|
+
/**
|
|
811
|
+
* Destroys all active loaders.
|
|
812
|
+
*/
|
|
813
|
+
destroyAll() {
|
|
814
|
+
this.activeLoaders.forEach((_, loader) => this.destroy(loader));
|
|
815
|
+
}
|
|
816
|
+
/**
|
|
817
|
+
* Gets a list of all registered loader IDs.
|
|
818
|
+
* @returns Array of loader IDs
|
|
819
|
+
*/
|
|
820
|
+
getRegisteredLoaders() {
|
|
821
|
+
return Array.from(this.loaders.keys());
|
|
822
|
+
}
|
|
823
|
+
/**
|
|
824
|
+
* Checks if a loader is registered.
|
|
825
|
+
* @param loaderId - Loader ID to check
|
|
826
|
+
* @returns True if registered
|
|
827
|
+
*/
|
|
828
|
+
has(loaderId) {
|
|
829
|
+
return this.loaders.has(loaderId);
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* Gets the configuration for a registered loader.
|
|
833
|
+
* @param loaderId - Loader ID
|
|
834
|
+
* @returns The loader configuration or undefined
|
|
835
|
+
*/
|
|
836
|
+
getConfig(loaderId) {
|
|
837
|
+
return this.loaders.get(loaderId);
|
|
838
|
+
}
|
|
839
|
+
// ========================================================================
|
|
840
|
+
// Private Methods
|
|
841
|
+
// ========================================================================
|
|
842
|
+
/**
|
|
843
|
+
* Processes CSS with variable replacements.
|
|
844
|
+
*/
|
|
845
|
+
processCSS(css, options) {
|
|
846
|
+
let processed = css;
|
|
847
|
+
processed = processed.replace(/#FFF\b/gi, "var(--loader-color, #FFF)");
|
|
848
|
+
processed = processed.replace(/#FF3D00\b/gi, "var(--loader-accent, #FF3D00)");
|
|
849
|
+
processed = processed.replace(/48px/g, "var(--loader-size, 48px)");
|
|
850
|
+
return processed;
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* Scopes CSS to a specific element (for non-Shadow DOM usage).
|
|
854
|
+
*/
|
|
855
|
+
scopeCSS(css, wrapper, loaderId) {
|
|
856
|
+
return css.replace(/\.loader/g, `.loader-${loaderId}`);
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* Registers built-in loader presets.
|
|
860
|
+
*/
|
|
861
|
+
registerBuiltinLoaders() {
|
|
862
|
+
this.register({
|
|
863
|
+
id: "spinner",
|
|
864
|
+
css: `.loader {
|
|
865
|
+
width: 48px;
|
|
866
|
+
height: 48px;
|
|
867
|
+
border: 5px solid #FFF;
|
|
868
|
+
border-bottom-color: #FF3D00;
|
|
869
|
+
border-radius: 50%;
|
|
870
|
+
display: inline-block;
|
|
871
|
+
box-sizing: border-box;
|
|
872
|
+
animation: rotation 1s linear infinite;
|
|
873
|
+
}
|
|
874
|
+
@keyframes rotation {
|
|
875
|
+
0% { transform: rotate(0deg); }
|
|
876
|
+
100% { transform: rotate(360deg); }
|
|
877
|
+
}`
|
|
878
|
+
});
|
|
879
|
+
this.register({
|
|
880
|
+
id: "spinner-dual",
|
|
881
|
+
css: `.loader {
|
|
882
|
+
width: 48px;
|
|
883
|
+
height: 48px;
|
|
884
|
+
border: 5px solid #FFF;
|
|
885
|
+
border-bottom-color: transparent;
|
|
886
|
+
border-radius: 50%;
|
|
887
|
+
display: inline-block;
|
|
888
|
+
box-sizing: border-box;
|
|
889
|
+
animation: rotation 1s linear infinite;
|
|
890
|
+
}
|
|
891
|
+
@keyframes rotation {
|
|
892
|
+
0% { transform: rotate(0deg); }
|
|
893
|
+
100% { transform: rotate(360deg); }
|
|
894
|
+
}`
|
|
895
|
+
});
|
|
896
|
+
this.register({
|
|
897
|
+
id: "dots-bounce",
|
|
898
|
+
css: `.loader, .loader:before, .loader:after {
|
|
899
|
+
border-radius: 50%;
|
|
900
|
+
width: 2.5em;
|
|
901
|
+
height: 2.5em;
|
|
902
|
+
animation-fill-mode: both;
|
|
903
|
+
animation: bblFadInOut 1.8s infinite ease-in-out;
|
|
904
|
+
}
|
|
905
|
+
.loader {
|
|
906
|
+
color: #FFF;
|
|
907
|
+
font-size: 7px;
|
|
908
|
+
position: relative;
|
|
909
|
+
text-indent: -9999em;
|
|
910
|
+
transform: translateZ(0);
|
|
911
|
+
animation-delay: -0.16s;
|
|
912
|
+
}
|
|
913
|
+
.loader:before, .loader:after {
|
|
914
|
+
content: '';
|
|
915
|
+
position: absolute;
|
|
916
|
+
top: 0;
|
|
917
|
+
}
|
|
918
|
+
.loader:before {
|
|
919
|
+
left: -3.5em;
|
|
920
|
+
animation-delay: -0.32s;
|
|
921
|
+
}
|
|
922
|
+
.loader:after {
|
|
923
|
+
left: 3.5em;
|
|
924
|
+
}
|
|
925
|
+
@keyframes bblFadInOut {
|
|
926
|
+
0%, 80%, 100% { box-shadow: 0 2.5em 0 -1.3em }
|
|
927
|
+
40% { box-shadow: 0 2.5em 0 0 }
|
|
928
|
+
}`
|
|
929
|
+
});
|
|
930
|
+
this.register({
|
|
931
|
+
id: "dots-flash",
|
|
932
|
+
css: `.loader {
|
|
933
|
+
width: 16px;
|
|
934
|
+
height: 16px;
|
|
935
|
+
border-radius: 50%;
|
|
936
|
+
background-color: #fff;
|
|
937
|
+
box-shadow: 32px 0 #fff, -32px 0 #fff;
|
|
938
|
+
position: relative;
|
|
939
|
+
animation: flash 0.5s ease-out infinite alternate;
|
|
940
|
+
}
|
|
941
|
+
@keyframes flash {
|
|
942
|
+
0% {
|
|
943
|
+
background-color: #FFF2;
|
|
944
|
+
box-shadow: 32px 0 #FFF2, -32px 0 #FFF;
|
|
945
|
+
}
|
|
946
|
+
50% {
|
|
947
|
+
background-color: #FFF;
|
|
948
|
+
box-shadow: 32px 0 #FFF2, -32px 0 #FFF2;
|
|
949
|
+
}
|
|
950
|
+
100% {
|
|
951
|
+
background-color: #FFF2;
|
|
952
|
+
box-shadow: 32px 0 #FFF, -32px 0 #FFF2;
|
|
953
|
+
}
|
|
954
|
+
}`
|
|
955
|
+
});
|
|
956
|
+
this.register({
|
|
957
|
+
id: "progress-bar",
|
|
958
|
+
css: `.loader {
|
|
959
|
+
width: 100%;
|
|
960
|
+
height: 4.8px;
|
|
961
|
+
display: inline-block;
|
|
962
|
+
position: relative;
|
|
963
|
+
background: rgba(255, 255, 255, 0.15);
|
|
964
|
+
overflow: hidden;
|
|
965
|
+
}
|
|
966
|
+
.loader::after {
|
|
967
|
+
content: '';
|
|
968
|
+
width: 96px;
|
|
969
|
+
height: 4.8px;
|
|
970
|
+
background: #FFF;
|
|
971
|
+
position: absolute;
|
|
972
|
+
top: 0;
|
|
973
|
+
left: 0;
|
|
974
|
+
box-sizing: border-box;
|
|
975
|
+
animation: hitZak 1s linear infinite alternate;
|
|
976
|
+
}
|
|
977
|
+
@keyframes hitZak {
|
|
978
|
+
0% { left: 0; transform: translateX(-1%); }
|
|
979
|
+
100% { left: 100%; transform: translateX(-99%); }
|
|
980
|
+
}`
|
|
981
|
+
});
|
|
982
|
+
this.register({
|
|
983
|
+
id: "progress-fill",
|
|
984
|
+
css: `.loader {
|
|
985
|
+
width: 100%;
|
|
986
|
+
height: 4.8px;
|
|
987
|
+
display: inline-block;
|
|
988
|
+
position: relative;
|
|
989
|
+
background: rgba(255, 255, 255, 0.15);
|
|
990
|
+
overflow: hidden;
|
|
991
|
+
}
|
|
992
|
+
.loader::after {
|
|
993
|
+
content: '';
|
|
994
|
+
box-sizing: border-box;
|
|
995
|
+
width: 0;
|
|
996
|
+
height: 4.8px;
|
|
997
|
+
background: #FFF;
|
|
998
|
+
position: absolute;
|
|
999
|
+
top: 0;
|
|
1000
|
+
left: 0;
|
|
1001
|
+
animation: animFw 10s linear infinite;
|
|
1002
|
+
}
|
|
1003
|
+
@keyframes animFw {
|
|
1004
|
+
0% { width: 0; }
|
|
1005
|
+
100% { width: 100%; }
|
|
1006
|
+
}`
|
|
1007
|
+
});
|
|
1008
|
+
this.register({
|
|
1009
|
+
id: "pulse",
|
|
1010
|
+
css: `.loader {
|
|
1011
|
+
width: 48px;
|
|
1012
|
+
height: 48px;
|
|
1013
|
+
border-radius: 50%;
|
|
1014
|
+
display: inline-block;
|
|
1015
|
+
position: relative;
|
|
1016
|
+
background: #FFF;
|
|
1017
|
+
box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.5);
|
|
1018
|
+
animation: pulse 1.5s ease-out infinite;
|
|
1019
|
+
}
|
|
1020
|
+
@keyframes pulse {
|
|
1021
|
+
0% { box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.5); }
|
|
1022
|
+
100% { box-shadow: 0 0 0 30px rgba(255, 255, 255, 0); }
|
|
1023
|
+
}`
|
|
1024
|
+
});
|
|
1025
|
+
this.register({
|
|
1026
|
+
id: "square-flip",
|
|
1027
|
+
css: `.loader {
|
|
1028
|
+
width: 48px;
|
|
1029
|
+
height: 48px;
|
|
1030
|
+
display: inline-block;
|
|
1031
|
+
position: relative;
|
|
1032
|
+
background: #FFF;
|
|
1033
|
+
box-sizing: border-box;
|
|
1034
|
+
animation: flipX 1s linear infinite;
|
|
1035
|
+
}
|
|
1036
|
+
@keyframes flipX {
|
|
1037
|
+
0% { transform: perspective(200px) rotateX(0deg) rotateY(0deg); }
|
|
1038
|
+
50% { transform: perspective(200px) rotateX(-180deg) rotateY(0deg); }
|
|
1039
|
+
100% { transform: perspective(200px) rotateX(-180deg) rotateY(-180deg); }
|
|
1040
|
+
}`
|
|
1041
|
+
});
|
|
1042
|
+
this.register({
|
|
1043
|
+
id: "skeleton-card",
|
|
1044
|
+
css: `.loader {
|
|
1045
|
+
width: 320px;
|
|
1046
|
+
height: 150px;
|
|
1047
|
+
display: block;
|
|
1048
|
+
margin: auto;
|
|
1049
|
+
position: relative;
|
|
1050
|
+
background: #FFF;
|
|
1051
|
+
box-sizing: border-box;
|
|
1052
|
+
}
|
|
1053
|
+
.loader::after {
|
|
1054
|
+
content: '';
|
|
1055
|
+
width: calc(100% - 30px);
|
|
1056
|
+
height: calc(100% - 30px);
|
|
1057
|
+
top: 15px;
|
|
1058
|
+
left: 15px;
|
|
1059
|
+
position: absolute;
|
|
1060
|
+
background-image:
|
|
1061
|
+
linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.5) 50%, transparent 80%),
|
|
1062
|
+
linear-gradient(#DDD 56px, transparent 0),
|
|
1063
|
+
linear-gradient(#DDD 24px, transparent 0),
|
|
1064
|
+
linear-gradient(#DDD 18px, transparent 0),
|
|
1065
|
+
linear-gradient(#DDD 66px, transparent 0);
|
|
1066
|
+
background-repeat: no-repeat;
|
|
1067
|
+
background-size: 75px 130px, 55px 56px, 160px 30px, 260px 20px, 290px 56px;
|
|
1068
|
+
background-position: 0% 0, 0 0, 70px 5px, 70px 38px, 0px 66px;
|
|
1069
|
+
box-sizing: border-box;
|
|
1070
|
+
animation: animloader 1s linear infinite;
|
|
1071
|
+
}
|
|
1072
|
+
@keyframes animloader {
|
|
1073
|
+
0% { background-position: 0% 0, 0 0, 70px 5px, 70px 38px, 0px 66px; }
|
|
1074
|
+
100% { background-position: 150% 0, 0 0, 70px 5px, 70px 38px, 0px 66px; }
|
|
1075
|
+
}`
|
|
1076
|
+
});
|
|
1077
|
+
this.register({
|
|
1078
|
+
id: "bars-wave",
|
|
1079
|
+
css: `.loader {
|
|
1080
|
+
color: #FFF;
|
|
1081
|
+
position: relative;
|
|
1082
|
+
font-size: 11px;
|
|
1083
|
+
background: #FFF;
|
|
1084
|
+
animation: escaleY 1s infinite ease-in-out;
|
|
1085
|
+
width: 1em;
|
|
1086
|
+
height: 4em;
|
|
1087
|
+
animation-delay: -0.16s;
|
|
1088
|
+
}
|
|
1089
|
+
.loader:before, .loader:after {
|
|
1090
|
+
content: '';
|
|
1091
|
+
position: absolute;
|
|
1092
|
+
top: 0;
|
|
1093
|
+
left: 2em;
|
|
1094
|
+
background: #FFF;
|
|
1095
|
+
width: 1em;
|
|
1096
|
+
height: 4em;
|
|
1097
|
+
animation: escaleY 1s infinite ease-in-out;
|
|
1098
|
+
}
|
|
1099
|
+
.loader:before {
|
|
1100
|
+
left: -2em;
|
|
1101
|
+
animation-delay: -0.32s;
|
|
1102
|
+
}
|
|
1103
|
+
@keyframes escaleY {
|
|
1104
|
+
0%, 80%, 100% { box-shadow: 0 0; height: 4em; }
|
|
1105
|
+
40% { box-shadow: 0 -2em; height: 5em; }
|
|
1106
|
+
}`
|
|
1107
|
+
});
|
|
1108
|
+
}
|
|
1109
|
+
};
|
|
1110
|
+
var loaderManager = new LoaderManager();
|
|
1111
|
+
|
|
1112
|
+
// src/ts/index.ts
|
|
1113
|
+
var ts_default = {
|
|
1114
|
+
Draggable,
|
|
1115
|
+
LoaderManager,
|
|
1116
|
+
Screensaver,
|
|
1117
|
+
VirtualKeyboard,
|
|
1118
|
+
TouchGestureHandler,
|
|
1119
|
+
AdvancedGestureRecognition,
|
|
1120
|
+
TransparentVideoOverlay
|
|
1121
|
+
};
|
|
1122
|
+
export {
|
|
1123
|
+
AdvancedGestureRecognition,
|
|
1124
|
+
Draggable,
|
|
1125
|
+
LoaderManager,
|
|
1126
|
+
Screensaver,
|
|
1127
|
+
TouchGestureHandler,
|
|
1128
|
+
TransparentVideoOverlay,
|
|
1129
|
+
VirtualKeyboard,
|
|
1130
|
+
ts_default as default,
|
|
1131
|
+
getOptimalVideoSource,
|
|
1132
|
+
loaderManager,
|
|
1133
|
+
supportsHEVCAlpha
|
|
1134
|
+
};
|
|
1135
|
+
//# sourceMappingURL=index.mjs.map
|