@schukai/monster 3.51.5 → 3.52.1

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 (361) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +15 -12
  3. package/example/components/form/button.mjs +10 -0
  4. package/example/components/form/select.mjs +25 -0
  5. package/example/components/form/tree-select.mjs +27 -0
  6. package/example/components/host/host.mjs +0 -0
  7. package/example/components/notify/message.mjs +4 -0
  8. package/example/components/notify/notify.mjs +4 -0
  9. package/example/components/state/log.mjs +0 -0
  10. package/example/components/state/state.mjs +0 -0
  11. package/example/data/datasource/server/restapi.mjs +7 -1
  12. package/package.json +6 -2
  13. package/source/components/constants.mjs +132 -0
  14. package/source/components/datatable/columnbar.mjs +310 -0
  15. package/source/components/datatable/constants.mjs +121 -0
  16. package/source/components/datatable/dataset.mjs +219 -0
  17. package/source/components/datatable/datasource/dom.mjs +186 -0
  18. package/source/components/datatable/datasource/namespace.mjs +13 -0
  19. package/source/components/datatable/datasource/rest.mjs +400 -0
  20. package/source/components/datatable/datasource.mjs +102 -0
  21. package/source/components/datatable/datatable/header.mjs +268 -0
  22. package/source/components/datatable/datatable/namespace.mjs +13 -0
  23. package/source/components/datatable/datatable.mjs +789 -0
  24. package/source/components/datatable/embedded-pagination.mjs +113 -0
  25. package/source/components/datatable/filter/abstract-base.mjs +31 -0
  26. package/source/components/datatable/filter/date-range.mjs +1041 -0
  27. package/source/components/datatable/filter/input.mjs +175 -0
  28. package/source/components/datatable/filter/namespace.mjs +13 -0
  29. package/source/components/datatable/filter/range.mjs +671 -0
  30. package/source/components/datatable/filter/select.mjs +65 -0
  31. package/source/components/datatable/filter/settings.mjs +116 -0
  32. package/source/components/datatable/filter-button.mjs +98 -0
  33. package/source/components/datatable/filter.mjs +929 -0
  34. package/source/components/datatable/namespace.mjs +11 -0
  35. package/source/components/datatable/pagination.mjs +456 -0
  36. package/source/components/datatable/style/column-bar.pcss +123 -0
  37. package/source/components/datatable/style/dataset.pcss +13 -0
  38. package/source/components/datatable/style/datasource.pcss +16 -0
  39. package/source/components/datatable/style/datatable.pcss +239 -0
  40. package/source/components/datatable/style/embedded-pagination.pcss +101 -0
  41. package/source/components/datatable/style/filter-button.pcss +22 -0
  42. package/source/components/datatable/style/filter-controls-defaults.pcss +46 -0
  43. package/source/components/datatable/style/filter-date-range.pcss +9 -0
  44. package/source/components/datatable/style/filter-range.pcss +5 -0
  45. package/source/components/datatable/style/filter.pcss +156 -0
  46. package/source/components/datatable/style/pagination.pcss +59 -0
  47. package/source/components/datatable/style/select-filter.pcss +27 -0
  48. package/source/components/datatable/stylesheet/column-bar.mjs +27 -0
  49. package/source/components/datatable/stylesheet/dataset.mjs +27 -0
  50. package/source/components/datatable/stylesheet/datasource.mjs +27 -0
  51. package/source/components/datatable/stylesheet/datatable.mjs +27 -0
  52. package/source/components/datatable/stylesheet/embedded-pagination.mjs +27 -0
  53. package/source/components/datatable/stylesheet/filter-button.mjs +27 -0
  54. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +27 -0
  55. package/source/components/datatable/stylesheet/filter-date-range.mjs +27 -0
  56. package/source/components/datatable/stylesheet/filter-range.mjs +27 -0
  57. package/source/components/datatable/stylesheet/filter.mjs +27 -0
  58. package/source/components/datatable/stylesheet/namespace.mjs +13 -0
  59. package/source/components/datatable/stylesheet/pagination.mjs +27 -0
  60. package/source/components/datatable/stylesheet/select-filter.mjs +27 -0
  61. package/source/components/datatable/util.mjs +60 -0
  62. package/source/components/form/action-button.mjs +262 -0
  63. package/source/components/form/api-button.mjs +515 -0
  64. package/source/components/form/button-bar.mjs +739 -0
  65. package/source/components/form/button.mjs +350 -0
  66. package/source/components/form/confirm-button.mjs +330 -0
  67. package/source/components/form/constants.mjs +111 -0
  68. package/source/components/form/context-help.mjs +123 -0
  69. package/source/components/form/events.mjs +84 -0
  70. package/source/components/form/form.mjs +601 -0
  71. package/source/components/form/message-state-button.mjs +396 -0
  72. package/source/components/form/namespace.mjs +13 -0
  73. package/source/components/form/popper-button.mjs +435 -0
  74. package/source/components/form/popper.mjs +487 -0
  75. package/source/components/form/reload.mjs +360 -0
  76. package/source/components/form/select.mjs +2314 -0
  77. package/source/components/form/shadow-reload.mjs +137 -0
  78. package/source/components/form/state-button.mjs +182 -0
  79. package/source/components/form/style/action-button.pcss +41 -0
  80. package/source/components/form/style/api-button.pcss +0 -0
  81. package/source/components/form/style/button-bar.pcss +51 -0
  82. package/source/components/form/style/button.pcss +8 -0
  83. package/source/components/form/style/confirm-button.pcss +17 -0
  84. package/source/components/form/style/context-help.pcss +16 -0
  85. package/source/components/form/style/form.pcss +10 -0
  86. package/source/components/form/style/message-state-button.pcss +10 -0
  87. package/source/components/form/style/popper-button.pcss +16 -0
  88. package/source/components/form/style/popper.pcss +8 -0
  89. package/source/components/form/style/select.pcss +265 -0
  90. package/source/components/form/style/state-button.pcss +116 -0
  91. package/source/components/form/style/tabs.pcss +173 -0
  92. package/source/components/form/style/tree-select.pcss +81 -0
  93. package/source/components/form/stylesheet/action-button.mjs +27 -0
  94. package/source/components/form/stylesheet/api-button.mjs +27 -0
  95. package/source/components/form/stylesheet/button-bar.mjs +27 -0
  96. package/source/components/form/stylesheet/button.mjs +27 -0
  97. package/source/components/form/stylesheet/confirm-button.mjs +27 -0
  98. package/source/components/form/stylesheet/context-help.mjs +27 -0
  99. package/source/components/form/stylesheet/form.mjs +27 -0
  100. package/source/components/form/stylesheet/message-state-button.mjs +27 -0
  101. package/source/components/form/stylesheet/namespace.mjs +13 -0
  102. package/source/components/form/stylesheet/popper-button.mjs +27 -0
  103. package/source/components/form/stylesheet/popper.mjs +27 -0
  104. package/source/components/form/stylesheet/select.mjs +27 -0
  105. package/source/components/form/stylesheet/state-button.mjs +27 -0
  106. package/source/components/form/stylesheet/tabs.mjs +27 -0
  107. package/source/components/form/stylesheet/tree-select.mjs +27 -0
  108. package/source/components/form/tabs.mjs +1029 -0
  109. package/source/components/form/template.mjs +373 -0
  110. package/source/components/form/tree-select.mjs +527 -0
  111. package/source/components/form/types/namespace.mjs +13 -0
  112. package/source/components/form/types/state.mjs +93 -0
  113. package/source/components/form/util/fetch.mjs +133 -0
  114. package/source/components/form/util/floating-ui.mjs +245 -0
  115. package/source/components/form/util/namespace.mjs +13 -0
  116. package/source/components/form/util/popper.mjs +49 -0
  117. package/source/components/host/call-button.mjs +236 -0
  118. package/source/components/host/collapse.mjs +526 -0
  119. package/source/components/host/config-manager.mjs +304 -0
  120. package/source/components/host/constants.mjs +18 -0
  121. package/source/components/host/details.mjs +268 -0
  122. package/source/components/host/events.mjs +131 -0
  123. package/source/components/host/host.mjs +420 -0
  124. package/source/components/host/namespace.mjs +13 -0
  125. package/source/components/host/overlay.mjs +339 -0
  126. package/source/components/host/style/call-button.pcss +36 -0
  127. package/source/components/host/style/collapse.pcss +67 -0
  128. package/source/components/host/style/config-manager.pcss +5 -0
  129. package/source/components/host/style/details.pcss +68 -0
  130. package/source/components/host/style/host.pcss +43 -0
  131. package/source/components/host/style/overlay.pcss +73 -0
  132. package/source/components/host/style/toggle-button.pcss +36 -0
  133. package/source/components/host/style/viewer.pcss +13 -0
  134. package/source/components/host/stylesheet/call-button.mjs +27 -0
  135. package/source/components/host/stylesheet/collapse.mjs +27 -0
  136. package/source/components/host/stylesheet/config-manager.mjs +27 -0
  137. package/source/components/host/stylesheet/details.mjs +27 -0
  138. package/source/components/host/stylesheet/host.mjs +27 -0
  139. package/source/components/host/stylesheet/namespace.mjs +13 -0
  140. package/source/components/host/stylesheet/overlay.mjs +27 -0
  141. package/source/components/host/stylesheet/toggle-button.mjs +27 -0
  142. package/source/components/host/stylesheet/viewer.mjs +27 -0
  143. package/source/components/host/toggle-button.mjs +88 -0
  144. package/source/components/host/util.mjs +23 -0
  145. package/source/components/host/viewer.mjs +309 -0
  146. package/source/components/namespace.mjs +14 -0
  147. package/source/components/notify/constants.mjs +15 -0
  148. package/source/components/notify/events.mjs +15 -0
  149. package/source/components/notify/message.mjs +374 -0
  150. package/source/components/notify/namespace.mjs +15 -0
  151. package/source/components/notify/notify.mjs +236 -0
  152. package/source/components/notify/style/message.pcss +57 -0
  153. package/source/components/notify/style/notify.pcss +118 -0
  154. package/source/components/notify/stylesheet/message.mjs +27 -0
  155. package/source/components/notify/stylesheet/namespace.mjs +15 -0
  156. package/source/components/notify/stylesheet/notify.mjs +27 -0
  157. package/source/components/state/log/entry.mjs +126 -0
  158. package/source/components/state/log/namespace.mjs +13 -0
  159. package/source/components/state/log.mjs +275 -0
  160. package/source/components/state/namespace.mjs +13 -0
  161. package/source/components/state/state.mjs +131 -0
  162. package/source/components/state/style/log.pcss +111 -0
  163. package/source/components/state/style/state.pcss +113 -0
  164. package/source/components/state/stylesheet/log.mjs +27 -0
  165. package/source/components/state/stylesheet/state.mjs +27 -0
  166. package/source/components/style/badge.pcss +92 -0
  167. package/source/components/style/border.pcss +77 -0
  168. package/source/components/style/button.pcss +105 -0
  169. package/source/components/style/card.pcss +108 -0
  170. package/source/components/style/color.pcss +257 -0
  171. package/source/components/style/common.pcss +105 -0
  172. package/source/components/style/control.pcss +11 -0
  173. package/source/components/style/data-grid.pcss +43 -0
  174. package/source/components/style/display.pcss +42 -0
  175. package/source/components/style/floating-ui.pcss +33 -0
  176. package/source/components/style/form.pcss +5 -0
  177. package/source/components/style/host.pcss +15 -0
  178. package/source/components/style/link.pcss +63 -0
  179. package/source/components/style/mixin/badge.pcss +18 -0
  180. package/source/components/style/mixin/button.pcss +52 -0
  181. package/source/components/style/mixin/form.pcss +247 -0
  182. package/source/components/style/mixin/hover.pcss +8 -0
  183. package/source/components/style/mixin/media.pcss +107 -0
  184. package/source/components/style/mixin/property.pcss +292 -0
  185. package/source/components/style/mixin/skeleton.pcss +26 -0
  186. package/source/components/style/mixin/spinner.pcss +24 -0
  187. package/source/components/style/mixin/typography.pcss +52 -0
  188. package/source/components/style/normalize.pcss +14 -0
  189. package/source/components/style/popper.pcss +78 -0
  190. package/source/components/style/property.pcss +17 -0
  191. package/source/components/style/ripple.pcss +14 -0
  192. package/source/components/style/skeleton.pcss +28 -0
  193. package/source/components/style/space.pcss +47 -0
  194. package/source/components/style/spinner.pcss +6 -0
  195. package/source/components/style/table.pcss +46 -0
  196. package/source/components/style/theme.pcss +119 -0
  197. package/source/components/style/typography.pcss +131 -0
  198. package/source/components/stylesheet/badge.mjs +27 -0
  199. package/source/components/stylesheet/border.mjs +27 -0
  200. package/source/components/stylesheet/button.mjs +27 -0
  201. package/source/components/stylesheet/card.mjs +27 -0
  202. package/source/components/stylesheet/color.mjs +27 -0
  203. package/source/components/stylesheet/common.mjs +27 -0
  204. package/source/components/stylesheet/control.mjs +27 -0
  205. package/source/components/stylesheet/data-grid.mjs +27 -0
  206. package/source/components/stylesheet/display.mjs +27 -0
  207. package/source/components/stylesheet/floating-ui.mjs +27 -0
  208. package/source/components/stylesheet/form.mjs +27 -0
  209. package/source/components/stylesheet/host.mjs +27 -0
  210. package/source/components/stylesheet/link.mjs +27 -0
  211. package/source/components/stylesheet/namespace.mjs +13 -0
  212. package/source/components/stylesheet/normalize.mjs +27 -0
  213. package/source/components/stylesheet/popper.mjs +27 -0
  214. package/source/components/stylesheet/property.mjs +27 -0
  215. package/source/components/stylesheet/ripple.mjs +27 -0
  216. package/source/components/stylesheet/skeleton.mjs +27 -0
  217. package/source/components/stylesheet/space.mjs +27 -0
  218. package/source/components/stylesheet/spinner.mjs +27 -0
  219. package/source/components/stylesheet/table.mjs +27 -0
  220. package/source/components/stylesheet/theme.mjs +27 -0
  221. package/source/components/stylesheet/tree-menu.mjs +33 -0
  222. package/source/components/stylesheet/typography.mjs +27 -0
  223. package/source/components/tree-menu/namespace.mjs +13 -0
  224. package/source/components/tree-menu/style/tree-menu.pcss +107 -0
  225. package/source/components/tree-menu/stylesheet/namespace.mjs +13 -0
  226. package/source/components/tree-menu/stylesheet/tree-menu.mjs +27 -0
  227. package/source/components/tree-menu/tree-menu.mjs +660 -0
  228. package/source/constraints/abstract.mjs +17 -24
  229. package/source/constraints/abstractoperator.mjs +27 -22
  230. package/source/constraints/andoperator.mjs +20 -17
  231. package/source/constraints/invalid.mjs +17 -17
  232. package/source/constraints/isarray.mjs +20 -20
  233. package/source/constraints/isobject.mjs +20 -20
  234. package/source/constraints/oroperator.mjs +45 -45
  235. package/source/constraints/valid.mjs +17 -17
  236. package/source/data/buildmap.mjs +108 -103
  237. package/source/data/buildtree.mjs +59 -57
  238. package/source/data/datasource/dom.mjs +80 -84
  239. package/source/data/datasource/namespace.mjs +1 -1
  240. package/source/data/datasource/server/restapi/data-fetch-error.mjs +27 -25
  241. package/source/data/datasource/server/restapi/writeerror.mjs +35 -32
  242. package/source/data/datasource/server/restapi.mjs +176 -177
  243. package/source/data/datasource/server/webconnect.mjs +150 -156
  244. package/source/data/datasource/server.mjs +62 -63
  245. package/source/data/datasource/storage/localstorage.mjs +25 -24
  246. package/source/data/datasource/storage/sessionstorage.mjs +28 -25
  247. package/source/data/datasource/storage.mjs +74 -73
  248. package/source/data/datasource.mjs +177 -168
  249. package/source/data/diff.mjs +98 -97
  250. package/source/data/extend.mjs +42 -42
  251. package/source/data/pathfinder.mjs +301 -288
  252. package/source/data/pipe.mjs +36 -36
  253. package/source/data/transformer.mjs +742 -726
  254. package/source/dom/assembler.mjs +44 -44
  255. package/source/dom/attributes.mjs +142 -122
  256. package/source/dom/constants.mjs +62 -58
  257. package/source/dom/customcontrol.mjs +299 -299
  258. package/source/dom/customelement.mjs +843 -806
  259. package/source/dom/dimension.mjs +56 -46
  260. package/source/dom/events.mjs +74 -69
  261. package/source/dom/focusmanager.mjs +175 -175
  262. package/source/dom/locale.mjs +28 -28
  263. package/source/dom/ready.mjs +13 -13
  264. package/source/dom/resource/data.mjs +117 -111
  265. package/source/dom/resource/link/stylesheet.mjs +16 -16
  266. package/source/dom/resource/link.mjs +94 -96
  267. package/source/dom/resource/script.mjs +72 -74
  268. package/source/dom/resource.mjs +174 -172
  269. package/source/dom/resourcemanager.mjs +152 -156
  270. package/source/dom/slotted.mjs +78 -80
  271. package/source/dom/template.mjs +126 -112
  272. package/source/dom/theme.mjs +35 -35
  273. package/source/dom/updater.mjs +673 -651
  274. package/source/dom/util/extract-keys.mjs +34 -22
  275. package/source/dom/util/init-options-from-attributes.mjs +46 -38
  276. package/source/dom/util/namespace.mjs +13 -0
  277. package/source/dom/util/set-option-from-attribute.mjs +35 -29
  278. package/source/dom/util.mjs +112 -81
  279. package/source/dom/worker/factory.mjs +83 -83
  280. package/source/i18n/formatter.mjs +75 -73
  281. package/source/i18n/locale.mjs +146 -144
  282. package/source/i18n/provider.mjs +70 -64
  283. package/source/i18n/providers/embed.mjs +136 -127
  284. package/source/i18n/providers/fetch.mjs +84 -76
  285. package/source/i18n/translations.mjs +205 -195
  286. package/source/logging/handler/console.mjs +36 -36
  287. package/source/logging/handler.mjs +140 -140
  288. package/source/logging/logentry.mjs +25 -25
  289. package/source/logging/logger.mjs +177 -175
  290. package/source/math/random.mjs +63 -59
  291. package/source/monster.mjs +223 -103
  292. package/source/net/webconnect/message.mjs +31 -31
  293. package/source/net/webconnect.mjs +278 -271
  294. package/source/text/bracketed-key-value-hash.mjs +182 -179
  295. package/source/text/formatter.mjs +235 -210
  296. package/source/text/generate-range-comparison-expression.mjs +56 -34
  297. package/source/text/namespace.mjs +1 -1
  298. package/source/types/base.mjs +69 -61
  299. package/source/types/basewithoptions.mjs +46 -46
  300. package/source/types/binary.mjs +20 -20
  301. package/source/types/dataurl.mjs +96 -90
  302. package/source/types/global.mjs +45 -39
  303. package/source/types/id.mjs +25 -25
  304. package/source/types/internal.mjs +115 -114
  305. package/source/types/is.mjs +56 -40
  306. package/source/types/mediatype.mjs +119 -119
  307. package/source/types/namespace.mjs +1 -1
  308. package/source/types/node.mjs +160 -150
  309. package/source/types/nodelist.mjs +94 -96
  310. package/source/types/noderecursiveiterator.mjs +50 -50
  311. package/source/types/observablequeue.mjs +73 -73
  312. package/source/types/observer.mjs +114 -106
  313. package/source/types/observerlist.mjs +66 -66
  314. package/source/types/proxyobserver.mjs +210 -210
  315. package/source/types/queue.mjs +63 -63
  316. package/source/types/randomid.mjs +13 -13
  317. package/source/types/regex.mjs +3 -1
  318. package/source/types/stack.mjs +64 -64
  319. package/source/types/tokenlist.mjs +206 -205
  320. package/source/types/typeof.mjs +12 -10
  321. package/source/types/uniquequeue.mjs +48 -48
  322. package/source/types/uuid.mjs +32 -32
  323. package/source/types/validate.mjs +67 -67
  324. package/source/types/version.mjs +115 -105
  325. package/source/util/clone.mjs +103 -91
  326. package/source/util/comparator.mjs +97 -97
  327. package/source/util/deadmansswitch.mjs +40 -44
  328. package/source/util/freeze.mjs +10 -9
  329. package/source/util/namespace.mjs +1 -1
  330. package/source/util/processing.mjs +104 -105
  331. package/source/util/runtime.mjs +56 -44
  332. package/source/util/trimspaces.mjs +24 -24
  333. package/test/cases/components/form/button.mjs +122 -0
  334. package/test/cases/components/form/confirm-button.mjs +127 -0
  335. package/test/cases/components/form/form.mjs +317 -0
  336. package/test/cases/components/form/reload.mjs +188 -0
  337. package/test/cases/components/form/select.mjs +229 -0
  338. package/test/cases/components/form/state-button.mjs +130 -0
  339. package/test/cases/components/form/tabs.mjs +98 -0
  340. package/test/cases/components/form/template.mjs +189 -0
  341. package/test/cases/components/form/tree-select.mjs +216 -0
  342. package/test/cases/components/host/details.mjs +68 -0
  343. package/test/cases/components/host/host.mjs +70 -0
  344. package/test/cases/components/host/overlay.mjs +60 -0
  345. package/test/cases/components/host/util.mjs +79 -0
  346. package/test/cases/components/notify/message.mjs +39 -0
  347. package/test/cases/components/notify/notify.mjs +89 -0
  348. package/test/cases/dom/customcontrol.mjs +5 -4
  349. package/test/cases/math/random.mjs +0 -1
  350. package/test/cases/monster.mjs +1 -1
  351. package/test/cases/net/webconnect/message.mjs +0 -1
  352. package/test/cases/types/node.mjs +1 -1
  353. package/test/util/chai-dom.mjs +2 -2
  354. package/test/util/intersection-mock.mjs +69 -0
  355. package/test/util/jsdom.mjs +41 -25
  356. package/test/util/localstorage.mjs +1 -0
  357. package/test/util/resize-observer.mjs +29 -0
  358. package/test/util/websocket.mjs +4 -1
  359. package/test/web/import.js +16 -1
  360. package/test/web/test.html +28 -5
  361. package/test/web/tests.js +30398 -17879
@@ -19,13 +19,13 @@ export { convertToPixels, getDeviceDPI };
19
19
  * @type {number|function}
20
20
  */
21
21
  let CURRENT_DEVICE_DPI = function () {
22
- let i = 0;
23
- for (i = 56; i < 2000; i++) {
24
- if (getWindow().matchMedia(`(max-resolution: ${i}dpi)`).matches === true) {
25
- return i;
26
- }
27
- }
28
- return i;
22
+ let i = 0;
23
+ for (i = 56; i < 2000; i++) {
24
+ if (getWindow().matchMedia(`(max-resolution: ${i}dpi)`).matches === true) {
25
+ return i;
26
+ }
27
+ }
28
+ return i;
29
29
  };
30
30
 
31
31
  /**
@@ -36,12 +36,12 @@ let CURRENT_DEVICE_DPI = function () {
36
36
  * @returns {number}
37
37
  */
38
38
  function getDeviceDPI() {
39
- // only call the function once
40
- if (typeof CURRENT_DEVICE_DPI === "function") {
41
- CURRENT_DEVICE_DPI = CURRENT_DEVICE_DPI();
42
- }
39
+ // only call the function once
40
+ if (typeof CURRENT_DEVICE_DPI === "function") {
41
+ CURRENT_DEVICE_DPI = CURRENT_DEVICE_DPI();
42
+ }
43
43
 
44
- return getWindow().devicePixelRatio * CURRENT_DEVICE_DPI;
44
+ return getWindow().devicePixelRatio * CURRENT_DEVICE_DPI;
45
45
  }
46
46
 
47
47
  /**
@@ -74,42 +74,52 @@ function getDeviceDPI() {
74
74
  * @throws {Error} Invalid value format
75
75
  */
76
76
 
77
- function convertToPixels(value, parentElement = document.documentElement, fontSizeElement = document.documentElement) {
78
- validateString(value);
77
+ function convertToPixels(
78
+ value,
79
+ parentElement = document.documentElement,
80
+ fontSizeElement = document.documentElement,
81
+ ) {
82
+ validateString(value);
79
83
 
80
- const regex = /^(-?[\d.]+)(.*)$/;
81
- const matchResult = value.match(regex);
84
+ const regex = /^(-?[\d.]+)(.*)$/;
85
+ const matchResult = value.match(regex);
82
86
 
83
- if (!matchResult) {
84
- throw new Error(`Invalid value format: ${value}`);
85
- }
87
+ if (!matchResult) {
88
+ throw new Error(`Invalid value format: ${value}`);
89
+ }
86
90
 
87
- const [, num, unit] = matchResult;
88
- const number = parseFloat(num);
89
- const dpi = getDeviceDPI();
91
+ const [, num, unit] = matchResult;
92
+ const number = parseFloat(num);
93
+ const dpi = getDeviceDPI();
90
94
 
91
- if (unit === "px") {
92
- return number;
93
- } else if (unit === "em") {
94
- const fontSize = parseFloat(window.getComputedStyle(fontSizeElement).fontSize);
95
- return number * fontSize;
96
- } else if (unit === "rem") {
97
- const rootFontSize = parseFloat(window.getComputedStyle(parentElement).fontSize);
98
- return number * rootFontSize;
99
- } else if (unit === "%") {
100
- const parentWidth = parseFloat(window.getComputedStyle(parentElement).width);
101
- return (number * parentWidth) / 100;
102
- } else if (unit === "in") {
103
- return number * dpi;
104
- } else if (unit === "cm") {
105
- return (number * dpi) / 2.54;
106
- } else if (unit === "mm") {
107
- return (number * dpi) / 25.4;
108
- } else if (unit === "pt") {
109
- return (number * dpi) / 72;
110
- } else if (unit === "pc") {
111
- return (number * dpi) / 6;
112
- } else {
113
- throw new Error(`Unsupported unit: ${unit}`);
114
- }
95
+ if (unit === "px") {
96
+ return number;
97
+ } else if (unit === "em") {
98
+ const fontSize = parseFloat(
99
+ window.getComputedStyle(fontSizeElement).fontSize,
100
+ );
101
+ return number * fontSize;
102
+ } else if (unit === "rem") {
103
+ const rootFontSize = parseFloat(
104
+ window.getComputedStyle(parentElement).fontSize,
105
+ );
106
+ return number * rootFontSize;
107
+ } else if (unit === "%") {
108
+ const parentWidth = parseFloat(
109
+ window.getComputedStyle(parentElement).width,
110
+ );
111
+ return (number * parentWidth) / 100;
112
+ } else if (unit === "in") {
113
+ return number * dpi;
114
+ } else if (unit === "cm") {
115
+ return (number * dpi) / 2.54;
116
+ } else if (unit === "mm") {
117
+ return (number * dpi) / 25.4;
118
+ } else if (unit === "pt") {
119
+ return (number * dpi) / 72;
120
+ } else if (unit === "pc") {
121
+ return (number * dpi) / 6;
122
+ } else {
123
+ throw new Error(`Unsupported unit: ${unit}`);
124
+ }
115
125
  }
@@ -25,29 +25,31 @@ export { fireEvent, fireCustomEvent, findTargetElementFromEvent };
25
25
  * @summary Construct and send and event
26
26
  */
27
27
  function fireEvent(element, type) {
28
- const document = getDocument();
29
-
30
- if (element instanceof HTMLElement) {
31
- if (type === "click") {
32
- element.click();
33
- return;
34
- }
35
-
36
- // https://developer.mozilla.org/en-US/docs/Web/API/Event/Event
37
- let event = new Event(validateString(type), {
38
- bubbles: true,
39
- cancelable: true,
40
- composed: true,
41
- });
42
-
43
- element.dispatchEvent(event);
44
- } else if (element instanceof HTMLCollection || element instanceof NodeList) {
45
- for (let e of element) {
46
- fireEvent(e, type);
47
- }
48
- } else {
49
- throw new TypeError("value is not an instance of HTMLElement or HTMLCollection");
50
- }
28
+ const document = getDocument();
29
+
30
+ if (element instanceof HTMLElement) {
31
+ if (type === "click") {
32
+ element.click();
33
+ return;
34
+ }
35
+
36
+ // https://developer.mozilla.org/en-US/docs/Web/API/Event/Event
37
+ const event = new Event(validateString(type), {
38
+ bubbles: true,
39
+ cancelable: true,
40
+ composed: true,
41
+ });
42
+
43
+ element.dispatchEvent(event);
44
+ } else if (element instanceof HTMLCollection || element instanceof NodeList) {
45
+ for (const e of element) {
46
+ fireEvent(e, type);
47
+ }
48
+ } else {
49
+ throw new TypeError(
50
+ "value is not an instance of HTMLElement or HTMLCollection",
51
+ );
52
+ }
51
53
  }
52
54
 
53
55
  /**
@@ -64,28 +66,30 @@ function fireEvent(element, type) {
64
66
  * @summary Construct and send and event
65
67
  */
66
68
  function fireCustomEvent(element, type, detail) {
67
- const document = getDocument();
68
-
69
- if (element instanceof HTMLElement) {
70
- if (!isObject(detail)) {
71
- detail = { detail };
72
- }
73
-
74
- let event = new CustomEvent(validateString(type), {
75
- bubbles: true,
76
- cancelable: true,
77
- composed: true,
78
- detail,
79
- });
80
-
81
- element.dispatchEvent(event);
82
- } else if (element instanceof HTMLCollection || element instanceof NodeList) {
83
- for (let e of element) {
84
- fireCustomEvent(e, type, detail);
85
- }
86
- } else {
87
- throw new TypeError("value is not an instance of HTMLElement or HTMLCollection");
88
- }
69
+ const document = getDocument();
70
+
71
+ if (element instanceof HTMLElement) {
72
+ if (!isObject(detail)) {
73
+ detail = { detail };
74
+ }
75
+
76
+ const event = new CustomEvent(validateString(type), {
77
+ bubbles: true,
78
+ cancelable: true,
79
+ composed: true,
80
+ detail,
81
+ });
82
+
83
+ element.dispatchEvent(event);
84
+ } else if (element instanceof HTMLCollection || element instanceof NodeList) {
85
+ for (const e of element) {
86
+ fireCustomEvent(e, type, detail);
87
+ }
88
+ } else {
89
+ throw new TypeError(
90
+ "value is not an instance of HTMLElement or HTMLCollection",
91
+ );
92
+ }
89
93
  }
90
94
 
91
95
  /**
@@ -105,28 +109,29 @@ function fireCustomEvent(element, type, detail) {
105
109
  * @summary Help function to find the appropriate control
106
110
  */
107
111
  function findTargetElementFromEvent(event, attributeName, attributeValue) {
108
- validateInstance(event, Event);
109
-
110
- if (typeof event.composedPath !== "function") {
111
- throw new Error("unsupported event");
112
- }
113
-
114
- const path = event.composedPath();
115
-
116
- // closest cannot be used here, because closest is not correct for slotted elements
117
- if (isArray(path)) {
118
- for (let i = 0; i < path.length; i++) {
119
- const o = path[i];
120
-
121
- if (
122
- o instanceof HTMLElement &&
123
- o.hasAttribute(attributeName) &&
124
- (attributeValue === undefined || o.getAttribute(attributeName) === attributeValue)
125
- ) {
126
- return o;
127
- }
128
- }
129
- }
130
-
131
- return undefined;
112
+ validateInstance(event, Event);
113
+
114
+ if (typeof event.composedPath !== "function") {
115
+ throw new Error("unsupported event");
116
+ }
117
+
118
+ const path = event.composedPath();
119
+
120
+ // closest cannot be used here, because closest is not correct for slotted elements
121
+ if (isArray(path)) {
122
+ for (let i = 0; i < path.length; i++) {
123
+ const o = path[i];
124
+
125
+ if (
126
+ o instanceof HTMLElement &&
127
+ o.hasAttribute(attributeName) &&
128
+ (attributeValue === undefined ||
129
+ o.getAttribute(attributeName) === attributeValue)
130
+ ) {
131
+ return o;
132
+ }
133
+ }
134
+ }
135
+
136
+ return undefined;
132
137
  }
@@ -43,179 +43,179 @@ const stackSymbol = Symbol("stack");
43
43
  * @summary Handle the focus
44
44
  */
45
45
  class FocusManager extends BaseWithOptions {
46
- /**
47
- *
48
- * @param {Object|undefined} options
49
- */
50
- constructor(options) {
51
- super(options);
52
- validateInstance(this.getOption(KEY_DOCUMENT), HTMLDocument);
53
-
54
- this[stackSymbol] = new Stack();
55
- }
56
-
57
- /**
58
- * This method is called by the `instanceof` operator.
59
- * @returns {symbol}
60
- * @since 2.1.0
61
- */
62
- static get [instanceSymbol]() {
63
- return Symbol.for("@schukai/monster/dom/focusmanager");
64
- }
65
-
66
- /**
67
- * @property {HTMLDocument} document the document object into which the node is to be appended
68
- */
69
- get defaults() {
70
- return extend({}, super.defaults, {
71
- [KEY_DOCUMENT]: getGlobalObject("document"),
72
- [KEY_CONTEXT]: undefined,
73
- });
74
- }
75
-
76
- /**
77
- * Remembers the current focus on a stack.
78
- * Several focus can be stored.
79
- *
80
- * @return {Monster.DOM.FocusManager}
81
- */
82
- storeFocus() {
83
- const active = this.getActive();
84
- if (active instanceof Node) {
85
- this[stackSymbol].push(active);
86
- }
87
- return this;
88
- }
89
-
90
- /**
91
- * The last focus on the stack is set again
92
- *
93
- * @return {Monster.DOM.FocusManager}
94
- */
95
- restoreFocus() {
96
- const last = this[stackSymbol].pop();
97
- if (last instanceof Node) {
98
- this.focus(last);
99
- }
100
-
101
- return this;
102
- }
103
-
104
- /**
105
- *
106
- * @param {Node} element
107
- * @param {boolean} preventScroll
108
- * @throws {TypeError} value is not an instance of
109
- * @return {Monster.DOM.FocusManager}
110
- */
111
- focus(element, preventScroll) {
112
- validateInstance(element, Node);
113
-
114
- element.focus({
115
- preventScroll: preventScroll ?? false,
116
- });
117
-
118
- return this;
119
- }
120
-
121
- /**
122
- *
123
- * @return {Element}
124
- */
125
- getActive() {
126
- return this.getOption(KEY_DOCUMENT).activeElement;
127
- }
128
-
129
- /**
130
- * Select all elements that can be focused
131
- *
132
- * @param {string|undefined} query
133
- * @return {array}
134
- * @throws {TypeError} value is not an instance of
135
- */
136
- getFocusable(query) {
137
- let contextElement = this.getOption(KEY_CONTEXT);
138
- if (contextElement === undefined) {
139
- contextElement = this.getOption(KEY_DOCUMENT);
140
- }
141
-
142
- validateInstance(contextElement, Node);
143
-
144
- if (query !== undefined) {
145
- validateString(query);
146
- }
147
-
148
- return [
149
- ...contextElement.querySelectorAll(
150
- 'details, button, input, [tabindex]:not([tabindex="-1"]), select, textarea, a[href], body',
151
- ),
152
- ].filter((element) => {
153
- if (query !== undefined && !element.matches(query)) {
154
- return false;
155
- }
156
-
157
- if (element.hasAttribute("disabled")) return false;
158
- if (element.getAttribute("aria-hidden") === "true") return false;
159
-
160
- const rect = element.getBoundingClientRect();
161
- if (rect.width === 0) return false;
162
- if (rect.height === 0) return false;
163
-
164
- return true;
165
- });
166
- }
167
-
168
- /**
169
- * @param {string} query
170
- * @return {Monster.DOM.FocusManager}
171
- */
172
- focusNext(query) {
173
- const current = this.getActive();
174
- const focusable = this.getFocusable(query);
175
-
176
- if (!isArray(focusable) || focusable.length === 0) {
177
- return this;
178
- }
179
-
180
- if (current instanceof Node) {
181
- let index = focusable.indexOf(current);
182
-
183
- if (index > -1) {
184
- this.focus(focusable[index + 1] || focusable[0]);
185
- } else {
186
- this.focus(focusable[0]);
187
- }
188
- } else {
189
- this.focus(focusable[0]);
190
- }
191
-
192
- return this;
193
- }
194
-
195
- /**
196
- * @param {string} query
197
- * @return {Monster.DOM.FocusManager}
198
- */
199
- focusPrev(query) {
200
- const current = this.getActive();
201
- const focusable = this.getFocusable(query);
202
-
203
- if (!isArray(focusable) || focusable.length === 0) {
204
- return this;
205
- }
206
-
207
- if (current instanceof Node) {
208
- let index = focusable.indexOf(current);
209
-
210
- if (index > -1) {
211
- this.focus(focusable[index - 1] || focusable[focusable.length - 1]);
212
- } else {
213
- this.focus(focusable[focusable.length - 1]);
214
- }
215
- } else {
216
- this.focus(focusable[focusable.length - 1]);
217
- }
218
-
219
- return this;
220
- }
46
+ /**
47
+ *
48
+ * @param {Object|undefined} options
49
+ */
50
+ constructor(options) {
51
+ super(options);
52
+ validateInstance(this.getOption(KEY_DOCUMENT), HTMLDocument);
53
+
54
+ this[stackSymbol] = new Stack();
55
+ }
56
+
57
+ /**
58
+ * This method is called by the `instanceof` operator.
59
+ * @returns {symbol}
60
+ * @since 2.1.0
61
+ */
62
+ static get [instanceSymbol]() {
63
+ return Symbol.for("@schukai/monster/dom/focusmanager");
64
+ }
65
+
66
+ /**
67
+ * @property {HTMLDocument} document the document object into which the node is to be appended
68
+ */
69
+ get defaults() {
70
+ return extend({}, super.defaults, {
71
+ [KEY_DOCUMENT]: getGlobalObject("document"),
72
+ [KEY_CONTEXT]: undefined,
73
+ });
74
+ }
75
+
76
+ /**
77
+ * Remembers the current focus on a stack.
78
+ * Several focus can be stored.
79
+ *
80
+ * @return {Monster.DOM.FocusManager}
81
+ */
82
+ storeFocus() {
83
+ const active = this.getActive();
84
+ if (active instanceof Node) {
85
+ this[stackSymbol].push(active);
86
+ }
87
+ return this;
88
+ }
89
+
90
+ /**
91
+ * The last focus on the stack is set again
92
+ *
93
+ * @return {Monster.DOM.FocusManager}
94
+ */
95
+ restoreFocus() {
96
+ const last = this[stackSymbol].pop();
97
+ if (last instanceof Node) {
98
+ this.focus(last);
99
+ }
100
+
101
+ return this;
102
+ }
103
+
104
+ /**
105
+ *
106
+ * @param {Node} element
107
+ * @param {boolean} preventScroll
108
+ * @throws {TypeError} value is not an instance of
109
+ * @return {Monster.DOM.FocusManager}
110
+ */
111
+ focus(element, preventScroll) {
112
+ validateInstance(element, Node);
113
+
114
+ element.focus({
115
+ preventScroll: preventScroll ?? false,
116
+ });
117
+
118
+ return this;
119
+ }
120
+
121
+ /**
122
+ *
123
+ * @return {Element}
124
+ */
125
+ getActive() {
126
+ return this.getOption(KEY_DOCUMENT).activeElement;
127
+ }
128
+
129
+ /**
130
+ * Select all elements that can be focused
131
+ *
132
+ * @param {string|undefined} query
133
+ * @return {array}
134
+ * @throws {TypeError} value is not an instance of
135
+ */
136
+ getFocusable(query) {
137
+ let contextElement = this.getOption(KEY_CONTEXT);
138
+ if (contextElement === undefined) {
139
+ contextElement = this.getOption(KEY_DOCUMENT);
140
+ }
141
+
142
+ validateInstance(contextElement, Node);
143
+
144
+ if (query !== undefined) {
145
+ validateString(query);
146
+ }
147
+
148
+ return [
149
+ ...contextElement.querySelectorAll(
150
+ 'details, button, input, [tabindex]:not([tabindex="-1"]), select, textarea, a[href], body',
151
+ ),
152
+ ].filter((element) => {
153
+ if (query !== undefined && !element.matches(query)) {
154
+ return false;
155
+ }
156
+
157
+ if (element.hasAttribute("disabled")) return false;
158
+ if (element.getAttribute("aria-hidden") === "true") return false;
159
+
160
+ const rect = element.getBoundingClientRect();
161
+ if (rect.width === 0) return false;
162
+ if (rect.height === 0) return false;
163
+
164
+ return true;
165
+ });
166
+ }
167
+
168
+ /**
169
+ * @param {string} query
170
+ * @return {Monster.DOM.FocusManager}
171
+ */
172
+ focusNext(query) {
173
+ const current = this.getActive();
174
+ const focusable = this.getFocusable(query);
175
+
176
+ if (!isArray(focusable) || focusable.length === 0) {
177
+ return this;
178
+ }
179
+
180
+ if (current instanceof Node) {
181
+ const index = focusable.indexOf(current);
182
+
183
+ if (index > -1) {
184
+ this.focus(focusable[index + 1] || focusable[0]);
185
+ } else {
186
+ this.focus(focusable[0]);
187
+ }
188
+ } else {
189
+ this.focus(focusable[0]);
190
+ }
191
+
192
+ return this;
193
+ }
194
+
195
+ /**
196
+ * @param {string} query
197
+ * @return {Monster.DOM.FocusManager}
198
+ */
199
+ focusPrev(query) {
200
+ const current = this.getActive();
201
+ const focusable = this.getFocusable(query);
202
+
203
+ if (!isArray(focusable) || focusable.length === 0) {
204
+ return this;
205
+ }
206
+
207
+ if (current instanceof Node) {
208
+ const index = focusable.indexOf(current);
209
+
210
+ if (index > -1) {
211
+ this.focus(focusable[index - 1] || focusable[focusable.length - 1]);
212
+ } else {
213
+ this.focus(focusable[focusable.length - 1]);
214
+ }
215
+ } else {
216
+ this.focus(focusable[focusable.length - 1]);
217
+ }
218
+
219
+ return this;
220
+ }
221
221
  }