u2ui 1.0.1 → 1.4.6

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 +87 -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 +15 -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 +87 -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 +2 -4
  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 +151 -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
package/el/table/table.js CHANGED
@@ -1,194 +1,468 @@
1
-
2
- class Table extends HTMLElement {
3
- constructor() {
4
- super();
5
- this.attachShadow({mode: 'open'});
6
- this.shadowRoot.innerHTML = `
7
- <style>
8
- :host {
9
- display: block;
10
- overflow: auto;
11
- }
12
- </style>
13
- <slot></slot>
14
- `;
15
- this.table = this.querySelector(':scope>table');
16
- }
17
- connectedCallback() {
18
- this.resizeObs = new ResizeObserver(entries => this._checkResize());
19
- this.resizeObs.observe(this);
20
-
21
- // mutations
22
- this.mutObs = new MutationObserver(mutations => this._checkMutations());
23
- this.mutObs.observe(this, {childList: true, subtree: true});
24
- this._checkMutations();
25
- }
26
-
27
- static observedAttributes = ['sortable'];
28
- attributeChangedCallback(name, oldValue, newValue) {
29
- if (name === 'sortable') makeSortable(this.table, newValue !== null);
30
- }
31
-
32
- _checkResize() {
33
-
34
- this.resizeLimite = this.resizeLimite == null ? 1 : this.resizeLimite+1;
35
- if (this.resizeLimite>20) {
36
- console.warn('debug: u2-table element resized to often');
37
- setTimeout(()=>{
38
- this.resizeLimite = 0;
39
- }, 400);
40
- return;
41
- }
42
-
43
- const overflows = this.scrollWidth > this.clientWidth;
44
- if (overflows) this._breakpoint = this.scrollWidth; // overflows && this._breakpoint === null ???
45
-
46
- if (this._breakpoint != null && this._breakpoint > this.clientWidth) {
47
- this.setAttribute(':overflows', ''); // :overflows=strategy (break, hide-optional, vertical)
48
- } else {
49
- this.removeAttribute(':overflows');
50
- }
51
- }
52
- _checkMutations() {
53
- const tr = this.table.querySelector(':scope > thead > tr');
54
- if (tr) {
55
- for (const th of tr.children) {
56
- const title = th.innerText;
57
- const index = this.columns.indexOf(th);
58
-
59
- // set aria-labels
60
- for (const td of this.columns.item(index).cells) {
61
- td.setAttribute('aria-label', title);
62
- }
63
- }
64
- }
65
- this._breakpoint !== null && this._checkResize();
66
- }
67
-
68
- get columns() {
69
- return getTableColumns(this.table);
70
- }
71
-
72
- }
73
-
74
-
75
-
76
- /* sortable */
77
- function makeSortable(table, enable=true) {
78
- table[enable?'addEventListener':'removeEventListener']('click', sortableClick);
79
- }
80
- function sortableClick(e){
81
- const table = this;
82
- const th = e.target.closest('thead > tr > *');
83
- if (!th) return;
84
-
85
- const attr = table.parentNode.getAttribute('sortable');
86
- if (attr !== '' && !e.target.matches(attr)) return;
87
-
88
- const columns = getTableColumns(table);
89
- const index = columns.indexOf(th);
90
- const tbody = table.querySelector('tbody');
91
-
92
- const ascending = th.getAttribute('aria-sort') !== 'ascending';
93
- for (const el of th.parentNode.children) el.removeAttribute('aria-sort');
94
- th.setAttribute('aria-sort', ascending ? 'ascending' : 'descending');
95
-
96
- const tds = columns.item(index).cellsByGroup(tbody);
97
- tds
98
- .map( td => { return { td, val: td.getAttribute('data-sortby') ?? td.innerText.trim() }; } )
99
- .sort((a, b) => {
100
- if (!ascending) [a, b] = [b, a];
101
- const [v1, v2] = [a.val, b.val];
102
- return v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2);
103
- })
104
- .forEach(item => tbody.appendChild(item.td.parentNode) );
105
- }
106
-
107
-
108
-
109
-
110
-
111
- /**
112
- * The factory for the Columns class.
113
- */
114
- const TableColMap = new WeakMap();
115
- const getTableColumns = (table) => {
116
- if (!TableColMap.has(table)) {
117
- TableColMap.set(table, new Columns(table));
118
- }
119
- return TableColMap.get(table);
120
- }
121
-
122
- /**
123
- * The Columns class represents a collection of the columns in a table.
124
- * A Column is a collection of all its cells taking into account shifts caused by colspan.
125
- *
126
- * Example usage:
127
- * const columns = new Columns(tableElement);
128
- * columns.item(3).cells().forEach(...)
129
- */
130
-
131
- class Columns {
132
- constructor(table) {
133
- this.table = table;
134
- this._columns = {};
135
- }
136
- get length() {
137
- const last = this.table.querySelector(':scope > * > tr > :last-child');
138
- return this.indexOf(last)+1; // todo: endIndexOf
139
- }
140
- indexOf(cell) {
141
- let currentIndex = -1;
142
- for (const td of cell.parentNode.children) {
143
- ++currentIndex;
144
- if (td === cell) return currentIndex;
145
- if (td.colSpan > 1) currentIndex += td.colSpan -1;
146
- }
147
- }
148
- item(i) {
149
- if (!this._columns[i]) {
150
- this._columns[i] = new Column(this.table, i);
151
- }
152
- return this._columns[i];
153
- }
154
- [Symbol.iterator]() {
155
- const length = this.length;
156
- let i = 0;
157
- return {
158
- next: () => ({
159
- value: this.item(i++),
160
- done: i > length,
161
- })
162
- }
163
- }
164
- }
165
-
166
- class Column {
167
- constructor(table, index) {
168
- this.table = table;
169
- this.index = index;
170
- }
171
- get cells(){
172
- const cells = [];
173
- for (const group of this.table.children) {
174
- this.cellsByGroup(group).forEach(cell => cells.push(cell));
175
- }
176
- return cells;
177
- }
178
- cellsByGroup(group){
179
- const cells = [];
180
- for (const row of group.children) {
181
- let currentIndex = -1;
182
- for (const cell of row.children) {
183
- currentIndex += (cell.colSpan||1);
184
- if (currentIndex >= this.index) {
185
- cells.push(cell);
186
- break; // next row
187
- }
188
- }
189
- }
190
- return cells;
191
- }
192
- }
193
-
194
- customElements.define('u2-table', Table);
1
+
2
+ export default class U2Table extends HTMLElement {
3
+ constructor() {
4
+ super();
5
+ this.attachShadow({ mode: 'open' });
6
+ this.shadowRoot.innerHTML = `
7
+ <style>
8
+ :host {
9
+ display: block;
10
+ }
11
+ </style>
12
+ <slot></slot>
13
+ `;
14
+ }
15
+ connectedCallback() {
16
+ this.mutObs = new MutationObserver(mutations => {
17
+ // console.log('check?', !this._isUpdating)
18
+ if (this._isUpdating) return; // IGNORIEREN WÄHREND UPDATE
19
+ if (!this._watchCells && !mutations.some(m => isSkeleton(m.target))) return;
20
+ this.columns.refresh();
21
+ this.#checkTable();
22
+ });
23
+ this.mutObs.observe(this, { childList: true, subtree: true, /* attributes: true, characterData: true*/});
24
+ this.#checkTable();
25
+ }
26
+ disconnectedCallback() {
27
+ this.mutObs.disconnect();
28
+ }
29
+
30
+ #checkTable() {
31
+ this.table = this.querySelector(':scope > table');
32
+ if (!this.table) return;
33
+
34
+ this._isUpdating = true; // FLAG SETZEN
35
+
36
+
37
+ this.addEventListener('click', tableCheckboxMultiSelectListener);
38
+
39
+ const firstHeadTr = this.querySelector(':scope > table > thead > tr');
40
+ if (firstHeadTr) {
41
+ firstHeadTr.addEventListener('click', tableSortListener);
42
+ const heads = [...firstHeadTr.children];
43
+ const titles = heads.map(th => th.innerText.trim()); // all reads first, a write in between costs the next read a reflow
44
+ heads.forEach((th, i) => {
45
+ for (const td of this.columns.item(this.columns.indexOf(th)).cells) td.dataset.title = titles[i];
46
+ });
47
+ }
48
+ for (const col of this.columns) {
49
+ const colEl = col.colElement;
50
+ if (!colEl) break; // why break? if there is no col-element for the first column, there will be no col-element at all?
51
+ for (const td of col.cells) {
52
+ td.classList.add(...colEl.classList); // test!!
53
+ }
54
+ }
55
+ if (this.hasAttribute('check-column') && !this.checkboxColumnInitialized) {
56
+ this.checkboxColumnInitialized = true;
57
+ for (const group of this.table.children) {
58
+ if (group.tagName === 'COLGROUP') {
59
+ const col = document.createElement('col')
60
+ col.style.width = '1em';
61
+ group.prepend(col);
62
+ continue;
63
+ }
64
+ for (const tr of group.children) {
65
+ if (group.tagName === 'TBODY') {
66
+ const td = document.createElement('td');
67
+ tr.prepend(td);
68
+ td.innerHTML = '<input class=row-checkbox type="checkbox">';
69
+ }
70
+ if (group.tagName === 'THEAD') {
71
+ const th = document.createElement('th');
72
+ tr.prepend(th);
73
+ th.innerHTML = '<input class=summary-checkbox type="checkbox">';
74
+ }
75
+ if (group.tagName === 'TFOOT') {
76
+ const td = document.createElement('td');
77
+ tr.prepend(td);
78
+ }
79
+ }
80
+ }
81
+ const summaryCheck = this.querySelector(':scope .summary-checkbox');
82
+ const headCheckAdjust = () => {
83
+ const checks = this.querySelectorAll(':scope > table > tbody > tr > td > input[type="checkbox"]');
84
+ const checked = this.querySelectorAll(':scope > table > tbody > tr > td > input[type="checkbox"]:checked');
85
+ const allChecked = checked.length === checks.length;
86
+ const noneChecked = checked.length === 0;
87
+ const someChecked = !allChecked && !noneChecked;
88
+ summaryCheck.checked = allChecked;
89
+ summaryCheck.indeterminate = someChecked;
90
+ };
91
+ headCheckAdjust();
92
+ this.addEventListener('input', e=>{
93
+ if (e.target.classList.contains('row-checkbox')) {
94
+ headCheckAdjust();
95
+ }
96
+ if (e.target === summaryCheck) {
97
+ this.querySelectorAll(':scope > table > tbody > tr > td > input.row-checkbox').forEach(el => el.checked = e.target.checked);
98
+ }
99
+ });
100
+ }
101
+ if (this.hasAttribute('drag-column') && !this.dragColumnInitialized) {
102
+ this.dragColumnInitialized = true;
103
+ import('../../attr/dropzone/dropzone.js');
104
+ for (const group of this.table.children) {
105
+ if (group.tagName === 'COLGROUP') {
106
+ const col = document.createElement('col')
107
+ col.style.width = '1em';
108
+ group.prepend(col);
109
+ continue;
110
+ }
111
+ if (group.tagName === 'TBODY' && !group.hasAttribute('u2-dropzone')) {
112
+ group.setAttribute('u2-dropzone', '')
113
+ };
114
+ for (const tr of group.children) {
115
+ const td = document.createElement('td');
116
+ tr.prepend(td);
117
+ if (group.tagName === 'TBODY') {
118
+ tr.setAttribute('draggable', 'false');
119
+ td.innerHTML = '<u2-ico inline>⠿</u2-ico>';
120
+ td.setAttribute('u2-draghandle', '');
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ if (this.hasAttribute('autoformat')) {
127
+ import('./ext/autoFormatTable.js').then(({ autoFormatTable }) => {
128
+ this._isUpdating = true;
129
+ autoFormatTable(this.table)
130
+ queueMicrotask(() => this._isUpdating = false)
131
+ });
132
+ }
133
+
134
+ const tdValue = td => {
135
+ let string = (td.dataset.value ?? td.textContent).trim();
136
+ if (string === '') {
137
+ if (td.querySelector('input')) {
138
+ string = td.querySelector('input').value;
139
+ } else {
140
+ return null;
141
+ }
142
+ }
143
+ return parseFloat(string);
144
+ }
145
+
146
+ const firstFootTr = this.querySelector(':scope > table > tfoot > tr');
147
+ // the foot aggregates read cell values, so such a table has to watch the cells as well
148
+ this._watchCells = !!firstFootTr?.querySelector('[data-sum], [data-avg], [data-count]');
149
+ if (firstFootTr) {
150
+ for (const td of firstFootTr.children) {
151
+ if (td.hasAttribute('data-sum')) {
152
+ const index = this.columns.indexOf(td);
153
+ td.textContent = this.columns.item(index).cellsByGroup(this.table.tBodies[0]).reduce((a, b) => a + tdValue(b), 0);
154
+ }
155
+ if (td.hasAttribute('data-avg')) {
156
+ const index = this.columns.indexOf(td);
157
+ td.textContent = this.columns.item(index).cellsByGroup(this.table.tBodies[0]).reduce((a, b) => a + tdValue(b), 0) / this.columns.item(index).cellsByGroup(this.table.tBodies[0]).length;
158
+ }
159
+ if (td.hasAttribute('data-count')) {
160
+ const index = this.columns.indexOf(td);
161
+ td.textContent = this.columns.item(index).cellsByGroup(this.table.tBodies[0]).filter(td => tdValue(td) !== null).length;
162
+ }
163
+ }
164
+ }
165
+
166
+ queueMicrotask(() => this._isUpdating = false);
167
+ }
168
+
169
+ get columns() {
170
+ return this.table && getTableColumns(this.table);
171
+ }
172
+
173
+ }
174
+
175
+ /* Content inside a cell cannot move a column, so only changes to the table skeleton are worth a rebuild. */
176
+ const isSkeleton = node => ['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR'].includes(node.nodeName);
177
+
178
+ /* Sort-listener that would also work for other tables, even globally. */
179
+ function tableSortListener(e) {
180
+ const btn = e.target.closest('[data-sort-handler]');
181
+ if (!btn) return;
182
+ const th = btn.closest('th');
183
+ if (!th) return;
184
+ const tr = th.parentNode;
185
+ const thead = tr.parentNode;
186
+ const table = thead.parentNode;
187
+
188
+ const columns = getTableColumns(table);
189
+ const index = columns.indexOf(th);
190
+ const tbody = table.querySelector('tbody');
191
+
192
+ const ascending = th.ariaSort !== 'ascending';
193
+ for (const el of th.parentNode.children) el.ariaSort = null;
194
+ th.ariaSort = ascending ? 'ascending' : 'descending';
195
+
196
+ const tds = columns.item(index).cellsByGroup(tbody);
197
+ tds
198
+ .map(td => { return { td, val: td.getAttribute('data-value') ?? td.textContent.trim() }; })
199
+ .sort((a, b) => {
200
+ if (!ascending) [a, b] = [b, a];
201
+ const [v1, v2] = [a.val, b.val];
202
+ return v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2);
203
+ })
204
+ .forEach(item => tbody.appendChild(item.td.parentNode));
205
+
206
+ }
207
+
208
+
209
+
210
+
211
+
212
+ /**
213
+ * Multi-Select Listener (click) für Tabellen mit Checkboxen (Shift/Ctrl/Meta-Unterstützung).
214
+ * @param {MouseEvent} e
215
+ */
216
+ function tableCheckboxMultiSelectListener(e) {
217
+ const checkbox = e.target.closest('input[type="checkbox"]');
218
+ if (!checkbox) return;
219
+
220
+ const tr = checkbox.closest('tr');
221
+ const table = checkbox.closest('table');
222
+ if (!tr || !table || table.getAttribute('aria-multiselectable') !== 'true') return;
223
+
224
+ // 1. Einfache Klick-Logik (Reset oder Setzen)
225
+ if (!e.shiftKey || !table._lastSelectedCheckbox) {
226
+ table._lastSelectedCheckbox = checkbox;
227
+ return;
228
+ }
229
+
230
+ // --- Shift-Klick: Bereichsauswahl ---
231
+
232
+ const columns = getTableColumns(table);
233
+
234
+ const lastTr = table._lastSelectedCheckbox.closest('tr');
235
+ const targetState = table._lastSelectedCheckbox.checked; // Status übernehmen
236
+ const scope = table.dataset.selectScope || 'any';
237
+
238
+ // 2. Bereich bestimmen (Zeilen)
239
+ // tr.rowIndex ist native DOM API und sehr schnell
240
+ const startRowIndex = Math.min(lastTr.rowIndex, tr.rowIndex);
241
+ const endRowIndex = Math.max(lastTr.rowIndex, tr.rowIndex);
242
+
243
+ // 3. Bereich bestimmen (Spalten)
244
+ let minColIndex = 0;
245
+ let maxColIndex = Infinity;
246
+
247
+ if (scope !== 'row') {
248
+ const lastCell = table._lastSelectedCheckbox.closest('td, th');
249
+ const currentCell = checkbox.closest('td, th');
250
+
251
+ // Hier nutzen wir unser neues, schnelles indexOf()
252
+ const lastColIdx = columns.indexOf(lastCell);
253
+ const currentColIdx = columns.indexOf(currentCell);
254
+
255
+ if (scope === 'column') {
256
+ // Nur die Spalte der aktuell angeklickten Checkbox
257
+ minColIndex = maxColIndex = currentColIdx;
258
+ } else { // scope === 'any' (Rechteck)
259
+ minColIndex = Math.min(lastColIdx, currentColIdx);
260
+ maxColIndex = Math.max(lastColIdx, currentColIdx);
261
+ }
262
+ }
263
+
264
+ // 4. Iteration und Selektion
265
+ // Wir iterieren direkt über die rows Collection (enthält alle tr)
266
+ for (let r = startRowIndex; r <= endRowIndex; r++) {
267
+ const row = table.rows[r];
268
+
269
+ // Optimierung: Wenn Scope 'row' ist, brauchen wir keine Spaltenprüfung
270
+ if (scope === 'row') {
271
+ const inputs = row.querySelectorAll('input[type="checkbox"]');
272
+ for (const input of inputs) input.checked = targetState;
273
+ continue;
274
+ }
275
+
276
+ // Für 'column' oder 'any': Zellen prüfen
277
+ for (const cell of row.cells) {
278
+ // Ist die Zelle im relevanten Spaltenbereich?
279
+ const cellColIdx = columns.indexOf(cell);
280
+
281
+ if (cellColIdx >= minColIndex && cellColIdx <= maxColIndex) {
282
+ const input = cell.querySelector('input[type="checkbox"]');
283
+ if (input) input.checked = targetState;
284
+ }
285
+ }
286
+ }
287
+ }
288
+
289
+
290
+
291
+
292
+ /**
293
+ * The factory for the Columns class.
294
+ */
295
+ const TableColMap = new WeakMap();
296
+ export const getTableColumns = (table) => {
297
+ if (!TableColMap.has(table)) {
298
+ TableColMap.set(table, new Columns(table));
299
+ }
300
+ return TableColMap.get(table);
301
+ }
302
+
303
+ /**
304
+ * The Columns class represents a collection of the columns in a table.
305
+ * A Column is a collection of all its cells taking into account shifts caused by colspan AND rowspan.
306
+ *
307
+ * Example usage:
308
+ * const columns = getTableColumns(tableElement);
309
+ * columns.item(3).cells().forEach(...)
310
+ */
311
+
312
+ class Columns {
313
+ constructor(table) {
314
+ this.table = table;
315
+ this._columns = {};
316
+ this._matrix = null;
317
+ this._cellIndexMap = null;
318
+ }
319
+
320
+ refresh() {
321
+ this._matrix = null;
322
+ this._cellIndexMap = null;
323
+ this._columns = {};
324
+ this._colMap = null;
325
+ }
326
+
327
+ _ensureMatrix() {
328
+ if (this._matrix && this._cellIndexMap) return;
329
+
330
+ this._matrix = [];
331
+ this._cellIndexMap = new Map();
332
+
333
+ // Wir nutzen table.rows, da dies alle tr (thead, tbody, tfoot) in korrekter Reihenfolge enthält
334
+ const rows = this.table.rows;
335
+
336
+ for (let r = 0; r < rows.length; r++) {
337
+ const row = rows[r];
338
+ this._matrix[r] ??= [];
339
+
340
+ let colIdx = 0;
341
+
342
+ for (const cell of row.children) {
343
+ // 1. Überspringe Plätze, die durch ein rowspan von oben belegt sind
344
+ while (this._matrix[r][colIdx]) colIdx++;
345
+
346
+ // 2. Speichere den Index für diese Zelle
347
+ this._cellIndexMap.set(cell, colIdx);
348
+
349
+ // 3. Markiere das Grid basierend auf colspan und rowspan
350
+ const spanX = cell.colSpan;
351
+ const spanY = cell.rowSpan;
352
+
353
+ for (let x = 0; x < spanX; x++) {
354
+ for (let y = 0; y < spanY; y++) {
355
+ const targetRow = r + y;
356
+ this._matrix[targetRow] ??= [];
357
+
358
+ // Wir markieren den Slot als "belegt"
359
+ // (Man könnte hier auch die Cell-Referenz speichern)
360
+ this._matrix[targetRow][colIdx + x] = cell;
361
+ }
362
+ }
363
+
364
+ // Index weiterschieben um die Breite der aktuellen Zelle
365
+ colIdx += spanX;
366
+ }
367
+ }
368
+ }
369
+
370
+ get length() {
371
+ this._ensureMatrix();
372
+ return this._matrix.length > 0 ? this._matrix[0].length : 0;
373
+ }
374
+
375
+ indexOf(cell) {
376
+ this._ensureMatrix();
377
+ return this._cellIndexMap.get(cell) ?? -1;
378
+ }
379
+
380
+ item(i) {
381
+ this._columns[i] ??= new Column(this, i);
382
+ return this._columns[i];
383
+ }
384
+
385
+ cellAt(rowIndex, colIndex) {
386
+ this._ensureMatrix();
387
+ return this._matrix[rowIndex]?.[colIndex] ?? null;
388
+ }
389
+
390
+ [Symbol.iterator]() {
391
+ const length = this.length;
392
+ let i = 0;
393
+ return {
394
+ next: () => ({
395
+ value: this.item(i++),
396
+ done: i > length,
397
+ })
398
+ }
399
+ }
400
+
401
+ _getColElement(index) {
402
+ this._colMap ??= this.#createColMap();
403
+ return this._colMap[index] || null;
404
+ }
405
+
406
+ #createColMap() {
407
+ const colMap = [];
408
+ const colgroups = this.table.querySelectorAll(':scope > colgroup');
409
+ const standaloneCols = this.table.querySelectorAll(':scope > col');
410
+
411
+ // Helper function to push cols
412
+ const pushCols = (elements) => {
413
+ for (const el of elements) {
414
+ const span = parseInt(el.getAttribute('span')) || 1;
415
+ // Wenn es eine colgroup mit cols ist, iterieren wir deren cols
416
+ const innerCols = el.tagName === 'COLGROUP' ? el.querySelectorAll(':scope > col') : [];
417
+
418
+ if (innerCols.length > 0) {
419
+ pushCols(innerCols);
420
+ } else {
421
+ for (let i = 0; i < span; i++) colMap.push(el);
422
+ }
423
+ }
424
+ }
425
+
426
+ // Standardisiert colgroups und cols verarbeiten
427
+ if (colgroups.length > 0) pushCols(colgroups);
428
+ pushCols(standaloneCols); // Falls cols außerhalb von colgroups existieren (selten, aber valide)
429
+
430
+ return colMap;
431
+ }
432
+ }
433
+
434
+ class Column {
435
+ constructor(columnsInstance, index) {
436
+ this.columns = columnsInstance; // Referenz auf die Hauptklasse
437
+ this.table = columnsInstance.table;
438
+ this.index = index;
439
+ }
440
+
441
+ get cells() {
442
+ const cells = [];
443
+ // Wir iterieren über alle Gruppen (thead, tbody, tfoot)
444
+ for (const group of this.table.children) {
445
+ if (group.tagName === 'COLGROUP' || group.tagName === 'CAPTION') continue;
446
+ this.cellsByGroup(group).forEach(cell => cells.push(cell));
447
+ }
448
+ return cells;
449
+ }
450
+
451
+ get colElement() {
452
+ return this.columns._getColElement(this.index);
453
+ }
454
+
455
+ cellsByGroup(group) {
456
+ const cells = [];
457
+ // Iteriere über die Zeilen dieser Gruppe
458
+ for (const row of group.children) {
459
+ if (row.tagName !== 'TR') continue;
460
+ const cell = this.columns.cellAt(row.rowIndex, this.index);
461
+ // Die Matrix füllt auch die Slots, die ein colspan/rowspan von woanders her belegt
462
+ if (cell?.parentNode === row && this.columns.indexOf(cell) === this.index) cells.push(cell);
463
+ }
464
+ return cells;
465
+ }
466
+ }
467
+
468
+ customElements.define('u2-table', U2Table);