UNPKG

@gez/date-time-kit

Version:

67 lines (60 loc) 2.12 kB
import { type Attrs as PopoverAttrs, Ele as PopoverEle, type EventMap as PopoverEvent } from '.'; import type { BaseAttrs } from '../web-component-base'; export type reExportPopoverAttrs = { [K in `pop-${Exclude<keyof PopoverAttrs, keyof BaseAttrs>}`]?: K extends `pop-${infer U}` ? U extends keyof PopoverAttrs ? PopoverAttrs[U] : never : never; }; export const popoverAttrKeys = [ 'pop-disabled', 'pop-open', 'pop-placement', 'pop-strategy', 'pop-offset' ] as const; export const isPopoverAttrKey = ( name: string ): name is (typeof popoverAttrKeys)[number] => popoverAttrKeys.includes(name as any); export const parentPopAttrSync2PopEle = ( name: string, oldValue: string | null, newValue: string | null, popEle: PopoverEle ): name is (typeof popoverAttrKeys)[number] => { if (oldValue === newValue) return true; const key = name.replace('pop-', '') as keyof PopoverAttrs; if (newValue === null) popEle.removeAttribute(key); else popEle.setAttribute(key, newValue); return true; }; const eleClearupFns = new WeakMap<HTMLElement, () => void>(); export const popEleAttrSync2Parent = ( parent: HTMLElement, popEle: PopoverEle ) => { if (eleClearupFns.has(parent)) return; const onAttrChanged = (evt: PopoverEvent['dt-attribute-changed']) => { if (!(evt.target instanceof PopoverEle)) return; const { name, oldValue, newValue } = evt.detail; if (newValue === oldValue) return; const popName = 'pop-' + name; if (!isPopoverAttrKey(popName)) return; if (newValue === null) parent.removeAttribute(popName); else parent.setAttribute(popName, newValue); }; popEle.addEventListener('dt-attribute-changed', onAttrChanged); const clearup = () => { popEle.removeEventListener('dt-attribute-changed', onAttrChanged); eleClearupFns.delete(parent); }; eleClearupFns.set(parent, clearup); }; export const clearupPopEleAttrSync2Parent = (parent: HTMLElement) => eleClearupFns.get(parent)?.();