@schukai/monster 3.51.5 → 3.52.0

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 (360) hide show
  1. package/CHANGELOG.md +17 -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/package.json +6 -2
  12. package/source/components/constants.mjs +132 -0
  13. package/source/components/datatable/columnbar.mjs +310 -0
  14. package/source/components/datatable/constants.mjs +121 -0
  15. package/source/components/datatable/dataset.mjs +219 -0
  16. package/source/components/datatable/datasource/dom.mjs +186 -0
  17. package/source/components/datatable/datasource/namespace.mjs +13 -0
  18. package/source/components/datatable/datasource/rest.mjs +400 -0
  19. package/source/components/datatable/datasource.mjs +102 -0
  20. package/source/components/datatable/datatable/header.mjs +268 -0
  21. package/source/components/datatable/datatable/namespace.mjs +13 -0
  22. package/source/components/datatable/datatable.mjs +789 -0
  23. package/source/components/datatable/embedded-pagination.mjs +113 -0
  24. package/source/components/datatable/filter/abstract-base.mjs +31 -0
  25. package/source/components/datatable/filter/date-range.mjs +1041 -0
  26. package/source/components/datatable/filter/input.mjs +175 -0
  27. package/source/components/datatable/filter/namespace.mjs +13 -0
  28. package/source/components/datatable/filter/range.mjs +671 -0
  29. package/source/components/datatable/filter/select.mjs +65 -0
  30. package/source/components/datatable/filter/settings.mjs +116 -0
  31. package/source/components/datatable/filter-button.mjs +98 -0
  32. package/source/components/datatable/filter.mjs +929 -0
  33. package/source/components/datatable/namespace.mjs +11 -0
  34. package/source/components/datatable/pagination.mjs +456 -0
  35. package/source/components/datatable/style/column-bar.pcss +123 -0
  36. package/source/components/datatable/style/dataset.pcss +13 -0
  37. package/source/components/datatable/style/datasource.pcss +16 -0
  38. package/source/components/datatable/style/datatable.pcss +239 -0
  39. package/source/components/datatable/style/embedded-pagination.pcss +101 -0
  40. package/source/components/datatable/style/filter-button.pcss +22 -0
  41. package/source/components/datatable/style/filter-controls-defaults.pcss +46 -0
  42. package/source/components/datatable/style/filter-date-range.pcss +9 -0
  43. package/source/components/datatable/style/filter-range.pcss +5 -0
  44. package/source/components/datatable/style/filter.pcss +156 -0
  45. package/source/components/datatable/style/pagination.pcss +59 -0
  46. package/source/components/datatable/style/select-filter.pcss +27 -0
  47. package/source/components/datatable/stylesheet/column-bar.mjs +33 -0
  48. package/source/components/datatable/stylesheet/dataset.mjs +33 -0
  49. package/source/components/datatable/stylesheet/datasource.mjs +33 -0
  50. package/source/components/datatable/stylesheet/datatable.mjs +33 -0
  51. package/source/components/datatable/stylesheet/embedded-pagination.mjs +33 -0
  52. package/source/components/datatable/stylesheet/filter-button.mjs +33 -0
  53. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +33 -0
  54. package/source/components/datatable/stylesheet/filter-date-range.mjs +33 -0
  55. package/source/components/datatable/stylesheet/filter-range.mjs +33 -0
  56. package/source/components/datatable/stylesheet/filter.mjs +33 -0
  57. package/source/components/datatable/stylesheet/namespace.mjs +13 -0
  58. package/source/components/datatable/stylesheet/pagination.mjs +33 -0
  59. package/source/components/datatable/stylesheet/select-filter.mjs +33 -0
  60. package/source/components/datatable/util.mjs +60 -0
  61. package/source/components/form/action-button.mjs +262 -0
  62. package/source/components/form/api-button.mjs +515 -0
  63. package/source/components/form/button-bar.mjs +739 -0
  64. package/source/components/form/button.mjs +350 -0
  65. package/source/components/form/confirm-button.mjs +330 -0
  66. package/source/components/form/constants.mjs +111 -0
  67. package/source/components/form/context-help.mjs +123 -0
  68. package/source/components/form/events.mjs +84 -0
  69. package/source/components/form/form.mjs +601 -0
  70. package/source/components/form/message-state-button.mjs +396 -0
  71. package/source/components/form/namespace.mjs +13 -0
  72. package/source/components/form/popper-button.mjs +435 -0
  73. package/source/components/form/popper.mjs +487 -0
  74. package/source/components/form/reload.mjs +360 -0
  75. package/source/components/form/select.mjs +2314 -0
  76. package/source/components/form/shadow-reload.mjs +137 -0
  77. package/source/components/form/state-button.mjs +182 -0
  78. package/source/components/form/style/action-button.pcss +41 -0
  79. package/source/components/form/style/api-button.pcss +0 -0
  80. package/source/components/form/style/button-bar.pcss +51 -0
  81. package/source/components/form/style/button.pcss +8 -0
  82. package/source/components/form/style/confirm-button.pcss +17 -0
  83. package/source/components/form/style/context-help.pcss +16 -0
  84. package/source/components/form/style/form.pcss +10 -0
  85. package/source/components/form/style/message-state-button.pcss +10 -0
  86. package/source/components/form/style/popper-button.pcss +16 -0
  87. package/source/components/form/style/popper.pcss +8 -0
  88. package/source/components/form/style/select.pcss +265 -0
  89. package/source/components/form/style/state-button.pcss +116 -0
  90. package/source/components/form/style/tabs.pcss +170 -0
  91. package/source/components/form/style/tree-select.pcss +81 -0
  92. package/source/components/form/stylesheet/action-button.mjs +33 -0
  93. package/source/components/form/stylesheet/api-button.mjs +33 -0
  94. package/source/components/form/stylesheet/button-bar.mjs +33 -0
  95. package/source/components/form/stylesheet/button.mjs +33 -0
  96. package/source/components/form/stylesheet/confirm-button.mjs +33 -0
  97. package/source/components/form/stylesheet/context-help.mjs +33 -0
  98. package/source/components/form/stylesheet/form.mjs +33 -0
  99. package/source/components/form/stylesheet/message-state-button.mjs +33 -0
  100. package/source/components/form/stylesheet/namespace.mjs +13 -0
  101. package/source/components/form/stylesheet/popper-button.mjs +33 -0
  102. package/source/components/form/stylesheet/popper.mjs +33 -0
  103. package/source/components/form/stylesheet/select.mjs +33 -0
  104. package/source/components/form/stylesheet/state-button.mjs +33 -0
  105. package/source/components/form/stylesheet/tabs.mjs +33 -0
  106. package/source/components/form/stylesheet/tree-select.mjs +33 -0
  107. package/source/components/form/tabs.mjs +1011 -0
  108. package/source/components/form/template.mjs +373 -0
  109. package/source/components/form/tree-select.mjs +527 -0
  110. package/source/components/form/types/namespace.mjs +13 -0
  111. package/source/components/form/types/state.mjs +93 -0
  112. package/source/components/form/util/fetch.mjs +133 -0
  113. package/source/components/form/util/floating-ui.mjs +245 -0
  114. package/source/components/form/util/namespace.mjs +13 -0
  115. package/source/components/form/util/popper.mjs +49 -0
  116. package/source/components/host/call-button.mjs +236 -0
  117. package/source/components/host/collapse.mjs +526 -0
  118. package/source/components/host/config-manager.mjs +304 -0
  119. package/source/components/host/constants.mjs +18 -0
  120. package/source/components/host/details.mjs +268 -0
  121. package/source/components/host/events.mjs +131 -0
  122. package/source/components/host/host.mjs +420 -0
  123. package/source/components/host/namespace.mjs +13 -0
  124. package/source/components/host/overlay.mjs +339 -0
  125. package/source/components/host/style/call-button.pcss +36 -0
  126. package/source/components/host/style/collapse.pcss +67 -0
  127. package/source/components/host/style/config-manager.pcss +5 -0
  128. package/source/components/host/style/details.pcss +68 -0
  129. package/source/components/host/style/host.pcss +43 -0
  130. package/source/components/host/style/overlay.pcss +73 -0
  131. package/source/components/host/style/toggle-button.pcss +36 -0
  132. package/source/components/host/style/viewer.pcss +13 -0
  133. package/source/components/host/stylesheet/call-button.mjs +33 -0
  134. package/source/components/host/stylesheet/collapse.mjs +33 -0
  135. package/source/components/host/stylesheet/config-manager.mjs +33 -0
  136. package/source/components/host/stylesheet/details.mjs +33 -0
  137. package/source/components/host/stylesheet/host.mjs +33 -0
  138. package/source/components/host/stylesheet/namespace.mjs +13 -0
  139. package/source/components/host/stylesheet/overlay.mjs +33 -0
  140. package/source/components/host/stylesheet/toggle-button.mjs +33 -0
  141. package/source/components/host/stylesheet/viewer.mjs +33 -0
  142. package/source/components/host/toggle-button.mjs +88 -0
  143. package/source/components/host/util.mjs +23 -0
  144. package/source/components/host/viewer.mjs +309 -0
  145. package/source/components/namespace.mjs +14 -0
  146. package/source/components/notify/constants.mjs +15 -0
  147. package/source/components/notify/events.mjs +15 -0
  148. package/source/components/notify/message.mjs +374 -0
  149. package/source/components/notify/namespace.mjs +15 -0
  150. package/source/components/notify/notify.mjs +236 -0
  151. package/source/components/notify/style/message.pcss +57 -0
  152. package/source/components/notify/style/notify.pcss +118 -0
  153. package/source/components/notify/stylesheet/message.mjs +33 -0
  154. package/source/components/notify/stylesheet/namespace.mjs +15 -0
  155. package/source/components/notify/stylesheet/notify.mjs +33 -0
  156. package/source/components/state/log/entry.mjs +126 -0
  157. package/source/components/state/log/namespace.mjs +13 -0
  158. package/source/components/state/log.mjs +275 -0
  159. package/source/components/state/namespace.mjs +13 -0
  160. package/source/components/state/state.mjs +131 -0
  161. package/source/components/state/style/log.pcss +111 -0
  162. package/source/components/state/style/state.pcss +113 -0
  163. package/source/components/state/stylesheet/log.mjs +33 -0
  164. package/source/components/state/stylesheet/state.mjs +33 -0
  165. package/source/components/style/badge.pcss +92 -0
  166. package/source/components/style/border.pcss +77 -0
  167. package/source/components/style/button.pcss +105 -0
  168. package/source/components/style/card.pcss +108 -0
  169. package/source/components/style/color.pcss +257 -0
  170. package/source/components/style/common.pcss +103 -0
  171. package/source/components/style/control.pcss +11 -0
  172. package/source/components/style/data-grid.pcss +43 -0
  173. package/source/components/style/display.pcss +42 -0
  174. package/source/components/style/floating-ui.pcss +33 -0
  175. package/source/components/style/form.pcss +5 -0
  176. package/source/components/style/host.pcss +15 -0
  177. package/source/components/style/link.pcss +63 -0
  178. package/source/components/style/mixin/badge.pcss +18 -0
  179. package/source/components/style/mixin/button.pcss +54 -0
  180. package/source/components/style/mixin/form.pcss +247 -0
  181. package/source/components/style/mixin/hover.pcss +8 -0
  182. package/source/components/style/mixin/media.pcss +107 -0
  183. package/source/components/style/mixin/property.pcss +288 -0
  184. package/source/components/style/mixin/skeleton.pcss +26 -0
  185. package/source/components/style/mixin/spinner.pcss +24 -0
  186. package/source/components/style/mixin/typography.pcss +52 -0
  187. package/source/components/style/normalize.pcss +14 -0
  188. package/source/components/style/popper.pcss +78 -0
  189. package/source/components/style/property.pcss +17 -0
  190. package/source/components/style/ripple.pcss +14 -0
  191. package/source/components/style/skeleton.pcss +28 -0
  192. package/source/components/style/space.pcss +47 -0
  193. package/source/components/style/spinner.pcss +6 -0
  194. package/source/components/style/table.pcss +46 -0
  195. package/source/components/style/theme.pcss +119 -0
  196. package/source/components/style/typography.pcss +131 -0
  197. package/source/components/stylesheet/badge.mjs +33 -0
  198. package/source/components/stylesheet/border.mjs +33 -0
  199. package/source/components/stylesheet/button.mjs +33 -0
  200. package/source/components/stylesheet/card.mjs +33 -0
  201. package/source/components/stylesheet/color.mjs +33 -0
  202. package/source/components/stylesheet/common.mjs +33 -0
  203. package/source/components/stylesheet/control.mjs +33 -0
  204. package/source/components/stylesheet/data-grid.mjs +33 -0
  205. package/source/components/stylesheet/display.mjs +33 -0
  206. package/source/components/stylesheet/floating-ui.mjs +33 -0
  207. package/source/components/stylesheet/form.mjs +33 -0
  208. package/source/components/stylesheet/host.mjs +33 -0
  209. package/source/components/stylesheet/link.mjs +33 -0
  210. package/source/components/stylesheet/namespace.mjs +13 -0
  211. package/source/components/stylesheet/normalize.mjs +33 -0
  212. package/source/components/stylesheet/popper.mjs +33 -0
  213. package/source/components/stylesheet/property.mjs +33 -0
  214. package/source/components/stylesheet/ripple.mjs +33 -0
  215. package/source/components/stylesheet/skeleton.mjs +33 -0
  216. package/source/components/stylesheet/space.mjs +33 -0
  217. package/source/components/stylesheet/spinner.mjs +33 -0
  218. package/source/components/stylesheet/table.mjs +33 -0
  219. package/source/components/stylesheet/theme.mjs +33 -0
  220. package/source/components/stylesheet/tree-menu.mjs +33 -0
  221. package/source/components/stylesheet/typography.mjs +33 -0
  222. package/source/components/tree-menu/namespace.mjs +13 -0
  223. package/source/components/tree-menu/style/tree-menu.pcss +107 -0
  224. package/source/components/tree-menu/stylesheet/namespace.mjs +13 -0
  225. package/source/components/tree-menu/stylesheet/tree-menu.mjs +33 -0
  226. package/source/components/tree-menu/tree-menu.mjs +660 -0
  227. package/source/constraints/abstract.mjs +17 -24
  228. package/source/constraints/abstractoperator.mjs +27 -22
  229. package/source/constraints/andoperator.mjs +20 -17
  230. package/source/constraints/invalid.mjs +17 -17
  231. package/source/constraints/isarray.mjs +20 -20
  232. package/source/constraints/isobject.mjs +20 -20
  233. package/source/constraints/oroperator.mjs +45 -45
  234. package/source/constraints/valid.mjs +17 -17
  235. package/source/data/buildmap.mjs +108 -103
  236. package/source/data/buildtree.mjs +59 -57
  237. package/source/data/datasource/dom.mjs +80 -84
  238. package/source/data/datasource/namespace.mjs +1 -1
  239. package/source/data/datasource/server/restapi/data-fetch-error.mjs +27 -25
  240. package/source/data/datasource/server/restapi/writeerror.mjs +34 -32
  241. package/source/data/datasource/server/restapi.mjs +176 -177
  242. package/source/data/datasource/server/webconnect.mjs +150 -156
  243. package/source/data/datasource/server.mjs +58 -59
  244. package/source/data/datasource/storage/localstorage.mjs +25 -24
  245. package/source/data/datasource/storage/sessionstorage.mjs +28 -25
  246. package/source/data/datasource/storage.mjs +74 -73
  247. package/source/data/datasource.mjs +176 -167
  248. package/source/data/diff.mjs +98 -97
  249. package/source/data/extend.mjs +42 -42
  250. package/source/data/pathfinder.mjs +301 -288
  251. package/source/data/pipe.mjs +36 -36
  252. package/source/data/transformer.mjs +742 -726
  253. package/source/dom/assembler.mjs +44 -44
  254. package/source/dom/attributes.mjs +142 -122
  255. package/source/dom/constants.mjs +62 -58
  256. package/source/dom/customcontrol.mjs +299 -299
  257. package/source/dom/customelement.mjs +843 -806
  258. package/source/dom/dimension.mjs +56 -46
  259. package/source/dom/events.mjs +74 -69
  260. package/source/dom/focusmanager.mjs +175 -175
  261. package/source/dom/locale.mjs +28 -28
  262. package/source/dom/ready.mjs +13 -13
  263. package/source/dom/resource/data.mjs +117 -111
  264. package/source/dom/resource/link/stylesheet.mjs +16 -16
  265. package/source/dom/resource/link.mjs +94 -96
  266. package/source/dom/resource/script.mjs +72 -74
  267. package/source/dom/resource.mjs +174 -172
  268. package/source/dom/resourcemanager.mjs +152 -156
  269. package/source/dom/slotted.mjs +78 -80
  270. package/source/dom/template.mjs +126 -112
  271. package/source/dom/theme.mjs +35 -35
  272. package/source/dom/updater.mjs +673 -651
  273. package/source/dom/util/extract-keys.mjs +34 -22
  274. package/source/dom/util/init-options-from-attributes.mjs +46 -38
  275. package/source/dom/util/namespace.mjs +13 -0
  276. package/source/dom/util/set-option-from-attribute.mjs +35 -29
  277. package/source/dom/util.mjs +112 -81
  278. package/source/dom/worker/factory.mjs +83 -83
  279. package/source/i18n/formatter.mjs +75 -73
  280. package/source/i18n/locale.mjs +146 -144
  281. package/source/i18n/provider.mjs +70 -64
  282. package/source/i18n/providers/embed.mjs +136 -127
  283. package/source/i18n/providers/fetch.mjs +84 -76
  284. package/source/i18n/translations.mjs +205 -195
  285. package/source/logging/handler/console.mjs +36 -36
  286. package/source/logging/handler.mjs +140 -140
  287. package/source/logging/logentry.mjs +25 -25
  288. package/source/logging/logger.mjs +177 -175
  289. package/source/math/random.mjs +63 -59
  290. package/source/monster.mjs +223 -103
  291. package/source/net/webconnect/message.mjs +31 -31
  292. package/source/net/webconnect.mjs +278 -271
  293. package/source/text/bracketed-key-value-hash.mjs +182 -179
  294. package/source/text/formatter.mjs +235 -210
  295. package/source/text/generate-range-comparison-expression.mjs +56 -34
  296. package/source/text/namespace.mjs +1 -1
  297. package/source/types/base.mjs +69 -61
  298. package/source/types/basewithoptions.mjs +46 -46
  299. package/source/types/binary.mjs +20 -20
  300. package/source/types/dataurl.mjs +96 -90
  301. package/source/types/global.mjs +45 -39
  302. package/source/types/id.mjs +25 -25
  303. package/source/types/internal.mjs +115 -114
  304. package/source/types/is.mjs +56 -40
  305. package/source/types/mediatype.mjs +119 -119
  306. package/source/types/namespace.mjs +1 -1
  307. package/source/types/node.mjs +160 -150
  308. package/source/types/nodelist.mjs +94 -96
  309. package/source/types/noderecursiveiterator.mjs +50 -50
  310. package/source/types/observablequeue.mjs +73 -73
  311. package/source/types/observer.mjs +104 -104
  312. package/source/types/observerlist.mjs +66 -66
  313. package/source/types/proxyobserver.mjs +210 -210
  314. package/source/types/queue.mjs +63 -63
  315. package/source/types/randomid.mjs +13 -13
  316. package/source/types/regex.mjs +3 -1
  317. package/source/types/stack.mjs +64 -64
  318. package/source/types/tokenlist.mjs +206 -205
  319. package/source/types/typeof.mjs +12 -10
  320. package/source/types/uniquequeue.mjs +48 -48
  321. package/source/types/uuid.mjs +32 -32
  322. package/source/types/validate.mjs +67 -67
  323. package/source/types/version.mjs +115 -105
  324. package/source/util/clone.mjs +103 -91
  325. package/source/util/comparator.mjs +97 -97
  326. package/source/util/deadmansswitch.mjs +40 -44
  327. package/source/util/freeze.mjs +10 -9
  328. package/source/util/namespace.mjs +1 -1
  329. package/source/util/processing.mjs +104 -105
  330. package/source/util/runtime.mjs +56 -44
  331. package/source/util/trimspaces.mjs +24 -24
  332. package/test/cases/components/form/button.mjs +122 -0
  333. package/test/cases/components/form/confirm-button.mjs +127 -0
  334. package/test/cases/components/form/form.mjs +317 -0
  335. package/test/cases/components/form/reload.mjs +188 -0
  336. package/test/cases/components/form/select.mjs +229 -0
  337. package/test/cases/components/form/state-button.mjs +130 -0
  338. package/test/cases/components/form/tabs.mjs +98 -0
  339. package/test/cases/components/form/template.mjs +189 -0
  340. package/test/cases/components/form/tree-select.mjs +216 -0
  341. package/test/cases/components/host/details.mjs +68 -0
  342. package/test/cases/components/host/host.mjs +70 -0
  343. package/test/cases/components/host/overlay.mjs +60 -0
  344. package/test/cases/components/host/util.mjs +79 -0
  345. package/test/cases/components/notify/message.mjs +39 -0
  346. package/test/cases/components/notify/notify.mjs +89 -0
  347. package/test/cases/dom/customcontrol.mjs +5 -4
  348. package/test/cases/math/random.mjs +0 -1
  349. package/test/cases/monster.mjs +1 -1
  350. package/test/cases/net/webconnect/message.mjs +0 -1
  351. package/test/cases/types/node.mjs +1 -1
  352. package/test/util/chai-dom.mjs +2 -2
  353. package/test/util/intersection-mock.mjs +69 -0
  354. package/test/util/jsdom.mjs +41 -25
  355. package/test/util/localstorage.mjs +1 -0
  356. package/test/util/resize-observer.mjs +29 -0
  357. package/test/util/websocket.mjs +4 -1
  358. package/test/web/import.js +16 -1
  359. package/test/web/test.html +28 -5
  360. 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
  }