u2ui 1.0.0 → 1.4.5

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 (591) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +36 -36
  3. package/attr/behavior/README.md +6 -4
  4. package/attr/behavior/behavior.js +265 -261
  5. package/attr/behavior/manifest.json +42 -42
  6. package/attr/confirm/README.md +8 -8
  7. package/attr/confirm/confirm.js +86 -90
  8. package/attr/confirm/manifest.json +42 -42
  9. package/attr/disableif/README.md +37 -0
  10. package/attr/disableif/disableif.js +59 -0
  11. package/attr/disableif/manifest.json +38 -0
  12. package/attr/draghandle/README.md +15 -15
  13. package/attr/draghandle/draghandle.js +24 -42
  14. package/attr/draghandle/manifest.json +30 -0
  15. package/attr/dropzone/README.md +32 -0
  16. package/attr/dropzone/dropzone.js +485 -0
  17. package/attr/dropzone/manifest.json +36 -0
  18. package/attr/focusgroup/README.md +9 -9
  19. package/attr/focusgroup/focusgroup.js +97 -100
  20. package/attr/focusgroup/manifest.json +30 -38
  21. package/attr/href/README.md +5 -5
  22. package/attr/href/href.js +50 -42
  23. package/attr/href/manifest.json +42 -42
  24. package/attr/intersect/README.md +15 -15
  25. package/attr/intersect/intersect.js +98 -98
  26. package/attr/intersect/manifest.json +44 -57
  27. package/attr/lightbox/README.md +27 -0
  28. package/attr/lightbox/lightbox.js +120 -0
  29. package/attr/lightbox/manifest.json +29 -0
  30. package/attr/movable/README.md +27 -0
  31. package/attr/movable/manifest.json +47 -0
  32. package/attr/movable/movable.js +111 -0
  33. package/attr/navigable/README.md +9 -9
  34. package/attr/navigable/TargetObserver.js +90 -91
  35. package/attr/navigable/U2TargetObserver.js +75 -75
  36. package/attr/navigable/manifest.json +34 -42
  37. package/attr/navigable/navigable.js +85 -87
  38. package/attr/parallax/README.md +10 -10
  39. package/attr/parallax/manifest.json +36 -0
  40. package/attr/parallax/parallax.js +119 -119
  41. package/attr/scrollspy/README.md +43 -0
  42. package/attr/scrollspy/manifest.json +28 -0
  43. package/attr/scrollspy/scrollspy.js +85 -0
  44. package/attr/selectable/README.md +42 -0
  45. package/attr/selectable/SelectionManager.js +171 -0
  46. package/attr/selectable/manifest.json +33 -0
  47. package/attr/selectable/selectable.js +28 -0
  48. package/attr/skin/README.md +15 -16
  49. package/attr/skin/manifest.json +40 -0
  50. package/attr/skin/skin.css +49 -50
  51. package/attr/store/README.md +41 -0
  52. package/attr/store/manifest.json +28 -0
  53. package/attr/store/store.js +62 -0
  54. package/class/badge/README.md +2 -2
  55. package/class/badge/badge.css +34 -34
  56. package/class/card/README.md +51 -0
  57. package/class/card/card.css +31 -0
  58. package/class/flex/README.md +16 -16
  59. package/class/flex/flex.css +15 -25
  60. package/class/grid/README.md +18 -18
  61. package/class/grid/grid.css +38 -40
  62. package/class/reset/README.md +6 -6
  63. package/class/reset/reset.css +8 -8
  64. package/class/table/README.md +22 -21
  65. package/class/table/table.css +125 -125
  66. package/class/unstyle/README.md +7 -5
  67. package/class/unstyle/unstyle.css +14 -12
  68. package/class/width/README.md +18 -18
  69. package/class/width/width.css +21 -22
  70. package/css/README.md +11 -0
  71. package/css/base/README.md +8 -2
  72. package/css/base/base.css +153 -127
  73. package/css/base/beta.css +34 -50
  74. package/css/base/full.css +5 -5
  75. package/css/base/nomotion.css +8 -8
  76. package/css/base/print.css +36 -36
  77. package/css/classless/README.md +10 -4
  78. package/css/classless/aria.css +51 -64
  79. package/css/classless/classless.css +118 -124
  80. package/css/classless/full.css +11 -11
  81. package/css/classless/more.css +314 -340
  82. package/css/classless/simple.css +314 -103
  83. package/css/classless/snippeds/a/icons.css +66 -12
  84. package/css/classless/snippeds/a/tests.html +118 -0
  85. package/css/classless/snippeds/blockquote/big-quotes.css +36 -0
  86. package/css/classless/snippeds/blockquote/tests.html +62 -0
  87. package/css/classless/snippeds/button/square.css +22 -0
  88. package/css/classless/snippeds/button/tests.html +53 -0
  89. package/css/classless/snippeds/experiments/aria-header-nav-dropdown.css +46 -0
  90. package/css/classless/snippeds/hr/gradient.css +2 -2
  91. package/css/classless/snippeds/hr/section_sign.css +16 -16
  92. package/css/classless/snippeds/hr/tests.html +49 -49
  93. package/css/classless/snippeds/p/indent.css +9 -0
  94. package/css/classless/snippeds/p/initial.css +9 -0
  95. package/css/classless/snippeds/p/tests.html +60 -0
  96. package/css/classless/variables.css +132 -99
  97. package/css/norm/README.md +7 -1
  98. package/css/norm/beta.css +41 -39
  99. package/css/norm/norm.css +89 -98
  100. package/css/norm/oldies.css +71 -60
  101. package/css/{classes → utils}/README.md +10 -4
  102. package/css/{classes/classes.css → utils/utils.css} +78 -78
  103. package/el/accordion/README.md +60 -59
  104. package/el/accordion/accordion.css +11 -7
  105. package/el/accordion/accordion.js +211 -258
  106. package/el/accordion/manifest.json +44 -57
  107. package/el/alert/README.md +86 -67
  108. package/el/alert/alert.css +72 -73
  109. package/el/alert/alert.js +206 -187
  110. package/el/alert/manifest.json +59 -77
  111. package/el/breadcrumb/README.md +41 -0
  112. package/el/breadcrumb/breadcrumb.css +22 -0
  113. package/el/breadcrumb/breadcrumb.js +119 -0
  114. package/el/breadcrumb/manifest.json +42 -0
  115. package/el/buttongroup/README.md +36 -36
  116. package/el/buttongroup/buttongroup.css +38 -30
  117. package/el/buttongroup/buttongroup.js +68 -56
  118. package/el/buttongroup/manifest.json +28 -0
  119. package/el/bytes/README.md +4 -4
  120. package/el/bytes/bytes.css +6 -6
  121. package/el/bytes/bytes.js +98 -97
  122. package/el/bytes/manifest.json +90 -95
  123. package/el/calendar/README.md +64 -0
  124. package/el/calendar/calendar.css +36 -0
  125. package/el/calendar/calendar.js +391 -0
  126. package/el/calendar/ext/drag.js +69 -0
  127. package/el/calendar/ext/keyNavigation.js +101 -0
  128. package/el/calendar/manifest.json +69 -0
  129. package/el/carousel/README.md +14 -14
  130. package/el/carousel/carousel.css +45 -46
  131. package/el/carousel/carousel.js +398 -371
  132. package/el/carousel/manifest.json +44 -58
  133. package/el/carousel-nav/README.md +13 -14
  134. package/el/carousel-nav/carousel-nav.js +74 -74
  135. package/el/carousel-nav/manifest.json +31 -0
  136. package/el/chart/README.md +46 -0
  137. package/el/chart/chart.css +7 -0
  138. package/el/chart/chart.js +188 -0
  139. package/el/chart/engines/apexcharts.js +103 -0
  140. package/el/chart/engines/billboard.js +79 -0
  141. package/el/chart/engines/chart.js.js +32 -0
  142. package/el/chart/engines/chartist.js +74 -0
  143. package/el/chart/engines/echarts.js +65 -0
  144. package/el/chart/engines/frappe.js +49 -0
  145. package/el/chart/engines/nvd3.js +139 -0
  146. package/el/chart/engines/plotly.js +73 -0
  147. package/el/chart/manifest.json +54 -0
  148. package/el/code/README.md +21 -21
  149. package/el/code/code.css +46 -46
  150. package/el/code/code.js +291 -289
  151. package/el/code/manifest.json +59 -66
  152. package/el/cookiebanner/README.md +70 -0
  153. package/el/cookiebanner/cookiebanner.css +42 -0
  154. package/el/cookiebanner/cookiebanner.js +161 -0
  155. package/el/cookiebanner/extensions/googleConsentMode.js +36 -0
  156. package/el/cookiebanner/knownItems.js +291 -0
  157. package/el/cookiebanner/manifest.json +85 -0
  158. package/el/cookiebanner/ui.js +426 -0
  159. package/el/copy/README.md +9 -7
  160. package/el/copy/copy.css +3 -3
  161. package/el/copy/copy.js +89 -117
  162. package/el/copy/manifest.json +37 -49
  163. package/el/counter/README.md +12 -9
  164. package/el/counter/counter.css +8 -8
  165. package/el/counter/counter.js +96 -95
  166. package/el/counter/manifest.json +50 -59
  167. package/el/drawer/README.md +35 -0
  168. package/el/drawer/drawer.css +77 -0
  169. package/el/drawer/drawer.js +166 -0
  170. package/el/drawer/manifest.json +27 -0
  171. package/el/fields/README.md +34 -0
  172. package/el/fields/fields.css +5 -0
  173. package/el/fields/fields.js +133 -0
  174. package/el/fields/manifest.json +32 -0
  175. package/el/ico/README.md +119 -118
  176. package/el/ico/debug.js +86 -0
  177. package/el/ico/font/Font Awesome.css +22 -22
  178. package/el/ico/font/LigatureSymbols.css +7 -7
  179. package/el/ico/font/Material Icons.css +6 -6
  180. package/el/ico/font/RemixFilled.css +8 -8
  181. package/el/ico/font/RemixOutlined.css +8 -8
  182. package/el/ico/font/old/anicons.css +31 -31
  183. package/el/ico/font/old/devicons.css +210 -210
  184. package/el/ico/font/old/material.all.css +36 -36
  185. package/el/ico/font/old/remix.css +15 -15
  186. package/el/ico/font/old/utf8.css +54 -54
  187. package/el/ico/ico.css +122 -110
  188. package/el/ico/ico.js +163 -189
  189. package/el/ico/manifest.json +68 -86
  190. package/el/input/README.md +41 -39
  191. package/el/input/input.css +95 -35
  192. package/el/input/input.js +682 -331
  193. package/el/input/manifest.json +54 -0
  194. package/el/maintitlebar/README.md +39 -0
  195. package/el/maintitlebar/maintitlebar.css +40 -0
  196. package/el/maintitlebar/maintitlebar.js +17 -0
  197. package/el/maintitlebar/manifest.json +32 -0
  198. package/el/masonry/README.md +19 -19
  199. package/el/masonry/manifest.json +49 -60
  200. package/el/masonry/masonry.css +27 -27
  201. package/el/masonry/masonry.js +93 -92
  202. package/el/menubutton/README.md +39 -0
  203. package/el/menubutton/manifest.json +44 -0
  204. package/el/{splitbutton/splitbutton.css → menubutton/menubutton.css} +51 -47
  205. package/el/menubutton/menubutton.js +90 -0
  206. package/el/number/README.md +9 -6
  207. package/el/number/manifest.json +162 -121
  208. package/el/number/number.css +6 -6
  209. package/el/number/number.js +67 -67
  210. package/el/out/README.md +5 -5
  211. package/el/out/manifest.json +26 -38
  212. package/el/out/out.css +2 -2
  213. package/el/out/out.js +42 -59
  214. package/el/pagination/README.md +32 -0
  215. package/el/pagination/manifest.json +47 -0
  216. package/el/pagination/pagination.css +27 -0
  217. package/el/pagination/pagination.js +147 -0
  218. package/el/parallax-bg/README.md +26 -6
  219. package/el/parallax-bg/manifest.json +32 -0
  220. package/el/parallax-bg/parallax-bg.css +13 -13
  221. package/el/parallax-bg/parallax-bg.js +197 -186
  222. package/el/qrcode/README.md +7 -7
  223. package/el/qrcode/manifest.json +32 -43
  224. package/el/qrcode/package.json +22 -22
  225. package/el/qrcode/qrcode.css +13 -13
  226. package/el/qrcode/qrcode.js +53 -45
  227. package/el/rating/README.md +9 -20
  228. package/el/rating/manifest.json +52 -65
  229. package/el/rating/rating.css +10 -10
  230. package/el/rating/rating.js +148 -139
  231. package/el/responsive/README.md +43 -0
  232. package/el/responsive/manifest.json +41 -0
  233. package/el/responsive/responsive.css +4 -0
  234. package/el/responsive/responsive.js +143 -0
  235. package/el/rte/README.md +10 -10
  236. package/el/rte/manifest.json +33 -0
  237. package/el/rte/rte.css +9 -9
  238. package/el/rte/rte.js +56 -56
  239. package/el/skeleton/README.md +3 -3
  240. package/el/skeleton/manifest.json +37 -51
  241. package/el/skeleton/skeleton.css +67 -60
  242. package/el/skeleton/skeleton.js +71 -72
  243. package/el/splitpanel/README.md +33 -13
  244. package/el/splitpanel/manifest.json +36 -49
  245. package/el/splitpanel/splitpanel.css +20 -17
  246. package/el/splitpanel/splitpanel.js +117 -116
  247. package/el/spot/README.md +36 -0
  248. package/el/spot/manifest.json +55 -0
  249. package/el/spot/spot.css +23 -0
  250. package/el/spot/spot.js +106 -0
  251. package/el/system/README.md +29 -0
  252. package/el/system/demoHtml.html +660 -0
  253. package/el/system/manifest.json +32 -0
  254. package/el/system/styler.js +661 -0
  255. package/el/system/system.js +84 -0
  256. package/el/table/README.md +80 -68
  257. package/el/table/ext/autoFormatTable.js +228 -0
  258. package/el/table/manifest.json +32 -43
  259. package/el/table/table.css +4 -59
  260. package/el/table/table.js +468 -194
  261. package/el/tabs/README.md +17 -17
  262. package/el/tabs/manifest.json +44 -59
  263. package/el/tabs/tabs.css +22 -22
  264. package/el/tabs/tabs.js +192 -210
  265. package/el/textfit/README.md +7 -7
  266. package/el/textfit/manifest.json +33 -45
  267. package/el/textfit/textfit.css +5 -5
  268. package/el/textfit/textfit.js +80 -80
  269. package/el/time/README.md +6 -5
  270. package/el/time/manifest.json +79 -118
  271. package/el/time/time.js +179 -168
  272. package/el/toc/README.md +27 -0
  273. package/el/toc/manifest.json +36 -0
  274. package/el/toc/toc.css +3 -0
  275. package/el/toc/toc.js +85 -0
  276. package/el/tooltip/README.md +13 -10
  277. package/el/tooltip/manifest.json +56 -69
  278. package/el/tooltip/tooltip.css +100 -97
  279. package/el/tooltip/tooltip.js +146 -82
  280. package/el/tree/README.md +133 -0
  281. package/el/tree/ext/dnd.js +53 -0
  282. package/el/tree/ext/item.js +35 -0
  283. package/el/tree/manifest.json +61 -0
  284. package/el/tree/tree.css +18 -0
  285. package/el/tree/tree.js +236 -0
  286. package/el/typewriter/README.md +11 -11
  287. package/el/typewriter/manifest.json +45 -66
  288. package/el/typewriter/typewriter.css +6 -6
  289. package/el/typewriter/typewriter.js +161 -166
  290. package/el/video/README.md +37 -0
  291. package/el/video/manifest.json +96 -0
  292. package/el/video/video.js +550 -0
  293. package/js/Placer/Placer.js +156 -156
  294. package/js/Placer/README.md +14 -16
  295. package/js/PointerObserver/PointerObserver-no-scroll.js +146 -0
  296. package/js/PointerObserver/PointerObserver.js +161 -130
  297. package/js/PointerObserver/README.md +6 -7
  298. package/js/SelectorObserver/README.md +9 -9
  299. package/js/SelectorObserver/SelectorObserver.js +199 -200
  300. package/js/Tour/README.md +56 -0
  301. package/js/Tour/Tour.js +156 -0
  302. package/js/contextmenu/README.md +6 -31
  303. package/js/contextmenu/contextmenu.js +338 -336
  304. package/js/dialog/README.md +8 -7
  305. package/js/dialog/dialog.js +228 -261
  306. package/js/drag/README.md +28 -0
  307. package/js/drag/drag.js +38 -0
  308. package/js/drag/indicateDrop.js +80 -0
  309. package/js/loading/README.md +24 -0
  310. package/js/loading/loading.js +139 -0
  311. package/js/navigator/README.md +26 -0
  312. package/js/navigator/navigator.js +430 -0
  313. package/js/navigator/url-change-event.js +29 -0
  314. package/js/rte/README.md +13 -14
  315. package/js/rte/old/NodeCleaner.js +315 -315
  316. package/js/rte/old/Rte/Rte.ui.mjs +154 -154
  317. package/js/rte/old/Rte/index.mjs +5 -5
  318. package/js/rte/old/Rte/main.css +189 -189
  319. package/js/rte/old/old.rte.js +131 -131
  320. package/js/rte/old/range-selection.old.js +394 -394
  321. package/js/rte/rte.js +7 -7
  322. package/js/rte/src/behavior.js +228 -228
  323. package/js/rte/src/events.js +73 -73
  324. package/js/rte/src/fixes.js +250 -250
  325. package/js/rte/src/range.js +469 -472
  326. package/js/rte/src/rte.js +71 -71
  327. package/js/rte/src/ui/items/ai.js +166 -167
  328. package/js/rte/src/ui/items/code.js +93 -93
  329. package/js/rte/src/ui/items/undo.js +183 -183
  330. package/js/rte/src/ui.items.js +6 -7
  331. package/js/rte/src/ui.js +268 -268
  332. package/js/rte/src/util/indentHtml.js +21 -15
  333. package/js/serviceWorker/README.md +17 -0
  334. package/js/serviceWorker/serviceWorker.js +84 -0
  335. package/js/serviceWorker/sw.js +221 -0
  336. package/js/shortcut/README.md +6 -6
  337. package/js/shortcut/shortcut.js +53 -89
  338. package/package.json +9 -8
  339. package/theme/brutalist/README.md +10 -0
  340. package/theme/brutalist/theme.css +98 -0
  341. package/theme/elegance/README.md +10 -0
  342. package/theme/elegance/theme.css +120 -0
  343. package/theme/luxury/README.md +10 -0
  344. package/theme/luxury/theme.css +107 -0
  345. package/theme/minimalism/README.md +10 -0
  346. package/theme/minimalism/theme.css +103 -0
  347. package/theme/natur/README.md +10 -0
  348. package/theme/natur/theme.css +101 -0
  349. package/theme/pastell/README.md +10 -0
  350. package/theme/pastell/theme.css +99 -0
  351. package/theme/pop/README.md +10 -0
  352. package/theme/pop/theme.css +101 -0
  353. package/theme/prompt.css +175 -0
  354. package/theme/retro/README.md +10 -0
  355. package/theme/retro/theme.css +99 -0
  356. package/theme/soft/README.md +10 -0
  357. package/theme/soft/theme.css +84 -0
  358. package/theme/tech/README.md +10 -0
  359. package/theme/tech/theme.css +98 -0
  360. package/theme/test/README.md +10 -0
  361. package/theme/test/theme.css +109 -0
  362. package/theme/test.html +284 -0
  363. package/theme/tmp/README.md +10 -0
  364. package/theme/tmp/theme.css +323 -0
  365. package/u2/auto.js +156 -161
  366. package/u2/auto.ui.js +82 -85
  367. package/u2/plan-scoped-refactoring.md +236 -0
  368. package/u2/projects.json +757 -467
  369. package/u2/tools/baseElement.js +217 -95
  370. package/u2/tools/baseElement.test.html +139 -119
  371. package/u2/tools/ce-inspector.js +307 -307
  372. package/u2/tools/ce-inspector.test.html +67 -65
  373. package/u2/tools/ce-manfest-from-element.js +207 -207
  374. package/u2/tools/dev-iframe.js +212 -213
  375. package/u2/tools/dev-iframe.test.html +72 -74
  376. package/u2/tools/eventsExplorer.js +102 -101
  377. package/u2/tools/logo/u1.svg +9 -9
  378. package/u2/tools/promiseElementById.js +14 -0
  379. package/u2/tools/update.repos.json.js +259 -234
  380. package/u2/tools/update.skill.js +176 -0
  381. package/u2/tools/variable-styler.js +317 -0
  382. package/u2/u2.js +30 -14
  383. package/u2/utils.js +61 -59
  384. package/.htaccess +0 -7
  385. package/attr/behavior/tests/minimal.html +0 -19
  386. package/attr/behavior/tests/test.html +0 -98
  387. package/attr/confirm/tests/minimal.html +0 -23
  388. package/attr/confirm/tests/test.html +0 -79
  389. package/attr/draghandle/tests/minimal.html +0 -44
  390. package/attr/focusgroup/tests/minimal.html +0 -27
  391. package/attr/focusgroup/tests/test.html +0 -154
  392. package/attr/href/tests/minimal.html +0 -17
  393. package/attr/href/tests/test.html +0 -70
  394. package/attr/intersect/tests/minimal.html +0 -30
  395. package/attr/intersect/tests/test.html +0 -64
  396. package/attr/navigable/tests/U1TargetObserver.html +0 -56
  397. package/attr/navigable/tests/minimal.html +0 -17
  398. package/attr/navigable/tests/targetObserver.html +0 -106
  399. package/attr/navigable/tests/test.html +0 -84
  400. package/attr/parallax/tests/minimal.html +0 -25
  401. package/attr/parallax/tests/performance.html +0 -102
  402. package/attr/parallax/tests/test.html +0 -108
  403. package/attr/skin/tests/minimal.html +0 -34
  404. package/attr/skin/tests/test.html +0 -96
  405. package/class/badge/tests/minimal.html +0 -17
  406. package/class/badge/tests/test.html +0 -112
  407. package/class/card1/README.md +0 -45
  408. package/class/card1/card1.css +0 -30
  409. package/class/card1/tests/minimal.html +0 -33
  410. package/class/card1/tests/test.html +0 -78
  411. package/class/flex/tests/minimal.html +0 -31
  412. package/class/flex/tests/test.html +0 -58
  413. package/class/grid/tests/minimal.html +0 -34
  414. package/class/grid/tests/test.html +0 -78
  415. package/class/input/README.md +0 -49
  416. package/class/input/input.css +0 -33
  417. package/class/input/tests/minimal.html +0 -39
  418. package/class/input/tests/test.html +0 -29
  419. package/class/reset/tests/minimal.html +0 -23
  420. package/class/table/tests/minimal.html +0 -40
  421. package/class/table/tests/test.html +0 -226
  422. package/class/unstyle/tests/minimal.html +0 -22
  423. package/class/unstyle/tests/test.html +0 -32
  424. package/class/width/tests/minimal.html +0 -27
  425. package/class/width/tests/test.html +0 -101
  426. package/css/base/tests/nomotion.html +0 -89
  427. package/css/base/tests/test.html +0 -539
  428. package/css/classes/tests/test.html +0 -63
  429. package/css/classless/snippeds/experiments/conventions.css +0 -41
  430. package/css/classless/tests/aria.html +0 -101
  431. package/css/classless/tests/foreign/classless-almond.css.html +0 -445
  432. package/css/classless/tests/foreign/classless-classless.css.html +0 -831
  433. package/css/classless/tests/foreign/classless-mvp.html +0 -415
  434. package/css/classless/tests/foreign/classless.sakura.html +0 -224
  435. package/css/classless/tests/foreign/stylestage.dev.html +0 -304
  436. package/css/classless/tests/foreign/test-homogenizer.html +0 -433
  437. package/css/classless/tests/foreign/test-html5-elements-tester.html +0 -956
  438. package/css/classless/tests/foreign/test-opinionated_css.html +0 -148
  439. package/css/classless/tests/list-bullet.html +0 -110
  440. package/css/classless/tests/more.html +0 -246
  441. package/css/classless/tests/oklch.experiments.html +0 -280
  442. package/css/classless/tests/test.html +0 -106
  443. package/css/classless/tests/variables.html +0 -109
  444. package/css/norm/tests/test.html +0 -434
  445. package/css/norm/tests/test.js +0 -103
  446. package/el/accordion/tests/minimal.html +0 -44
  447. package/el/accordion/tests/test.html +0 -168
  448. package/el/alert/alert copy.js +0 -224
  449. package/el/alert/tests/minimal.html +0 -36
  450. package/el/alert/tests/test.html +0 -105
  451. package/el/buttongroup/tests/minimal.html +0 -31
  452. package/el/buttongroup/tests/test.html +0 -83
  453. package/el/bytes/tests/minimal.html +0 -19
  454. package/el/bytes/tests/test.html +0 -117
  455. package/el/carousel/tests/experiments.html +0 -77
  456. package/el/carousel/tests/minimal.html +0 -31
  457. package/el/carousel/tests/nested.html +0 -54
  458. package/el/carousel/tests/test.html +0 -136
  459. package/el/carousel-nav/tests/minimal.html +0 -32
  460. package/el/carousel-nav/tests/test.html +0 -59
  461. package/el/code/tests/minimal.html +0 -35
  462. package/el/code/tests/test.html +0 -162
  463. package/el/copy/tests/minimal.html +0 -21
  464. package/el/copy/tests/test.html +0 -75
  465. package/el/counter/tests/minimal.html +0 -27
  466. package/el/counter/tests/test.html +0 -106
  467. package/el/ico/tests/combinations.html +0 -86
  468. package/el/ico/tests/emojis.html +0 -213
  469. package/el/ico/tests/fonts.html +0 -110
  470. package/el/ico/tests/ico-directory.html +0 -254
  471. package/el/ico/tests/minimal.html +0 -46
  472. package/el/ico/tests/test.html +0 -210
  473. package/el/ico/tests/util-multi.svg +0 -6
  474. package/el/ico/tests/util.css +0 -2
  475. package/el/ico/tests/util.js +0 -110
  476. package/el/input/tests/formParticipation.html +0 -113
  477. package/el/input/tests/minimal.html +0 -33
  478. package/el/input/tests/test.html +0 -258
  479. package/el/masonry/tests/minimal.html +0 -39
  480. package/el/masonry/tests/test.html +0 -42
  481. package/el/number/tests/minimal.html +0 -25
  482. package/el/number/tests/test.html +0 -138
  483. package/el/out/tests/minimal.html +0 -25
  484. package/el/out/tests/test.html +0 -37
  485. package/el/parallax-bg/tests/bg.jpg +0 -0
  486. package/el/parallax-bg/tests/bg1.jpg +0 -0
  487. package/el/parallax-bg/tests/bg2.jpg +0 -0
  488. package/el/parallax-bg/tests/demo.html +0 -88
  489. package/el/parallax-bg/tests/minimal.html +0 -30
  490. package/el/parallax-bg/tests/test.html +0 -64
  491. package/el/parallax-bg/tests/visible.html +0 -90
  492. package/el/qrcode/tests/minimal.html +0 -26
  493. package/el/qrcode/tests/test.html +0 -31
  494. package/el/rating/tests/minimal.html +0 -26
  495. package/el/rating/tests/tests.html +0 -77
  496. package/el/rte/tests/minimal.html +0 -25
  497. package/el/rte/tests/test.html +0 -37
  498. package/el/skeleton/tests/minimal.html +0 -22
  499. package/el/skeleton/tests/test.html +0 -22
  500. package/el/splitbutton/README.md +0 -39
  501. package/el/splitbutton/splitbutton.js +0 -26
  502. package/el/splitbutton/tests/minimal.html +0 -30
  503. package/el/splitbutton/tests/test.html +0 -68
  504. package/el/splitpanel/tests/minimal.html +0 -31
  505. package/el/splitpanel/tests/tests.html +0 -121
  506. package/el/table/tests/minimal.html +0 -38
  507. package/el/table/tests/test.html +0 -108
  508. package/el/tabs/tests/minimal.html +0 -35
  509. package/el/tabs/tests/test.html +0 -180
  510. package/el/textfit/tests/minimal.html +0 -25
  511. package/el/textfit/tests/test.html +0 -26
  512. package/el/time/tests/minimal.html +0 -19
  513. package/el/time/tests/test.html +0 -160
  514. package/el/time/time copy.js +0 -141
  515. package/el/time/time.old.uhtml.js +0 -129
  516. package/el/tooltip/tests/minimal.html +0 -25
  517. package/el/tooltip/tests/test.html +0 -178
  518. package/el/tree1/README.md +0 -111
  519. package/el/tree1/manifest.json +0 -78
  520. package/el/tree1/tests/animated.html +0 -134
  521. package/el/tree1/tests/custom.html +0 -51
  522. package/el/tree1/tests/minimal.html +0 -44
  523. package/el/tree1/tests/test.html +0 -260
  524. package/el/tree1/tree1.css +0 -26
  525. package/el/tree1/tree1.js +0 -265
  526. package/el/typewriter/tests/minimal.html +0 -25
  527. package/el/typewriter/tests/test.html +0 -78
  528. package/js/Placer/tests/minimal.html +0 -34
  529. package/js/Placer/tests/test.html +0 -49
  530. package/js/PointerObserver/tests/minimal.html +0 -29
  531. package/js/PointerObserver/tests/test.html +0 -35
  532. package/js/SelectorObserver/tests/minimal.html +0 -21
  533. package/js/SelectorObserver/tests/test.html +0 -57
  534. package/js/SelectorObserver/tests/tests.html +0 -161
  535. package/js/contextmenu/tests/minimal.html +0 -44
  536. package/js/contextmenu/tests/test.html +0 -131
  537. package/js/dialog/tests/minimal.html +0 -29
  538. package/js/dialog/tests/notification.mp3 +0 -0
  539. package/js/dialog/tests/test.html +0 -135
  540. package/js/rte/tests/ai.html +0 -81
  541. package/js/rte/tests/behavior.html +0 -88
  542. package/js/rte/tests/events.html +0 -69
  543. package/js/rte/tests/fixes.html +0 -95
  544. package/js/rte/tests/minimal.html +0 -34
  545. package/js/rte/tests/notes.md +0 -6
  546. package/js/rte/tests/range.html +0 -167
  547. package/js/rte/tests/selection-explorer.html +0 -222
  548. package/js/rte/tests/test.html +0 -92
  549. package/js/shortcut/tests/minimal.html +0 -23
  550. package/js/shortcut/tests/test.html +0 -68
  551. package/u2/experiments/Waiter/test.html +0 -132
  552. package/u2/experiments/getElementByIdPromise/test.html +0 -76
  553. package/u2/experiments/patchInputValue.html +0 -124
  554. package/u2/experiments/radiobutton/test.html +0 -75
  555. package/u2/experiments/tests/test.html +0 -223
  556. package/u2/experiments/u1-responsive/responsive.js +0 -62
  557. package/u2/experiments/u1-responsive/test.html +0 -65
  558. package/u2/experiments/u2Element.js +0 -139
  559. package/u2/experiments/u2Element.test.html +0 -47
  560. package/u2/old-stuff/IterableWeakMap/mod.js +0 -70
  561. package/u2/old-stuff/css/onStyleSheet/mod.js +0 -114
  562. package/u2/old-stuff/css/onStyleSheet/monkeypatches.js +0 -28
  563. package/u2/old-stuff/css/onStyleSheet/test/include.css +0 -19
  564. package/u2/old-stuff/css/onStyleSheet/test/style-has-include.css +0 -6
  565. package/u2/old-stuff/css/onStyleSheet/test/style-no-include.css +0 -3
  566. package/u2/old-stuff/css/onStyleSheet/test/test.html +0 -48
  567. package/u2/old-stuff/css/parser/mod.js +0 -182
  568. package/u2/old-stuff/css/parser/parser_old/mod.js +0 -128
  569. package/u2/old-stuff/css/parser/parser_old/test.html +0 -43
  570. package/u2/old-stuff/css/parser/parser_old/util.js +0 -22
  571. package/u2/old-stuff/css/parser/style.html +0 -52
  572. package/u2/old-stuff/css/parser/test.html +0 -38
  573. package/u2/old-stuff/el/ai-texter/README.md +0 -23
  574. package/u2/old-stuff/el/ai-texter/ai-texter.css +0 -12
  575. package/u2/old-stuff/el/ai-texter/ai-texter.js +0 -153
  576. package/u2/old-stuff/el/ai-texter/tests/minimal.html +0 -47
  577. package/u2/old-stuff/el/ai-texter/tests/test.html +0 -71
  578. package/u2/old-stuff/init.js +0 -38
  579. package/u2/old-stuff/markHashLinks.js +0 -51
  580. package/u2/old-stuff/onElement/mod.js +0 -73
  581. package/u2/old-stuff/test-helpers/mod.js +0 -36
  582. package/u2/old-stuff/test-helpers/test.html +0 -4
  583. package/u2/old-stuff/tests/init.js.html +0 -51
  584. package/u2/old-stuff/viewport.js +0 -64
  585. package/u2/tests/boilerplate.html +0 -46
  586. package/u2/tests/kacheln.html +0 -245
  587. package/u2/tests/showcase.html +0 -270
  588. package/u2/tests/showcase2.html +0 -157
  589. package/u2/tests/test-init.js +0 -35
  590. package/u2/tests/test.html +0 -355
  591. package/u2/tools/logo/u1ui.svg +0 -6
@@ -0,0 +1,133 @@
1
+ # <u2-tree> - element
2
+ Treeview component `<u2-tree>Folder <u2-tree>File</u2-tree> </u2-tree>`
3
+
4
+ ## Features
5
+
6
+ - Keyboard navigation
7
+ - Focus on the next item that starts with the pressed key
8
+ - Expand/collapse events
9
+ - Lazy loading of children
10
+ - Drag and drop (opt-in, loaded on demand via the `draggable` attribute)
11
+
12
+ ## Usage
13
+
14
+ ```html
15
+ <u2-tree aria-expanded=true>root
16
+ <u2-tree>Folder 1
17
+ <u2-tree>File 1.1</u2-tree>
18
+ </u2-tree>
19
+ <u2-tree aria-expanded="true">Folder 3
20
+ <u2-tree>File 3.1</u2-tree>
21
+ <u2-tree>File 3.2</u2-tree>
22
+ </u2-tree>
23
+ </u2-tree>
24
+ ```
25
+
26
+ ```css
27
+ u2-tree::part(row):hover {
28
+ background:#00000004;
29
+ }
30
+ u2-tree[aria-selected=true]::part(row) {
31
+ background:#00000008;
32
+ }
33
+ u2-tree::part(row):focus {
34
+ outline:1px dotted;
35
+ }
36
+ ```
37
+
38
+ ## API
39
+
40
+ ### Javascript
41
+
42
+ ```js
43
+ el.select(); // selects the element
44
+ el.toggleExpand(true/false/undefined); // undefined toggles
45
+ el.path(); // returns path to element
46
+ el.root(); // returns root element of the tree-item
47
+ el.next(); // next sibling treeitem (skips slotted icon/label)
48
+ el.prev(); // previous sibling treeitem
49
+ ```
50
+
51
+ ### Keyboard
52
+
53
+ Expand/collapse is on the arrow keys (WAI-ARIA tree pattern): `ArrowRight` expands,
54
+ `ArrowLeft` collapses. `Enter` and `Space` just select the focused node.
55
+
56
+ ### Attributes
57
+
58
+ #### aria-expanded
59
+ This will initialy expand the tree:
60
+ ```<u2-tree aria-expanded="true">...</u2-tree>```
61
+
62
+ This is either not expandable or like aria-expanded="false" if it has children.
63
+ `<u2-tree></u2-tree>
64
+
65
+ #### aria-live
66
+ `<u2-tree aria-live></u2-tree>`
67
+ This indicates, that the node has to be loaded.
68
+ The `u2-tree-collapse` event will get a property `event.load(asyncFn)` to load their children.
69
+
70
+ ### Events
71
+
72
+ #### expand / collapse
73
+ ```js
74
+ treeElement.addEventListener('u2-tree-expand', (e) => {
75
+ e.load && e.load(promise);
76
+ });
77
+ treeElement.addEventListener('u2-tree-collapse', (e) => {...});
78
+ ```
79
+
80
+ #### select
81
+ ```js
82
+ treeElement.addEventListener('u2-tree-select', (e) => { ... });
83
+ ```
84
+
85
+ #### drag and drop
86
+ Set `draggable` on the nodes you want movable — this loads the DnD extension on demand.
87
+ Two cancelable events fire with `detail = { source, parent, next, region }` (`region`: `before` | `after` | `into`):
88
+ ```js
89
+ // decide where dropping is allowed; preventDefault() forbids it (hides the marker)
90
+ treeElement.addEventListener('u2-tree-dragover', (e) => {
91
+ if (notAllowed(e.detail)) e.preventDefault();
92
+ });
93
+ // commit on release; preventDefault() to move it yourself (e.g. server-first)
94
+ treeElement.addEventListener('u2-tree-drop', (e) => {
95
+ e.preventDefault();
96
+ save(e.detail).then(() => e.detail.parent.insertBefore(e.detail.source, e.detail.next));
97
+ });
98
+ ```
99
+
100
+ ### CSS
101
+
102
+ | Selector | Description |
103
+ |:----|:-----|
104
+ | u2-tree::part(row) | The row of the tree-item |
105
+ | u2-tree[aria-selected=true] | Item when selected |
106
+ | u2-tree:focus | Item has focus |
107
+
108
+ ## Install
109
+
110
+ ```html
111
+ <link href="https://cdn.jsdelivr.net/gh/u2ui/u2@main/el/tree/tree.css" rel=stylesheet>
112
+ <script src="https://cdn.jsdelivr.net/gh/u2ui/u2@main/el/tree/tree.js" type=module async></script>
113
+ ```
114
+
115
+ ## Demos
116
+
117
+ [dnd-shadow.html](http://gcdn.li/u2ui/u2@main/el/tree/tests/dnd-shadow.html)
118
+ [custom.html](http://gcdn.li/u2ui/u2@main/el/tree/tests/custom.html)
119
+ [test.html](http://gcdn.li/u2ui/u2@main/el/tree/tests/test.html)
120
+ [animated.html](http://gcdn.li/u2ui/u2@main/el/tree/tests/animated.html)
121
+ [minimal.html](http://gcdn.li/u2ui/u2@main/el/tree/tests/minimal.html)
122
+ [dnd.html](http://gcdn.li/u2ui/u2@main/el/tree/tests/dnd.html)
123
+
124
+ ## Todo
125
+
126
+ Ask me if you need it!
127
+ - Add support for multiple selection
128
+
129
+ ## About
130
+
131
+ - MIT License, Copyright (c) 2022 <u2> (like all repositories in this organization) <br>
132
+ - Suggestions, ideas, finding bugs and making pull requests make us very happy. ♥
133
+
@@ -0,0 +1,53 @@
1
+ // u2-tree DnD — minimal. Drag state from js/drag/drag.js, marker from js/drag/indicateDrop.js.
2
+ // Draggable via the `draggable` HTML attribute. Region (before/after/into) from the pointer Y.
3
+ // Two events, detail {source, parent, next, region}:
4
+ // u2-tree-dragover decides WHETHER a drop is allowed here. preventDefault() = forbid (hides marker, no drop).
5
+ // u2-tree-drop commit on release. preventDefault() = app moves it itself (e.g. server-first) instead of auto-move.
6
+ import { dragged } from '../../../js/drag/drag.js';
7
+ import { indicateDrop } from '../../../js/drag/indicateDrop.js';
8
+
9
+ let over = null, region = '', allowed = true, expandTimer;
10
+ const clear = () => (clearTimeout(expandTimer), indicateDrop(null), over = null, region = '');
11
+
12
+ const place = (target, reg) => reg === 'into'
13
+ ? { parent: target, next: null }
14
+ : { parent: target.parentNode, next: reg === 'before' ? target : target.nextElementSibling };
15
+
16
+ const ask = (type, target) => target.dispatchEvent(new CustomEvent(type, {
17
+ bubbles: true, cancelable: true,
18
+ detail: { source: dragged, ...place(target, region), region },
19
+ }));
20
+
21
+ document.addEventListener('dragover', e => {
22
+ if (!dragged) return;
23
+ // composedPath() durchquert Shadow-Grenzen; e.target wäre auf den Shadow-Host retargetiert.
24
+ const target = e.composedPath().find(n => n.localName === dragged.localName);
25
+ if (!target || dragged.contains(target)) return clear();
26
+ const row = target.shadowRoot.querySelector('[part=row]');
27
+ const r = row.getBoundingClientRect();
28
+ const rel = (e.clientY - r.top) / r.height;
29
+ const reg = rel < .25 ? 'before' : rel > .75 ? 'after' : 'into';
30
+
31
+ if (target !== over || reg !== region) {
32
+ over = target; region = reg;
33
+ allowed = ask('u2-tree-dragover', target);
34
+ clearTimeout(expandTimer);
35
+ if (reg === 'into')
36
+ expandTimer = setTimeout(() => target.isExpanded() || target.toggleExpand(true), allowed ? 650 : 1300);
37
+ }
38
+ if (!allowed) return indicateDrop(null);
39
+ e.preventDefault();
40
+ e.dataTransfer.dropEffect = 'move';
41
+ indicateDrop(region, row, { box: 'content' });
42
+ });
43
+
44
+ document.addEventListener('drop', () => {
45
+ if (over && allowed && ask('u2-tree-drop', over)) {
46
+ const { parent, next } = place(over, region);
47
+ parent.insertBefore(dragged, next);
48
+ region === 'into' && parent.toggleExpand?.(true);
49
+ }
50
+ clear();
51
+ });
52
+
53
+ document.addEventListener('dragend', clear);
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Item.js integration for u2-tree
3
+ * This module is loaded on-demand when tree.itemjs is set
4
+ */
5
+ export async function applyItemjs(treeElement, item, { render = null } = {}) {
6
+ if (!item) return;
7
+ treeElement.textContent = item.key || '';
8
+ syncTreeItem(treeElement, item, render);
9
+ item.addEventListener('changeIn', ({add, remove}) => {
10
+ if (add || remove) syncTreeItem(treeElement, item, render);
11
+ });
12
+ }
13
+
14
+ function createTreeItem(item, render) {
15
+ const treeItem = document.createElement('u2-tree');
16
+ treeItem.dataset.key = item.key || '';
17
+ treeItem.textContent = item.key || '';
18
+ render?.(treeItem, item);
19
+ return treeItem;
20
+ }
21
+
22
+ function syncTreeItem(treeElement, item, render) {
23
+ const subItems = item.items() ?? [];
24
+ const subItemKeys = new Set(subItems.map(i => i.key));
25
+
26
+ // remove stale children
27
+ [...treeElement.querySelectorAll(':scope > u2-tree')]
28
+ .forEach(child => !subItemKeys.has(child.dataset.key) && child.remove());
29
+
30
+ // add new & sync all
31
+ subItems.forEach(subItem => {
32
+ const child = treeElement.querySelector(`:scope > u2-tree[data-key="${subItem.key}"]`) ?? treeElement.appendChild(createTreeItem(subItem, render));
33
+ syncTreeItem(child, subItem, render);
34
+ });
35
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "readme": "README.md",
4
+ "modules": [{
5
+ "kind": "javascript-module",
6
+ "path": "tree.js",
7
+ "declarations": [{
8
+ "kind": "class",
9
+ "description": "",
10
+ "name": "U2Tree",
11
+ "members": [],
12
+ "events": [{
13
+ "name": "u2-tree-expand",
14
+ "type": { "text": "Event" }
15
+ },{
16
+ "name": "u2-tree-collapse",
17
+ "type": { "text": "Event" }
18
+ },{
19
+ "name": "u2-tree-select",
20
+ "type": { "text": "Event" }
21
+ },{
22
+ "name": "u2-tree-dragover",
23
+ "type": { "text": "Event" }
24
+ },{
25
+ "name": "u2-tree-drop",
26
+ "type": { "text": "Event" }
27
+ }],
28
+ "attributes": [],
29
+ "cssProperties": [{
30
+ "name": "--indent",
31
+ "syntax": "<length>",
32
+ "description": "The indentation of the tree items"
33
+ }],
34
+ "cssParts": [{
35
+ "name": "row",
36
+ "description": "The Item of the tree"
37
+ },{
38
+ "name": "content",
39
+ "description": "The content of the tree mainly the text. Its display:contents by default!"
40
+ },{
41
+ "name": "children",
42
+ "description": "The children of the tree. Its display:contents by default!"
43
+ }],
44
+ "slots": [{
45
+ "name": "icon",
46
+ "description": "The icon of the tree item"
47
+ }],
48
+ "superclass": { "name": "HTMLElement" },
49
+ "tagName": "u2-tree",
50
+ "customElement": true
51
+ }],
52
+ "exports": [{
53
+ "kind": "custom-element-definition",
54
+ "name": "u2-tree",
55
+ "declaration": {
56
+ "name": "U2Tree",
57
+ "module": "tree.js"
58
+ }
59
+ }]
60
+ }]
61
+ }
@@ -0,0 +1,18 @@
1
+ u2-tree { display:block; }
2
+ u2-tree::part(row) {
3
+ white-space: nowrap;
4
+ cursor:pointer;
5
+ }
6
+ u2-tree::part(row):focus { outline:1px dotted black; }
7
+ u2-tree[aria-selected=true]::part(row) { background:#00000008; }
8
+ u2-tree[draggable]::part(row) { cursor:grab; }
9
+ u2-tree.\:dragging { opacity:.3; } /* class set by js/drag/drag.js on the drag source */
10
+
11
+ u2-tree:not(:defined) {
12
+ padding-block-start:.2em;
13
+ display:list-item;
14
+ list-style-position: inside;
15
+ > u2-tree {
16
+ padding-inline-start:1.2em;
17
+ }
18
+ }
@@ -0,0 +1,236 @@
1
+ let css = `
2
+ :host { display:block; }
3
+ :host([role=tree]) { --indent:1rem; }
4
+ :host(:not([aria-expanded=true])) [part=children] { display:none; }
5
+ :host([aria-expanded=true]) .arrow::after { content:'▾' }
6
+ :host(:not([aria-expanded])) .arrow { opacity:0; }
7
+ :host([aria-expanded=true][aria-busy=true]) .arrow::after {
8
+ content:'◠'; /* ◝↻⭮⍉🔾◠◡◕◖◝ */
9
+ font-weight:bold;
10
+ animation: spinner .5s linear infinite;
11
+ line-height:1;
12
+ font-size:.8em;
13
+ }
14
+ [part=row] {
15
+ display: flex;
16
+ align-items: center;
17
+ padding-inline-start: calc( var(--indent) * (var(--level) - 1) );
18
+ min-height: 1.8em;
19
+ gap: .3em;
20
+ }
21
+ .arrow {
22
+ font-weight:normal !important;
23
+ min-width:1.1em;
24
+ text-align:center;
25
+ }
26
+ .arrow::after { content:'▸'; display:inline-block; }
27
+ @keyframes spinner { to { transform:rotate(360deg) } }
28
+ [name=icon] {
29
+ display:flex;
30
+ align-items: center;
31
+ justify-content:center;
32
+ min-inline-size:1.7em;
33
+ font-weight:400;
34
+ align-self:stretch;
35
+ }
36
+ `;
37
+ const styleSheet = new CSSStyleSheet();
38
+ styleSheet.replaceSync(css);
39
+
40
+
41
+ export default class U2Tree extends HTMLElement {
42
+
43
+ static observedAttributes = ['draggable'];
44
+ attributeChangedCallback() { U2Tree.dnd ??= import('./ext/dnd.js'); } // load DnD lazily once draggable appears
45
+
46
+ constructor() {
47
+ super();
48
+ const shadow = this.attachShadow({mode: 'open', delegatesFocus: true});
49
+ shadow.adoptedStyleSheets = [styleSheet];
50
+ shadow.innerHTML = `
51
+ <div part=row tabindex=-1>
52
+ <span class=arrow></span>
53
+ <slot name=icon part=icon>📁</slot>
54
+ <slot part=content></slot>
55
+ </div>
56
+ <slot part=children name=children role=group></slot>`
57
+
58
+ this.row = shadow.querySelector('[part=row]');
59
+
60
+ this.addEventListener('click',e=>{
61
+ if (e.target !== this) return;
62
+ if (!getSelection()?.isCollapsed) return;
63
+ this.toggleExpand();
64
+ this.activeElement = this;
65
+ this._select();
66
+ });
67
+ this.addEventListener('keydown',e=>{
68
+ if (e.target !== this) return;
69
+ let fn = {
70
+ ArrowUp: ()=> this.prevFocusable()?.setFocus?.(),
71
+ ArrowDown: ()=> this.nextFocusable()?.setFocus(),
72
+ ArrowRight: ()=> !this.isExpanded() ? this.toggleExpand(true) : this.nextFocusable()?.setFocus(),
73
+ ArrowLeft: ()=> this.isExpanded() ? this.toggleExpand(false) : this.parentNode.setFocus?.(),
74
+ Enter: ()=> this._select(), // expand/collapse is on Arrow keys (WAI-ARIA); Enter just selects
75
+ ' ': ()=> this._select(),
76
+ Home: ()=> this.root().setFocus(),
77
+ }[e.key];
78
+ // focus next where text starts with the key pressed
79
+ const isChar = /^.$/u.test(e.key);
80
+ if (isChar) {
81
+ let current = this.nextFocusable() || this.root();
82
+ while (current && current !== this) {
83
+ let text = current.shadowRoot.querySelector('[part=content]').assignedNodes().map(item=>item.textContent).join(' ').trim().toLowerCase();
84
+ if (text.startsWith(e.key)) {
85
+ current.setFocus();
86
+ break;
87
+ }
88
+ current = current.nextFocusable() || this.root();
89
+ }
90
+ }
91
+ if (fn) { fn(); e.preventDefault(); }
92
+ });
93
+
94
+ this.addEventListener('mousedown', e => e.detail >= 2 && e.preventDefault() ); // prevent dbl-click selection
95
+
96
+ this.childrenObserver = new MutationObserver(mutations => this._markup())
97
+
98
+ }
99
+ connectedCallback() {
100
+ this.childrenObserver.observe(this, {childList: true});
101
+ this._markup();
102
+ }
103
+ disconnectedCallback() {
104
+ this.childrenObserver.disconnect();
105
+ }
106
+ _markup(){
107
+ // own level
108
+ const root = this.root();
109
+ const myLevel = root === this ? 1 : parseInt(this.parentNode.getAttribute('aria-level')) + 1;
110
+ this.ariaLevel = myLevel; // todo: internals?
111
+ this.style.setProperty('--level', myLevel);
112
+
113
+ // slot subnodes
114
+ for (const child of this.children) {
115
+ child.tagName === this.tagName && child.setAttribute('slot', 'children');
116
+ }
117
+ this.role = root === this ? 'tree' : 'treeitem';
118
+
119
+ // make it selectable if its the root and no other is selected
120
+ if (root === this && !root._activeElement) this.row.tabIndex = 0;
121
+
122
+ // if (this.getAttribute('icon')) {
123
+ // this.shadowRoot.querySelector('[part=icon]').innerHTML = '<u2-ico inline icon="' + this.getAttribute('icon') + '"></u2-ico>';
124
+ // }
125
+
126
+ // expandability follows children; lazy nodes (aria-live) keep the arrow despite 0 children
127
+ if (!this.ariaLive) {
128
+ this.items().length
129
+ ? this.hasAttribute('aria-expanded') || this.setAttribute('aria-expanded', 'false')
130
+ : this.removeAttribute('aria-expanded');
131
+ }
132
+ }
133
+ items(){
134
+ return this.shadowRoot.querySelector('[part=children]').assignedElements();
135
+ }
136
+ next(){ // next sibling treeitem (skips slotted icon/label)
137
+ let n = this.nextElementSibling;
138
+ while (n && n.tagName !== this.tagName) n = n.nextElementSibling;
139
+ return n;
140
+ }
141
+ prev(){ // previous sibling treeitem (skips slotted icon/label)
142
+ let n = this.previousElementSibling;
143
+ while (n && n.tagName !== this.tagName) n = n.previousElementSibling;
144
+ return n;
145
+ }
146
+ nextFocusable(){ // next visible row: first child, else next item, else nearest ancestor's next item
147
+ if (this.isExpanded() && this.items().length) return this.items()[0];
148
+ let item = this;
149
+ while (item?.tagName === this.tagName) {
150
+ const next = item.next();
151
+ if (next) return next;
152
+ item = item.parentNode;
153
+ }
154
+ return null;
155
+ }
156
+ prevFocusable(){ // previous visible row: previous item (its last child if expanded), else parent
157
+ let prev = this.prev();
158
+ if (prev?.isExpanded()) prev = prev.items().at(-1);
159
+ return prev || this.parentNode;
160
+ }
161
+ isExpanded() {
162
+ return this.ariaExpanded === 'true';
163
+ }
164
+ isExpandable() {
165
+ const attr = this.ariaExpanded;
166
+ return attr === 'true' || attr === 'false' || this.items().length;
167
+ }
168
+ toggleExpand(doit) {
169
+ if (!this.isExpandable()) return;
170
+ doit ??= !this.isExpanded();
171
+
172
+ const event = new CustomEvent(doit?'u2-tree-expand':'u2-tree-collapse', {bubbles: true});
173
+
174
+ if (this.ariaLive && this.ariaBusy !== 'true') {
175
+
176
+ event.load = callback=>{
177
+ const promise = callback(this);
178
+ this.ariaBusy = true;
179
+ promise.then(data => {
180
+ this.ariaLive = null;
181
+ this.ariaBusy = null;
182
+ setTimeout(()=>{ // make unexpandable if no children
183
+ !this.items().length && this.removeAttribute('aria-expanded');
184
+ },100);
185
+ }).catch(data=>{
186
+ this.ariaBusy = null; // allow retry
187
+ console.warn('todo: u2-tree: failed to load', data);
188
+ });
189
+ }
190
+
191
+ }
192
+ this.dispatchEvent(event);
193
+ this.ariaExpanded = doit?'true':'false';
194
+ }
195
+
196
+ select(){
197
+ let old = this.root()._selected;
198
+ if (old) old.ariaSelected = false;
199
+ this.ariaSelected = true;
200
+ this.root()._selected = this;
201
+ }
202
+ _select(){ // like selected but also fires event
203
+ const event = new CustomEvent('u2-tree-select', {bubbles: true});
204
+ this.dispatchEvent(event);
205
+ this.select();
206
+ }
207
+
208
+ get activeElement(){
209
+ return this.root()._activeElement;
210
+ }
211
+ set activeElement(el){
212
+ const old = this.root()._activeElement;
213
+ if (old) old.row.tabIndex = -1;
214
+ el.row.tabIndex = 0;
215
+ el.row.focus();
216
+ this.root()._activeElement = el;
217
+ }
218
+ setFocus() {
219
+ this.activeElement = this;
220
+ }
221
+ root(){
222
+ return this.isRoot() ? this : this.parentNode.root();
223
+ }
224
+ isRoot(){
225
+ return this.parentNode?.tagName !== this.tagName;
226
+ }
227
+ path(){
228
+ return this.isRoot() ? [this] : this.parentNode.path().concat(this);
229
+ }
230
+
231
+ bindItem(item,options={}) {
232
+ import('./ext/item.js').then(({applyItemjs}) => applyItemjs(this, item, options));
233
+ }
234
+ }
235
+
236
+ customElements.define('u2-tree', U2Tree);
@@ -4,17 +4,17 @@ Simple typewriter element
4
4
  ## Usage
5
5
 
6
6
  ```html
7
- <h2>
8
- <u2-typewriter autoplay loop>Typewriter</h2></u2-typewriter>
9
- </h2>
7
+ <h4>
8
+ <u2-typewriter autoplay loop>Typewriter</u2-typewriter>
9
+ </h4>
10
10
  ```
11
11
 
12
12
  ```css
13
- u2-typewriter {
14
- --u2-typewriter-speed:100;
15
- }
16
- u2-typewriter h2 .-Caret {
17
- color:hotpink;
13
+ u2-typewriter {
14
+ --u2-typewriter-speed:100;
15
+ }
16
+ u2-typewriter h2 .-Caret {
17
+ color:hotpink;
18
18
  }
19
19
  ```
20
20
 
@@ -46,14 +46,14 @@ u2-typewriter .-Caret { ... } /* the caret (It moves and is in the active char e
46
46
  ## Install
47
47
 
48
48
  ```html
49
- <link href="https://cdn.jsdelivr.net/gh/u2ui/u2@x.x.x/el/typewriter/typewriter.min.css" rel=stylesheet>
50
- <script src="https://cdn.jsdelivr.net/gh/u2ui/u2@x.x.x/el/typewriter/typewriter.min.js" type=module async></script>
49
+ <link href="https://cdn.jsdelivr.net/gh/u2ui/u2@main/el/typewriter/typewriter.css" rel=stylesheet>
50
+ <script src="https://cdn.jsdelivr.net/gh/u2ui/u2@main/el/typewriter/typewriter.js" type=module async></script>
51
51
  ```
52
52
 
53
53
  ## Demos
54
54
 
55
- [minimal.html](http://gcdn.li/u2ui/u2@main/el/typewriter/tests/minimal.html)
56
55
  [test.html](http://gcdn.li/u2ui/u2@main/el/typewriter/tests/test.html)
56
+ [minimal.html](http://gcdn.li/u2ui/u2@main/el/typewriter/tests/minimal.html)
57
57
 
58
58
  ## About
59
59