@schukai/monster 4.129.2 → 4.129.4

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.
package/package.json CHANGED
@@ -1 +1 @@
1
- {"author":"Volker Schukai","dependencies":{"@floating-ui/dom":"^1.7.6","@popperjs/core":"^2.11.8"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"4.129.2"}
1
+ {"author":"Volker Schukai","dependencies":{"@floating-ui/dom":"^1.7.6","@popperjs/core":"^2.11.8"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"4.129.4"}
@@ -25,7 +25,7 @@ try {
25
25
  ContextErrorStyleSheet.insertRule(
26
26
  `
27
27
  @layer contexterror {
28
- [data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}div[data-monster-role=popper]{align-content:center;background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;justify-content:space-between;left:0;max-height:var(--monster-popper-max-height,calc(100vh - 2rem));max-width:var(--monster-popper-max-width,calc(100vw - 2rem));padding:1.1em;position:absolute;top:0;width:-moz-max-content;width:max-content;z-index:var(--monster-z-index-modal)}div[data-monster-role=popper]>[part=content]{max-height:var(--monster-popper-content-max-height,calc(100vh - 4.2rem));overflow:auto}div[data-monster-role=popper]>[part=content][data-monster-overflow-mode=horizontal]{clip-path:inset(calc(var(--monster-popper-content-block-overflow, 100vh)*-1) 0 calc(var(--monster-popper-content-block-overflow, 100vh)*-1) 0);overflow:visible}div[data-monster-role=popper] div[data-monster-role=arrow]{background:var(--monster-bg-color-primary-1);height:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);pointer-events:none;position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);z-index:-1}[data-monster-role=control]{line-height:1em;margin:0;padding:0;position:relative}[data-monster-role=control] [data-monster-role=button]{display:inline-block;position:relative}:is([data-monster-role=control] [data-monster-role=button]) svg{cursor:pointer}:is([data-monster-role=control] [data-monster-role=button]) svg.hidden{cursor:default;pointer-events:none;visibility:hidden}:host{display:inline-block;margin:0 .2em;padding:0;position:relative;vertical-align:bottom}div[data-monster-role=popper]{max-width:min(var(--monster-popper-max-width,calc(100vw - 2rem)),32rem)}div[data-monster-role=popper]>[part=content]{display:block;max-height:none;max-width:100%;overflow:visible;overflow-wrap:anywhere;text-wrap:pretty;white-space:normal;word-break:break-word}:host([disabled]) [data-monster-role=button] svg{cursor:default;pointer-events:none}
28
+ [data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}div[data-monster-role=popper]{align-content:center;background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;justify-content:space-between;left:0;max-height:var(--monster-popper-max-height,calc(100vh - 2rem));max-width:var(--monster-popper-max-width,calc(100vw - 2rem));padding:1.1em;position:absolute;top:0;width:-moz-max-content;width:max-content;z-index:var(--monster-z-index-modal)}div[data-monster-role=popper]>[part=content]{max-height:var(--monster-popper-content-max-height,calc(100vh - 4.2rem));overflow:auto}div[data-monster-role=popper]>[part=content][data-monster-overflow-mode=horizontal]{clip-path:inset(calc(var(--monster-popper-content-block-overflow, 100vh)*-1) 0 calc(var(--monster-popper-content-block-overflow, 100vh)*-1) 0);overflow:visible}div[data-monster-role=popper] div[data-monster-role=arrow]{background:var(--monster-bg-color-primary-1);height:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);pointer-events:none;position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);z-index:-1}[data-monster-role=control]{line-height:1em;margin:0;padding:0;position:relative}[data-monster-role=control] [data-monster-role=button]{display:inline-block;position:relative}:is([data-monster-role=control] [data-monster-role=button]) svg{cursor:pointer}:is([data-monster-role=control] [data-monster-role=button]) svg.hidden{cursor:default;pointer-events:none;visibility:hidden}:host{display:inline-block;margin:0 .2em;padding:0;position:relative;vertical-align:bottom}div[data-monster-role=popper]{max-height:none;max-width:min(var(--monster-popper-max-width,calc(100vw - 2rem)),32rem);overflow:visible}div[data-monster-role=popper]>[part=content]{display:block;max-height:none;max-width:100%;overflow:visible;overflow-wrap:anywhere;text-wrap:pretty;white-space:normal;word-break:break-word}:host([disabled]) [data-monster-role=button] svg{cursor:default;pointer-events:none}
29
29
  }`,
30
30
  0,
31
31
  );
@@ -25,7 +25,7 @@ try {
25
25
  ContextHelpStyleSheet.insertRule(
26
26
  `
27
27
  @layer contexthelp {
28
- [data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}div[data-monster-role=popper]{align-content:center;background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;justify-content:space-between;left:0;max-height:var(--monster-popper-max-height,calc(100vh - 2rem));max-width:var(--monster-popper-max-width,calc(100vw - 2rem));padding:1.1em;position:absolute;top:0;width:-moz-max-content;width:max-content;z-index:var(--monster-z-index-modal)}div[data-monster-role=popper]>[part=content]{max-height:var(--monster-popper-content-max-height,calc(100vh - 4.2rem));overflow:auto}div[data-monster-role=popper]>[part=content][data-monster-overflow-mode=horizontal]{clip-path:inset(calc(var(--monster-popper-content-block-overflow, 100vh)*-1) 0 calc(var(--monster-popper-content-block-overflow, 100vh)*-1) 0);overflow:visible}div[data-monster-role=popper] div[data-monster-role=arrow]{background:var(--monster-bg-color-primary-1);height:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);pointer-events:none;position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);z-index:-1}[data-monster-role=control]{line-height:1em;margin:0;padding:0;position:relative}[data-monster-role=control] [data-monster-role=button]{display:inline-block;position:relative}:is([data-monster-role=control] [data-monster-role=button]) svg{cursor:pointer}:is([data-monster-role=control] [data-monster-role=button]) svg.hidden{cursor:default;pointer-events:none;visibility:hidden}div[data-monster-role=popper]{max-width:min(var(--monster-popper-max-width,calc(100vw - 2rem)),32rem);z-index:var(--monster-z-index-tooltip-overlay)}div[data-monster-role=popper]>[part=content]{display:block;max-height:none;max-width:100%;overflow:visible;overflow-wrap:anywhere;text-wrap:pretty;white-space:normal;word-break:break-word}:host{display:inline-block;margin:0 .2em;padding:0;position:relative;vertical-align:bottom}:host([disabled]) [data-monster-role=button] svg{cursor:default;pointer-events:none}
28
+ [data-monster-role=control]{box-sizing:border-box;outline:none;width:100%}[data-monster-role=control].flex{align-items:center;display:flex;flex-direction:row}:host{box-sizing:border-box;display:block}div[data-monster-role=popper]{align-content:center;background:var(--monster-bg-color-primary-1);border-color:var(--monster-bg-color-primary-4);border-radius:var(--monster-border-radius);border-style:var(--monster-border-style);border-width:var(--monster-border-width);box-shadow:var(--monster-box-shadow-1);box-sizing:border-box;color:var(--monster-color-primary-1);display:none;justify-content:space-between;left:0;max-height:var(--monster-popper-max-height,calc(100vh - 2rem));max-width:var(--monster-popper-max-width,calc(100vw - 2rem));padding:1.1em;position:absolute;top:0;width:-moz-max-content;width:max-content;z-index:var(--monster-z-index-modal)}div[data-monster-role=popper]>[part=content]{max-height:var(--monster-popper-content-max-height,calc(100vh - 4.2rem));overflow:auto}div[data-monster-role=popper]>[part=content][data-monster-overflow-mode=horizontal]{clip-path:inset(calc(var(--monster-popper-content-block-overflow, 100vh)*-1) 0 calc(var(--monster-popper-content-block-overflow, 100vh)*-1) 0);overflow:visible}div[data-monster-role=popper] div[data-monster-role=arrow]{background:var(--monster-bg-color-primary-1);height:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);pointer-events:none;position:absolute;width:calc(max(var(--monster-popper-witharrrow-distance), -1 * var(--monster-popper-witharrrow-distance))*2);z-index:-1}[data-monster-role=control]{line-height:1em;margin:0;padding:0;position:relative}[data-monster-role=control] [data-monster-role=button]{display:inline-block;position:relative}:is([data-monster-role=control] [data-monster-role=button]) svg{cursor:pointer}:is([data-monster-role=control] [data-monster-role=button]) svg.hidden{cursor:default;pointer-events:none;visibility:hidden}div[data-monster-role=popper]{max-height:none;max-width:min(var(--monster-popper-max-width,calc(100vw - 2rem)),32rem);overflow:visible;z-index:var(--monster-z-index-tooltip-overlay)}div[data-monster-role=popper]>[part=content]{display:block;max-height:none;max-width:100%;overflow:visible;overflow-wrap:anywhere;text-wrap:pretty;white-space:normal;word-break:break-word}:host{display:inline-block;margin:0 .2em;padding:0;position:relative;vertical-align:bottom}:host([disabled]) [data-monster-role=button] svg{cursor:default;pointer-events:none}
29
29
  }`,
30
30
  0,
31
31
  );
@@ -59,44 +59,7 @@ function positionPopper(controlElement, popperElement, options) {
59
59
  return;
60
60
  }
61
61
 
62
- teardownNativePopover(popperElement);
63
- popperElement.style.removeProperty("visibility");
64
- popperElement.style.display = "block";
65
-
66
- const arrowElement = popperElement.querySelector(
67
- "[data-monster-role=arrow]",
68
- );
69
- const floatingMiddleware = [...config.floatingMiddleware];
70
- if (
71
- arrowElement instanceof HTMLElement &&
72
- config.middlewareTokens.includes("arrow")
73
- ) {
74
- floatingMiddleware.push(arrow({ element: arrowElement }));
75
- }
76
-
77
- startAutoUpdate(controlElement, popperElement, () => {
78
- computePosition(
79
- controlElement,
80
- popperElement,
81
- Object.assign({}, config, {
82
- middleware: floatingMiddleware,
83
- }),
84
- ).then(({ x, y, placement, middlewareData }) => {
85
- Object.assign(popperElement.style, {
86
- top: "0",
87
- left: "0",
88
- transform: `translate(${roundByDPR(x)}px,${roundByDPR(y)}px)`,
89
- });
90
-
91
- if (middlewareData.arrow) {
92
- applyFloatingArrowStyles(
93
- arrowElement,
94
- placement,
95
- middlewareData.arrow,
96
- );
97
- }
98
- });
99
- });
62
+ enableFloatingPositioning(controlElement, popperElement, config);
100
63
  }).run();
101
64
  }
102
65
 
@@ -116,6 +79,47 @@ function openPositionedPopper(controlElement, popperElement, options) {
116
79
  popperElement.style.display = "block";
117
80
  }
118
81
 
82
+ function enableFloatingPositioning(controlElement, popperElement, config) {
83
+ teardownNativePopover(popperElement);
84
+ popperElement.style.removeProperty("visibility");
85
+ popperElement.style.display = "block";
86
+
87
+ startAutoUpdate(controlElement, popperElement, () => {
88
+ syncFloatingPopover(controlElement, popperElement, config);
89
+ });
90
+ syncFloatingPopover(controlElement, popperElement, config);
91
+ }
92
+
93
+ function syncFloatingPopover(controlElement, popperElement, config) {
94
+ const arrowElement = popperElement.querySelector("[data-monster-role=arrow]");
95
+ const floatingMiddleware = [...config.floatingMiddleware];
96
+
97
+ if (
98
+ arrowElement instanceof HTMLElement &&
99
+ config.middlewareTokens.includes("arrow")
100
+ ) {
101
+ floatingMiddleware.push(arrow({ element: arrowElement }));
102
+ }
103
+
104
+ computePosition(
105
+ controlElement,
106
+ popperElement,
107
+ Object.assign({}, config, {
108
+ middleware: floatingMiddleware,
109
+ }),
110
+ ).then(({ x, y, placement, middlewareData }) => {
111
+ Object.assign(popperElement.style, {
112
+ top: "0",
113
+ left: "0",
114
+ transform: `translate(${roundByDPR(x)}px,${roundByDPR(y)}px)`,
115
+ });
116
+
117
+ if (middlewareData.arrow) {
118
+ applyFloatingArrowStyles(arrowElement, placement, middlewareData.arrow);
119
+ }
120
+ });
121
+ }
122
+
119
123
  function closePositionedPopper(popperElement) {
120
124
  stopAutoUpdate(popperElement);
121
125
  cancelScheduledNativeArrowSync(popperElement);
@@ -404,6 +408,12 @@ function syncNativePopover(controlElement, popperElement, config) {
404
408
 
405
409
  applyNativePlacementStyles(popperElement, placement, offsetValue);
406
410
  popperElement.style.removeProperty("visibility");
411
+
412
+ if (hasViewportOverflow(popperElement)) {
413
+ enableFloatingPositioning(controlElement, popperElement, config);
414
+ return;
415
+ }
416
+
407
417
  syncNativeArrow(controlElement, popperElement);
408
418
  scheduleNativeArrowSync(controlElement, popperElement);
409
419
  }
@@ -861,6 +871,24 @@ function matchesPopoverOpen(popperElement) {
861
871
  }
862
872
  }
863
873
 
874
+ function hasViewportOverflow(popperElement) {
875
+ if (!(popperElement instanceof HTMLElement)) {
876
+ return false;
877
+ }
878
+
879
+ const rect = popperElement.getBoundingClientRect();
880
+ const tolerance = 1;
881
+ const viewportWidth = window.innerWidth;
882
+ const viewportHeight = window.innerHeight;
883
+
884
+ return (
885
+ rect.left < -tolerance ||
886
+ rect.top < -tolerance ||
887
+ rect.right > viewportWidth + tolerance ||
888
+ rect.bottom > viewportHeight + tolerance
889
+ );
890
+ }
891
+
864
892
  function clamp(value, min, max) {
865
893
  return Math.min(Math.max(value, min), max);
866
894
  }
@@ -9,29 +9,24 @@ let expect = chai.expect;
9
9
  chai.use(chaiDom);
10
10
 
11
11
  describe('ImageEditor', function () {
12
+ this.timeout(10000);
12
13
 
13
14
  let ImageEditor, document;
14
15
  let registerCustomElement;
15
16
  let CustomElement;
16
17
  let assembleMethodSymbol;
17
18
 
18
- before(function (done) {
19
- initJSDOM({}).then(() => {
20
- import("../../../../source/dom/customelement.mjs").then((domModule) => {
21
- registerCustomElement = domModule['registerCustomElement'];
22
- CustomElement = domModule['CustomElement'];
23
- assembleMethodSymbol = domModule['assembleMethodSymbol'];
24
- return import("../../../../source/components/content/image-editor.mjs");
25
- }).then((m) => {
26
- try {
27
- ImageEditor = m['ImageEditor'];
28
- document = getDocument();
29
- done();
30
- } catch (e) {
31
- done(e);
32
- }
33
- }).catch((e) => done(e));
34
- });
19
+ before(async function () {
20
+ await initJSDOM({});
21
+
22
+ const domModule = await import("../../../../source/dom/customelement.mjs");
23
+ registerCustomElement = domModule['registerCustomElement'];
24
+ CustomElement = domModule['CustomElement'];
25
+ assembleMethodSymbol = domModule['assembleMethodSymbol'];
26
+
27
+ const componentModule = await import("../../../../source/components/content/image-editor.mjs");
28
+ ImageEditor = componentModule['ImageEditor'];
29
+ document = getDocument();
35
30
  });
36
31
 
37
32
  beforeEach(() => {