@esri/calcite-components
Version:
Web Components for Esri's Calcite Design System.
65 lines (64 loc) • 2.36 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.1/LICENSE.txt */
import { makeGenericController } from "@arcgis/lumina/controllers";
import { safeClassMap } from "@arcgis/lumina";
import { html } from "lit";
const CSS = {
container: "interaction-container"
};
const InteractiveContainer = ({ children, disabled }) => html`<div class=${safeClassMap(CSS.container)} .inert=${disabled}>${children}</div>`;
const useInteractive = makeGenericController((component, controller) => {
controller.onUpdated(() => updateHostInteraction(component));
return InteractiveContainer;
});
function interceptedClick() {
const { disabled } = this;
if (!disabled) {
HTMLElement.prototype.click.call(this);
}
}
function onPointerDown(event) {
const interactiveElement = event.target;
if (interactiveElement.disabled) {
event.preventDefault();
}
}
const nonBubblingWhenDisabledMouseEvents = ["mousedown", "mouseup", "click"];
function onNonBubblingWhenDisabledMouseEvent(event) {
const interactiveElement = event.target;
if (interactiveElement.disabled) {
event.stopImmediatePropagation();
event.preventDefault();
}
}
const captureOnlyOptions = { capture: true };
function updateHostInteraction(component) {
if (component.disabled) {
component.el.setAttribute("aria-disabled", "true");
if (component.el.contains(document.activeElement)) {
document.activeElement.blur();
}
blockInteraction(component);
return;
}
restoreInteraction(component);
component.el.removeAttribute("aria-disabled");
}
function blockInteraction(component) {
component.el.click = interceptedClick;
addInteractionListeners(component.el);
}
function addInteractionListeners(element) {
element.addEventListener("pointerdown", onPointerDown, captureOnlyOptions);
nonBubblingWhenDisabledMouseEvents.forEach((event) => element.addEventListener(event, onNonBubblingWhenDisabledMouseEvent, captureOnlyOptions));
}
function restoreInteraction(component) {
delete component.el.click;
removeInteractionListeners(component.el);
}
function removeInteractionListeners(element) {
element.removeEventListener("pointerdown", onPointerDown, captureOnlyOptions);
nonBubblingWhenDisabledMouseEvents.forEach((event) => element.removeEventListener(event, onNonBubblingWhenDisabledMouseEvent, captureOnlyOptions));
}
export {
useInteractive as u
};