Centralize help-icon overlay behavior across styleguide demos

This commit is contained in:
2026-05-26 09:43:30 +02:00
parent edbcc13db4
commit c06d317e31
7 changed files with 157 additions and 407 deletions
+4 -62
View File
@@ -638,6 +638,7 @@
</p> </p>
</section> </section>
<script src="../scripts/help-icon-overlays.js"></script>
<script> <script>
document.querySelectorAll('.sg-mode-toggle:not(.sg-activation-mode-toggle)').forEach((toggle) => { document.querySelectorAll('.sg-mode-toggle:not(.sg-activation-mode-toggle)').forEach((toggle) => {
toggle.addEventListener('click', () => { toggle.addEventListener('click', () => {
@@ -1098,60 +1099,9 @@
}); });
}); });
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => { window.sgInitHelpIconOverlays({
const button = wrap.querySelector('.sg-help-icon'); closeOnOpenSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
const panel = wrap.querySelector('.sg-help-icon-panel'); outsideClickIgnoreSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
if (!button || !panel) {
return;
}
button.addEventListener('click', (event) => {
event.stopPropagation();
const nextState = wrap.dataset.open !== 'true';
document.querySelectorAll('.sg-help-icon-wrap').forEach((otherWrap) => {
const otherButton = otherWrap.querySelector('.sg-help-icon');
otherWrap.dataset.open = 'false';
if (otherButton) {
otherButton.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false';
if (trigger) {
trigger.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-sandwich-menu-wrap').forEach((menuWrap) => {
const menuButton = menuWrap.querySelector('.sg-sandwich-button');
menuWrap.dataset.open = 'false';
if (menuButton) {
menuButton.setAttribute('aria-expanded', 'false');
}
});
wrap.dataset.align = 'left';
wrap.dataset.open = String(nextState);
button.setAttribute('aria-expanded', String(nextState));
if (!nextState) {
return;
}
const panelRect = panel.getBoundingClientRect();
if (panelRect.right > window.innerWidth) {
wrap.dataset.align = 'right';
}
const alignedPanelRect = panel.getBoundingClientRect();
if (alignedPanelRect.left < 0) {
wrap.dataset.align = 'left';
}
});
}); });
// Global close behavior for overlay-style controls. // Global close behavior for overlay-style controls.
@@ -1160,7 +1110,6 @@
if ( if (
event.target.closest('.sg-sandwich-menu-wrap') event.target.closest('.sg-sandwich-menu-wrap')
|| event.target.closest('.sg-pulldown-demo') || event.target.closest('.sg-pulldown-demo')
|| event.target.closest('.sg-help-icon-wrap')
) { ) {
return; return;
} }
@@ -1181,13 +1130,6 @@
} }
}); });
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
}); });
</script> </script>
+5 -64
View File
@@ -746,6 +746,7 @@
</div> </div>
</aside> </aside>
<script src="../scripts/help-icon-overlays.js"></script>
<script> <script>
const updateObjectCardGridRowState = () => { const updateObjectCardGridRowState = () => {
document.querySelectorAll('.sg-object-card-grid').forEach((grid) => { document.querySelectorAll('.sg-object-card-grid').forEach((grid) => {
@@ -878,14 +879,6 @@
} }
}); });
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
demo.dataset.align = 'left'; demo.dataset.align = 'left';
demo.dataset.open = String(nextState); demo.dataset.open = String(nextState);
trigger.setAttribute('aria-expanded', String(nextState)); trigger.setAttribute('aria-expanded', String(nextState));
@@ -931,53 +924,9 @@
}); });
document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState); document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState);
window.sgInitHelpIconOverlays({
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => { closeOnOpenSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
const button = wrap.querySelector('.sg-help-icon'); outsideClickIgnoreSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
const panel = wrap.querySelector('.sg-help-icon-panel');
if (!button || !panel) {
return;
}
button.addEventListener('click', (event) => {
event.stopPropagation();
const nextState = wrap.dataset.open !== 'true';
document.querySelectorAll('.sg-help-icon-wrap').forEach((otherWrap) => {
const otherButton = otherWrap.querySelector('.sg-help-icon');
otherWrap.dataset.open = 'false';
if (otherButton) {
otherButton.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false';
if (trigger) {
trigger.setAttribute('aria-expanded', 'false');
}
});
wrap.dataset.align = 'left';
wrap.dataset.open = String(nextState);
button.setAttribute('aria-expanded', String(nextState));
if (!nextState) {
return;
}
const panelRect = panel.getBoundingClientRect();
if (panelRect.right > window.innerWidth) {
wrap.dataset.align = 'right';
}
const alignedPanelRect = panel.getBoundingClientRect();
if (alignedPanelRect.left < 0) {
wrap.dataset.align = 'left';
}
});
}); });
document.querySelectorAll('.sg-input-single-line-wrap').forEach((wrap) => { document.querySelectorAll('.sg-input-single-line-wrap').forEach((wrap) => {
@@ -1066,15 +1015,7 @@
}); });
} }
if (!event.target.closest('.sg-help-icon-wrap') && !event.target.closest('.sg-pulldown-demo')) { if (!event.target.closest('.sg-pulldown-demo')) {
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => { document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger'); const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false'; demo.dataset.open = 'false';
+5 -63
View File
@@ -120,6 +120,7 @@
</div> </div>
</section> </section>
<script src="../scripts/help-icon-overlays.js"></script>
<script> <script>
document.querySelectorAll('.sg-mode-toggle').forEach((toggle) => { document.querySelectorAll('.sg-mode-toggle').forEach((toggle) => {
@@ -193,14 +194,6 @@
} }
}); });
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
demo.dataset.align = 'left'; demo.dataset.align = 'left';
demo.dataset.open = String(nextState); demo.dataset.open = String(nextState);
trigger.setAttribute('aria-expanded', String(nextState)); trigger.setAttribute('aria-expanded', String(nextState));
@@ -282,67 +275,16 @@
document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState); document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState);
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => { window.sgInitHelpIconOverlays({
const button = wrap.querySelector('.sg-help-icon'); closeOnOpenSelectors: ['.sg-pulldown-demo'],
const panel = wrap.querySelector('.sg-help-icon-panel'); outsideClickIgnoreSelectors: ['.sg-pulldown-demo'],
if (!button || !panel) {
return;
}
button.addEventListener('click', (event) => {
event.stopPropagation();
const nextState = wrap.dataset.open !== 'true';
document.querySelectorAll('.sg-help-icon-wrap').forEach((otherWrap) => {
const otherButton = otherWrap.querySelector('.sg-help-icon');
otherWrap.dataset.open = 'false';
if (otherButton) {
otherButton.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false';
if (trigger) {
trigger.setAttribute('aria-expanded', 'false');
}
});
wrap.dataset.align = 'left';
wrap.dataset.open = String(nextState);
button.setAttribute('aria-expanded', String(nextState));
if (!nextState) {
return;
}
const panelRect = panel.getBoundingClientRect();
if (panelRect.right > window.innerWidth) {
wrap.dataset.align = 'right';
}
const alignedPanelRect = panel.getBoundingClientRect();
if (alignedPanelRect.left < 0) {
wrap.dataset.align = 'left';
}
});
}); });
document.addEventListener('click', (event) => { document.addEventListener('click', (event) => {
if (event.target.closest('.sg-help-icon-wrap') || event.target.closest('.sg-pulldown-demo')) { if (event.target.closest('.sg-pulldown-demo')) {
return; return;
} }
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => { document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger'); const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false'; demo.dataset.open = 'false';
+5 -63
View File
@@ -195,6 +195,7 @@
</article> </article>
</section> </section>
<script src="../scripts/help-icon-overlays.js"></script>
<script> <script>
document.querySelectorAll('.sg-portal-header__tabs').forEach((group) => { document.querySelectorAll('.sg-portal-header__tabs').forEach((group) => {
group.querySelectorAll('.sg-tab-button').forEach((button) => { group.querySelectorAll('.sg-tab-button').forEach((button) => {
@@ -294,14 +295,6 @@
} }
}); });
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
demo.dataset.align = 'left'; demo.dataset.align = 'left';
demo.dataset.open = String(nextState); demo.dataset.open = String(nextState);
trigger.setAttribute('aria-expanded', String(nextState)); trigger.setAttribute('aria-expanded', String(nextState));
@@ -383,52 +376,9 @@
document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState); document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState);
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => { window.sgInitHelpIconOverlays({
const button = wrap.querySelector('.sg-help-icon'); closeOnOpenSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
const panel = wrap.querySelector('.sg-help-icon-panel'); outsideClickIgnoreSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
if (!button || !panel) {
return;
}
button.addEventListener('click', (event) => {
event.stopPropagation();
const nextState = wrap.dataset.open !== 'true';
document.querySelectorAll('.sg-help-icon-wrap').forEach((otherWrap) => {
const otherButton = otherWrap.querySelector('.sg-help-icon');
otherWrap.dataset.open = 'false';
if (otherButton) {
otherButton.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false';
if (trigger) {
trigger.setAttribute('aria-expanded', 'false');
}
});
wrap.dataset.align = 'left';
wrap.dataset.open = String(nextState);
button.setAttribute('aria-expanded', String(nextState));
if (!nextState) {
return;
}
const panelRect = panel.getBoundingClientRect();
if (panelRect.right > window.innerWidth) {
wrap.dataset.align = 'right';
}
const alignedPanelRect = panel.getBoundingClientRect();
if (alignedPanelRect.left < 0) {
wrap.dataset.align = 'left';
}
});
}); });
document.querySelectorAll('.sg-input-single-line-wrap').forEach((wrap) => { document.querySelectorAll('.sg-input-single-line-wrap').forEach((wrap) => {
@@ -466,18 +416,10 @@
}); });
} }
if (event.target.closest('.sg-help-icon-wrap') || event.target.closest('.sg-pulldown-demo')) { if (event.target.closest('.sg-pulldown-demo')) {
return; return;
} }
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => { document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger'); const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false'; demo.dataset.open = 'false';
@@ -369,6 +369,7 @@
</div> </div>
</section> </section>
<script src="../scripts/help-icon-overlays.js"></script>
<script> <script>
const businessModelToggleButton = document.getElementById('vsf-business-model-toggle'); const businessModelToggleButton = document.getElementById('vsf-business-model-toggle');
const businessModelText = document.getElementById('vsf-business-model-text'); const businessModelText = document.getElementById('vsf-business-model-text');
@@ -414,89 +415,14 @@
otherButton.setAttribute('aria-expanded', 'false'); otherButton.setAttribute('aria-expanded', 'false');
} }
}); });
document.querySelectorAll('.sg-help-icon-wrap').forEach((helpWrap) => {
const helpButton = helpWrap.querySelector('.sg-help-icon');
helpWrap.dataset.open = 'false';
if (helpButton) {
helpButton.setAttribute('aria-expanded', 'false');
}
});
wrap.dataset.open = String(nextState); wrap.dataset.open = String(nextState);
button.setAttribute('aria-expanded', String(nextState)); button.setAttribute('aria-expanded', String(nextState));
}); });
}); });
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => { window.sgInitHelpIconOverlays({
const button = wrap.querySelector('.sg-help-icon'); closeOnOpenSelectors: ['.sg-sandwich-menu-wrap'],
const panel = wrap.querySelector('.sg-help-icon-panel'); outsideClickIgnoreSelectors: ['.sg-sandwich-menu-wrap'],
if (!button || !panel) {
return;
}
button.addEventListener('click', (event) => {
event.stopPropagation();
const nextState = wrap.dataset.open !== 'true';
document.querySelectorAll('.sg-help-icon-wrap').forEach((otherWrap) => {
const otherButton = otherWrap.querySelector('.sg-help-icon');
otherWrap.dataset.open = 'false';
if (otherButton) {
otherButton.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-sandwich-menu-wrap').forEach((menuWrap) => {
const menuButton = menuWrap.querySelector('.sg-sandwich-button');
menuWrap.dataset.open = 'false';
if (menuButton) {
menuButton.setAttribute('aria-expanded', 'false');
}
});
wrap.dataset.align = 'left';
wrap.dataset.open = String(nextState);
button.setAttribute('aria-expanded', String(nextState));
panel.style.removeProperty('transform');
if (!nextState) {
return;
}
const viewportWidth = window.visualViewport
? window.visualViewport.width
: window.innerWidth;
const panelRect = panel.getBoundingClientRect();
if (panelRect.right > viewportWidth) {
wrap.dataset.align = 'right';
}
const alignedPanelRect = panel.getBoundingClientRect();
if (alignedPanelRect.left < 0) {
wrap.dataset.align = 'left';
}
const clampedRect = panel.getBoundingClientRect();
const rootStyles = getComputedStyle(document.documentElement);
const spacingSmallRaw = rootStyles.getPropertyValue('--spacing-small').trim();
const rootFontSize = parseFloat(rootStyles.fontSize) || 16;
const spacingSmallValue = parseFloat(spacingSmallRaw);
const safeInset = Number.isNaN(spacingSmallValue)
? 0
: (
spacingSmallRaw.endsWith('rem')
? spacingSmallValue * rootFontSize
: spacingSmallValue
);
let shiftX = 0;
if (clampedRect.right > (viewportWidth - safeInset)) {
shiftX -= clampedRect.right - (viewportWidth - safeInset);
}
if ((clampedRect.left + shiftX) < safeInset) {
shiftX += safeInset - (clampedRect.left + shiftX);
}
if (shiftX !== 0) {
panel.style.transform = `translateX(${shiftX}px)`;
}
});
}); });
document.addEventListener('click', (event) => { document.addEventListener('click', (event) => {
@@ -510,19 +436,6 @@
}); });
} }
if (!event.target.closest('.sg-help-icon-wrap')) {
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
const panel = wrap.querySelector('.sg-help-icon-panel');
wrap.dataset.open = 'false';
if (panel) {
panel.style.removeProperty('transform');
}
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
}
}); });
const tabGroup = document.querySelector('[data-pattern="card-gruppe-mit-tastennavigation"]'); const tabGroup = document.querySelector('[data-pattern="card-gruppe-mit-tastennavigation"]');
+5 -64
View File
@@ -667,6 +667,7 @@
</div> </div>
</div> </div>
</section> </section>
<script src="../scripts/help-icon-overlays.js"></script>
<script> <script>
const updateObjectCardGridRowState = () => { const updateObjectCardGridRowState = () => {
document.querySelectorAll('.sg-object-card-grid').forEach((grid) => { document.querySelectorAll('.sg-object-card-grid').forEach((grid) => {
@@ -799,14 +800,6 @@
} }
}); });
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
demo.dataset.align = 'left'; demo.dataset.align = 'left';
demo.dataset.open = String(nextState); demo.dataset.open = String(nextState);
trigger.setAttribute('aria-expanded', String(nextState)); trigger.setAttribute('aria-expanded', String(nextState));
@@ -852,53 +845,9 @@
}); });
document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState); document.querySelectorAll('.sg-pulldown-demo').forEach(updatePulldownSelectionState);
window.sgInitHelpIconOverlays({
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => { closeOnOpenSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
const button = wrap.querySelector('.sg-help-icon'); outsideClickIgnoreSelectors: ['.sg-pulldown-demo', '.sg-sandwich-menu-wrap'],
const panel = wrap.querySelector('.sg-help-icon-panel');
if (!button || !panel) {
return;
}
button.addEventListener('click', (event) => {
event.stopPropagation();
const nextState = wrap.dataset.open !== 'true';
document.querySelectorAll('.sg-help-icon-wrap').forEach((otherWrap) => {
const otherButton = otherWrap.querySelector('.sg-help-icon');
otherWrap.dataset.open = 'false';
if (otherButton) {
otherButton.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false';
if (trigger) {
trigger.setAttribute('aria-expanded', 'false');
}
});
wrap.dataset.align = 'left';
wrap.dataset.open = String(nextState);
button.setAttribute('aria-expanded', String(nextState));
if (!nextState) {
return;
}
const panelRect = panel.getBoundingClientRect();
if (panelRect.right > window.innerWidth) {
wrap.dataset.align = 'right';
}
const alignedPanelRect = panel.getBoundingClientRect();
if (alignedPanelRect.left < 0) {
wrap.dataset.align = 'left';
}
});
}); });
document.querySelectorAll('.sg-input-single-line-wrap').forEach((wrap) => { document.querySelectorAll('.sg-input-single-line-wrap').forEach((wrap) => {
@@ -952,15 +901,7 @@
}); });
} }
if (!event.target.closest('.sg-help-icon-wrap') && !event.target.closest('.sg-pulldown-demo')) { if (!event.target.closest('.sg-pulldown-demo')) {
document.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => { document.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger'); const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false'; demo.dataset.open = 'false';
+129
View File
@@ -0,0 +1,129 @@
(function initHelpIconOverlayModule() {
const CLOSE_HANDLERS = {
'.sg-pulldown-demo': (root) => {
root.querySelectorAll('.sg-pulldown-demo').forEach((demo) => {
const trigger = demo.querySelector('.sg-pulldown-demo__trigger');
demo.dataset.open = 'false';
if (trigger) {
trigger.setAttribute('aria-expanded', 'false');
}
});
},
'.sg-sandwich-menu-wrap': (root) => {
root.querySelectorAll('.sg-sandwich-menu-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-sandwich-button');
wrap.dataset.open = 'false';
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
},
};
const getViewportWidth = () => {
if (window.visualViewport && typeof window.visualViewport.width === 'number') {
return window.visualViewport.width;
}
return window.innerWidth;
};
const getSafeInsetPx = () => {
const rootStyles = getComputedStyle(document.documentElement);
const spacingSmallRaw = rootStyles.getPropertyValue('--spacing-small').trim();
const rootFontSize = parseFloat(rootStyles.fontSize) || 16;
const spacingSmallValue = parseFloat(spacingSmallRaw);
if (Number.isNaN(spacingSmallValue)) {
return 0;
}
if (spacingSmallRaw.endsWith('rem')) {
return spacingSmallValue * rootFontSize;
}
return spacingSmallValue;
};
const closeAllHelpIcons = (root) => {
root.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
const button = wrap.querySelector('.sg-help-icon');
const panel = wrap.querySelector('.sg-help-icon-panel');
wrap.dataset.open = 'false';
if (panel) {
panel.style.removeProperty('transform');
}
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
};
window.sgInitHelpIconOverlays = (options = {}) => {
const root = options.root || document;
const closeOnOpenSelectors = options.closeOnOpenSelectors || [];
const outsideClickIgnoreSelectors = options.outsideClickIgnoreSelectors || [];
root.querySelectorAll('.sg-help-icon-wrap').forEach((wrap) => {
if (wrap.dataset.helpIconInit === 'true') {
return;
}
wrap.dataset.helpIconInit = 'true';
const button = wrap.querySelector('.sg-help-icon');
const panel = wrap.querySelector('.sg-help-icon-panel');
if (!button || !panel) {
return;
}
button.addEventListener('click', (event) => {
event.stopPropagation();
const nextState = wrap.dataset.open !== 'true';
closeAllHelpIcons(root);
closeOnOpenSelectors.forEach((selector) => {
const handler = CLOSE_HANDLERS[selector];
if (handler) {
handler(root);
}
});
if (!nextState) {
return;
}
wrap.dataset.align = 'left';
wrap.dataset.open = 'true';
button.setAttribute('aria-expanded', 'true');
const viewportWidth = getViewportWidth();
const panelRect = panel.getBoundingClientRect();
if (panelRect.right > viewportWidth) {
wrap.dataset.align = 'right';
}
const alignedPanelRect = panel.getBoundingClientRect();
if (alignedPanelRect.left < 0) {
wrap.dataset.align = 'left';
}
const clampedRect = panel.getBoundingClientRect();
const safeInset = getSafeInsetPx();
let shiftX = 0;
if (clampedRect.right > (viewportWidth - safeInset)) {
shiftX -= clampedRect.right - (viewportWidth - safeInset);
}
if ((clampedRect.left + shiftX) < safeInset) {
shiftX += safeInset - (clampedRect.left + shiftX);
}
if (shiftX !== 0) {
panel.style.transform = `translateX(${shiftX}px)`;
}
});
});
document.addEventListener('click', (event) => {
const isInsideIgnoredZone = ['.sg-help-icon-wrap', ...outsideClickIgnoreSelectors]
.some((selector) => event.target.closest(selector));
if (isInsideIgnoredZone) {
return;
}
closeAllHelpIcons(root);
});
};
})();