move.gl 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/README.md +185 -11
  2. package/dist/LICENSE +21 -0
  3. package/dist/README.md +212 -0
  4. package/dist/css/move.gl.css +43859 -0
  5. package/dist/css/move.gl.min.css +19 -0
  6. package/dist/js/index.cjs +1171 -0
  7. package/dist/js/index.cjs.map +1 -0
  8. package/dist/js/index.d.cts +184 -0
  9. package/dist/js/index.d.ts +184 -0
  10. package/dist/js/index.mjs +1135 -0
  11. package/dist/js/index.mjs.map +1 -0
  12. package/dist/package.json +68 -0
  13. package/{scss → dist/scss}/classes/_animations.scss +33 -14
  14. package/dist/scss/classes/_controls.scss +314 -0
  15. package/dist/scss/classes/_effects.scss +283 -0
  16. package/dist/scss/classes/_index.scss +28 -0
  17. package/dist/scss/classes/_loaders.scss +779 -0
  18. package/dist/scss/classes/_transforms.scss +138 -0
  19. package/dist/scss/classes/_transitions.scss +264 -0
  20. package/{scss → dist/scss}/dev/_deprecation.scss +6 -3
  21. package/{scss → dist/scss}/dev/_modules.scss +5 -6
  22. package/dist/scss/docs.scss +2344 -0
  23. package/dist/scss/docs.scss.bak +3133 -0
  24. package/dist/scss/functions/_index.scss +22 -0
  25. package/dist/scss/functions/scenes/_bubble.scss +32 -0
  26. package/dist/scss/functions/scenes/_index.scss +21 -0
  27. package/dist/scss/index.scss +17 -0
  28. package/dist/scss/maps/_controls.scss +85 -0
  29. package/dist/scss/maps/_index.scss +22 -0
  30. package/{scss → dist/scss}/mixins/_accessibility.scss +24 -3
  31. package/{scss → dist/scss}/mixins/_boot.scss +4 -4
  32. package/dist/scss/mixins/_index.scss +41 -0
  33. package/dist/scss/mixins/_screensaver.scss +228 -0
  34. package/dist/scss/mixins/_shape.scss +315 -0
  35. package/dist/scss/mixins/animations/_base.scss +403 -0
  36. package/dist/scss/mixins/animations/_beat.scss +137 -0
  37. package/{scss → dist/scss}/mixins/animations/_blink.scss +60 -52
  38. package/dist/scss/mixins/animations/_bounce.scss +306 -0
  39. package/{scss → dist/scss}/mixins/animations/_elastic.scss +26 -22
  40. package/dist/scss/mixins/animations/_fade.scss +393 -0
  41. package/{scss → dist/scss}/mixins/animations/_flash.scss +53 -61
  42. package/dist/scss/mixins/animations/_flip.scss +251 -0
  43. package/{scss → dist/scss}/mixins/animations/_float.scss +47 -32
  44. package/{scss → dist/scss}/mixins/animations/_glow.scss +69 -58
  45. package/dist/scss/mixins/animations/_heartbeat.scss +195 -0
  46. package/dist/scss/mixins/animations/_hinge.scss +118 -0
  47. package/dist/scss/mixins/animations/_index.scss +97 -0
  48. package/dist/scss/mixins/animations/_jello.scss +123 -0
  49. package/dist/scss/mixins/animations/_jiggle.scss +162 -0
  50. package/dist/scss/mixins/animations/_lightspeed.scss +135 -0
  51. package/{scss → dist/scss}/mixins/animations/_nod.scss +57 -65
  52. package/dist/scss/mixins/animations/_pop.scss +153 -0
  53. package/dist/scss/mixins/animations/_pulse.scss +275 -0
  54. package/{scss → dist/scss}/mixins/animations/_ripple.scss +47 -55
  55. package/dist/scss/mixins/animations/_roll.scss +217 -0
  56. package/dist/scss/mixins/animations/_rotate.scss +728 -0
  57. package/dist/scss/mixins/animations/_rubber.scss +115 -0
  58. package/dist/scss/mixins/animations/_scale.scss +382 -0
  59. package/dist/scss/mixins/animations/_shake.scss +233 -0
  60. package/dist/scss/mixins/animations/_slide.scss +501 -0
  61. package/dist/scss/mixins/animations/_spin.scss +322 -0
  62. package/{scss → dist/scss}/mixins/animations/_sway.scss +32 -49
  63. package/{scss → dist/scss}/mixins/animations/_swing.scss +47 -49
  64. package/{scss → dist/scss}/mixins/animations/_tada.scss +44 -42
  65. package/{scss → dist/scss}/mixins/animations/_twist.scss +40 -55
  66. package/{scss → dist/scss}/mixins/animations/_wave.scss +36 -53
  67. package/dist/scss/mixins/animations/_wobble.scss +283 -0
  68. package/dist/scss/mixins/animations/_zoom.scss +394 -0
  69. package/{scss/mixins/mouse → dist/scss/mixins/controls}/_cursor.scss +60 -39
  70. package/dist/scss/mixins/controls/_hover.scss +625 -0
  71. package/dist/scss/mixins/controls/_index.scss +30 -0
  72. package/dist/scss/mixins/controls/_keyboard.scss +300 -0
  73. package/{scss/mixins/mouse → dist/scss/mixins/controls}/_pointer.scss +81 -72
  74. package/dist/scss/mixins/controls/_scroll.scss +460 -0
  75. package/{scss/mixins/scroll → dist/scss/mixins/controls}/_scrollbar.scss +50 -16
  76. package/dist/scss/mixins/controls/_selection.scss +208 -0
  77. package/dist/scss/mixins/controls/_touch.scss +401 -0
  78. package/dist/scss/mixins/effects/_blend.scss +128 -0
  79. package/dist/scss/mixins/effects/_filter.scss +470 -0
  80. package/dist/scss/mixins/effects/_focus.scss +83 -0
  81. package/dist/scss/mixins/effects/_gradient.scss +130 -0
  82. package/dist/scss/mixins/effects/_index.scss +28 -0
  83. package/dist/scss/mixins/effects/_mask.scss +76 -0
  84. package/dist/scss/mixins/effects/_opacity.scss +376 -0
  85. package/dist/scss/mixins/effects/_shadow.scss +429 -0
  86. package/dist/scss/mixins/keyframes/_base.scss +199 -0
  87. package/dist/scss/mixins/keyframes/_index.scss +24 -0
  88. package/dist/scss/mixins/keyframes/animations/_beat.scss +280 -0
  89. package/dist/scss/mixins/keyframes/animations/_blink.scss +82 -0
  90. package/dist/scss/mixins/keyframes/animations/_bounce.scss +292 -0
  91. package/dist/scss/mixins/keyframes/animations/_fade.scss +311 -0
  92. package/dist/scss/mixins/keyframes/animations/_flash.scss +165 -0
  93. package/dist/scss/mixins/keyframes/animations/_flip.scss +266 -0
  94. package/{scss/mixins → dist/scss/mixins/keyframes}/animations/_index.scss +19 -10
  95. package/dist/scss/mixins/keyframes/animations/_jiggle.scss +85 -0
  96. package/dist/scss/mixins/keyframes/animations/_lightspeed.scss +73 -0
  97. package/dist/scss/mixins/keyframes/animations/_nod.scss +79 -0
  98. package/dist/scss/mixins/keyframes/animations/_pop.scss +78 -0
  99. package/dist/scss/mixins/keyframes/animations/_pulse.scss +225 -0
  100. package/dist/scss/mixins/keyframes/animations/_ripple.scss +94 -0
  101. package/dist/scss/mixins/keyframes/animations/_roll.scss +124 -0
  102. package/dist/scss/mixins/keyframes/animations/_rotate.scss +360 -0
  103. package/dist/scss/mixins/keyframes/animations/_rubber.scss +81 -0
  104. package/dist/scss/mixins/keyframes/animations/_scale.scss +308 -0
  105. package/dist/scss/mixins/keyframes/animations/_shake.scss +270 -0
  106. package/dist/scss/mixins/keyframes/animations/_slide.scss +345 -0
  107. package/dist/scss/mixins/keyframes/animations/_spin.scss +270 -0
  108. package/dist/scss/mixins/keyframes/animations/_sway.scss +83 -0
  109. package/dist/scss/mixins/keyframes/animations/_twist.scss +89 -0
  110. package/dist/scss/mixins/keyframes/animations/_wave.scss +90 -0
  111. package/dist/scss/mixins/keyframes/animations/_wobble.scss +293 -0
  112. package/dist/scss/mixins/keyframes/animations/_zoom.scss +345 -0
  113. package/dist/scss/mixins/loaders/_bars.scss +128 -0
  114. package/dist/scss/mixins/loaders/_base.scss +39 -0
  115. package/dist/scss/mixins/loaders/_bubble.scss +395 -0
  116. package/dist/scss/mixins/loaders/_circle.scss +456 -0
  117. package/dist/scss/mixins/loaders/_dots.scss +248 -0
  118. package/dist/scss/mixins/loaders/_graph.scss +542 -0
  119. package/dist/scss/mixins/loaders/_index.scss +77 -0
  120. package/dist/scss/mixins/loaders/_line.scss +471 -0
  121. package/dist/scss/mixins/loaders/_objects.scss +563 -0
  122. package/dist/scss/mixins/loaders/_progress.scss +477 -0
  123. package/dist/scss/mixins/loaders/_rect.scss +480 -0
  124. package/dist/scss/mixins/loaders/_rings.scss +377 -0
  125. package/dist/scss/mixins/loaders/_skeleton.scss +461 -0
  126. package/dist/scss/mixins/loaders/_special.scss +611 -0
  127. package/dist/scss/mixins/loaders/_spinner.scss +175 -0
  128. package/dist/scss/mixins/loaders/_text.scss +446 -0
  129. package/{scss → dist/scss}/mixins/transforms/_flip.scss +16 -18
  130. package/dist/scss/mixins/transforms/_index.scss +28 -0
  131. package/dist/scss/mixins/transforms/_matrix.scss +18 -0
  132. package/{scss → dist/scss}/mixins/transforms/_perspective.scss +18 -1
  133. package/{scss → dist/scss}/mixins/transforms/_rotate.scss +9 -14
  134. package/{scss → dist/scss}/mixins/transforms/_scale.scss +16 -1
  135. package/{scss → dist/scss}/mixins/transforms/_skew.scss +16 -2
  136. package/{scss → dist/scss}/mixins/transforms/_translate.scss +16 -2
  137. package/dist/scss/mixins/transitions/_index.scss +22 -0
  138. package/dist/scss/mixins/transitions/_transition.scss +43 -0
  139. package/dist/scss/variables/_animations.scss +300 -0
  140. package/dist/scss/variables/_controls.scss +178 -0
  141. package/dist/scss/variables/_effects.scss +87 -0
  142. package/dist/scss/variables/_index.scss +27 -0
  143. package/dist/scss/variables/_keyframes.scss +28 -0
  144. package/dist/scss/variables/_loaders.scss +75 -0
  145. package/dist/scss/variables/_transforms.scss +85 -0
  146. package/dist/scss/variables/_transitions.scss +80 -0
  147. package/dist/ts/Draggable.ts +143 -0
  148. package/dist/ts/Gesture.ts +226 -0
  149. package/dist/ts/Keyboard.ts +195 -0
  150. package/dist/ts/LoaderManager.ts +662 -0
  151. package/dist/ts/Screensaver.ts +192 -0
  152. package/dist/ts/VideoOverlay.ts +205 -0
  153. package/dist/ts/demo.ts +1108 -0
  154. package/dist/ts/index.ts +58 -0
  155. package/package.json +90 -53
  156. package/src/html/_base.html +138 -0
  157. package/src/html/base.html +147 -0
  158. package/src/html/core-concepts.html +282 -0
  159. package/src/html/demo_base.html +171 -0
  160. package/src/html/demo_draggable.html +250 -0
  161. package/src/html/demo_gesture.html +264 -0
  162. package/src/html/demo_keyboard.html +224 -0
  163. package/src/html/demo_screensaver.html +258 -0
  164. package/src/html/demo_video_overlay.html +291 -0
  165. package/src/html/getting-started.html +242 -0
  166. package/src/html/index.html +400 -0
  167. package/src/html/keyboard.html +14 -0
  168. package/src/html/partials/_demo_links.html +21 -0
  169. package/src/html/partials/_footer.html +18 -0
  170. package/src/html/partials/_head.html +21 -0
  171. package/src/html/partials/_nav.html +84 -0
  172. package/src/html/partials/_theme_toggle.html +11 -0
  173. package/src/html/screensaver.html +20 -0
  174. package/src/html/test_animations.html +813 -0
  175. package/src/html/test_attention.html +281 -0
  176. package/src/html/test_bounce.html +201 -0
  177. package/src/html/test_effects.html +1348 -0
  178. package/src/html/test_fade.html +213 -0
  179. package/src/html/test_flip.html +208 -0
  180. package/src/html/test_keyframes.html +415 -0
  181. package/src/html/test_loaders.html +1489 -0
  182. package/src/html/test_mouse.html +516 -0
  183. package/src/html/test_overview.html +1444 -0
  184. package/src/html/test_pulse.html +212 -0
  185. package/src/html/test_scale.html +204 -0
  186. package/src/html/test_shake.html +232 -0
  187. package/src/html/test_slide.html +212 -0
  188. package/src/html/test_special.html +257 -0
  189. package/src/html/test_spin.html +216 -0
  190. package/src/html/test_transforms.html +332 -0
  191. package/src/html/test_transitions.html +245 -0
  192. package/src/html/test_zoom.html +188 -0
  193. package/src/html/video_overlay.html +27 -0
  194. package/src/jinja/_base.html.jinja +50 -0
  195. package/src/jinja/base.html.jinja +48 -0
  196. package/src/jinja/core-concepts.html.jinja +148 -0
  197. package/src/jinja/demo_draggable.html.jinja +114 -0
  198. package/src/jinja/demo_gesture.html.jinja +128 -0
  199. package/src/jinja/demo_keyboard.html.jinja +88 -0
  200. package/src/jinja/demo_screensaver.html.jinja +122 -0
  201. package/src/jinja/demo_video_overlay.html.jinja +155 -0
  202. package/src/jinja/getting-started.html.jinja +108 -0
  203. package/src/jinja/index.html.jinja +268 -0
  204. package/src/jinja/index.json +5 -0
  205. package/src/jinja/move.gl.css +7741 -0
  206. package/src/jinja/partials/_code_block.html.jinja +17 -0
  207. package/src/jinja/partials/_demo_links.html.jinja +41 -0
  208. package/src/jinja/partials/_feature_card.html.jinja +20 -0
  209. package/src/jinja/partials/_footer.html.jinja +22 -0
  210. package/src/jinja/partials/_head.html.jinja +27 -0
  211. package/src/jinja/partials/_nav.html.jinja +79 -0
  212. package/src/jinja/partials/_theme_toggle.html.jinja +15 -0
  213. package/src/jinja/test_animations.html.jinja +679 -0
  214. package/src/jinja/test_attention.html.jinja +147 -0
  215. package/src/jinja/test_bounce.html.jinja +67 -0
  216. package/src/jinja/test_effects.html.jinja +1218 -0
  217. package/src/jinja/test_fade.html.jinja +79 -0
  218. package/src/jinja/test_flip.html.jinja +74 -0
  219. package/src/jinja/test_keyframes.html.jinja +281 -0
  220. package/src/jinja/test_loaders.html.jinja +1358 -0
  221. package/src/jinja/test_mouse.html.jinja +382 -0
  222. package/src/jinja/test_overview.html.jinja +1313 -0
  223. package/src/jinja/test_pulse.html.jinja +78 -0
  224. package/src/jinja/test_scale.html.jinja +70 -0
  225. package/src/jinja/test_shake.html.jinja +98 -0
  226. package/src/jinja/test_slide.html.jinja +78 -0
  227. package/src/jinja/test_special.html.jinja +123 -0
  228. package/src/jinja/test_spin.html.jinja +82 -0
  229. package/src/jinja/test_transforms.html.jinja +198 -0
  230. package/src/jinja/test_transitions.html.jinja +111 -0
  231. package/src/jinja/test_zoom.html.jinja +54 -0
  232. package/src/scss/classes/_animations.scss +595 -0
  233. package/src/scss/classes/_controls.scss +314 -0
  234. package/src/scss/classes/_effects.scss +283 -0
  235. package/src/scss/classes/_index.scss +28 -0
  236. package/src/scss/classes/_loaders.scss +779 -0
  237. package/src/scss/classes/_transforms.scss +138 -0
  238. package/src/scss/classes/_transitions.scss +264 -0
  239. package/src/scss/dev/_banner.scss +36 -0
  240. package/src/scss/dev/_debug.scss +18 -0
  241. package/src/scss/dev/_deprecation.scss +13 -0
  242. package/src/scss/dev/_index.scss +8 -0
  243. package/src/scss/dev/_modules.scss +23 -0
  244. package/src/scss/docs.scss +2344 -0
  245. package/src/scss/docs.scss.bak +3133 -0
  246. package/src/scss/functions/_index.scss +22 -0
  247. package/src/scss/functions/scenes/_bubble.scss +32 -0
  248. package/src/scss/functions/scenes/_index.scss +21 -0
  249. package/src/scss/index.scss +17 -0
  250. package/src/scss/maps/_controls.scss +85 -0
  251. package/src/scss/maps/_index.scss +22 -0
  252. package/src/scss/mixins/_accessibility.scss +91 -0
  253. package/src/scss/mixins/_boot.scss +51 -0
  254. package/src/scss/mixins/_index.scss +41 -0
  255. package/src/scss/mixins/_screensaver.scss +228 -0
  256. package/src/scss/mixins/_shape.scss +315 -0
  257. package/src/scss/mixins/animations/_base.scss +403 -0
  258. package/src/scss/mixins/animations/_beat.scss +137 -0
  259. package/src/scss/mixins/animations/_blink.scss +159 -0
  260. package/src/scss/mixins/animations/_bounce.scss +306 -0
  261. package/src/scss/mixins/animations/_elastic.scss +69 -0
  262. package/src/scss/mixins/animations/_fade.scss +393 -0
  263. package/src/scss/mixins/animations/_flash.scss +169 -0
  264. package/src/scss/mixins/animations/_flip.scss +251 -0
  265. package/src/scss/mixins/animations/_float.scss +141 -0
  266. package/src/scss/mixins/animations/_glow.scss +190 -0
  267. package/src/scss/mixins/animations/_heartbeat.scss +195 -0
  268. package/src/scss/mixins/animations/_hinge.scss +118 -0
  269. package/src/scss/mixins/animations/_index.scss +97 -0
  270. package/src/scss/mixins/animations/_jello.scss +123 -0
  271. package/src/scss/mixins/animations/_jiggle.scss +162 -0
  272. package/src/scss/mixins/animations/_lightspeed.scss +135 -0
  273. package/src/scss/mixins/animations/_nod.scss +153 -0
  274. package/src/scss/mixins/animations/_pop.scss +153 -0
  275. package/src/scss/mixins/animations/_pulse.scss +275 -0
  276. package/src/scss/mixins/animations/_ripple.scss +161 -0
  277. package/src/scss/mixins/animations/_roll.scss +217 -0
  278. package/src/scss/mixins/animations/_rotate.scss +728 -0
  279. package/src/scss/mixins/animations/_rubber.scss +115 -0
  280. package/src/scss/mixins/animations/_scale.scss +382 -0
  281. package/src/scss/mixins/animations/_shake.scss +233 -0
  282. package/src/scss/mixins/animations/_slide.scss +501 -0
  283. package/src/scss/mixins/animations/_spin.scss +322 -0
  284. package/src/scss/mixins/animations/_sway.scss +150 -0
  285. package/src/scss/mixins/animations/_swing.scss +245 -0
  286. package/src/scss/mixins/animations/_tada.scss +235 -0
  287. package/src/scss/mixins/animations/_twist.scss +162 -0
  288. package/src/scss/mixins/animations/_wave.scss +149 -0
  289. package/src/scss/mixins/animations/_wobble.scss +283 -0
  290. package/src/scss/mixins/animations/_zoom.scss +394 -0
  291. package/src/scss/mixins/controls/_cursor.scss +203 -0
  292. package/src/scss/mixins/controls/_hover.scss +625 -0
  293. package/src/scss/mixins/controls/_index.scss +30 -0
  294. package/src/scss/mixins/controls/_keyboard.scss +300 -0
  295. package/src/scss/mixins/controls/_pointer.scss +267 -0
  296. package/src/scss/mixins/controls/_scroll.scss +460 -0
  297. package/src/scss/mixins/controls/_scrollbar.scss +283 -0
  298. package/src/scss/mixins/controls/_selection.scss +208 -0
  299. package/src/scss/mixins/controls/_touch.scss +401 -0
  300. package/src/scss/mixins/effects/_blend.scss +128 -0
  301. package/src/scss/mixins/effects/_filter.scss +470 -0
  302. package/src/scss/mixins/effects/_focus.scss +83 -0
  303. package/src/scss/mixins/effects/_gradient.scss +130 -0
  304. package/src/scss/mixins/effects/_index.scss +28 -0
  305. package/src/scss/mixins/effects/_mask.scss +76 -0
  306. package/src/scss/mixins/effects/_opacity.scss +376 -0
  307. package/src/scss/mixins/effects/_shadow.scss +429 -0
  308. package/src/scss/mixins/keyframes/_base.scss +199 -0
  309. package/src/scss/mixins/keyframes/_index.scss +24 -0
  310. package/src/scss/mixins/keyframes/animations/_beat.scss +280 -0
  311. package/src/scss/mixins/keyframes/animations/_blink.scss +82 -0
  312. package/src/scss/mixins/keyframes/animations/_bounce.scss +292 -0
  313. package/src/scss/mixins/keyframes/animations/_fade.scss +311 -0
  314. package/src/scss/mixins/keyframes/animations/_flash.scss +165 -0
  315. package/src/scss/mixins/keyframes/animations/_flip.scss +266 -0
  316. package/src/scss/mixins/keyframes/animations/_index.scss +46 -0
  317. package/src/scss/mixins/keyframes/animations/_jiggle.scss +85 -0
  318. package/src/scss/mixins/keyframes/animations/_lightspeed.scss +73 -0
  319. package/src/scss/mixins/keyframes/animations/_nod.scss +79 -0
  320. package/src/scss/mixins/keyframes/animations/_pop.scss +78 -0
  321. package/src/scss/mixins/keyframes/animations/_pulse.scss +225 -0
  322. package/src/scss/mixins/keyframes/animations/_ripple.scss +94 -0
  323. package/src/scss/mixins/keyframes/animations/_roll.scss +124 -0
  324. package/src/scss/mixins/keyframes/animations/_rotate.scss +360 -0
  325. package/src/scss/mixins/keyframes/animations/_rubber.scss +81 -0
  326. package/src/scss/mixins/keyframes/animations/_scale.scss +308 -0
  327. package/src/scss/mixins/keyframes/animations/_shake.scss +270 -0
  328. package/src/scss/mixins/keyframes/animations/_slide.scss +345 -0
  329. package/src/scss/mixins/keyframes/animations/_spin.scss +270 -0
  330. package/src/scss/mixins/keyframes/animations/_sway.scss +83 -0
  331. package/src/scss/mixins/keyframes/animations/_twist.scss +89 -0
  332. package/src/scss/mixins/keyframes/animations/_wave.scss +90 -0
  333. package/src/scss/mixins/keyframes/animations/_wobble.scss +293 -0
  334. package/src/scss/mixins/keyframes/animations/_zoom.scss +345 -0
  335. package/src/scss/mixins/loaders/_bars.scss +128 -0
  336. package/src/scss/mixins/loaders/_base.scss +39 -0
  337. package/src/scss/mixins/loaders/_bubble.scss +395 -0
  338. package/src/scss/mixins/loaders/_circle.scss +456 -0
  339. package/src/scss/mixins/loaders/_dots.scss +248 -0
  340. package/src/scss/mixins/loaders/_graph.scss +542 -0
  341. package/src/scss/mixins/loaders/_index.scss +77 -0
  342. package/src/scss/mixins/loaders/_line.scss +471 -0
  343. package/src/scss/mixins/loaders/_objects.scss +563 -0
  344. package/src/scss/mixins/loaders/_progress.scss +477 -0
  345. package/src/scss/mixins/loaders/_rect.scss +480 -0
  346. package/src/scss/mixins/loaders/_rings.scss +377 -0
  347. package/src/scss/mixins/loaders/_skeleton.scss +461 -0
  348. package/src/scss/mixins/loaders/_special.scss +611 -0
  349. package/src/scss/mixins/loaders/_spinner.scss +175 -0
  350. package/src/scss/mixins/loaders/_text.scss +446 -0
  351. package/src/scss/mixins/transforms/_flip.scss +74 -0
  352. package/src/scss/mixins/transforms/_index.scss +28 -0
  353. package/src/scss/mixins/transforms/_matrix.scss +18 -0
  354. package/src/scss/mixins/transforms/_perspective.scss +28 -0
  355. package/src/scss/mixins/transforms/_rotate.scss +96 -0
  356. package/src/scss/mixins/transforms/_scale.scss +26 -0
  357. package/src/scss/mixins/transforms/_skew.scss +27 -0
  358. package/src/scss/mixins/transforms/_translate.scss +27 -0
  359. package/src/scss/mixins/transitions/_index.scss +22 -0
  360. package/src/scss/mixins/transitions/_transition.scss +43 -0
  361. package/src/scss/variables/_animations.scss +300 -0
  362. package/src/scss/variables/_controls.scss +178 -0
  363. package/src/scss/variables/_effects.scss +87 -0
  364. package/src/scss/variables/_index.scss +27 -0
  365. package/src/scss/variables/_keyframes.scss +28 -0
  366. package/src/scss/variables/_loaders.scss +75 -0
  367. package/src/scss/variables/_transforms.scss +85 -0
  368. package/src/scss/variables/_transitions.scss +80 -0
  369. package/src/ts/Draggable.ts +143 -0
  370. package/src/ts/Gesture.ts +226 -0
  371. package/src/ts/Keyboard.ts +195 -0
  372. package/src/ts/LoaderManager.ts +662 -0
  373. package/src/ts/Screensaver.ts +192 -0
  374. package/src/ts/VideoOverlay.ts +205 -0
  375. package/src/ts/demo.ts +1108 -0
  376. package/src/ts/index.ts +58 -0
  377. package/css/move.gl.css +0 -2
  378. package/css/move.gl.min.css +0 -2
  379. package/scss/classes/_transforms.scss +0 -124
  380. package/scss/classes/keyboard.scss +0 -18
  381. package/scss/classes/screensaver.scss +0 -15
  382. package/scss/effects/_filter.scss +0 -176
  383. package/scss/effects/_index.scss +0 -23
  384. package/scss/effects/_opacity.scss +0 -62
  385. package/scss/effects/_shadow.scss +0 -175
  386. package/scss/functions/scenes/_bubble.scss +0 -19
  387. package/scss/functions/scenes/_index.scss +0 -20
  388. package/scss/index.scss +0 -0
  389. package/scss/keyframes/_beat.scss +0 -26
  390. package/scss/keyframes/_index.scss +0 -0
  391. package/scss/maps/_index.scss +0 -0
  392. package/scss/maps/_mouse.scss +0 -96
  393. package/scss/mixins/_hover.scss +0 -51
  394. package/scss/mixins/_index.scss +0 -0
  395. package/scss/mixins/_selection.scss +0 -321
  396. package/scss/mixins/_shape.scss +0 -44
  397. package/scss/mixins/_touch.scss +0 -95
  398. package/scss/mixins/animations/--hover.scss +0 -107
  399. package/scss/mixins/animations/_base.scss +0 -337
  400. package/scss/mixins/animations/_beat.scss +0 -119
  401. package/scss/mixins/animations/_bounce.scss +0 -192
  402. package/scss/mixins/animations/_fade.scss +0 -154
  403. package/scss/mixins/animations/_flip.scss +0 -72
  404. package/scss/mixins/animations/_heartbeat.scss +0 -175
  405. package/scss/mixins/animations/_hinge.scss +0 -119
  406. package/scss/mixins/animations/_jello.scss +0 -129
  407. package/scss/mixins/animations/_jiggle.scss +0 -163
  408. package/scss/mixins/animations/_lightspeed.scss +0 -130
  409. package/scss/mixins/animations/_pop.scss +0 -150
  410. package/scss/mixins/animations/_pulse.scss +0 -213
  411. package/scss/mixins/animations/_roll.scss +0 -261
  412. package/scss/mixins/animations/_rotate.scss +0 -428
  413. package/scss/mixins/animations/_rubber.scss +0 -116
  414. package/scss/mixins/animations/_scale.scss +0 -113
  415. package/scss/mixins/animations/_shake.scss +0 -182
  416. package/scss/mixins/animations/_slide.scss +0 -294
  417. package/scss/mixins/animations/_spin.scss +0 -219
  418. package/scss/mixins/animations/_wobble.scss +0 -254
  419. package/scss/mixins/animations/_zoom.scss +0 -166
  420. package/scss/mixins/effects/_filter.scss +0 -148
  421. package/scss/mixins/effects/_index.scss +0 -0
  422. package/scss/mixins/effects/_shadow.scss +0 -21
  423. package/scss/mixins/loaders/_index.scss +0 -0
  424. package/scss/mixins/loaders/_progress.scss +0 -174
  425. package/scss/mixins/loaders/_spinner.scss +0 -101
  426. package/scss/mixins/loaders/circle_01.scss +0 -22
  427. package/scss/mixins/loaders/circle_02.scss +0 -19
  428. package/scss/mixins/loaders/circle_03.scss +0 -29
  429. package/scss/mixins/loaders/circle_inner_01.scss +0 -33
  430. package/scss/mixins/loaders/circle_inner_02.scss +0 -33
  431. package/scss/mixins/loaders/circle_inner_03.scss +0 -34
  432. package/scss/mixins/mouse/_index.scss +0 -0
  433. package/scss/mixins/scroll/_index.scss +0 -0
  434. package/scss/mixins/scroll/_scroll.scss +0 -104
  435. package/scss/mixins/transforms/_index.scss +0 -23
  436. package/scss/mixins/transforms/_matrix.scss +0 -1
  437. package/scss/mixins/transitions/_index.scss +0 -0
  438. package/scss/mixins/transitions/_transition.scss +0 -13
  439. package/scss/variables/_animation.scss +0 -91
  440. package/scss/variables/_index.scss +0 -0
  441. package/ts/ARContent.ts +0 -27
  442. package/ts/ARInteraction.ts +0 -34
  443. package/ts/AdaptiveUI.ts +0 -25
  444. package/ts/ContentStreaming.ts +0 -20
  445. package/ts/Draggable.ts +0 -71
  446. package/ts/DynamicEnvironment.ts +0 -60
  447. package/ts/Gesture.ts +0 -168
  448. package/ts/ImmersiveAudio.ts +0 -40
  449. package/ts/InteractiveCanvas.ts +0 -177
  450. package/ts/InteractiveVideo.ts +0 -29
  451. package/ts/Keyboard.ts +0 -162
  452. package/ts/RealTimeCollaboration.ts +0 -25
  453. package/ts/Screensaver.ts +0 -140
  454. package/ts/SpatialNavigation.ts +0 -38
  455. package/ts/UserProfile.ts +0 -27
  456. package/ts/VRExperience.ts +0 -58
  457. package/ts/VideoOverlay.ts +0 -116
  458. package/ts/index.ts +0 -0
  459. /package/{scss → dist/scss}/dev/_banner.scss +0 -0
  460. /package/{scss → dist/scss}/dev/_debug.scss +0 -0
  461. /package/{scss → dist/scss}/dev/_index.scss +0 -0
  462. /package/{scss/classes/_index.scss → src/html/partials/_code_block.html} +0 -0
  463. /package/{scss/functions/_index.scss → src/html/partials/_feature_card.html} +0 -0
@@ -0,0 +1,662 @@
1
+ // ============================================================================
2
+ // move.gl | Loader Manager
3
+ // ============================================================================
4
+ // Copyright 2025 Scape Agency BV
5
+ // Licensed under MIT License
6
+ // ============================================================================
7
+
8
+ /**
9
+ * Loader Manager
10
+ * ===========================================================================
11
+ *
12
+ * A TypeScript class for dynamically creating and managing CSS-based loader
13
+ * animations with Shadow DOM encapsulation.
14
+ *
15
+ * @module LoaderManager
16
+ * @author Scape Agency
17
+ * @link https://move.gl
18
+ * @since 0.1.0
19
+ */
20
+
21
+
22
+ // ============================================================================
23
+ // Interfaces
24
+ // ============================================================================
25
+
26
+ /**
27
+ * Configuration for a loader instance.
28
+ */
29
+ export interface LoaderConfig {
30
+ /** Unique identifier for the loader */
31
+ id: string;
32
+ /** HTML content for the loader (default: empty span) */
33
+ content?: string;
34
+ /** CSS styles for the loader */
35
+ css: string;
36
+ /** Optional HTML markup override */
37
+ html?: string;
38
+ }
39
+
40
+ /**
41
+ * Options for creating a loader element.
42
+ */
43
+ export interface LoaderOptions {
44
+ /** Container element or selector */
45
+ container?: HTMLElement | string;
46
+ /** Whether to use Shadow DOM (default: true) */
47
+ useShadowDOM?: boolean;
48
+ /** Additional CSS classes to add */
49
+ className?: string;
50
+ /** Custom size override */
51
+ size?: number | string;
52
+ /** Primary color override */
53
+ color?: string;
54
+ /** Secondary/accent color override */
55
+ accentColor?: string;
56
+ }
57
+
58
+ /**
59
+ * Loader preset categories.
60
+ */
61
+ export type LoaderCategory =
62
+ | 'spinner'
63
+ | 'dots'
64
+ | 'bars'
65
+ | 'progress'
66
+ | 'pulse'
67
+ | 'bounce'
68
+ | 'text'
69
+ | 'skeleton'
70
+ | 'custom';
71
+
72
+
73
+ // ============================================================================
74
+ // Loader Manager Class
75
+ // ============================================================================
76
+
77
+ /**
78
+ * LoaderManager provides methods for creating, managing, and rendering
79
+ * CSS-based loading animations with Shadow DOM encapsulation.
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const manager = new LoaderManager();
84
+ *
85
+ * // Register a custom loader
86
+ * manager.register({
87
+ * id: 'my-spinner',
88
+ * css: `.loader { width: 48px; height: 48px; ... }`
89
+ * });
90
+ *
91
+ * // Create and show loader
92
+ * const loader = manager.create('my-spinner', {
93
+ * container: '#app',
94
+ * color: '#FF3D00'
95
+ * });
96
+ *
97
+ * // Later, remove it
98
+ * manager.destroy(loader);
99
+ * ```
100
+ */
101
+ export class LoaderManager {
102
+
103
+ // ========================================================================
104
+ // Properties
105
+ // ========================================================================
106
+
107
+ /** Registry of loader configurations */
108
+ private loaders: Map<string, LoaderConfig> = new Map();
109
+
110
+ /** Active loader instances */
111
+ private activeLoaders: Map<HTMLElement, { id: string; shadowRoot?: ShadowRoot }> = new Map();
112
+
113
+ /** Default CSS variables for customization */
114
+ private defaultVars = {
115
+ '--loader-size': '48px',
116
+ '--loader-color': '#FFF',
117
+ '--loader-accent': '#FF3D00',
118
+ '--loader-speed': '1s',
119
+ };
120
+
121
+
122
+ // ========================================================================
123
+ // Constructor
124
+ // ========================================================================
125
+
126
+ /**
127
+ * Creates a new LoaderManager instance.
128
+ * @param preloadBuiltins - Whether to preload built-in loaders (default: true)
129
+ */
130
+ constructor(preloadBuiltins: boolean = true) {
131
+ if (preloadBuiltins) {
132
+ this.registerBuiltinLoaders();
133
+ }
134
+ }
135
+
136
+
137
+ // ========================================================================
138
+ // Public Methods
139
+ // ========================================================================
140
+
141
+ /**
142
+ * Registers a loader configuration.
143
+ * @param config - The loader configuration to register
144
+ * @returns The LoaderManager instance for chaining
145
+ */
146
+ public register(config: LoaderConfig): this {
147
+ this.loaders.set(config.id, config);
148
+ return this;
149
+ }
150
+
151
+ /**
152
+ * Registers multiple loader configurations.
153
+ * @param configs - Array of loader configurations
154
+ * @returns The LoaderManager instance for chaining
155
+ */
156
+ public registerAll(configs: LoaderConfig[]): this {
157
+ configs.forEach(config => this.register(config));
158
+ return this;
159
+ }
160
+
161
+ /**
162
+ * Creates and mounts a loader element.
163
+ * @param loaderId - ID of the registered loader to create
164
+ * @param options - Creation options
165
+ * @returns The created loader element
166
+ */
167
+ public create(loaderId: string, options: LoaderOptions = {}): HTMLElement {
168
+ const config = this.loaders.get(loaderId);
169
+ if (!config) {
170
+ throw new Error(`Loader "${loaderId}" not found. Register it first.`);
171
+ }
172
+
173
+ const {
174
+ container,
175
+ useShadowDOM = true,
176
+ className = '',
177
+ size,
178
+ color,
179
+ accentColor,
180
+ } = options;
181
+
182
+ // Create wrapper element
183
+ const wrapper = document.createElement('div');
184
+ wrapper.className = `loader-wrapper ${className}`.trim();
185
+ wrapper.setAttribute('data-loader-id', loaderId);
186
+
187
+ // Apply CSS custom properties
188
+ if (size) {
189
+ wrapper.style.setProperty('--loader-size', typeof size === 'number' ? `${size}px` : size);
190
+ }
191
+ if (color) {
192
+ wrapper.style.setProperty('--loader-color', color);
193
+ }
194
+ if (accentColor) {
195
+ wrapper.style.setProperty('--loader-accent', accentColor);
196
+ }
197
+
198
+ // Create loader content
199
+ if (useShadowDOM) {
200
+ const shadowRoot = wrapper.attachShadow({ mode: 'open' });
201
+
202
+ // Add styles
203
+ const styleEl = document.createElement('style');
204
+ styleEl.textContent = this.processCSS(config.css, options);
205
+ shadowRoot.appendChild(styleEl);
206
+
207
+ // Add loader element
208
+ const loaderEl = document.createElement('span');
209
+ loaderEl.className = 'loader';
210
+ if (config.content) {
211
+ loaderEl.innerHTML = config.content;
212
+ }
213
+ shadowRoot.appendChild(loaderEl);
214
+
215
+ this.activeLoaders.set(wrapper, { id: loaderId, shadowRoot });
216
+ } else {
217
+ // Without Shadow DOM
218
+ const styleEl = document.createElement('style');
219
+ styleEl.textContent = this.scopeCSS(config.css, wrapper, loaderId);
220
+ wrapper.appendChild(styleEl);
221
+
222
+ const loaderEl = document.createElement('span');
223
+ loaderEl.className = `loader loader-${loaderId}`;
224
+ if (config.content) {
225
+ loaderEl.innerHTML = config.content;
226
+ }
227
+ wrapper.appendChild(loaderEl);
228
+
229
+ this.activeLoaders.set(wrapper, { id: loaderId });
230
+ }
231
+
232
+ // Mount to container if provided
233
+ if (container) {
234
+ const containerEl = typeof container === 'string'
235
+ ? document.querySelector(container)
236
+ : container;
237
+ containerEl?.appendChild(wrapper);
238
+ }
239
+
240
+ return wrapper;
241
+ }
242
+
243
+ /**
244
+ * Creates a full-screen overlay loader.
245
+ * @param loaderId - ID of the registered loader
246
+ * @param options - Creation options
247
+ * @returns The created overlay element
248
+ */
249
+ public createOverlay(loaderId: string, options: Omit<LoaderOptions, 'container'> = {}): HTMLElement {
250
+ const overlay = document.createElement('div');
251
+ overlay.className = 'loader-overlay';
252
+ overlay.style.cssText = `
253
+ position: fixed;
254
+ inset: 0;
255
+ display: flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ background: rgba(0, 0, 0, 0.7);
259
+ z-index: 9999;
260
+ `;
261
+
262
+ const loader = this.create(loaderId, { ...options, container: overlay });
263
+ document.body.appendChild(overlay);
264
+
265
+ // Store reference for cleanup
266
+ this.activeLoaders.set(overlay, { id: `overlay-${loaderId}` });
267
+
268
+ return overlay;
269
+ }
270
+
271
+ /**
272
+ * Shows a loader in an existing element, replacing its content.
273
+ * @param loaderId - ID of the registered loader
274
+ * @param target - Target element or selector
275
+ * @param options - Creation options
276
+ * @returns The created loader element
277
+ */
278
+ public showIn(loaderId: string, target: HTMLElement | string, options: LoaderOptions = {}): HTMLElement {
279
+ const targetEl = typeof target === 'string'
280
+ ? document.querySelector<HTMLElement>(target)
281
+ : target;
282
+
283
+ if (!targetEl) {
284
+ throw new Error(`Target element not found: ${target}`);
285
+ }
286
+
287
+ // Store original content
288
+ const originalContent = targetEl.innerHTML;
289
+ targetEl.setAttribute('data-original-content', originalContent);
290
+ targetEl.innerHTML = '';
291
+
292
+ // Create loader
293
+ const loader = this.create(loaderId, { ...options, container: targetEl });
294
+
295
+ return loader;
296
+ }
297
+
298
+ /**
299
+ * Hides a loader and restores original content.
300
+ * @param target - Target element or selector
301
+ */
302
+ public hideIn(target: HTMLElement | string): void {
303
+ const targetEl = typeof target === 'string'
304
+ ? document.querySelector<HTMLElement>(target)
305
+ : target;
306
+
307
+ if (!targetEl) return;
308
+
309
+ const originalContent = targetEl.getAttribute('data-original-content');
310
+ if (originalContent !== null) {
311
+ targetEl.innerHTML = originalContent;
312
+ targetEl.removeAttribute('data-original-content');
313
+ }
314
+ }
315
+
316
+ /**
317
+ * Destroys a loader element.
318
+ * @param loader - The loader element to destroy
319
+ */
320
+ public destroy(loader: HTMLElement): void {
321
+ this.activeLoaders.delete(loader);
322
+ loader.remove();
323
+ }
324
+
325
+ /**
326
+ * Destroys all active loaders.
327
+ */
328
+ public destroyAll(): void {
329
+ this.activeLoaders.forEach((_, loader) => this.destroy(loader));
330
+ }
331
+
332
+ /**
333
+ * Gets a list of all registered loader IDs.
334
+ * @returns Array of loader IDs
335
+ */
336
+ public getRegisteredLoaders(): string[] {
337
+ return Array.from(this.loaders.keys());
338
+ }
339
+
340
+ /**
341
+ * Checks if a loader is registered.
342
+ * @param loaderId - Loader ID to check
343
+ * @returns True if registered
344
+ */
345
+ public has(loaderId: string): boolean {
346
+ return this.loaders.has(loaderId);
347
+ }
348
+
349
+ /**
350
+ * Gets the configuration for a registered loader.
351
+ * @param loaderId - Loader ID
352
+ * @returns The loader configuration or undefined
353
+ */
354
+ public getConfig(loaderId: string): LoaderConfig | undefined {
355
+ return this.loaders.get(loaderId);
356
+ }
357
+
358
+
359
+ // ========================================================================
360
+ // Private Methods
361
+ // ========================================================================
362
+
363
+ /**
364
+ * Processes CSS with variable replacements.
365
+ */
366
+ private processCSS(css: string, options: LoaderOptions): string {
367
+ let processed = css;
368
+
369
+ // Replace hardcoded colors with CSS variables
370
+ processed = processed.replace(/#FFF\b/gi, 'var(--loader-color, #FFF)');
371
+ processed = processed.replace(/#FF3D00\b/gi, 'var(--loader-accent, #FF3D00)');
372
+ processed = processed.replace(/48px/g, 'var(--loader-size, 48px)');
373
+
374
+ return processed;
375
+ }
376
+
377
+ /**
378
+ * Scopes CSS to a specific element (for non-Shadow DOM usage).
379
+ */
380
+ private scopeCSS(css: string, wrapper: HTMLElement, loaderId: string): string {
381
+ // Replace .loader with scoped selector
382
+ return css.replace(/\.loader/g, `.loader-${loaderId}`);
383
+ }
384
+
385
+ /**
386
+ * Registers built-in loader presets.
387
+ */
388
+ private registerBuiltinLoaders(): void {
389
+ // Spinner loaders
390
+ this.register({
391
+ id: 'spinner',
392
+ css: `.loader {
393
+ width: 48px;
394
+ height: 48px;
395
+ border: 5px solid #FFF;
396
+ border-bottom-color: #FF3D00;
397
+ border-radius: 50%;
398
+ display: inline-block;
399
+ box-sizing: border-box;
400
+ animation: rotation 1s linear infinite;
401
+ }
402
+ @keyframes rotation {
403
+ 0% { transform: rotate(0deg); }
404
+ 100% { transform: rotate(360deg); }
405
+ }`
406
+ });
407
+
408
+ this.register({
409
+ id: 'spinner-dual',
410
+ css: `.loader {
411
+ width: 48px;
412
+ height: 48px;
413
+ border: 5px solid #FFF;
414
+ border-bottom-color: transparent;
415
+ border-radius: 50%;
416
+ display: inline-block;
417
+ box-sizing: border-box;
418
+ animation: rotation 1s linear infinite;
419
+ }
420
+ @keyframes rotation {
421
+ 0% { transform: rotate(0deg); }
422
+ 100% { transform: rotate(360deg); }
423
+ }`
424
+ });
425
+
426
+ // Dots loaders
427
+ this.register({
428
+ id: 'dots-bounce',
429
+ css: `.loader, .loader:before, .loader:after {
430
+ border-radius: 50%;
431
+ width: 2.5em;
432
+ height: 2.5em;
433
+ animation-fill-mode: both;
434
+ animation: bblFadInOut 1.8s infinite ease-in-out;
435
+ }
436
+ .loader {
437
+ color: #FFF;
438
+ font-size: 7px;
439
+ position: relative;
440
+ text-indent: -9999em;
441
+ transform: translateZ(0);
442
+ animation-delay: -0.16s;
443
+ }
444
+ .loader:before, .loader:after {
445
+ content: '';
446
+ position: absolute;
447
+ top: 0;
448
+ }
449
+ .loader:before {
450
+ left: -3.5em;
451
+ animation-delay: -0.32s;
452
+ }
453
+ .loader:after {
454
+ left: 3.5em;
455
+ }
456
+ @keyframes bblFadInOut {
457
+ 0%, 80%, 100% { box-shadow: 0 2.5em 0 -1.3em }
458
+ 40% { box-shadow: 0 2.5em 0 0 }
459
+ }`
460
+ });
461
+
462
+ this.register({
463
+ id: 'dots-flash',
464
+ css: `.loader {
465
+ width: 16px;
466
+ height: 16px;
467
+ border-radius: 50%;
468
+ background-color: #fff;
469
+ box-shadow: 32px 0 #fff, -32px 0 #fff;
470
+ position: relative;
471
+ animation: flash 0.5s ease-out infinite alternate;
472
+ }
473
+ @keyframes flash {
474
+ 0% {
475
+ background-color: #FFF2;
476
+ box-shadow: 32px 0 #FFF2, -32px 0 #FFF;
477
+ }
478
+ 50% {
479
+ background-color: #FFF;
480
+ box-shadow: 32px 0 #FFF2, -32px 0 #FFF2;
481
+ }
482
+ 100% {
483
+ background-color: #FFF2;
484
+ box-shadow: 32px 0 #FFF, -32px 0 #FFF2;
485
+ }
486
+ }`
487
+ });
488
+
489
+ // Progress bar loaders
490
+ this.register({
491
+ id: 'progress-bar',
492
+ css: `.loader {
493
+ width: 100%;
494
+ height: 4.8px;
495
+ display: inline-block;
496
+ position: relative;
497
+ background: rgba(255, 255, 255, 0.15);
498
+ overflow: hidden;
499
+ }
500
+ .loader::after {
501
+ content: '';
502
+ width: 96px;
503
+ height: 4.8px;
504
+ background: #FFF;
505
+ position: absolute;
506
+ top: 0;
507
+ left: 0;
508
+ box-sizing: border-box;
509
+ animation: hitZak 1s linear infinite alternate;
510
+ }
511
+ @keyframes hitZak {
512
+ 0% { left: 0; transform: translateX(-1%); }
513
+ 100% { left: 100%; transform: translateX(-99%); }
514
+ }`
515
+ });
516
+
517
+ this.register({
518
+ id: 'progress-fill',
519
+ css: `.loader {
520
+ width: 100%;
521
+ height: 4.8px;
522
+ display: inline-block;
523
+ position: relative;
524
+ background: rgba(255, 255, 255, 0.15);
525
+ overflow: hidden;
526
+ }
527
+ .loader::after {
528
+ content: '';
529
+ box-sizing: border-box;
530
+ width: 0;
531
+ height: 4.8px;
532
+ background: #FFF;
533
+ position: absolute;
534
+ top: 0;
535
+ left: 0;
536
+ animation: animFw 10s linear infinite;
537
+ }
538
+ @keyframes animFw {
539
+ 0% { width: 0; }
540
+ 100% { width: 100%; }
541
+ }`
542
+ });
543
+
544
+ // Pulse loaders
545
+ this.register({
546
+ id: 'pulse',
547
+ css: `.loader {
548
+ width: 48px;
549
+ height: 48px;
550
+ border-radius: 50%;
551
+ display: inline-block;
552
+ position: relative;
553
+ background: #FFF;
554
+ box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.5);
555
+ animation: pulse 1.5s ease-out infinite;
556
+ }
557
+ @keyframes pulse {
558
+ 0% { box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.5); }
559
+ 100% { box-shadow: 0 0 0 30px rgba(255, 255, 255, 0); }
560
+ }`
561
+ });
562
+
563
+ // Square loaders
564
+ this.register({
565
+ id: 'square-flip',
566
+ css: `.loader {
567
+ width: 48px;
568
+ height: 48px;
569
+ display: inline-block;
570
+ position: relative;
571
+ background: #FFF;
572
+ box-sizing: border-box;
573
+ animation: flipX 1s linear infinite;
574
+ }
575
+ @keyframes flipX {
576
+ 0% { transform: perspective(200px) rotateX(0deg) rotateY(0deg); }
577
+ 50% { transform: perspective(200px) rotateX(-180deg) rotateY(0deg); }
578
+ 100% { transform: perspective(200px) rotateX(-180deg) rotateY(-180deg); }
579
+ }`
580
+ });
581
+
582
+ // Skeleton loaders
583
+ this.register({
584
+ id: 'skeleton-card',
585
+ css: `.loader {
586
+ width: 320px;
587
+ height: 150px;
588
+ display: block;
589
+ margin: auto;
590
+ position: relative;
591
+ background: #FFF;
592
+ box-sizing: border-box;
593
+ }
594
+ .loader::after {
595
+ content: '';
596
+ width: calc(100% - 30px);
597
+ height: calc(100% - 30px);
598
+ top: 15px;
599
+ left: 15px;
600
+ position: absolute;
601
+ background-image:
602
+ linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.5) 50%, transparent 80%),
603
+ linear-gradient(#DDD 56px, transparent 0),
604
+ linear-gradient(#DDD 24px, transparent 0),
605
+ linear-gradient(#DDD 18px, transparent 0),
606
+ linear-gradient(#DDD 66px, transparent 0);
607
+ background-repeat: no-repeat;
608
+ background-size: 75px 130px, 55px 56px, 160px 30px, 260px 20px, 290px 56px;
609
+ background-position: 0% 0, 0 0, 70px 5px, 70px 38px, 0px 66px;
610
+ box-sizing: border-box;
611
+ animation: animloader 1s linear infinite;
612
+ }
613
+ @keyframes animloader {
614
+ 0% { background-position: 0% 0, 0 0, 70px 5px, 70px 38px, 0px 66px; }
615
+ 100% { background-position: 150% 0, 0 0, 70px 5px, 70px 38px, 0px 66px; }
616
+ }`
617
+ });
618
+
619
+ // Bars loaders
620
+ this.register({
621
+ id: 'bars-wave',
622
+ css: `.loader {
623
+ color: #FFF;
624
+ position: relative;
625
+ font-size: 11px;
626
+ background: #FFF;
627
+ animation: escaleY 1s infinite ease-in-out;
628
+ width: 1em;
629
+ height: 4em;
630
+ animation-delay: -0.16s;
631
+ }
632
+ .loader:before, .loader:after {
633
+ content: '';
634
+ position: absolute;
635
+ top: 0;
636
+ left: 2em;
637
+ background: #FFF;
638
+ width: 1em;
639
+ height: 4em;
640
+ animation: escaleY 1s infinite ease-in-out;
641
+ }
642
+ .loader:before {
643
+ left: -2em;
644
+ animation-delay: -0.32s;
645
+ }
646
+ @keyframes escaleY {
647
+ 0%, 80%, 100% { box-shadow: 0 0; height: 4em; }
648
+ 40% { box-shadow: 0 -2em; height: 5em; }
649
+ }`
650
+ });
651
+ }
652
+ }
653
+
654
+
655
+ // ============================================================================
656
+ // Singleton Export
657
+ // ============================================================================
658
+
659
+ /** Default LoaderManager instance */
660
+ export const loaderManager = new LoaderManager();
661
+
662
+ export default LoaderManager;