u2ui 1.0.0

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 (440) hide show
  1. package/.htaccess +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +36 -0
  4. package/attr/behavior/README.md +25 -0
  5. package/attr/behavior/behavior.js +261 -0
  6. package/attr/behavior/manifest.json +43 -0
  7. package/attr/behavior/tests/minimal.html +19 -0
  8. package/attr/behavior/tests/test.html +98 -0
  9. package/attr/confirm/README.md +36 -0
  10. package/attr/confirm/confirm.js +90 -0
  11. package/attr/confirm/manifest.json +43 -0
  12. package/attr/confirm/tests/minimal.html +23 -0
  13. package/attr/confirm/tests/test.html +79 -0
  14. package/attr/draghandle/README.md +41 -0
  15. package/attr/draghandle/draghandle.js +42 -0
  16. package/attr/draghandle/tests/minimal.html +44 -0
  17. package/attr/focusgroup/README.md +49 -0
  18. package/attr/focusgroup/focusgroup.js +100 -0
  19. package/attr/focusgroup/manifest.json +38 -0
  20. package/attr/focusgroup/tests/minimal.html +27 -0
  21. package/attr/focusgroup/tests/test.html +154 -0
  22. package/attr/href/README.md +38 -0
  23. package/attr/href/href.js +42 -0
  24. package/attr/href/manifest.json +43 -0
  25. package/attr/href/tests/minimal.html +17 -0
  26. package/attr/href/tests/test.html +70 -0
  27. package/attr/intersect/README.md +42 -0
  28. package/attr/intersect/intersect.js +99 -0
  29. package/attr/intersect/manifest.json +57 -0
  30. package/attr/intersect/tests/minimal.html +30 -0
  31. package/attr/intersect/tests/test.html +64 -0
  32. package/attr/navigable/README.md +31 -0
  33. package/attr/navigable/TargetObserver.js +91 -0
  34. package/attr/navigable/U2TargetObserver.js +75 -0
  35. package/attr/navigable/manifest.json +42 -0
  36. package/attr/navigable/navigable.js +87 -0
  37. package/attr/navigable/tests/U1TargetObserver.html +56 -0
  38. package/attr/navigable/tests/minimal.html +17 -0
  39. package/attr/navigable/tests/targetObserver.html +106 -0
  40. package/attr/navigable/tests/test.html +84 -0
  41. package/attr/parallax/README.md +48 -0
  42. package/attr/parallax/parallax.js +119 -0
  43. package/attr/parallax/tests/minimal.html +25 -0
  44. package/attr/parallax/tests/performance.html +102 -0
  45. package/attr/parallax/tests/test.html +108 -0
  46. package/attr/skin/README.md +59 -0
  47. package/attr/skin/skin.css +51 -0
  48. package/attr/skin/tests/minimal.html +34 -0
  49. package/attr/skin/tests/test.html +96 -0
  50. package/class/badge/README.md +25 -0
  51. package/class/badge/badge.css +35 -0
  52. package/class/badge/tests/minimal.html +17 -0
  53. package/class/badge/tests/test.html +112 -0
  54. package/class/card1/README.md +45 -0
  55. package/class/card1/card1.css +30 -0
  56. package/class/card1/tests/minimal.html +33 -0
  57. package/class/card1/tests/test.html +78 -0
  58. package/class/flex/README.md +62 -0
  59. package/class/flex/flex.css +25 -0
  60. package/class/flex/tests/minimal.html +31 -0
  61. package/class/flex/tests/test.html +58 -0
  62. package/class/grid/README.md +52 -0
  63. package/class/grid/grid.css +40 -0
  64. package/class/grid/tests/minimal.html +34 -0
  65. package/class/grid/tests/test.html +78 -0
  66. package/class/input/README.md +49 -0
  67. package/class/input/input.css +33 -0
  68. package/class/input/tests/minimal.html +39 -0
  69. package/class/input/tests/test.html +29 -0
  70. package/class/reset/README.md +47 -0
  71. package/class/reset/reset.css +8 -0
  72. package/class/reset/tests/minimal.html +23 -0
  73. package/class/table/README.md +57 -0
  74. package/class/table/table.css +126 -0
  75. package/class/table/tests/minimal.html +40 -0
  76. package/class/table/tests/test.html +226 -0
  77. package/class/unstyle/README.md +32 -0
  78. package/class/unstyle/tests/minimal.html +22 -0
  79. package/class/unstyle/tests/test.html +32 -0
  80. package/class/unstyle/unstyle.css +12 -0
  81. package/class/width/README.md +48 -0
  82. package/class/width/tests/minimal.html +27 -0
  83. package/class/width/tests/test.html +101 -0
  84. package/class/width/width.css +22 -0
  85. package/css/base/README.md +25 -0
  86. package/css/base/base.css +127 -0
  87. package/css/base/beta.css +50 -0
  88. package/css/base/full.css +5 -0
  89. package/css/base/nomotion.css +9 -0
  90. package/css/base/print.css +36 -0
  91. package/css/base/tests/nomotion.html +89 -0
  92. package/css/base/tests/test.html +539 -0
  93. package/css/classes/README.md +17 -0
  94. package/css/classes/classes.css +78 -0
  95. package/css/classes/tests/test.html +63 -0
  96. package/css/classless/README.md +26 -0
  97. package/css/classless/aria.css +64 -0
  98. package/css/classless/classless.css +124 -0
  99. package/css/classless/full.css +11 -0
  100. package/css/classless/more.css +340 -0
  101. package/css/classless/simple.css +103 -0
  102. package/css/classless/snippeds/a/icons.css +12 -0
  103. package/css/classless/snippeds/experiments/conventions.css +41 -0
  104. package/css/classless/snippeds/hr/gradient.css +3 -0
  105. package/css/classless/snippeds/hr/section_sign.css +16 -0
  106. package/css/classless/snippeds/hr/tests.html +50 -0
  107. package/css/classless/tests/aria.html +101 -0
  108. package/css/classless/tests/foreign/classless-almond.css.html +445 -0
  109. package/css/classless/tests/foreign/classless-classless.css.html +831 -0
  110. package/css/classless/tests/foreign/classless-mvp.html +415 -0
  111. package/css/classless/tests/foreign/classless.sakura.html +224 -0
  112. package/css/classless/tests/foreign/stylestage.dev.html +304 -0
  113. package/css/classless/tests/foreign/test-homogenizer.html +433 -0
  114. package/css/classless/tests/foreign/test-html5-elements-tester.html +956 -0
  115. package/css/classless/tests/foreign/test-opinionated_css.html +148 -0
  116. package/css/classless/tests/list-bullet.html +110 -0
  117. package/css/classless/tests/more.html +246 -0
  118. package/css/classless/tests/oklch.experiments.html +280 -0
  119. package/css/classless/tests/test.html +106 -0
  120. package/css/classless/tests/variables.html +109 -0
  121. package/css/classless/variables.css +99 -0
  122. package/css/norm/README.md +37 -0
  123. package/css/norm/beta.css +40 -0
  124. package/css/norm/norm.css +98 -0
  125. package/css/norm/oldies.css +60 -0
  126. package/css/norm/tests/test.html +434 -0
  127. package/css/norm/tests/test.js +103 -0
  128. package/el/accordion/README.md +59 -0
  129. package/el/accordion/accordion.css +7 -0
  130. package/el/accordion/accordion.js +258 -0
  131. package/el/accordion/manifest.json +57 -0
  132. package/el/accordion/tests/minimal.html +44 -0
  133. package/el/accordion/tests/test.html +168 -0
  134. package/el/alert/README.md +67 -0
  135. package/el/alert/alert copy.js +224 -0
  136. package/el/alert/alert.css +73 -0
  137. package/el/alert/alert.js +187 -0
  138. package/el/alert/manifest.json +77 -0
  139. package/el/alert/tests/minimal.html +36 -0
  140. package/el/alert/tests/test.html +105 -0
  141. package/el/buttongroup/README.md +36 -0
  142. package/el/buttongroup/buttongroup.css +30 -0
  143. package/el/buttongroup/buttongroup.js +56 -0
  144. package/el/buttongroup/tests/minimal.html +31 -0
  145. package/el/buttongroup/tests/test.html +83 -0
  146. package/el/bytes/README.md +41 -0
  147. package/el/bytes/bytes.css +6 -0
  148. package/el/bytes/bytes.js +97 -0
  149. package/el/bytes/manifest.json +95 -0
  150. package/el/bytes/tests/minimal.html +19 -0
  151. package/el/bytes/tests/test.html +117 -0
  152. package/el/carousel/README.md +52 -0
  153. package/el/carousel/carousel.css +46 -0
  154. package/el/carousel/carousel.js +371 -0
  155. package/el/carousel/manifest.json +58 -0
  156. package/el/carousel/tests/experiments.html +77 -0
  157. package/el/carousel/tests/minimal.html +31 -0
  158. package/el/carousel/tests/nested.html +54 -0
  159. package/el/carousel/tests/test.html +136 -0
  160. package/el/carousel-nav/README.md +40 -0
  161. package/el/carousel-nav/carousel-nav.js +74 -0
  162. package/el/carousel-nav/tests/minimal.html +32 -0
  163. package/el/carousel-nav/tests/test.html +59 -0
  164. package/el/code/README.md +68 -0
  165. package/el/code/code.css +46 -0
  166. package/el/code/code.js +289 -0
  167. package/el/code/manifest.json +66 -0
  168. package/el/code/tests/minimal.html +35 -0
  169. package/el/code/tests/test.html +162 -0
  170. package/el/copy/README.md +35 -0
  171. package/el/copy/copy.css +3 -0
  172. package/el/copy/copy.js +118 -0
  173. package/el/copy/manifest.json +49 -0
  174. package/el/copy/tests/minimal.html +21 -0
  175. package/el/copy/tests/test.html +75 -0
  176. package/el/counter/README.md +47 -0
  177. package/el/counter/counter.css +8 -0
  178. package/el/counter/counter.js +95 -0
  179. package/el/counter/manifest.json +59 -0
  180. package/el/counter/tests/minimal.html +27 -0
  181. package/el/counter/tests/test.html +106 -0
  182. package/el/ico/README.md +162 -0
  183. package/el/ico/font/Font Awesome.css +22 -0
  184. package/el/ico/font/LigatureSymbols.css +7 -0
  185. package/el/ico/font/Material Icons.css +6 -0
  186. package/el/ico/font/RemixFilled.css +8 -0
  187. package/el/ico/font/RemixOutlined.css +8 -0
  188. package/el/ico/font/old/anicons.css +31 -0
  189. package/el/ico/font/old/devicons.css +210 -0
  190. package/el/ico/font/old/material.all.css +36 -0
  191. package/el/ico/font/old/remix.css +15 -0
  192. package/el/ico/font/old/utf8.css +54 -0
  193. package/el/ico/ico.css +111 -0
  194. package/el/ico/ico.js +189 -0
  195. package/el/ico/manifest.json +86 -0
  196. package/el/ico/tests/combinations.html +86 -0
  197. package/el/ico/tests/emojis.html +213 -0
  198. package/el/ico/tests/fonts.html +110 -0
  199. package/el/ico/tests/ico-directory.html +254 -0
  200. package/el/ico/tests/minimal.html +46 -0
  201. package/el/ico/tests/test.html +210 -0
  202. package/el/ico/tests/util-multi.svg +6 -0
  203. package/el/ico/tests/util.css +2 -0
  204. package/el/ico/tests/util.js +110 -0
  205. package/el/input/README.md +39 -0
  206. package/el/input/input.css +35 -0
  207. package/el/input/input.js +331 -0
  208. package/el/input/tests/formParticipation.html +113 -0
  209. package/el/input/tests/minimal.html +33 -0
  210. package/el/input/tests/test.html +258 -0
  211. package/el/masonry/README.md +51 -0
  212. package/el/masonry/manifest.json +60 -0
  213. package/el/masonry/masonry.css +27 -0
  214. package/el/masonry/masonry.js +92 -0
  215. package/el/masonry/tests/minimal.html +39 -0
  216. package/el/masonry/tests/test.html +42 -0
  217. package/el/number/README.md +47 -0
  218. package/el/number/manifest.json +121 -0
  219. package/el/number/number.css +6 -0
  220. package/el/number/number.js +67 -0
  221. package/el/number/tests/minimal.html +25 -0
  222. package/el/number/tests/test.html +138 -0
  223. package/el/out/README.md +32 -0
  224. package/el/out/manifest.json +38 -0
  225. package/el/out/out.css +2 -0
  226. package/el/out/out.js +59 -0
  227. package/el/out/tests/minimal.html +25 -0
  228. package/el/out/tests/test.html +37 -0
  229. package/el/parallax-bg/README.md +36 -0
  230. package/el/parallax-bg/parallax-bg.css +13 -0
  231. package/el/parallax-bg/parallax-bg.js +186 -0
  232. package/el/parallax-bg/tests/bg.jpg +0 -0
  233. package/el/parallax-bg/tests/bg1.jpg +0 -0
  234. package/el/parallax-bg/tests/bg2.jpg +0 -0
  235. package/el/parallax-bg/tests/demo.html +88 -0
  236. package/el/parallax-bg/tests/minimal.html +30 -0
  237. package/el/parallax-bg/tests/test.html +64 -0
  238. package/el/parallax-bg/tests/visible.html +90 -0
  239. package/el/qrcode/README.md +38 -0
  240. package/el/qrcode/manifest.json +43 -0
  241. package/el/qrcode/package.json +22 -0
  242. package/el/qrcode/qrcode.css +13 -0
  243. package/el/qrcode/qrcode.js +46 -0
  244. package/el/qrcode/tests/minimal.html +26 -0
  245. package/el/qrcode/tests/test.html +31 -0
  246. package/el/rating/README.md +45 -0
  247. package/el/rating/manifest.json +65 -0
  248. package/el/rating/rating.css +11 -0
  249. package/el/rating/rating.js +139 -0
  250. package/el/rating/tests/minimal.html +26 -0
  251. package/el/rating/tests/tests.html +77 -0
  252. package/el/rte/README.md +37 -0
  253. package/el/rte/rte.css +9 -0
  254. package/el/rte/rte.js +56 -0
  255. package/el/rte/tests/minimal.html +25 -0
  256. package/el/rte/tests/test.html +37 -0
  257. package/el/skeleton/README.md +30 -0
  258. package/el/skeleton/manifest.json +51 -0
  259. package/el/skeleton/skeleton.css +61 -0
  260. package/el/skeleton/skeleton.js +72 -0
  261. package/el/skeleton/tests/minimal.html +22 -0
  262. package/el/skeleton/tests/test.html +22 -0
  263. package/el/splitbutton/README.md +39 -0
  264. package/el/splitbutton/splitbutton.css +48 -0
  265. package/el/splitbutton/splitbutton.js +26 -0
  266. package/el/splitbutton/tests/minimal.html +30 -0
  267. package/el/splitbutton/tests/test.html +68 -0
  268. package/el/splitpanel/README.md +39 -0
  269. package/el/splitpanel/manifest.json +49 -0
  270. package/el/splitpanel/splitpanel.css +17 -0
  271. package/el/splitpanel/splitpanel.js +116 -0
  272. package/el/splitpanel/tests/minimal.html +31 -0
  273. package/el/splitpanel/tests/tests.html +121 -0
  274. package/el/table/README.md +68 -0
  275. package/el/table/manifest.json +43 -0
  276. package/el/table/table.css +59 -0
  277. package/el/table/table.js +194 -0
  278. package/el/table/tests/minimal.html +38 -0
  279. package/el/table/tests/test.html +108 -0
  280. package/el/tabs/README.md +50 -0
  281. package/el/tabs/manifest.json +59 -0
  282. package/el/tabs/tabs.css +23 -0
  283. package/el/tabs/tabs.js +210 -0
  284. package/el/tabs/tests/minimal.html +35 -0
  285. package/el/tabs/tests/test.html +180 -0
  286. package/el/textfit/README.md +34 -0
  287. package/el/textfit/manifest.json +45 -0
  288. package/el/textfit/tests/minimal.html +25 -0
  289. package/el/textfit/tests/test.html +26 -0
  290. package/el/textfit/textfit.css +6 -0
  291. package/el/textfit/textfit.js +80 -0
  292. package/el/time/README.md +72 -0
  293. package/el/time/manifest.json +118 -0
  294. package/el/time/tests/minimal.html +19 -0
  295. package/el/time/tests/test.html +160 -0
  296. package/el/time/time copy.js +141 -0
  297. package/el/time/time.js +168 -0
  298. package/el/time/time.old.uhtml.js +129 -0
  299. package/el/tooltip/README.md +48 -0
  300. package/el/tooltip/manifest.json +69 -0
  301. package/el/tooltip/tests/minimal.html +25 -0
  302. package/el/tooltip/tests/test.html +178 -0
  303. package/el/tooltip/tooltip.css +97 -0
  304. package/el/tooltip/tooltip.js +82 -0
  305. package/el/tree1/README.md +111 -0
  306. package/el/tree1/manifest.json +78 -0
  307. package/el/tree1/tests/animated.html +134 -0
  308. package/el/tree1/tests/custom.html +51 -0
  309. package/el/tree1/tests/minimal.html +44 -0
  310. package/el/tree1/tests/test.html +260 -0
  311. package/el/tree1/tree1.css +26 -0
  312. package/el/tree1/tree1.js +265 -0
  313. package/el/typewriter/README.md +62 -0
  314. package/el/typewriter/manifest.json +66 -0
  315. package/el/typewriter/tests/minimal.html +25 -0
  316. package/el/typewriter/tests/test.html +78 -0
  317. package/el/typewriter/typewriter.css +6 -0
  318. package/el/typewriter/typewriter.js +166 -0
  319. package/el/typewriter/typewriter.mp3 +0 -0
  320. package/js/Placer/Placer.js +156 -0
  321. package/js/Placer/README.md +62 -0
  322. package/js/Placer/tests/minimal.html +34 -0
  323. package/js/Placer/tests/test.html +49 -0
  324. package/js/PointerObserver/PointerObserver.js +130 -0
  325. package/js/PointerObserver/README.md +34 -0
  326. package/js/PointerObserver/tests/minimal.html +29 -0
  327. package/js/PointerObserver/tests/test.html +35 -0
  328. package/js/SelectorObserver/README.md +47 -0
  329. package/js/SelectorObserver/SelectorObserver.js +201 -0
  330. package/js/SelectorObserver/tests/minimal.html +21 -0
  331. package/js/SelectorObserver/tests/test.html +57 -0
  332. package/js/SelectorObserver/tests/tests.html +161 -0
  333. package/js/contextmenu/README.md +93 -0
  334. package/js/contextmenu/contextmenu.js +336 -0
  335. package/js/contextmenu/tests/minimal.html +44 -0
  336. package/js/contextmenu/tests/test.html +131 -0
  337. package/js/dialog/README.md +49 -0
  338. package/js/dialog/dialog.js +261 -0
  339. package/js/dialog/notification.mp3 +0 -0
  340. package/js/dialog/tests/minimal.html +29 -0
  341. package/js/dialog/tests/notification.mp3 +0 -0
  342. package/js/dialog/tests/test.html +135 -0
  343. package/js/rte/README.md +44 -0
  344. package/js/rte/old/NodeCleaner.js +315 -0
  345. package/js/rte/old/Rte/Rte.mjs +316 -0
  346. package/js/rte/old/Rte/Rte.ui.items.mjs +543 -0
  347. package/js/rte/old/Rte/Rte.ui.mjs +154 -0
  348. package/js/rte/old/Rte/crossbrowser.mjs +323 -0
  349. package/js/rte/old/Rte/font/tinymce.svg +98 -0
  350. package/js/rte/old/Rte/font/tinymce.woff +0 -0
  351. package/js/rte/old/Rte/helpers.mjs +159 -0
  352. package/js/rte/old/Rte/htmlparser.mjs +178 -0
  353. package/js/rte/old/Rte/index.mjs +5 -0
  354. package/js/rte/old/Rte/main.css +189 -0
  355. package/js/rte/old/old.rte.js +132 -0
  356. package/js/rte/old/range-selection.old.js +394 -0
  357. package/js/rte/rte.js +7 -0
  358. package/js/rte/src/behavior.js +228 -0
  359. package/js/rte/src/events.js +73 -0
  360. package/js/rte/src/fixes.js +251 -0
  361. package/js/rte/src/range.js +472 -0
  362. package/js/rte/src/rte.js +72 -0
  363. package/js/rte/src/ui/items/ai.js +167 -0
  364. package/js/rte/src/ui/items/code.js +93 -0
  365. package/js/rte/src/ui/items/undo.js +183 -0
  366. package/js/rte/src/ui.items.js +571 -0
  367. package/js/rte/src/ui.js +269 -0
  368. package/js/rte/src/util/htmlparser.js +178 -0
  369. package/js/rte/src/util/indentHtml.js +48 -0
  370. package/js/rte/tests/ai.html +81 -0
  371. package/js/rte/tests/behavior.html +88 -0
  372. package/js/rte/tests/events.html +69 -0
  373. package/js/rte/tests/fixes.html +95 -0
  374. package/js/rte/tests/minimal.html +34 -0
  375. package/js/rte/tests/notes.md +6 -0
  376. package/js/rte/tests/range.html +167 -0
  377. package/js/rte/tests/selection-explorer.html +222 -0
  378. package/js/rte/tests/test.html +92 -0
  379. package/js/shortcut/README.md +33 -0
  380. package/js/shortcut/shortcut.js +89 -0
  381. package/js/shortcut/tests/minimal.html +23 -0
  382. package/js/shortcut/tests/test.html +68 -0
  383. package/package.json +12 -0
  384. package/u2/README.md +4 -0
  385. package/u2/auto.js +161 -0
  386. package/u2/auto.ui.js +85 -0
  387. package/u2/experiments/Waiter/test.html +132 -0
  388. package/u2/experiments/getElementByIdPromise/test.html +76 -0
  389. package/u2/experiments/patchInputValue.html +124 -0
  390. package/u2/experiments/radiobutton/test.html +75 -0
  391. package/u2/experiments/tests/test.html +223 -0
  392. package/u2/experiments/u1-responsive/responsive.js +62 -0
  393. package/u2/experiments/u1-responsive/test.html +65 -0
  394. package/u2/experiments/u2Element.js +139 -0
  395. package/u2/experiments/u2Element.test.html +47 -0
  396. package/u2/old-stuff/IterableWeakMap/mod.js +70 -0
  397. package/u2/old-stuff/css/onStyleSheet/mod.js +114 -0
  398. package/u2/old-stuff/css/onStyleSheet/monkeypatches.js +28 -0
  399. package/u2/old-stuff/css/onStyleSheet/test/include.css +19 -0
  400. package/u2/old-stuff/css/onStyleSheet/test/style-has-include.css +6 -0
  401. package/u2/old-stuff/css/onStyleSheet/test/style-no-include.css +3 -0
  402. package/u2/old-stuff/css/onStyleSheet/test/test.html +48 -0
  403. package/u2/old-stuff/css/parser/mod.js +182 -0
  404. package/u2/old-stuff/css/parser/parser_old/mod.js +128 -0
  405. package/u2/old-stuff/css/parser/parser_old/test.html +43 -0
  406. package/u2/old-stuff/css/parser/parser_old/util.js +22 -0
  407. package/u2/old-stuff/css/parser/style.html +52 -0
  408. package/u2/old-stuff/css/parser/test.html +38 -0
  409. package/u2/old-stuff/el/ai-texter/README.md +23 -0
  410. package/u2/old-stuff/el/ai-texter/ai-texter.css +12 -0
  411. package/u2/old-stuff/el/ai-texter/ai-texter.js +153 -0
  412. package/u2/old-stuff/el/ai-texter/tests/minimal.html +47 -0
  413. package/u2/old-stuff/el/ai-texter/tests/test.html +71 -0
  414. package/u2/old-stuff/init.js +38 -0
  415. package/u2/old-stuff/markHashLinks.js +51 -0
  416. package/u2/old-stuff/onElement/mod.js +73 -0
  417. package/u2/old-stuff/test-helpers/mod.js +36 -0
  418. package/u2/old-stuff/test-helpers/test.html +4 -0
  419. package/u2/old-stuff/tests/init.js.html +51 -0
  420. package/u2/old-stuff/viewport.js +64 -0
  421. package/u2/projects.json +468 -0
  422. package/u2/tests/boilerplate.html +46 -0
  423. package/u2/tests/kacheln.html +245 -0
  424. package/u2/tests/showcase.html +270 -0
  425. package/u2/tests/showcase2.html +157 -0
  426. package/u2/tests/test-init.js +35 -0
  427. package/u2/tests/test.html +355 -0
  428. package/u2/tools/baseElement.js +95 -0
  429. package/u2/tools/baseElement.test.html +119 -0
  430. package/u2/tools/ce-inspector.js +308 -0
  431. package/u2/tools/ce-inspector.test.html +66 -0
  432. package/u2/tools/ce-manfest-from-element.js +207 -0
  433. package/u2/tools/dev-iframe.js +213 -0
  434. package/u2/tools/dev-iframe.test.html +75 -0
  435. package/u2/tools/eventsExplorer.js +101 -0
  436. package/u2/tools/logo/u1.svg +9 -0
  437. package/u2/tools/logo/u1ui.svg +6 -0
  438. package/u2/tools/update.repos.json.js +234 -0
  439. package/u2/u2.js +14 -0
  440. package/u2/utils.js +59 -0
@@ -0,0 +1,42 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "readme": "README.md",
4
+ "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "navigable.js",
8
+ "declarations": [
9
+ {
10
+ "summary": "Make elements navigatable",
11
+ "description": "Links to Elements that can have a active-state (dialog, details, popover, etc.) can be activated by simply linking to its id. This is done by adding the custom attribute u2-navigable to the element.",
12
+ "name": "u2-navigable",
13
+ "members": [],
14
+ "events": [],
15
+ "attributes": [
16
+ {
17
+ "name": "u2-navigable",
18
+ "description": "By adding the custom attribute u2-navigable to an element, the element becomes navigatable. Opens by hash-link even on loading the page, changes the url by closing the element.",
19
+ "type": "boolean"
20
+ },{
21
+ "name": "id",
22
+ "description": "An id is required to navigate to the element."
23
+ }
24
+ ],
25
+ "cssProperties": [],
26
+ "attributeName": "u2-navigable"
27
+ }
28
+ ],
29
+ "exports": [
30
+ {
31
+ "kind": "custom-attribute-definition",
32
+ "name": "u2-navigable",
33
+ "declaration": {
34
+ "name": "u2-navigable",
35
+ "module": "navigable.js"
36
+ }
37
+ }
38
+ ]
39
+ }
40
+ ]
41
+ }
42
+
@@ -0,0 +1,87 @@
1
+ import {TargetObserver} from './TargetObserver.js';
2
+ import {U2TargetObserver, toggleParam} from './U2TargetObserver.js';
3
+
4
+
5
+ // translate hash-links to "u2-navigable"-elements into "u2-target"-params
6
+ new TargetObserver({
7
+ on: (el) => {
8
+ toggleParam(el.id, true, true);
9
+ const url = new URL(location);
10
+ url.hash = '';
11
+ history.replaceState(null, '', url.href);
12
+ },
13
+ matches: '[u2-navigable]'
14
+ })
15
+
16
+
17
+ /* dialog element */
18
+ // TODO: there is no open-event, so we can not change the url if its opened by .showModal() mybe "invoke-event" some day?
19
+ new U2TargetObserver({
20
+ on: el => !el.open && el.showModal(),
21
+ off: el => el.close(),
22
+ matches: 'dialog[u2-navigable]',
23
+ });
24
+ addEventListener('close',e=>{
25
+ const el = e.target;
26
+ if (!el.matches('dialog[u2-navigable]')) return;
27
+ toggleParam(el.id, false);
28
+ },true);
29
+
30
+
31
+ /* details */
32
+ new U2TargetObserver({
33
+ on: el => el.open = true,
34
+ off: el => el.open = false,
35
+ matches: 'details[u2-navigable]',
36
+ });
37
+ addEventListener('toggle',e=>{
38
+ const el = e.target;
39
+ if (!el.matches('details[u2-navigable][id]')) return;
40
+ if (el.open) toggleParam(el.id, true);
41
+ else toggleParam(el.id, false);
42
+ },true);
43
+
44
+
45
+ /* checkbox and radio */
46
+ new U2TargetObserver({
47
+ on: el => el.checked = true,
48
+ off: el => el.checked = false,
49
+ matches: 'input:is([type=checkbox],[type=radio])[u2-navigable]',
50
+ });
51
+ addEventListener('change',e=>{
52
+ const el = e.target;
53
+ if (!el.matches('input:is([type=checkbox],[type=radio])[u2-navigable][id]')) return;
54
+
55
+ if (el.type === 'radio') {
56
+ const elements = el.form ? el.form.elements[el.name] : document.getElementsByName(el.name);
57
+ elements.forEach(e => toggleParam(e.id, false)); // toggleParam(e.id, false, TRUE) does not work as expected, why?
58
+ }
59
+
60
+ if (el.checked) toggleParam(el.id, true);
61
+ else toggleParam(el.id, false);
62
+ });
63
+
64
+
65
+ /* popover */
66
+ new U2TargetObserver({
67
+ on: el => el.showPopover(),
68
+ off: el => el.hidePopover(),
69
+ matches: '[popover][u2-navigable]',
70
+ });
71
+ addEventListener('toggle', e => {
72
+ const el = e.target;
73
+ if (!el.matches('[popover][u2-navigable][id]')) return;
74
+ const newState = e.newState;
75
+ toggleParam(el.id, newState === 'open');
76
+ }, true);
77
+
78
+
79
+
80
+ // beta
81
+ // u2 unified api
82
+ addEventListener('u2-activate', e => {
83
+ if (!e.target.hasAttribute('u2-navigable')) return;
84
+ if (!e.target.hasAttribute('id')) { console.warn('element with a u2-navigable attribute must have an id'); return; }
85
+ //e.preventDefault(); // needed?
86
+ location.href = '#' + e.target.id;
87
+ });
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width">
6
+ <title></title>
7
+
8
+ <link rel=stylesheet href="../../../css/classless/full.css">
9
+ <link rel=stylesheet href="../../../css/classless/simple.css">
10
+ <script type=module async src="../../../u2/tests/test-init.js"></script>
11
+
12
+ <body>
13
+
14
+ <section>
15
+ <h1>Details</h1>
16
+
17
+ <button onclick="toggleParam('details1', true)">open</button>
18
+ <button onclick="toggleParam('details1', false)">close</button>
19
+ <button onclick="toggleParam('details1', null)">toggle</button>
20
+ <button onclick="toggleParam('details1', null, true)">toggle, no browser-back-history</button>
21
+
22
+ <details u2-navigable id=details1>
23
+ <summary>summary 1</summary>
24
+ More rext
25
+ </details>
26
+ <details u2-navigable id=details2>
27
+ <summary>summary 2</summary>
28
+ More rext
29
+ </details>
30
+
31
+
32
+ </section>
33
+
34
+ <script type=module>
35
+
36
+ import {U2TargetObserver, toggleParam} from "../U2TargetObserver.js";
37
+ window.toggleParam = toggleParam;
38
+
39
+
40
+ new U2TargetObserver({
41
+ on: el => el.open = true,
42
+ off: el => el.open = false,
43
+ matches:'details[u2-navigable]',
44
+ });
45
+
46
+ addEventListener('toggle',e=>{
47
+ const el = e.target;
48
+ if (!el.matches('details[u2-navigable][id]')) return;
49
+ if (el.open) {
50
+ toggleParam(el.id, true);
51
+ } else {
52
+ toggleParam(el.id, false);
53
+ }
54
+ },true);
55
+
56
+ </script>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html lang=en>
3
+ <head>
4
+ <meta charset=utf-8>
5
+ <meta name=viewport content="width=device-width">
6
+
7
+ <script src="../navigable.js" type=module async></script>
8
+
9
+ <body>
10
+
11
+ <section class="main">
12
+ Link to navigable dialog:<br>
13
+ <a href="#navigable">open</a>
14
+ <dialog u2-navigable id=navigable>
15
+ go back using esc or your browser's back button
16
+ </dialog>
17
+ </section>
@@ -0,0 +1,106 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width">
6
+ <title></title>
7
+
8
+ <link rel=stylesheet href="../../../css/classless/full.css">
9
+ <link rel=stylesheet href="../../../css/classless/simple.css">
10
+
11
+ <script src="../TargetObserver.js" type=module async></script>
12
+
13
+ <body>
14
+
15
+ <section>
16
+ <h1>Dialog</h1>
17
+ <a href="#dialog1">navigate to #dialog1</a>
18
+ <!--todo: button onclick="dialog1.showModal()">open by javascript</button-->
19
+
20
+ <dialog id="dialog1" u2-navigable>
21
+ dialog 1 is open
22
+ <br>
23
+ <a href="#dialog2">navigate to #dialog2</a>
24
+ </dialog>
25
+
26
+ <dialog id="dialog2" u2-navigable>
27
+ dialog 2 is open
28
+ </dialog>
29
+
30
+ </section>
31
+
32
+ <script type=module>
33
+ import {TargetObserver} from "../TargetObserver.js";
34
+
35
+ /* dialog element */
36
+ new TargetObserver({
37
+ in: el => {
38
+ !el.open && el.showModal()
39
+ },
40
+ out: el => {
41
+ el.close()
42
+ },
43
+ matches: 'dialog[u2-navigable]',
44
+ });
45
+
46
+ addEventListener('close',e=>{
47
+ const target = e.target;
48
+ if (!target.id) return;
49
+ if (e.target.id !== location.hash.substring(1)) return;
50
+ if (!target.matches('dialog[u2-navigable]')) return;
51
+
52
+ history.back();
53
+ e.preventDefault();
54
+ },true);
55
+
56
+
57
+ /* divs */
58
+ new TargetObserver({
59
+ out: el => {
60
+ el.hidden = true;
61
+ },
62
+ in: el => {
63
+ el.hidden = false;
64
+ },
65
+ matches: '.div',
66
+ });
67
+
68
+ /* all */
69
+ setTimeout(function(){ // test if it trigger after target changed
70
+ let obs = new TargetObserver({
71
+ on: el => console.log('on',el),
72
+ off: el => console.log('off',el)
73
+ });
74
+
75
+ },1000)
76
+ </script>
77
+
78
+ <section>
79
+ <h1>Details</h1>
80
+
81
+ <a href="#div1">open div1</a><br>
82
+ <a href="#div2">open div2 (should also open div1)</a>
83
+
84
+ <div id="div1" hidden class="div">
85
+ div 1
86
+ <div id="div2" hidden class="div">
87
+ div 2
88
+ now open div 3
89
+ </div>
90
+ </div>
91
+
92
+ <br>
93
+
94
+ <a href="#div3">open div3</a><br>
95
+
96
+ <div id="div3" hidden class="div">div 3</div>
97
+
98
+ <style>
99
+ .div {
100
+ background:yellow;
101
+ border: 1px solid;
102
+ padding: 10px;
103
+ margin: 10px;
104
+ }
105
+ </style>
106
+ </section>
@@ -0,0 +1,84 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width">
6
+ <title>Attribute u2-href tests</title>
7
+
8
+ <link rel=stylesheet href="../../../css/classless/full.css">
9
+ <link rel=stylesheet href="../../../css/classless/simple.css">
10
+ <script type=module async src="../../../u2/tests/test-init.js"></script>
11
+
12
+ <script src="../navigable.js" type=module async></script>
13
+
14
+ <body>
15
+
16
+ <section>
17
+ <h1>Dialog</h1>
18
+ <a href="#dialog1">navigate to #dialog1</a>
19
+ <!-- <br>
20
+ <button onclick="dialog1.showModal()">open by javascript</button>
21
+ <br>
22
+ <a href="#dialog2">navigate to #dialog2 (nested)</a> -->
23
+
24
+ <dialog id="dialog1" u2-navigable>
25
+ dialog 1 is open
26
+ <br>
27
+ <a href="#dialog2">navigate to #dialog2</a>
28
+
29
+ <dialog id="dialog2" u2-navigable>
30
+ dialog 2 is open
31
+ </dialog>
32
+
33
+ <section>
34
+ <h1>Checkbox</h1>
35
+ <input type=checkbox u2-navigable id=checkbox1>
36
+ <input type=checkbox u2-navigable id=checkbox2>
37
+ <input type=checkbox u2-navigable id=checkbox3>
38
+ </section>
39
+
40
+ <section>
41
+ <h1>Radiobutton</h1>
42
+ <input type=radio u2-navigable name=radio1 id=radio1>
43
+ <input type=radio u2-navigable name=radio1 id=radio2>
44
+ <input type=radio u2-navigable name=radio1 id=radio3>
45
+ </section>
46
+
47
+
48
+ <button onclick="this.parentNode.close()">close</button>
49
+ </dialog>
50
+
51
+
52
+ </section>
53
+
54
+
55
+
56
+ <section>
57
+ <h1>Details</h1>
58
+
59
+ <a href="#details1">navigate to #details1</a>
60
+ <!-- todo: <button onclick="dialog1.showModal()">open by javascript</button> -->
61
+ <details u2-navigable id=details1>
62
+ <summary>summary 1</summary>
63
+ More text
64
+ </details>
65
+ <details u2-navigable id=details2>
66
+ <summary>summary 2</summary>
67
+ More text
68
+ </details>
69
+ <div>search the word "more" in browser search. Details should open and url should be changed (chromium for now)</div>
70
+
71
+ </section>
72
+
73
+ <!-- Ergänzung für Popover-Element -->
74
+ <section>
75
+ <h1>Popover</h1>
76
+ <a href="#popover1">Toggle Popover (href)</a>
77
+ <br>
78
+ <button popovertarget="popover1">Toggle Popover (popovertarget)</button>
79
+ <div id=popover1 popover u2-navigable>
80
+ <p>Popover content</p>
81
+ <button popovertarget="popover1" popovertargetaction="hide">Close</button>
82
+ </div>
83
+ </section>
84
+
@@ -0,0 +1,48 @@
1
+ # [u2-parallax] - attribute
2
+ Make every element scrolling at different speed
3
+
4
+ ## Features
5
+
6
+ - fast!
7
+ - easy API
8
+ - works for dynamic added elements
9
+ - lightweight < 4k minified
10
+
11
+ ## Usage
12
+
13
+ ```html
14
+ <div u2-parallax style="--u2-parallax-speed:1.1;">faster</div>
15
+ <div u2-parallax style="--u2-parallax-speed:1;">parallax</div>
16
+ <div u2-parallax style="--u2-parallax-speed:0.9;">slower</div>
17
+ ```
18
+
19
+ ```css
20
+ [u2-parallax] {
21
+ background:var(--color-light);
22
+ display:inline-block;
23
+ padding:.5rem;
24
+ }
25
+ ```
26
+
27
+ ## Install
28
+
29
+ ```html
30
+ <script src="https://cdn.jsdelivr.net/gh/u2ui/u2@x.x.x/attr/parallax/parallax.min.js" type=module async></script>
31
+ ```
32
+
33
+ ## Demos
34
+
35
+ [minimal.html](http://gcdn.li/u2ui/u2@main/attr/parallax/tests/minimal.html)
36
+ [performance.html](http://gcdn.li/u2ui/u2@main/attr/parallax/tests/performance.html)
37
+ [test.html](http://gcdn.li/u2ui/u2@main/attr/parallax/tests/test.html)
38
+
39
+ ## Also interesting
40
+
41
+ Parallax scrolling Backgrounds
42
+ https://github.com/nuxodin/parax-bg
43
+
44
+ ## About
45
+
46
+ - MIT License, Copyright (c) 2022 <u2> (like all repositories in this organization) <br>
47
+ - Suggestions, ideas, finding bugs and making pull requests make us very happy. ♥
48
+
@@ -0,0 +1,119 @@
1
+ /* Copyright (c) 2016 Tobias Buschor https://goo.gl/gl0mbf | MIT License https://goo.gl/HgajeK */
2
+
3
+
4
+ const pool = new Map();
5
+ function add(el){
6
+ let obj = new parallax(el);
7
+ pool.set(el, obj);
8
+ if (pool.size === 1) addGlobalListeners();
9
+ return obj;
10
+ }
11
+ function remove(el){
12
+ pool.delete(el);
13
+ if (pool.size === 0) removeGlobalListeners();
14
+ }
15
+
16
+ var styEl = document.createElement('style');
17
+ styEl.innerHTML = '[u2-parallax]{z-index:1; will-change:transform;}';
18
+ document.head.prepend(styEl);
19
+
20
+ const parallax = class {
21
+ constructor(el){
22
+ this.el = el;
23
+ }
24
+ connect(){
25
+ this.positionChange();
26
+ let style = getComputedStyle(this.el);
27
+ //let direction = parseFloat(style.getPropertyValue('--u2-parallax-direction'));
28
+ //if (isNaN(direction)) direction = 180;
29
+ //this.angle = (direction + 90) / 180 * Math.PI;
30
+ this.speed = parseFloat(style.getPropertyValue('--u2-parallax-speed'));
31
+ if (isNaN(this.speed)) this.speed = .8;
32
+ onScroll() // todo: better solution?
33
+ }
34
+ positionChange(){
35
+ this.oRect = vpRectWithoutTransform(this.el);
36
+ if (!this.oRect) return; // hidden
37
+ this.oRect.centerY = this.oRect.top + this.oRect.height/2;
38
+ }
39
+ onScroll(pageCenterY, pageCenterX){ // this has to be very fast, can it be improved?
40
+ if (!this.oRect) return; // hidden
41
+ const centerDiff = pageCenterY - this.oRect.centerY;
42
+ const yRoute = (this.speed-1) * -centerDiff;
43
+ //const y = yRoute * Math.sin(this.angle);
44
+ //const x = yRoute * Math.cos(this.angle);
45
+ // todo, only transform if visible?
46
+ this.el.style.transform = 'translate3d('+0+'px,'+yRoute+'px,0)';
47
+ // this.el.attributeStyleMap.set('transform', new CSSTransformValue([
48
+ // new CSSTranslate(CSS.px(0),CSS.px(yRoute),CSS.px(0))
49
+ // ]));
50
+ }
51
+ };
52
+
53
+ function calcViewportRects(e){
54
+ pool.forEach(obj => obj.positionChange());
55
+ }
56
+ function onScroll(e){
57
+ const pageCenterY = document.scrollingElement.scrollTop + winHeight/2;
58
+ const pageCenterX = document.scrollingElement.scrollLeft + winWidth/2;
59
+ requestAnimationFrame(()=>{
60
+ pool.forEach(obj => obj.onScroll(pageCenterY, pageCenterX));
61
+ });
62
+ }
63
+
64
+ function addGlobalListeners(){
65
+ addEventListener('resize',calcViewportRects);
66
+ addEventListener('DOMContentLoaded',calcViewportRects);
67
+ addEventListener('load',calcViewportRects);
68
+ addEventListener('resize', onScroll);
69
+ addEventListener('load', onScroll);
70
+ document.addEventListener('scroll', onScroll);
71
+ addEventListener('wheel', onScroll); // firefox, scroll is async so wheel is faster
72
+ }
73
+ function removeGlobalListeners(){
74
+ removeEventListener('resize',calcViewportRects);
75
+ removeEventListener('DOMContentLoaded',calcViewportRects);
76
+ removeEventListener('load',calcViewportRects);
77
+ removeEventListener('resize', onScroll);
78
+ removeEventListener('load', onScroll);
79
+ document.removeEventListener('scroll', onScroll);
80
+ removeEventListener('wheel', onScroll); // firefox
81
+ }
82
+
83
+ // cache innerHeight, Is that of any use?
84
+ let winHeight = document.documentElement.clientHeight; // was innerHeight // better this?: https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions
85
+ let winWidth = document.documentElement.clientWidth;
86
+ addEventListener('resize',(e)=>{
87
+ winHeight = document.documentElement.clientHeight;
88
+ winWidth = document.documentElement.clientWidth;
89
+ });
90
+
91
+
92
+
93
+ /* helpers */
94
+ function vpRectWithoutTransform(el){
95
+ if (!el.offsetParent) return null;
96
+ let rect = {
97
+ left : 0,
98
+ top : 0,
99
+ width : el.offsetWidth,
100
+ height: el.offsetHeight,
101
+ }
102
+ do {
103
+ rect.left += el.offsetLeft;
104
+ rect.top += el.offsetTop;
105
+ el = el.offsetParent;
106
+ } while (el);
107
+ return rect;
108
+ }
109
+
110
+ import {SelectorObserver} from '../../js/SelectorObserver/SelectorObserver.js';
111
+ new SelectorObserver({
112
+ on: (el) => {
113
+ const parallaxObj = add(el);
114
+ parallaxObj.connect();
115
+ },
116
+ off: (el) => {
117
+ remove(el)
118
+ }
119
+ }).observe('[u2-parallax]');
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html lang=en>
3
+ <head>
4
+ <meta charset=utf-8>
5
+ <meta name=viewport content="width=device-width">
6
+ <title>counter element test | U2-design-system</title>
7
+ <script src="../../../u2/tests/test-init.js" type=module async></script>
8
+
9
+ <script src="../parallax.js" type=module async></script>
10
+
11
+ <body>
12
+
13
+ <section class=main>
14
+ <div u2-parallax style="--u2-parallax-speed:1.1;">faster</div>
15
+ <div u2-parallax style="--u2-parallax-speed:1;">parallax</div>
16
+ <div u2-parallax style="--u2-parallax-speed:0.9;">slower</div>
17
+ </section>
18
+
19
+ <style class=main>
20
+ [u2-parallax] {
21
+ background:var(--color-light);
22
+ display:inline-block;
23
+ padding:.5rem;
24
+ }
25
+ </style>
@@ -0,0 +1,102 @@
1
+ <!DOCTYPE html>
2
+ <head>
3
+ <meta charset="utf-8">
4
+ <meta name=viewport content="width=device-width">
5
+ <script src="../../../u2/tests/test-init.js" type=module async></script>
6
+
7
+ <script src="../parallax.js" type=module async></script>
8
+ <style>
9
+ body, html {
10
+ margin:0;
11
+ height:100%;
12
+ font-size: calc(12px + 1vmax);
13
+ font-family:arial;
14
+ }
15
+ h1 {
16
+ margin:0;
17
+ }
18
+ #bg {
19
+ height:100%;
20
+ }
21
+ #bg > span {
22
+ z-index:-1;
23
+ position:absolute;
24
+ background:red;
25
+ width:2em;
26
+ height:2em;
27
+ box-shadow:0 0 10px black;
28
+ border-radius:20px;
29
+ contain:strict;
30
+ }
31
+ #bg > span::after {
32
+ content:'gix';
33
+ }
34
+ #logo {
35
+ height:100vh;
36
+ display:flex;
37
+ justify-content: center;
38
+ align-items: center;
39
+ gap:.5em;
40
+ font-size:calc(16px + 1vw);
41
+ }
42
+ #logo > span {
43
+ flex-basis:3em;
44
+ height:3em;
45
+ display:flex;
46
+ justify-content: center;
47
+ align-items: center;
48
+ color: white;
49
+ color:black;
50
+ border:1px solid black;
51
+
52
+ }
53
+ #logo :nth-child(1) { --u2-parallax-speed:1.3; background-color:#79BBE8; }
54
+ #logo :nth-child(2) { --u2-parallax-speed:1.2; background-color:#7EE2F2; }
55
+ #logo :nth-child(3) { --u2-parallax-speed:1.1; background-color:#7CDBCF; }
56
+ #logo :nth-child(4) { --u2-parallax-speed:1.0; background-color:#7EF2C2; }
57
+ #logo :nth-child(5) { --u2-parallax-speed:0.9; background-color:#79E89A; }
58
+
59
+ </style>
60
+ <script type=module>
61
+ for (let i=400; i>0; i--) {
62
+ var span = document.createElement('span')
63
+ span.setAttribute('u2-parallax', true);
64
+ let speed = Math.random();
65
+ span.style.setProperty('--u2-parallax-speed', speed);
66
+ span.style.setProperty('opacity', speed+.1);
67
+ span.style.setProperty('left', Math.random()*100+'%');
68
+ span.style.setProperty('top', Math.random()*100+'%');
69
+ span.style.width = (5 + (speed * 50)) + 'px';
70
+ span.style.height = (5 + (speed * 50)) + 'px';
71
+ span.style.zIndex = -Math.floor((1-speed) * 100);
72
+ const colors = ['#79BBE8','#7EE2F2','#7CDBCF','#7EF2C2','#79E89A'];
73
+ const index = Math.floor(Math.random() * colors.length)
74
+ span.style.backgroundColor = colors[index];
75
+ bg.append(span)
76
+ }
77
+ </script>
78
+ </head>
79
+ <body>
80
+
81
+ <div id=bg>
82
+ <h1 id=logo>
83
+ <span u2-parallax>P</span>
84
+ <span u2-parallax>A</span>
85
+ <span u2-parallax>R</span>
86
+ <span u2-parallax>A</span>
87
+ <span u2-parallax>X</span>
88
+ </h1>
89
+ </div>
90
+
91
+
92
+ <div style="max-width:800px; margin:4em auto; padding:2em; background:rgba(255,255,255,.8); border:1px solid">
93
+ <h2>How to use</h2>
94
+ <p>Include the script from...</p>
95
+ <p>Add the attribute "u2-parallax" to each element you like to change the speed.</p>
96
+ <pre>&lt;span u2-parallax style="--u2-parallax-speed:2"&gt;
97
+ I am twice as fast
98
+ &lt;/span&gt;</pre>
99
+ </div>
100
+
101
+
102
+ <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>