u2ui 1.0.1 → 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 +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 +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,391 @@
1
+
2
+ export default class U2Calendar extends HTMLElement {
3
+ static observedAttributes = ['view', 'date', 'lang'];
4
+
5
+ constructor() {
6
+ super();
7
+ this.attachShadow({ mode: 'open' });
8
+ this._currentDate = new Date();
9
+ this._locale = null;
10
+ this._weekStart = 0; // 0 = Sunday .. 6 = Saturday
11
+ import('../ico/ico.js');
12
+ const icoCssUrl = import.meta.resolve('../ico/ico.css');
13
+
14
+ this.shadowRoot.innerHTML = `
15
+ <style>
16
+ @import url('${icoCssUrl}');
17
+ :host {
18
+ display: flex;
19
+ flex-direction: column;
20
+ background: #0001;
21
+ position:relative;
22
+ z-index: 0;
23
+ --u2-ico-dir: var(--u2-ico-dir-material);
24
+ }
25
+ .header {
26
+ display: grid;
27
+ margin-bottom:1px;
28
+ grid-template-columns: repeat(7, 1fr);
29
+ text-transform: uppercase;
30
+ position: sticky;
31
+ top: 0;
32
+ z-index: 3;
33
+ }
34
+ .header-day {
35
+ text-align: center;
36
+ background: #fff;
37
+ }
38
+ .grid {
39
+ flex-grow: 1;
40
+ display: grid;
41
+ grid-template-columns: repeat(7, 1fr);
42
+ gap: 1px;
43
+ padding:0 1px 1px 1px;
44
+ }
45
+ .day {
46
+ background: #fff;
47
+ padding: .2em;
48
+ display: flex;
49
+ flex-direction: column;
50
+ min-block-size: 5em;
51
+ &:focus { z-index:1; }
52
+ &[aria-current="date"] { background-color: var(--color-light, #e3f2fd); }
53
+ }
54
+ .navigation {
55
+ display: flex;
56
+ justify-content: space-between;
57
+ gap: .5em;
58
+ padding: 1em;
59
+ & h2 { margin: 0; flex:1; font-weight:normal; }
60
+ & button { padding:0; margin:0; border:0; background:transparent; font:inherit; }
61
+ }
62
+ .other-month { color: #0002; }
63
+ </style>
64
+ <div class=navigation>
65
+ <h2></h2>
66
+ <button onclick="this.getRootNode().host.date = new Date()" style="padding-inline:.5rem">
67
+ Today
68
+ </button>
69
+ <button onclick="this.getRootNode().host.prev()">
70
+ <u2-ico icon="chevron-left">&lt;</u2-ico>
71
+ </button>
72
+ <button onclick="this.getRootNode().host.next()">
73
+ <u2-ico icon="chevron-right">&gt;</u2-ico>
74
+ </button>
75
+ </div>
76
+ <div class=header></div>
77
+ <div class=grid role=grid><slot></slot></div>
78
+ `;
79
+ }
80
+
81
+ _setLocale(localeStr) {
82
+ const loc = new Intl.Locale(localeStr || navigator.language);
83
+ this._locale = loc;
84
+ this._weekStart = loc.getWeekInfo?.().firstDay ?? 1;
85
+ }
86
+
87
+ attributeChangedCallback(name, oldValue, newValue) {
88
+ if (oldValue === newValue) return;
89
+ if (name === 'date') this._currentDate = new Date(newValue);
90
+ if (name === 'lang') this._setLocale(newValue);
91
+ this.render();
92
+ this.updateLayout();
93
+ }
94
+
95
+ connectedCallback() {
96
+ if (!this.hasAttribute('lang')) this._setLocale();
97
+ this.render();
98
+ new MutationObserver(() => this.updateLayout()).observe(this, { childList: true });
99
+ import('./ext/keyNavigation.js');
100
+ }
101
+
102
+ set date(date) {
103
+ const d = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
104
+ this.setAttribute('date', d.toISOString().split('T')[0]);
105
+ }
106
+
107
+ walkByMonth(offset) {
108
+ const d = new Date(this._currentDate);
109
+ //d.setMonth(d.getMonth() + offset, 1);
110
+ d.setUTCMonth(d.getUTCMonth() + offset, 1); // besser?
111
+ this.date = d;
112
+ }
113
+
114
+ next() { this.walkByMonth(1); }
115
+ prev() { this.walkByMonth(-1); }
116
+
117
+ render() {
118
+ if (this._renderQueued) return;
119
+ this._renderQueued = true;
120
+ requestAnimationFrame(() => {
121
+ this._render();
122
+ this._renderQueued = false;
123
+ });
124
+ }
125
+
126
+ _render() {
127
+ const today = new Date();
128
+ const year = this._currentDate.getFullYear();
129
+ const month = this._currentDate.getMonth();
130
+ const dateString = Intl.DateTimeFormat(this._locale?.baseName || navigator.language, { year: 'numeric', month: 'long' }).format(this._currentDate);
131
+
132
+ this.shadowRoot.querySelector('.navigation h2').innerHTML = dateString;
133
+ this.shadowRoot.querySelector('.header').innerHTML = `
134
+ ${(() => {
135
+ const localeTag = (this._locale && this._locale.baseName) || this.getAttribute('lang') || navigator.language;
136
+ const dtf = getTimeFormatter(localeTag, { weekday: 'short' });
137
+ const out = [];
138
+ for (let i = 0; i < 7; i++) {
139
+ const idx = (this._weekStart + i) % 7;
140
+ const ref = new Date(Date.UTC(1970, 0, 4 + idx));
141
+ const label = dtf.format(ref);
142
+ out.push(`<div class="header-day">${label}</div>`);
143
+ }
144
+ return out.join('');
145
+ })()}
146
+ `;
147
+ this.shadowRoot.querySelector('.grid').innerHTML = `<slot></slot>`;
148
+
149
+ this.renderMonth(year, month, today);
150
+ this.updateLayout();
151
+ }
152
+
153
+ renderMonth(year, month, today) {
154
+ const grid = this.shadowRoot.querySelector('.grid');
155
+ const firstOfMonth = new Date(Date.UTC(year, month, 1));
156
+ const startOffset = (firstOfMonth.getUTCDay() - this._weekStart + 7) % 7;
157
+
158
+ for (let i = 0; i < 42; i++) { // 6 Wochen x 7 Tage
159
+ const date = new Date(Date.UTC(year, month, 1 - startOffset + i));
160
+ const isOtherMonth = date.getUTCMonth() !== month;
161
+ if (isOtherMonth && i === 35) break; // stop, if other month and last row
162
+ const isToday = date.toDateString() === today.toDateString();
163
+ grid.appendChild(this.createDayCell(date, i, isOtherMonth, isToday));
164
+ }
165
+ }
166
+
167
+ createDayCell(date, index, isOtherMonth, isToday = false) {
168
+ const day = date.getUTCDate();
169
+ const cell = document.createElement('div');
170
+ cell.setAttribute('part', 'cell');
171
+ cell.tabIndex = '0';
172
+ cell.dataset.date = date.toISOString().split('T')[0];
173
+ cell.role = 'gridcell';
174
+ cell.ariaColIndex = (index % 7) + 1;
175
+ cell.ariaRowIndex = Math.floor(index / 7) + 1;
176
+
177
+ cell.className = `day ${isOtherMonth ? 'other-month' : ''}`;
178
+ isToday && cell.setAttribute('aria-current', 'date');
179
+ cell.innerHTML = `<div class="day-number">${day}</div>`;
180
+ cell.style.gridColumn = cell.ariaColIndex;
181
+ cell.style.gridRow = cell.ariaRowIndex;
182
+ return cell;
183
+ }
184
+
185
+ updateLayout() { // debounced
186
+ if (this._layoutQueued) return;
187
+ this._layoutQueued = true;
188
+ requestAnimationFrame(() => {
189
+ this._updateLayout();
190
+ this._layoutQueued = false;
191
+ });
192
+ }
193
+ _updateLayout() {
194
+ const items = Array.from(this.querySelectorAll('u2-calendaritem'));
195
+
196
+ // Berechne Wochen-Segmente für alle Items
197
+ const itemWeeks = items.map(item => ({
198
+ item,
199
+ weeks: this.splitIntoWeeks(
200
+ item.start,
201
+ item.end,
202
+ this._currentDate.getFullYear(),
203
+ this._currentDate.getMonth()
204
+ )
205
+ }));
206
+
207
+ // Track assignment for overlapping events (optimized):
208
+ // Flatten segments, sort by row/start, then greedily assign tracks per row
209
+ const segments = [];
210
+ itemWeeks.forEach(({ weeks }) => weeks.forEach(w => segments.push(w)));
211
+
212
+ segments.sort((a, b) => a.row - b.row || a.startCol - b.startCol);
213
+
214
+ const tracks = new Map(); // row -> array of endCol per track index
215
+ for (let i = 0; i < segments.length; i++) {
216
+ const week = segments[i];
217
+ const rowTracks = tracks.get(week.row) ?? tracks.set(week.row, []).get(week.row);
218
+
219
+ let track = 0;
220
+ // find first track index that is free (no overlap)
221
+ while (rowTracks[track] !== undefined && rowTracks[track] >= week.startCol) {
222
+ track++;
223
+ }
224
+
225
+ // assign and record the new end for that track
226
+ rowTracks[track] = week.endCol;
227
+ week.track = track;
228
+ }
229
+
230
+ // Layout auf Items anwenden (guard against missing/early items)
231
+ itemWeeks.forEach(({ item, weeks }) => {
232
+ item.updateLayout?.({ weeks });
233
+ });
234
+ }
235
+
236
+ splitIntoWeeks(start, end, year, month) {
237
+ const weeks = [];
238
+ const firstDay = new Date(Date.UTC(year, month, 1));
239
+ const monthEnd = new Date(Date.UTC(year, month + 1, 0));
240
+ const startOffset = (firstDay.getUTCDay() - this._weekStart + 7) % 7;
241
+
242
+ // Calculate the first and last day of the visible calendar view
243
+ const viewStart = new Date(Date.UTC(year, month, 1 - startOffset));
244
+ const daysInMonth = monthEnd.getUTCDate();
245
+ const totalDays = Math.ceil((daysInMonth + startOffset) / 7) * 7;
246
+ const viewEnd = new Date(Date.UTC(year, month, 1 - startOffset + totalDays - 1));
247
+
248
+ // Parse input dates and normalize to start of day
249
+ const eventStart = new Date(start);
250
+ eventStart.setUTCHours(0, 0, 0, 0);
251
+
252
+ const eventEnd = new Date(end);
253
+ eventEnd.setUTCHours(0, 0, 0, 0);
254
+
255
+ // Return early if event is outside visible range
256
+ if (eventEnd < viewStart || eventStart > viewEnd) return weeks;
257
+
258
+ // Calculate the actual start and end dates we need to process
259
+ const current = new Date(Math.max(viewStart.getTime(), eventStart.getTime()));
260
+ const finalEnd = new Date(Math.min(viewEnd.getTime(), eventEnd.getTime()));
261
+
262
+ // Process each week
263
+ while (current <= finalEnd) {
264
+ // Calculate days since view start
265
+ const daysSinceStart = Math.floor((current - viewStart) / (1000 * 60 * 60 * 24));
266
+ const row = Math.floor(daysSinceStart / 7);
267
+ const col = daysSinceStart % 7;
268
+
269
+ // Calculate how many days until the end of the week or event, whichever comes first
270
+ const daysRemainingInWeek = 6 - col;
271
+ const daysUntilEventEnd = Math.ceil((finalEnd - current) / (1000 * 60 * 60 * 24));
272
+ const span = Math.min(daysRemainingInWeek, daysUntilEventEnd) + 1;
273
+
274
+ // Add the week segment
275
+ weeks.push({
276
+ gridColumn: `${col + 1} / span ${span}`,
277
+ gridRow: row + 1,
278
+ startCol: col,
279
+ endCol: col + span - 1,
280
+ row
281
+ });
282
+
283
+ // Move to the next day after this segment
284
+ current.setDate(current.getDate() + span);
285
+
286
+ // If we've reached the end of the event, break
287
+ if (current > finalEnd) break;
288
+ }
289
+
290
+ return weeks;
291
+ }
292
+ }
293
+
294
+
295
+
296
+
297
+
298
+ class U2CalendarItem extends HTMLElement {
299
+ static observedAttributes = ['start', 'end'];
300
+
301
+ constructor() {
302
+ super();
303
+ this.attachShadow({ mode: 'open' });
304
+ this.shadowRoot.adoptedStyleSheets = [itemStyle];
305
+ if (this.hasAttribute('draggable')) import('./ext/drag.js');
306
+ }
307
+
308
+ _parseDate(dateString) {
309
+ if (/^\d{4}-\d{2}-\d{2}$/.test(dateString)) {
310
+ const [year, month, day] = dateString.split('-').map(Number);
311
+ return new Date(Date.UTC(year, month - 1, day));
312
+ }
313
+ return new Date(dateString);
314
+ }
315
+
316
+ attributeChangedCallback(name, oldValue, newValue) {
317
+ if (oldValue === newValue) return;
318
+ try {
319
+ if (name === 'start') this._start = this._parseDate(newValue);
320
+ if (name === 'end') this._end = this._parseDate(newValue);
321
+ this.closest('u2-calendar')?.updateLayout?.();
322
+ } catch (e) {
323
+ console.error(`Error parsing ${name} date:`, newValue, e);
324
+ }
325
+ }
326
+
327
+ get start() { return this._start; }
328
+ get end() { return this._end && this._end > this._start ? this._end : this._start; }
329
+
330
+ updateLayout(layoutInfo) {
331
+ if (!layoutInfo) return;
332
+
333
+ const calendar = this.closest('u2-calendar');
334
+ const localeTag = calendar?._locale?.baseName || navigator.language;
335
+ const timeFormatter = getTimeFormatter(localeTag);
336
+
337
+ const text = this.textContent.trim();
338
+ let startString = timeFormatter.format(this.start);
339
+ let endString = timeFormatter.format(this.end);
340
+ if (startString === '00:00' || startString === '12:00 AM') startString = '';
341
+ if (endString === '00:00' || endString === '12:00 AM') endString = '';
342
+
343
+ this.shadowRoot.innerHTML = `${layoutInfo.weeks.map(week => `
344
+ <div class=bar
345
+ title="${startString} - ${endString}\n${text}"
346
+ tabindex="0"
347
+ style="
348
+ grid-column: ${week.gridColumn};
349
+ grid-row: ${week.gridRow};
350
+ margin-block-start: ${(week.track || 0) * 2.0 + 2.3}em;
351
+ ">${startString} ${text}</div>
352
+ `).join('')}`;
353
+ }
354
+ }
355
+
356
+ const itemStyle = new CSSStyleSheet();
357
+ itemStyle.replaceSync(`
358
+ :host {
359
+ display: contents !important;
360
+ background-color: var(--color, #1976d2);
361
+ color: white;
362
+ padding-block: .3em;
363
+ padding-inline: .5em;
364
+ white-space: nowrap;
365
+ font-size: 0.8em;
366
+ block-size: 1.8em;
367
+ min-block-size: 1.5em;
368
+ overflow: hidden;
369
+ text-overflow: ellipsis;
370
+ z-index: 2;
371
+ --line-height: 1.1;
372
+ box-sizing: border-box;
373
+ }
374
+ .bar {
375
+ all: inherit;
376
+ display:block;
377
+ }
378
+ `);
379
+
380
+ // Helpers
381
+ // Module-level cache for Intl.DateTimeFormat instances
382
+ const __u2_timeFormatterCache = new Map();
383
+ function getTimeFormatter(localeTag, options = { hour: '2-digit', minute: '2-digit' }) {
384
+ const key = `${localeTag}::${JSON.stringify(options)}`;
385
+ return __u2_timeFormatterCache.get(key)
386
+ ?? __u2_timeFormatterCache.set(key, new Intl.DateTimeFormat(localeTag, options)).get(key);
387
+ }
388
+
389
+
390
+ customElements.define('u2-calendar', U2Calendar);
391
+ customElements.define('u2-calendaritem', U2CalendarItem);
@@ -0,0 +1,69 @@
1
+ // Globale Drag-States
2
+ let draggedItem = null;
3
+ let currentDropTarget = null;
4
+
5
+ // Hilfsfunktionen für 'part'
6
+ function addPart(el, partName) {
7
+ const parts = (el.getAttribute('part') || '').split(/\s+/).filter(Boolean);
8
+ if (!parts.includes(partName)) parts.push(partName);
9
+ el.setAttribute('part', parts.join(' '));
10
+ }
11
+
12
+ function removePart(el, partName) {
13
+ const parts = (el.getAttribute('part') || '').split(/\s+/).filter(p => p !== partName);
14
+ parts.length ? el.setAttribute('part', parts.join(' ')) : el.removeAttribute('part');
15
+ }
16
+
17
+ document.addEventListener('dragstart', (e) => {
18
+ const item = e.target.closest('[draggable="true"]');
19
+ if (!item) return;
20
+ if (item.tagName.toLowerCase() !== 'u2-calendaritem') return;
21
+ draggedItem = item;
22
+ e.dataTransfer.effectAllowed = 'move';
23
+ e.dataTransfer.setData('text/plain', '');
24
+ const img = new Image();
25
+ img.src = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLz4=';
26
+ e.dataTransfer.setDragImage(img, 0, 0);
27
+ });
28
+
29
+
30
+ document.addEventListener('dragover', (e) => {
31
+ if (!draggedItem) return;
32
+ e.preventDefault();
33
+ e.dataTransfer.dropEffect = 'move';
34
+
35
+ const target = e.composedPath().find(el => el.closest?.('.day'))?.closest('.day');
36
+ if (!target || target === currentDropTarget) return;
37
+
38
+ currentDropTarget && removePart(currentDropTarget, 'drop-target');
39
+ currentDropTarget = target;
40
+ addPart(target, 'drop-target');
41
+ });
42
+
43
+ document.addEventListener('dragend', () => {
44
+ currentDropTarget && removePart(currentDropTarget, 'drop-target');
45
+ draggedItem = null;
46
+ currentDropTarget = null;
47
+ });
48
+
49
+ document.addEventListener('drop', (e) => {
50
+ if (!draggedItem || !currentDropTarget) return;
51
+ e.preventDefault();
52
+
53
+ const [year, month, day] = currentDropTarget.dataset.date.split('-').map(Number);
54
+ const startTime = new Date(draggedItem.getAttribute('start'));
55
+ const endTime = new Date(draggedItem.getAttribute('end'));
56
+ const duration = endTime - startTime;
57
+
58
+ const newStart = new Date(startTime); // smarter?
59
+ newStart.setFullYear(year, month - 1, day);
60
+
61
+ const newEnd = new Date(newStart.getTime() + duration);
62
+
63
+ draggedItem.setAttribute('start', newStart.toISOString());
64
+ draggedItem.setAttribute('end', newEnd.toISOString());
65
+
66
+ removePart(currentDropTarget, 'drop-target');
67
+ draggedItem = null;
68
+ currentDropTarget = null;
69
+ });
@@ -0,0 +1,101 @@
1
+ // cell navigations
2
+ const calendarKeyDownFns = {
3
+ 'ArrowLeft': (row, col, grid)=>{
4
+ return grid.querySelector(`[aria-rowindex="${row}"][aria-colindex="${col - 1}"]`);
5
+ },
6
+ 'ArrowRight': (row, col, grid)=>{
7
+ return grid.querySelector(`[aria-rowindex="${row}"][aria-colindex="${col + 1}"]`);
8
+ },
9
+ 'ArrowUp': (row, col, grid)=>{
10
+ return grid.querySelector(`[aria-rowindex="${row - 1}"][aria-colindex="${col}"]`);
11
+ },
12
+ 'ArrowDown': (row, col, grid)=>{
13
+ return grid.querySelector(`[aria-rowindex="${row + 1}"][aria-colindex="${col}"]`);
14
+ },
15
+ 'PageUp': (row, col, grid, calendar)=>{
16
+ calendar.prev();
17
+ setTimeout(()=>{
18
+ const nextTarget = grid.querySelector(`[aria-rowindex="${row}"][aria-colindex="${col}"]`);
19
+ nextTarget ? nextTarget.focus() : grid.querySelector(':scope > :last-child').focus();
20
+ }, 10);
21
+ },
22
+ 'PageDown': (row, col, grid, calendar)=>{
23
+ calendar.next();
24
+ setTimeout(()=>{
25
+ const nextTarget = grid.querySelector(`[aria-rowindex="${row}"][aria-colindex="${col}"]`);
26
+ nextTarget ? nextTarget.focus() : grid.querySelector(':scope > :last-child').focus();
27
+ }, 10);
28
+ },
29
+ 'Home': (row, col, grid)=>{
30
+ return grid.querySelector(`[aria-rowindex="1"][aria-colindex="1"]`);
31
+ },
32
+ 'End': (row, col, grid)=>{
33
+ return grid.querySelector(':scope > :last-child');
34
+ },
35
+ }
36
+ document.addEventListener('keydown', e=>{
37
+ if (e.target.tagName !== 'U2-CALENDAR') return;
38
+
39
+ const path = e.composedPath();
40
+ const actualTarget = path[0];
41
+ const calendar = e.target;
42
+
43
+ if (actualTarget.matches('.grid > *')) {
44
+ const row = parseInt(actualTarget.ariaRowIndex, 10);
45
+ const col = parseInt(actualTarget.ariaColIndex, 10);
46
+ const grid = actualTarget.closest('.grid');
47
+
48
+ let nextTarget = calendarKeyDownFns[e.key]?.(row, col, grid, calendar);
49
+
50
+ if (nextTarget) {
51
+ nextTarget.focus();
52
+ e.preventDefault();
53
+ }
54
+
55
+ }
56
+ });
57
+
58
+
59
+ // Handle scroll navigation for month change
60
+ document.addEventListener('wheel', e => {
61
+ if (e.target.tagName !== 'U2-CALENDAR') return;
62
+
63
+ const path = e.composedPath();
64
+ const target = path[0];
65
+
66
+ if (Math.abs(e.deltaY) < Math.abs(e.deltaX)) return;
67
+ const calendar = e.target;
68
+
69
+ const grid = target.closest('.grid');
70
+ if (grid) {
71
+ e.preventDefault();
72
+ e.deltaY > 0 ? calendar.next() : calendar.prev();
73
+ }
74
+ }, { passive: false });
75
+
76
+
77
+ // move event by one day left or right
78
+ document.addEventListener('keydown', e => {
79
+ const item = e.target.closest('u2-calendaritem');
80
+ if (!item) return;
81
+ if (!item.draggable) return;
82
+
83
+ if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
84
+ const offset = e.key === 'ArrowLeft' ? -1 : 1;
85
+
86
+ const startTime = new Date(item.getAttribute('start'));
87
+ const endTime = new Date(item.getAttribute('end'));
88
+ const duration = endTime - startTime;
89
+
90
+ const newStart = new Date(startTime);
91
+ newStart.setDate(startTime.getDate() + offset);
92
+
93
+ const newEnd = new Date(newStart.getTime() + duration);
94
+
95
+ item.setAttribute('start', newStart.toISOString());
96
+ if (item.end) item.setAttribute('end', newEnd.toISOString());
97
+
98
+ e.preventDefault();
99
+ setTimeout(() => item.shadowRoot.querySelector('*')?.focus(), 16);
100
+ }
101
+ });
@@ -0,0 +1,69 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "readme": "README.md",
4
+ "modules": [{
5
+ "kind": "javascript-module",
6
+ "path": "calendar.js",
7
+ "declarations": [{
8
+ "kind": "class",
9
+ "description": "A customizable calendar component",
10
+ "name": "U2Calendar",
11
+ "members": [],
12
+ "events": [],
13
+ "attributes": [{
14
+ "name": "date",
15
+ "description": "The currently displayed date in ISO format (YYYY-MM-DD)",
16
+ "type": "string"
17
+ },{
18
+ "name": "lang",
19
+ "description": "The locale to use for date formatting (defaults to browser locale)",
20
+ "type": "string",
21
+ "u2Examples": ["de-CH", "en-US", "fr-FR"]
22
+ },{
23
+ "name": "view",
24
+ "description": "The current view mode of the calendar",
25
+ "type": "string"
26
+ }],
27
+ "cssProperties": [],
28
+ "cssParts": [],
29
+ "superclass": { "name": "HTMLElement" },
30
+ "tagName": "u2-calendar",
31
+ "customElement": true
32
+ },{
33
+ "kind": "class",
34
+ "description": "Represents an item/event in the calendar",
35
+ "name": "U2CalendarItem",
36
+ "members": [],
37
+ "events": [],
38
+ "attributes": [{
39
+ "name": "start",
40
+ "description": "Start date/time of the calendar item",
41
+ "type": "string"
42
+ },{
43
+ "name": "end",
44
+ "description": "End date/time of the calendar item",
45
+ "type": "string"
46
+ }],
47
+ "cssProperties": [],
48
+ "cssParts": [],
49
+ "superclass": { "name": "HTMLElement" },
50
+ "tagName": "u2-calendaritem",
51
+ "customElement": true
52
+ }],
53
+ "exports": [{
54
+ "kind": "custom-element-definition",
55
+ "name": "u2-calendar",
56
+ "declaration": {
57
+ "name": "U2Calendar",
58
+ "module": "calendar.js"
59
+ }
60
+ },{
61
+ "kind": "custom-element-definition",
62
+ "name": "u2-calendaritem",
63
+ "declaration": {
64
+ "name": "U2CalendarItem",
65
+ "module": "calendar.js"
66
+ }
67
+ }]
68
+ }]
69
+ }
@@ -15,35 +15,35 @@ Simple carousel component
15
15
  ## Usage
16
16
 
17
17
  ```html
18
- <u2-carousel autoplay controls>
19
- <div>Carousel<br>Demo<br>Item 1</div>
20
- <div>Item 2</div>
18
+ <u2-carousel autoplay controls>
19
+ <div>Carousel<br>Demo<br>Item 1</div>
20
+ <div>Item 2</div>
21
21
  </u2-carousel>
22
22
  ```
23
23
 
24
24
  ```css
25
- u2-carousel {
26
- background:var(--color-light);
27
- }
28
- u2-carousel > :not([slot]) {
29
- padding:3rem;
30
- text-align:center;
25
+ u2-carousel {
26
+ background:var(--color-light);
27
+ }
28
+ u2-carousel > :not([slot]) {
29
+ padding:3rem;
30
+ text-align:center;
31
31
  }
32
32
  ```
33
33
 
34
34
  ## Install
35
35
 
36
36
  ```html
37
- <link href="https://cdn.jsdelivr.net/gh/u2ui/u2@x.x.x/el/carousel/carousel.min.css" rel=stylesheet>
38
- <script src="https://cdn.jsdelivr.net/gh/u2ui/u2@x.x.x/el/carousel/carousel.min.js" type=module async></script>
37
+ <link href="https://cdn.jsdelivr.net/gh/u2ui/u2@main/el/carousel/carousel.css" rel=stylesheet>
38
+ <script src="https://cdn.jsdelivr.net/gh/u2ui/u2@main/el/carousel/carousel.js" type=module async></script>
39
39
  ```
40
40
 
41
41
  ## Demos
42
42
 
43
- [experiments.html](http://gcdn.li/u2ui/u2@main/el/carousel/tests/experiments.html)
44
- [minimal.html](http://gcdn.li/u2ui/u2@main/el/carousel/tests/minimal.html)
45
- [nested.html](http://gcdn.li/u2ui/u2@main/el/carousel/tests/nested.html)
46
43
  [test.html](http://gcdn.li/u2ui/u2@main/el/carousel/tests/test.html)
44
+ [nested.html](http://gcdn.li/u2ui/u2@main/el/carousel/tests/nested.html)
45
+ [minimal.html](http://gcdn.li/u2ui/u2@main/el/carousel/tests/minimal.html)
46
+ [experiments.html](http://gcdn.li/u2ui/u2@main/el/carousel/tests/experiments.html)
47
47
 
48
48
  ## About
49
49