@web-atoms/web-controls 2.6.4 → 2.6.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 (304) hide show
  1. package/dist/tsconfig.tsbuildinfo +1 -1
  2. package/dist-esm/ArrayLike.js +14 -12
  3. package/dist-esm/DataAttributes.js +18 -19
  4. package/dist-esm/Focusable.js +10 -11
  5. package/dist-esm/ModuleFiles.js +43 -42
  6. package/dist-esm/NumberFormats.js +60 -56
  7. package/dist-esm/PageNavigator.js +28 -30
  8. package/dist-esm/animations/Animations.global.css +2 -0
  9. package/dist-esm/animations/Animations.global.css.map +1 -0
  10. package/dist-esm/animations/Animations.js +36 -33
  11. package/dist-esm/basic/AtomChips.js +312 -305
  12. package/dist-esm/basic/AtomRepeater.js +1070 -1035
  13. package/dist-esm/basic/AtomSuggestions.js +97 -107
  14. package/dist-esm/basic/AttachedPopup.js +0 -1
  15. package/dist-esm/basic/Button.js +45 -19
  16. package/dist-esm/basic/Button.local.css +2 -0
  17. package/dist-esm/basic/Button.local.css.map +1 -0
  18. package/dist-esm/basic/ButtonBar.global.css +2 -0
  19. package/dist-esm/basic/ButtonBar.global.css.map +1 -0
  20. package/dist-esm/basic/ButtonBar.js +84 -64
  21. package/dist-esm/basic/Calendar.js +211 -203
  22. package/dist-esm/basic/CheckBoxList.js +90 -70
  23. package/dist-esm/basic/Checkbox.js +16 -8
  24. package/dist-esm/basic/Chip.js +36 -12
  25. package/dist-esm/basic/ComboBox.js +47 -51
  26. package/dist-esm/basic/DataGrid.js +258 -252
  27. package/dist-esm/basic/DateField.js +149 -127
  28. package/dist-esm/basic/DropDown.js +91 -103
  29. package/dist-esm/basic/DropDownInput.global.css +2 -0
  30. package/dist-esm/basic/DropDownInput.global.css.map +1 -0
  31. package/dist-esm/basic/DropDownInput.js +78 -106
  32. package/dist-esm/basic/Editable.js +82 -77
  33. package/dist-esm/basic/Expander.js +104 -86
  34. package/dist-esm/basic/FilesDragDrop.global.css +2 -0
  35. package/dist-esm/basic/FilesDragDrop.global.css.map +1 -0
  36. package/dist-esm/basic/FilesDragDrop.js +84 -80
  37. package/dist-esm/basic/Form.js +80 -52
  38. package/dist-esm/basic/FormField.js +164 -106
  39. package/dist-esm/basic/IElement.js +1 -2
  40. package/dist-esm/basic/InlinePopup.js +263 -234
  41. package/dist-esm/basic/InlinePopupButton.js +99 -88
  42. package/dist-esm/basic/InlinePopupControl.js +24 -23
  43. package/dist-esm/basic/ItemPath.js +59 -60
  44. package/dist-esm/basic/LimitedText.js +49 -38
  45. package/dist-esm/basic/ListRepeater.js +13 -14
  46. package/dist-esm/basic/MaskedInput.js +37 -29
  47. package/dist-esm/basic/MaskedInputDiv.js +55 -48
  48. package/dist-esm/basic/MergeNode.js +64 -35
  49. package/dist-esm/basic/PasswordBox.js +32 -17
  50. package/dist-esm/basic/PinchZoomView.js +221 -199
  51. package/dist-esm/basic/PopupButton.js +39 -16
  52. package/dist-esm/basic/PopupMenu.js +3 -4
  53. package/dist-esm/basic/RadioButtonList.js +35 -25
  54. package/dist-esm/basic/RefreshLock.js +41 -42
  55. package/dist-esm/basic/Resizable.js +43 -33
  56. package/dist-esm/basic/Select.js +72 -65
  57. package/dist-esm/basic/SortByButton.global.css +2 -0
  58. package/dist-esm/basic/SortByButton.global.css.map +1 -0
  59. package/dist-esm/basic/SortByButton.js +41 -31
  60. package/dist-esm/basic/Swipe.js +91 -84
  61. package/dist-esm/basic/Switch.js +22 -8
  62. package/dist-esm/basic/TableRepeater.js +29 -33
  63. package/dist-esm/basic/TimeEditor.js +97 -52
  64. package/dist-esm/basic/TitleEditor.js +115 -95
  65. package/dist-esm/basic/ToggleButtonBar.js +21 -22
  66. package/dist-esm/basic/Tooltip.js +49 -47
  67. package/dist-esm/basic/TypeWriter.js +45 -42
  68. package/dist-esm/basic/UploadEvent.js +211 -178
  69. package/dist-esm/basic/ZoomView.js +229 -198
  70. package/dist-esm/basic/combineClasses.js +2 -3
  71. package/dist-esm/basic/elements/AtomPopover.css +2 -0
  72. package/dist-esm/basic/elements/AtomPopover.css.map +1 -0
  73. package/dist-esm/basic/elements/AtomPopover.js +270 -253
  74. package/dist-esm/basic/elements/getContainingBlock.js +34 -35
  75. package/dist-esm/basic/elements/relativeRect.js +40 -21
  76. package/dist-esm/basic/styles/calendar.global.css +2 -0
  77. package/dist-esm/basic/styles/calendar.global.css.map +1 -0
  78. package/dist-esm/basic/styles/check-box-list.global.css +2 -0
  79. package/dist-esm/basic/styles/check-box-list.global.css.map +1 -0
  80. package/dist-esm/basic/styles/checkbox.global.css +2 -0
  81. package/dist-esm/basic/styles/checkbox.global.css.map +1 -0
  82. package/dist-esm/basic/styles/chip.global.css +2 -0
  83. package/dist-esm/basic/styles/chip.global.css.map +1 -0
  84. package/dist-esm/basic/styles/chips.global.css +2 -0
  85. package/dist-esm/basic/styles/chips.global.css.map +1 -0
  86. package/dist-esm/basic/styles/data-grid.global.css +2 -0
  87. package/dist-esm/basic/styles/data-grid.global.css.map +1 -0
  88. package/dist-esm/basic/styles/date-field.global.css +2 -0
  89. package/dist-esm/basic/styles/date-field.global.css.map +1 -0
  90. package/dist-esm/basic/styles/drop-down.global.css +2 -0
  91. package/dist-esm/basic/styles/drop-down.global.css.map +1 -0
  92. package/dist-esm/basic/styles/expander.global.css +2 -0
  93. package/dist-esm/basic/styles/expander.global.css.map +1 -0
  94. package/dist-esm/basic/styles/form-field.global.css +2 -0
  95. package/dist-esm/basic/styles/form-field.global.css.map +1 -0
  96. package/dist-esm/basic/styles/inline-popup.global.css +2 -0
  97. package/dist-esm/basic/styles/inline-popup.global.css.map +1 -0
  98. package/dist-esm/basic/styles/item-suggestion.global.css +2 -0
  99. package/dist-esm/basic/styles/item-suggestion.global.css.map +1 -0
  100. package/dist-esm/basic/styles/list-repeater.global.css +2 -0
  101. package/dist-esm/basic/styles/list-repeater.global.css.map +1 -0
  102. package/dist-esm/basic/styles/masked-input.global.css +2 -0
  103. package/dist-esm/basic/styles/masked-input.global.css.map +1 -0
  104. package/dist-esm/basic/styles/password-box.global.css +2 -0
  105. package/dist-esm/basic/styles/password-box.global.css.map +1 -0
  106. package/dist-esm/basic/styles/pinch-zoom-view.global.css +2 -0
  107. package/dist-esm/basic/styles/pinch-zoom-view.global.css.map +1 -0
  108. package/dist-esm/basic/styles/popup-button.global.css +2 -0
  109. package/dist-esm/basic/styles/popup-button.global.css.map +1 -0
  110. package/dist-esm/basic/styles/popup.global.css +2 -0
  111. package/dist-esm/basic/styles/popup.global.css.map +1 -0
  112. package/dist-esm/basic/styles/radio-button-list.global.css +2 -0
  113. package/dist-esm/basic/styles/radio-button-list.global.css.map +1 -0
  114. package/dist-esm/basic/styles/repeater.global.css +2 -0
  115. package/dist-esm/basic/styles/repeater.global.css.map +1 -0
  116. package/dist-esm/basic/styles/scale.svg +4 -0
  117. package/dist-esm/basic/styles/suggestion-popup.global.css +2 -0
  118. package/dist-esm/basic/styles/suggestion-popup.global.css.map +1 -0
  119. package/dist-esm/basic/styles/suggestion.global.css +2 -0
  120. package/dist-esm/basic/styles/suggestion.global.css.map +1 -0
  121. package/dist-esm/basic/styles/swipe.global.css +2 -0
  122. package/dist-esm/basic/styles/swipe.global.css.map +1 -0
  123. package/dist-esm/basic/styles/switch.global.css +2 -0
  124. package/dist-esm/basic/styles/switch.global.css.map +1 -0
  125. package/dist-esm/basic/styles/time-editor.global.css +2 -0
  126. package/dist-esm/basic/styles/time-editor.global.css.map +1 -0
  127. package/dist-esm/basic/styles/title-editor.global.css +2 -0
  128. package/dist-esm/basic/styles/title-editor.global.css.map +1 -0
  129. package/dist-esm/basic/styles/toggle-button-bar.global.css +2 -0
  130. package/dist-esm/basic/styles/toggle-button-bar.global.css.map +1 -0
  131. package/dist-esm/basic/styles/toggle-view.global.css +2 -0
  132. package/dist-esm/basic/styles/toggle-view.global.css.map +1 -0
  133. package/dist-esm/basic/styles/tooltip.global.css +2 -0
  134. package/dist-esm/basic/styles/tooltip.global.css.map +1 -0
  135. package/dist-esm/basic/styles/zoom-view.global.css +2 -0
  136. package/dist-esm/basic/styles/zoom-view.global.css.map +1 -0
  137. package/dist-esm/desktop-app/DesktopApp.js +65 -80
  138. package/dist-esm/desktop-app/MobileDesktopApp.js +20 -23
  139. package/dist-esm/html-editor/AtomHtmlEditor.js +243 -268
  140. package/dist-esm/html-editor/HtmlEditorCommands.js +6 -4
  141. package/dist-esm/html-editor/InlineHtmlEditor.js +174 -166
  142. package/dist-esm/html-editor/RangeEditor.js +49 -51
  143. package/dist-esm/html-editor/commands/AddImage.js +40 -35
  144. package/dist-esm/html-editor/commands/AddLink.js +56 -54
  145. package/dist-esm/html-editor/commands/AddLink.local.css +2 -0
  146. package/dist-esm/html-editor/commands/AddLink.local.css.map +1 -0
  147. package/dist-esm/html-editor/commands/Align.js +24 -7
  148. package/dist-esm/html-editor/commands/AttachFile.js +23 -13
  149. package/dist-esm/html-editor/commands/AttachImage.js +35 -25
  150. package/dist-esm/html-editor/commands/Bold.js +10 -11
  151. package/dist-esm/html-editor/commands/ChangeColor.js +31 -107
  152. package/dist-esm/html-editor/commands/ChangeColor.local.css +2 -0
  153. package/dist-esm/html-editor/commands/ChangeColor.local.css.map +1 -0
  154. package/dist-esm/html-editor/commands/ChangeFont.js +42 -42
  155. package/dist-esm/html-editor/commands/ChangeFont.local.css +2 -0
  156. package/dist-esm/html-editor/commands/ChangeFont.local.css.map +1 -0
  157. package/dist-esm/html-editor/commands/ChangeFontSize.js +15 -5
  158. package/dist-esm/html-editor/commands/Command.js +34 -16
  159. package/dist-esm/html-editor/commands/CommandButton.js +51 -32
  160. package/dist-esm/html-editor/commands/Headings.js +25 -9
  161. package/dist-esm/html-editor/commands/HorizontalRule.js +9 -10
  162. package/dist-esm/html-editor/commands/HtmlCommands.js +160 -65
  163. package/dist-esm/html-editor/commands/IndentLess.js +10 -11
  164. package/dist-esm/html-editor/commands/IndentMore.js +10 -11
  165. package/dist-esm/html-editor/commands/Italic.js +10 -11
  166. package/dist-esm/html-editor/commands/NumberedList.js +10 -11
  167. package/dist-esm/html-editor/commands/Quote.js +10 -11
  168. package/dist-esm/html-editor/commands/RemoveFormat.js +10 -11
  169. package/dist-esm/html-editor/commands/Separator.global.css +2 -0
  170. package/dist-esm/html-editor/commands/Separator.global.css.map +1 -0
  171. package/dist-esm/html-editor/commands/Separator.js +5 -4
  172. package/dist-esm/html-editor/commands/Source.js +29 -25
  173. package/dist-esm/html-editor/commands/Source.local.css +2 -0
  174. package/dist-esm/html-editor/commands/Source.local.css.map +1 -0
  175. package/dist-esm/html-editor/commands/StrikeThrough.js +10 -11
  176. package/dist-esm/html-editor/commands/Toolbar.js +6 -4
  177. package/dist-esm/html-editor/commands/Underline.js +10 -11
  178. package/dist-esm/html-editor/commands/Unlink.js +10 -9
  179. package/dist-esm/html-editor/commands/UnorderedList.js +10 -11
  180. package/dist-esm/mobile-app/BottomPopup.js +137 -148
  181. package/dist-esm/mobile-app/MasterDetailPage.global.css +2 -0
  182. package/dist-esm/mobile-app/MasterDetailPage.global.css.map +1 -0
  183. package/dist-esm/mobile-app/MasterDetailPage.js +153 -152
  184. package/dist-esm/mobile-app/MobileApp.global.css +2 -0
  185. package/dist-esm/mobile-app/MobileApp.global.css.map +1 -0
  186. package/dist-esm/mobile-app/MobileApp.js +577 -569
  187. package/dist-esm/mobile-app/bottom-popup.global.css +2 -0
  188. package/dist-esm/mobile-app/bottom-popup.global.css.map +1 -0
  189. package/dist-esm/player/AtomVideoPlayer.global.css +2 -0
  190. package/dist-esm/player/AtomVideoPlayer.global.css.map +1 -0
  191. package/dist-esm/player/AtomVideoPlayer.js +316 -270
  192. package/dist-esm/player/TrackProgress.js +11 -7
  193. package/dist-esm/player/input-range-style.js +97 -98
  194. package/dist-esm/styles/atom-html-editor.global.css +2 -0
  195. package/dist-esm/styles/atom-html-editor.global.css.map +1 -0
  196. package/dist-esm/styles/button-bar.global.css +2 -0
  197. package/dist-esm/styles/button-bar.global.css.map +1 -0
  198. package/dist-esm/styles/desktop-app.global.css +2 -0
  199. package/dist-esm/styles/desktop-app.global.css.map +1 -0
  200. package/dist-esm/styles/form.global.css +2 -0
  201. package/dist-esm/styles/form.global.css.map +1 -0
  202. package/dist-esm/styles/html-editor-toolbar.global.css +2 -0
  203. package/dist-esm/styles/html-editor-toolbar.global.css.map +1 -0
  204. package/dist-esm/styles/inline-html-editor.global.css +2 -0
  205. package/dist-esm/styles/inline-html-editor.global.css.map +1 -0
  206. package/dist-esm/styles/limited-text.global.css +2 -0
  207. package/dist-esm/styles/limited-text.global.css.map +1 -0
  208. package/dist-esm/styles/resizable.global.css +2 -0
  209. package/dist-esm/styles/resizable.global.css.map +1 -0
  210. package/dist-esm/styles/track-progress.global.css +2 -0
  211. package/dist-esm/styles/track-progress.global.css.map +1 -0
  212. package/dist-esm/styles/type-writer.global.css +2 -0
  213. package/dist-esm/styles/type-writer.global.css.map +1 -0
  214. package/dist-esm/tests/app-test/AppTestApp.js +12 -15
  215. package/dist-esm/tests/app-test/AppTestApp.pack.js +54 -0
  216. package/dist-esm/tests/app-test/commands/AppCommands.js +14 -11
  217. package/dist-esm/tests/app-test/drawer/AppDrawer.js +4 -6
  218. package/dist-esm/tests/app-test/model/model.js +1 -2
  219. package/dist-esm/tests/app-test/pages/detail/DetailPage.js +21 -15
  220. package/dist-esm/tests/app-test/pages/home/HomePage.js +7 -8
  221. package/dist-esm/tests/app-test/pages/list/ListPage.js +79 -62
  222. package/dist-esm/tests/app-test/pages/list/ListPage.local.css +2 -0
  223. package/dist-esm/tests/app-test/pages/list/ListPage.local.css.map +1 -0
  224. package/dist-esm/tests/basic/PopupTest.js +9 -7
  225. package/dist-esm/tests/basic/TimeEditorTest.js +5 -9
  226. package/dist-esm/tests/basic/TimeEditorTest.pack.js +39 -0
  227. package/dist-esm/tests/basic/TimerTest.js +27 -37
  228. package/dist-esm/tests/basic/TimerTest.pack.js +40 -0
  229. package/dist-esm/tests/basic/basic-form/BasicForm.js +47 -27
  230. package/dist-esm/tests/basic/basic-form/BasicForm.pack.js +44 -0
  231. package/dist-esm/tests/basic/calendar/BasicCalendarTest.js +5 -9
  232. package/dist-esm/tests/basic/calendar/BasicCalendarTest.pack.js +53 -0
  233. package/dist-esm/tests/basic/chips/ChipsTest.js +25 -15
  234. package/dist-esm/tests/basic/chips/ChipsTest.local.css +2 -0
  235. package/dist-esm/tests/basic/chips/ChipsTest.local.css.map +1 -0
  236. package/dist-esm/tests/basic/chips/ChipsTest.pack.js +56 -0
  237. package/dist-esm/tests/basic/data-grid/DataGridTest.js +55 -60
  238. package/dist-esm/tests/basic/data-grid/DataGridTest.pack.js +58 -0
  239. package/dist-esm/tests/basic/date/DateFieldTest.js +21 -96
  240. package/dist-esm/tests/basic/date/DateFieldTest.pack.js +57 -0
  241. package/dist-esm/tests/basic/drop-down/DropDownTest.js +25 -19
  242. package/dist-esm/tests/basic/drop-down/DropDownTest.pack.js +52 -0
  243. package/dist-esm/tests/basic/drop-down-input/DropDownTest.js +32 -32
  244. package/dist-esm/tests/basic/drop-down-input/DropDownTest.pack.js +54 -0
  245. package/dist-esm/tests/basic/expander/ExpanderMenuTest.js +20 -14
  246. package/dist-esm/tests/basic/expander/ExpanderMenuTest.pack.js +38 -0
  247. package/dist-esm/tests/basic/expander/ExpanderTest.js +11 -12
  248. package/dist-esm/tests/basic/expander/ExpanderTest.pack.js +38 -0
  249. package/dist-esm/tests/basic/form2/Form2Test.js +26 -24
  250. package/dist-esm/tests/basic/form2/Form2Test.pack.js +46 -0
  251. package/dist-esm/tests/basic/limited-text/LimitedTextTest.js +14 -11
  252. package/dist-esm/tests/basic/limited-text/LimitedTextTest.pack.js +38 -0
  253. package/dist-esm/tests/basic/pinch-zoom/PinchZoomViewTest.global.css +2 -0
  254. package/dist-esm/tests/basic/pinch-zoom/PinchZoomViewTest.global.css.map +1 -0
  255. package/dist-esm/tests/basic/pinch-zoom/PinchZoomViewTest.js +14 -14
  256. package/dist-esm/tests/basic/pinch-zoom/PinchZoomViewTest.pack.js +38 -0
  257. package/dist-esm/tests/basic/repeater/DragDropRepater.js +30 -12
  258. package/dist-esm/tests/basic/repeater/DragDropRepater.pack.js +51 -0
  259. package/dist-esm/tests/basic/repeater/RepeaterTest.js +45 -35
  260. package/dist-esm/tests/basic/repeater/RepeaterTest.pack.js +52 -0
  261. package/dist-esm/tests/basic/swipe/SwipeTest.js +13 -13
  262. package/dist-esm/tests/basic/swipe/SwipeTest.local.css +2 -0
  263. package/dist-esm/tests/basic/swipe/SwipeTest.local.css.map +1 -0
  264. package/dist-esm/tests/basic/swipe/SwipeTest.pack.js +52 -0
  265. package/dist-esm/tests/basic/switch-test/SwitchTest.js +8 -10
  266. package/dist-esm/tests/basic/switch-test/SwitchTest.pack.js +38 -0
  267. package/dist-esm/tests/basic/title-editor/TitleEditorTest.js +8 -9
  268. package/dist-esm/tests/basic/title-editor/TitleEditorTest.pack.js +38 -0
  269. package/dist-esm/tests/basic/tooltip/TooltipTest.js +30 -24
  270. package/dist-esm/tests/basic/tooltip/TooltipTest.pack.js +52 -0
  271. package/dist-esm/tests/basic/typewriter/TypeWriter.js +10 -9
  272. package/dist-esm/tests/basic/typewriter/TypeWriter.pack.js +39 -0
  273. package/dist-esm/tests/basic/video/AtomVideoTest.js +13 -10
  274. package/dist-esm/tests/basic/video/AtomVideoTest.local.css +2 -0
  275. package/dist-esm/tests/basic/video/AtomVideoTest.local.css.map +1 -0
  276. package/dist-esm/tests/basic/video/AtomVideoTest.pack.js +38 -0
  277. package/dist-esm/tests/basic/zoom/ZoomViewTest.js +13 -13
  278. package/dist-esm/tests/basic/zoom/ZoomViewTest.local.css +2 -0
  279. package/dist-esm/tests/basic/zoom/ZoomViewTest.local.css.map +1 -0
  280. package/dist-esm/tests/basic/zoom/ZoomViewTest.pack.js +38 -0
  281. package/dist-esm/tests/check-box-list/CheckBoxListSample.js +13 -12
  282. package/dist-esm/tests/check-box-list/CheckBoxListSample.pack.js +52 -0
  283. package/dist-esm/tests/data-grid/GridTestViewModel.js +203 -227
  284. package/dist-esm/tests/form/CustomHelp.js +6 -9
  285. package/dist-esm/tests/form/FormViewModel.js +21 -28
  286. package/dist-esm/tests/html-editor/HtmlEditorTest.js +7 -37
  287. package/dist-esm/tests/html-editor/HtmlEditorTest.pack.js +83 -0
  288. package/dist-esm/tests/html-editor/InlineHtmlEdiorTest.js +9 -38
  289. package/dist-esm/tests/html-editor/InlineHtmlEdiorTest.pack.js +85 -0
  290. package/dist-esm/tests/mask/MaskedInputTest.js +11 -12
  291. package/dist-esm/tests/mask/MaskedInputTest.pack.js +38 -0
  292. package/dist-esm/tests/mobile-app/DesktopAppTest.js +8 -9
  293. package/dist-esm/tests/mobile-app/DesktopAppTest.pack.js +60 -0
  294. package/dist-esm/tests/mobile-app/MobileAppTest.js +64 -53
  295. package/dist-esm/tests/mobile-app/MobileAppTest.pack.js +55 -0
  296. package/dist-esm/tests/pop-over/PopOverTest.js +37 -77
  297. package/dist-esm/tests/switch/SwitchTest.js +9 -8
  298. package/dist-esm/tests/toggle-view/ToggleView.local.css +2 -0
  299. package/dist-esm/tests/toggle-view/ToggleView.local.css.map +1 -0
  300. package/dist-esm/tests/toggle-view/ToggleViewTest.js +15 -22
  301. package/dist-esm/tests/toggle-view/ToggleViewTest.pack.js +45 -0
  302. package/dist-esm/toggle-view/AtomToggleView.js +77 -73
  303. package/dist-esm/tsconfig.esm.tsbuildinfo +1 -1
  304. package/package.json +3 -3
@@ -0,0 +1,2 @@
1
+ [data-bottom-popup]{background-color:#fff;border-top-left-radius:5px;border-top-right-radius:5px;bottom:0;display:grid;grid-template-columns:auto 1fr auto;grid-template-rows:auto auto auto;left:0;margin-left:2px;margin-right:2px;position:absolute;right:0}[data-bottom-popup]>[data-element=bar]{background-color:#d3d3d3;border-top-left-radius:5px;border-top-right-radius:5px;grid-column:1/span 3;grid-row:1;z-index:10}[data-bottom-popup]>[data-element=icon]{align-self:center;grid-column:1;grid-row:1;margin-right:5px;padding:5px;z-index:11}[data-bottom-popup]>[data-element=close]{align-self:center;grid-column:3;grid-row:1;margin-left:5px;padding:5px;z-index:11}[data-bottom-popup]>[data-element=title]{grid-column:2;grid-row:1;padding:5px;z-index:11}[data-bottom-popup]>[data-element=content]{grid-column:1/span 3;grid-row:2;padding:5px;z-index:11}[data-bottom-popup]>[data-element=footer]{grid-column:1/span 3;grid-row:3;margin-top:5px;padding:5px;z-index:11}[data-bottom-popup-container]{background-color:rgba(0,0,0,.3);bottom:0;left:0;position:absolute;right:0;top:0;z-index:500}
2
+ /*# sourceMappingURL=bottom-popup.global.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/mobile-app/bottom-popup.global.css"],"names":[],"mappings":"AAAA,oBAYI,qBAAyB,CALzB,0BAA2B,CAC3B,2BAA4B,CAJ5B,QAAW,CAKX,YAAa,CACb,mCAAoC,CACpC,iCAAkC,CATlC,MAAS,CAGT,eAAgB,CAChB,gBAAiB,CALjB,iBAAkB,CAElB,OA2DJ,CAhDI,uCAKI,wBAAyB,CAJzB,0BAA2B,CAC3B,2BAA4B,CAE5B,oBAAuB,CADvB,UAAW,CAGX,UACJ,CAEA,wCAII,iBAAkB,CAFlB,aAAc,CADd,UAAW,CAIX,gBAAiB,CAFjB,WAAY,CAGZ,UACJ,CAEA,yCAKI,iBAAkB,CAHlB,aAAc,CADd,UAAW,CAGX,eAAgB,CADhB,WAAY,CAGZ,UACJ,CAEA,yCAEI,aAAc,CADd,UAAW,CAEX,WAAY,CACZ,UACJ,CAEA,2CAGI,oBAAuB,CADvB,UAAW,CADX,WAAY,CAGZ,UACJ,CAEA,0CAEI,oBAAuB,CADvB,UAAW,CAEX,cAAe,CACf,WAAY,CACZ,UACJ,CAGJ,8BAMI,+BAAiC,CAFjC,QAAS,CAFT,MAAO,CADP,iBAAkB,CAIlB,OAAQ,CAFR,KAAM,CAIN,WACJ","file":"bottom-popup.global.css"}
@@ -0,0 +1,2 @@
1
+ [data-video-player=video-player]{display:grid;grid-template-columns:auto 1fr auto;grid-template-rows:auto 1fr auto auto auto;overflow:hidden}[data-video-player=video-player]>[data-element=banner]{align-items:center;align-self:end;background-color:#000;border-radius:10px;color:#fff;display:none;gap:5px;grid-column-end:span 3;grid-column-start:1;grid-row-end:span 3;grid-row-start:3;grid-template-columns:auto 1fr;grid-template-rows:auto auto;height:15%;justify-items:stretch;justify-self:center;overflow:hidden;padding:10px;z-index:2}[data-video-player=video-player]>[data-element=banner][data-has-logo=true]{display:grid}[data-video-player=video-player]>[data-element=banner]>*{min-height:0;min-width:0}[data-video-player=video-player]>[data-element=banner]>[data-element=logo]{grid-column:1;grid-row:1/span 2;height:100%;z-index:2}[data-video-player=video-player]>[data-element=banner]>[data-element=logo-title]{font-weight:700;grid-column-start:2;grid-row-start:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;z-index:2}[data-video-player=video-player]>[data-element=banner]>[data-element=logo-description]{font-size:smaller;grid-column-start:2;grid-row-start:2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;z-index:2}[data-video-player=video-player]>[data-element=poster],[data-video-player=video-player]>[data-element=video]{align-self:stretch;grid-column-end:span 3;grid-column-start:1;grid-row-end:span 5;grid-row-start:1;justify-self:stretch}[data-video-player=video-player]>[data-element=play-element]{align-items:center;align-self:center;display:flex;flex-direction:row;gap:4px;grid-column-end:span 3;grid-column-start:1;grid-row-end:span 5;grid-row-start:1;justify-content:center;justify-self:center;z-index:10}[data-video-player=video-player]>[data-element=play-element]>button.play{align-items:center;background-color:#00f;border-radius:9999px;color:#fff;display:inline-flex;font-size:25px;height:50px;justify-content:center;padding:10px;text-align:center;vertical-align:middle;width:50px}[data-video-player=video-player]>[data-element=play-element]>button.play>i{margin-left:4px}[data-video-player=video-player]>[data-element=progress]{align-self:flex-end;background-color:rgba(0,0,0,.3);cursor:pointer;grid-column-end:span 3;grid-column-start:1;grid-row-start:4;height:15px;justify-self:stretch;padding-bottom:5px;padding-top:5px;width:100%;z-index:11}[data-video-player=video-player]>[data-element=toolbar]{align-items:center;background-color:rgba(0,0,0,.3);color:#fff;display:flex;flex-direction:row;gap:4px;grid-column-end:span 3;grid-column-start:1;grid-row-start:5;justify-content:flex-start;z-index:10}[data-video-player=video-player]>[data-element=toolbar]>*{margin-left:5px;min-width:20px;padding:5px}[data-video-player=video-player]>[data-element=toolbar]>[data-style=button]{height:30px;padding:5px;width:30px}[data-video-player=video-player]>[data-element=toolbar]>[data-font-size=small]{font-size:x-small}[data-video-player=video-player]>[data-element=toolbar]>[data-element=volume-range]{border:none;box-shadow:none;color:green;height:2px}[data-video-player=video-player]>[data-element=toolbar]>[data-element=volume-range]:focus{border:none;box-shadow:none}[data-video-player=video-player]>[data-element=toolbar]>[data-element=full-screen]{margin-left:auto}[data-video-player=video-player][data-controls=true]>[data-element=progress],[data-video-player=video-player][data-controls=true]>[data-element=toolbar]{display:flex}[data-video-player=video-player][data-state=paused]>[data-element=toolbar]>[data-element-pause],[data-video-player=video-player][data-state=playing][data-controls=false]>[data-element=play-element],[data-video-player=video-player][data-state=playing][data-controls=false]>[data-element=progress],[data-video-player=video-player][data-state=playing][data-controls=false]>[data-element=toolbar],[data-video-player=video-player][data-state=waiting]>[data-element=play-element],[data-video-player=video-player][data-state=waiting]>[data-element=toolbar]>[data-element=play],[data-video-player=video-player][data-state=waiting][data-controls=false]>[data-element=progress],[data-video-player=video-player][data-state=waiting][data-controls=false]>[data-element=toolbar]{display:none}
2
+ /*# sourceMappingURL=AtomVideoPlayer.global.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/player/AtomVideoPlayer.global.css"],"names":[],"mappings":"AAAA,iCACI,YAAa,CAEb,mCAAoC,CADpC,0CAA2C,CAE3C,eAyNJ,CAvNI,uDAyBI,kBAAmB,CAlBnB,cAAe,CAWf,qBAAuB,CAGvB,kBAAmB,CAFnB,UAAY,CAUZ,YAAa,CAlBb,OAAQ,CANR,sBAAuB,CADvB,mBAAoB,CADpB,mBAAoB,CADpB,gBAAiB,CAajB,8BAA+B,CAC/B,4BAA6B,CAP7B,UAAW,CAiBX,qBAAsB,CAlBtB,mBAAoB,CAKpB,eAAgB,CAUhB,YAAa,CAIb,SAuCJ,CAnCI,2EACI,YACJ,CAEA,yDACI,YAAa,CACb,WACJ,CAEA,2EAEI,aAAc,CADd,iBAAoB,CAGpB,WAAY,CADZ,SAEJ,CAEA,iFAII,eAAiB,CAFjB,mBAAoB,CADpB,gBAAiB,CAIjB,eAAgB,CAEhB,sBAAuB,CADvB,kBAAmB,CAHnB,SAKJ,CAEA,uFAII,iBAAkB,CAFlB,mBAAoB,CADpB,gBAAiB,CAIjB,eAAgB,CAEhB,sBAAuB,CADvB,kBAAmB,CAHnB,SAKJ,CAGJ,6GAKI,kBAAmB,CADnB,sBAAuB,CADvB,mBAAoB,CADpB,mBAAoB,CADpB,gBAAiB,CAKjB,oBACJ,CAEA,6DASI,kBAAmB,CAHnB,iBAAkB,CAMlB,YAAa,CAJb,kBAAmB,CAGnB,OAAQ,CANR,sBAAuB,CADvB,mBAAoB,CADpB,mBAAoB,CADpB,gBAAiB,CAQjB,sBAAuB,CAHvB,mBAAoB,CANpB,UA8BJ,CAjBI,yEAEI,kBAAmB,CAGnB,qBAAyB,CACzB,oBAAqB,CAFrB,UAAc,CAHd,mBAAoB,CAMpB,cAAe,CAGf,WAAY,CAPZ,sBAAuB,CAKvB,YAAa,CAGb,iBAAkB,CAClB,qBAAsB,CAHtB,UAOJ,CAHI,2EACI,eACJ,CAIR,yDAKI,mBAAoB,CAKpB,+BAAiC,CAEjC,cAAe,CARf,sBAAuB,CADvB,mBAAoB,CADpB,gBAAiB,CAIjB,WAAY,CAGZ,oBAAqB,CADrB,kBAAmB,CADnB,eAAgB,CAIhB,UAAW,CAVX,UAYJ,CAEA,wDAQI,kBAAmB,CAHnB,+BAAiC,CACjC,UAAc,CAKd,YAAa,CAJb,kBAAmB,CAGnB,OAAQ,CANR,sBAAuB,CADvB,mBAAoB,CADpB,gBAAiB,CAOjB,0BAA2B,CAR3B,UA4CJ,CAhCI,0DAEI,eAAgB,CADhB,cAAe,CAEf,WACJ,CAEA,4EAEI,WAAY,CACZ,WAAY,CAFZ,UAGJ,CAEA,+EACI,iBACJ,CAEA,oFAII,WAAY,CADZ,eAAgB,CADhB,WAAc,CADd,UAIJ,CAEA,0FAEI,WAAY,CADZ,eAEJ,CAEA,mFACI,gBACJ,CASA,yJACI,YACJ,CA+BI,6vBACI,YACJ","file":"AtomVideoPlayer.global.css"}
@@ -6,298 +6,344 @@ import XNode from "@web-atoms/core/dist/core/XNode.js";
6
6
  import { AtomControl } from "@web-atoms/core/dist/web/controls/AtomControl.js";
7
7
  import { ChildEnumerator } from "@web-atoms/core/dist/web/core/AtomUI.js";
8
8
  const isTouchEnabled = /android|iPhone|iPad/i.test(navigator.userAgent);
9
- import "./AtomVideoPlayer.global.css";
9
+ ESMPack.installStyleSheet(import.meta.resolve("./AtomVideoPlayer.global.css"));
10
10
  const gatherElements = (e, data = {}) => {
11
- const ce = ChildEnumerator.enumerate(e);
12
- for (const iterator of ce) {
13
- const elementName = iterator.dataset.element?.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
14
- if (elementName) {
15
- data[elementName] = iterator;
16
- }
17
- gatherElements(iterator, data);
11
+ const ce = ChildEnumerator.enumerate(e);
12
+ for (const iterator of ce) {
13
+ const elementName = iterator.dataset.element?.replace(/-([a-z])/g, g => g[1].toUpperCase());
14
+ if (elementName) {
15
+ data[elementName] = iterator;
18
16
  }
19
- return data;
17
+ gatherElements(iterator, data);
18
+ }
19
+ return data;
20
20
  };
21
- const numberToText = (n) => {
22
- if (n < 10) {
23
- return "0" + n;
24
- }
25
- return n.toString();
21
+ const numberToText = n => {
22
+ if (n < 10) {
23
+ return "0" + n;
24
+ }
25
+ return n.toString();
26
26
  };
27
27
  const durationText = (n, total) => {
28
- if (n === null || n === undefined) {
29
- return "";
30
- }
31
- const minutes = Math.floor(n / 60);
32
- const seconds = numberToText(Math.ceil(n % 60));
33
- const totalMinutes = Math.floor(total / 60);
34
- const totalSeconds = numberToText(Math.ceil(total % 60));
35
- return `${minutes}:${seconds} / ${totalMinutes}:${totalSeconds}`;
28
+ if (n === null || n === undefined) {
29
+ return "";
30
+ }
31
+ const minutes = Math.floor(n / 60);
32
+ const seconds = numberToText(Math.ceil(n % 60));
33
+ const totalMinutes = Math.floor(total / 60);
34
+ const totalSeconds = numberToText(Math.ceil(total % 60));
35
+ return `${minutes}:${seconds} / ${totalMinutes}:${totalSeconds}`;
36
36
  };
37
37
  const noSoundIcon = "fa-duotone fa-volume-slash";
38
38
  const mute = "fa-duotone fa-volume-xmark";
39
39
  const low = "fa-duotone fa-volume-low";
40
40
  const mid = "fa-duotone fa-volume";
41
41
  const high = "fa-duotone fa-volume-high";
42
- const getPlayIcon = (state) => {
43
- switch (state) {
44
- case "ended":
45
- return "fa-solid fa-refresh";
46
- case "paused":
47
- return "fa-solid fa-play";
48
- case "playing":
49
- return "fa-solid fa-pause";
50
- }
51
- return "fa-solid fa-play";
42
+ const getPlayIcon = state => {
43
+ switch (state) {
44
+ case "ended":
45
+ return "fa-solid fa-refresh";
46
+ case "paused":
47
+ return "fa-solid fa-play";
48
+ case "playing":
49
+ return "fa-solid fa-pause";
50
+ }
51
+ return "fa-solid fa-play";
52
52
  };
53
53
  export default class AtomVideoPlayer extends AtomControl {
54
- constructor() {
55
- super(...arguments);
56
- this.maxWidth = "";
57
- }
58
- get poster() {
59
- return this.video.poster;
60
- }
61
- set poster(v) {
62
- this.video.poster = v;
63
- }
64
- get state() {
65
- return this.element.getAttribute("data-state");
66
- }
67
- set state(v) {
68
- this.element.setAttribute("data-state", v);
69
- AtomBinder.refreshValue(this, "paused");
70
- AtomBinder.refreshValue(this, "state");
71
- }
72
- get duration() {
73
- return this.video.duration;
54
+ constructor() {
55
+ super(...arguments);
56
+ this.maxWidth = "";
57
+ }
58
+ get poster() {
59
+ return this.video.poster;
60
+ }
61
+ set poster(v) {
62
+ this.video.poster = v;
63
+ }
64
+ get state() {
65
+ return this.element.getAttribute("data-state");
66
+ }
67
+ set state(v) {
68
+ this.element.setAttribute("data-state", v);
69
+ AtomBinder.refreshValue(this, "paused");
70
+ AtomBinder.refreshValue(this, "state");
71
+ }
72
+ get duration() {
73
+ return this.video.duration;
74
+ }
75
+ get time() {
76
+ return this.video.currentTime;
77
+ }
78
+ set time(v) {
79
+ this.video.currentTime = v;
80
+ }
81
+ get paused() {
82
+ return this.video.paused;
83
+ }
84
+ get isFullScreen() {
85
+ return (document.fullscreenEnabled && this.element === document.fullscreenElement) ?? false;
86
+ }
87
+ stopFullscreen() {
88
+ if (this.isFullScreen) {
89
+ return document.exitFullscreen();
74
90
  }
75
- get time() {
76
- return this.video.currentTime;
91
+ return Promise.resolve();
92
+ }
93
+ pause() {
94
+ this.video.pause();
95
+ }
96
+ play() {
97
+ this.video.play().catch(console.error);
98
+ }
99
+ onPropertyChanged(name) {
100
+ switch (name) {
101
+ case "source":
102
+ this.updateSource();
103
+ break;
77
104
  }
78
- set time(v) {
79
- this.video.currentTime = v;
80
- }
81
- get paused() {
82
- return this.video.paused;
83
- }
84
- get isFullScreen() {
85
- return (document.fullscreenEnabled && this.element === document.fullscreenElement) ?? false;
86
- }
87
- stopFullscreen() {
88
- if (this.isFullScreen) {
89
- return document.exitFullscreen();
105
+ }
106
+ setCurrentTime(n) {
107
+ this.video.currentTime = n * this.video.duration;
108
+ }
109
+ create() {
110
+ this.element.dataset.videoPlayer = "video-player";
111
+ this.bindEvent(this.element, "togglePlay", e => {
112
+ if (e.defaultPrevented) {
113
+ return;
114
+ }
115
+ e.preventDefault();
116
+ if (isTouchEnabled) {
117
+ if (this.state === "playing") {
118
+ if (e.target === this.video) {
119
+ if (this.element.dataset.controls === "true") {
120
+ this.element.dataset.controls = "false";
121
+ } else {
122
+ this.element.dataset.controls = "true";
123
+ }
124
+ return;
125
+ }
90
126
  }
91
- return Promise.resolve();
92
- }
93
- pause() {
127
+ if (e.target.tagName === "CANVAS") {
128
+ return;
129
+ }
130
+ }
131
+ if (this.video.paused) {
132
+ this.video.play();
133
+ this.element.dataset.controls = "false";
134
+ } else {
94
135
  this.video.pause();
95
- }
96
- play() {
97
- this.video.play().catch(console.error);
98
- }
99
- onPropertyChanged(name) {
100
- switch (name) {
101
- case "source":
102
- this.updateSource();
103
- break;
136
+ this.element.dataset.controls = "true";
137
+ }
138
+ });
139
+ this.bindEvent(this.element, "volume", e => {
140
+ this.video.muted = !this.video.muted;
141
+ this.updateVolume();
142
+ });
143
+ this.bindEvent(this.element, "fullScreen", async e => {
144
+ if (!this.element.requestFullscreen) {
145
+ this.video.webkitEnterFullscreen();
146
+ return;
147
+ }
148
+ if (this.isFullScreen) {
149
+ await document.exitFullscreen();
150
+ return;
151
+ }
152
+ await this.element.requestFullscreen({
153
+ navigationUI: "show"
154
+ });
155
+ });
156
+ this.bindEvent(document, "fullscreenchange", () => {
157
+ AtomBinder.refreshValue(this, "isFullScreen");
158
+ });
159
+ this.render(XNode.create("div", {
160
+ "data-click-event": "toggle-play",
161
+ "data-state": "pause"
162
+ }, XNode.create("div", {
163
+ "data-has-logo": Bind.oneWay(() => this.logo ? "true" : "false", "false"),
164
+ "data-element": "banner",
165
+ "style-width": Bind.oneWay(() => this.maxWidth)
166
+ }, XNode.create("img", {
167
+ "data-element": "logo",
168
+ src: Bind.oneWay(() => this.logo)
169
+ }), XNode.create("div", {
170
+ "data-element": "logo-title",
171
+ text: Bind.oneWay(() => this.logo && this.logoTitle)
172
+ }), XNode.create("div", {
173
+ "data-element": "logo-description",
174
+ text: Bind.oneWay(() => this.logo && this.logoDescription)
175
+ })), XNode.create("video", {
176
+ "event-abort": () => this.state = "aborted",
177
+ "event-durationchange": e => AtomBinder.refreshValue(this, "duration"),
178
+ "event-ended": async e => {
179
+ this.state = "ended";
180
+ if (document.fullscreenEnabled && this.element === document.fullscreenElement) {
181
+ await document.exitFullscreen();
104
182
  }
183
+ e.target.dispatchEvent(new CustomEvent("videoEnded", {
184
+ bubbles: true
185
+ }));
186
+ },
187
+ "event-loadedmetadata": () => {
188
+ this.updateVolume();
189
+ this.currentTimeSpan.textContent = durationText(0, this.duration);
190
+ this.updateProgress();
191
+ const {
192
+ video
193
+ } = this;
194
+ const {
195
+ videoWidth,
196
+ videoHeight
197
+ } = video;
198
+ const eW = video.offsetWidth * videoHeight / videoWidth;
199
+ const maxWidth = 100 * (this.element.offsetWidth - eW) / this.element.offsetWidth;
200
+ if (maxWidth > 50 && maxWidth < 100) {
201
+ this.maxWidth = `${maxWidth}%`;
202
+ }
203
+ AtomBinder.refreshValue(this, "duration");
204
+ },
205
+ "event-pause": () => this.state = "paused",
206
+ "event-play": () => this.state = "playing",
207
+ "event-progress": () => this.updateProgress(),
208
+ "event-timeupdate": () => {
209
+ this.currentTimeSpan.textContent = durationText(this.time, this.duration);
210
+ this.state = "playing";
211
+ this.updateProgress();
212
+ AtomBinder.refreshValue(this, "time");
213
+ },
214
+ "event-waiting": () => this.state = "waiting",
215
+ "event-volumechange": () => this.updateVolume(),
216
+ autoplay: false,
217
+ playsInline: true,
218
+ "style-max-width": "100%",
219
+ "style-max-height": "100%",
220
+ "data-element": "video"
221
+ }), XNode.create("canvas", {
222
+ "data-element": "progress"
223
+ }), XNode.create("img", {
224
+ "data-element": "poster"
225
+ }), XNode.create("div", {
226
+ "data-element": "toolbar"
227
+ }, XNode.create("i", {
228
+ "data-element": "play",
229
+ "data-style": "button",
230
+ class: Bind.oneWay(() => getPlayIcon(this.state))
231
+ }), XNode.create("i", {
232
+ "data-click-event": "volume",
233
+ "data-style": "button",
234
+ "data-element": "sound",
235
+ class: "fa-duotone fa-volume-slash"
236
+ }), !isTouchEnabled && XNode.create("input", {
237
+ "data-click-event": "none",
238
+ "data-element": "volume-range",
239
+ type: "range",
240
+ min: 0,
241
+ max: 1,
242
+ step: 0.1
243
+ }), XNode.create("span", {
244
+ "data-font-size": "small",
245
+ "data-element": "current",
246
+ text: "0:00"
247
+ }), XNode.create("i", {
248
+ "data-click-event": "full-screen",
249
+ "data-style": "button",
250
+ "data-element": "full-screen",
251
+ class: Bind.oneWay(() => this.isFullScreen ? "fa-solid fa-compress" : "fa-solid fa-expand")
252
+ })), XNode.create("div", {
253
+ "data-click-event": "toggle-play",
254
+ "data-element": "play-element"
255
+ }, XNode.create("button", {
256
+ class: "play"
257
+ }, XNode.create("i", {
258
+ class: Bind.oneWay(() => getPlayIcon(this.state))
259
+ })))));
260
+ const all = gatherElements(this.element);
261
+ this.video = all.video;
262
+ this.progress = all.progress;
263
+ this.currentTimeSpan = all.current;
264
+ this.soundIcon = all.sound;
265
+ this.volumeRange = all.volumeRange;
266
+ if (this.volumeRange) {
267
+ this.bindEvent(this.volumeRange, "input", () => {
268
+ setTimeout(() => {
269
+ this.video.volume = parseFloat(this.volumeRange.value);
270
+ }, 1);
271
+ });
105
272
  }
106
- setCurrentTime(n) {
107
- this.video.currentTime = n * this.video.duration;
273
+ this.bindEvent(this.element, "mouseenter", () => {
274
+ this.element.dataset.controls = "true";
275
+ });
276
+ this.bindEvent(this.element, "mouseleave", () => {
277
+ this.element.dataset.controls = "false";
278
+ });
279
+ this.bindEvent(this.progress, "pointerdown", e => {
280
+ e.preventDefault();
281
+ this.setCurrentTime(e.offsetX / this.progress.clientWidth);
282
+ const move = e1 => {
283
+ e1.preventDefault();
284
+ this.setCurrentTime(e1.offsetX / this.progress.clientWidth);
285
+ };
286
+ const up = e1 => {
287
+ e1.preventDefault();
288
+ this.progress.removeEventListener("pointermove", move);
289
+ this.progress.removeEventListener("pointerup", up);
290
+ };
291
+ this.progress.addEventListener("pointermove", move);
292
+ this.progress.addEventListener("pointerup", up);
293
+ });
294
+ }
295
+ updateSource() {
296
+ this.video.src = this.source;
297
+ }
298
+ updateProgress() {
299
+ const context = this.progress.getContext("2d");
300
+ context.strokeStyle = "rgba(0,0,0,0)";
301
+ const width = this.progress.clientWidth;
302
+ const height = this.progress.clientHeight;
303
+ this.progress.width = width;
304
+ this.progress.height = height;
305
+ context.clearRect(0, 0, width, height);
306
+ const max = this.video.duration;
307
+ const seekable = this.video.buffered;
308
+ const scale = width / max;
309
+ context.fillStyle = "rgba(255,255,255,0.3)";
310
+ context.fillRect(0, 0, width, height);
311
+ context.fillStyle = "rgba(255,255,255,0.6)";
312
+ for (let index = 0; index < seekable.length; index++) {
313
+ const start = seekable.start(index) * scale;
314
+ const end = seekable.end(index) * scale;
315
+ context.fillRect(start, 0, end, height);
108
316
  }
109
- create() {
110
- this.element.dataset.videoPlayer = "video-player";
111
- this.bindEvent(this.element, "togglePlay", (e) => {
112
- if (e.defaultPrevented) {
113
- return;
114
- }
115
- e.preventDefault();
116
- if (isTouchEnabled) {
117
- if (this.state === "playing") {
118
- if (e.target === this.video) {
119
- if (this.element.dataset.controls === "true") {
120
- this.element.dataset.controls = "false";
121
- }
122
- else {
123
- this.element.dataset.controls = "true";
124
- }
125
- return;
126
- }
127
- }
128
- if (e.target.tagName === "CANVAS") {
129
- return;
130
- }
131
- }
132
- if (this.video.paused) {
133
- this.video.play();
134
- this.element.dataset.controls = "false";
135
- }
136
- else {
137
- this.video.pause();
138
- this.element.dataset.controls = "true";
139
- }
140
- });
141
- this.bindEvent(this.element, "volume", (e) => {
142
- this.video.muted = !this.video.muted;
143
- this.updateVolume();
144
- });
145
- this.bindEvent(this.element, "fullScreen", async (e) => {
146
- if (!this.element.requestFullscreen) {
147
- this.video.webkitEnterFullscreen();
148
- return;
149
- }
150
- if (this.isFullScreen) {
151
- await document.exitFullscreen();
152
- return;
153
- }
154
- await this.element.requestFullscreen({ navigationUI: "show" });
155
- });
156
- this.bindEvent(document, "fullscreenchange", () => {
157
- AtomBinder.refreshValue(this, "isFullScreen");
158
- });
159
- this.render(XNode.create("div", { "data-click-event": "toggle-play", "data-state": "pause" },
160
- XNode.create("div", { "data-has-logo": Bind.oneWay(() => this.logo ? "true" : "false", "false"), "data-element": "banner", "style-width": Bind.oneWay(() => this.maxWidth) },
161
- XNode.create("img", { "data-element": "logo", src: Bind.oneWay(() => this.logo) }),
162
- XNode.create("div", { "data-element": "logo-title", text: Bind.oneWay(() => this.logo && this.logoTitle) }),
163
- XNode.create("div", { "data-element": "logo-description", text: Bind.oneWay(() => this.logo && this.logoDescription) })),
164
- XNode.create("video", { "event-abort": () => this.state = "aborted", "event-durationchange": (e) => AtomBinder.refreshValue(this, "duration"), "event-ended": async (e) => {
165
- this.state = "ended";
166
- if (document.fullscreenEnabled && this.element === document.fullscreenElement) {
167
- await document.exitFullscreen();
168
- }
169
- e.target.dispatchEvent(new CustomEvent("videoEnded", { bubbles: true }));
170
- }, "event-loadedmetadata": () => {
171
- this.updateVolume();
172
- this.currentTimeSpan.textContent = durationText(0, this.duration);
173
- this.updateProgress();
174
- const { video } = this;
175
- const { videoWidth, videoHeight } = video;
176
- const eW = video.offsetWidth * videoHeight / videoWidth;
177
- const maxWidth = (100 * (this.element.offsetWidth - eW) / this.element.offsetWidth);
178
- if (maxWidth > 50 && maxWidth < 100) {
179
- this.maxWidth = `${maxWidth}%`;
180
- }
181
- AtomBinder.refreshValue(this, "duration");
182
- }, "event-pause": () => this.state = "paused", "event-play": () => this.state = "playing", "event-progress": () => this.updateProgress(), "event-timeupdate": () => {
183
- this.currentTimeSpan.textContent = durationText(this.time, this.duration);
184
- this.state = "playing";
185
- this.updateProgress();
186
- AtomBinder.refreshValue(this, "time");
187
- }, "event-waiting": () => this.state = "waiting", "event-volumechange": () => this.updateVolume(), autoplay: false, playsInline: true, "style-max-width": "100%", "style-max-height": "100%", "data-element": "video" }),
188
- XNode.create("canvas", { "data-element": "progress" }),
189
- XNode.create("img", { "data-element": "poster" }),
190
- XNode.create("div", { "data-element": "toolbar" },
191
- XNode.create("i", { "data-element": "play", "data-style": "button", class: Bind.oneWay(() => getPlayIcon(this.state)) }),
192
- XNode.create("i", { "data-click-event": "volume", "data-style": "button", "data-element": "sound", class: "fa-duotone fa-volume-slash" }),
193
- !isTouchEnabled && XNode.create("input", { "data-click-event": "none", "data-element": "volume-range", type: "range", min: 0, max: 1, step: 0.1 }),
194
- XNode.create("span", { "data-font-size": "small", "data-element": "current", text: "0:00" }),
195
- XNode.create("i", { "data-click-event": "full-screen", "data-style": "button", "data-element": "full-screen", class: Bind.oneWay(() => this.isFullScreen
196
- ? "fa-solid fa-compress" :
197
- "fa-solid fa-expand") })),
198
- XNode.create("div", { "data-click-event": "toggle-play", "data-element": "play-element" },
199
- XNode.create("button", { class: "play" },
200
- XNode.create("i", { class: Bind.oneWay(() => getPlayIcon(this.state)) })))));
201
- const all = gatherElements(this.element);
202
- this.video = all.video;
203
- this.progress = all.progress;
204
- this.currentTimeSpan = all.current;
205
- this.soundIcon = all.sound;
206
- this.volumeRange = all.volumeRange;
207
- if (this.volumeRange) {
208
- this.bindEvent(this.volumeRange, "input", () => {
209
- setTimeout(() => {
210
- this.video.volume = parseFloat(this.volumeRange.value);
211
- }, 1);
212
- });
213
- }
214
- this.bindEvent(this.element, "mouseenter", () => {
215
- this.element.dataset.controls = "true";
216
- });
217
- this.bindEvent(this.element, "mouseleave", () => {
218
- this.element.dataset.controls = "false";
219
- });
220
- this.bindEvent(this.progress, "pointerdown", (e) => {
221
- e.preventDefault();
222
- this.setCurrentTime(e.offsetX / this.progress.clientWidth);
223
- const move = (e1) => {
224
- e1.preventDefault();
225
- this.setCurrentTime(e1.offsetX / this.progress.clientWidth);
226
- };
227
- const up = (e1) => {
228
- e1.preventDefault();
229
- this.progress.removeEventListener("pointermove", move);
230
- this.progress.removeEventListener("pointerup", up);
231
- };
232
- this.progress.addEventListener("pointermove", move);
233
- this.progress.addEventListener("pointerup", up);
234
- });
317
+ context.fillStyle = "#ffffff";
318
+ context.fillRect(0, 0, this.video.currentTime * scale, height);
319
+ }
320
+ updateVolume() {
321
+ if (this.video.muted) {
322
+ this.soundIcon.className = mute;
323
+ this.soundIcon.title = "Unmute";
324
+ if (this.volumeRange) {
325
+ this.volumeRange.style.display = "none";
326
+ }
327
+ return;
235
328
  }
236
- updateSource() {
237
- this.video.src = this.source;
329
+ const audio = this.video.volume;
330
+ if (this.volumeRange) {
331
+ this.volumeRange.style.display = "";
332
+ this.volumeRange.value = audio?.toString();
238
333
  }
239
- updateProgress() {
240
- const context = this.progress.getContext("2d");
241
- context.strokeStyle = "rgba(0,0,0,0)";
242
- const width = this.progress.clientWidth;
243
- const height = this.progress.clientHeight;
244
- this.progress.width = width;
245
- this.progress.height = height;
246
- context.clearRect(0, 0, width, height);
247
- const max = this.video.duration;
248
- const seekable = this.video.buffered;
249
- const scale = width / max;
250
- context.fillStyle = "rgba(255,255,255,0.3)";
251
- context.fillRect(0, 0, width, height);
252
- context.fillStyle = "rgba(255,255,255,0.6)";
253
- for (let index = 0; index < seekable.length; index++) {
254
- const start = seekable.start(index) * scale;
255
- const end = seekable.end(index) * scale;
256
- context.fillRect(start, 0, end, height);
257
- }
258
- context.fillStyle = "#ffffff";
259
- context.fillRect(0, 0, this.video.currentTime * scale, height);
334
+ this.soundIcon.title = "Mute";
335
+ if (audio > 0.8) {
336
+ this.soundIcon.className = high;
337
+ return;
260
338
  }
261
- updateVolume() {
262
- if (this.video.muted) {
263
- this.soundIcon.className = mute;
264
- this.soundIcon.title = "Unmute";
265
- if (this.volumeRange) {
266
- this.volumeRange.style.display = "none";
267
- }
268
- return;
269
- }
270
- const audio = this.video.volume;
271
- if (this.volumeRange) {
272
- this.volumeRange.style.display = "";
273
- this.volumeRange.value = audio?.toString();
274
- }
275
- this.soundIcon.title = "Mute";
276
- if (audio > 0.8) {
277
- this.soundIcon.className = high;
278
- return;
279
- }
280
- if (audio < 0.2) {
281
- this.soundIcon.className = low;
282
- return;
283
- }
284
- this.soundIcon.className = mid;
339
+ if (audio < 0.2) {
340
+ this.soundIcon.className = low;
341
+ return;
285
342
  }
343
+ this.soundIcon.className = mid;
344
+ }
286
345
  }
287
- __decorate([
288
- BindableProperty,
289
- __metadata("design:type", Object)
290
- ], AtomVideoPlayer.prototype, "source", void 0);
291
- __decorate([
292
- BindableProperty,
293
- __metadata("design:type", Object)
294
- ], AtomVideoPlayer.prototype, "logo", void 0);
295
- __decorate([
296
- BindableProperty,
297
- __metadata("design:type", String)
298
- ], AtomVideoPlayer.prototype, "logoTitle", void 0);
299
- __decorate([
300
- BindableProperty,
301
- __metadata("design:type", String)
302
- ], AtomVideoPlayer.prototype, "logoDescription", void 0);
303
- //# sourceMappingURL=AtomVideoPlayer.js.map
346
+ __decorate([BindableProperty, __metadata("design:type", Object)], AtomVideoPlayer.prototype, "source", void 0);
347
+ __decorate([BindableProperty, __metadata("design:type", Object)], AtomVideoPlayer.prototype, "logo", void 0);
348
+ __decorate([BindableProperty, __metadata("design:type", String)], AtomVideoPlayer.prototype, "logoTitle", void 0);
349
+ __decorate([BindableProperty, __metadata("design:type", String)], AtomVideoPlayer.prototype, "logoDescription", void 0);
@@ -1,9 +1,13 @@
1
1
  import XNode from "@web-atoms/core/dist/core/XNode.js";
2
- import "../styles/track-progress.global.css";
2
+ ESMPack.installStyleSheet(import.meta.resolve("../styles/track-progress.global.css"));
3
3
  export default function TrackProgress(a) {
4
- return XNode.create("div", { "data-track-progress": "track-progress" },
5
- XNode.create("div", { class: "available" }),
6
- XNode.create("div", { class: "done" }),
7
- XNode.create("div", { class: "thumb" }));
8
- }
9
- //# sourceMappingURL=TrackProgress.js.map
4
+ return XNode.create("div", {
5
+ "data-track-progress": "track-progress"
6
+ }, XNode.create("div", {
7
+ class: "available"
8
+ }), XNode.create("div", {
9
+ class: "done"
10
+ }), XNode.create("div", {
11
+ class: "thumb"
12
+ }));
13
+ }