{"version":3,"sources":["../src/buildFaviconSvg.ts","../src/inferKind.ts","../src/setFaviconHref.ts","../src/useIsAway.ts","../src/useIsDark.ts","../src/index.tsx"],"names":["subscribe","getSnapshot","useSyncExternalStore"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { FaviconValueKind } from './inferKind';\n\ntype SvgValue = { svg: string };\ntype BuildFaviconSvgValue = string | string[] | SvgValue;\ntype BadgeContent = string | number;\n\nexport type BadgePosition = 'top right' | 'top left' | 'bottom right' | 'bottom left';\nexport type BadgeOption =\n  | boolean\n  | BadgeContent\n  | {\n      content: BadgeContent;\n      color?: string;\n      position?: BadgePosition;\n    };\nexport type BuildFaviconSvgOptions = {\n  badge?: BadgeOption;\n};\n\nconst SVG_OPEN = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">';\nconst SVG_CLOSE = '</svg>';\nconst DEFAULT_BADGE_COLOR = '#ef4444';\nconst BADGE_POSITIONS: Record<BadgePosition, { x: number; y: number }> = {\n  'top right': { x: 76, y: 24 },\n  'top left': { x: 24, y: 24 },\n  'bottom right': { x: 76, y: 76 },\n  'bottom left': { x: 24, y: 76 },\n};\n\nfunction escapeAttributeValue(value: string): string {\n  return value.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\nfunction buildColorSvg(value: string): string {\n  return `${SVG_OPEN}<rect width=\"100\" height=\"100\" rx=\"18\" fill=\"${escapeAttributeValue(value)}\" />${SVG_CLOSE}`;\n}\n\nfunction buildGradientSvg(value: string[]): string {\n  const stops = value\n    .map((color, index) => {\n      const offset = value.length === 1 ? 0 : Math.round((index / (value.length - 1)) * 100);\n      return `<stop offset=\"${offset}%\" stop-color=\"${escapeAttributeValue(color)}\" />`;\n    })\n    .join('');\n\n  return `${SVG_OPEN}<defs><linearGradient id=\"favicon-gradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">${stops}</linearGradient></defs><rect width=\"100\" height=\"100\" rx=\"18\" fill=\"url(#favicon-gradient)\" />${SVG_CLOSE}`;\n}\n\nfunction normalizeBadge(badge: BadgeOption | undefined):\n  | { color: string; position: BadgePosition }\n  | { color: string; content: string; position: BadgePosition }\n  | null {\n  if (badge === false || badge === 0 || badge === '' || badge == null) {\n    return null;\n  }\n\n  if (badge === true) {\n    return {\n      color: DEFAULT_BADGE_COLOR,\n      position: 'top right',\n    };\n  }\n\n  if (typeof badge === 'string' || typeof badge === 'number') {\n    return {\n      color: DEFAULT_BADGE_COLOR,\n      content: String(badge),\n      position: 'top right',\n    };\n  }\n\n  const content = String(badge.content);\n\n  if (content === '' || content === '0') {\n    return null;\n  }\n\n  return {\n    color: badge.color ?? DEFAULT_BADGE_COLOR,\n    content,\n    position: badge.position ?? 'top right',\n  };\n}\n\nfunction buildBadgeSvg(badge: BadgeOption | undefined): string {\n  const normalizedBadge = normalizeBadge(badge);\n\n  if (!normalizedBadge) {\n    return '';\n  }\n\n  const { x, y } = BADGE_POSITIONS[normalizedBadge.position];\n\n  if (!('content' in normalizedBadge)) {\n    return `<circle cx=\"${x}\" cy=\"${y}\" r=\"18\" fill=\"${escapeAttributeValue(normalizedBadge.color)}\" stroke=\"#ffffff\" stroke-width=\"6\" />`;\n  }\n\n  const content = escapeAttributeValue(normalizedBadge.content);\n  const badgeWidth = Math.max(36, 18 + normalizedBadge.content.length * 18);\n  const badgeHeight = 36;\n  const badgeX = normalizedBadge.position.includes('left') ? x - 18 : x - badgeWidth + 18;\n  const badgeY = y - badgeHeight / 2;\n  const textX = badgeX + badgeWidth / 2;\n  const textY = y + 1;\n\n  return `<rect x=\"${badgeX}\" y=\"${badgeY}\" width=\"${badgeWidth}\" height=\"${badgeHeight}\" rx=\"18\" fill=\"${escapeAttributeValue(normalizedBadge.color)}\" stroke=\"#ffffff\" stroke-width=\"4\" /><text x=\"${textX}\" y=\"${textY}\" font-size=\"24\" font-family=\"Arial, sans-serif\" font-weight=\"700\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"#ffffff\">${content}</text>`;\n}\n\nexport function buildFaviconSvg(\n  kind: Exclude<FaviconValueKind, 'icon'>,\n  value: BuildFaviconSvgValue,\n  options: BuildFaviconSvgOptions = {},\n): string {\n  if (kind === 'svg') {\n    return typeof value === 'object' && value !== null && 'svg' in value ? value.svg : String(value);\n  }\n\n  const badgeSvg = buildBadgeSvg(options.badge);\n\n  if (kind === 'emoji') {\n    return `${SVG_OPEN}<text x=\"50\" y=\"52\" font-size=\"82\" text-anchor=\"middle\" dominant-baseline=\"central\">${String(value)}</text>${badgeSvg}${SVG_CLOSE}`;\n  }\n\n  if (kind === 'color') {\n    const colorValue = Array.isArray(value) ? value[0] ?? '' : String(value);\n    return `${buildColorSvg(colorValue).replace(SVG_CLOSE, '')}${badgeSvg}${SVG_CLOSE}`;\n  }\n\n  const gradientValue = Array.isArray(value) ? value : [String(value)];\n  return `${buildGradientSvg(gradientValue).replace(SVG_CLOSE, '')}${badgeSvg}${SVG_CLOSE}`;\n}\n","export type FaviconValueKind = 'emoji' | 'color' | 'gradient' | 'icon' | 'svg';\n\nconst emojiPattern = /^\\p{Extended_Pictographic}(?:\\uFE0F|\\u200D\\p{Extended_Pictographic})*$/u;\nconst hexColorPattern = /^#(?:[\\da-f]{3}|[\\da-f]{4}|[\\da-f]{6}|[\\da-f]{8})$/i;\nconst functionalColorPattern =\n  /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color)\\(.+\\)$/i;\nconst iconExtensionPattern =\n  /\\.(?:png|ico|svg|jpg|jpeg|webp|gif|avif|bmp)(?:[?#].*)?$/i;\nconst iconPathPattern =\n  /^(?:https?:\\/\\/|data:image\\/|\\.{0,2}\\/|\\/|[a-z0-9-]+(?:\\.[a-z0-9-]+)+\\/).+/i;\nconst namedColors = new Set([\n  'aliceblue',\n  'antiquewhite',\n  'aqua',\n  'aquamarine',\n  'azure',\n  'beige',\n  'bisque',\n  'black',\n  'blanchedalmond',\n  'blue',\n  'blueviolet',\n  'brown',\n  'burlywood',\n  'cadetblue',\n  'chartreuse',\n  'chocolate',\n  'coral',\n  'cornflowerblue',\n  'cornsilk',\n  'crimson',\n  'cyan',\n  'darkblue',\n  'darkcyan',\n  'darkgoldenrod',\n  'darkgray',\n  'darkgreen',\n  'darkgrey',\n  'darkkhaki',\n  'darkmagenta',\n  'darkolivegreen',\n  'darkorange',\n  'darkorchid',\n  'darkred',\n  'darksalmon',\n  'darkseagreen',\n  'darkslateblue',\n  'darkslategray',\n  'darkslategrey',\n  'darkturquoise',\n  'darkviolet',\n  'deeppink',\n  'deepskyblue',\n  'dimgray',\n  'dimgrey',\n  'dodgerblue',\n  'firebrick',\n  'floralwhite',\n  'forestgreen',\n  'fuchsia',\n  'gainsboro',\n  'ghostwhite',\n  'gold',\n  'goldenrod',\n  'gray',\n  'green',\n  'greenyellow',\n  'grey',\n  'honeydew',\n  'hotpink',\n  'indianred',\n  'indigo',\n  'ivory',\n  'khaki',\n  'lavender',\n  'lavenderblush',\n  'lawngreen',\n  'lemonchiffon',\n  'lightblue',\n  'lightcoral',\n  'lightcyan',\n  'lightgoldenrodyellow',\n  'lightgray',\n  'lightgreen',\n  'lightgrey',\n  'lightpink',\n  'lightsalmon',\n  'lightseagreen',\n  'lightskyblue',\n  'lightslategray',\n  'lightslategrey',\n  'lightsteelblue',\n  'lightyellow',\n  'lime',\n  'limegreen',\n  'linen',\n  'magenta',\n  'maroon',\n  'mediumaquamarine',\n  'mediumblue',\n  'mediumorchid',\n  'mediumpurple',\n  'mediumseagreen',\n  'mediumslateblue',\n  'mediumspringgreen',\n  'mediumturquoise',\n  'mediumvioletred',\n  'midnightblue',\n  'mintcream',\n  'mistyrose',\n  'moccasin',\n  'navajowhite',\n  'navy',\n  'oldlace',\n  'olive',\n  'olivedrab',\n  'orange',\n  'orangered',\n  'orchid',\n  'palegoldenrod',\n  'palegreen',\n  'paleturquoise',\n  'palevioletred',\n  'papayawhip',\n  'peachpuff',\n  'peru',\n  'pink',\n  'plum',\n  'powderblue',\n  'purple',\n  'rebeccapurple',\n  'red',\n  'rosybrown',\n  'royalblue',\n  'saddlebrown',\n  'salmon',\n  'sandybrown',\n  'seagreen',\n  'seashell',\n  'sienna',\n  'silver',\n  'skyblue',\n  'slateblue',\n  'slategray',\n  'slategrey',\n  'snow',\n  'springgreen',\n  'steelblue',\n  'tan',\n  'teal',\n  'thistle',\n  'tomato',\n  'transparent',\n  'turquoise',\n  'violet',\n  'wheat',\n  'white',\n  'whitesmoke',\n  'yellow',\n  'yellowgreen',\n]);\n\nfunction isColorString(value: string): boolean {\n  const trimmed = value.trim().toLowerCase();\n\n  if (trimmed === '') {\n    return false;\n  }\n\n  return (\n    hexColorPattern.test(trimmed) ||\n    functionalColorPattern.test(trimmed) ||\n    namedColors.has(trimmed)\n  );\n}\n\nfunction isIconString(value: string): boolean {\n  const trimmed = value.trim();\n\n  if (trimmed === '') {\n    return false;\n  }\n\n  return iconExtensionPattern.test(trimmed) || iconPathPattern.test(trimmed);\n}\n\nexport function inferKind(value: unknown): FaviconValueKind {\n  if (Array.isArray(value)) {\n    if (value.length === 0 || value.some((item) => typeof item !== 'string')) {\n      return 'icon';\n    }\n\n    if (!value.every((item) => isColorString(item))) {\n      return 'icon';\n    }\n\n    return value.length === 1 ? 'color' : 'gradient';\n  }\n\n  if (\n    typeof value === 'object' &&\n    value !== null &&\n    'svg' in value &&\n    typeof value.svg === 'string'\n  ) {\n    return 'svg';\n  }\n\n  if (typeof value === 'string') {\n    const trimmed = value.trim();\n\n    if (emojiPattern.test(trimmed)) {\n      return 'emoji';\n    }\n\n    if (isColorString(trimmed)) {\n      return 'color';\n    }\n\n    if (isIconString(trimmed)) {\n      return 'icon';\n    }\n  }\n\n  return 'icon';\n}\n","function getOrCreateFaviconLink(): HTMLLinkElement {\n  const existingLink = document.querySelector(\"link[rel='icon']\");\n\n  if (existingLink instanceof HTMLLinkElement) {\n    return existingLink;\n  }\n\n  const link = document.createElement('link');\n  link.rel = 'icon';\n  document.head.appendChild(link);\n  return link;\n}\n\nexport function setFaviconHref(href: string): void {\n  const faviconLink = getOrCreateFaviconLink();\n  faviconLink.setAttribute('href', href);\n}\n","import { useSyncExternalStore } from 'react';\n\nexport function getAwayServerSnapshot(): false {\n  return false;\n}\n\nfunction subscribe(onStoreChange: () => void): () => void {\n  document.addEventListener('visibilitychange', onStoreChange);\n\n  return () => {\n    document.removeEventListener('visibilitychange', onStoreChange);\n  };\n}\n\nfunction getSnapshot(): boolean {\n  return document.visibilityState === 'hidden';\n}\n\nexport function useIsAway(): boolean {\n  return useSyncExternalStore(subscribe, getSnapshot, getAwayServerSnapshot);\n}\n","import { useSyncExternalStore } from 'react';\n\nconst DARK_MODE_MEDIA_QUERY = '(prefers-color-scheme: dark)';\n\nexport function getDarkServerSnapshot(): false {\n  return false;\n}\n\nfunction subscribe(onStoreChange: () => void): () => void {\n  const mediaQueryList = window.matchMedia(DARK_MODE_MEDIA_QUERY);\n\n  mediaQueryList.addEventListener('change', onStoreChange);\n\n  return () => {\n    mediaQueryList.removeEventListener('change', onStoreChange);\n  };\n}\n\nfunction getSnapshot(): boolean {\n  return window.matchMedia(DARK_MODE_MEDIA_QUERY).matches;\n}\n\nexport function useIsDark(): boolean {\n  return useSyncExternalStore(subscribe, getSnapshot, getDarkServerSnapshot);\n}\n","import { useEffect } from 'react';\nimport { buildFaviconSvg, type BuildFaviconSvgOptions } from './buildFaviconSvg';\nimport { inferKind, type FaviconValueKind } from './inferKind';\nimport { setFaviconHref } from './setFaviconHref';\nimport { useIsAway } from './useIsAway';\nimport { useIsDark } from './useIsDark';\n\ntype RawSvgValue = { svg: string };\nexport type FaviconValue = string | string[] | RawSvgValue;\n\nexport type UseFaviconOptions = BuildFaviconSvgOptions;\n\nfunction toFaviconHref(\n  kind: FaviconValueKind,\n  value: FaviconValue,\n  options: UseFaviconOptions = {},\n): string {\n  if (kind === 'icon') {\n    return String(value);\n  }\n\n  const svg = buildFaviconSvg(kind, value, options);\n  return `data:image/svg+xml,${encodeURIComponent(svg)}`;\n}\n\nexport function useFavicon(value: FaviconValue, options: UseFaviconOptions = {}): void {\n  useEffect(() => {\n    const kind = inferKind(value);\n    const href = toFaviconHref(kind, value, options);\n    setFaviconHref(href);\n  }, [options, value]);\n}\n\nexport { buildFaviconSvg, inferKind, setFaviconHref, useIsAway, useIsDark };\nexport type { FaviconValueKind };\n\nexport default useFavicon;\n"]}