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
@@ -11,27 +11,28 @@ alert, prompt, confirm but async
11
11
  ## Usage
12
12
 
13
13
  ```html
14
- <button onclick="module.prompt('Just a test').then(console.log)">run</button>
14
+ <button onclick="u2_dialog.prompt('Just a test').then((res)=>this.innerHTML = 'value: '+res)">run</button>
15
15
  ```
16
16
 
17
17
  ```css
18
- dialog:where(.\:modal, :modal) {
19
- box-shadow: 0 0 1rem #0008;
20
- border: 0;
21
- border-radius: .3rem;
18
+ dialog:modal {
19
+ box-shadow: 0 0 1rem #0008;
20
+ border: 0;
21
+ border-radius: .3rem;
22
22
  }
23
23
  ```
24
24
 
25
25
  ## Install
26
26
 
27
27
  ```js
28
- import * as module from "https://cdn.jsdelivr.net/gh/u2ui/u2@x.x.x/js/dialog/dialog.min.js"
28
+ import * as module from "https://cdn.jsdelivr.net/gh/u2ui/u2@main/js/dialog/dialog.js"
29
29
  ```
30
30
 
31
31
  ## Demos
32
32
 
33
- [minimal.html](http://gcdn.li/u2ui/u2@main/js/dialog/tests/minimal.html)
34
33
  [test.html](http://gcdn.li/u2ui/u2@main/js/dialog/tests/test.html)
34
+ [tests.html](http://gcdn.li/u2ui/u2@main/js/dialog/tests/tests.html)
35
+ [minimal.html](http://gcdn.li/u2ui/u2@main/js/dialog/tests/minimal.html)
35
36
 
36
37
  ## Pro-Tip
37
38
 
@@ -1,261 +1,228 @@
1
- // TODO:
2
- // - should we move the dom inside shadowDom to avoid style conflicts?
3
- // or should we add an option to use shadowDom or just to define the container for the dialog-element?
4
- // - rename to modal.js? see <iframe sandbox="allow-modals">
5
-
6
- class Dialog {
7
- constructor(options) {
8
-
9
- const element = this.element = d.createElement('dialog');
10
- element.classList.add('u2x-modal');
11
- //element.setAttribute('role','alertdialog'); // todo: internals.role = 'alertdialog'; ?
12
- element.innerHTML =
13
- `<form method=dialog>
14
- ${options.body}
15
- ${options.buttons?'<div class=-buttons u2-focusgroup></div>':''}
16
- </form>`;
17
-
18
- const btnCont = element.querySelector('.-buttons');
19
- if (options.buttons) {
20
-
21
- import('../../attr/focusgroup/focusgroup.js');
22
-
23
- options.buttons.forEach((btn, i)=>{
24
- const el = d.createElement('button');
25
- el.innerHTML = btn.title;
26
- el.value = btn.value;
27
- el.type = btn.type || 'submit';
28
- el.addEventListener('click', e=>{
29
- btn.then && btn.then.call(this,e);
30
- });
31
- btnCont.appendChild(el);
32
- if (i === 0) setTimeout(()=>el.focus());
33
- });
34
- }
35
- this.options = options;
36
- options.init && options.init(this.element);
37
- }
38
- show(){
39
- const element = this.element;
40
- d.body.appendChild(element);
41
- element.showModal();
42
- element.classList.add(':modal'); // fallback for browsers that don't support :modal
43
- if (this.options.audio) {
44
- const url = this.options.audio === true ? import.meta.url + '/../notification.mp3' : this.options.audio;
45
- const audio = new Audio();
46
- audio.volume = 0.2;
47
- audio.src = url;
48
- audio.play();
49
- }
50
-
51
- return new Promise((resolve, reject)=>{
52
- element.addEventListener('close',()=>{
53
- resolve(this.value);
54
- element.remove();
55
- });
56
- });
57
-
58
- }
59
- }
60
-
61
- /**
62
- * Creates and shows a dialog with an alert message.
63
- * @param {string} text - The text to be displayed in the alert dialog.
64
- * @returns {Promise<undefined>} A Promise that resolves to undefined when the dialog is closed.
65
- * @example
66
- * await alert('This is an alert message');
67
- */
68
- export function alert(text) {
69
- const options = toOptions(text);
70
- options.buttons = [{title:'OK'}];
71
- return new Dialog(options).show();
72
- };
73
-
74
- /**
75
- * Creates and shows a dialog with a confirmation message.
76
- * @param {string} text - The text to be displayed in the confirmation dialog.
77
- * @returns {Promise<boolean>} A Promise that resolves to true if the user clicks the OK button, and false if the user clicks the Cancel button.
78
- * @example
79
- * if (await confirm('Do you want to delete this item?')) {
80
- * deleteItem();
81
- * }
82
- */
83
- export function confirm(text) {
84
- const options = toOptions(text);
85
- options.buttons = [
86
- {title: 'OK',then(){ dialog.value = true; } },
87
- {title: translate(options.lang, 'Cancel')}
88
- ];
89
- const dialog = new Dialog(options);
90
- dialog.value = false;
91
- return dialog.show();
92
- };
93
-
94
- /**
95
- * Creates and shows a dialog with a prompt message.
96
- * @param {string} text - The text to be displayed in the prompt dialog.
97
- * @param {string} [initial] - The initial value of the input field.
98
- * @returns {Promise<string>} A Promise that resolves to the value entered by the user, or null if the user clicks the Cancel button.
99
- * @example
100
- * const name = await prompt('Enter your name:');
101
- */
102
- export function prompt(text, initial) {
103
- const options = toOptions(text);
104
- options.body = '<label>'+options.body+'<input style="width:100%;display:block;margin-top:.5rem"></label>';
105
- options.buttons = [
106
- {title: 'OK', then(){ dialog.value = input.value; } },
107
- {title: translate(options.lang, 'Cancel')}
108
- ];
109
- const dialog = new Dialog(options);
110
- const input = dialog.element.querySelector('input');
111
- input.value = initial ?? '';
112
- setTimeout(()=>input.focus());
113
- dialog.value = null;
114
- return dialog.show();
115
- };
116
-
117
- /* */
118
- export function form(html){
119
- if (typeof html === 'string') html = { body: html };
120
- const options = toOptions(html);
121
- options.buttons =
122
- [{title:'OK',then(){ // TODO: triggers by click but would be better by form.submit?
123
- const form = dialog.element.querySelector('form');
124
- if (!form.checkValidity()) dialog.value = null;
125
- else {
126
- const data = Object.fromEntries(new FormData(form).entries());
127
- dialog.value = data;
128
- }
129
- }},{title: translate(lang(), 'Cancel'), type:'button', then(){
130
- dialog.element.close();
131
- }}];
132
-
133
- const dialog = new Dialog(options);
134
- return dialog.show();
135
- }
136
- /* */
137
-
138
-
139
- /* init */
140
- const d = document;
141
-
142
- d.head.insertAdjacentHTML(
143
- 'afterbegin',
144
- '<style>'+
145
- '.u2x-modal .-buttons {'+
146
- 'display:flex;'+
147
- 'flex-wrap:wrap;'+
148
- 'justify-content:flex-end;'+
149
- 'gap:.5rem;'+
150
- 'margin-top:1rem;'+
151
- '}'+
152
- '</style>'
153
- );
154
-
155
-
156
-
157
- // close dialog on backdrop-click if it has the backdropClose-class
158
- addEventListener('click', event=>{
159
- const el = event.target;
160
- if (el.tagName !== 'DIALOG') return;
161
- if (!el.classList.contains('backdropClose')) return;
162
- const rect = el.getBoundingClientRect();
163
- let isInDialog = (rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width);
164
- if (isInDialog) return;
165
- el.close();
166
- //hideAnimated(el, ()=>el.close());
167
- });
168
-
169
-
170
-
171
- // helper functions
172
-
173
- function toOptions(options) {
174
- if (typeof options === 'string') {
175
- options = { body: htmlEntities(options) };
176
- }
177
- options.lang ??= lang();
178
- return options;
179
- }
180
-
181
-
182
- function htmlEntities(str) {
183
- return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
184
- }
185
- function translate(lang, v) {
186
- return text[v][lang] || v;
187
- }
188
- function lang() {
189
- return navigator.language.substring(0,2);
190
- }
191
- const text = {
192
- 'Cancel':{
193
- 'de':'Abbrechen',
194
- 'fr':'Annuler',
195
- 'es':'Cancelar',
196
- 'it':'Annulla',
197
- 'pt':'Cancelar',
198
- 'ua':'Скасувати',
199
- 'ru':'Отмена',
200
- 'ja':'キャンセル',
201
- 'ko':'취소',
202
- 'zh':'取消',
203
- 'nl':'Annuleren',
204
- }
205
- }
206
-
207
-
208
- /*
209
-
210
- Works! Waiting for demand
211
- There are standards on the way that allow animations (@starting-style, transition-behavior: allow-discrete;)
212
-
213
- needs css:
214
- dialog.animated[hidden] {
215
- display:block !important;
216
- pointer-events:none !important;
217
- }
218
-
219
- function hideAnimated(el, then) {
220
- if (!el.classList.contains('animated')) {
221
- then();
222
- return;
223
- }
224
- el.style.animation = 'none'; // animation can be the same in reverse, so remove it first to avoid it not triggering
225
- setTimeout(()=>{
226
- el.style.animation = '';
227
- const end = e=>{
228
- if (e && e.type && e.target !== el) return;
229
- el.hidden = false;
230
- then && then();
231
- el.removeEventListener('animationend',end);
232
- el.removeEventListener('transitionend',end);
233
- clearTimeout(timeout);
234
- return;
235
- }
236
- el.addEventListener('animationend',end);
237
- el.addEventListener('transitionend',end);
238
- const timeout = setTimeout(end,2000);
239
- el.hidden = true;
240
- });
241
-
242
- };
243
- addEventListener('cancel', e=>{
244
- if (e.defaultPrevented) return;
245
- const el = e.target;
246
- if (el.hidden) return;
247
- if (!el.classList.contains('animated')) return;
248
- e.preventDefault();
249
- hideAnimated(el, ()=>el.close());
250
- }, true)
251
- addEventListener('submit', e=>{
252
- if (e.defaultPrevented) return;
253
- const form = e.target;
254
- if (form.method!=='dialog') return;
255
- const el = el.closest('.dialog');
256
- if (el.hidden) return;
257
- if (!el.classList.contains('animated')) return;
258
- e.preventDefault();
259
- hideAnimated(el, ()=>form.submit());
260
- }, true)
261
- /* */
1
+ // TODO:
2
+ // - should we move the dom inside shadowDom to avoid style conflicts?
3
+ // or should we add an option to use shadowDom or just to define the container for the dialog-element?
4
+ // - rename to modal.js? see <iframe sandbox="allow-modals">
5
+
6
+ const d = document;
7
+ const sheet = new CSSStyleSheet();
8
+ sheet.replaceSync(`.u2x-modal .-buttons {
9
+ display: flex;
10
+ flex-wrap: wrap;
11
+ justify-content: flex-end;
12
+ gap: .5rem;
13
+ margin-top: 1rem;
14
+ }`);
15
+
16
+
17
+ class Dialog {
18
+ constructor(options) {
19
+
20
+ const element = this.element = d.createElement('dialog');
21
+ element.classList.add('u2x-modal');
22
+ // element.role = 'alertdialog'; // todo: internals.role = 'alertdialog'; ?
23
+ element.innerHTML =
24
+ `<form method=dialog>
25
+ ${options.body}
26
+ ${options.buttons?'<div class=-buttons u2-focusgroup></div>':''}
27
+ </form>`;
28
+
29
+ const btnCont = element.querySelector('.-buttons');
30
+ if (options.buttons) {
31
+
32
+ import('../../attr/focusgroup/focusgroup.js');
33
+
34
+ options.buttons.forEach((btn, i)=>{
35
+ const el = d.createElement('button');
36
+ el.innerHTML = btn.title;
37
+ el.value = btn.value;
38
+ el.type = btn.type || 'submit';
39
+ el.addEventListener('click', e=>{
40
+ if (btn.value !== undefined) this.value = btn.value; // default to button value, like native returnValue
41
+ btn.action?.call(this, e); // action may override this.value
42
+ });
43
+ btnCont.appendChild(el);
44
+ if (i === 0) setTimeout(()=>el.focus());
45
+ });
46
+ }
47
+ this.options = options;
48
+ options.init && options.init(this.element);
49
+ }
50
+ show(){
51
+ const element = this.element;
52
+ (this.options.root ?? d.body).appendChild(element);
53
+ // make our styles available in the current root (document or a shadow root)
54
+ const root = element.getRootNode();
55
+ if (!root.adoptedStyleSheets.includes(sheet)) root.adoptedStyleSheets.push(sheet);
56
+ element.showModal();
57
+ if (this.options.audio) {
58
+ const url = this.options.audio === true ? import.meta.url + '/../notification.mp3' : this.options.audio;
59
+ const audio = new Audio();
60
+ audio.volume = 0.2;
61
+ audio.src = url;
62
+ audio.play().catch(()=>{}); // autoplay policy may reject
63
+ }
64
+
65
+ return new Promise(resolve=>{
66
+ element.addEventListener('close',()=>{
67
+ resolve(this.value);
68
+ element.remove();
69
+ });
70
+ });
71
+
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Creates and shows a dialog with an alert message.
77
+ * @param {string} text - The text to be displayed in the alert dialog.
78
+ * @returns {Promise<undefined>} A Promise that resolves to undefined when the dialog is closed.
79
+ * @example
80
+ * await alert('This is an alert message');
81
+ */
82
+ export function alert(text, defaults) {
83
+ const options = toOptions(text, defaults);
84
+ options.buttons = [{title:'OK'}];
85
+ return new Dialog(options).show();
86
+ };
87
+
88
+ /**
89
+ * Creates and shows a dialog with a confirmation message.
90
+ * @param {string} text - The text to be displayed in the confirmation dialog.
91
+ * @returns {Promise<boolean>} A Promise that resolves to true if the user clicks the OK button, and false if the user clicks the Cancel button.
92
+ * @example
93
+ * if (await confirm('Do you want to delete this item?')) {
94
+ * deleteItem();
95
+ * }
96
+ */
97
+ export function confirm(text, defaults) {
98
+ const options = toOptions(text, defaults);
99
+ options.buttons = [
100
+ {title: 'OK',action(){ dialog.value = true; } },
101
+ {title: translate(options.lang, 'Cancel')}
102
+ ];
103
+ const dialog = new Dialog(options);
104
+ dialog.value = false;
105
+ return dialog.show();
106
+ };
107
+
108
+ /**
109
+ * Creates and shows a dialog with a prompt message.
110
+ * @param {string} text - The text to be displayed in the prompt dialog.
111
+ * @param {string} [initial] - The initial value of the input field.
112
+ * @returns {Promise<string>} A Promise that resolves to the value entered by the user, or null if the user clicks the Cancel button.
113
+ * @example
114
+ * const name = await prompt('Enter your name:');
115
+ */
116
+ export function prompt(text, initial, defaults) {
117
+ const options = toOptions(text, defaults);
118
+ options.body = '<label>'+options.body+'<input style="width:100%;display:block;margin-top:.5rem"></label>';
119
+ options.buttons = [
120
+ {title: 'OK', action(){ dialog.value = input.value; } },
121
+ {title: translate(options.lang, 'Cancel')}
122
+ ];
123
+ const dialog = new Dialog(options);
124
+ const input = dialog.element.querySelector('input');
125
+ input.value = initial ?? '';
126
+ setTimeout(()=>input.focus());
127
+ dialog.value = null;
128
+ return dialog.show();
129
+ };
130
+
131
+ /* */
132
+ export function form(html, defaults){
133
+ if (typeof html === 'string') html = { body: html };
134
+ const options = toOptions(html, defaults);
135
+ options.buttons =
136
+ [{title:'OK',action(){ // TODO: triggers by click but would be better by form.submit?
137
+ const form = dialog.element.querySelector('form');
138
+ if (!form.checkValidity()) dialog.value = null;
139
+ else {
140
+ const data = Object.fromEntries(new FormData(form).entries());
141
+ dialog.value = data;
142
+ }
143
+ }},{title: translate(options.lang, 'Cancel'), type:'button', action(){
144
+ dialog.element.close();
145
+ }}];
146
+
147
+ const dialog = new Dialog(options);
148
+ return dialog.show();
149
+ }
150
+ /* */
151
+
152
+ /**
153
+ * Creates and shows a modal dialog with arbitrary content and buttons.
154
+ * Resolves to `this.value` — set via the clicked button's `value`, or in a button `action`.
155
+ * @param {string|object} options - HTML body string, or { body, buttons, root, lang, init, audio }.
156
+ * @returns {Promise<*>} Resolves to the dialog's value when closed.
157
+ * @example
158
+ * const choice = await modal({ body:'Pick one', buttons:[{title:'A',value:'a'},{title:'B',value:'b'}] });
159
+ */
160
+ export function modal(options, defaults) {
161
+ return new Dialog(toOptions(options, defaults)).show();
162
+ }
163
+
164
+ // bind default options (e.g. a shadow root and/or lang) to all dialogs:
165
+ // const m = scope({root: this.shadowRoot, lang:'de'}); m.alert('hi')
166
+ export function scope(defaults){
167
+ return {
168
+ alert: (text) => alert(text, defaults),
169
+ confirm: (text) => confirm(text, defaults),
170
+ prompt: (text, initial) => prompt(text, initial, defaults),
171
+ form: (html) => form(html, defaults),
172
+ modal: (options) => modal(options, defaults),
173
+ };
174
+ }
175
+
176
+
177
+ // close dialog on backdrop-click if it has the backdropClose-class / deprecated "closedby" is the future
178
+ addEventListener('click', event=>{
179
+ const el = event.composedPath()[0]; // composedPath: real target, also inside shadow DOM
180
+ if (el.tagName !== 'DIALOG') return;
181
+ if (!el.classList.contains('backdropClose')) return;
182
+ const rect = el.getBoundingClientRect();
183
+ let isInDialog = (rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width);
184
+ if (isInDialog) return;
185
+ el.close();
186
+ //hideAnimated(el, ()=>el.close());
187
+ });
188
+
189
+
190
+
191
+ // helper functions
192
+
193
+ function toOptions(input, defaults) {
194
+ const options = typeof input === 'string'
195
+ ? { body: htmlEntities(input).replace(/\n/g, '<br>') } // plain string: escape it
196
+ : input; // object: trusted html body
197
+ return { lang: lang(), ...defaults, ...options };
198
+ }
199
+
200
+
201
+ function htmlEntities(str) {
202
+ return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
203
+ }
204
+ function translate(lang, v) {
205
+ return text[v]?.[lang] || v;
206
+ }
207
+ function lang() {
208
+ return navigator.language.substring(0,2);
209
+ }
210
+ const text = {
211
+ 'Cancel':{
212
+ 'ar':'إلغاء',
213
+ 'de':'Abbrechen',
214
+ 'es':'Cancelar',
215
+ 'fr':'Annuler',
216
+ 'it':'Annulla',
217
+ 'ja':'キャンセル',
218
+ 'ko':'취소',
219
+ 'nl':'Annuleren',
220
+ 'pl':'Anuluj',
221
+ 'pt':'Cancelar',
222
+ 'ru':'Отмена',
223
+ 'tr':'İptal',
224
+ 'ua':'Скасувати',
225
+ 'zh':'取消',
226
+ }
227
+ }
228
+
@@ -0,0 +1,28 @@
1
+ ## Usage
2
+
3
+ ```html
4
+
5
+ ```
6
+
7
+ ## Usage
8
+
9
+ ```html
10
+
11
+ ```
12
+
13
+ ## Install
14
+
15
+ ```js
16
+ import * as module from "https://cdn.jsdelivr.net/gh/u2ui/u2@main/js/drag/drag.js"
17
+ ```
18
+
19
+ ## Demos
20
+
21
+ [test.html](http://gcdn.li/u2ui/u2@main/js/drag/tests/test.html)
22
+ [minimal.html](http://gcdn.li/u2ui/u2@main/js/drag/tests/minimal.html)
23
+
24
+ ## About
25
+
26
+ - MIT License, Copyright (c) 2022 <u2> (like all repositories in this organization) <br>
27
+ - Suggestions, ideas, finding bugs and making pull requests make us very happy. ♥
28
+
@@ -0,0 +1,38 @@
1
+
2
+ export let dragged = null;
3
+
4
+ document.addEventListener('dragstart', (e) => {
5
+ dragged = null;
6
+ // composedPath() statt e.target: bei Events aus einem Shadow-Root ist e.target auf den
7
+ // Host retargetiert -> wir würden das falsche Element ziehen. Das gezogene Element ist
8
+ // das erste [draggable] im Pfad (funktioniert in Light- und Shadow-DOM gleich).
9
+ dragged = e.composedPath().find(n => n.nodeType === 1 && n.draggable);
10
+ if (!dragged) return;
11
+ dragged.classList.add(':dragging-image');
12
+ requestAnimationFrame(() => { // add styles after native dragImage is created
13
+ dragged.classList.remove(':dragging-image')
14
+ dragged.classList.add(':dragging');
15
+ });
16
+ });
17
+
18
+ document.addEventListener('dragend', () => {
19
+ if (!dragged) return; // just handle elements
20
+ dragged.classList.remove(':dragging');
21
+ });
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+ /* this works *
30
+ document.addEventListener('dragstart', (e) => {
31
+ const element = e.target;
32
+ const clone = element.cloneNode(true);
33
+ clone.innerHTML = 'Dragging...';
34
+ document.body.appendChild(clone);
35
+ e.dataTransfer.setDragImage(clone, 20, 20);
36
+ requestAnimationFrame(() => clone.remove());
37
+ });
38
+ */