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,167 @@
1
+ //import {$range} from '../../range.js';
2
+ import * as state from '../../events.js';
3
+
4
+
5
+ Rte.ui.setItem('ai', {
6
+ icon: 'smart-toy',
7
+ labels: { en: 'Magic-Editor' },
8
+ async click() {
9
+
10
+ const activeRte = state.active;
11
+ const original = activeRte.innerHTML;
12
+
13
+ const dEl = document.createElement('dialog');
14
+ dEl.className = 'u2RteAiDialog';
15
+ dEl.innerHTML = `
16
+ <h2>Magic-Editor</h2>
17
+ <form class=-promptForm>
18
+ <label style="display:block; text-align:center; margin-bottom:1rem">
19
+ Anweisung:
20
+ <input name=prompt autofocus list=u2RteAiList placeholder="Schlüsselwörter fett">
21
+ <button name=run>run</button>
22
+ <datalist id=u2RteAiList>
23
+ <option value="Korrigiere">
24
+ <option value="Erweitere">
25
+ <option value="Fahre fort">
26
+ <option value="Fasse zusammen">
27
+ <option value="Lorem Ipsum, 2 Paragraphen">
28
+ </datalist>
29
+ </label>
30
+ </form>
31
+ <div class=-views>
32
+ <div>
33
+ <h2>Original</h2>
34
+ <div class="-textBox">${original}</div>
35
+ </div>
36
+ <div>
37
+ <h2>Bearbeitet</h2>
38
+ <div class="-textBox -result" contenteditable></div>
39
+ </div>
40
+ <div>
41
+ <h2>Unterschied</h2>
42
+ <div class="-textBox -diff"></div>
43
+ </div>
44
+ </div>
45
+ <style>
46
+ .u2RteAiDialog {
47
+ width: 100%;
48
+ max-width: none;
49
+ max-height: none;
50
+ height: auto;
51
+ border: none;
52
+
53
+ & ins { background: #dfd; text-decoration: none; }
54
+ & del { background: #fdd; text-decoration: none; }
55
+ & .-views { display:flex; gap:1rem; min-height:10rem; flex-wrap:wrap }
56
+ & .-views > div { flex:1 1 35rem; display:flex; flex-direction:column; }
57
+ & .-views > div > h2 { flex:0 0 auto; margin:0;}
58
+
59
+ & .-textBox { border:1px solid; padding:.5rem; flex:1 1 auto; box-shadow: 0 0 1rem #0003; max-height: 30rem; overflow:auto; }
60
+ & .-buttons { display:flex; flex-wrap:wrap; justify-content:end; gap:1em; margin-top:1rem }
61
+ }
62
+ </style>
63
+ <div u2-focusgroup class=-buttons>
64
+ <button type="button" class=-ok disabled>Übernehmen</button>
65
+ <button type="button" class=-cancel>Abbrechen</button>
66
+ </div>
67
+ `;
68
+
69
+
70
+
71
+ const btnOk = dEl.querySelector('.-ok');
72
+ const btnCancel = dEl.querySelector('.-cancel');
73
+
74
+
75
+ dEl.querySelector('.-promptForm').onsubmit = async e => {
76
+ e.preventDefault();
77
+
78
+ dEl.querySelector('.-result').innerHTML = 'loading...';
79
+ dEl.querySelector('.-diff').innerHTML = 'loading...';
80
+ dEl.querySelector('.-promptForm').inert = true;
81
+
82
+ const prompt = dEl.querySelector('[name=prompt]').value;
83
+ dEl.querySelector('.-result').innerHTML = await request(prompt, original);
84
+
85
+ await showDiff();
86
+
87
+ btnOk.disabled = false;
88
+ dEl.querySelector('.-promptForm').inert = false;
89
+ btnOk.focus();
90
+ };
91
+ dEl.querySelector('.-result').addEventListener('input', async e => {
92
+ showDiff();
93
+ });
94
+
95
+ async function showDiff(){
96
+ const edited = dEl.querySelector('.-result').innerHTML;
97
+ const lib = await import('https://cdn.jsdelivr.net/npm/htmldiff-js@1.0.5/+esm');
98
+ const HtmlDiff = lib.default.default;
99
+ dEl.querySelector('.-diff').innerHTML = HtmlDiff.execute(original, edited);
100
+ }
101
+
102
+ btnOk.onclick = () => {
103
+ activeRte.innerHTML = dEl.querySelector('.-result').innerHTML;
104
+ dEl.close();
105
+ };
106
+ btnCancel.onclick = () => dEl.close();
107
+
108
+ document.body.append(dEl);
109
+ dEl.showModal();
110
+ dEl.onclose = () => dEl.remove();
111
+
112
+ },
113
+ shortcut:'m'
114
+ });
115
+
116
+
117
+
118
+ const endpoint = 'https://api.groq.com/openai/v1/chat/completions'
119
+ const apiKey = "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";
120
+ //const model = "llama3-8b-8192";
121
+ const model = "llama3-70b-8192";
122
+
123
+ async function request(prompt, text) {
124
+ const body = {
125
+ model,
126
+ stream: false,
127
+ messages: [{
128
+ role: "system",
129
+ content: `You are a text editor (html).
130
+ Return only the full(!) edited text without any explanations!
131
+
132
+ Example 1:\n
133
+ Prompt: You're a stupid bloke.\n
134
+ Text: Friendlier\n
135
+ Answer: We seem to have different perspectives.\n
136
+
137
+ Example 2:\n
138
+ Prompt: Fahre fort\n
139
+ Text: Es war einmal ein\n
140
+ Answer: Es war einmal ein kleines Mädchen.\n
141
+
142
+ Example 3:\n
143
+ Prompt: Ausführlicher\n
144
+ Text: Ein Pinsel ist zum malen\n
145
+ Answer: Ein Pinsel ist ein Werkzeug, das zum Auftragen von Farbe verwendet wird. Er besteht aus einem Griff und Borsten, die die Farbe halten und auf eine Oberfläche übertragen.\n
146
+
147
+ Example 4:\n
148
+ Prompt: Schlüsselwörter fett\n
149
+ Text: Ein Pinsel ist zum malen\n
150
+ Answer: Ein <strong>Pinsel</strong> ist zum <strong>malen</strong>\n
151
+ `,
152
+ },{
153
+ role: "user",
154
+ content: `Prompt: ${prompt}\nText: ${text}`,
155
+ }],
156
+ };
157
+ const result = await fetch(endpoint, {
158
+ method: 'POST',
159
+ headers: {
160
+ 'Content-Type': 'application/json',
161
+ 'Authorization': `Bearer ${apiKey}`
162
+ },
163
+ body: JSON.stringify(body),
164
+ }).then(response => response.json());
165
+
166
+ return result.choices[0].message.content;
167
+ }
@@ -0,0 +1,93 @@
1
+ import {$range} from '../../range.js';
2
+ import * as state from '../../events.js';
3
+
4
+ const dialog = document.createElement('dialog');
5
+ dialog.id = 'qgRteHtml';
6
+ dialog.innerHTML =
7
+ '<u2-code class=-editor editable language=html></u2-code>'+
8
+ //'<textarea class=-editor spellcheck=false class=c1Rst style="width:100%; height:50vh"></textarea>'+
9
+ '<style>'+
10
+ ' #qgRteHtml { max-width:none; width:auto; border:0; inset:auto .5rem .5rem .5rem; background:#fff; color:#000; box-shadow:0 0 20px; padding:0; } '+
11
+ ' #qgRteHtml > .-editor { font-size:11.5px monospace; padding:1vw; margin:0; } '+
12
+ '</style>';
13
+
14
+ const editor = dialog.firstChild;
15
+
16
+ Rte.ui.setItem('Code', {
17
+ icon: 'code',
18
+ click() {
19
+ const el = state.active;
20
+
21
+ document.documentElement.append(dialog);
22
+ dialog.showModal();
23
+
24
+ function hide(e) {
25
+ if (e.key==='Escape' || e.target !== editor) {
26
+ dialog.close();
27
+ dialog.remove();
28
+ document.removeEventListener('keydown',hide);
29
+ document.removeEventListener('mousedown',hide);
30
+ el.focus();
31
+ }
32
+ }
33
+ document.addEventListener('keydown',hide);
34
+ document.addEventListener('mousedown',hide);
35
+
36
+ let indentHtml2 = null;
37
+ Promise.all([
38
+ import('../../util/indentHtml.js'),
39
+ import('../../../../../el/code/code.js'),
40
+ ]).then(([indentHtml]) => {
41
+ indentHtml2 = indentHtml;
42
+ return customElements.whenDefined('u2-code');
43
+ }).then(()=>{
44
+ return new Promise(resolve=>{setTimeout(resolve,20)});
45
+ }).then(()=>{
46
+
47
+ const {code, start, end} = getInnerHTMLAndPositionsByRange(el, state.range, indentHtml2.indent);
48
+
49
+ editor.value = code;
50
+ editor.onkeyup = editor.onblur = function(){
51
+ el.innerHTML = indentHtml2.unindent(editor.value);
52
+ //el.dispatchEvent(new Event('input',{'bubbles':true,'cancelable':true})); // needed?
53
+ }
54
+ editor.focus();
55
+ editor.setSelectionRange(start, end);
56
+
57
+ const lines = code.substring(0, start).split("\n").length - 1;
58
+ const lineHeight = parseInt(window.getComputedStyle(editor).lineHeight);
59
+
60
+ setTimeout(()=>{ // without timeout it works only the first time
61
+ editor.scrollTop = lines * lineHeight;
62
+ });
63
+
64
+ });
65
+
66
+ },
67
+ shortcut:'h'
68
+ });
69
+
70
+
71
+
72
+ function getInnerHTMLAndPositionsByRange(el, range, manipulate) {
73
+ range = $range(range);
74
+ const startId = 'marker_start_so9df8as0f0';
75
+ const endId = 'marker_end_laseg08a0egga';
76
+ const startTextNode = document.createTextNode(startId);
77
+ const endTextNode = document.createTextNode(endId);
78
+
79
+ range.cloneRange().collapse(false).insertNode(endTextNode);
80
+ range.cloneRange().collapse(true).insertNode(startTextNode);
81
+
82
+ let code = manipulate?.(el.innerHTML) || el.innerHTML;
83
+
84
+ startTextNode.remove();
85
+ endTextNode.remove();
86
+
87
+ const start = code.indexOf(startId);
88
+ code = code.replace(startId,'');
89
+ const end = code.indexOf(endId);
90
+ code = code.replace(endId,'');
91
+
92
+ return {code, start, end};
93
+ }
@@ -0,0 +1,183 @@
1
+ const histories = new WeakMap();
2
+ let active = null;
3
+ let ignoreChanges = false;
4
+
5
+ // add to history
6
+ function addToHistory(target) {
7
+ if (ignoreChanges) return;
8
+ histories.has(target) || histories.set(target, {items:[]});
9
+ const history = histories.get(target);
10
+ const html = target.innerHTML;
11
+
12
+ // compare with last
13
+ const last = history.items[history.items.length-1];
14
+ if (last && last.html === html) return;
15
+
16
+ // remove history after current
17
+ if (history.current != null) {
18
+ history.items.splice(history.current+1);
19
+ history.current = null;
20
+ }
21
+
22
+ const selection = saveSelectionWithinElement(target);
23
+ history.items.push({
24
+ html: target.innerHTML,
25
+ selection: selection,
26
+ // time: Date.now() not used
27
+ });
28
+ }
29
+
30
+ // debounce
31
+ const addToHistoryDebounced = debounce(addToHistory, 500, 800);
32
+
33
+ const mutationObserver = new MutationObserver(()=>{
34
+ if (ignoreChanges) return;
35
+ addToHistoryDebounced(active);
36
+ });
37
+
38
+ addEventListener('u2-rte-activate', function(e) {
39
+ active = e.target;
40
+ setTimeout(() => addToHistoryDebounced.force(e.target)) // it has not yet the selection
41
+ mutationObserver.observe(e.target, {subtree:true, attributes:true, characterData:true});
42
+ });
43
+ addEventListener('u2-rte-deactivate', function(e) {
44
+ addToHistoryDebounced.force(e.target);
45
+ mutationObserver.disconnect();
46
+ });
47
+
48
+
49
+ function undo() {
50
+ const history = histories.get(active);
51
+ history.current ??= history.items.length - 1;
52
+ if (history.current <= 0) return;
53
+ history.current--;
54
+ patchItem(active, history.items[history.current]);
55
+ }
56
+ function redo() {
57
+ const history = histories.get(active);
58
+ if (history.current >= history.items.length-1) return;
59
+ history.current++;
60
+ patchItem(active, history.items[history.current]);
61
+ }
62
+ function patchItem(target, item) {
63
+ if (!item) return;
64
+ ignoreChanges = true;
65
+ target.innerHTML = item.html;
66
+ setTimeout(()=>restoreSelectionWithinElement(item.selection, target));
67
+ setTimeout(()=>ignoreChanges = false, 100);
68
+ }
69
+ function hasUndo() {
70
+ const history = histories.get(active);
71
+ if (!history) return;
72
+ const count = history.items.length;
73
+ return count && (history.current??count > 1);
74
+ }
75
+ function hasRedo() {
76
+ const history = histories.get(active);
77
+ if (!history) return;
78
+ return history.current !== undefined && history.current < history.items.length-1;
79
+ }
80
+
81
+
82
+ Rte.ui.setItem('Undo', {
83
+ icon:'undo',
84
+ click:undo,
85
+ check:hasUndo,
86
+ shortcut:'z',
87
+ labels:{
88
+ de: 'Rückgängig',
89
+ en: 'Undo',
90
+ fr: 'Annuler',
91
+ }
92
+ });
93
+ Rte.ui.setItem('Redo', {
94
+ icon:'redo',
95
+ click:redo,
96
+ check:hasRedo,
97
+ shortcut:'y',
98
+ labels:{
99
+ de: 'Wiederholen',
100
+ en: 'Redo',
101
+ fr: 'Refaire',
102
+ }
103
+ });
104
+
105
+
106
+
107
+ function getXPathForElement(element, rootElement) {
108
+ if (element === rootElement) {
109
+ return ".";
110
+ } else if (element.nodeType === 3) { // Textknoten
111
+ const textNodes = Array.from(element.parentNode.childNodes).filter(node => node.nodeType === 3);
112
+ const idx = textNodes.indexOf(element);
113
+ return `${getXPathForElement(element.parentNode, rootElement)}/text()[${idx + 1}]`;
114
+ } else { // Elementknoten
115
+ const siblings = Array.from(element.parentNode.children);
116
+ const idx = siblings.indexOf(element);
117
+ const tagName = element.tagName.toLowerCase();
118
+ return `${getXPathForElement(element.parentNode, rootElement)}/${tagName}[${idx + 1}]`;
119
+ }
120
+ }
121
+
122
+ function getElementByXPath(xpath, contextElement) {
123
+ const result = document.evaluate(xpath, contextElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
124
+ return result.singleNodeValue;
125
+ }
126
+
127
+ function saveSelectionWithinElement(element) {
128
+ const sel = window.getSelection();
129
+ if (sel.rangeCount > 0) {
130
+ const range = sel.getRangeAt(0);
131
+ return {
132
+ startPath: getXPathForElement(range.startContainer, element),
133
+ startOffset: range.startOffset,
134
+ endPath: getXPathForElement(range.endContainer, element),
135
+ endOffset: range.endOffset
136
+ };
137
+ }
138
+ return null;
139
+ }
140
+
141
+ function restoreSelectionWithinElement(saved, element) {
142
+ const startNode = getElementByXPath(saved.startPath, element);
143
+ const endNode = getElementByXPath(saved.endPath, element);
144
+ if (startNode && endNode) {
145
+ const range = document.createRange();
146
+ range.setStart(startNode, saved.startOffset);
147
+ range.setEnd(endNode, saved.endOffset);
148
+ const sel = window.getSelection();
149
+ sel.removeAllRanges();
150
+ sel.addRange(range);
151
+ }
152
+ }
153
+
154
+
155
+ function debounce(fn, min, max) {
156
+ let timeoutMin = null;
157
+ let timeoutMax = null;
158
+ let lastInvocationTime = null;
159
+ const debouncedFn = function(...args) {
160
+ const invoke = () => {
161
+ fn(...args);
162
+ lastInvocationTime = Date.now();
163
+ clearTimeout(timeoutMax);
164
+ timeoutMax = null;
165
+ };
166
+ const now = Date.now();
167
+ if (lastInvocationTime && (now - lastInvocationTime < max)) {
168
+ clearTimeout(timeoutMin);
169
+ timeoutMin = setTimeout(invoke, min);
170
+ } else {
171
+ if (!timeoutMax) {
172
+ timeoutMax = setTimeout(invoke, max);
173
+ }
174
+ }
175
+ };
176
+ debouncedFn.force = function(...args) {
177
+ clearTimeout(timeoutMin);
178
+ clearTimeout(timeoutMax);
179
+ fn(...args);
180
+ lastInvocationTime = Date.now();
181
+ };
182
+ return debouncedFn;
183
+ }