@yamada-ui/utils 2.1.5 → 2.1.6-dev-20260730045651

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.
@@ -1 +1 @@
1
- {"version":3,"file":"color.cjs","names":["c","isNumber"],"sources":["../../src/color.ts"],"sourcesContent":["import * as c from \"color2k\"\nimport { isNumber } from \"./assertion\"\n\nexport type ColorFormat = \"hex\" | \"hexa\" | \"hsl\" | \"hsla\" | \"rgb\" | \"rgba\"\n\nexport const SEMANTIC_COLOR_SCHEMES = [\n \"mono\",\n \"primary\",\n \"secondary\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n \"error\",\n \"link\",\n] as const\n\nexport const DEFAULT_COLOR_SCHEMES = [\n \"gray\",\n \"red\",\n \"rose\",\n \"pink\",\n \"flashy\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n] as const\n\nexport const COLOR_SCHEMES = [\n ...SEMANTIC_COLOR_SCHEMES,\n ...DEFAULT_COLOR_SCHEMES,\n]\n\nexport const TONES = [\n 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,\n] as const\n\nexport function convertColor(\n color: string,\n fallback: string,\n): {\n (format: ColorFormat): string\n}\nexport function convertColor(\n color: string,\n fallback?: string,\n): {\n (format: ColorFormat): string | undefined\n}\nexport function convertColor(color: string, fallback?: string) {\n return function (format: ColorFormat) {\n try {\n const alpha = format.endsWith(\"a\")\n\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n if (format.startsWith(\"hex\")) {\n let hexa = c.toHex(color)\n\n if (alpha) {\n if (hexa.length === 7) hexa += \"ff\"\n } else {\n hexa = hexa.replace(/^#([0-9a-fA-F]{6})[0-9a-fA-F]{2}$/, \"#$1\")\n }\n\n return hexa\n } else if (format.startsWith(\"hsl\")) {\n let hsla = c.toHsla(color)\n\n if (!alpha) {\n hsla = hsla.replace(/hsla/, \"hsl\")\n hsla = hsla.replace(/,\\s*\\d+(\\.\\d+)?\\)$/, \")\")\n }\n\n return hsla\n } else {\n let rgba = c.toRgba(color)\n\n if (!alpha) {\n rgba = rgba.replace(/rgba/, \"rgb\")\n rgba = rgba.replace(/,\\s*\\d+(\\.\\d+)?\\)$/, \")\")\n }\n\n return rgba\n }\n } catch {\n if (fallback) return convertColor(fallback)(format)\n }\n }\n}\n\nexport function calcFormat(color: string): ColorFormat {\n if (color.startsWith(\"hsl\") || color.startsWith(\"rgb\"))\n return color.split(\"(\")[0] as ColorFormat\n else return color.length === 9 ? \"hexa\" : \"hex\"\n}\n\nexport function getAlpha(color: string) {\n return c.parseToRgba(color)[3]\n}\n\nexport function alphaToHex(a: number) {\n if (0 > a) a = 0\n if (1 < a) a = 1\n\n return Math.round(a * 255)\n .toString(16)\n .padStart(2, \"0\")\n}\n\nexport function parseToRgba(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToRgba(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToRgba(color: string, fallback?: string) {\n try {\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n return c.parseToRgba(color)\n } catch {\n if (fallback) return c.parseToRgba(fallback)\n }\n}\n\nexport function parseToHsla(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToHsla(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToHsla(color: string, fallback?: string) {\n try {\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n return c.parseToHsla(color)\n } catch {\n if (fallback) return c.parseToHsla(fallback)\n }\n}\n\nexport function parseToHsv(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToHsv(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToHsv(color: string, fallback?: string) {\n const rgba = parseToRgba(color, fallback)\n\n if (!rgba) return undefined\n\n let [r, g, b, a] = rgba\n\n r = r / 255\n g = g / 255\n b = b / 255\n\n const [min, max] = [Math.min(r, g, b), Math.max(r, g, b)]\n const delta = max - min\n\n let [h, v, s] = [0, max, max == 0 ? 0 : delta / max]\n\n switch (min) {\n case max:\n h = 0\n break\n\n case r:\n h = 60 * ((b - g) / delta) + 180\n break\n\n case g:\n h = 60 * ((r - b) / delta) + 300\n break\n\n case b:\n h = 60 * ((g - r) / delta) + 60\n break\n }\n\n return [h, s, v, a]\n}\n\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n return convertColor(c.rgba(r, g, b, a), fallback)(format)\n }\n}\n\nexport function hslaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function hslaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function hslaTo(\n [h, s, l, a]: [number, number, number, number],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n return convertColor(c.hsla(h, s, l, a), fallback)(format)\n }\n}\n\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n h = h / 60\n\n let rgb: [number, number, number] = [v, v, v]\n\n let i = Math.floor(h)\n let f = h - i\n let p = v * (1 - s)\n let q = v * (1 - s * f)\n let t = v * (1 - s * (1 - f))\n\n switch (i) {\n case 0:\n case 6:\n rgb = [v, t, p]\n break\n\n case 1:\n rgb = [q, v, p]\n break\n\n case 2:\n rgb = [p, v, t]\n break\n\n case 3:\n rgb = [p, q, v]\n break\n\n case 4:\n rgb = [t, p, v]\n break\n\n case 5:\n rgb = [v, p, q]\n break\n }\n\n let color = `rgb(${rgb.map((v) => Math.round(v * 255)).join(\", \")})`\n\n if (isNumber(a)) color = color.replace(/\\)$/, `, ${a})`)\n\n return convertColor(color, fallback)(format)\n }\n}\n\nexport function sameColor(\n color: string | undefined,\n comparison: string | undefined,\n) {\n if (!color) return false\n if (!comparison) return false\n\n const a = parseToRgba(color) ?? []\n const b = parseToRgba(comparison) ?? []\n\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"color.cjs","names":["c","isNumber"],"sources":["../../src/color.ts"],"sourcesContent":["import * as c from \"color2k\"\nimport { isNumber } from \"./assertion\"\n\nexport type ColorFormat = \"hex\" | \"hexa\" | \"hsl\" | \"hsla\" | \"rgb\" | \"rgba\"\n\nexport const SEMANTIC_COLOR_SCHEMES = [\n \"mono\",\n \"primary\",\n \"secondary\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n \"error\",\n \"link\",\n] as const\n\nexport const DEFAULT_COLOR_SCHEMES = [\n \"gray\",\n \"red\",\n \"rose\",\n \"pink\",\n \"flashy\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n] as const\n\nexport const COLOR_SCHEMES = [\n ...SEMANTIC_COLOR_SCHEMES,\n ...DEFAULT_COLOR_SCHEMES,\n]\n\nexport const TONES = [\n 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,\n] as const\n\nexport function convertColor(\n color: string,\n fallback: string,\n): {\n (format: ColorFormat): string\n}\nexport function convertColor(\n color: string,\n fallback?: string,\n): {\n (format: ColorFormat): string | undefined\n}\nexport function convertColor(color: string, fallback?: string) {\n return function (format: ColorFormat) {\n try {\n const alpha = format.endsWith(\"a\")\n\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n if (format.startsWith(\"hex\")) {\n let hexa = c.toHex(color)\n\n if (alpha) {\n if (hexa.length === 7) hexa += \"ff\"\n } else {\n hexa = hexa.replace(/^#([0-9a-fA-F]{6})[0-9a-fA-F]{2}$/, \"#$1\")\n }\n\n return hexa\n } else if (format.startsWith(\"hsl\")) {\n let hsla = c.toHsla(color)\n\n if (!alpha) {\n hsla = hsla.replace(/hsla/, \"hsl\")\n hsla = hsla.replace(/,\\s*\\d+(\\.\\d+)?\\)$/, \")\")\n }\n\n return hsla\n } else {\n let rgba = c.toRgba(color)\n\n if (!alpha) {\n rgba = rgba.replace(/rgba/, \"rgb\")\n rgba = rgba.replace(/,\\s*\\d+(\\.\\d+)?\\)$/, \")\")\n }\n\n return rgba\n }\n } catch {\n if (fallback) return convertColor(fallback)(format)\n }\n }\n}\n\nexport function calcFormat(color: string): ColorFormat {\n if (color.startsWith(\"hsl\") || color.startsWith(\"rgb\"))\n return color.split(\"(\")[0] as ColorFormat\n else return color.length === 9 ? \"hexa\" : \"hex\"\n}\n\nexport function getAlpha(color: string) {\n return c.parseToRgba(color)[3]\n}\n\nexport function alphaToHex(a: number) {\n if (0 > a) a = 0\n if (1 < a) a = 1\n\n return Math.round(a * 255)\n .toString(16)\n .padStart(2, \"0\")\n}\n\nexport function parseToRgba(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToRgba(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToRgba(color: string, fallback?: string) {\n try {\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n return c.parseToRgba(color)\n } catch {\n if (fallback) return c.parseToRgba(fallback)\n }\n}\n\nexport function parseToHsla(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToHsla(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToHsla(color: string, fallback?: string) {\n try {\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n return c.parseToHsla(color)\n } catch {\n if (fallback) return c.parseToHsla(fallback)\n }\n}\n\nexport function parseToHsv(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToHsv(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToHsv(color: string, fallback?: string) {\n const rgba = parseToRgba(color, fallback)\n\n if (!rgba) return undefined\n\n let [r, g, b, a] = rgba\n\n r = r / 255\n g = g / 255\n b = b / 255\n\n const [min, max] = [Math.min(r, g, b), Math.max(r, g, b)]\n const delta = max - min\n\n let [h, v, s] = [0, max, max == 0 ? 0 : delta / max]\n\n switch (min) {\n case max:\n h = 0\n break\n\n case r:\n h = 60 * ((b - g) / delta) + 180\n break\n\n case g:\n h = 60 * ((r - b) / delta) + 300\n break\n\n case b:\n h = 60 * ((g - r) / delta) + 60\n break\n }\n\n return [h, s, v, a]\n}\n\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n return convertColor(c.rgba(r, g, b, a), fallback)(format)\n }\n}\n\nexport function hslaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function hslaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function hslaTo(\n [h, s, l, a]: [number, number, number, number],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n return convertColor(c.hsla(h, s, l, a), fallback)(format)\n }\n}\n\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n h = h / 60\n\n let rgb: [number, number, number] = [v, v, v]\n\n let i = Math.floor(h)\n let f = h - i\n let p = v * (1 - s)\n let q = v * (1 - s * f)\n let t = v * (1 - s * (1 - f))\n\n switch (i) {\n case 0:\n case 6:\n rgb = [v, t, p]\n break\n\n case 1:\n rgb = [q, v, p]\n break\n\n case 2:\n rgb = [p, v, t]\n break\n\n case 3:\n rgb = [p, q, v]\n break\n\n case 4:\n rgb = [t, p, v]\n break\n\n case 5:\n rgb = [v, p, q]\n break\n }\n\n let color = `rgb(${rgb.map((v) => Math.round(v * 255)).join(\", \")})`\n\n if (isNumber(a)) color = color.replace(/\\)$/, `, ${a})`)\n\n return convertColor(color, fallback)(format)\n }\n}\n\nexport function sameColor(\n color: string | undefined,\n comparison: string | undefined,\n) {\n if (!color) return false\n if (!comparison) return false\n\n const a = parseToRgba(color) ?? []\n const b = parseToRgba(comparison) ?? []\n\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]\n}\n"],"mappings":"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"}
package/dist/cjs/dom.cjs CHANGED
@@ -74,7 +74,7 @@ function isFrame(el) {
74
74
  return isHTMLElement(el) && el.tagName === "IFRAME";
75
75
  }
76
76
  function isActiveElement(el, rootNode) {
77
- return getActiveElement(rootNode) === el;
77
+ return (isDocument(rootNode) || isShadowRoot(rootNode)) && getActiveElement(rootNode) === el;
78
78
  }
79
79
  function isHiddenElement(el) {
80
80
  if (el.parentElement && isHiddenElement(el.parentElement)) return true;
@@ -1 +1 @@
1
- {"version":3,"file":"dom.cjs","names":["isArray","isObject","isNumber","isUndefined","include","cx","noop"],"sources":["../../src/dom.ts"],"sourcesContent":["import { isArray, isNumber, isObject, isUndefined } from \"./assertion\"\nimport { noop } from \"./function\"\nimport { cx } from \"./string\"\n\nexport function createdDom(): boolean {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return !!(typeof window !== \"undefined\" && window.document?.createElement)\n}\n\nexport function getPlatform(): string {\n return (navigator as any).userAgentData?.platform ?? navigator.platform\n}\n\nexport function getUserAgent(): string {\n const userAgentData = (navigator as any).userAgentData\n\n if (userAgentData && isArray(userAgentData.brands))\n return userAgentData.brands\n .map(\n ({ brand, version }: { brand: string; version: string }) =>\n `${brand}/${version}`,\n )\n .join(\" \")\n\n return navigator.userAgent\n}\n\nexport function vendor(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(navigator.vendor) : fallback\n}\n\nexport function platform(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(getPlatform()) : fallback\n}\n\nexport function userAgent(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(getUserAgent()) : fallback\n}\n\nexport function isMac(fallback = false): boolean {\n return platform(/^Mac/i, fallback)\n}\n\nexport function isIPhone(fallback = false): boolean {\n return platform(/^iPhone/i, fallback)\n}\n\nexport function isIPad(fallback = false): boolean {\n return (\n platform(/^iPad/i, fallback) ||\n (isMac(fallback) &&\n (createdDom() ? navigator.maxTouchPoints > 1 : fallback))\n )\n}\n\nexport function isIos(fallback = false): boolean {\n return isIPhone(fallback) || isIPad(fallback)\n}\n\nexport function isAndroid(fallback = false): boolean {\n return platform(/^Android/i, fallback)\n}\n\nexport function isApple(fallback = false): boolean {\n return isMac(fallback) || isIos(fallback)\n}\n\nexport function isSafari(fallback = false): boolean {\n return isApple(fallback) && vendor(/apple/i, fallback)\n}\n\nexport function isFirefox(fallback = false): boolean {\n return userAgent(/Firefox/i, fallback)\n}\n\nexport function isChrome(fallback = false): boolean {\n return userAgent(/Chrome/i, fallback)\n}\n\nexport function isWebKit(fallback = false): boolean {\n return userAgent(/AppleWebKit/i, fallback) && !isChrome()\n}\n\nexport function isHTMLElement(el: any): el is HTMLElement {\n return isNode(el) && el.nodeType === Node.ELEMENT_NODE\n}\n\nexport function isWindow(el: any): el is Window {\n return isObject(el) && el === el.window\n}\n\nexport function isDocument(el: any): el is Document {\n return isNode(el) && el.nodeType === Node.DOCUMENT_NODE\n}\n\nexport function isVisualViewport(el: any): el is VisualViewport {\n return isObject(el) && el.constructor.name === \"VisualViewport\"\n}\n\nexport function isNode(el: any): el is Node {\n return isObject(el) && el.nodeType !== undefined\n}\n\nexport function isShadowRoot(el: any): el is ShadowRoot {\n return (\n isNode(el) && el.nodeType === Node.DOCUMENT_FRAGMENT_NODE && \"host\" in el\n )\n}\n\nexport function isFrame(el: any): el is HTMLIFrameElement {\n return isHTMLElement(el) && el.tagName === \"IFRAME\"\n}\n\nexport function isActiveElement(\n el: HTMLElement,\n rootNode: Document | ShadowRoot,\n): boolean {\n return getActiveElement(rootNode) === el\n}\n\nexport function isHiddenElement(el: HTMLElement): boolean {\n if (el.parentElement && isHiddenElement(el.parentElement)) return true\n\n return Boolean(el.hidden)\n}\n\nexport function isDisabledElement(el: HTMLElement): boolean {\n return (\n Boolean(el.getAttribute(\"disabled\")) ||\n Boolean(el.getAttribute(\"data-disabled\")) ||\n Boolean(el.getAttribute(\"aria-disabled\"))\n )\n}\n\nexport function isVisibleElement(el?: Node): boolean {\n if (!isHTMLElement(el)) return false\n\n return (\n el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0\n )\n}\n\nexport function isTouchDevice(): boolean {\n return \"ontouchstart\" in window\n}\n\nconst hasTabIndex = (el: Element): boolean =>\n !Number.isNaN(parseInt(el.getAttribute(\"tabindex\") || \"0\", 10))\n\nconst hasNegativeTabIndex = (el: Element): boolean =>\n parseInt(el.getAttribute(\"tabindex\") || \"0\", 10) < 0\n\nexport function getWindow(\n el: Document | Node | null | ShadowRoot | undefined,\n): typeof globalThis & Window {\n if (isShadowRoot(el)) return getWindow(el.host)\n if (isDocument(el)) return el.defaultView ?? window\n if (isHTMLElement(el)) return el.ownerDocument.defaultView ?? window\n\n return window\n}\n\nexport function getDocument(\n el: Document | Element | Node | null | undefined | Window,\n): Document {\n if (isDocument(el)) return el\n if (isWindow(el)) return el.document\n\n return el?.ownerDocument ?? document\n}\n\nexport function getDocumentElement(\n el: Document | Element | Node | null | undefined | Window,\n): HTMLElement {\n return getDocument(el).documentElement\n}\n\nexport function getNodeName(node: Node | Window): string {\n if (isHTMLElement(node)) return node.localName || \"\"\n\n return \"#document\"\n}\n\nexport function getActiveElement(\n rootNode: Document | ShadowRoot,\n): HTMLElement | null {\n let activeEl = rootNode.activeElement as HTMLElement | null\n\n while (activeEl?.shadowRoot) {\n const el = activeEl.shadowRoot.activeElement as HTMLElement | null\n\n if (el === activeEl) break\n else activeEl = el\n }\n\n return activeEl\n}\n\nexport function getTabbableElements(\n el: HTMLElement | null,\n includeEl?: boolean,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n const tabbableEls = els.filter(isTabbableElement)\n\n if (includeEl && isTabbableElement(el)) tabbableEls.unshift(el)\n\n tabbableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n const allFrameTabbable = getTabbableElements(frameBody)\n tabbableEls.splice(i, 1, ...allFrameTabbable)\n }\n })\n\n if (!tabbableEls.length && includeEl) return els\n\n return tabbableEls\n}\n\nexport function getFirstTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getTabbableElements(el, includeEl)\n\n return first || null\n}\n\nexport function getNextTabbableElement(\n el: HTMLElement | null,\n current?: HTMLElement | null,\n): HTMLElement | null {\n const els = getTabbableElements(el)\n const doc = el?.ownerDocument || document\n const currentElement = current ?? (doc.activeElement as HTMLElement | null)\n\n if (!currentElement) return null\n\n return els[els.indexOf(currentElement) + 1] || null\n}\n\nexport function getLastTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const els = getTabbableElements(el, includeEl)\n\n return els[els.length - 1] || null\n}\n\nexport function getTabbableElementEdges(\n el: HTMLElement | null,\n includeEl?: boolean,\n): [HTMLElement | null, HTMLElement | null] {\n const els = getTabbableElements(el, includeEl)\n const first = els[0] || null\n const last = els[els.length - 1] || null\n\n return [first, last]\n}\n\nexport function getParentNode(node: Node): Node {\n if (getNodeName(node) === \"html\") return node\n\n const result =\n (node as any).assignedSlot ||\n node.parentNode ||\n isShadowRoot(node) ||\n getDocumentElement(node)\n\n return isShadowRoot(result) ? result.host : result\n}\n\nexport function isInputElement(el: any): el is HTMLInputElement {\n return isHTMLElement(el) && el.localName === \"input\"\n}\n\nexport function isEditableElement(\n el: EventTarget | HTMLElement | null,\n): boolean {\n if (el == null || !isHTMLElement(el)) return false\n try {\n return (\n (isInputElement(el) && el.selectionStart != null) ||\n /(textarea|select)/.test(el.localName) ||\n el.isContentEditable ||\n el.getAttribute(\"contenteditable\") === \"true\" ||\n el.getAttribute(\"contenteditable\") === \"\"\n )\n } catch {\n return false\n }\n}\n\nexport function isFocusableElement(el: HTMLElement | null): el is HTMLElement {\n if (!el || el.closest(\"[inert]\")) return false\n\n return el.matches(focusableSelector) && isVisibleElement(el)\n}\n\nexport function isTabbableElement(el: HTMLElement | null): el is HTMLElement {\n if (el != null && el.tabIndex > 0) return true\n return isFocusableElement(el) && !hasNegativeTabIndex(el)\n}\n\nexport function contains(\n parent?: EventTarget | HTMLElement | null,\n child?: EventTarget | HTMLElement | null,\n): boolean {\n if (!parent || !child) return false\n if (!isHTMLElement(parent) || !isHTMLElement(child)) return false\n\n const rootNode = child.getRootNode()\n\n if (parent === child) return true\n if (parent.contains(child)) return true\n\n if (isShadowRoot(rootNode)) {\n let next: Node | null | ShadowRoot = child\n\n while (next) {\n if (parent === next) return true\n\n next = next.parentNode ?? (isShadowRoot(next) ? next.host : null)\n }\n }\n\n return false\n}\n\nexport function getPx(value: number | string | undefined): number {\n if (isNumber(value)) return value\n\n if (isUndefined(value)) return 0\n\n if (value.includes(\"px\")) return parseFloat(value)\n\n let fontSize = 16\n\n if (createdDom()) {\n const style = window.getComputedStyle(document.documentElement)\n\n const computedFontSize = parseFloat(style.fontSize)\n\n if (!isNaN(computedFontSize)) fontSize = computedFontSize\n }\n\n return parseFloat(value) * fontSize\n}\n\nexport function getTabIndex(node: HTMLElement | SVGElement) {\n if (node.tabIndex < 0)\n if (\n (/^(audio|video|details)$/.test(node.localName) ||\n isEditableElement(node)) &&\n !hasTabIndex(node)\n )\n return 0\n\n return node.tabIndex\n}\n\nexport function isTruthyDataAttr(condition: any): boolean {\n return condition === \"true\" || condition === true || condition === \"\"\n}\n\nexport function dataAttr(condition: any): string | undefined {\n return condition ? \"\" : undefined\n}\n\ntype Booleanish = \"false\" | \"true\" | boolean\n\nexport function ariaAttr(condition: any): Booleanish | undefined {\n if (condition === \"true\") return \"true\"\n if (condition === \"false\") return \"false\"\n\n return condition ? true : undefined\n}\n\nexport function uuid() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n .replace(/x/g, () => Math.random().toString(16).slice(2, 3))\n .replace(/y/g, () => ((Math.random() * 4) | 0).toString(16))\n}\n\nconst focusableElList = [\n \"[tabindex]\",\n \"input:not([type='hidden']):not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"a[href]\",\n \"area[href]\",\n \"audio[controls]\",\n \"video[controls]\",\n \"[contenteditable]:not([contenteditable='false'])\",\n \"details > summary:first-of-type\",\n]\n\nconst focusableSelector = focusableElList.join(\", \")\n\nexport function getFocusableElements(\n el: null | Pick<HTMLElement, \"querySelectorAll\">,\n includeEl = false,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n\n const include = includeEl\n\n if (include && isHTMLElement(el) && isFocusableElement(el)) els.unshift(el)\n\n const focusableEls = els.filter(isFocusableElement)\n\n focusableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n\n focusableEls.splice(i, 1, ...getFocusableElements(frameBody))\n }\n })\n\n return focusableEls\n}\n\nexport function getFirstFocusableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getFocusableElements(el, includeEl)\n\n return first || null\n}\n\nexport function setAttribute(\n el: Element,\n qualifiedName: string,\n value?: string,\n) {\n const prev = el.getAttribute(qualifiedName)\n\n el.setAttribute(qualifiedName, cx(prev, value) ?? \"\")\n\n return () => {\n if (prev === null) el.removeAttribute(qualifiedName)\n else el.setAttribute(qualifiedName, prev)\n }\n}\n\nexport function setStyle(\n el: HTMLElement | null | undefined,\n style: Partial<\n CSSStyleDeclaration | { [key: `--${string}`]: number | string }\n >,\n) {\n if (!el) return noop\n\n const prev = Object.keys(style).reduce<{ [key: string]: string }>(\n (acc, key) => {\n acc[key] = el.style.getPropertyValue(key)\n\n return acc\n },\n {},\n )\n\n Object.assign(el.style, style)\n\n return () => {\n Object.assign(el.style, prev)\n\n if (el.style.length === 0) el.removeAttribute(\"style\")\n }\n}\n\nconst LOCK_DATA_ATTR = \"data-scroll-lock\"\n\nexport function scrollLock(\n el: Document | Element | Node | null | undefined | Window,\n) {\n const doc = getDocument(el)\n const win = getWindow(doc)\n\n const locked = doc.body.hasAttribute(LOCK_DATA_ATTR)\n\n if (locked) return\n\n const scrollbarWidth = win.innerWidth - doc.documentElement.clientWidth\n const documentLeft = doc.documentElement.getBoundingClientRect().left\n const scrollbarX = Math.round(documentLeft) + doc.documentElement.scrollLeft\n const paddingProperty = scrollbarX ? \"paddingLeft\" : \"paddingRight\"\n\n doc.body.setAttribute(LOCK_DATA_ATTR, \"\")\n\n const setStyleForIOS = () => {\n const offsetLeft = win.visualViewport?.offsetLeft ?? 0\n const offsetTop = win.visualViewport?.offsetTop ?? 0\n\n const restoreStyle = setStyle(doc.body, {\n left: `${-(win.scrollX - Math.floor(offsetLeft))}px`,\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n position: \"fixed\",\n right: \"0\",\n top: `${-(win.scrollY - Math.floor(offsetTop))}px`,\n })\n\n return () => {\n restoreStyle()\n win.scrollTo({ behavior: \"instant\", left: win.scrollX, top: win.scrollY })\n }\n }\n\n const unsubscribes = [\n setStyle(doc.documentElement, {\n \"--scrollbar-width\": `${scrollbarWidth}px`,\n }),\n isIos()\n ? setStyleForIOS()\n : setStyle(doc.body, {\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n }),\n ]\n\n return () => {\n unsubscribes.forEach((unsubscribe) => unsubscribe())\n\n doc.body.removeAttribute(LOCK_DATA_ATTR)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dom.cjs","names":["isArray","isObject","isNumber","isUndefined","include","cx","noop"],"sources":["../../src/dom.ts"],"sourcesContent":["import { isArray, isNumber, isObject, isUndefined } from \"./assertion\"\nimport { noop } from \"./function\"\nimport { cx } from \"./string\"\n\nexport function createdDom(): boolean {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return !!(typeof window !== \"undefined\" && window.document?.createElement)\n}\n\nexport function getPlatform(): string {\n return (navigator as any).userAgentData?.platform ?? navigator.platform\n}\n\nexport function getUserAgent(): string {\n const userAgentData = (navigator as any).userAgentData\n\n if (userAgentData && isArray(userAgentData.brands))\n return userAgentData.brands\n .map(\n ({ brand, version }: { brand: string; version: string }) =>\n `${brand}/${version}`,\n )\n .join(\" \")\n\n return navigator.userAgent\n}\n\nexport function vendor(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(navigator.vendor) : fallback\n}\n\nexport function platform(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(getPlatform()) : fallback\n}\n\nexport function userAgent(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(getUserAgent()) : fallback\n}\n\nexport function isMac(fallback = false): boolean {\n return platform(/^Mac/i, fallback)\n}\n\nexport function isIPhone(fallback = false): boolean {\n return platform(/^iPhone/i, fallback)\n}\n\nexport function isIPad(fallback = false): boolean {\n return (\n platform(/^iPad/i, fallback) ||\n (isMac(fallback) &&\n (createdDom() ? navigator.maxTouchPoints > 1 : fallback))\n )\n}\n\nexport function isIos(fallback = false): boolean {\n return isIPhone(fallback) || isIPad(fallback)\n}\n\nexport function isAndroid(fallback = false): boolean {\n return platform(/^Android/i, fallback)\n}\n\nexport function isApple(fallback = false): boolean {\n return isMac(fallback) || isIos(fallback)\n}\n\nexport function isSafari(fallback = false): boolean {\n return isApple(fallback) && vendor(/apple/i, fallback)\n}\n\nexport function isFirefox(fallback = false): boolean {\n return userAgent(/Firefox/i, fallback)\n}\n\nexport function isChrome(fallback = false): boolean {\n return userAgent(/Chrome/i, fallback)\n}\n\nexport function isWebKit(fallback = false): boolean {\n return userAgent(/AppleWebKit/i, fallback) && !isChrome()\n}\n\nexport function isHTMLElement(el: any): el is HTMLElement {\n return isNode(el) && el.nodeType === Node.ELEMENT_NODE\n}\n\nexport function isWindow(el: any): el is Window {\n return isObject(el) && el === el.window\n}\n\nexport function isDocument(el: any): el is Document {\n return isNode(el) && el.nodeType === Node.DOCUMENT_NODE\n}\n\nexport function isVisualViewport(el: any): el is VisualViewport {\n return isObject(el) && el.constructor.name === \"VisualViewport\"\n}\n\nexport function isNode(el: any): el is Node {\n return isObject(el) && el.nodeType !== undefined\n}\n\nexport function isShadowRoot(el: any): el is ShadowRoot {\n return (\n isNode(el) && el.nodeType === Node.DOCUMENT_FRAGMENT_NODE && \"host\" in el\n )\n}\n\nexport function isFrame(el: any): el is HTMLIFrameElement {\n return isHTMLElement(el) && el.tagName === \"IFRAME\"\n}\n\nexport function isActiveElement(\n el: HTMLElement,\n rootNode: Document | Node | ShadowRoot,\n): boolean {\n return (\n (isDocument(rootNode) || isShadowRoot(rootNode)) &&\n getActiveElement(rootNode) === el\n )\n}\n\nexport function isHiddenElement(el: HTMLElement): boolean {\n if (el.parentElement && isHiddenElement(el.parentElement)) return true\n\n return Boolean(el.hidden)\n}\n\nexport function isDisabledElement(el: HTMLElement): boolean {\n return (\n Boolean(el.getAttribute(\"disabled\")) ||\n Boolean(el.getAttribute(\"data-disabled\")) ||\n Boolean(el.getAttribute(\"aria-disabled\"))\n )\n}\n\nexport function isVisibleElement(el?: Node): boolean {\n if (!isHTMLElement(el)) return false\n\n return (\n el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0\n )\n}\n\nexport function isTouchDevice(): boolean {\n return \"ontouchstart\" in window\n}\n\nconst hasTabIndex = (el: Element): boolean =>\n !Number.isNaN(parseInt(el.getAttribute(\"tabindex\") || \"0\", 10))\n\nconst hasNegativeTabIndex = (el: Element): boolean =>\n parseInt(el.getAttribute(\"tabindex\") || \"0\", 10) < 0\n\nexport function getWindow(\n el: Document | Node | null | ShadowRoot | undefined,\n): typeof globalThis & Window {\n if (isShadowRoot(el)) return getWindow(el.host)\n if (isDocument(el)) return el.defaultView ?? window\n if (isHTMLElement(el)) return el.ownerDocument.defaultView ?? window\n\n return window\n}\n\nexport function getDocument(\n el: Document | Element | Node | null | undefined | Window,\n): Document {\n if (isDocument(el)) return el\n if (isWindow(el)) return el.document\n\n return el?.ownerDocument ?? document\n}\n\nexport function getDocumentElement(\n el: Document | Element | Node | null | undefined | Window,\n): HTMLElement {\n return getDocument(el).documentElement\n}\n\nexport function getNodeName(node: Node | Window): string {\n if (isHTMLElement(node)) return node.localName || \"\"\n\n return \"#document\"\n}\n\nexport function getActiveElement(\n rootNode: Document | ShadowRoot,\n): HTMLElement | null {\n let activeEl = rootNode.activeElement as HTMLElement | null\n\n while (activeEl?.shadowRoot) {\n const el = activeEl.shadowRoot.activeElement as HTMLElement | null\n\n if (el === activeEl) break\n else activeEl = el\n }\n\n return activeEl\n}\n\nexport function getTabbableElements(\n el: HTMLElement | null,\n includeEl?: boolean,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n const tabbableEls = els.filter(isTabbableElement)\n\n if (includeEl && isTabbableElement(el)) tabbableEls.unshift(el)\n\n tabbableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n const allFrameTabbable = getTabbableElements(frameBody)\n tabbableEls.splice(i, 1, ...allFrameTabbable)\n }\n })\n\n if (!tabbableEls.length && includeEl) return els\n\n return tabbableEls\n}\n\nexport function getFirstTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getTabbableElements(el, includeEl)\n\n return first || null\n}\n\nexport function getNextTabbableElement(\n el: HTMLElement | null,\n current?: HTMLElement | null,\n): HTMLElement | null {\n const els = getTabbableElements(el)\n const doc = el?.ownerDocument || document\n const currentElement = current ?? (doc.activeElement as HTMLElement | null)\n\n if (!currentElement) return null\n\n return els[els.indexOf(currentElement) + 1] || null\n}\n\nexport function getLastTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const els = getTabbableElements(el, includeEl)\n\n return els[els.length - 1] || null\n}\n\nexport function getTabbableElementEdges(\n el: HTMLElement | null,\n includeEl?: boolean,\n): [HTMLElement | null, HTMLElement | null] {\n const els = getTabbableElements(el, includeEl)\n const first = els[0] || null\n const last = els[els.length - 1] || null\n\n return [first, last]\n}\n\nexport function getParentNode(node: Node): Node {\n if (getNodeName(node) === \"html\") return node\n\n const result =\n (node as any).assignedSlot ||\n node.parentNode ||\n isShadowRoot(node) ||\n getDocumentElement(node)\n\n return isShadowRoot(result) ? result.host : result\n}\n\nexport function isInputElement(el: any): el is HTMLInputElement {\n return isHTMLElement(el) && el.localName === \"input\"\n}\n\nexport function isEditableElement(\n el: EventTarget | HTMLElement | null,\n): boolean {\n if (el == null || !isHTMLElement(el)) return false\n try {\n return (\n (isInputElement(el) && el.selectionStart != null) ||\n /(textarea|select)/.test(el.localName) ||\n el.isContentEditable ||\n el.getAttribute(\"contenteditable\") === \"true\" ||\n el.getAttribute(\"contenteditable\") === \"\"\n )\n } catch {\n return false\n }\n}\n\nexport function isFocusableElement(el: HTMLElement | null): el is HTMLElement {\n if (!el || el.closest(\"[inert]\")) return false\n\n return el.matches(focusableSelector) && isVisibleElement(el)\n}\n\nexport function isTabbableElement(el: HTMLElement | null): el is HTMLElement {\n if (el != null && el.tabIndex > 0) return true\n return isFocusableElement(el) && !hasNegativeTabIndex(el)\n}\n\nexport function contains(\n parent?: EventTarget | HTMLElement | null,\n child?: EventTarget | HTMLElement | null,\n): boolean {\n if (!parent || !child) return false\n if (!isHTMLElement(parent) || !isHTMLElement(child)) return false\n\n const rootNode = child.getRootNode()\n\n if (parent === child) return true\n if (parent.contains(child)) return true\n\n if (isShadowRoot(rootNode)) {\n let next: Node | null | ShadowRoot = child\n\n while (next) {\n if (parent === next) return true\n\n next = next.parentNode ?? (isShadowRoot(next) ? next.host : null)\n }\n }\n\n return false\n}\n\nexport function getPx(value: number | string | undefined): number {\n if (isNumber(value)) return value\n\n if (isUndefined(value)) return 0\n\n if (value.includes(\"px\")) return parseFloat(value)\n\n let fontSize = 16\n\n if (createdDom()) {\n const style = window.getComputedStyle(document.documentElement)\n\n const computedFontSize = parseFloat(style.fontSize)\n\n if (!isNaN(computedFontSize)) fontSize = computedFontSize\n }\n\n return parseFloat(value) * fontSize\n}\n\nexport function getTabIndex(node: HTMLElement | SVGElement) {\n if (node.tabIndex < 0)\n if (\n (/^(audio|video|details)$/.test(node.localName) ||\n isEditableElement(node)) &&\n !hasTabIndex(node)\n )\n return 0\n\n return node.tabIndex\n}\n\nexport function isTruthyDataAttr(condition: any): boolean {\n return condition === \"true\" || condition === true || condition === \"\"\n}\n\nexport function dataAttr(condition: any): string | undefined {\n return condition ? \"\" : undefined\n}\n\ntype Booleanish = \"false\" | \"true\" | boolean\n\nexport function ariaAttr(condition: any): Booleanish | undefined {\n if (condition === \"true\") return \"true\"\n if (condition === \"false\") return \"false\"\n\n return condition ? true : undefined\n}\n\nexport function uuid() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n .replace(/x/g, () => Math.random().toString(16).slice(2, 3))\n .replace(/y/g, () => ((Math.random() * 4) | 0).toString(16))\n}\n\nconst focusableElList = [\n \"[tabindex]\",\n \"input:not([type='hidden']):not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"a[href]\",\n \"area[href]\",\n \"audio[controls]\",\n \"video[controls]\",\n \"[contenteditable]:not([contenteditable='false'])\",\n \"details > summary:first-of-type\",\n]\n\nconst focusableSelector = focusableElList.join(\", \")\n\nexport function getFocusableElements(\n el: null | Pick<HTMLElement, \"querySelectorAll\">,\n includeEl = false,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n\n const include = includeEl\n\n if (include && isHTMLElement(el) && isFocusableElement(el)) els.unshift(el)\n\n const focusableEls = els.filter(isFocusableElement)\n\n focusableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n\n focusableEls.splice(i, 1, ...getFocusableElements(frameBody))\n }\n })\n\n return focusableEls\n}\n\nexport function getFirstFocusableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getFocusableElements(el, includeEl)\n\n return first || null\n}\n\nexport function setAttribute(\n el: Element,\n qualifiedName: string,\n value?: string,\n) {\n const prev = el.getAttribute(qualifiedName)\n\n el.setAttribute(qualifiedName, cx(prev, value) ?? \"\")\n\n return () => {\n if (prev === null) el.removeAttribute(qualifiedName)\n else el.setAttribute(qualifiedName, prev)\n }\n}\n\nexport function setStyle(\n el: HTMLElement | null | undefined,\n style: Partial<\n CSSStyleDeclaration | { [key: `--${string}`]: number | string }\n >,\n) {\n if (!el) return noop\n\n const prev = Object.keys(style).reduce<{ [key: string]: string }>(\n (acc, key) => {\n acc[key] = el.style.getPropertyValue(key)\n\n return acc\n },\n {},\n )\n\n Object.assign(el.style, style)\n\n return () => {\n Object.assign(el.style, prev)\n\n if (el.style.length === 0) el.removeAttribute(\"style\")\n }\n}\n\nconst LOCK_DATA_ATTR = \"data-scroll-lock\"\n\nexport function scrollLock(\n el: Document | Element | Node | null | undefined | Window,\n) {\n const doc = getDocument(el)\n const win = getWindow(doc)\n\n const locked = doc.body.hasAttribute(LOCK_DATA_ATTR)\n\n if (locked) return\n\n const scrollbarWidth = win.innerWidth - doc.documentElement.clientWidth\n const documentLeft = doc.documentElement.getBoundingClientRect().left\n const scrollbarX = Math.round(documentLeft) + doc.documentElement.scrollLeft\n const paddingProperty = scrollbarX ? \"paddingLeft\" : \"paddingRight\"\n\n doc.body.setAttribute(LOCK_DATA_ATTR, \"\")\n\n const setStyleForIOS = () => {\n const offsetLeft = win.visualViewport?.offsetLeft ?? 0\n const offsetTop = win.visualViewport?.offsetTop ?? 0\n\n const restoreStyle = setStyle(doc.body, {\n left: `${-(win.scrollX - Math.floor(offsetLeft))}px`,\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n position: \"fixed\",\n right: \"0\",\n top: `${-(win.scrollY - Math.floor(offsetTop))}px`,\n })\n\n return () => {\n restoreStyle()\n win.scrollTo({ behavior: \"instant\", left: win.scrollX, top: win.scrollY })\n }\n }\n\n const unsubscribes = [\n setStyle(doc.documentElement, {\n \"--scrollbar-width\": `${scrollbarWidth}px`,\n }),\n isIos()\n ? setStyleForIOS()\n : setStyle(doc.body, {\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n }),\n ]\n\n return () => {\n unsubscribes.forEach((unsubscribe) => unsubscribe())\n\n doc.body.removeAttribute(LOCK_DATA_ATTR)\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"event.cjs","names":["noop","getDocument","getTabbableElementEdges","isFunction","getNextTabbableElement"],"sources":["../../src/event.ts"],"sourcesContent":["import { isFunction } from \"./assertion\"\nimport {\n getDocument,\n getNextTabbableElement,\n getTabbableElementEdges,\n} from \"./dom\"\nimport { noop } from \"./function\"\n\nexport type AnyPointerEvent = MouseEvent | PointerEvent | TouchEvent\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport function isMouseEvent(ev: any): ev is MouseEvent {\n const win = getEventWindow(ev)\n\n if (typeof win.PointerEvent !== \"undefined\" && ev instanceof win.PointerEvent)\n return !!(ev.pointerType === \"mouse\")\n\n return ev instanceof win.MouseEvent\n}\n\nexport function isTouchEvent(ev: AnyPointerEvent): ev is TouchEvent {\n return !!(ev as TouchEvent).touches\n}\n\nexport function isMultiTouchEvent(ev: AnyPointerEvent): boolean {\n return isTouchEvent(ev) && ev.touches.length > 1\n}\n\nexport function getEventWindow(ev: Event): typeof globalThis {\n return ((ev as UIEvent).view ?? window) as unknown as typeof globalThis\n}\n\nexport function pointFromTouch(\n e: TouchEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n const point = e.touches[0] || e.changedTouches[0]\n\n return { x: point?.[`${type}X`] ?? 0, y: point?.[`${type}Y`] ?? 0 }\n}\n\nexport function pointFromMouse(\n point: MouseEvent | PointerEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n return {\n x: point[`${type}X`],\n y: point[`${type}Y`],\n }\n}\n\nexport function getEventPoint(\n ev: AnyPointerEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n return isTouchEvent(ev) ? pointFromTouch(ev, type) : pointFromMouse(ev, type)\n}\n\nexport interface EventMap\n extends\n DocumentEventMap,\n GlobalEventHandlersEventMap,\n WindowEventMap,\n FontFaceSetEventMap {}\n\nexport type EventType = keyof EventMap\n\nexport function addDomEvent<Y extends EventType>(\n target: EventTarget,\n type: Y,\n cb: (ev: EventMap[Y]) => void,\n options?: AddEventListenerOptions | boolean,\n) {\n target.addEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n\n return () => {\n target.removeEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n }\n}\n\nexport function focusTrap(\n el: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n if (!el) return noop\n\n const doc = getDocument(el)\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, false)\n\n if (ev.shiftKey) {\n if (doc.activeElement === firstTabbable) elToFocus = lastTabbable\n } else {\n if (doc.activeElement === lastTabbable) elToFocus = firstTabbable\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) onFocus(elToFocus)\n else elToFocus.focus()\n }\n\n return addDomEvent(el, \"keydown\", onKeyDown, true)\n}\n\nexport function focusTransfer(\n el: HTMLElement | null,\n target?: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n const doc = getDocument(el)\n const body = doc.body\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, false)\n const nextTabbable = getNextTabbableElement(body, target)\n const noTabbableEls = !firstTabbable && !lastTabbable\n\n if (ev.shiftKey) {\n if (nextTabbable === doc.activeElement) {\n if (doc.activeElement !== lastTabbable) elToFocus = lastTabbable\n } else if (doc.activeElement === firstTabbable || noTabbableEls) {\n if (doc.activeElement !== target) elToFocus = target\n }\n } else {\n if (doc.activeElement === target) {\n if (doc.activeElement !== firstTabbable) elToFocus = firstTabbable\n } else if (doc.activeElement === lastTabbable || noTabbableEls) {\n if (doc.activeElement !== nextTabbable) elToFocus = nextTabbable\n }\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) onFocus(elToFocus)\n else elToFocus.focus()\n }\n\n return addDomEvent(doc, \"keydown\", onKeyDown, true)\n}\n"],"mappings":";;;;AAeA,SAAgB,aAAa,IAA2B;CACtD,MAAM,MAAM,eAAe,EAAE;CAE7B,IAAI,OAAO,IAAI,iBAAiB,eAAe,cAAc,IAAI,cAC/D,OAAO,CAAC,EAAE,GAAG,gBAAgB;CAE/B,OAAO,cAAc,IAAI;AAC3B;AAEA,SAAgB,aAAa,IAAuC;CAClE,OAAO,CAAC,CAAE,GAAkB;AAC9B;AAEA,SAAgB,kBAAkB,IAA8B;CAC9D,OAAO,aAAa,EAAE,KAAK,GAAG,QAAQ,SAAS;AACjD;AAEA,SAAgB,eAAe,IAA8B;CAC3D,OAAS,GAAe,QAAQ;AAClC;AAEA,SAAgB,eACd,GACA,OAA0B,UACnB;CACP,MAAM,QAAQ,EAAE,QAAQ,MAAM,EAAE,eAAe;CAE/C,OAAO;EAAE,GAAG,QAAQ,GAAG,KAAK,OAAO;EAAG,GAAG,QAAQ,GAAG,KAAK,OAAO;CAAE;AACpE;AAEA,SAAgB,eACd,OACA,OAA0B,UACnB;CACP,OAAO;EACL,GAAG,MAAM,GAAG,KAAK;EACjB,GAAG,MAAM,GAAG,KAAK;CACnB;AACF;AAEA,SAAgB,cACd,IACA,OAA0B,UACnB;CACP,OAAO,aAAa,EAAE,IAAI,eAAe,IAAI,IAAI,IAAI,eAAe,IAAI,IAAI;AAC9E;AAWA,SAAgB,YACd,QACA,MACA,IACA,SACA;CACA,OAAO,iBACL,MACA,IACA,OACF;CAEA,aAAa;EACX,OAAO,oBACL,MACA,IACA,OACF;CACF;AACF;AAEA,SAAgB,UACd,IACA,SACA;CACA,IAAI,CAAC,IAAI,OAAOA,iBAAAA;CAEhB,MAAM,MAAMC,YAAAA,YAAY,EAAE;CAE1B,SAAS,UAAU,IAAmB;EACpC,IAAI,GAAG,QAAQ,OAAO;EAEtB,IAAI,YAA4C;EAEhD,MAAM,CAAC,eAAe,gBAAgBC,YAAAA,wBAAwB,IAAI,KAAK;EAEvE,IAAI,GAAG;OACD,IAAI,kBAAkB,eAAe,YAAY;EAAA,OAErD,IAAI,IAAI,kBAAkB,cAAc,YAAY;EAGtD,IAAI,CAAC,WAAW;EAEhB,GAAG,eAAe;EAElB,IAAIC,kBAAAA,WAAW,OAAO,GAAG,QAAQ,SAAS;OACrC,UAAU,MAAM;CACvB;CAEA,OAAO,YAAY,IAAI,WAAW,WAAW,IAAI;AACnD;AAEA,SAAgB,cACd,IACA,QACA,SACA;CACA,MAAM,MAAMF,YAAAA,YAAY,EAAE;CAC1B,MAAM,OAAO,IAAI;CAEjB,SAAS,UAAU,IAAmB;EACpC,IAAI,GAAG,QAAQ,OAAO;EAEtB,IAAI,YAA4C;EAEhD,MAAM,CAAC,eAAe,gBAAgBC,YAAAA,wBAAwB,IAAI,KAAK;EACvE,MAAM,eAAeE,YAAAA,uBAAuB,MAAM,MAAM;EACxD,MAAM,gBAAgB,CAAC,iBAAiB,CAAC;EAEzC,IAAI,GAAG;OACD,iBAAiB,IAAI;QACnB,IAAI,kBAAkB,cAAc,YAAY;GAAA,OAC/C,IAAI,IAAI,kBAAkB,iBAAiB;QAC5C,IAAI,kBAAkB,QAAQ,YAAY;GAAA;EAAK,OAGrD,IAAI,IAAI,kBAAkB;OACpB,IAAI,kBAAkB,eAAe,YAAY;EAAA,OAChD,IAAI,IAAI,kBAAkB,gBAAgB;OAC3C,IAAI,kBAAkB,cAAc,YAAY;EAAA;EAIxD,IAAI,CAAC,WAAW;EAEhB,GAAG,eAAe;EAElB,IAAID,kBAAAA,WAAW,OAAO,GAAG,QAAQ,SAAS;OACrC,UAAU,MAAM;CACvB;CAEA,OAAO,YAAY,KAAK,WAAW,WAAW,IAAI;AACpD"}
1
+ {"version":3,"file":"event.cjs","names":["noop","getDocument","getTabbableElementEdges","isFunction","getNextTabbableElement"],"sources":["../../src/event.ts"],"sourcesContent":["import { isFunction } from \"./assertion\"\nimport {\n getDocument,\n getNextTabbableElement,\n getTabbableElementEdges,\n} from \"./dom\"\nimport { noop } from \"./function\"\n\nexport type AnyPointerEvent = MouseEvent | PointerEvent | TouchEvent\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport function isMouseEvent(ev: any): ev is MouseEvent {\n const win = getEventWindow(ev)\n\n if (typeof win.PointerEvent !== \"undefined\" && ev instanceof win.PointerEvent)\n return !!(ev.pointerType === \"mouse\")\n\n return ev instanceof win.MouseEvent\n}\n\nexport function isTouchEvent(ev: AnyPointerEvent): ev is TouchEvent {\n return !!(ev as TouchEvent).touches\n}\n\nexport function isMultiTouchEvent(ev: AnyPointerEvent): boolean {\n return isTouchEvent(ev) && ev.touches.length > 1\n}\n\nexport function getEventWindow(ev: Event): typeof globalThis {\n return ((ev as UIEvent).view ?? window) as unknown as typeof globalThis\n}\n\nexport function pointFromTouch(\n e: TouchEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n const point = e.touches[0] || e.changedTouches[0]\n\n return { x: point?.[`${type}X`] ?? 0, y: point?.[`${type}Y`] ?? 0 }\n}\n\nexport function pointFromMouse(\n point: MouseEvent | PointerEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n return {\n x: point[`${type}X`],\n y: point[`${type}Y`],\n }\n}\n\nexport function getEventPoint(\n ev: AnyPointerEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n return isTouchEvent(ev) ? pointFromTouch(ev, type) : pointFromMouse(ev, type)\n}\n\nexport interface EventMap\n extends\n DocumentEventMap,\n GlobalEventHandlersEventMap,\n WindowEventMap,\n FontFaceSetEventMap {}\n\nexport type EventType = keyof EventMap\n\nexport function addDomEvent<Y extends EventType>(\n target: EventTarget,\n type: Y,\n cb: (ev: EventMap[Y]) => void,\n options?: AddEventListenerOptions | boolean,\n) {\n target.addEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n\n return () => {\n target.removeEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n }\n}\n\nexport function focusTrap(\n el: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n if (!el) return noop\n\n const doc = getDocument(el)\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, false)\n\n if (ev.shiftKey) {\n if (doc.activeElement === firstTabbable) elToFocus = lastTabbable\n } else {\n if (doc.activeElement === lastTabbable) elToFocus = firstTabbable\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) onFocus(elToFocus)\n else elToFocus.focus()\n }\n\n return addDomEvent(el, \"keydown\", onKeyDown, true)\n}\n\nexport function focusTransfer(\n el: HTMLElement | null,\n target?: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n const doc = getDocument(el)\n const body = doc.body\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, false)\n const nextTabbable = getNextTabbableElement(body, target)\n const noTabbableEls = !firstTabbable && !lastTabbable\n\n if (ev.shiftKey) {\n if (nextTabbable === doc.activeElement) {\n if (doc.activeElement !== lastTabbable) elToFocus = lastTabbable\n } else if (doc.activeElement === firstTabbable || noTabbableEls) {\n if (doc.activeElement !== target) elToFocus = target\n }\n } else {\n if (doc.activeElement === target) {\n if (doc.activeElement !== firstTabbable) elToFocus = firstTabbable\n } else if (doc.activeElement === lastTabbable || noTabbableEls) {\n if (doc.activeElement !== nextTabbable) elToFocus = nextTabbable\n }\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) onFocus(elToFocus)\n else elToFocus.focus()\n }\n\n return addDomEvent(doc, \"keydown\", onKeyDown, true)\n}\n"],"mappings":";;;;AAeA,SAAgB,aAAa,IAA2B;CACtD,MAAM,MAAM,eAAe,EAAE;CAE7B,IAAI,OAAO,IAAI,iBAAiB,eAAe,cAAc,IAAI,cAC/D,OAAO,CAAC,EAAE,GAAG,gBAAgB;CAE/B,OAAO,cAAc,IAAI;AAC3B;AAEA,SAAgB,aAAa,IAAuC;CAClE,OAAO,CAAC,CAAE,GAAkB;AAC9B;AAEA,SAAgB,kBAAkB,IAA8B;CAC9D,OAAO,aAAa,EAAE,KAAK,GAAG,QAAQ,SAAS;AACjD;AAEA,SAAgB,eAAe,IAA8B;CAC3D,OAAS,GAAe,QAAQ;AAClC;AAEA,SAAgB,eACd,GACA,OAA0B,UACnB;CACP,MAAM,QAAQ,EAAE,QAAQ,MAAM,EAAE,eAAe;CAE/C,OAAO;EAAE,GAAG,QAAQ,GAAG,KAAK,OAAO;EAAG,GAAG,QAAQ,GAAG,KAAK,OAAO;CAAE;AACpE;AAEA,SAAgB,eACd,OACA,OAA0B,UACnB;CACP,OAAO;EACL,GAAG,MAAM,GAAG,KAAK;EACjB,GAAG,MAAM,GAAG,KAAK;CACnB;AACF;AAEA,SAAgB,cACd,IACA,OAA0B,UACnB;CACP,OAAO,aAAa,EAAE,IAAI,eAAe,IAAI,IAAI,IAAI,eAAe,IAAI,IAAI;AAC9E;AAWA,SAAgB,YACd,QACA,MACA,IACA,SACA;CACA,OAAO,iBACL,MACA,IACA,OACF;CAEA,aAAa;EACX,OAAO,oBACL,MACA,IACA,OACF;CACF;AACF;AAEA,SAAgB,UACd,IACA,SACA;CACA,IAAI,CAAC,IAAI,OAAOA,iBAAAA;CAEhB,MAAM,MAAMC,YAAAA,YAAY,EAAE;CAE1B,SAAS,UAAU,IAAmB;EACpC,IAAI,GAAG,QAAQ,OAAO;EAEtB,IAAI,YAA4C;EAEhD,MAAM,CAAC,eAAe,gBAAgBC,YAAAA,wBAAwB,IAAI,KAAK;EAEvE,IAAI,GAAG,UACD;OAAA,IAAI,kBAAkB,eAAe,YAAY;EAAA,OAErD,IAAI,IAAI,kBAAkB,cAAc,YAAY;EAGtD,IAAI,CAAC,WAAW;EAEhB,GAAG,eAAe;EAElB,IAAIC,kBAAAA,WAAW,OAAO,GAAG,QAAQ,SAAS;OACrC,UAAU,MAAM;CACvB;CAEA,OAAO,YAAY,IAAI,WAAW,WAAW,IAAI;AACnD;AAEA,SAAgB,cACd,IACA,QACA,SACA;CACA,MAAM,MAAMF,YAAAA,YAAY,EAAE;CAC1B,MAAM,OAAO,IAAI;CAEjB,SAAS,UAAU,IAAmB;EACpC,IAAI,GAAG,QAAQ,OAAO;EAEtB,IAAI,YAA4C;EAEhD,MAAM,CAAC,eAAe,gBAAgBC,YAAAA,wBAAwB,IAAI,KAAK;EACvE,MAAM,eAAeE,YAAAA,uBAAuB,MAAM,MAAM;EACxD,MAAM,gBAAgB,CAAC,iBAAiB,CAAC;EAEzC,IAAI,GAAG,UACD;OAAA,iBAAiB,IAAI,eACnB;QAAA,IAAI,kBAAkB,cAAc,YAAY;GAAA,OAC/C,IAAI,IAAI,kBAAkB,iBAAiB,eAC5C;QAAA,IAAI,kBAAkB,QAAQ,YAAY;GAAA;EAAK,OAGrD,IAAI,IAAI,kBAAkB,QACpB;OAAA,IAAI,kBAAkB,eAAe,YAAY;EAAA,OAChD,IAAI,IAAI,kBAAkB,gBAAgB,eAC3C;OAAA,IAAI,kBAAkB,cAAc,YAAY;EAAA;EAIxD,IAAI,CAAC,WAAW;EAEhB,GAAG,eAAe;EAElB,IAAID,kBAAAA,WAAW,OAAO,GAAG,QAAQ,SAAS;OACrC,UAAU,MAAM;CACvB;CAEA,OAAO,YAAY,KAAK,WAAW,WAAW,IAAI;AACpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"color.js","names":[],"sources":["../../src/color.ts"],"sourcesContent":["import * as c from \"color2k\"\nimport { isNumber } from \"./assertion\"\n\nexport type ColorFormat = \"hex\" | \"hexa\" | \"hsl\" | \"hsla\" | \"rgb\" | \"rgba\"\n\nexport const SEMANTIC_COLOR_SCHEMES = [\n \"mono\",\n \"primary\",\n \"secondary\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n \"error\",\n \"link\",\n] as const\n\nexport const DEFAULT_COLOR_SCHEMES = [\n \"gray\",\n \"red\",\n \"rose\",\n \"pink\",\n \"flashy\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n] as const\n\nexport const COLOR_SCHEMES = [\n ...SEMANTIC_COLOR_SCHEMES,\n ...DEFAULT_COLOR_SCHEMES,\n]\n\nexport const TONES = [\n 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,\n] as const\n\nexport function convertColor(\n color: string,\n fallback: string,\n): {\n (format: ColorFormat): string\n}\nexport function convertColor(\n color: string,\n fallback?: string,\n): {\n (format: ColorFormat): string | undefined\n}\nexport function convertColor(color: string, fallback?: string) {\n return function (format: ColorFormat) {\n try {\n const alpha = format.endsWith(\"a\")\n\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n if (format.startsWith(\"hex\")) {\n let hexa = c.toHex(color)\n\n if (alpha) {\n if (hexa.length === 7) hexa += \"ff\"\n } else {\n hexa = hexa.replace(/^#([0-9a-fA-F]{6})[0-9a-fA-F]{2}$/, \"#$1\")\n }\n\n return hexa\n } else if (format.startsWith(\"hsl\")) {\n let hsla = c.toHsla(color)\n\n if (!alpha) {\n hsla = hsla.replace(/hsla/, \"hsl\")\n hsla = hsla.replace(/,\\s*\\d+(\\.\\d+)?\\)$/, \")\")\n }\n\n return hsla\n } else {\n let rgba = c.toRgba(color)\n\n if (!alpha) {\n rgba = rgba.replace(/rgba/, \"rgb\")\n rgba = rgba.replace(/,\\s*\\d+(\\.\\d+)?\\)$/, \")\")\n }\n\n return rgba\n }\n } catch {\n if (fallback) return convertColor(fallback)(format)\n }\n }\n}\n\nexport function calcFormat(color: string): ColorFormat {\n if (color.startsWith(\"hsl\") || color.startsWith(\"rgb\"))\n return color.split(\"(\")[0] as ColorFormat\n else return color.length === 9 ? \"hexa\" : \"hex\"\n}\n\nexport function getAlpha(color: string) {\n return c.parseToRgba(color)[3]\n}\n\nexport function alphaToHex(a: number) {\n if (0 > a) a = 0\n if (1 < a) a = 1\n\n return Math.round(a * 255)\n .toString(16)\n .padStart(2, \"0\")\n}\n\nexport function parseToRgba(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToRgba(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToRgba(color: string, fallback?: string) {\n try {\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n return c.parseToRgba(color)\n } catch {\n if (fallback) return c.parseToRgba(fallback)\n }\n}\n\nexport function parseToHsla(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToHsla(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToHsla(color: string, fallback?: string) {\n try {\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n return c.parseToHsla(color)\n } catch {\n if (fallback) return c.parseToHsla(fallback)\n }\n}\n\nexport function parseToHsv(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToHsv(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToHsv(color: string, fallback?: string) {\n const rgba = parseToRgba(color, fallback)\n\n if (!rgba) return undefined\n\n let [r, g, b, a] = rgba\n\n r = r / 255\n g = g / 255\n b = b / 255\n\n const [min, max] = [Math.min(r, g, b), Math.max(r, g, b)]\n const delta = max - min\n\n let [h, v, s] = [0, max, max == 0 ? 0 : delta / max]\n\n switch (min) {\n case max:\n h = 0\n break\n\n case r:\n h = 60 * ((b - g) / delta) + 180\n break\n\n case g:\n h = 60 * ((r - b) / delta) + 300\n break\n\n case b:\n h = 60 * ((g - r) / delta) + 60\n break\n }\n\n return [h, s, v, a]\n}\n\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n return convertColor(c.rgba(r, g, b, a), fallback)(format)\n }\n}\n\nexport function hslaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function hslaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function hslaTo(\n [h, s, l, a]: [number, number, number, number],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n return convertColor(c.hsla(h, s, l, a), fallback)(format)\n }\n}\n\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n h = h / 60\n\n let rgb: [number, number, number] = [v, v, v]\n\n let i = Math.floor(h)\n let f = h - i\n let p = v * (1 - s)\n let q = v * (1 - s * f)\n let t = v * (1 - s * (1 - f))\n\n switch (i) {\n case 0:\n case 6:\n rgb = [v, t, p]\n break\n\n case 1:\n rgb = [q, v, p]\n break\n\n case 2:\n rgb = [p, v, t]\n break\n\n case 3:\n rgb = [p, q, v]\n break\n\n case 4:\n rgb = [t, p, v]\n break\n\n case 5:\n rgb = [v, p, q]\n break\n }\n\n let color = `rgb(${rgb.map((v) => Math.round(v * 255)).join(\", \")})`\n\n if (isNumber(a)) color = color.replace(/\\)$/, `, ${a})`)\n\n return convertColor(color, fallback)(format)\n }\n}\n\nexport function sameColor(\n color: string | undefined,\n comparison: string | undefined,\n) {\n if (!color) return false\n if (!comparison) return false\n\n const a = parseToRgba(color) ?? []\n const b = parseToRgba(comparison) ?? []\n\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"color.js","names":[],"sources":["../../src/color.ts"],"sourcesContent":["import * as c from \"color2k\"\nimport { isNumber } from \"./assertion\"\n\nexport type ColorFormat = \"hex\" | \"hexa\" | \"hsl\" | \"hsla\" | \"rgb\" | \"rgba\"\n\nexport const SEMANTIC_COLOR_SCHEMES = [\n \"mono\",\n \"primary\",\n \"secondary\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n \"error\",\n \"link\",\n] as const\n\nexport const DEFAULT_COLOR_SCHEMES = [\n \"gray\",\n \"red\",\n \"rose\",\n \"pink\",\n \"flashy\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n] as const\n\nexport const COLOR_SCHEMES = [\n ...SEMANTIC_COLOR_SCHEMES,\n ...DEFAULT_COLOR_SCHEMES,\n]\n\nexport const TONES = [\n 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,\n] as const\n\nexport function convertColor(\n color: string,\n fallback: string,\n): {\n (format: ColorFormat): string\n}\nexport function convertColor(\n color: string,\n fallback?: string,\n): {\n (format: ColorFormat): string | undefined\n}\nexport function convertColor(color: string, fallback?: string) {\n return function (format: ColorFormat) {\n try {\n const alpha = format.endsWith(\"a\")\n\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n if (format.startsWith(\"hex\")) {\n let hexa = c.toHex(color)\n\n if (alpha) {\n if (hexa.length === 7) hexa += \"ff\"\n } else {\n hexa = hexa.replace(/^#([0-9a-fA-F]{6})[0-9a-fA-F]{2}$/, \"#$1\")\n }\n\n return hexa\n } else if (format.startsWith(\"hsl\")) {\n let hsla = c.toHsla(color)\n\n if (!alpha) {\n hsla = hsla.replace(/hsla/, \"hsl\")\n hsla = hsla.replace(/,\\s*\\d+(\\.\\d+)?\\)$/, \")\")\n }\n\n return hsla\n } else {\n let rgba = c.toRgba(color)\n\n if (!alpha) {\n rgba = rgba.replace(/rgba/, \"rgb\")\n rgba = rgba.replace(/,\\s*\\d+(\\.\\d+)?\\)$/, \")\")\n }\n\n return rgba\n }\n } catch {\n if (fallback) return convertColor(fallback)(format)\n }\n }\n}\n\nexport function calcFormat(color: string): ColorFormat {\n if (color.startsWith(\"hsl\") || color.startsWith(\"rgb\"))\n return color.split(\"(\")[0] as ColorFormat\n else return color.length === 9 ? \"hexa\" : \"hex\"\n}\n\nexport function getAlpha(color: string) {\n return c.parseToRgba(color)[3]\n}\n\nexport function alphaToHex(a: number) {\n if (0 > a) a = 0\n if (1 < a) a = 1\n\n return Math.round(a * 255)\n .toString(16)\n .padStart(2, \"0\")\n}\n\nexport function parseToRgba(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToRgba(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToRgba(color: string, fallback?: string) {\n try {\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n return c.parseToRgba(color)\n } catch {\n if (fallback) return c.parseToRgba(fallback)\n }\n}\n\nexport function parseToHsla(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToHsla(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToHsla(color: string, fallback?: string) {\n try {\n if (/^[0-9a-fA-F]{6}$/.test(color)) color = \"#\" + color\n\n return c.parseToHsla(color)\n } catch {\n if (fallback) return c.parseToHsla(fallback)\n }\n}\n\nexport function parseToHsv(\n color: string,\n fallback: string,\n): [number, number, number, number]\nexport function parseToHsv(\n color: string,\n fallback?: string,\n): [number, number, number, number] | undefined\nexport function parseToHsv(color: string, fallback?: string) {\n const rgba = parseToRgba(color, fallback)\n\n if (!rgba) return undefined\n\n let [r, g, b, a] = rgba\n\n r = r / 255\n g = g / 255\n b = b / 255\n\n const [min, max] = [Math.min(r, g, b), Math.max(r, g, b)]\n const delta = max - min\n\n let [h, v, s] = [0, max, max == 0 ? 0 : delta / max]\n\n switch (min) {\n case max:\n h = 0\n break\n\n case r:\n h = 60 * ((b - g) / delta) + 180\n break\n\n case g:\n h = 60 * ((r - b) / delta) + 300\n break\n\n case b:\n h = 60 * ((g - r) / delta) + 60\n break\n }\n\n return [h, s, v, a]\n}\n\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function rgbaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n return convertColor(c.rgba(r, g, b, a), fallback)(format)\n }\n}\n\nexport function hslaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function hslaTo(\n [r, g, b, a]: [number, number, number, number],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function hslaTo(\n [h, s, l, a]: [number, number, number, number],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n return convertColor(c.hsla(h, s, l, a), fallback)(format)\n }\n}\n\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback: string,\n): {\n (format?: ColorFormat): string\n}\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback?: string,\n): {\n (format?: ColorFormat): string | undefined\n}\nexport function hsvTo(\n [h, s, v, a]: [number, number, number, number?],\n fallback?: string,\n): (format?: ColorFormat) => string | undefined {\n return function (format: ColorFormat = \"hex\") {\n h = h / 60\n\n let rgb: [number, number, number] = [v, v, v]\n\n let i = Math.floor(h)\n let f = h - i\n let p = v * (1 - s)\n let q = v * (1 - s * f)\n let t = v * (1 - s * (1 - f))\n\n switch (i) {\n case 0:\n case 6:\n rgb = [v, t, p]\n break\n\n case 1:\n rgb = [q, v, p]\n break\n\n case 2:\n rgb = [p, v, t]\n break\n\n case 3:\n rgb = [p, q, v]\n break\n\n case 4:\n rgb = [t, p, v]\n break\n\n case 5:\n rgb = [v, p, q]\n break\n }\n\n let color = `rgb(${rgb.map((v) => Math.round(v * 255)).join(\", \")})`\n\n if (isNumber(a)) color = color.replace(/\\)$/, `, ${a})`)\n\n return convertColor(color, fallback)(format)\n }\n}\n\nexport function sameColor(\n color: string | undefined,\n comparison: string | undefined,\n) {\n if (!color) return false\n if (!comparison) return false\n\n const a = parseToRgba(color) ?? []\n const b = parseToRgba(comparison) ?? []\n\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]\n}\n"],"mappings":"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"}
package/dist/esm/dom.js CHANGED
@@ -74,7 +74,7 @@ function isFrame(el) {
74
74
  return isHTMLElement(el) && el.tagName === "IFRAME";
75
75
  }
76
76
  function isActiveElement(el, rootNode) {
77
- return getActiveElement(rootNode) === el;
77
+ return (isDocument(rootNode) || isShadowRoot(rootNode)) && getActiveElement(rootNode) === el;
78
78
  }
79
79
  function isHiddenElement(el) {
80
80
  if (el.parentElement && isHiddenElement(el.parentElement)) return true;
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","names":["include"],"sources":["../../src/dom.ts"],"sourcesContent":["import { isArray, isNumber, isObject, isUndefined } from \"./assertion\"\nimport { noop } from \"./function\"\nimport { cx } from \"./string\"\n\nexport function createdDom(): boolean {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return !!(typeof window !== \"undefined\" && window.document?.createElement)\n}\n\nexport function getPlatform(): string {\n return (navigator as any).userAgentData?.platform ?? navigator.platform\n}\n\nexport function getUserAgent(): string {\n const userAgentData = (navigator as any).userAgentData\n\n if (userAgentData && isArray(userAgentData.brands))\n return userAgentData.brands\n .map(\n ({ brand, version }: { brand: string; version: string }) =>\n `${brand}/${version}`,\n )\n .join(\" \")\n\n return navigator.userAgent\n}\n\nexport function vendor(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(navigator.vendor) : fallback\n}\n\nexport function platform(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(getPlatform()) : fallback\n}\n\nexport function userAgent(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(getUserAgent()) : fallback\n}\n\nexport function isMac(fallback = false): boolean {\n return platform(/^Mac/i, fallback)\n}\n\nexport function isIPhone(fallback = false): boolean {\n return platform(/^iPhone/i, fallback)\n}\n\nexport function isIPad(fallback = false): boolean {\n return (\n platform(/^iPad/i, fallback) ||\n (isMac(fallback) &&\n (createdDom() ? navigator.maxTouchPoints > 1 : fallback))\n )\n}\n\nexport function isIos(fallback = false): boolean {\n return isIPhone(fallback) || isIPad(fallback)\n}\n\nexport function isAndroid(fallback = false): boolean {\n return platform(/^Android/i, fallback)\n}\n\nexport function isApple(fallback = false): boolean {\n return isMac(fallback) || isIos(fallback)\n}\n\nexport function isSafari(fallback = false): boolean {\n return isApple(fallback) && vendor(/apple/i, fallback)\n}\n\nexport function isFirefox(fallback = false): boolean {\n return userAgent(/Firefox/i, fallback)\n}\n\nexport function isChrome(fallback = false): boolean {\n return userAgent(/Chrome/i, fallback)\n}\n\nexport function isWebKit(fallback = false): boolean {\n return userAgent(/AppleWebKit/i, fallback) && !isChrome()\n}\n\nexport function isHTMLElement(el: any): el is HTMLElement {\n return isNode(el) && el.nodeType === Node.ELEMENT_NODE\n}\n\nexport function isWindow(el: any): el is Window {\n return isObject(el) && el === el.window\n}\n\nexport function isDocument(el: any): el is Document {\n return isNode(el) && el.nodeType === Node.DOCUMENT_NODE\n}\n\nexport function isVisualViewport(el: any): el is VisualViewport {\n return isObject(el) && el.constructor.name === \"VisualViewport\"\n}\n\nexport function isNode(el: any): el is Node {\n return isObject(el) && el.nodeType !== undefined\n}\n\nexport function isShadowRoot(el: any): el is ShadowRoot {\n return (\n isNode(el) && el.nodeType === Node.DOCUMENT_FRAGMENT_NODE && \"host\" in el\n )\n}\n\nexport function isFrame(el: any): el is HTMLIFrameElement {\n return isHTMLElement(el) && el.tagName === \"IFRAME\"\n}\n\nexport function isActiveElement(\n el: HTMLElement,\n rootNode: Document | ShadowRoot,\n): boolean {\n return getActiveElement(rootNode) === el\n}\n\nexport function isHiddenElement(el: HTMLElement): boolean {\n if (el.parentElement && isHiddenElement(el.parentElement)) return true\n\n return Boolean(el.hidden)\n}\n\nexport function isDisabledElement(el: HTMLElement): boolean {\n return (\n Boolean(el.getAttribute(\"disabled\")) ||\n Boolean(el.getAttribute(\"data-disabled\")) ||\n Boolean(el.getAttribute(\"aria-disabled\"))\n )\n}\n\nexport function isVisibleElement(el?: Node): boolean {\n if (!isHTMLElement(el)) return false\n\n return (\n el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0\n )\n}\n\nexport function isTouchDevice(): boolean {\n return \"ontouchstart\" in window\n}\n\nconst hasTabIndex = (el: Element): boolean =>\n !Number.isNaN(parseInt(el.getAttribute(\"tabindex\") || \"0\", 10))\n\nconst hasNegativeTabIndex = (el: Element): boolean =>\n parseInt(el.getAttribute(\"tabindex\") || \"0\", 10) < 0\n\nexport function getWindow(\n el: Document | Node | null | ShadowRoot | undefined,\n): typeof globalThis & Window {\n if (isShadowRoot(el)) return getWindow(el.host)\n if (isDocument(el)) return el.defaultView ?? window\n if (isHTMLElement(el)) return el.ownerDocument.defaultView ?? window\n\n return window\n}\n\nexport function getDocument(\n el: Document | Element | Node | null | undefined | Window,\n): Document {\n if (isDocument(el)) return el\n if (isWindow(el)) return el.document\n\n return el?.ownerDocument ?? document\n}\n\nexport function getDocumentElement(\n el: Document | Element | Node | null | undefined | Window,\n): HTMLElement {\n return getDocument(el).documentElement\n}\n\nexport function getNodeName(node: Node | Window): string {\n if (isHTMLElement(node)) return node.localName || \"\"\n\n return \"#document\"\n}\n\nexport function getActiveElement(\n rootNode: Document | ShadowRoot,\n): HTMLElement | null {\n let activeEl = rootNode.activeElement as HTMLElement | null\n\n while (activeEl?.shadowRoot) {\n const el = activeEl.shadowRoot.activeElement as HTMLElement | null\n\n if (el === activeEl) break\n else activeEl = el\n }\n\n return activeEl\n}\n\nexport function getTabbableElements(\n el: HTMLElement | null,\n includeEl?: boolean,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n const tabbableEls = els.filter(isTabbableElement)\n\n if (includeEl && isTabbableElement(el)) tabbableEls.unshift(el)\n\n tabbableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n const allFrameTabbable = getTabbableElements(frameBody)\n tabbableEls.splice(i, 1, ...allFrameTabbable)\n }\n })\n\n if (!tabbableEls.length && includeEl) return els\n\n return tabbableEls\n}\n\nexport function getFirstTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getTabbableElements(el, includeEl)\n\n return first || null\n}\n\nexport function getNextTabbableElement(\n el: HTMLElement | null,\n current?: HTMLElement | null,\n): HTMLElement | null {\n const els = getTabbableElements(el)\n const doc = el?.ownerDocument || document\n const currentElement = current ?? (doc.activeElement as HTMLElement | null)\n\n if (!currentElement) return null\n\n return els[els.indexOf(currentElement) + 1] || null\n}\n\nexport function getLastTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const els = getTabbableElements(el, includeEl)\n\n return els[els.length - 1] || null\n}\n\nexport function getTabbableElementEdges(\n el: HTMLElement | null,\n includeEl?: boolean,\n): [HTMLElement | null, HTMLElement | null] {\n const els = getTabbableElements(el, includeEl)\n const first = els[0] || null\n const last = els[els.length - 1] || null\n\n return [first, last]\n}\n\nexport function getParentNode(node: Node): Node {\n if (getNodeName(node) === \"html\") return node\n\n const result =\n (node as any).assignedSlot ||\n node.parentNode ||\n isShadowRoot(node) ||\n getDocumentElement(node)\n\n return isShadowRoot(result) ? result.host : result\n}\n\nexport function isInputElement(el: any): el is HTMLInputElement {\n return isHTMLElement(el) && el.localName === \"input\"\n}\n\nexport function isEditableElement(\n el: EventTarget | HTMLElement | null,\n): boolean {\n if (el == null || !isHTMLElement(el)) return false\n try {\n return (\n (isInputElement(el) && el.selectionStart != null) ||\n /(textarea|select)/.test(el.localName) ||\n el.isContentEditable ||\n el.getAttribute(\"contenteditable\") === \"true\" ||\n el.getAttribute(\"contenteditable\") === \"\"\n )\n } catch {\n return false\n }\n}\n\nexport function isFocusableElement(el: HTMLElement | null): el is HTMLElement {\n if (!el || el.closest(\"[inert]\")) return false\n\n return el.matches(focusableSelector) && isVisibleElement(el)\n}\n\nexport function isTabbableElement(el: HTMLElement | null): el is HTMLElement {\n if (el != null && el.tabIndex > 0) return true\n return isFocusableElement(el) && !hasNegativeTabIndex(el)\n}\n\nexport function contains(\n parent?: EventTarget | HTMLElement | null,\n child?: EventTarget | HTMLElement | null,\n): boolean {\n if (!parent || !child) return false\n if (!isHTMLElement(parent) || !isHTMLElement(child)) return false\n\n const rootNode = child.getRootNode()\n\n if (parent === child) return true\n if (parent.contains(child)) return true\n\n if (isShadowRoot(rootNode)) {\n let next: Node | null | ShadowRoot = child\n\n while (next) {\n if (parent === next) return true\n\n next = next.parentNode ?? (isShadowRoot(next) ? next.host : null)\n }\n }\n\n return false\n}\n\nexport function getPx(value: number | string | undefined): number {\n if (isNumber(value)) return value\n\n if (isUndefined(value)) return 0\n\n if (value.includes(\"px\")) return parseFloat(value)\n\n let fontSize = 16\n\n if (createdDom()) {\n const style = window.getComputedStyle(document.documentElement)\n\n const computedFontSize = parseFloat(style.fontSize)\n\n if (!isNaN(computedFontSize)) fontSize = computedFontSize\n }\n\n return parseFloat(value) * fontSize\n}\n\nexport function getTabIndex(node: HTMLElement | SVGElement) {\n if (node.tabIndex < 0)\n if (\n (/^(audio|video|details)$/.test(node.localName) ||\n isEditableElement(node)) &&\n !hasTabIndex(node)\n )\n return 0\n\n return node.tabIndex\n}\n\nexport function isTruthyDataAttr(condition: any): boolean {\n return condition === \"true\" || condition === true || condition === \"\"\n}\n\nexport function dataAttr(condition: any): string | undefined {\n return condition ? \"\" : undefined\n}\n\ntype Booleanish = \"false\" | \"true\" | boolean\n\nexport function ariaAttr(condition: any): Booleanish | undefined {\n if (condition === \"true\") return \"true\"\n if (condition === \"false\") return \"false\"\n\n return condition ? true : undefined\n}\n\nexport function uuid() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n .replace(/x/g, () => Math.random().toString(16).slice(2, 3))\n .replace(/y/g, () => ((Math.random() * 4) | 0).toString(16))\n}\n\nconst focusableElList = [\n \"[tabindex]\",\n \"input:not([type='hidden']):not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"a[href]\",\n \"area[href]\",\n \"audio[controls]\",\n \"video[controls]\",\n \"[contenteditable]:not([contenteditable='false'])\",\n \"details > summary:first-of-type\",\n]\n\nconst focusableSelector = focusableElList.join(\", \")\n\nexport function getFocusableElements(\n el: null | Pick<HTMLElement, \"querySelectorAll\">,\n includeEl = false,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n\n const include = includeEl\n\n if (include && isHTMLElement(el) && isFocusableElement(el)) els.unshift(el)\n\n const focusableEls = els.filter(isFocusableElement)\n\n focusableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n\n focusableEls.splice(i, 1, ...getFocusableElements(frameBody))\n }\n })\n\n return focusableEls\n}\n\nexport function getFirstFocusableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getFocusableElements(el, includeEl)\n\n return first || null\n}\n\nexport function setAttribute(\n el: Element,\n qualifiedName: string,\n value?: string,\n) {\n const prev = el.getAttribute(qualifiedName)\n\n el.setAttribute(qualifiedName, cx(prev, value) ?? \"\")\n\n return () => {\n if (prev === null) el.removeAttribute(qualifiedName)\n else el.setAttribute(qualifiedName, prev)\n }\n}\n\nexport function setStyle(\n el: HTMLElement | null | undefined,\n style: Partial<\n CSSStyleDeclaration | { [key: `--${string}`]: number | string }\n >,\n) {\n if (!el) return noop\n\n const prev = Object.keys(style).reduce<{ [key: string]: string }>(\n (acc, key) => {\n acc[key] = el.style.getPropertyValue(key)\n\n return acc\n },\n {},\n )\n\n Object.assign(el.style, style)\n\n return () => {\n Object.assign(el.style, prev)\n\n if (el.style.length === 0) el.removeAttribute(\"style\")\n }\n}\n\nconst LOCK_DATA_ATTR = \"data-scroll-lock\"\n\nexport function scrollLock(\n el: Document | Element | Node | null | undefined | Window,\n) {\n const doc = getDocument(el)\n const win = getWindow(doc)\n\n const locked = doc.body.hasAttribute(LOCK_DATA_ATTR)\n\n if (locked) return\n\n const scrollbarWidth = win.innerWidth - doc.documentElement.clientWidth\n const documentLeft = doc.documentElement.getBoundingClientRect().left\n const scrollbarX = Math.round(documentLeft) + doc.documentElement.scrollLeft\n const paddingProperty = scrollbarX ? \"paddingLeft\" : \"paddingRight\"\n\n doc.body.setAttribute(LOCK_DATA_ATTR, \"\")\n\n const setStyleForIOS = () => {\n const offsetLeft = win.visualViewport?.offsetLeft ?? 0\n const offsetTop = win.visualViewport?.offsetTop ?? 0\n\n const restoreStyle = setStyle(doc.body, {\n left: `${-(win.scrollX - Math.floor(offsetLeft))}px`,\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n position: \"fixed\",\n right: \"0\",\n top: `${-(win.scrollY - Math.floor(offsetTop))}px`,\n })\n\n return () => {\n restoreStyle()\n win.scrollTo({ behavior: \"instant\", left: win.scrollX, top: win.scrollY })\n }\n }\n\n const unsubscribes = [\n setStyle(doc.documentElement, {\n \"--scrollbar-width\": `${scrollbarWidth}px`,\n }),\n isIos()\n ? setStyleForIOS()\n : setStyle(doc.body, {\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n }),\n ]\n\n return () => {\n unsubscribes.forEach((unsubscribe) => unsubscribe())\n\n doc.body.removeAttribute(LOCK_DATA_ATTR)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dom.js","names":["include"],"sources":["../../src/dom.ts"],"sourcesContent":["import { isArray, isNumber, isObject, isUndefined } from \"./assertion\"\nimport { noop } from \"./function\"\nimport { cx } from \"./string\"\n\nexport function createdDom(): boolean {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return !!(typeof window !== \"undefined\" && window.document?.createElement)\n}\n\nexport function getPlatform(): string {\n return (navigator as any).userAgentData?.platform ?? navigator.platform\n}\n\nexport function getUserAgent(): string {\n const userAgentData = (navigator as any).userAgentData\n\n if (userAgentData && isArray(userAgentData.brands))\n return userAgentData.brands\n .map(\n ({ brand, version }: { brand: string; version: string }) =>\n `${brand}/${version}`,\n )\n .join(\" \")\n\n return navigator.userAgent\n}\n\nexport function vendor(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(navigator.vendor) : fallback\n}\n\nexport function platform(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(getPlatform()) : fallback\n}\n\nexport function userAgent(value: RegExp, fallback = false): boolean {\n return createdDom() ? value.test(getUserAgent()) : fallback\n}\n\nexport function isMac(fallback = false): boolean {\n return platform(/^Mac/i, fallback)\n}\n\nexport function isIPhone(fallback = false): boolean {\n return platform(/^iPhone/i, fallback)\n}\n\nexport function isIPad(fallback = false): boolean {\n return (\n platform(/^iPad/i, fallback) ||\n (isMac(fallback) &&\n (createdDom() ? navigator.maxTouchPoints > 1 : fallback))\n )\n}\n\nexport function isIos(fallback = false): boolean {\n return isIPhone(fallback) || isIPad(fallback)\n}\n\nexport function isAndroid(fallback = false): boolean {\n return platform(/^Android/i, fallback)\n}\n\nexport function isApple(fallback = false): boolean {\n return isMac(fallback) || isIos(fallback)\n}\n\nexport function isSafari(fallback = false): boolean {\n return isApple(fallback) && vendor(/apple/i, fallback)\n}\n\nexport function isFirefox(fallback = false): boolean {\n return userAgent(/Firefox/i, fallback)\n}\n\nexport function isChrome(fallback = false): boolean {\n return userAgent(/Chrome/i, fallback)\n}\n\nexport function isWebKit(fallback = false): boolean {\n return userAgent(/AppleWebKit/i, fallback) && !isChrome()\n}\n\nexport function isHTMLElement(el: any): el is HTMLElement {\n return isNode(el) && el.nodeType === Node.ELEMENT_NODE\n}\n\nexport function isWindow(el: any): el is Window {\n return isObject(el) && el === el.window\n}\n\nexport function isDocument(el: any): el is Document {\n return isNode(el) && el.nodeType === Node.DOCUMENT_NODE\n}\n\nexport function isVisualViewport(el: any): el is VisualViewport {\n return isObject(el) && el.constructor.name === \"VisualViewport\"\n}\n\nexport function isNode(el: any): el is Node {\n return isObject(el) && el.nodeType !== undefined\n}\n\nexport function isShadowRoot(el: any): el is ShadowRoot {\n return (\n isNode(el) && el.nodeType === Node.DOCUMENT_FRAGMENT_NODE && \"host\" in el\n )\n}\n\nexport function isFrame(el: any): el is HTMLIFrameElement {\n return isHTMLElement(el) && el.tagName === \"IFRAME\"\n}\n\nexport function isActiveElement(\n el: HTMLElement,\n rootNode: Document | Node | ShadowRoot,\n): boolean {\n return (\n (isDocument(rootNode) || isShadowRoot(rootNode)) &&\n getActiveElement(rootNode) === el\n )\n}\n\nexport function isHiddenElement(el: HTMLElement): boolean {\n if (el.parentElement && isHiddenElement(el.parentElement)) return true\n\n return Boolean(el.hidden)\n}\n\nexport function isDisabledElement(el: HTMLElement): boolean {\n return (\n Boolean(el.getAttribute(\"disabled\")) ||\n Boolean(el.getAttribute(\"data-disabled\")) ||\n Boolean(el.getAttribute(\"aria-disabled\"))\n )\n}\n\nexport function isVisibleElement(el?: Node): boolean {\n if (!isHTMLElement(el)) return false\n\n return (\n el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0\n )\n}\n\nexport function isTouchDevice(): boolean {\n return \"ontouchstart\" in window\n}\n\nconst hasTabIndex = (el: Element): boolean =>\n !Number.isNaN(parseInt(el.getAttribute(\"tabindex\") || \"0\", 10))\n\nconst hasNegativeTabIndex = (el: Element): boolean =>\n parseInt(el.getAttribute(\"tabindex\") || \"0\", 10) < 0\n\nexport function getWindow(\n el: Document | Node | null | ShadowRoot | undefined,\n): typeof globalThis & Window {\n if (isShadowRoot(el)) return getWindow(el.host)\n if (isDocument(el)) return el.defaultView ?? window\n if (isHTMLElement(el)) return el.ownerDocument.defaultView ?? window\n\n return window\n}\n\nexport function getDocument(\n el: Document | Element | Node | null | undefined | Window,\n): Document {\n if (isDocument(el)) return el\n if (isWindow(el)) return el.document\n\n return el?.ownerDocument ?? document\n}\n\nexport function getDocumentElement(\n el: Document | Element | Node | null | undefined | Window,\n): HTMLElement {\n return getDocument(el).documentElement\n}\n\nexport function getNodeName(node: Node | Window): string {\n if (isHTMLElement(node)) return node.localName || \"\"\n\n return \"#document\"\n}\n\nexport function getActiveElement(\n rootNode: Document | ShadowRoot,\n): HTMLElement | null {\n let activeEl = rootNode.activeElement as HTMLElement | null\n\n while (activeEl?.shadowRoot) {\n const el = activeEl.shadowRoot.activeElement as HTMLElement | null\n\n if (el === activeEl) break\n else activeEl = el\n }\n\n return activeEl\n}\n\nexport function getTabbableElements(\n el: HTMLElement | null,\n includeEl?: boolean,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n const tabbableEls = els.filter(isTabbableElement)\n\n if (includeEl && isTabbableElement(el)) tabbableEls.unshift(el)\n\n tabbableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n const allFrameTabbable = getTabbableElements(frameBody)\n tabbableEls.splice(i, 1, ...allFrameTabbable)\n }\n })\n\n if (!tabbableEls.length && includeEl) return els\n\n return tabbableEls\n}\n\nexport function getFirstTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getTabbableElements(el, includeEl)\n\n return first || null\n}\n\nexport function getNextTabbableElement(\n el: HTMLElement | null,\n current?: HTMLElement | null,\n): HTMLElement | null {\n const els = getTabbableElements(el)\n const doc = el?.ownerDocument || document\n const currentElement = current ?? (doc.activeElement as HTMLElement | null)\n\n if (!currentElement) return null\n\n return els[els.indexOf(currentElement) + 1] || null\n}\n\nexport function getLastTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const els = getTabbableElements(el, includeEl)\n\n return els[els.length - 1] || null\n}\n\nexport function getTabbableElementEdges(\n el: HTMLElement | null,\n includeEl?: boolean,\n): [HTMLElement | null, HTMLElement | null] {\n const els = getTabbableElements(el, includeEl)\n const first = els[0] || null\n const last = els[els.length - 1] || null\n\n return [first, last]\n}\n\nexport function getParentNode(node: Node): Node {\n if (getNodeName(node) === \"html\") return node\n\n const result =\n (node as any).assignedSlot ||\n node.parentNode ||\n isShadowRoot(node) ||\n getDocumentElement(node)\n\n return isShadowRoot(result) ? result.host : result\n}\n\nexport function isInputElement(el: any): el is HTMLInputElement {\n return isHTMLElement(el) && el.localName === \"input\"\n}\n\nexport function isEditableElement(\n el: EventTarget | HTMLElement | null,\n): boolean {\n if (el == null || !isHTMLElement(el)) return false\n try {\n return (\n (isInputElement(el) && el.selectionStart != null) ||\n /(textarea|select)/.test(el.localName) ||\n el.isContentEditable ||\n el.getAttribute(\"contenteditable\") === \"true\" ||\n el.getAttribute(\"contenteditable\") === \"\"\n )\n } catch {\n return false\n }\n}\n\nexport function isFocusableElement(el: HTMLElement | null): el is HTMLElement {\n if (!el || el.closest(\"[inert]\")) return false\n\n return el.matches(focusableSelector) && isVisibleElement(el)\n}\n\nexport function isTabbableElement(el: HTMLElement | null): el is HTMLElement {\n if (el != null && el.tabIndex > 0) return true\n return isFocusableElement(el) && !hasNegativeTabIndex(el)\n}\n\nexport function contains(\n parent?: EventTarget | HTMLElement | null,\n child?: EventTarget | HTMLElement | null,\n): boolean {\n if (!parent || !child) return false\n if (!isHTMLElement(parent) || !isHTMLElement(child)) return false\n\n const rootNode = child.getRootNode()\n\n if (parent === child) return true\n if (parent.contains(child)) return true\n\n if (isShadowRoot(rootNode)) {\n let next: Node | null | ShadowRoot = child\n\n while (next) {\n if (parent === next) return true\n\n next = next.parentNode ?? (isShadowRoot(next) ? next.host : null)\n }\n }\n\n return false\n}\n\nexport function getPx(value: number | string | undefined): number {\n if (isNumber(value)) return value\n\n if (isUndefined(value)) return 0\n\n if (value.includes(\"px\")) return parseFloat(value)\n\n let fontSize = 16\n\n if (createdDom()) {\n const style = window.getComputedStyle(document.documentElement)\n\n const computedFontSize = parseFloat(style.fontSize)\n\n if (!isNaN(computedFontSize)) fontSize = computedFontSize\n }\n\n return parseFloat(value) * fontSize\n}\n\nexport function getTabIndex(node: HTMLElement | SVGElement) {\n if (node.tabIndex < 0)\n if (\n (/^(audio|video|details)$/.test(node.localName) ||\n isEditableElement(node)) &&\n !hasTabIndex(node)\n )\n return 0\n\n return node.tabIndex\n}\n\nexport function isTruthyDataAttr(condition: any): boolean {\n return condition === \"true\" || condition === true || condition === \"\"\n}\n\nexport function dataAttr(condition: any): string | undefined {\n return condition ? \"\" : undefined\n}\n\ntype Booleanish = \"false\" | \"true\" | boolean\n\nexport function ariaAttr(condition: any): Booleanish | undefined {\n if (condition === \"true\") return \"true\"\n if (condition === \"false\") return \"false\"\n\n return condition ? true : undefined\n}\n\nexport function uuid() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n .replace(/x/g, () => Math.random().toString(16).slice(2, 3))\n .replace(/y/g, () => ((Math.random() * 4) | 0).toString(16))\n}\n\nconst focusableElList = [\n \"[tabindex]\",\n \"input:not([type='hidden']):not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"a[href]\",\n \"area[href]\",\n \"audio[controls]\",\n \"video[controls]\",\n \"[contenteditable]:not([contenteditable='false'])\",\n \"details > summary:first-of-type\",\n]\n\nconst focusableSelector = focusableElList.join(\", \")\n\nexport function getFocusableElements(\n el: null | Pick<HTMLElement, \"querySelectorAll\">,\n includeEl = false,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n\n const include = includeEl\n\n if (include && isHTMLElement(el) && isFocusableElement(el)) els.unshift(el)\n\n const focusableEls = els.filter(isFocusableElement)\n\n focusableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n\n focusableEls.splice(i, 1, ...getFocusableElements(frameBody))\n }\n })\n\n return focusableEls\n}\n\nexport function getFirstFocusableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getFocusableElements(el, includeEl)\n\n return first || null\n}\n\nexport function setAttribute(\n el: Element,\n qualifiedName: string,\n value?: string,\n) {\n const prev = el.getAttribute(qualifiedName)\n\n el.setAttribute(qualifiedName, cx(prev, value) ?? \"\")\n\n return () => {\n if (prev === null) el.removeAttribute(qualifiedName)\n else el.setAttribute(qualifiedName, prev)\n }\n}\n\nexport function setStyle(\n el: HTMLElement | null | undefined,\n style: Partial<\n CSSStyleDeclaration | { [key: `--${string}`]: number | string }\n >,\n) {\n if (!el) return noop\n\n const prev = Object.keys(style).reduce<{ [key: string]: string }>(\n (acc, key) => {\n acc[key] = el.style.getPropertyValue(key)\n\n return acc\n },\n {},\n )\n\n Object.assign(el.style, style)\n\n return () => {\n Object.assign(el.style, prev)\n\n if (el.style.length === 0) el.removeAttribute(\"style\")\n }\n}\n\nconst LOCK_DATA_ATTR = \"data-scroll-lock\"\n\nexport function scrollLock(\n el: Document | Element | Node | null | undefined | Window,\n) {\n const doc = getDocument(el)\n const win = getWindow(doc)\n\n const locked = doc.body.hasAttribute(LOCK_DATA_ATTR)\n\n if (locked) return\n\n const scrollbarWidth = win.innerWidth - doc.documentElement.clientWidth\n const documentLeft = doc.documentElement.getBoundingClientRect().left\n const scrollbarX = Math.round(documentLeft) + doc.documentElement.scrollLeft\n const paddingProperty = scrollbarX ? \"paddingLeft\" : \"paddingRight\"\n\n doc.body.setAttribute(LOCK_DATA_ATTR, \"\")\n\n const setStyleForIOS = () => {\n const offsetLeft = win.visualViewport?.offsetLeft ?? 0\n const offsetTop = win.visualViewport?.offsetTop ?? 0\n\n const restoreStyle = setStyle(doc.body, {\n left: `${-(win.scrollX - Math.floor(offsetLeft))}px`,\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n position: \"fixed\",\n right: \"0\",\n top: `${-(win.scrollY - Math.floor(offsetTop))}px`,\n })\n\n return () => {\n restoreStyle()\n win.scrollTo({ behavior: \"instant\", left: win.scrollX, top: win.scrollY })\n }\n }\n\n const unsubscribes = [\n setStyle(doc.documentElement, {\n \"--scrollbar-width\": `${scrollbarWidth}px`,\n }),\n isIos()\n ? setStyleForIOS()\n : setStyle(doc.body, {\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n }),\n ]\n\n return () => {\n unsubscribes.forEach((unsubscribe) => unsubscribe())\n\n doc.body.removeAttribute(LOCK_DATA_ATTR)\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","names":[],"sources":["../../src/event.ts"],"sourcesContent":["import { isFunction } from \"./assertion\"\nimport {\n getDocument,\n getNextTabbableElement,\n getTabbableElementEdges,\n} from \"./dom\"\nimport { noop } from \"./function\"\n\nexport type AnyPointerEvent = MouseEvent | PointerEvent | TouchEvent\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport function isMouseEvent(ev: any): ev is MouseEvent {\n const win = getEventWindow(ev)\n\n if (typeof win.PointerEvent !== \"undefined\" && ev instanceof win.PointerEvent)\n return !!(ev.pointerType === \"mouse\")\n\n return ev instanceof win.MouseEvent\n}\n\nexport function isTouchEvent(ev: AnyPointerEvent): ev is TouchEvent {\n return !!(ev as TouchEvent).touches\n}\n\nexport function isMultiTouchEvent(ev: AnyPointerEvent): boolean {\n return isTouchEvent(ev) && ev.touches.length > 1\n}\n\nexport function getEventWindow(ev: Event): typeof globalThis {\n return ((ev as UIEvent).view ?? window) as unknown as typeof globalThis\n}\n\nexport function pointFromTouch(\n e: TouchEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n const point = e.touches[0] || e.changedTouches[0]\n\n return { x: point?.[`${type}X`] ?? 0, y: point?.[`${type}Y`] ?? 0 }\n}\n\nexport function pointFromMouse(\n point: MouseEvent | PointerEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n return {\n x: point[`${type}X`],\n y: point[`${type}Y`],\n }\n}\n\nexport function getEventPoint(\n ev: AnyPointerEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n return isTouchEvent(ev) ? pointFromTouch(ev, type) : pointFromMouse(ev, type)\n}\n\nexport interface EventMap\n extends\n DocumentEventMap,\n GlobalEventHandlersEventMap,\n WindowEventMap,\n FontFaceSetEventMap {}\n\nexport type EventType = keyof EventMap\n\nexport function addDomEvent<Y extends EventType>(\n target: EventTarget,\n type: Y,\n cb: (ev: EventMap[Y]) => void,\n options?: AddEventListenerOptions | boolean,\n) {\n target.addEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n\n return () => {\n target.removeEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n }\n}\n\nexport function focusTrap(\n el: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n if (!el) return noop\n\n const doc = getDocument(el)\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, false)\n\n if (ev.shiftKey) {\n if (doc.activeElement === firstTabbable) elToFocus = lastTabbable\n } else {\n if (doc.activeElement === lastTabbable) elToFocus = firstTabbable\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) onFocus(elToFocus)\n else elToFocus.focus()\n }\n\n return addDomEvent(el, \"keydown\", onKeyDown, true)\n}\n\nexport function focusTransfer(\n el: HTMLElement | null,\n target?: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n const doc = getDocument(el)\n const body = doc.body\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, false)\n const nextTabbable = getNextTabbableElement(body, target)\n const noTabbableEls = !firstTabbable && !lastTabbable\n\n if (ev.shiftKey) {\n if (nextTabbable === doc.activeElement) {\n if (doc.activeElement !== lastTabbable) elToFocus = lastTabbable\n } else if (doc.activeElement === firstTabbable || noTabbableEls) {\n if (doc.activeElement !== target) elToFocus = target\n }\n } else {\n if (doc.activeElement === target) {\n if (doc.activeElement !== firstTabbable) elToFocus = firstTabbable\n } else if (doc.activeElement === lastTabbable || noTabbableEls) {\n if (doc.activeElement !== nextTabbable) elToFocus = nextTabbable\n }\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) onFocus(elToFocus)\n else elToFocus.focus()\n }\n\n return addDomEvent(doc, \"keydown\", onKeyDown, true)\n}\n"],"mappings":";;;;AAeA,SAAgB,aAAa,IAA2B;CACtD,MAAM,MAAM,eAAe,EAAE;CAE7B,IAAI,OAAO,IAAI,iBAAiB,eAAe,cAAc,IAAI,cAC/D,OAAO,CAAC,EAAE,GAAG,gBAAgB;CAE/B,OAAO,cAAc,IAAI;AAC3B;AAEA,SAAgB,aAAa,IAAuC;CAClE,OAAO,CAAC,CAAE,GAAkB;AAC9B;AAEA,SAAgB,kBAAkB,IAA8B;CAC9D,OAAO,aAAa,EAAE,KAAK,GAAG,QAAQ,SAAS;AACjD;AAEA,SAAgB,eAAe,IAA8B;CAC3D,OAAS,GAAe,QAAQ;AAClC;AAEA,SAAgB,eACd,GACA,OAA0B,UACnB;CACP,MAAM,QAAQ,EAAE,QAAQ,MAAM,EAAE,eAAe;CAE/C,OAAO;EAAE,GAAG,QAAQ,GAAG,KAAK,OAAO;EAAG,GAAG,QAAQ,GAAG,KAAK,OAAO;CAAE;AACpE;AAEA,SAAgB,eACd,OACA,OAA0B,UACnB;CACP,OAAO;EACL,GAAG,MAAM,GAAG,KAAK;EACjB,GAAG,MAAM,GAAG,KAAK;CACnB;AACF;AAEA,SAAgB,cACd,IACA,OAA0B,UACnB;CACP,OAAO,aAAa,EAAE,IAAI,eAAe,IAAI,IAAI,IAAI,eAAe,IAAI,IAAI;AAC9E;AAWA,SAAgB,YACd,QACA,MACA,IACA,SACA;CACA,OAAO,iBACL,MACA,IACA,OACF;CAEA,aAAa;EACX,OAAO,oBACL,MACA,IACA,OACF;CACF;AACF;AAEA,SAAgB,UACd,IACA,SACA;CACA,IAAI,CAAC,IAAI,OAAO;CAEhB,MAAM,MAAM,YAAY,EAAE;CAE1B,SAAS,UAAU,IAAmB;EACpC,IAAI,GAAG,QAAQ,OAAO;EAEtB,IAAI,YAA4C;EAEhD,MAAM,CAAC,eAAe,gBAAgB,wBAAwB,IAAI,KAAK;EAEvE,IAAI,GAAG;OACD,IAAI,kBAAkB,eAAe,YAAY;EAAA,OAErD,IAAI,IAAI,kBAAkB,cAAc,YAAY;EAGtD,IAAI,CAAC,WAAW;EAEhB,GAAG,eAAe;EAElB,IAAI,WAAW,OAAO,GAAG,QAAQ,SAAS;OACrC,UAAU,MAAM;CACvB;CAEA,OAAO,YAAY,IAAI,WAAW,WAAW,IAAI;AACnD;AAEA,SAAgB,cACd,IACA,QACA,SACA;CACA,MAAM,MAAM,YAAY,EAAE;CAC1B,MAAM,OAAO,IAAI;CAEjB,SAAS,UAAU,IAAmB;EACpC,IAAI,GAAG,QAAQ,OAAO;EAEtB,IAAI,YAA4C;EAEhD,MAAM,CAAC,eAAe,gBAAgB,wBAAwB,IAAI,KAAK;EACvE,MAAM,eAAe,uBAAuB,MAAM,MAAM;EACxD,MAAM,gBAAgB,CAAC,iBAAiB,CAAC;EAEzC,IAAI,GAAG;OACD,iBAAiB,IAAI;QACnB,IAAI,kBAAkB,cAAc,YAAY;GAAA,OAC/C,IAAI,IAAI,kBAAkB,iBAAiB;QAC5C,IAAI,kBAAkB,QAAQ,YAAY;GAAA;EAAK,OAGrD,IAAI,IAAI,kBAAkB;OACpB,IAAI,kBAAkB,eAAe,YAAY;EAAA,OAChD,IAAI,IAAI,kBAAkB,gBAAgB;OAC3C,IAAI,kBAAkB,cAAc,YAAY;EAAA;EAIxD,IAAI,CAAC,WAAW;EAEhB,GAAG,eAAe;EAElB,IAAI,WAAW,OAAO,GAAG,QAAQ,SAAS;OACrC,UAAU,MAAM;CACvB;CAEA,OAAO,YAAY,KAAK,WAAW,WAAW,IAAI;AACpD"}
1
+ {"version":3,"file":"event.js","names":[],"sources":["../../src/event.ts"],"sourcesContent":["import { isFunction } from \"./assertion\"\nimport {\n getDocument,\n getNextTabbableElement,\n getTabbableElementEdges,\n} from \"./dom\"\nimport { noop } from \"./function\"\n\nexport type AnyPointerEvent = MouseEvent | PointerEvent | TouchEvent\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport function isMouseEvent(ev: any): ev is MouseEvent {\n const win = getEventWindow(ev)\n\n if (typeof win.PointerEvent !== \"undefined\" && ev instanceof win.PointerEvent)\n return !!(ev.pointerType === \"mouse\")\n\n return ev instanceof win.MouseEvent\n}\n\nexport function isTouchEvent(ev: AnyPointerEvent): ev is TouchEvent {\n return !!(ev as TouchEvent).touches\n}\n\nexport function isMultiTouchEvent(ev: AnyPointerEvent): boolean {\n return isTouchEvent(ev) && ev.touches.length > 1\n}\n\nexport function getEventWindow(ev: Event): typeof globalThis {\n return ((ev as UIEvent).view ?? window) as unknown as typeof globalThis\n}\n\nexport function pointFromTouch(\n e: TouchEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n const point = e.touches[0] || e.changedTouches[0]\n\n return { x: point?.[`${type}X`] ?? 0, y: point?.[`${type}Y`] ?? 0 }\n}\n\nexport function pointFromMouse(\n point: MouseEvent | PointerEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n return {\n x: point[`${type}X`],\n y: point[`${type}Y`],\n }\n}\n\nexport function getEventPoint(\n ev: AnyPointerEvent,\n type: \"client\" | \"page\" = \"client\",\n): Point {\n return isTouchEvent(ev) ? pointFromTouch(ev, type) : pointFromMouse(ev, type)\n}\n\nexport interface EventMap\n extends\n DocumentEventMap,\n GlobalEventHandlersEventMap,\n WindowEventMap,\n FontFaceSetEventMap {}\n\nexport type EventType = keyof EventMap\n\nexport function addDomEvent<Y extends EventType>(\n target: EventTarget,\n type: Y,\n cb: (ev: EventMap[Y]) => void,\n options?: AddEventListenerOptions | boolean,\n) {\n target.addEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n\n return () => {\n target.removeEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n }\n}\n\nexport function focusTrap(\n el: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n if (!el) return noop\n\n const doc = getDocument(el)\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, false)\n\n if (ev.shiftKey) {\n if (doc.activeElement === firstTabbable) elToFocus = lastTabbable\n } else {\n if (doc.activeElement === lastTabbable) elToFocus = firstTabbable\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) onFocus(elToFocus)\n else elToFocus.focus()\n }\n\n return addDomEvent(el, \"keydown\", onKeyDown, true)\n}\n\nexport function focusTransfer(\n el: HTMLElement | null,\n target?: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n const doc = getDocument(el)\n const body = doc.body\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, false)\n const nextTabbable = getNextTabbableElement(body, target)\n const noTabbableEls = !firstTabbable && !lastTabbable\n\n if (ev.shiftKey) {\n if (nextTabbable === doc.activeElement) {\n if (doc.activeElement !== lastTabbable) elToFocus = lastTabbable\n } else if (doc.activeElement === firstTabbable || noTabbableEls) {\n if (doc.activeElement !== target) elToFocus = target\n }\n } else {\n if (doc.activeElement === target) {\n if (doc.activeElement !== firstTabbable) elToFocus = firstTabbable\n } else if (doc.activeElement === lastTabbable || noTabbableEls) {\n if (doc.activeElement !== nextTabbable) elToFocus = nextTabbable\n }\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) onFocus(elToFocus)\n else elToFocus.focus()\n }\n\n return addDomEvent(doc, \"keydown\", onKeyDown, true)\n}\n"],"mappings":";;;;AAeA,SAAgB,aAAa,IAA2B;CACtD,MAAM,MAAM,eAAe,EAAE;CAE7B,IAAI,OAAO,IAAI,iBAAiB,eAAe,cAAc,IAAI,cAC/D,OAAO,CAAC,EAAE,GAAG,gBAAgB;CAE/B,OAAO,cAAc,IAAI;AAC3B;AAEA,SAAgB,aAAa,IAAuC;CAClE,OAAO,CAAC,CAAE,GAAkB;AAC9B;AAEA,SAAgB,kBAAkB,IAA8B;CAC9D,OAAO,aAAa,EAAE,KAAK,GAAG,QAAQ,SAAS;AACjD;AAEA,SAAgB,eAAe,IAA8B;CAC3D,OAAS,GAAe,QAAQ;AAClC;AAEA,SAAgB,eACd,GACA,OAA0B,UACnB;CACP,MAAM,QAAQ,EAAE,QAAQ,MAAM,EAAE,eAAe;CAE/C,OAAO;EAAE,GAAG,QAAQ,GAAG,KAAK,OAAO;EAAG,GAAG,QAAQ,GAAG,KAAK,OAAO;CAAE;AACpE;AAEA,SAAgB,eACd,OACA,OAA0B,UACnB;CACP,OAAO;EACL,GAAG,MAAM,GAAG,KAAK;EACjB,GAAG,MAAM,GAAG,KAAK;CACnB;AACF;AAEA,SAAgB,cACd,IACA,OAA0B,UACnB;CACP,OAAO,aAAa,EAAE,IAAI,eAAe,IAAI,IAAI,IAAI,eAAe,IAAI,IAAI;AAC9E;AAWA,SAAgB,YACd,QACA,MACA,IACA,SACA;CACA,OAAO,iBACL,MACA,IACA,OACF;CAEA,aAAa;EACX,OAAO,oBACL,MACA,IACA,OACF;CACF;AACF;AAEA,SAAgB,UACd,IACA,SACA;CACA,IAAI,CAAC,IAAI,OAAO;CAEhB,MAAM,MAAM,YAAY,EAAE;CAE1B,SAAS,UAAU,IAAmB;EACpC,IAAI,GAAG,QAAQ,OAAO;EAEtB,IAAI,YAA4C;EAEhD,MAAM,CAAC,eAAe,gBAAgB,wBAAwB,IAAI,KAAK;EAEvE,IAAI,GAAG,UACD;OAAA,IAAI,kBAAkB,eAAe,YAAY;EAAA,OAErD,IAAI,IAAI,kBAAkB,cAAc,YAAY;EAGtD,IAAI,CAAC,WAAW;EAEhB,GAAG,eAAe;EAElB,IAAI,WAAW,OAAO,GAAG,QAAQ,SAAS;OACrC,UAAU,MAAM;CACvB;CAEA,OAAO,YAAY,IAAI,WAAW,WAAW,IAAI;AACnD;AAEA,SAAgB,cACd,IACA,QACA,SACA;CACA,MAAM,MAAM,YAAY,EAAE;CAC1B,MAAM,OAAO,IAAI;CAEjB,SAAS,UAAU,IAAmB;EACpC,IAAI,GAAG,QAAQ,OAAO;EAEtB,IAAI,YAA4C;EAEhD,MAAM,CAAC,eAAe,gBAAgB,wBAAwB,IAAI,KAAK;EACvE,MAAM,eAAe,uBAAuB,MAAM,MAAM;EACxD,MAAM,gBAAgB,CAAC,iBAAiB,CAAC;EAEzC,IAAI,GAAG,UACD;OAAA,iBAAiB,IAAI,eACnB;QAAA,IAAI,kBAAkB,cAAc,YAAY;GAAA,OAC/C,IAAI,IAAI,kBAAkB,iBAAiB,eAC5C;QAAA,IAAI,kBAAkB,QAAQ,YAAY;GAAA;EAAK,OAGrD,IAAI,IAAI,kBAAkB,QACpB;OAAA,IAAI,kBAAkB,eAAe,YAAY;EAAA,OAChD,IAAI,IAAI,kBAAkB,gBAAgB,eAC3C;OAAA,IAAI,kBAAkB,cAAc,YAAY;EAAA;EAIxD,IAAI,CAAC,WAAW;EAEhB,GAAG,eAAe;EAElB,IAAI,WAAW,OAAO,GAAG,QAAQ,SAAS;OACrC,UAAU,MAAM;CACvB;CAEA,OAAO,YAAY,KAAK,WAAW,WAAW,IAAI;AACpD"}
@@ -1,5 +1,4 @@
1
1
  import { Dict } from "./index.types.js";
2
-
3
2
  //#region src/assertion.d.ts
4
3
  declare function is(x: any, y: any): boolean;
5
4
  declare function isNumber(value: any): value is number;
@@ -2,7 +2,7 @@
2
2
  type ColorFormat = "hex" | "hexa" | "hsl" | "hsla" | "rgb" | "rgba";
3
3
  declare const SEMANTIC_COLOR_SCHEMES: readonly ["mono", "primary", "secondary", "info", "success", "warning", "danger", "error", "link"];
4
4
  declare const DEFAULT_COLOR_SCHEMES: readonly ["gray", "red", "rose", "pink", "flashy", "orange", "amber", "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", "indigo", "violet", "purple", "fuchsia"];
5
- declare const COLOR_SCHEMES: ("mono" | "primary" | "secondary" | "info" | "success" | "warning" | "danger" | "error" | "link" | "gray" | "red" | "rose" | "pink" | "flashy" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia")[];
5
+ declare const COLOR_SCHEMES: ("link" | "error" | "mono" | "primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "red" | "rose" | "pink" | "flashy" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia")[];
6
6
  declare const TONES: readonly [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
7
7
  declare function convertColor(color: string, fallback: string): {
8
8
  (format: ColorFormat): string;
@@ -22,7 +22,7 @@ declare function isVisualViewport(el: any): el is VisualViewport;
22
22
  declare function isNode(el: any): el is Node;
23
23
  declare function isShadowRoot(el: any): el is ShadowRoot;
24
24
  declare function isFrame(el: any): el is HTMLIFrameElement;
25
- declare function isActiveElement(el: HTMLElement, rootNode: Document | ShadowRoot): boolean;
25
+ declare function isActiveElement(el: HTMLElement, rootNode: Document | Node | ShadowRoot): boolean;
26
26
  declare function isHiddenElement(el: HTMLElement): boolean;
27
27
  declare function isDisabledElement(el: HTMLElement): boolean;
28
28
  declare function isVisibleElement(el?: Node): boolean;
@@ -1,19 +1,19 @@
1
1
  //#region src/index.types.d.ts
2
- type Primitive = bigint | boolean | null | number | string | symbol | undefined;
3
- type PathImpl<Y extends number | string | symbol, M> = Y extends number | string ? M extends Primitive ? `${Y}` : `${Y}.${Path<M>}` : ``;
4
- type Path<Y> = Y extends any[] ? `${number}` : { [M in keyof Y]-?: PathImpl<M, Y[M]> }[keyof Y];
2
+ type Primitive = bigint | boolean | Date | Function | null | number | string | symbol | undefined;
3
+ type PathImpl<Y extends number | string | symbol, M, D = Primitive> = Y extends number | string ? M extends D ? `${Y}` : `${Y}.${Path<M, D>}` | `${Y}` : ``;
4
+ type Path<Y, M = Primitive> = Y extends any[] ? `${number}` : { [D in keyof Y]-?: PathImpl<D, Y[D], M>; }[keyof Y];
5
5
  type Value<Y extends Dict, M extends string> = M extends `${infer D}.${infer H}` ? Value<Y[D], H> : Y[M];
6
6
  interface Dict<Y = any> {
7
7
  [key: string]: Y;
8
8
  }
9
- type Prettify<Y> = { [M in keyof Y]: Y[M] } & {};
9
+ type Prettify<Y> = { [M in keyof Y]: Y[M]; } & {};
10
10
  type FunctionOrValue<Y, M> = ((props: Y) => M) | M;
11
11
  type AnyString = string & {};
12
12
  type Booleanish<Y> = Y extends "false" | "true" ? boolean : Y;
13
13
  type Length<Y extends any[]> = Y["length"];
14
14
  type Merge<Y, M> = M & Omit<Y, keyof M>;
15
- type DeepMerge<Y, M> = Y extends any[] | Date | Function | Primitive ? M : Y extends object ? M extends object ? { [D in keyof M | keyof Y]: D extends keyof M ? D extends keyof Y ? DeepMerge<Y[D], M[D]> : M[D] : D extends keyof Y ? Y[D] : never } : M : M;
16
- type DeepPartial<Y> = Y extends any[] | Date | Function | Primitive ? Y : { [P in keyof Y]?: DeepPartial<Y[P]> };
15
+ type DeepMerge<Y, M> = Y extends any[] | Primitive ? M : Y extends object ? M extends object ? { [D in keyof M | keyof Y]: D extends keyof M ? D extends keyof Y ? DeepMerge<Y[D], M[D]> : M[D] : D extends keyof Y ? Y[D] : never; } : M : M;
16
+ type DeepPartial<Y> = Y extends any[] | Primitive ? Y : { [P in keyof Y]?: DeepPartial<Y[P]>; };
17
17
  //#endregion
18
18
  export { AnyString, Booleanish, DeepMerge, DeepPartial, Dict, FunctionOrValue, Length, Merge, Path, Prettify, Primitive, Value };
19
19
  //# sourceMappingURL=index.types.d.ts.map
@@ -1,13 +1,12 @@
1
1
  import { Dict } from "./index.types.js";
2
-
3
2
  //#region src/object.d.ts
4
3
  declare function omitObject<Y extends Dict, M extends keyof Y>(obj: Y, keys: M[] | readonly M[]): Omit<Y, M>;
5
- declare function pickObject<Y extends Dict, M extends keyof Y>(obj: Y, keys: M[] | readonly M[]): { [D in M]: Y[D] };
6
- declare function splitObject<Y extends Dict, M extends keyof Y>(obj: Y, funcOrKeys?: M[] | readonly M[]): [{ [D in M]: Y[D] }, Omit<Y, M>];
4
+ declare function pickObject<Y extends Dict, M extends keyof Y>(obj: Y, keys: M[] | readonly M[]): { [D in M]: Y[D]; };
5
+ declare function splitObject<Y extends Dict, M extends keyof Y>(obj: Y, funcOrKeys?: M[] | readonly M[]): [{ [D in M]: Y[D]; }, Omit<Y, M>];
7
6
  declare function splitObject<Y extends Dict, M extends Dict>(obj: Dict, funcOrKeys?: (key: string) => boolean): [Y, M];
8
7
  declare function filterObject<Y extends Dict, M extends Dict>(obj: Y, func: (key: keyof Y, value: Y[keyof Y], obj: Y) => boolean): M;
9
8
  declare function filterUndefined<Y extends Dict>(obj: Y): Y;
10
- declare function extractObject<Y extends Dict, M>(obj: Y, getter: (value: Y[keyof Y]) => M): { [key in keyof Y]: M };
9
+ declare function extractObject<Y extends Dict, M>(obj: Y, getter: (value: Y[keyof Y]) => M): { [key in keyof Y]: M; };
11
10
  declare function extractFlatObject<Y extends Dict, M>(obj: Y, getter: (value: Y[keyof Y]) => M, condition?: (key: keyof Y, value: Y[keyof Y]) => boolean): {
12
11
  [k: string]: M;
13
12
  };
@@ -22,11 +21,7 @@ interface FlattenObjectOptions {
22
21
  separator?: string;
23
22
  shouldProcess?: (value: any) => boolean;
24
23
  }
25
- declare function flattenObject<Y extends Dict>(obj: any, {
26
- maxDepth,
27
- separator,
28
- shouldProcess
29
- }?: FlattenObjectOptions): Y;
24
+ declare function flattenObject<Y extends Dict>(obj: any, { maxDepth, separator, shouldProcess }?: FlattenObjectOptions): Y;
30
25
  declare function objectKeys<Y extends object>(obj: Y): (keyof Y)[];
31
26
  declare function replaceObject<Y = any>(objOrArray: Y, callBack: (value: any) => any): Y;
32
27
  declare function getObject(obj: Dict | undefined, path: number | string, fallback?: any): any;
@@ -1,5 +1,4 @@
1
1
  import { AnyString } from "./index.types.js";
2
-
3
2
  //#region src/string.d.ts
4
3
  declare function cx(...classNames: (null | string | undefined)[]): string | undefined;
5
4
  declare function escape(value: string, replaceValue?: string): string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yamada-ui/utils",
3
3
  "type": "module",
4
- "version": "2.1.5",
4
+ "version": "2.1.6-dev-20260730045651",
5
5
  "description": "The utilities for Yamada UI projects",
6
6
  "keywords": [
7
7
  "utils",
@@ -33,8 +33,8 @@
33
33
  "color2k": "^2.0.4"
34
34
  },
35
35
  "devDependencies": {
36
- "@vitest/browser": "^4.1.9",
37
- "@vitest/browser-playwright": "^4.1.9",
36
+ "@vitest/browser": "^4.1.10",
37
+ "@vitest/browser-playwright": "^4.1.10",
38
38
  "playwright": "^1.61.0",
39
39
  "react": "^19.2.7",
40
40
  "@yamada-ui/workspace": "1.0.0"