type OdsFormElement = HTMLElement & { getValidationMessage: () => Promise, getValidity: () => Promise, }; async function copyToClipboard(value?: string): Promise { return navigator.clipboard.writeText(value || ''); } function escapeHtml(unsafe: string): string { return (unsafe || '') .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function getRandomHTMLId(): string { return `id-${Date.now()}-${Math.random().toString(36).replace('0.', '')}`; } function isElementInContainer(element: HTMLElement, container: HTMLElement = document.body): boolean { const elementRect = element.getBoundingClientRect(); const containerRect = container.getBoundingClientRect(); return elementRect.top >= containerRect.top && elementRect.right <= containerRect.right && elementRect.bottom <= containerRect.bottom && elementRect.left >= containerRect.left; } function isTargetInElement(event: Event, element?: HTMLElement | null): boolean { if (!element) { return false; } return element.contains(event.target as Node) || event.composedPath().includes(element); } function setInternalsValidity(element: HTMLElement, internals: ElementInternals, validityState: ValidityState, validationMessage: string): void { if (!validityState.valid) { for (const state in validityState) { if (validityState[state as keyof ValidityState]) { internals.setValidity({ [state.toString()]: true }, validationMessage, element); } } } else { internals.setValidity({}); } } function setInternalsValidityFromHtmlElement(formElement: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement, internals: ElementInternals): void { return setInternalsValidity(formElement, internals, formElement.validity, formElement.validationMessage); } async function setInternalsValidityFromOdsComponent(odsFormElement: OdsFormElement, internals: ElementInternals): Promise { const validityState = await odsFormElement.getValidity(); const validationMessage = await odsFormElement.getValidationMessage(); return setInternalsValidity(odsFormElement, internals, validityState, validationMessage); } function submitFormOnClick(event: MouseEvent, form: HTMLFormElement | null): void { if (event.button === 0) { form?.requestSubmit(); } } function submitFormOnEnter(event: KeyboardEvent, form: HTMLFormElement | null): void { if (event.key === 'Enter') { form?.requestSubmit(); } } export { copyToClipboard, escapeHtml, getRandomHTMLId, isElementInContainer, isTargetInElement, setInternalsValidityFromHtmlElement, setInternalsValidityFromOdsComponent, submitFormOnClick, submitFormOnEnter, };