{"version":3,"file":"streakr.cjs","names":[],"sources":["../src/core/streaks.ts","../src/core/split.ts","../src/core/leveling.ts","../src/core/grid.ts","../src/providers/aggregator.ts","../src/providers/github.ts","../src/providers/gitlab.ts","../src/providers/github-coauthor.ts","../src/component/providers.ts","../src/component/config.ts","../src/component/dom.ts","../src/component/logo.ts","../src/component/calendar.ts","../src/component/metrics.ts","../src/component/selectors.ts","../src/component/provider-row.ts","../src/component/header.ts","../src/component/render/heatmap.ts","../src/component/render/stats.ts","../src/component/render/body.ts","../src/component/ring-interaction.ts","../src/component/render/ring.ts","../src/component/theme.ts","../src/component/tooltip.ts","../src/component/update.ts","../src/component/year-modal.ts","../src/component/streakr.ts"],"sourcesContent":["import type { ContributionDay, StreakResult } from \"../types\";\n\nexport const computeStreaks = (days: ContributionDay[]): StreakResult =>\n  days.reduce<StreakResult>(\n    (stats, day) => {\n      const currentStreak = day.count > 0 ? stats.currentStreak + 1 : 0;\n      return {\n        total: stats.total + day.count,\n        bestStreak: Math.max(stats.bestStreak, currentStreak),\n        currentStreak,\n      };\n    },\n    { total: 0, bestStreak: 0, currentStreak: 0 },\n  );\n","import type { ContributionDay } from \"../types\";\nimport { normalizeEventsToDaily } from \"./normalize\";\n\nexport interface SplitCoAuthoredOptions {\n  humanKey?: string;\n}\n\nexport const splitCoAuthored = (\n  totalDays: ContributionDay[],\n  agentDays: Record<string, ContributionDay[]>,\n  options?: SplitCoAuthoredOptions,\n): ContributionDay[] => {\n  const humanKey = options?.humanKey ?? \"github\";\n  const agentKeys = Object.keys(agentDays);\n  if (agentKeys.includes(humanKey)) {\n    throw new Error(`Agent key \"${humanKey}\" must not equal the human key`);\n  }\n\n  const totalByDate = new Map(\n    normalizeEventsToDaily(totalDays).map((day) => [day.date, day.count]),\n  );\n\n  const agentsByDate = agentKeys.reduce((acc, key) => {\n    normalizeEventsToDaily(agentDays[key] ?? []).forEach((day) => {\n      acc.set(day.date, { ...acc.get(day.date), [key]: day.count });\n    });\n    return acc;\n  }, new Map<string, Record<string, number>>());\n\n  const dates = [...new Set([...totalByDate.keys(), ...agentsByDate.keys()])].sort((a, b) =>\n    a.localeCompare(b),\n  );\n\n  return dates.map((date) => {\n    const perAgent = Object.fromEntries(\n      agentKeys.map((key) => [key, agentsByDate.get(date)?.[key] ?? 0]),\n    );\n    const agentSum = Object.values(perAgent).reduce((sum, value) => sum + value, 0);\n    const total = totalByDate.get(date) ?? agentSum;\n    return {\n      date,\n      count: Math.max(total, agentSum),\n      sources: { [humanKey]: Math.max(0, total - agentSum), ...perAgent },\n    };\n  });\n};\n","export type Level = 0 | 1 | 2 | 3 | 4;\n\nconst LEVEL_PERCENTILES = [0.25, 0.55, 0.8] as const;\n\nexport const computeLevelThresholds = (counts: number[]): [number, number, number] => {\n  const active = counts.filter((c) => c > 0).sort((a, b) => a - b);\n  if (active.length === 0) return [0, 0, 0];\n  const at = (q: number): number =>\n    active[Math.min(active.length - 1, Math.floor(active.length * q))] ?? 0;\n  return [at(LEVEL_PERCENTILES[0]), at(LEVEL_PERCENTILES[1]), at(LEVEL_PERCENTILES[2])];\n};\n\nexport const countToLevel = (count: number, [t1, t2, t3]: [number, number, number]): Level => {\n  if (count <= 0) return 0;\n  if (count <= t1) return 1;\n  if (count <= t2) return 2;\n  if (count <= t3) return 3;\n  return 4;\n};\n\nexport const computeLevels = (counts: number[]): Level[] => {\n  const thresholds = computeLevelThresholds(counts);\n  return counts.map((c) => countToLevel(c, thresholds));\n};\n","import type { ContributionDay, CalendarGrid, CalendarCell, GridOptions } from \"../types\";\nimport { addDays, daysInRange, toUTC } from \"./date\";\nimport { computeLevelThresholds, countToLevel } from \"./leveling\";\n\nconst adjustedDayOfWeek = (utcDay: number, weekStartsOn: number): number =>\n  (utcDay - weekStartsOn + 7) % 7;\n\nexport const buildCalendarGrid = (days: ContributionDay[], options?: GridOptions): CalendarGrid => {\n  if (days.length === 0) {\n    return { weeks: [], totalContributions: 0 };\n  }\n\n  const first = days[0];\n  const last = days[days.length - 1];\n  if (!first || !last) {\n    return { weeks: [], totalContributions: 0 };\n  }\n\n  const weekStartsOn = options?.weekStartsOn ?? 0;\n  const startDate = options?.startDate ?? first.date;\n  const endDate = options?.endDate ?? last.date;\n  const inRange = days.filter((d) => d.date >= startDate && d.date <= endDate);\n\n  const dayMap = new Map(inRange.map((d) => [d.date, d]));\n  const thresholds = computeLevelThresholds(inRange.map((d) => d.count));\n\n  if (startDate > endDate) {\n    return { weeks: [], totalContributions: 0 };\n  }\n\n  const firstDayOfWeek = adjustedDayOfWeek(new Date(toUTC(startDate)).getUTCDay(), weekStartsOn);\n\n  const cells = [\n    ...new Array<CalendarCell | null>(firstDayOfWeek).fill(null),\n    ...Array.from({ length: daysInRange(startDate, endDate) }, (_, i) => {\n      const dateStr = addDays(startDate, i);\n      const count = dayMap.get(dateStr)?.count ?? 0;\n      return { date: dateStr, count, level: countToLevel(count, thresholds) };\n    }),\n  ];\n\n  const totalCells = Math.ceil(cells.length / 7) * 7;\n  const paddedCells = [\n    ...cells,\n    ...new Array<CalendarCell | null>(totalCells - cells.length).fill(null),\n  ];\n\n  const weeks = Array.from({ length: paddedCells.length / 7 }, (_, i) =>\n    paddedCells.slice(i * 7, (i + 1) * 7),\n  );\n\n  const totalContributions = inRange.reduce((sum, d) => sum + d.count, 0);\n\n  return { weeks, totalContributions };\n};\n","import type { ContributionDay, FetchParams } from \"../types\";\nimport type { Provider } from \"./types\";\n\nexport const aggregate = async (\n  providers: Provider[],\n  params: FetchParams,\n): Promise<ContributionDay[]> => {\n  const results = await Promise.allSettled(\n    providers.map((provider) => provider.fetchEvents(params)),\n  );\n\n  return providers.flatMap((provider, index) => {\n    const result = results[index];\n    if (result?.status !== \"fulfilled\") return [];\n    return result.value.map((day) => ({\n      date: day.date,\n      count: day.count,\n      sources: {\n        ...day.sources,\n        [provider.name]: (day.sources?.[provider.name] ?? 0) + day.count,\n      },\n    }));\n  });\n};\n","import type { FetchLike, Provider } from \"./types\";\nimport {\n  CONTRIBUTIONS_QUERY,\n  fetchContributionCalendar,\n  type GitHubGraphQLRequest,\n  type GitHubGraphQLResponse,\n} from \"./shared/github-graphql\";\n\nconst GITHUB_GRAPHQL_ENDPOINT = \"https://api.github.com/graphql\";\n\nexport interface GitHubProviderOptions {\n  token: string;\n  endpoint?: string;\n  fetch?: FetchLike;\n  name?: string;\n}\n\nexport const githubProvider = (options: GitHubProviderOptions): Provider => {\n  const token = options.token.trim();\n  if (token.length === 0) {\n    throw new Error(\"githubProvider requires a non-empty PAT token\");\n  }\n\n  const endpoint = options.endpoint ?? GITHUB_GRAPHQL_ENDPOINT;\n  const fetchImpl = options.fetch ?? fetch;\n\n  const request: GitHubGraphQLRequest = async (variables) => {\n    const response = await fetchImpl(endpoint, {\n      method: \"POST\",\n      headers: {\n        Authorization: `Bearer ${token}`,\n        \"Content-Type\": \"application/json\",\n        Accept: \"application/json\",\n        \"User-Agent\": \"streakr\",\n      },\n      body: JSON.stringify({ query: CONTRIBUTIONS_QUERY, variables }),\n    });\n\n    if (!response.ok) {\n      const errorBody = (await response.text()).trim();\n      const statusText = response.statusText || \"Request failed\";\n      throw new Error(\n        `GitHub GraphQL request failed (${response.status} ${statusText}): ${errorBody}`,\n      );\n    }\n\n    return (await response.json()) as GitHubGraphQLResponse;\n  };\n\n  return {\n    name: options.name ?? \"github\",\n    fetchEvents: (params) => fetchContributionCalendar(request, params),\n  };\n};\n","import type { FetchLike, Provider } from \"./types\";\nimport { fetchGitLabDays, type GitLabRequest } from \"./shared/gitlab-events\";\n\nconst GITLAB_BASE_URL = \"https://gitlab.com\";\n\nexport interface GitLabProviderOptions {\n  token: string;\n  baseUrl?: string;\n  fetch?: FetchLike;\n  name?: string;\n}\n\nexport const gitlabProvider = (options: GitLabProviderOptions): Provider => {\n  const token = options.token.trim();\n  if (token.length === 0) {\n    throw new Error(\"gitlabProvider requires a non-empty token\");\n  }\n\n  const baseUrl = (options.baseUrl ?? GITLAB_BASE_URL).replace(/\\/$/, \"\");\n  const fetchImpl = options.fetch ?? fetch;\n\n  const request: GitLabRequest = async <T>(path: string): Promise<T> => {\n    const response = await fetchImpl(`${baseUrl}/api/v4${path}`, {\n      headers: {\n        \"PRIVATE-TOKEN\": token,\n        Accept: \"application/json\",\n        \"User-Agent\": \"streakr\",\n      },\n    });\n\n    if (!response.ok) {\n      const errorBody = (await response.text()).trim();\n      const statusText = response.statusText || \"Request failed\";\n      throw new Error(`GitLab API request failed (${response.status} ${statusText}): ${errorBody}`);\n    }\n\n    return (await response.json()) as T;\n  };\n\n  return {\n    name: options.name ?? \"gitlab\",\n    fetchEvents: (params) => fetchGitLabDays(request, params),\n  };\n};\n","import type { FetchLike, Provider } from \"./types\";\nimport { resolveAgentMatches } from \"./trailers\";\nimport {\n  fetchCoAuthorDays,\n  PER_PAGE,\n  type CommitSearchRequest,\n  type CommitSearchResponse,\n} from \"./shared/commit-search\";\n\nconst SEARCH_COMMITS_ENDPOINT = \"https://api.github.com/search/commits\";\n\nexport interface GitHubCoAuthorProviderOptions {\n  token: string;\n  agents?: string[];\n  endpoint?: string;\n  fetch?: FetchLike;\n  name?: string;\n}\n\nexport const githubCoAuthorProvider = (options: GitHubCoAuthorProviderOptions): Provider => {\n  const token = options.token.trim();\n  if (token.length === 0) {\n    throw new Error(\"githubCoAuthorProvider requires a non-empty PAT token\");\n  }\n\n  const matches = resolveAgentMatches(options.agents);\n  const endpoint = options.endpoint ?? SEARCH_COMMITS_ENDPOINT;\n  const fetchImpl = options.fetch ?? fetch;\n\n  const request: CommitSearchRequest = async (query, page) => {\n    const url = `${endpoint}?q=${encodeURIComponent(query)}&per_page=${PER_PAGE}&page=${page}`;\n    const response = await fetchImpl(url, {\n      headers: {\n        Authorization: `Bearer ${token}`,\n        Accept: \"application/vnd.github+json\",\n        \"User-Agent\": \"streakr\",\n      },\n    });\n\n    if (!response.ok) {\n      const errorBody = (await response.text()).trim();\n      const statusText = response.statusText || \"Request failed\";\n      if (response.status === 403 || response.status === 429) {\n        throw new Error(\n          `GitHub commit search hit a secondary rate limit (${response.status} ${statusText}): ${errorBody}`,\n        );\n      }\n      throw new Error(\n        `GitHub commit search request failed (${response.status} ${statusText}): ${errorBody}`,\n      );\n    }\n\n    return (await response.json()) as CommitSearchResponse;\n  };\n\n  return {\n    name: options.name ?? \"github-agents\",\n    fetchEvents: (params) => fetchCoAuthorDays(request, matches, params),\n  };\n};\n","import type { StreakrProvider, StreakrProviders } from \"../types\";\n\nconst BUILTIN_ICONS: Record<string, string> = {\n  github:\n    '<svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\" fill=\"currentColor\"><path d=\"M8 0C3.58 0 0 3.58 0 8a8 8 0 005.47 7.59c.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0016 8c0-4.42-3.58-8-8-8z\"/></svg>',\n  gitlab:\n    '<svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\"><path d=\"M8 14.7L10.95 5.6H5.05L8 14.7z\" fill=\"#e24329\"/><path d=\"M8 14.7L5.05 5.6H.92L8 14.7z\" fill=\"#fc6d26\"/><path d=\"M.92 5.6L.02 8.36c-.08.25 0 .53.22.69L8 14.7.92 5.6z\" fill=\"#fca326\"/><path d=\"M.92 5.6h4.13L3.27.1c-.09-.27-.48-.27-.57 0L.92 5.6z\" fill=\"#e24329\"/><path d=\"M8 14.7l2.95-9.1h4.13L8 14.7z\" fill=\"#fc6d26\"/><path d=\"M15.08 5.6l.9 2.76c.08.25 0 .53-.22.69L8 14.7l7.08-9.1z\" fill=\"#fca326\"/><path d=\"M15.08 5.6h-4.13L12.73.1c.09-.27.48-.27.57 0l1.78 5.5z\" fill=\"#e24329\"/></svg>',\n  bitbucket:\n    '<svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\"><path d=\"M.51 1.18c-.27 0-.51.24-.51.51 0 .03 0 .07.01.1l2.18 13.17c.06.36.37.62.74.63h10.46c.27 0 .51-.2.55-.47l2.18-13.32a.512.512 0 00-.41-.59L.6 1.18zm9.13 9.42H6.4l-.88-4.55h4.92l-.8 4.55z\" fill=\"#2684ff\"/></svg>',\n  claude:\n    '<svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"#d97757\"><path d=\"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z\"/></svg>',\n  codex:\n    '<svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"currentColor\"><path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\"/></svg>',\n  opencode:\n    '<svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"currentColor\"><path d=\"M22 24H2V0h20zM17 4.8H7v14.4h10z\"/></svg>',\n  copilot:\n    '<svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"currentColor\"><path d=\"M23.922 16.997C23.061 18.492 18.063 22.02 12 22.02 5.937 22.02.939 18.492.078 16.997A.641.641 0 0 1 0 16.741v-2.869a.883.883 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.098 10.098 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952C7.255 2.937 9.248 1.98 11.978 1.98c2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.841.841 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256Zm-11.75-5.992h-.344a4.359 4.359 0 0 1-.355.508c-.77.947-1.918 1.492-3.508 1.492-1.725 0-2.989-.359-3.782-1.259a2.137 2.137 0 0 1-.085-.104L4 11.746v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.359 4.359 0 0 1-.355-.508Zm2.328 3.25c.549 0 1 .451 1 1v2c0 .549-.451 1-1 1-.549 0-1-.451-1-1v-2c0-.549.451-1 1-1Zm-5 0c.549 0 1 .451 1 1v2c0 .549-.451 1-1 1-.549 0-1-.451-1-1v-2c0-.549.451-1 1-1Zm3.313-6.185c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z\"/></svg>',\n};\n\nexport const DEFAULT_PROVIDERS: StreakrProvider[] = [\n  { key: \"github\", name: \"GitHub\", color: \"#39d353\" },\n  { key: \"gitlab\", name: \"GitLab\", color: \"#fc6d26\" },\n  { key: \"bitbucket\", name: \"Bitbucket\", color: \"#2684ff\" },\n];\n\nexport const AGENT_PROVIDERS: StreakrProvider[] = [\n  { key: \"claude\", name: \"Claude\", color: \"#d97757\" },\n  { key: \"codex\", name: \"Codex\", color: \"#10a37f\" },\n  { key: \"opencode\", name: \"opencode\", color: \"#e8b04b\" },\n  { key: \"copilot\", name: \"Copilot\", color: \"#8957e5\" },\n];\n\nexport const providerIconHtml = (provider: StreakrProvider): string | null =>\n  provider.icon ?? BUILTIN_ICONS[provider.key] ?? null;\n\nexport const enabledProviderState = (providers: StreakrProvider[]): StreakrProviders =>\n  Object.fromEntries(providers.map(({ key }) => [key, true]));\n\nexport const syncProviderState = (\n  providers: StreakrProvider[],\n  current: StreakrProviders,\n): StreakrProviders => Object.fromEntries(providers.map(({ key }) => [key, current[key] ?? true]));\n","import type {\n  StreakrDay,\n  StreakrOptions,\n  StreakrProvider,\n  StreakrProviders,\n  StreakrThemeMode,\n} from \"../types\";\nimport { DEFAULT_PROVIDERS, enabledProviderState } from \"./providers\";\n\nexport interface InternalState {\n  year: number | null;\n  providers: StreakrProviders;\n  yearModalOpen: boolean;\n  selectedDay: Date;\n}\n\nexport interface ResolvedConfig {\n  target: HTMLElement;\n  theme: StreakrThemeMode;\n  accent: string;\n  tintHeatmap: boolean;\n  showProviders: boolean;\n  showStats: boolean;\n  state: \"loading\" | \"empty\" | \"ready\";\n  years: number[];\n  year: number | null;\n  today: Date;\n  getDays: (year: number) => StreakrDay[] | undefined;\n  providers: StreakrProvider[];\n  onYearChange: ((year: number) => void) | null;\n  onProviderToggle: ((key: string, enabled: boolean, providers: StreakrProviders) => void) | null;\n}\n\nexport interface ComponentCtx {\n  cfg: ResolvedConfig;\n  state: InternalState;\n}\n\nexport const sourceCount = (day: StreakrDay, key: string): number => day.sources?.[key] ?? 0;\n\nexport const resolveConfig = (options: StreakrOptions): ResolvedConfig => {\n  const opts: Partial<StreakrOptions> = options;\n  if (!opts.target) {\n    throw new Error(\"streakr: `target` is required\");\n  }\n\n  const cfg: ResolvedConfig = {\n    target: opts.target,\n    theme: opts.theme ?? \"dark\",\n    accent: opts.accent ?? \"#39d353\",\n    tintHeatmap: opts.tintHeatmap ?? true,\n    showProviders: opts.showProviders ?? true,\n    showStats: opts.showStats ?? true,\n    state: opts.state ?? \"ready\",\n    years: opts.years ?? [],\n    year: opts.year ?? null,\n    today: opts.today ?? new Date(),\n    getDays: opts.getDays ?? (() => []),\n    providers: opts.providers ?? DEFAULT_PROVIDERS,\n    onYearChange: opts.onYearChange ?? null,\n    onProviderToggle: opts.onProviderToggle ?? null,\n  };\n  if (cfg.year == null && cfg.years.length) {\n    cfg.year = cfg.years[cfg.years.length - 1] ?? null;\n  }\n  return cfg;\n};\n\nexport const createInitialState = (cfg: ResolvedConfig): InternalState => ({\n  year: cfg.year,\n  providers: enabledProviderState(cfg.providers),\n  yearModalOpen: false,\n  selectedDay: cfg.today,\n});\n","type SimpleAttr = string | number | boolean;\ntype StyleAttr = Partial<CSSStyleDeclaration> | Record<string, string>;\ntype TrustedHtml = {\n  readonly markup: string;\n  readonly trustedHtml: true;\n};\ntype EventAttr = (event: Event) => void;\ntype ElAttrValue = SimpleAttr | TrustedHtml | EventAttr | StyleAttr | null | undefined;\ntype ElAttrs = Record<string, ElAttrValue>;\ntype ElChild = Node | string | null | false | undefined;\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nconst simpleAttrSetters: Record<string, (el: Element, value: string) => void> = {\n  class: (el, value) => el.setAttribute(\"class\", value),\n  text: (el, value) => {\n    el.textContent = value;\n  },\n};\n\nexport const trustedHtml = (markup: string): TrustedHtml => ({\n  markup,\n  trustedHtml: true,\n});\n\nconst isSimple = (value: ElAttrValue): value is SimpleAttr =>\n  typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n\nconst isTrustedHtml = (value: ElAttrValue): value is TrustedHtml =>\n  typeof value === \"object\" && value != null && \"trustedHtml\" in value;\n\nconst setSimpleAttr = (el: Element, key: string, value: SimpleAttr): void => {\n  const str = String(value);\n  (simpleAttrSetters[key] ?? ((node, attrValue) => node.setAttribute(key, attrValue)))(el, str);\n};\n\nconst setStyle = (el: Element, value: ElAttrValue): boolean => {\n  if (typeof value !== \"object\" || value === null) return false;\n  const style = (el as HTMLElement).style;\n  Object.entries(value as Record<string, string>).forEach(([key, val]) => {\n    if (key.startsWith(\"--\")) style.setProperty(key, val);\n    else Object.assign(style, { [key]: val });\n  });\n  return true;\n};\n\nconst setHtml = (el: Element, value: ElAttrValue): boolean =>\n  isTrustedHtml(value)\n    ? (el.replaceChildren(document.createRange().createContextualFragment(value.markup)), true)\n    : false;\n\nconst setListener = (el: Element, key: string, value: ElAttrValue): boolean =>\n  key.startsWith(\"on\")\n    ? (typeof value === \"function\" && el.addEventListener(key.slice(2).toLowerCase(), value), true)\n    : false;\n\nconst setAttr = (el: Element, key: string, value: ElAttrValue): void => {\n  if (value === false || value == null) return;\n  const handled =\n    (key === \"html\" && setHtml(el, value)) ||\n    (key === \"style\" && setStyle(el, value)) ||\n    setListener(el, key, value);\n  if (!handled && isSimple(value)) {\n    setSimpleAttr(el, key, value);\n  }\n};\n\nconst appendChildren = (el: Element, list: ElChild[]): void =>\n  list\n    .filter((child): child is Node | string => child != null && child !== false)\n    .forEach((child) =>\n      el.appendChild(typeof child === \"string\" ? document.createTextNode(child) : child),\n    );\n\nexport function h<K extends keyof HTMLElementTagNameMap>(\n  tag: K,\n  attrs?: ElAttrs,\n  children?: ElChild | ElChild[],\n): HTMLElementTagNameMap[K];\nexport function h(tag: string, attrs?: ElAttrs, children?: ElChild | ElChild[]): Element;\nexport function h(tag: string, attrs?: ElAttrs, children?: ElChild | ElChild[]): Element {\n  const isSvg = tag.includes(\":\");\n  const el = isSvg\n    ? document.createElementNS(SVG_NS, tag.slice(tag.indexOf(\":\") + 1))\n    : document.createElement(tag);\n\n  if (attrs) {\n    Object.entries(attrs).forEach(([key, val]) => setAttr(el, key, val));\n  }\n\n  if (children !== undefined && children !== null) {\n    appendChildren(el, Array.isArray(children) ? children : [children]);\n  }\n\n  return el;\n}\n\nexport const svg = (tag: string, attrs?: ElAttrs, children?: ElChild | ElChild[]): SVGElement =>\n  h(\"svg:\" + tag, attrs, children) as SVGElement;\n","import { svg } from \"./dom\";\n\nexport const logoR = (): SVGElement => {\n  const fill = \"var(--sk-heat-4, #39d353)\";\n  const hole = \"var(--sk-heat-1, #0e4429)\";\n  const cells: [number, number, string][] = [\n    [1, 1, fill],\n    [7, 1, fill],\n    [13, 1, fill],\n    [1, 7, fill],\n    [7, 7, fill],\n    [13, 7, hole],\n    [1, 13, fill],\n    [7, 13, hole],\n    [13, 13, fill],\n  ];\n\n  return svg(\n    \"svg\",\n    { width: 18, height: 18, viewBox: \"0 0 18 18\", fill: \"none\" },\n    cells.map(([x, y, cellFill]) =>\n      svg(\"rect\", { x, y, width: 4, height: 4, rx: 1, fill: cellFill }),\n    ),\n  );\n};\n","import type { StreakrDay } from \"../types\";\n\nexport const DAY_LABELS = [\"Mon\", \"Wed\", \"Fri\"];\n\nexport const MONTH_LABELS_SHORT = [\n  \"Jan\",\n  \"Feb\",\n  \"Mar\",\n  \"Apr\",\n  \"May\",\n  \"Jun\",\n  \"Jul\",\n  \"Aug\",\n  \"Sep\",\n  \"Oct\",\n  \"Nov\",\n  \"Dec\",\n];\n\nconst MONTHS = [\n  \"January\",\n  \"February\",\n  \"March\",\n  \"April\",\n  \"May\",\n  \"June\",\n  \"July\",\n  \"August\",\n  \"September\",\n  \"October\",\n  \"November\",\n  \"December\",\n];\n\nconst DOW = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n\nconst pad2 = (value: number): string => String(value).padStart(2, \"0\");\n\nexport const localDateKey = (d: Date): string =>\n  `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n\nexport const padDaysToYear = (days: StreakrDay[], year: number): StreakrDay[] => {\n  const byDate = new Map(days.map((day) => [localDateKey(day.date), day]));\n  const isLeap = (y: number) => (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;\n  const dayCount = isLeap(year) ? 366 : 365;\n\n  return Array.from({ length: dayCount }, (_, i) => {\n    const cur = new Date(year, 0, i + 1);\n    const key = localDateKey(cur);\n    return byDate.get(key) ?? { date: cur, total: 0, sources: {} };\n  });\n};\n\nconst padGridColumns = <T>(cols: (T | null)[][]): (T | null)[][] =>\n  cols.map((col) => [...col, ...new Array<T | null>(Math.max(0, 7 - col.length)).fill(null)]);\n\nexport const padDaysToRange = (days: StreakrDay[], start: Date, end: Date): StreakrDay[] => {\n  const byDate = new Map(days.map((day) => [localDateKey(day.date), day]));\n  const out: StreakrDay[] = [];\n  const cur = new Date(start);\n\n  while (cur <= end) {\n    const key = localDateKey(cur);\n    out.push(byDate.get(key) ?? { date: new Date(cur), total: 0, sources: {} });\n    cur.setDate(cur.getDate() + 1);\n  }\n\n  return out;\n};\n\nexport const yearToDateRange = (today: Date): { start: Date; end: Date } => ({\n  start: new Date(today.getFullYear(), 0, 1),\n  end: new Date(today),\n});\n\nexport const gridFromDays = <T extends StreakrDay>(days: T[]): (T | null)[][] => {\n  const first = days[0];\n  if (!first) return [];\n  return padGridColumns(\n    days.reduce<(T | null)[][]>(\n      (cols, day) => {\n        const lastCol = cols[cols.length - 1];\n        return !lastCol || lastCol.length === 7\n          ? [...cols, [day]]\n          : [...cols.slice(0, -1), [...lastCol, day]];\n      },\n      [new Array<T | null>(first.date.getDay()).fill(null)],\n    ),\n  );\n};\n\nexport const monthHeaders = (cols: (StreakrDay | null)[][]): { col: number; label: string }[] =>\n  cols.reduce<{ headers: { col: number; label: string }[]; lastMonth: number }>(\n    (state, col, index) => {\n      const firstDay = col.find((day): day is StreakrDay => Boolean(day));\n      const month = firstDay?.date.getMonth();\n      const lastHeader = state.headers[state.headers.length - 1];\n      const hasRoom = !lastHeader || index - lastHeader.col >= 3;\n\n      const nextHeaders =\n        month !== undefined && month !== state.lastMonth && hasRoom\n          ? [...state.headers, { col: index, label: MONTH_LABELS_SHORT[month] ?? \"\" }]\n          : state.headers;\n\n      return {\n        headers: nextHeaders,\n        lastMonth: month ?? state.lastMonth,\n      };\n    },\n    { headers: [], lastMonth: -1 },\n  ).headers;\n\nexport const fmtDateLong = (date: Date): string =>\n  `${DOW[date.getDay()]}, ${MONTHS[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;\n\nexport const fmtDateShort = (date: Date): string =>\n  `${MONTH_LABELS_SHORT[date.getMonth()]} ${date.getDate()}`;\n\nexport const dayAngle = (dayIndex: number, totalDays: number): number => {\n  const anglePerDay = (2 * Math.PI) / totalDays;\n  return -Math.PI / 2 + dayIndex * anglePerDay;\n};\n\nexport const polarToCartesian = (\n  cx: number,\n  cy: number,\n  r: number,\n  angle: number,\n): { x: number; y: number } => ({\n  x: cx + r * Math.cos(angle),\n  y: cy + r * Math.sin(angle),\n});\n\nconst dayIndexToAngle = (day: Date, totalDays: number): number => {\n  const startOfYear = new Date(day.getFullYear(), 0, 1);\n  const idx = Math.round((day.getTime() - startOfYear.getTime()) / (1000 * 60 * 60 * 24));\n  return dayAngle(Math.max(0, Math.min(totalDays - 1, idx)), totalDays);\n};\n\nexport const dayToHandRotation = (day: Date, totalDays: number): number =>\n  dayIndexToAngle(day, totalDays) + Math.PI / 2;\n","import type { StreakrDay, StreakrLeveledDay } from \"../types\";\nimport { computeLevels } from \"../core/leveling\";\n\nexport interface StreakrStats {\n  total: number;\n  active: number;\n  best: number;\n  current: number;\n}\n\nexport const levelize = (days: StreakrDay[]): StreakrLeveledDay[] => {\n  const levels = computeLevels(days.map((day) => day.total));\n  return days.map((day, i) => ({ ...day, level: levels[i] ?? 0 }));\n};\n\nconst nextStreakState = (\n  acc: { count: number; halted: boolean },\n  total: number,\n): { count: number; halted: boolean } => {\n  if (acc.halted) return acc;\n  if (total > 0) return { count: acc.count + 1, halted: false };\n  return { count: acc.count, halted: true };\n};\n\nexport const computeStats = (days: StreakrDay[]): StreakrStats => {\n  const total = days.reduce((sum, d) => sum + d.total, 0);\n  const active = days.reduce((count, d) => count + (d.total > 0 ? 1 : 0), 0);\n  const best = days.reduce(\n    (acc, d) => {\n      const curRun = d.total > 0 ? acc.curRun + 1 : 0;\n      return {\n        best: Math.max(acc.best, curRun),\n        curRun,\n      };\n    },\n    { best: 0, curRun: 0 },\n  ).best;\n  const current = days.reduceRight((acc, d) => nextStreakState(acc, d.total), {\n    count: 0,\n    halted: false,\n  }).count;\n\n  return { total, active, best, current };\n};\n\nexport const formatTotalLabel = (total: number): string => {\n  if (total === 0) return \"No contributions\";\n  if (total === 1) return \"1 contribution\";\n  return `${total} contributions`;\n};\n","import type { StreakrDay, StreakrLeveledDay } from \"../types\";\nimport { padDaysToRange, padDaysToYear, yearToDateRange } from \"./calendar\";\nimport type { ComponentCtx, ResolvedConfig } from \"./config\";\nimport { sourceCount } from \"./config\";\nimport { computeStats, levelize, type StreakrStats } from \"./metrics\";\n\nconst MAX_VISIBLE_YEARS = 5;\n\nexport interface RenderFlags {\n  isLoading: boolean;\n  isEmpty: boolean;\n  allOff: boolean;\n  canEnableAll: boolean;\n  days: StreakrDay[];\n  providersWithDataCount: number;\n  leveled: StreakrLeveledDay[];\n  stats: StreakrStats;\n}\n\nexport const isCurrentYear = (ctx: ComponentCtx): boolean =>\n  ctx.state.year === ctx.cfg.today.getFullYear();\n\nconst activeDayTotal = (ctx: ComponentCtx, day: StreakrDay): number =>\n  day.sources == null\n    ? day.total\n    : ctx.cfg.providers\n        .filter((provider) => ctx.state.providers[provider.key])\n        .reduce((total, provider) => total + sourceCount(day, provider.key), 0);\n\nconst getCurrentDays = (ctx: ComponentCtx): StreakrDay[] => {\n  const { cfg, state } = ctx;\n  if (cfg.state !== \"ready\" || state.year == null) return [];\n  const currentYearDays = (cfg.getDays(state.year) || []).map((day) => ({\n    ...day,\n    total: activeDayTotal(ctx, day),\n  }));\n  if (!isCurrentYear(ctx)) return currentYearDays;\n  const { start, end } = yearToDateRange(cfg.today);\n  return currentYearDays.filter((day) => day.date >= start && day.date <= end);\n};\n\nconst getHeatmapDays = (ctx: ComponentCtx, days: StreakrDay[]): StreakrDay[] => {\n  if (ctx.state.year == null) return days;\n  return padDaysToYear(days, ctx.state.year);\n};\n\nconst getStatsDays = (ctx: ComponentCtx, days: StreakrDay[]): StreakrDay[] => {\n  if (ctx.state.year == null) return days;\n  if (isCurrentYear(ctx)) {\n    const { start, end } = yearToDateRange(ctx.cfg.today);\n    return padDaysToRange(days, start, end);\n  }\n  return padDaysToYear(days, ctx.state.year);\n};\n\nexport const visibleYears = (\n  cfg: ResolvedConfig,\n): { visible: number[]; all: number[]; hasMore: boolean } => {\n  const all = cfg.years.slice().reverse();\n  return {\n    visible: all.slice(0, MAX_VISIBLE_YEARS),\n    all,\n    hasMore: all.length > MAX_VISIBLE_YEARS,\n  };\n};\n\nexport const computeProviderTotals = (ctx: ComponentCtx): Record<string, number> => {\n  const { cfg, state } = ctx;\n  const totals = Object.fromEntries(cfg.providers.map((p) => [p.key, 0]));\n  if (cfg.state !== \"ready\" || state.year == null) return totals;\n  const raw = getCurrentDays(ctx);\n  raw.forEach((d) => {\n    cfg.providers.forEach((p) => {\n      totals[p.key] = (totals[p.key] ?? 0) + sourceCount(d, p.key);\n    });\n  });\n  return totals;\n};\n\nexport const computeRenderFlags = (ctx: ComponentCtx): RenderFlags => {\n  const { cfg, state } = ctx;\n  const days = getCurrentDays(ctx);\n  const heatmapDays = getHeatmapDays(ctx, days);\n  const statsDays = getStatsDays(ctx, days);\n  const stats = computeStats(statsDays);\n  const yearTotal = statsDays.reduce((a, d) => a + d.total, 0);\n  const leveled = levelize(heatmapDays);\n  const isLoading = cfg.state === \"loading\";\n  const isEmpty = cfg.state === \"empty\" || (cfg.state === \"ready\" && yearTotal === 0);\n  const hasTotalOnlyDays = days.some((day) => day.sources == null && day.total > 0);\n  const allOff =\n    !hasTotalOnlyDays &&\n    cfg.providers.length > 0 &&\n    cfg.providers.every((p) => !state.providers[p.key]);\n  const canEnableAll =\n    cfg.state === \"ready\" &&\n    yearTotal === 0 &&\n    cfg.providers.some(\n      (provider) =>\n        !state.providers[provider.key] && days.some((day) => sourceCount(day, provider.key) > 0),\n    );\n  const providersWithDataCount =\n    cfg.state === \"ready\"\n      ? cfg.providers.filter((p) => days.some((d) => sourceCount(d, p.key) > 0)).length\n      : 0;\n  return {\n    isLoading,\n    isEmpty,\n    allOff,\n    canEnableAll,\n    days,\n    providersWithDataCount,\n    leveled,\n    stats,\n  };\n};\n","import type { ComponentCtx } from \"./config\";\nimport { h, trustedHtml } from \"./dom\";\nimport { providerIconHtml } from \"./providers\";\nimport { computeProviderTotals } from \"./selectors\";\nimport type { Tooltip } from \"./tooltip\";\n\nexport const renderProviderRow = (\n  ctx: ComponentCtx,\n  tooltip: Tooltip,\n  onToggle: (key: string) => void,\n  isLoading = false,\n): HTMLElement => {\n  const row = h(\"div\", { class: \"sk-providers\" });\n  const totals = computeProviderTotals(ctx);\n  ctx.cfg.providers.forEach((p) => {\n    const active = !!ctx.state.providers[p.key];\n    const total = (totals[p.key] ?? 0).toLocaleString();\n    const activeState = active ? \"enabled\" : \"disabled\";\n    const ariaLabel = isLoading\n      ? `${p.name}: loading contributions, ${activeState}`\n      : `${p.name}: ${total} contributions, ${activeState}`;\n    const iconHtml = providerIconHtml(p);\n    const btn = h(\n      \"button\",\n      {\n        class: \"sk-provider\" + (active ? \" active\" : \"\"),\n        \"aria-label\": ariaLabel,\n        \"aria-pressed\": String(active),\n        onclick: () => onToggle(p.key),\n      },\n      [\n        h(\"span\", {\n          class: \"sk-provider-icon\",\n          html: iconHtml ? trustedHtml(iconHtml) : undefined,\n          style: iconHtml ? undefined : { background: p.color, borderRadius: \"50%\" },\n        }),\n        h(\n          \"span\",\n          { class: \"sk-provider-count\" },\n          isLoading\n            ? h(\"span\", {\n                class: \"sk-skeleton sk-provider-count-skeleton\",\n                \"aria-hidden\": true,\n              })\n            : total,\n        ),\n      ],\n    );\n    btn.addEventListener(\"mouseenter\", (e) => tooltip.showProviderLabel(e, p));\n    btn.addEventListener(\"mousemove\", tooltip.move);\n    btn.addEventListener(\"mouseleave\", tooltip.hide);\n    row.appendChild(btn);\n  });\n  return row;\n};\n","import type { ComponentCtx } from \"./config\";\nimport { h } from \"./dom\";\nimport { logoR } from \"./logo\";\nimport { isCurrentYear, visibleYears, type RenderFlags } from \"./selectors\";\nimport { renderProviderRow } from \"./provider-row\";\nimport type { Tooltip } from \"./tooltip\";\n\nexport interface HeaderActions {\n  setYear: (year: number) => void;\n  openYearModal: () => void;\n  toggleProvider: (key: string) => void;\n}\n\nconst renderTitleRow = (ctx: ComponentCtx): HTMLElement => {\n  const subtitleText = isCurrentYear(ctx) ? \"Year to date\" : String(ctx.state.year ?? \"\");\n  return h(\"div\", { class: \"sk-title-row\" }, [\n    h(\"div\", { class: \"sk-brand\" }, [\n      h(\"div\", { class: \"sk-logo\" }, [logoR()]),\n      h(\"div\", { class: \"sk-title\", text: \"streakr\" }),\n      h(\"div\", { class: \"sk-subtitle\", text: subtitleText }),\n    ]),\n  ]);\n};\n\nconst buildYearTab = (\n  ctx: ComponentCtx,\n  actions: HeaderActions,\n  year: number,\n  isLoading: boolean,\n): HTMLElement =>\n  h(\"button\", {\n    class: \"sk-year-tab\" + (ctx.state.year === year ? \" active\" : \"\"),\n    onclick: () => actions.setYear(year),\n    disabled: isLoading || undefined,\n    text: String(year),\n  });\n\nconst renderYearsList = (\n  ctx: ComponentCtx,\n  actions: HeaderActions,\n  isLoading: boolean,\n): HTMLElement => {\n  const { visible, hasMore } = visibleYears(ctx.cfg);\n  const yearIsHidden = ctx.state.year != null && !visible.includes(ctx.state.year);\n  const list = h(\"div\", { class: \"sk-years-list\" });\n  visible.forEach((y) => list.appendChild(buildYearTab(ctx, actions, y, isLoading)));\n  if (yearIsHidden && ctx.state.year != null) {\n    list.appendChild(\n      h(\"button\", {\n        class: \"sk-year-tab active\",\n        onclick: () => actions.openYearModal(),\n        text: String(ctx.state.year),\n      }),\n    );\n  }\n  if (hasMore) {\n    list.appendChild(\n      h(\n        \"button\",\n        {\n          class: \"sk-year-more\",\n          \"aria-label\": \"More years\",\n          onclick: () => actions.openYearModal(),\n        },\n        [h(\"span\"), h(\"span\"), h(\"span\")],\n      ),\n    );\n  }\n  return list;\n};\n\nconst shouldRenderProviderRow = (ctx: ComponentCtx, flags: RenderFlags): boolean =>\n  ctx.cfg.showProviders &&\n  ctx.cfg.providers.length > 0 &&\n  (flags.isLoading\n    ? ctx.cfg.providers.length > 1\n    : !flags.isEmpty && flags.providersWithDataCount > 1);\n\nconst renderYearsBar = (\n  ctx: ComponentCtx,\n  flags: RenderFlags,\n  actions: HeaderActions,\n  tooltip: Tooltip,\n): HTMLElement => {\n  const yearsBar = h(\"div\", { class: \"sk-years\" });\n  yearsBar.dataset.noProviders = String(!ctx.cfg.showProviders);\n  yearsBar.appendChild(renderYearsList(ctx, actions, flags.isLoading));\n  if (shouldRenderProviderRow(ctx, flags)) {\n    yearsBar.appendChild(renderProviderRow(ctx, tooltip, actions.toggleProvider, flags.isLoading));\n  }\n  return yearsBar;\n};\n\nexport const renderHeader = (\n  ctx: ComponentCtx,\n  flags: RenderFlags,\n  actions: HeaderActions,\n  tooltip: Tooltip,\n): HTMLElement => {\n  const header = h(\"div\", { class: \"sk-header\" });\n  header.appendChild(renderTitleRow(ctx));\n  header.appendChild(renderYearsBar(ctx, flags, actions, tooltip));\n  return header;\n};\n","import type { StreakrDay, StreakrLeveledDay } from \"../../types\";\nimport { DAY_LABELS, gridFromDays, monthHeaders, padDaysToYear } from \"../calendar\";\nimport type { ComponentCtx } from \"../config\";\nimport { h, svg } from \"../dom\";\n\nconst MOBILE_BREAKPOINT = 520;\nconst HEATMAP_SKELETON_SWEEP_MS = 2860;\n\nexport const isMobileHeatmap = (wrap: HTMLElement): boolean =>\n  wrap.getBoundingClientRect().width < MOBILE_BREAKPOINT;\n\nconst HEATMAP_DAY_LABEL_ROWS = [1, 3, 5];\n\nexport type BindCellEvents = (rect: SVGElement, day: StreakrDay) => void;\n\ninterface HeatmapGeometry {\n  labelsW: number;\n  trailingW: number;\n  sq: number;\n  colStep: number;\n  height: number;\n  width: number;\n  fontSize: number;\n}\n\ntype HeatmapCellBuilder = (\n  day: StreakrLeveledDay | null,\n  ri: number,\n  sq: number,\n  colStep: number,\n  ci: number,\n) => SVGElement;\n\nconst buildHeatmapCell =\n  (bindCellEvents: BindCellEvents, totalCols: number, revealUntil?: Date): HeatmapCellBuilder =>\n  (day, ri, sq, colStep, ci) => {\n    const reveal =\n      revealUntil !== undefined && day !== null && day.date.getTime() <= revealUntil.getTime();\n    let cellClass: string | null = null;\n    let cellFill = \"transparent\";\n    if (reveal) {\n      cellClass = \"sk-heatmap-cell sk-heatmap-cell--reveal\";\n      cellFill = \"var(--sk-heat-0)\";\n    } else if (day) {\n      cellClass = \"sk-heatmap-cell\";\n      cellFill = `var(--sk-heat-${day.level})`;\n    }\n    const rect = svg(\"rect\", {\n      class: cellClass,\n      y: ri * colStep,\n      width: sq,\n      height: sq,\n      rx: Math.max(2, sq * 0.22),\n      fill: cellFill,\n      style: {\n        cursor: day ? \"pointer\" : \"default\",\n        ...(reveal\n          ? {\n              \"--sk-cell-peak\": `var(--sk-heat-${wavePeakLevel(ci, ri)})`,\n              \"--sk-cell-final\": `var(--sk-heat-${day.level})`,\n              animationDelay: `${((ci * HEATMAP_SKELETON_SWEEP_MS) / totalCols).toFixed(2)}ms`,\n            }\n          : {}),\n      },\n    });\n    if (day) {\n      bindCellEvents(rect, day);\n    }\n    return rect;\n  };\n\nconst buildHeatmapColumn = (\n  col: (StreakrLeveledDay | null)[],\n  ci: number,\n  sq: number,\n  colStep: number,\n  buildCell: HeatmapCellBuilder,\n): SVGElement => {\n  const colG = svg(\"g\", { transform: `translate(${ci * colStep}, 0)` });\n  col.forEach((day, ri) => {\n    colG.appendChild(buildCell(day, ri, sq, colStep, ci));\n  });\n  return colG;\n};\n\nconst getHeatmapGeometry = (\n  colsLength: number,\n  containerW: number,\n  wrap?: HTMLElement,\n): HeatmapGeometry => {\n  const labelsW = 28;\n  const trailingW = 8;\n  const gridW = Math.max(\n    0,\n    (containerW || wrap?.getBoundingClientRect().width || 820) - labelsW - trailingW,\n  );\n  const targetGap = 3;\n  const rawSq = gridW / Math.max(1, colsLength) - targetGap;\n  const sq = Math.max(9, Math.min(11, rawSq));\n  const gap = Math.max(2, Math.min(3, Math.round(sq * 0.25)));\n  const colStep = sq + gap;\n\n  return {\n    labelsW,\n    trailingW,\n    sq,\n    colStep,\n    height: 7 * colStep + 24,\n    width: labelsW + colsLength * colStep + trailingW,\n    fontSize: Math.max(9, Math.min(11, sq * 0.82)),\n  };\n};\n\nconst appendHeatmapLabels = (\n  svgEl: SVGElement,\n  headers: { col: number; label: string }[],\n  geometry: HeatmapGeometry,\n): void => {\n  const { labelsW, sq, colStep, fontSize } = geometry;\n\n  headers.forEach((hd) => {\n    svgEl.appendChild(\n      svg(\n        \"text\",\n        {\n          x: labelsW + hd.col * colStep,\n          y: 10,\n          fill: \"var(--sk-text-muted)\",\n          \"font-size\": fontSize,\n          \"font-family\": \"'Geist', sans-serif\",\n        },\n        hd.label,\n      ),\n    );\n  });\n\n  HEATMAP_DAY_LABEL_ROWS.forEach((d, i) => {\n    svgEl.appendChild(\n      svg(\n        \"text\",\n        {\n          x: 0,\n          y: 24 + d * colStep + sq - 2,\n          fill: \"var(--sk-text-subtle)\",\n          \"font-size\": Math.max(8.5, fontSize - 1),\n          \"font-family\": \"'Geist', sans-serif\",\n        },\n        DAY_LABELS[i],\n      ),\n    );\n  });\n};\n\nconst createHeatmapSvg = (\n  cols: (StreakrLeveledDay | null)[][],\n  {\n    className,\n    ariaLabel,\n    containerW,\n    wrap,\n    buildCell,\n  }: {\n    className: string;\n    ariaLabel: string;\n    containerW: number;\n    wrap?: HTMLElement;\n    buildCell: HeatmapCellBuilder;\n  },\n): SVGElement => {\n  const geometry = getHeatmapGeometry(cols.length, containerW, wrap);\n  const { labelsW, sq, colStep, height, width } = geometry;\n  const svgEl = svg(\"svg\", {\n    class: className,\n    width,\n    height,\n    viewBox: `0 0 ${width} ${height}`,\n    role: \"img\",\n    \"aria-label\": ariaLabel,\n  });\n\n  appendHeatmapLabels(svgEl, monthHeaders(cols), geometry);\n\n  const g = svg(\"g\", { transform: `translate(${labelsW}, 18)` });\n  cols.forEach((col, ci) => {\n    g.appendChild(buildHeatmapColumn(col, ci, sq, colStep, buildCell));\n  });\n  svgEl.appendChild(g);\n\n  return svgEl;\n};\n\nexport const renderHeatmap = (\n  wrap: HTMLElement,\n  days: StreakrLeveledDay[],\n  containerW: number,\n  ariaLabel: string,\n  bindCellEvents: BindCellEvents,\n  revealUntil?: Date,\n): void => {\n  const cols = gridFromDays(days);\n  const svgEl = createHeatmapSvg(cols, {\n    className: \"sk-heatmap-svg\",\n    ariaLabel,\n    containerW,\n    wrap,\n    buildCell: buildHeatmapCell(bindCellEvents, cols.length, revealUntil),\n  });\n\n  wrap.replaceChildren(h(\"div\", { class: \"sk-heatmap-svg-wrap\" }, [svgEl]));\n};\n\nconst WAVE_PEAK_LEVELS = [0, 1, 1, 2, 2, 2, 3, 3, 4, 4] as const;\n\nconst wavePeakLevel = (ci: number, ri: number): number => {\n  const hash = Math.imul(ci * 7 + ri + 1, 2654435761) >>> 0;\n  return WAVE_PEAK_LEVELS[hash % WAVE_PEAK_LEVELS.length] ?? 0;\n};\n\nconst buildSkeletonHeatmapCell =\n  (totalCols: number): HeatmapCellBuilder =>\n  (day, ri, sq, colStep, ci) =>\n    svg(\"rect\", {\n      class: day ? \"sk-heatmap-skeleton-cell\" : null,\n      y: ri * colStep,\n      width: sq,\n      height: sq,\n      rx: Math.max(2, sq * 0.22),\n      fill: day ? \"var(--sk-heat-0)\" : \"transparent\",\n      style: day\n        ? {\n            \"--sk-cell-peak\": `var(--sk-heat-${wavePeakLevel(ci, ri)})`,\n            animationDelay: `${((ci * HEATMAP_SKELETON_SWEEP_MS) / totalCols).toFixed(2)}ms`,\n          }\n        : {},\n    });\n\nexport const renderSkeletonHeatmap = (ctx: ComponentCtx, containerW: number): SVGElement => {\n  const skeletonYear = ctx.state.year ?? ctx.cfg.today.getFullYear();\n  const skeletonDays = padDaysToYear([], skeletonYear).map((day): StreakrLeveledDay => ({\n    ...day,\n    level: 0,\n  }));\n  const cols = gridFromDays(skeletonDays);\n  return createHeatmapSvg(cols, {\n    className: \"sk-heatmap-svg sk-heatmap-svg--skeleton\",\n    ariaLabel: \"Loading contribution heatmap\",\n    containerW,\n    buildCell: buildSkeletonHeatmapCell(cols.length),\n  });\n};\n","import { padDaysToYear } from \"../calendar\";\nimport { h } from \"../dom\";\n\nexport const statCard = (label: string, value: string | number, suffix?: string): HTMLElement =>\n  h(\"div\", { class: \"sk-stat\" }, [\n    h(\"div\", { class: \"sk-stat-label\", text: label }),\n    h(\"div\", { class: \"sk-stat-value\" }, [\n      document.createTextNode(String(value)),\n      suffix ? h(\"span\", { class: \"sk-stat-suffix\", text: suffix }) : null,\n    ]),\n  ]);\n\nexport const loadingStatCard = (label: string, suffix?: string, digits: 2 | 3 = 2): HTMLElement =>\n  h(\"div\", { class: \"sk-stat\" }, [\n    h(\"div\", { class: \"sk-stat-label\", text: label }),\n    h(\"div\", { class: \"sk-stat-value sk-stat-value--loading\" }, [\n      h(\"span\", {\n        class: `sk-skeleton sk-stat-value-skeleton sk-stat-value-skeleton--${digits}`,\n        \"aria-hidden\": true,\n      }),\n      suffix ? h(\"span\", { class: \"sk-stat-suffix\", text: suffix }) : null,\n    ]),\n  ]);\n\nexport const formatActiveRate = (activeDays: number, year: number | null): string => {\n  if (year == null) return \"0\";\n  const totalDays = padDaysToYear([], year).length;\n  return ((activeDays / totalDays) * 100).toFixed(1);\n};\n","import type { StreakrLeveledDay } from \"../../types\";\nimport type { ComponentCtx } from \"../config\";\nimport { h, trustedHtml } from \"../dom\";\nimport type { StreakrStats } from \"../metrics\";\nimport { isCurrentYear } from \"../selectors\";\nimport type { Tooltip } from \"../tooltip\";\nimport { isMobileHeatmap, renderHeatmap, renderSkeletonHeatmap } from \"./heatmap\";\nimport type { RingRenderer } from \"./ring\";\nimport { formatActiveRate, loadingStatCard, statCard } from \"./stats\";\n\nexport type ReadyBody = HTMLElement & {\n  __skDraw?: () => void;\n  __skObserveTarget?: HTMLElement;\n};\n\nexport interface BodyRenderer {\n  renderLoadingBody: () => HTMLElement;\n  renderReadyBody: (\n    leveled: StreakrLeveledDay[],\n    stats: StreakrStats,\n    isRevealing: boolean,\n  ) => HTMLElement;\n  renderEmpty: (canEnableAll?: boolean) => HTMLElement;\n  renderNoProviders: () => HTMLElement;\n}\n\nexport interface BodyRendererDeps {\n  tooltip: Tooltip;\n  ring: RingRenderer;\n  onEnableAll: () => void;\n  setCurrentDraw: (draw: () => void) => void;\n}\n\nexport const createBodyRenderer = (ctx: ComponentCtx, deps: BodyRendererDeps): BodyRenderer => {\n  const { tooltip, ring, onEnableAll, setCurrentDraw } = deps;\n\n  const createReadyBodyShell = (): {\n    body: ReadyBody;\n    heatmapWrap: HTMLElement;\n    heatmapInner: HTMLElement;\n  } => {\n    const body = h(\"div\", { class: \"sk-body\" }) as ReadyBody;\n    body.dataset.noStats = String(!ctx.cfg.showStats);\n\n    const heatmapWrap = h(\"div\", { class: \"sk-heatmap-wrap\" });\n    const heatmapInner = h(\"div\", { class: \"sk-heatmap-stage\" });\n    heatmapWrap.appendChild(heatmapInner);\n    heatmapWrap.appendChild(\n      h(\"div\", { class: \"sk-legend\" }, [\n        h(\"span\", { text: \"Less\" }),\n        ...[0, 1, 2, 3, 4].map((i) =>\n          h(\"span\", { class: \"sk-legend-sq\", style: { background: `var(--sk-heat-${i})` } }),\n        ),\n        h(\"span\", { text: \"More\" }),\n      ]),\n    );\n    body.appendChild(heatmapWrap);\n\n    return { body, heatmapWrap, heatmapInner };\n  };\n\n  const renderLoadingBody = (): HTMLElement => {\n    const { body, heatmapWrap, heatmapInner } = createReadyBodyShell();\n\n    const draw = () => {\n      const isMobile = isMobileHeatmap(heatmapWrap);\n      if (isMobile) {\n        const svgEl = ring.renderSkeletonRing();\n        heatmapInner.replaceChildren(\n          h(\"div\", { class: \"sk-ring\" }, [\n            h(\"div\", { class: \"sk-ring-svg-wrap\" }, [svgEl, ring.renderSkeletonRingCenter()]),\n          ]),\n        );\n      } else {\n        const w = heatmapWrap.clientWidth - 32;\n        const svgEl = renderSkeletonHeatmap(ctx, Math.max(200, w));\n        heatmapInner.replaceChildren(h(\"div\", { class: \"sk-heatmap-svg-wrap\" }, [svgEl]));\n      }\n    };\n    body.__skDraw = draw;\n    setCurrentDraw(draw);\n    body.__skObserveTarget = heatmapWrap;\n\n    if (ctx.cfg.showStats) {\n      const contextualStat = isCurrentYear(ctx)\n        ? loadingStatCard(\"Current Streak\", \" days\", 2)\n        : loadingStatCard(\"Active Rate\", \"%\", 2);\n      body.appendChild(\n        h(\"div\", { class: \"sk-stats\" }, [\n          loadingStatCard(\"Total Contributions\", undefined, 3),\n          loadingStatCard(\"Best Streak\", \" days\", 2),\n          contextualStat,\n          loadingStatCard(\"Active Days\", undefined, 2),\n        ]),\n      );\n    }\n\n    return body;\n  };\n\n  const renderEnableAllButton = (): HTMLElement =>\n    h(\"button\", {\n      class: \"sk-year-tab\",\n      onclick: () => onEnableAll(),\n      text: \"Enable all\",\n    });\n\n  const renderEmpty = (canEnableAll = false): HTMLElement =>\n    h(\"div\", { class: \"sk-empty\" }, [\n      h(\"div\", {\n        class: \"sk-empty-icon\",\n        html: trustedHtml(\n          '<svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">' +\n            '<rect x=\"3\" y=\"5\" width=\"16\" height=\"14\" rx=\"2\"/><path d=\"M3 9 H19\"/>' +\n            '<path d=\"M8 3 V7 M14 3 V7\" stroke-linecap=\"round\"/></svg>',\n        ),\n      }),\n      h(\"div\", {\n        class: \"sk-empty-title\",\n        text:\n          \"No contributions in \" +\n          (isCurrentYear(ctx) ? \"the year to date\" : String(ctx.state.year ?? \"\")),\n      }),\n      h(\"div\", {\n        class: \"sk-empty-sub\",\n        text: \"When you commit, push, or open PRs across your connected accounts, they'll show up here.\",\n      }),\n      canEnableAll ? renderEnableAllButton() : null,\n    ]);\n\n  const renderNoProviders = (): HTMLElement =>\n    h(\"div\", { class: \"sk-noprov\" }, [\n      h(\"span\", { class: \"sk-noprov-dot\" }),\n      h(\"div\", {\n        style: { flex: \"1\" },\n        text: \"All providers are disabled — toggle one above to see contributions.\",\n      }),\n      renderEnableAllButton(),\n    ]);\n\n  const renderReadyBody = (\n    leveled: StreakrLeveledDay[],\n    stats: StreakrStats,\n    isRevealing: boolean,\n  ): HTMLElement => {\n    const { body, heatmapWrap, heatmapInner } = createReadyBodyShell();\n\n    let pendingReveal = isRevealing;\n    const draw = () => {\n      try {\n        const isMobile = isMobileHeatmap(heatmapWrap);\n        if (isMobile) {\n          ring.renderRing(heatmapInner, leveled);\n        } else {\n          const w = heatmapWrap.clientWidth - 32;\n          const ariaLabel = isCurrentYear(ctx)\n            ? `Contribution heatmap for ${ctx.state.year ?? \"selected year\"} year to date`\n            : `Contribution heatmap for ${ctx.state.year ?? \"selected year\"}`;\n          renderHeatmap(\n            heatmapInner,\n            leveled,\n            Math.max(200, w),\n            ariaLabel,\n            tooltip.bindCellEvents,\n            pendingReveal ? ctx.cfg.today : undefined,\n          );\n        }\n        pendingReveal = false;\n      } catch (err) {\n        console.error(\"[streakr] draw failed:\", err);\n      }\n    };\n    body.__skDraw = draw;\n    setCurrentDraw(draw);\n    body.__skObserveTarget = heatmapWrap;\n\n    if (ctx.cfg.showStats) {\n      const contextualStat = isCurrentYear(ctx)\n        ? statCard(\"Current Streak\", stats.current, \" days\")\n        : statCard(\"Active Rate\", formatActiveRate(stats.active, ctx.state.year), \"%\");\n      body.appendChild(\n        h(\"div\", { class: \"sk-stats\" }, [\n          statCard(\"Total Contributions\", stats.total.toLocaleString()),\n          statCard(\"Best Streak\", stats.best, \" days\"),\n          contextualStat,\n          statCard(\"Active Days\", stats.active.toLocaleString()),\n        ]),\n      );\n    }\n    return body;\n  };\n\n  return { renderLoadingBody, renderReadyBody, renderEmpty, renderNoProviders };\n};\n","import type { StreakrLeveledDay } from \"../types\";\nimport { dayToHandRotation, localDateKey } from \"./calendar\";\nimport type { ComponentCtx } from \"./config\";\nimport {\n  findDayByDate,\n  RING_CX,\n  RING_CY,\n  RING_INNER_R,\n  RING_OUTER_R,\n  updateRingCenter,\n} from \"./render/ring\";\n\nconst RING_CLICK_DRAG_TOLERANCE = 6;\nconst RING_SUPPRESS_CLICK_MS = 350;\nconst FULL_TURN = Math.PI * 2;\n\ntype RingPoint = {\n  x: number;\n  y: number;\n};\n\nexport const bindRingEvents = (\n  ctx: ComponentCtx,\n  svgEl: SVGElement,\n  handGroup: SVGGElement,\n  centerEl: HTMLElement,\n  days: StreakrLeveledDay[],\n): void => {\n  let activePointerId: number | null = null;\n  let pointerDownPoint: RingPoint | null = null;\n  let activePointerMoved = false;\n  let suppressNextClick = false;\n  let suppressResetTimer: ReturnType<typeof setTimeout> | null = null;\n\n  const setHandRotation = (rotation: number): void => {\n    handGroup.setAttribute(\n      \"transform\",\n      `rotate(${(rotation * 180) / Math.PI}, ${RING_CX}, ${RING_CY})`,\n    );\n  };\n\n  const selectDay = (day: StreakrLeveledDay, syncHand = true): void => {\n    ctx.state.selectedDay = day.date;\n    updateRingCenter(centerEl, day);\n    if (syncHand) {\n      setHandRotation(dayToHandRotation(day.date, days.length));\n    }\n  };\n\n  const lineToDay = (target: EventTarget | null): StreakrLeveledDay | null => {\n    if (!(target instanceof SVGElement) || !target.classList.contains(\"sk-ring-line\")) {\n      return null;\n    }\n    if (target.classList.contains(\"sk-ring-line--future\")) {\n      return null;\n    }\n    const dateAttr = target.dataset.date;\n    if (!dateAttr) return null;\n    return findDayByDate(days, new Date(dateAttr));\n  };\n\n  setHandRotation(dayToHandRotation(ctx.state.selectedDay, days.length));\n\n  const clearSuppressResetTimer = (): void => {\n    if (suppressResetTimer) {\n      clearTimeout(suppressResetTimer);\n      suppressResetTimer = null;\n    }\n  };\n\n  const resetSuppressedClickAfterDrag = (): void => {\n    clearSuppressResetTimer();\n    suppressResetTimer = setTimeout(() => {\n      suppressNextClick = false;\n      suppressResetTimer = null;\n    }, RING_SUPPRESS_CLICK_MS);\n  };\n\n  const hasMovedBeyondClickTolerance = (e: PointerEvent): boolean => {\n    if (!pointerDownPoint) return false;\n    return (\n      Math.hypot(e.clientX - pointerDownPoint.x, e.clientY - pointerDownPoint.y) >\n      RING_CLICK_DRAG_TOLERANCE\n    );\n  };\n\n  const clientToRingPoint = (e: PointerEvent): RingPoint | null => {\n    const rect = svgEl.getBoundingClientRect();\n    if (rect.width <= 0 || rect.height <= 0) return null;\n    return {\n      x: ((e.clientX - rect.left) / rect.width) * RING_CX * 2,\n      y: ((e.clientY - rect.top) / rect.height) * RING_CY * 2,\n    };\n  };\n\n  const isPointInRing = (point: RingPoint): boolean => {\n    const radius = Math.hypot(point.x - RING_CX, point.y - RING_CY);\n    return radius >= RING_INNER_R && radius <= RING_OUTER_R;\n  };\n\n  const dayAtPoint = (point: RingPoint): StreakrLeveledDay | null => {\n    if (!isPointInRing(point) || days.length === 0) return null;\n    const angle = Math.atan2(point.y - RING_CY, point.x - RING_CX);\n    const turnFromTop = (((angle + Math.PI / 2) % FULL_TURN) + FULL_TURN) % FULL_TURN;\n    const dayIndex = Math.round(turnFromTop / (FULL_TURN / days.length)) % days.length;\n    const line = svgEl.querySelectorAll<SVGLineElement>(\".sk-ring-line\")[dayIndex];\n    if (!line || line.classList.contains(\"sk-ring-line--future\")) return null;\n    return days[dayIndex] ?? null;\n  };\n\n  const releaseActivePointer = (pointerId: number): void => {\n    if (!svgEl.hasPointerCapture(pointerId)) return;\n    svgEl.releasePointerCapture(pointerId);\n  };\n\n  const finishGesture = (e: PointerEvent): void => {\n    if (e.pointerId !== activePointerId) return;\n    activePointerMoved ||= hasMovedBeyondClickTolerance(e);\n    if (activePointerMoved) {\n      suppressNextClick = true;\n      resetSuppressedClickAfterDrag();\n    }\n    releaseActivePointer(e.pointerId);\n    activePointerId = null;\n    pointerDownPoint = null;\n    activePointerMoved = false;\n  };\n\n  const handlePointerDown = (e: PointerEvent): void => {\n    if (activePointerId !== null || e.button !== 0) return;\n    const point = clientToRingPoint(e);\n    const selected = point ? dayAtPoint(point) : null;\n    if (!point || !selected) return;\n    clearSuppressResetTimer();\n    suppressNextClick = false;\n    activePointerId = e.pointerId;\n    pointerDownPoint = { x: e.clientX, y: e.clientY };\n    activePointerMoved = false;\n    svgEl.setPointerCapture(e.pointerId);\n    selectDay(selected);\n  };\n\n  const handlePointerMove = (e: PointerEvent): void => {\n    if (e.pointerId !== activePointerId) return;\n    activePointerMoved ||= hasMovedBeyondClickTolerance(e);\n    const point = clientToRingPoint(e);\n    if (!point || !isPointInRing(point)) {\n      finishGesture(e);\n      return;\n    }\n    const selected = dayAtPoint(point);\n    if (selected) {\n      activePointerMoved ||= localDateKey(selected.date) !== localDateKey(ctx.state.selectedDay);\n      selectDay(selected);\n    }\n  };\n\n  const handlePointerUp = (e: PointerEvent): void => {\n    if (e.pointerId !== activePointerId) return;\n    const point = clientToRingPoint(e);\n    if (point && isPointInRing(point)) {\n      const selected = dayAtPoint(point);\n      if (selected) {\n        activePointerMoved ||= localDateKey(selected.date) !== localDateKey(ctx.state.selectedDay);\n        selectDay(selected);\n      }\n    }\n    finishGesture(e);\n  };\n\n  const selectLineTarget = (target: EventTarget | null): void => {\n    const selected = lineToDay(target);\n    if (selected) {\n      selectDay(selected);\n    }\n  };\n\n  const handleLineInteraction = (e: PointerEvent): void => {\n    if (suppressNextClick) {\n      suppressNextClick = false;\n      clearSuppressResetTimer();\n      return;\n    }\n    selectLineTarget(e.target);\n  };\n\n  const handleLineKeydown = (e: KeyboardEvent): void => {\n    const day = lineToDay(e.target);\n    if (e.key === \"Enter\" || e.key === \" \") {\n      if (!day) return;\n      e.preventDefault();\n      selectDay(day);\n      return;\n    }\n    if (!day) return;\n    const focusableLines = Array.from(\n      svgEl.querySelectorAll<SVGLineElement>(\".sk-ring-line:not(.sk-ring-line--future)\"),\n    );\n    const currentIndex = focusableLines.indexOf(e.target as SVGLineElement);\n    if (currentIndex === -1) return;\n    let targetIndex: number;\n    if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n      targetIndex = Math.min(currentIndex + 1, focusableLines.length - 1);\n    } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n      targetIndex = Math.max(currentIndex - 1, 0);\n    } else if (e.key === \"Home\") {\n      targetIndex = 0;\n    } else if (e.key === \"End\") {\n      targetIndex = focusableLines.length - 1;\n    } else {\n      return;\n    }\n    e.preventDefault();\n    if (targetIndex === currentIndex) return;\n    const currentLine = focusableLines[currentIndex];\n    const targetLine = focusableLines[targetIndex];\n    if (!currentLine || !targetLine) return;\n    currentLine.setAttribute(\"tabindex\", \"-1\");\n    targetLine.setAttribute(\"tabindex\", \"0\");\n    targetLine.focus();\n    const dateAttr = targetLine.dataset.date;\n    if (dateAttr) {\n      selectDay(findDayByDate(days, new Date(dateAttr)));\n    }\n  };\n\n  svgEl.addEventListener(\"pointerdown\", handlePointerDown);\n  svgEl.addEventListener(\"pointermove\", handlePointerMove);\n  svgEl.addEventListener(\"pointerup\", handlePointerUp);\n  svgEl.addEventListener(\"pointercancel\", finishGesture);\n  svgEl.addEventListener(\"pointerleave\", finishGesture);\n  svgEl.addEventListener(\"click\", handleLineInteraction);\n  svgEl.addEventListener(\"keydown\", handleLineKeydown);\n};\n","import type { StreakrDay, StreakrLeveledDay } from \"../../types\";\nimport {\n  dayAngle,\n  dayToHandRotation,\n  fmtDateLong,\n  fmtDateShort,\n  localDateKey,\n  MONTH_LABELS_SHORT,\n  padDaysToYear,\n  polarToCartesian,\n} from \"../calendar\";\nimport type { ComponentCtx } from \"../config\";\nimport { h, svg } from \"../dom\";\nimport { formatTotalLabel } from \"../metrics\";\nimport { isCurrentYear } from \"../selectors\";\nimport { bindRingEvents } from \"../ring-interaction\";\n\nconst RING_SIZE = 360;\nexport const RING_CX = RING_SIZE / 2;\nexport const RING_CY = RING_SIZE / 2;\nexport const RING_INNER_R = 78;\nexport const RING_OUTER_R = 150;\nconst RING_LINE_OUTER_R = RING_OUTER_R - 1;\nconst RING_MONTH_LABEL_R = 164;\nconst RING_HAND_START_R = 70;\nconst RING_HAND_END_R = 154;\nconst RING_DAY_STROKE_WIDTH = 2.85;\nconst RING_SKELETON_REVOLUTION_MS = 2000;\n\nconst describeCirclePath = (cx: number, cy: number, r: number): string =>\n  `M ${cx + r},${cy} A ${r},${r} 0 1,0 ${cx - r},${cy} A ${r},${r} 0 1,0 ${cx + r},${cy} Z`;\n\nconst describeAnnulusPath = (cx: number, cy: number, innerR: number, outerR: number): string =>\n  `${describeCirclePath(cx, cy, outerR)} ${describeCirclePath(cx, cy, innerR)}`;\n\nconst ringLineColor = (level: number): string => `var(--sk-heat-${level})`;\n\nconst ringDayAriaLabel = (day: StreakrLeveledDay): string =>\n  `${day.date.getDate()} ${MONTH_LABELS_SHORT[day.date.getMonth()]} ${day.date.getFullYear()}, ${formatTotalLabel(day.total)}`;\n\nconst dayStartMs = (day: Date): number =>\n  new Date(day.getFullYear(), day.getMonth(), day.getDate()).getTime();\n\nconst ringCenterLabel = (day: StreakrDay): string =>\n  `Selected ${fmtDateLong(day.date)}. Tap to reset to today.`;\n\nexport const updateRingCenter = (centerEl: HTMLElement, day: StreakrDay): void => {\n  centerEl.setAttribute(\"aria-label\", ringCenterLabel(day));\n  const countEl = centerEl.querySelector<HTMLElement>(\".sk-ring-count\");\n  const dateEl = centerEl.querySelector<HTMLElement>(\".sk-ring-date\");\n  if (countEl) countEl.textContent = String(day.total);\n  if (dateEl) dateEl.textContent = fmtDateShort(day.date);\n};\n\nexport const findDayByDate = (days: StreakrLeveledDay[], date: Date): StreakrLeveledDay => {\n  const found = days.find((d) => localDateKey(d.date) === localDateKey(date));\n  return found ?? days[0] ?? { date, total: 0, level: 0, sources: {} };\n};\n\ntype RingDayLineAttrs = {\n  class?: string | undefined;\n  stroke: string;\n  \"stroke-linecap\"?: \"round\";\n  \"data-date\"?: string | undefined;\n  \"data-future\"?: string | undefined;\n  tabindex?: string | undefined;\n  role?: string | undefined;\n  \"aria-label\"?: string | undefined;\n  style?: Partial<CSSStyleDeclaration> | undefined;\n};\n\nexport interface RingRenderer {\n  renderRing: (wrap: HTMLElement, days: StreakrLeveledDay[]) => void;\n  renderSkeletonRing: () => SVGElement;\n  renderSkeletonRingCenter: () => HTMLElement;\n}\n\nexport const createRingRenderer = (ctx: ComponentCtx, onResetDay: () => void): RingRenderer => {\n  let ringClipIdSeq = 0;\n\n  const isFutureRingDay = (day: Date): boolean =>\n    isCurrentYear(ctx) && dayStartMs(day) > dayStartMs(ctx.cfg.today);\n\n  const createRingSvgBase = <T extends StreakrDay>(\n    days: T[],\n    svgClass: string,\n    ariaLabel: string,\n    dayLineAttrs: (day: T, i: number) => RingDayLineAttrs,\n  ): SVGElement => {\n    const totalDays = days.length;\n    const svgEl = svg(\"svg\", {\n      class: svgClass,\n      width: RING_SIZE,\n      height: RING_SIZE,\n      viewBox: `0 0 ${RING_SIZE} ${RING_SIZE}`,\n      role: \"img\",\n      \"aria-label\": ariaLabel,\n    });\n\n    const ringClipId = `sk-ring-clip-${++ringClipIdSeq}`;\n    const ringClip = svg(\"defs\", {}, [\n      svg(\"clipPath\", { id: ringClipId, clipPathUnits: \"userSpaceOnUse\" }, [\n        svg(\"path\", {\n          d: describeAnnulusPath(RING_CX, RING_CY, RING_INNER_R, RING_OUTER_R),\n          \"clip-rule\": \"evenodd\",\n        }),\n      ]),\n    ]);\n\n    const ringGroup = svg(\"g\", { class: \"sk-ring-days\", \"clip-path\": `url(#${ringClipId})` });\n    days.forEach((day, i) => {\n      const angle = dayAngle(i, totalDays);\n      const start = polarToCartesian(RING_CX, RING_CY, RING_INNER_R, angle);\n      const end = polarToCartesian(RING_CX, RING_CY, RING_LINE_OUTER_R, angle);\n      ringGroup.appendChild(\n        svg(\"line\", {\n          x1: start.x,\n          y1: start.y,\n          x2: end.x,\n          y2: end.y,\n          \"stroke-width\": RING_DAY_STROKE_WIDTH,\n          ...dayLineAttrs(day, i),\n        }),\n      );\n    });\n\n    const ringYear = ctx.state.year ?? ctx.cfg.today.getFullYear();\n    const monthLabels = svg(\"g\", { class: \"sk-ring-months\" });\n    for (let month = 0; month < 12; month++) {\n      const firstDayOfMonth = new Date(ringYear, month, 1);\n      const startOfYear = new Date(ringYear, 0, 1);\n      const dayIndex = Math.round(\n        (firstDayOfMonth.getTime() - startOfYear.getTime()) / (1000 * 60 * 60 * 24),\n      );\n      const angle = dayAngle(dayIndex, totalDays);\n      const pos = polarToCartesian(RING_CX, RING_CY, RING_MONTH_LABEL_R, angle);\n      monthLabels.appendChild(\n        svg(\n          \"text\",\n          {\n            x: pos.x,\n            y: pos.y,\n            \"text-anchor\": \"middle\",\n            \"dominant-baseline\": \"middle\",\n            fill: \"var(--sk-text-subtle)\",\n            \"font-size\": 9,\n            \"font-family\": \"'Geist', sans-serif\",\n          },\n          MONTH_LABELS_SHORT[month],\n        ),\n      );\n    }\n\n    const innerRing = svg(\"circle\", {\n      class: \"sk-ring-inner\",\n      cx: RING_CX,\n      cy: RING_CY,\n      r: RING_INNER_R,\n      fill: \"none\",\n    });\n\n    const outerRing = svg(\"circle\", {\n      class: \"sk-ring-outer\",\n      cx: RING_CX,\n      cy: RING_CY,\n      r: RING_OUTER_R,\n      fill: \"none\",\n    });\n\n    svgEl.appendChild(ringClip);\n    svgEl.appendChild(ringGroup);\n    svgEl.appendChild(innerRing);\n    svgEl.appendChild(outerRing);\n    svgEl.appendChild(monthLabels);\n    return svgEl;\n  };\n\n  const createHandGroup = (skeleton = false): SVGGElement => {\n    const handStart = polarToCartesian(RING_CX, RING_CY, RING_HAND_START_R, -Math.PI / 2);\n    const handEnd = polarToCartesian(RING_CX, RING_CY, RING_HAND_END_R, -Math.PI / 2);\n    return svg(\"g\", { class: skeleton ? \"sk-ring-hand sk-ring-hand--skeleton\" : \"sk-ring-hand\" }, [\n      svg(\"line\", {\n        class: \"sk-ring-hand-line\",\n        x1: handStart.x,\n        y1: handStart.y,\n        x2: handEnd.x,\n        y2: handEnd.y,\n      }),\n    ]) as SVGGElement;\n  };\n\n  const renderRingSvg = (days: StreakrLeveledDay[], selectedDay: Date): SVGElement => {\n    const totalDays = days.length;\n    const svgEl = createRingSvgBase(\n      days,\n      \"sk-ring-svg\",\n      `Contribution ring for ${ctx.state.year ?? \"selected year\"}`,\n      (day) => {\n        const future = isFutureRingDay(day.date);\n        const isSelected = !future && localDateKey(day.date) === localDateKey(selectedDay);\n        const interactiveTabIndex = isSelected ? \"0\" : \"-1\";\n        return {\n          class: \"sk-ring-line\" + (future ? \" sk-ring-line--future\" : \"\"),\n          stroke: future ? \"transparent\" : ringLineColor(day.level),\n          \"data-date\": day.date.toISOString(),\n          \"data-future\": future ? \"true\" : undefined,\n          tabindex: future ? undefined : interactiveTabIndex,\n          role: future ? undefined : \"button\",\n          \"aria-label\": future ? undefined : ringDayAriaLabel(day),\n        };\n      },\n    );\n\n    const hand = createHandGroup();\n    hand.setAttribute(\n      \"transform\",\n      `rotate(${(dayToHandRotation(selectedDay, totalDays) * 180) / Math.PI}, ${RING_CX}, ${RING_CY})`,\n    );\n    svgEl.appendChild(hand);\n    return svgEl;\n  };\n\n  const renderRingCenter = (day: StreakrDay): HTMLElement =>\n    h(\n      \"button\",\n      {\n        class: \"sk-ring-center\",\n        \"aria-label\": ringCenterLabel(day),\n        onclick: () => onResetDay(),\n      },\n      [\n        h(\"div\", { class: \"sk-ring-count\", text: String(day.total) }),\n        h(\"div\", { class: \"sk-ring-date\", text: fmtDateShort(day.date) }),\n        h(\"div\", { class: \"sk-ring-reset\", text: \"RESET\" }),\n      ],\n    );\n\n  const renderRing = (wrap: HTMLElement, days: StreakrLeveledDay[]): void => {\n    const selected = findDayByDate(days, ctx.state.selectedDay);\n    ctx.state.selectedDay = selected.date;\n    const svgEl = renderRingSvg(days, selected.date);\n    const centerEl = renderRingCenter(selected);\n    const handGroup = svgEl.querySelector<SVGGElement>(\".sk-ring-hand\");\n    if (handGroup) {\n      bindRingEvents(ctx, svgEl, handGroup, centerEl, days);\n    }\n\n    const container = h(\"div\", { class: \"sk-ring\" }, [\n      h(\"div\", { class: \"sk-ring-svg-wrap\" }, [svgEl, centerEl]),\n    ]);\n    wrap.replaceChildren(container);\n  };\n\n  const renderSkeletonRing = (): SVGElement => {\n    const skeletonYear = ctx.state.year ?? ctx.cfg.today.getFullYear();\n    const skeletonDays = padDaysToYear([], skeletonYear);\n    const totalDays = skeletonDays.length;\n    const svgEl = createRingSvgBase(\n      skeletonDays,\n      \"sk-ring-svg sk-ring-svg--skeleton\",\n      \"Loading contribution ring\",\n      (_day, i) => ({\n        class: \"sk-ring-skeleton-line\",\n        stroke: \"transparent\",\n        \"stroke-linecap\": \"round\",\n        style: {\n          animationDelay: `${((i * RING_SKELETON_REVOLUTION_MS) / totalDays).toFixed(2)}ms`,\n        },\n      }),\n    );\n    svgEl.appendChild(createHandGroup(true));\n    return svgEl;\n  };\n\n  const skeletonCenterDate = (): Date => {\n    const year = ctx.state.year ?? ctx.cfg.today.getFullYear();\n    return ctx.state.selectedDay.getFullYear() === year\n      ? ctx.state.selectedDay\n      : new Date(year, 0, 1);\n  };\n\n  const renderSkeletonRingCenter = (): HTMLElement =>\n    h(\"div\", { class: \"sk-ring-center sk-ring-center--loading\" }, [\n      h(\"div\", { class: \"sk-ring-count\" }, [\n        h(\"span\", { class: \"sk-skeleton sk-ring-count-skeleton\", \"aria-hidden\": true }),\n      ]),\n      h(\"div\", { class: \"sk-ring-date\", text: fmtDateShort(skeletonCenterDate()) }),\n      h(\"div\", { class: \"sk-ring-reset\", text: \"RESET\" }),\n    ]);\n\n  return { renderRing, renderSkeletonRing, renderSkeletonRingCenter };\n};\n","import type { ResolvedConfig } from \"./config\";\n\nconst getWin = (): Window | undefined => globalThis.window;\n\nconst getMatchMedia = (): ((query: string) => MediaQueryList) | undefined => {\n  const win = getWin();\n  if (!win || typeof win.matchMedia !== \"function\") return undefined;\n  return win.matchMedia.bind(win);\n};\n\nexport interface ThemeController {\n  getActiveTheme: () => \"dark\" | \"light\";\n  setup: () => void;\n  cleanup: () => void;\n}\n\nexport const createThemeController = (cfg: ResolvedConfig, root: HTMLElement): ThemeController => {\n  let mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\n\n  const getActiveTheme = (): \"dark\" | \"light\" => {\n    if (cfg.theme !== \"system\") return cfg.theme;\n    const isDark = getMatchMedia()?.(\"(prefers-color-scheme: dark)\").matches;\n    return isDark ? \"dark\" : \"light\";\n  };\n\n  const cleanup = (): void => {\n    const matchMedia = getMatchMedia();\n    if (mediaQueryListener && matchMedia) {\n      matchMedia(\"(prefers-color-scheme: dark)\").removeEventListener(\"change\", mediaQueryListener);\n    }\n    mediaQueryListener = null;\n  };\n\n  const setup = (): void => {\n    const matchMedia = getMatchMedia();\n    if (!matchMedia) return;\n    cleanup();\n    if (cfg.theme === \"system\") {\n      const mediaQuery = matchMedia(\"(prefers-color-scheme: dark)\");\n      mediaQueryListener = (e: MediaQueryListEvent) => {\n        root.dataset.theme = e.matches ? \"dark\" : \"light\";\n      };\n      mediaQuery.addEventListener(\"change\", mediaQueryListener);\n    }\n  };\n\n  return { getActiveTheme, setup, cleanup };\n};\n\nexport const applyAccentVars = (el: HTMLElement, accent: string, tintHeatmap: boolean): void => {\n  const a = accent;\n  el.style.setProperty(\"--sk-accent\", a);\n  el.style.setProperty(\"--sk-accent-glow\", a + \"47\");\n  el.style.setProperty(\"--sk-accent-soft\", a + \"0d\");\n  el.style.setProperty(\"--sk-accent-mid\", a + \"8c\");\n  el.style.setProperty(\"--sk-accent-bg\", a + \"1a\");\n  if (tintHeatmap) {\n    el.style.setProperty(\"--sk-heat-1\", `color-mix(in oklab, ${a} 18%, var(--sk-heat-0))`);\n    el.style.setProperty(\"--sk-heat-2\", `color-mix(in oklab, ${a} 45%, var(--sk-heat-0))`);\n    el.style.setProperty(\"--sk-heat-3\", `color-mix(in oklab, ${a} 75%, var(--sk-heat-0))`);\n    el.style.setProperty(\"--sk-heat-4\", a);\n  } else {\n    [\"--sk-heat-1\", \"--sk-heat-2\", \"--sk-heat-3\", \"--sk-heat-4\"].forEach((v) =>\n      el.style.removeProperty(v),\n    );\n  }\n};\n","import type { StreakrDay, StreakrProvider } from \"../types\";\nimport { fmtDateLong } from \"./calendar\";\nimport type { ComponentCtx } from \"./config\";\nimport { sourceCount } from \"./config\";\nimport { h } from \"./dom\";\nimport { formatTotalLabel } from \"./metrics\";\n\nexport interface Tooltip {\n  el: HTMLElement;\n  show: (e: MouseEvent, day: StreakrDay) => void;\n  showProviderLabel: (e: MouseEvent, provider: StreakrProvider) => void;\n  move: (e: MouseEvent) => void;\n  hide: () => void;\n  bindCellEvents: (rect: SVGElement, day: StreakrDay) => void;\n}\n\nexport const createTooltip = (ctx: ComponentCtx): Tooltip => {\n  const el = h(\"div\", {\n    class: \"sk-tooltip\",\n    role: \"tooltip\",\n    \"aria-live\": \"polite\",\n  }) as HTMLElement;\n\n  const show = (e: MouseEvent, day: StreakrDay): void => {\n    el.replaceChildren();\n    el.appendChild(h(\"div\", { class: \"tt-date\", text: fmtDateLong(day.date) }));\n    el.appendChild(h(\"div\", { class: \"tt-total\", text: formatTotalLabel(day.total) }));\n    ctx.cfg.providers\n      .filter((provider) => ctx.state.providers[provider.key])\n      .map((provider) => ({ provider, value: sourceCount(day, provider.key) }))\n      .filter(({ value }) => value > 0)\n      .forEach(({ provider, value }) => {\n        el.appendChild(\n          h(\"div\", { class: \"tt-row\" }, [\n            h(\"span\", { class: \"tt-label\" }, [\n              h(\"span\", { class: \"dot\", style: { background: provider.color } }),\n              provider.name,\n            ]),\n            h(\"span\", { class: \"tt-val\", text: String(value) }),\n          ]),\n        );\n      });\n    el.style.left = `${e.clientX + 14}px`;\n    el.style.top = `${e.clientY + 14}px`;\n    el.classList.add(\"visible\");\n  };\n\n  const showProviderLabel = (e: MouseEvent, provider: StreakrProvider): void => {\n    el.replaceChildren();\n    el.appendChild(\n      h(\"div\", { class: \"tt-row\" }, [\n        h(\"span\", { class: \"tt-label\" }, [\n          h(\"span\", { class: \"dot\", style: { background: provider.color } }),\n          provider.name,\n        ]),\n      ]),\n    );\n    move(e);\n    el.classList.add(\"visible\");\n  };\n\n  const move = (e: MouseEvent): void => {\n    el.style.left = `${e.clientX + 14}px`;\n    el.style.top = `${e.clientY + 14}px`;\n  };\n\n  const hide = (): void => {\n    el.classList.remove(\"visible\");\n  };\n\n  const bindCellEvents = (rect: SVGElement, day: StreakrDay): void => {\n    rect.addEventListener(\"mouseenter\", (e) => show(e, day));\n    rect.addEventListener(\"mousemove\", (e) => move(e));\n    rect.addEventListener(\"mouseleave\", hide);\n  };\n\n  return { el, show, showProviderLabel, move, hide, bindCellEvents };\n};\n","import type { StreakrOptions } from \"../types\";\nimport type { InternalState, ResolvedConfig } from \"./config\";\n\nexport type UpdatePatch = Partial<StreakrOptions>;\n\ntype UpdateHandlers = {\n  [Key in keyof StreakrOptions]-?: (patch: Pick<UpdatePatch, Key>) => void;\n};\n\nexport const createUpdateHandlers = (\n  cfg: ResolvedConfig,\n  state: InternalState,\n  hooks: { onThemeChange: () => void },\n) => {\n  const updateHandlers = {\n    target: ({ target }) => {\n      if (target !== undefined) {\n        throw new Error(\"Cannot update 'target' after mount. Destroy and recreate the instance.\");\n      }\n    },\n    theme: ({ theme }) => {\n      if (theme !== undefined) {\n        cfg.theme = theme;\n        hooks.onThemeChange();\n      }\n    },\n    accent: ({ accent }) => {\n      if (accent !== undefined) cfg.accent = accent;\n    },\n    tintHeatmap: ({ tintHeatmap }) => {\n      if (tintHeatmap !== undefined) cfg.tintHeatmap = tintHeatmap;\n    },\n    showProviders: ({ showProviders }) => {\n      if (showProviders !== undefined) cfg.showProviders = showProviders;\n    },\n    showStats: ({ showStats }) => {\n      if (showStats !== undefined) cfg.showStats = showStats;\n    },\n    state: ({ state: nextState }) => {\n      if (nextState !== undefined) cfg.state = nextState;\n    },\n    years: ({ years }) => {\n      if (years !== undefined) {\n        cfg.years = years;\n        if (cfg.years.length && (state.year == null || !cfg.years.includes(state.year))) {\n          state.year = cfg.years[cfg.years.length - 1] ?? null;\n        }\n      }\n    },\n    year: ({ year }) => {\n      if (year !== undefined) {\n        cfg.year = year;\n        state.year = year;\n      }\n    },\n    today: ({ today }) => {\n      if (today !== undefined) cfg.today = today;\n    },\n    getDays: ({ getDays }) => {\n      if (getDays !== undefined) cfg.getDays = getDays;\n    },\n    providers: ({ providers }) => {\n      if (providers !== undefined) cfg.providers = providers;\n    },\n    onYearChange: ({ onYearChange }) => {\n      if (onYearChange !== undefined) cfg.onYearChange = onYearChange;\n    },\n    onProviderToggle: ({ onProviderToggle }) => {\n      if (onProviderToggle !== undefined) cfg.onProviderToggle = onProviderToggle;\n    },\n  } satisfies UpdateHandlers;\n\n  const isUpdateKey = (key: string): key is keyof typeof updateHandlers =>\n    Object.getOwnPropertyDescriptor(updateHandlers, key) !== undefined;\n\n  return { updateHandlers, isUpdateKey };\n};\n","import { h, trustedHtml } from \"./dom\";\n\nexport interface YearModalOptions {\n  years: number[];\n  currentYear: number | null;\n  onSelect: (year: number) => void;\n  onClose: () => void;\n}\n\nexport const renderYearModal = (card: Element, options: YearModalOptions): void => {\n  const { years, currentYear, onSelect, onClose } = options;\n  const overlay = h(\"div\", { class: \"sk-modal-overlay\", onclick: () => onClose() });\n  const modal = h(\"div\", {\n    class: \"sk-modal\",\n    role: \"dialog\",\n    \"aria-modal\": true,\n    \"aria-label\": \"Select year\",\n    onclick: (e: Event) => e.stopPropagation(),\n  });\n  modal.appendChild(\n    h(\"div\", { class: \"sk-modal-header\" }, [\n      h(\"div\", { class: \"sk-modal-title\", text: \"Select year\" }),\n      h(\"button\", {\n        class: \"sk-modal-close\",\n        \"aria-label\": \"Close\",\n        onclick: () => onClose(),\n        html: trustedHtml(\n          '<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><path d=\"M3 3 L11 11 M11 3 L3 11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>',\n        ),\n      }),\n    ]),\n  );\n  const grid = h(\"div\", { class: \"sk-modal-grid\" });\n  years\n    .slice()\n    .reverse()\n    .forEach((y) => {\n      grid.appendChild(\n        h(\n          \"button\",\n          {\n            class: \"sk-modal-year\" + (currentYear === y ? \" active\" : \"\"),\n            onclick: () => {\n              onSelect(y);\n              onClose();\n            },\n          },\n          [h(\"div\", { class: \"sk-modal-year-num\", text: String(y) })],\n        ),\n      );\n    });\n  modal.appendChild(grid);\n\n  const trapFocus = (e: KeyboardEvent): void => {\n    if (e.key !== \"Tab\") return;\n    const focusables = Array.from(modal.querySelectorAll<HTMLElement>(\"button:not([disabled])\"));\n    const first = focusables[0];\n    const last = focusables[focusables.length - 1];\n    if (!first || !last) return;\n    if (e.shiftKey) {\n      if (document.activeElement === first) {\n        e.preventDefault();\n        last.focus();\n      }\n    } else if (document.activeElement === last) {\n      e.preventDefault();\n      first.focus();\n    }\n  };\n  modal.addEventListener(\"keydown\", trapFocus);\n\n  overlay.appendChild(modal);\n  card.appendChild(overlay);\n};\n","import type { StreakrInstance, StreakrOptions, StreakrProviders } from \"../types\";\nimport type { ComponentCtx } from \"./config\";\nimport { createInitialState, resolveConfig } from \"./config\";\nimport { h } from \"./dom\";\nimport { renderHeader, type HeaderActions } from \"./header\";\nimport { enabledProviderState, syncProviderState as syncProviders } from \"./providers\";\nimport { createBodyRenderer, type ReadyBody } from \"./render/body\";\nimport { createRingRenderer } from \"./render/ring\";\nimport { computeRenderFlags, type RenderFlags } from \"./selectors\";\nimport { applyAccentVars, createThemeController } from \"./theme\";\nimport { createTooltip } from \"./tooltip\";\nimport { createUpdateHandlers, type UpdatePatch } from \"./update\";\nimport { renderYearModal } from \"./year-modal\";\n\nexport function createStreakr(options: StreakrOptions): StreakrInstance {\n  const cfg = resolveConfig(options);\n  const state = createInitialState(cfg);\n  const ctx: ComponentCtx = { cfg, state };\n\n  const syncProviderState = (): void => {\n    state.providers = syncProviders(cfg.providers, state.providers);\n  };\n\n  const root = h(\"div\", { class: \"sk-root\" }) as HTMLElement;\n  cfg.target.appendChild(root);\n\n  const tooltip = createTooltip(ctx);\n  root.appendChild(tooltip.el);\n\n  let currentDraw: (() => void) | null = null;\n  let observedWrap: HTMLElement | null = null;\n  let lastDrawWidth = 0;\n  let wasLoading = false;\n  const resizeObs = new ResizeObserver(() => {\n    if (!observedWrap) {\n      return;\n    }\n    const width = observedWrap.getBoundingClientRect().width;\n    if (Math.abs(width - lastDrawWidth) < 1) {\n      return;\n    }\n    lastDrawWidth = width;\n    currentDraw?.();\n  });\n\n  const theme = createThemeController(cfg, root);\n\n  const ring = createRingRenderer(ctx, () => resetSelectedDay());\n  const body = createBodyRenderer(ctx, {\n    tooltip,\n    ring,\n    onEnableAll: () => enableAllProviders(),\n    setCurrentDraw: (draw) => {\n      currentDraw = draw;\n    },\n  });\n\n  const headerActions: HeaderActions = {\n    setYear: (y) => setYear(y),\n    openYearModal: () => openYearModal(),\n    toggleProvider: (key) => toggleProvider(key),\n  };\n\n  const resetSelectedDay = (): void => {\n    state.selectedDay = cfg.today;\n    render();\n  };\n\n  const appendBody = (card: Element, flags: RenderFlags, isRevealing: boolean): void => {\n    const stateBody = [\n      [flags.isLoading, body.renderLoadingBody],\n      [flags.allOff, body.renderNoProviders],\n      [flags.isEmpty, () => body.renderEmpty(flags.canEnableAll)],\n    ].find(([matches]) => matches) as [boolean, () => HTMLElement] | undefined;\n\n    const bodyEl = (\n      stateBody ? stateBody[1]() : body.renderReadyBody(flags.leveled, flags.stats, isRevealing)\n    ) as ReadyBody;\n    card.appendChild(bodyEl);\n    bodyEl.__skDraw?.();\n    if (bodyEl.__skObserveTarget) {\n      observedWrap = bodyEl.__skObserveTarget;\n      lastDrawWidth = observedWrap.getBoundingClientRect().width;\n      resizeObs.observe(observedWrap);\n    }\n  };\n\n  const render = (): void => {\n    syncProviderState();\n    tooltip.hide();\n    resizeObs.disconnect();\n    currentDraw = null;\n    observedWrap = null;\n\n    const wasOpen = state.yearModalOpen;\n    const flags = computeRenderFlags(ctx);\n    const isRevealing = wasLoading && !flags.isLoading;\n    wasLoading = flags.isLoading;\n\n    root.replaceChildren(tooltip.el);\n    root.dataset.theme = theme.getActiveTheme();\n    applyAccentVars(root, cfg.accent, cfg.tintHeatmap);\n\n    const card = h(\"div\", { class: \"sk-card\" });\n    root.appendChild(card);\n    card.appendChild(renderHeader(ctx, flags, headerActions, tooltip));\n    appendBody(card, flags, isRevealing);\n\n    if (wasOpen) {\n      renderYearModal(card, {\n        years: cfg.years,\n        currentYear: state.year,\n        onSelect: (y) => setYear(y),\n        onClose: () => closeYearModal(),\n      });\n    }\n  };\n\n  const setYear = (y: number): void => {\n    state.year = y;\n    cfg.onYearChange?.(y);\n    render();\n  };\n\n  const toggleProvider = (key: string): void => {\n    state.providers[key] = !state.providers[key];\n    cfg.onProviderToggle?.(key, state.providers[key], { ...state.providers });\n    render();\n  };\n\n  const enableAllProviders = (): void => {\n    state.providers = enabledProviderState(cfg.providers);\n    render();\n  };\n\n  const openYearModal = (): void => {\n    state.yearModalOpen = true;\n    render();\n    root.querySelector<HTMLButtonElement>(\".sk-modal-year\")?.focus();\n  };\n\n  const closeYearModal = (): void => {\n    state.yearModalOpen = false;\n    render();\n    root.querySelector<HTMLButtonElement>(\".sk-year-more\")?.focus();\n  };\n\n  const onKey = (e: KeyboardEvent): void => {\n    if (e.key === \"Escape\" && state.yearModalOpen) {\n      closeYearModal();\n    }\n  };\n\n  const { updateHandlers, isUpdateKey } = createUpdateHandlers(cfg, state, {\n    onThemeChange: () => theme.setup(),\n  });\n\n  document.addEventListener(\"keydown\", onKey);\n  theme.setup();\n  render();\n\n  return {\n    update(patch: UpdatePatch): void {\n      for (const key of Object.keys(patch)) {\n        if (isUpdateKey(key)) {\n          updateHandlers[key](patch);\n        }\n      }\n      render();\n    },\n    setYear,\n    setProviders(next: StreakrProviders): void {\n      state.providers = { ...state.providers, ...next };\n      render();\n    },\n    destroy(): void {\n      resizeObs.disconnect();\n      theme.cleanup();\n      document.removeEventListener(\"keydown\", onKey);\n      tooltip.el.remove();\n      root.remove();\n    },\n  };\n}\n"],"mappings":"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"}