{"version":3,"sources":["../src/lib/schemas.ts","../src/lib/cache.ts","../src/lib/domain.ts","../src/lib/license-state.ts","../src/lib/resolve-api-base.ts","../src/lib/polar-client.ts","../src/lib/trial.ts","../src/context/license-context.tsx","../src/components/license-warning.tsx","../src/components/license-watermark.tsx","../src/components/license-gate.tsx","../src/hooks/use-license-gate.ts","../src/components/pro-gate.tsx","../src/components/trial-badge.tsx","../src/components/license-debug-panel.tsx","../src/components/license-test-mode.tsx","../src/hooks/use-license.ts","../src/hooks/use-is-pro.ts"],"names":["PolarValidateResponseSchema","z","PolarActivateResponseSchema","LicenseCacheSchema","CACHE_PREFIX","CACHE_TTL_MS","hashKey","key","hash","readCache","domain","raw","json","parsed","clearCache","writeCache","state","entry","hasFreshCache","DEV_HOSTNAMES","DEV_SUFFIX","EPHEMERAL_HOST_PATTERNS","IP_HOST","getCurrentDomain","isDevEnvironment","isEphemeralHost","pattern","normalizeLicenseKey","createUnlicensedState","now","createDevBypassState","createPreviewBypassState","DEFAULT_API_BASE","readEnv","name","value","resolveApiBase","override","nextPublic","bare","PolarApiError","statusCode","message","PolarParseError","zodError","transformValidateResponse","transformActivateResponse","validateKey","organizationId","activationId","options","body","res","activateKey","label","generateRenderKey","input","i","warnedDomains","warnActivationLimitReached","validateLicenseKey","orgId","normalizedKey","cached","response","serverValidatedAt","activationLabel","usage","activateResponse","activationError","overLimitState","error","getDaysLeft","config","trustedNow","elapsedMs","elapsedDays","remaining","LOADING_STATE","LicenseContext","createContext","LicenseRenderContext","LicenseProvider","licenseKey","apiBase","trialDays","trialIssuedAt","children","onValidate","onError","setState","useState","onValidateRef","useRef","onErrorRef","useEffect","validate","useCallback","next","result","errorState","refresh","isGated","isLoading","gracePeriodActive","useMemo","grace","trial","logger","issuedAt","daysLeft","contextValue","jsx","hasWarned","LicenseWarning","WATERMARK_URL","wrapperStyle","linkStyle","logoStyle","labelStyle","ctaStyle","UserTourKitLogo","jsxs","instances","ownerId","electOwner","instance","dispatchClickEvent","win","payload","LicenseWatermark","isOwner","setIsOwner","mounted","setMounted","idx","x","createPortal","LicenseGate","_require","fallback","loading","context","useContext","Fragment","useLicenseGate","placeholderContainerStyles","placeholderInnerStyles","titleStyles","packageStyles","linkStyles","ProGate","packageName","warnedRef","G","UPGRADE_CTA_THRESHOLD","DEFAULT_PRICING_URL","TrialBadge","daysLeftProp","pricingUrl","className","fromContext","resolved","isTrialing","isUrgent","readEnvLicenseKey","LicenseDebugPanel","showInProduction","ctx","devBypassActive","localhost","hasEnvKey","LicenseTestMode","props","tier","useLicense","useIsPro"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod'\n\n/**\n * Polar validate response schema — snake_case matching wire format.\n *\n * `.passthrough()` is load-bearing for forward-compat during the Polar →\n * tourkit-dash issuer migration (plan/15c §\"additive `tk_tier`\"). The\n * tourkit-dash issuer will eventually add fields like `tk_tier`,\n * `tk_issuer_id`, and `tk_claim_status`; v1.x SDKs must parse and ignore\n * them so customers on v1.x continue to function while v2.x readers pick up\n * the new semantics. The companion regression test\n * `schema-no-tier.regression.test.ts` pins that **Polar itself** still does\n * not emit `tier`; unknown additive fields from either issuer are allowed.\n */\nexport const PolarValidateResponseSchema = z.looseObject({\n  id: z.string(),\n  organization_id: z.string(),\n  status: z.enum(['granted', 'revoked', 'disabled']),\n  key: z.string(),\n  limit_activations: z.number().nullable(),\n  usage: z.number(),\n  validations: z.number(),\n  last_validated_at: z.string(),\n  expires_at: z.string().nullable(),\n  activation: z\n    .looseObject({\n      id: z.string(),\n      license_key_id: z.string(),\n      label: z.string(),\n      meta: z.record(z.string(), z.unknown()),\n      created_at: z.string(),\n      modified_at: z.string().nullable(),\n    })\n    .nullable(),\n})\n\n/**\n * Polar activate response schema — snake_case matching wire format.\n *\n * Same `.passthrough()` discipline as the validate response. The tourkit-dash\n * `/v1/license/activate` endpoint is wire-compatible with Polar's\n * `/customer-portal/license-keys/activate` per plan/15e §\"byte-equality\"; any\n * additive `tk_*` fields land transparently for v1.x readers.\n */\nexport const PolarActivateResponseSchema = z.looseObject({\n  id: z.string(),\n  license_key_id: z.string(),\n  label: z.string(),\n  meta: z.record(z.string(), z.unknown()),\n  created_at: z.string(),\n  modified_at: z.string().nullable(),\n  license_key: z.looseObject({\n    id: z.string(),\n    organization_id: z.string(),\n    status: z.enum(['granted', 'revoked', 'disabled']),\n    limit_activations: z.number().nullable(),\n    usage: z.number(),\n    limit_usage: z.number().nullable(),\n    validations: z.number(),\n    last_validated_at: z.string(),\n    expires_at: z.string().nullable(),\n  }),\n})\n\n/**\n * Cache schema — flat LicenseState shape.\n *\n * `keyHash` is optional for backward compatibility with v1.0.x cache entries\n * that predate the per-key hash. New entries always set it; readers ignore the\n * field when the caller does not pass a current `key` to compare against.\n */\nexport const LicenseCacheSchema = z.object({\n  state: z.object({\n    status: z.enum(['valid', 'invalid', 'expired', 'revoked', 'loading', 'error']),\n    tier: z.enum(['free', 'pro']),\n    activations: z.number(),\n    maxActivations: z.number(),\n    domain: z.string().nullable(),\n    expiresAt: z.string().nullable(),\n    validatedAt: z.number(),\n    /**\n     * Optional for backward compatibility with v1.0.x cache entries that\n     * predate the Polar server-anchor field. Readers parse cached states\n     * unchanged; writers added in Phase 8 always set it when Polar emits\n     * `last_validated_at`.\n     */\n    serverValidatedAt: z.number().nullable().optional(),\n    renderKey: z.string().optional(),\n  }),\n  cachedAt: z.number(),\n  domain: z.string(),\n  keyHash: z.string().optional(),\n})\n","import type { LicenseCache, LicenseState } from '../types'\nimport { LicenseCacheSchema } from './schemas'\n\nconst CACHE_PREFIX = 'tourkit:license:'\nconst CACHE_TTL_MS = 72 * 60 * 60 * 1000 // 72 hours\n\n// Deterministic short hash. Not a security primitive — used only to bind a\n// cache entry to the license key it was issued for, so switching `licenseKey`\n// in <LicenseProvider> does not return another key's cached state.\nfunction hashKey(key: string): string {\n  let hash = 0\n  for (let i = 0; i < key.length; i++) {\n    hash = ((hash << 5) - hash + key.charCodeAt(i)) | 0\n  }\n  return Math.abs(hash).toString(36)\n}\n\nexport function readCache(domain: string, key?: string): LicenseState | null {\n  if (typeof window === 'undefined') return null\n  try {\n    const raw = localStorage.getItem(`${CACHE_PREFIX}${domain}`)\n    if (!raw) return null\n    const json: unknown = JSON.parse(raw)\n    const parsed = LicenseCacheSchema.safeParse(json)\n    if (!parsed.success) {\n      clearCache(domain)\n      return null\n    }\n    if (Date.now() - parsed.data.cachedAt > CACHE_TTL_MS) {\n      clearCache(domain)\n      return null\n    }\n    if (\n      key !== undefined &&\n      parsed.data.keyHash !== undefined &&\n      parsed.data.keyHash !== hashKey(key)\n    ) {\n      clearCache(domain)\n      return null\n    }\n    return parsed.data.state as LicenseState\n  } catch {\n    clearCache(domain)\n    return null\n  }\n}\n\nexport function writeCache(domain: string, state: LicenseState, key?: string): void {\n  if (typeof window === 'undefined') return\n  try {\n    const entry: LicenseCache = {\n      state,\n      cachedAt: Date.now(),\n      domain,\n      ...(key !== undefined ? { keyHash: hashKey(key) } : {}),\n    }\n    localStorage.setItem(`${CACHE_PREFIX}${domain}`, JSON.stringify(entry))\n  } catch {\n    // localStorage quota exceeded — fail silently\n  }\n}\n\nexport function clearCache(domain: string): void {\n  if (typeof window === 'undefined') return\n  localStorage.removeItem(`${CACHE_PREFIX}${domain}`)\n}\n\n/**\n * Returns true if a non-expired, valid cache entry exists for this domain.\n * Pass `key` to also require the cached entry's keyHash to match the current\n * license key. Used by error-state handling: error + fresh cache = grace\n * period (licensed), error + no cache = unlicensed.\n */\nexport function hasFreshCache(domain: string, key?: string): boolean {\n  return readCache(domain, key) !== null\n}\n","const DEV_HOSTNAMES = ['localhost', '127.0.0.1']\nconst DEV_SUFFIX = '.local'\n\n/**\n * Throwaway / preview hostnames that change on every deploy. Activating these\n * would silently burn the customer's finite Polar activation slots — a single\n * busy Vercel/Netlify preview workflow can exhaust a 5-slot key in days. We\n * skip activation for them entirely (Pro stays unlocked, no watermark, no slot\n * consumed). Stable production hosts — including a bare `project.vercel.app` —\n * are deliberately NOT matched here, so real deployments still require a key.\n *\n * Patterns are intentionally narrow: they target the branch/hash/deploy-preview\n * segments that only ephemeral URLs carry, never the production alias.\n */\nconst EPHEMERAL_HOST_PATTERNS: RegExp[] = [\n  // Vercel previews: project-git-branch-team.vercel.app, project-<hash>-team.vercel.app\n  /-git-[^.]+\\.vercel\\.app$/i,\n  /-[a-z0-9]{9,}-[^.]+\\.vercel\\.app$/i,\n  // Netlify branch deploys / deploy previews: branch--site.netlify.app, deploy-preview-123--site.netlify.app\n  /--[^.]+\\.netlify\\.app$/i,\n  // Cloudflare Pages previews: <hash>.<project>.pages.dev\n  /^[a-z0-9]{8}\\.[^.]+\\.pages\\.dev$/i,\n  // Local tunnels used during dev/demo\n  /\\.ngrok(?:-free)?\\.app$/i,\n  /\\.ngrok\\.io$/i,\n  /\\.loca\\.lt$/i,\n  /\\.trycloudflare\\.com$/i,\n]\n\n// Bare IPv4 / IPv6 hosts are never a licensed production domain.\nconst IP_HOST = /^(?:\\d{1,3}\\.){3}\\d{1,3}$|^\\[?[0-9a-f]*:[0-9a-f:]+\\]?$/i\n\nexport function getCurrentDomain(): string | null {\n  if (typeof window === 'undefined') return null\n  return window.location.hostname\n}\n\nexport function isDevEnvironment(): boolean {\n  const domain = getCurrentDomain()\n  if (!domain) return false\n  return DEV_HOSTNAMES.includes(domain) || domain.endsWith(DEV_SUFFIX)\n}\n\n/**\n * True for ephemeral preview/tunnel hosts (see `EPHEMERAL_HOST_PATTERNS`) and\n * raw IP hosts. Callers treat these like dev: skip Polar, unlock Pro, consume\n * no activation slot. `isDevEnvironment()` hosts are excluded since they are\n * already handled by the dev bypass upstream.\n */\nexport function isEphemeralHost(domain: string | null = getCurrentDomain()): boolean {\n  if (!domain) return false\n  if (IP_HOST.test(domain)) return true\n  return EPHEMERAL_HOST_PATTERNS.some((pattern) => pattern.test(domain))\n}\n\n/**\n * Compares current hostname against the stored activation label.\n * Logs a console warning on mismatch. Soft enforcement only —\n * returns boolean but never blocks rendering.\n */\nexport function validateDomainAtRender(activationLabel: string): boolean {\n  const currentDomain = getCurrentDomain()\n  if (!currentDomain) return true // SSR — cannot check, assume ok\n  if (isDevEnvironment()) return true // dev — always pass\n\n  if (currentDomain !== activationLabel) {\n    console.warn(\n      `[tour-kit/license] Domain mismatch: license activated for \"${activationLabel}\" but running on \"${currentDomain}\". Components will render with a watermark. Activate this domain in your Polar dashboard or contact support.`\n    )\n    return false\n  }\n  return true\n}\n","import type { LicenseState } from '../types'\n\n/**\n * Trim a raw license key. Used everywhere a key is checked for presence,\n * compared, hashed for cache, or sent to Polar so that accidental whitespace\n * (env var with trailing newline, copy-pasted with spaces) is normalized\n * exactly once.\n */\nexport function normalizeLicenseKey(key: string): string {\n  return key.trim()\n}\n\n/**\n * True when the key has at least one non-whitespace character.\n *\n * Empty and whitespace-only keys are unlicensed on every host — including\n * localhost. The dev bypass only applies when a non-empty key is configured.\n */\nexport function hasLicenseKey(key: string): boolean {\n  return normalizeLicenseKey(key).length > 0\n}\n\n/**\n * Canonical unlicensed state. Returned whenever the configured key is missing\n * or blank. Kept as `status: 'invalid'` (instead of introducing a new `missing`\n * status) so downstream gating logic in `<LicenseGate>`, `<ProGate>`, and\n * `useLicenseGate()` keeps working without type churn.\n */\nexport function createUnlicensedState(now: number = Date.now()): LicenseState {\n  return {\n    status: 'invalid',\n    tier: 'free',\n    activations: 0,\n    maxActivations: 0,\n    domain: null,\n    expiresAt: null,\n    validatedAt: now,\n    serverValidatedAt: null,\n    renderKey: undefined,\n  }\n}\n\n/**\n * Canonical dev-bypass state. Returned on localhost / 127.0.0.1 / *.local when\n * a non-empty key is configured. Skips Polar so local dev does not consume\n * activation slots — but only when the developer has at least set a key, so a\n * missing env var still surfaces as an unlicensed watermark before deploy.\n */\nexport function createDevBypassState(now: number = Date.now()): LicenseState {\n  return {\n    status: 'valid',\n    tier: 'pro',\n    activations: 0,\n    maxActivations: 0,\n    domain: null,\n    expiresAt: null,\n    validatedAt: now,\n    serverValidatedAt: null,\n    renderKey: 'dev_bypass',\n  }\n}\n\n/**\n * Canonical preview-bypass state. Returned on ephemeral / preview hosts\n * (Vercel/Netlify/Cloudflare preview URLs, tunnels, raw IPs — see\n * `isEphemeralHost`). Like the dev bypass it unlocks Pro and skips Polar so a\n * throwaway deploy URL never consumes one of the key's finite activation slots.\n * A distinct `renderKey` keeps the debug panel and any anti-bypass consumer\n * able to tell a preview bypass apart from a localhost dev bypass.\n */\nexport function createPreviewBypassState(now: number = Date.now()): LicenseState {\n  return {\n    status: 'valid',\n    tier: 'pro',\n    activations: 0,\n    maxActivations: 0,\n    domain: null,\n    expiresAt: null,\n    validatedAt: now,\n    serverValidatedAt: null,\n    renderKey: 'preview_bypass',\n  }\n}\n","/**\n * Default issuer URL. Polar in v1.x; flips to tourkit-dash in v2.x at T+90\n * per plan/15m. v1.x customers point at tourkit-dash by overriding this\n * default — never by upgrading the SDK during the dual-run window.\n */\nexport const DEFAULT_API_BASE = 'https://api.polar.sh/v1/customer-portal/license-keys'\n\n/**\n * Reads `process.env.X` defensively for browsers without a bundler-injected\n * `process.env`. Returns `undefined` when the var is missing or the runtime\n * has no `process` global.\n */\nfunction readEnv(name: string): string | undefined {\n  if (typeof process === 'undefined') return undefined\n  const value = process.env?.[name]\n  return value && value.length > 0 ? value : undefined\n}\n\n/**\n * Resolve which issuer base URL a call should hit.\n *\n * Precedence (highest first):\n *   1. `override` passed by the caller (`options.apiBase` on `validateLicenseKey`,\n *      `validateKey`, `activateKey`, `deactivateKey`, or the `apiBase` prop on\n *      `<LicenseProvider>`).\n *   2. `process.env.NEXT_PUBLIC_TOUR_KIT_LICENSE_API_BASE` — Next.js client +\n *      server (the same prefix used by `NEXT_PUBLIC_TOUR_KIT_LICENSE_KEY` so\n *      customer apps configure both vars the same way).\n *   3. `process.env.TOUR_KIT_LICENSE_API_BASE` — server-side / Node /\n *      Vite-with-define / customers using a non-Next.js bundler that inlines\n *      bare env names.\n *   4. {@link DEFAULT_API_BASE}.\n *\n * The override mechanism is the load-bearing seam for the Polar → tourkit-dash\n * issuer migration (plan/15f). Without it a v1.x customer cannot point at the\n * cloud issuer until they upgrade to v2.x — which is the whole reason this\n * function exists.\n */\nexport function resolveApiBase(override?: string): string {\n  if (override && override.length > 0) return override\n  const nextPublic = readEnv('NEXT_PUBLIC_TOUR_KIT_LICENSE_API_BASE')\n  if (nextPublic) return nextPublic\n  const bare = readEnv('TOUR_KIT_LICENSE_API_BASE')\n  if (bare) return bare\n  return DEFAULT_API_BASE\n}\n","import type { ZodError } from 'zod'\nimport type { LicenseState, PolarActivateResponse, PolarValidateResponse } from '../types'\nimport { readCache, writeCache } from './cache'\nimport { getCurrentDomain, isDevEnvironment, isEphemeralHost } from './domain'\nimport {\n  createDevBypassState,\n  createPreviewBypassState,\n  createUnlicensedState,\n  normalizeLicenseKey,\n} from './license-state'\nimport { resolveApiBase } from './resolve-api-base'\nimport { PolarActivateResponseSchema, PolarValidateResponseSchema } from './schemas'\n\n/**\n * Options bag accepted by every low-level Polar call and by `validateLicenseKey`.\n *\n * `apiBase` is the load-bearing knob for the Polar → tourkit-dash issuer\n * migration (plan/15f). When omitted the call falls through `resolveApiBase()`\n * to the env-var chain and finally the Polar default.\n */\nexport type ValidateOptions = {\n  apiBase?: string\n}\n\n// ---------------------------------------------------------------------------\n// Error classes\n// ---------------------------------------------------------------------------\n\nexport class PolarApiError extends Error {\n  constructor(\n    public readonly statusCode: number,\n    message: string\n  ) {\n    super(message)\n    this.name = 'PolarApiError'\n  }\n}\n\nexport class PolarParseError extends Error {\n  constructor(public readonly zodError: ZodError) {\n    super('Failed to parse Polar API response')\n    this.name = 'PolarParseError'\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Snake-case → camelCase transforms\n// ---------------------------------------------------------------------------\n\nfunction transformValidateResponse(\n  raw: ReturnType<typeof PolarValidateResponseSchema.parse>\n): PolarValidateResponse {\n  return {\n    id: raw.id,\n    organizationId: raw.organization_id,\n    status: raw.status,\n    key: raw.key,\n    limitActivations: raw.limit_activations,\n    usage: raw.usage,\n    validations: raw.validations,\n    lastValidatedAt: raw.last_validated_at,\n    expiresAt: raw.expires_at,\n    activation: raw.activation\n      ? {\n          id: raw.activation.id,\n          licenseKeyId: raw.activation.license_key_id,\n          label: raw.activation.label,\n          meta: raw.activation.meta,\n          createdAt: raw.activation.created_at,\n          modifiedAt: raw.activation.modified_at,\n        }\n      : null,\n  }\n}\n\nfunction transformActivateResponse(\n  raw: ReturnType<typeof PolarActivateResponseSchema.parse>\n): PolarActivateResponse {\n  return {\n    id: raw.id,\n    licenseKeyId: raw.license_key_id,\n    label: raw.label,\n    meta: raw.meta,\n    createdAt: raw.created_at,\n    modifiedAt: raw.modified_at,\n    licenseKey: {\n      id: raw.license_key.id,\n      organizationId: raw.license_key.organization_id,\n      status: raw.license_key.status,\n      limitActivations: raw.license_key.limit_activations,\n      usage: raw.license_key.usage,\n      limitUsage: raw.license_key.limit_usage,\n      validations: raw.license_key.validations,\n      lastValidatedAt: raw.license_key.last_validated_at,\n      expiresAt: raw.license_key.expires_at,\n    },\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Low-level API functions\n// ---------------------------------------------------------------------------\n\nexport async function validateKey(\n  key: string,\n  organizationId: string,\n  activationId?: string,\n  options?: ValidateOptions\n): Promise<PolarValidateResponse> {\n  const body: Record<string, string> = {\n    key,\n    organization_id: organizationId,\n  }\n  if (activationId) {\n    body.activation_id = activationId\n  }\n\n  const res = await fetch(`${resolveApiBase(options?.apiBase)}/validate`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(body),\n  })\n\n  if (!res.ok) {\n    throw new PolarApiError(res.status, await res.text())\n  }\n\n  const json: unknown = await res.json()\n  const parsed = PolarValidateResponseSchema.safeParse(json)\n  if (!parsed.success) {\n    throw new PolarParseError(parsed.error)\n  }\n\n  return transformValidateResponse(parsed.data)\n}\n\nexport async function activateKey(\n  key: string,\n  organizationId: string,\n  label: string,\n  options?: ValidateOptions\n): Promise<PolarActivateResponse> {\n  const res = await fetch(`${resolveApiBase(options?.apiBase)}/activate`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({\n      key,\n      organization_id: organizationId,\n      label,\n    }),\n  })\n\n  if (!res.ok) {\n    throw new PolarApiError(res.status, await res.text())\n  }\n\n  const json: unknown = await res.json()\n  const parsed = PolarActivateResponseSchema.safeParse(json)\n  if (!parsed.success) {\n    throw new PolarParseError(parsed.error)\n  }\n\n  return transformActivateResponse(parsed.data)\n}\n\nexport async function deactivateKey(\n  key: string,\n  organizationId: string,\n  activationId: string,\n  options?: ValidateOptions\n): Promise<void> {\n  const res = await fetch(`${resolveApiBase(options?.apiBase)}/deactivate`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({\n      key,\n      organization_id: organizationId,\n      activation_id: activationId,\n    }),\n  })\n\n  if (!res.ok) {\n    throw new PolarApiError(res.status, await res.text())\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction generateRenderKey(key: string, domain: string | null): string {\n  const input = key + (domain ?? '')\n  let hash = 0\n  for (let i = 0; i < input.length; i++) {\n    hash = ((hash << 5) - hash + input.charCodeAt(i)) | 0\n  }\n  return `lk_${Math.abs(hash).toString(36)}`\n}\n\n// Dedupe the over-limit warning so a re-validation storm does not spam the\n// console. One line per domain per session is enough to be actionable.\nconst warnedDomains = new Set<string>()\n\nfunction warnActivationLimitReached(domain: string): void {\n  if (warnedDomains.has(domain)) return\n  warnedDomains.add(domain)\n  console.warn(\n    `[tour-kit/license] License valid, but its activation limit is reached, so \"${domain}\" could not claim a slot. Tour Kit Pro stays unlocked here. Free a slot or raise the activation limit for this key in your Polar dashboard. Tip: preview/throwaway deploy URLs are skipped automatically and do not consume slots.`\n  )\n}\n\n// ---------------------------------------------------------------------------\n// Orchestrator — single public entry point\n// ---------------------------------------------------------------------------\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: orchestrator with multiple validation paths\nexport async function validateLicenseKey(\n  key: string,\n  organizationId?: string,\n  options?: ValidateOptions\n): Promise<LicenseState> {\n  const domain = getCurrentDomain()\n  const orgId = organizationId ?? ''\n  const now = Date.now()\n  const normalizedKey = normalizeLicenseKey(key)\n\n  // 0. Missing or whitespace-only key is unlicensed on every host — including\n  //    localhost. Must run before cache reads so an old valid cache entry\n  //    cannot mask an empty env var, and before the dev bypass so a developer\n  //    sees the same unlicensed watermark locally that production would show.\n  if (normalizedKey.length === 0) {\n    return createUnlicensedState(now)\n  }\n\n  // 1. Dev bypass — only for non-empty keys. We do not validate locally\n  //    because that would consume Polar activation slots during normal dev.\n  if (isDevEnvironment()) {\n    return createDevBypassState(now)\n  }\n\n  // 1b. Ephemeral / preview hosts (Vercel/Netlify/Cloudflare preview URLs,\n  //     tunnels, raw IPs). Skip Polar entirely so a throwaway deploy URL never\n  //     consumes one of the key's finite activation slots. Pro stays unlocked\n  //     (no watermark); stable production hosts fall through to validation.\n  if (domain && isEphemeralHost(domain)) {\n    return createPreviewBypassState(now)\n  }\n\n  // 2. Cache check (bound to current key — switching licenseKey invalidates)\n  if (domain) {\n    const cached = readCache(domain, normalizedKey)\n    if (cached) return cached\n  }\n\n  try {\n    // 3. Validate against the issuer (Polar by default; tourkit-dash when\n    //    `options.apiBase` or the TOUR_KIT_LICENSE_API_BASE env var overrides\n    //    the default — see plan/15f).\n    const response = await validateKey(normalizedKey, orgId, undefined, options)\n\n    // 4. Map Polar status to LicenseState\n    const serverValidatedAt = response.lastValidatedAt\n      ? Date.parse(response.lastValidatedAt) || null\n      : null\n\n    if (response.status === 'revoked' || response.status === 'disabled') {\n      const state: LicenseState = {\n        status: 'revoked',\n        tier: 'free',\n        activations: response.usage,\n        maxActivations: response.limitActivations ?? 0,\n        domain,\n        expiresAt: null,\n        validatedAt: now,\n        serverValidatedAt,\n        renderKey: undefined,\n      }\n      if (domain) writeCache(domain, state, normalizedKey)\n      return state\n    }\n\n    if (response.expiresAt && new Date(response.expiresAt) < new Date()) {\n      const state: LicenseState = {\n        status: 'expired',\n        tier: 'pro',\n        activations: response.usage,\n        maxActivations: response.limitActivations ?? 0,\n        domain,\n        expiresAt: response.expiresAt,\n        validatedAt: now,\n        serverValidatedAt,\n        renderKey: undefined,\n      }\n      if (domain) writeCache(domain, state, normalizedKey)\n      return state\n    }\n\n    // 5. Auto-activate if no activation for this domain\n    let activationLabel = response.activation?.label ?? null\n    let usage = response.usage\n\n    if (!response.activation && domain) {\n      try {\n        const activateResponse = await activateKey(normalizedKey, orgId, domain, options)\n        activationLabel = activateResponse.label\n        usage = activateResponse.licenseKey.usage\n      } catch (activationError) {\n        // 5a. Activation limit reached (403). The key itself is `granted` — the\n        //     customer paid; they just have more live domains than slots (very\n        //     common once Vercel/Netlify preview URLs pile up). Punishing a\n        //     paying customer's production site with the \"Unlicensed\" watermark\n        //     is a false positive, so treat this as a valid Pro license, warn\n        //     once, and let the over-activation surface server-side instead.\n        if (activationError instanceof PolarApiError && activationError.statusCode === 403) {\n          warnActivationLimitReached(domain)\n          const overLimitState: LicenseState = {\n            status: 'valid',\n            tier: 'pro',\n            activations: response.usage,\n            maxActivations: response.limitActivations ?? 0,\n            domain,\n            expiresAt: response.expiresAt,\n            validatedAt: now,\n            serverValidatedAt,\n            renderKey: generateRenderKey(normalizedKey, domain),\n          }\n          writeCache(domain, overLimitState, normalizedKey)\n          return overLimitState\n        }\n        throw activationError\n      }\n    }\n\n    // 6. Guard: if still no activation (SSR with no prior activation), return error\n    if (!activationLabel) {\n      return {\n        status: 'error',\n        tier: 'free',\n        activations: 0,\n        maxActivations: 0,\n        domain: null,\n        expiresAt: null,\n        validatedAt: now,\n        serverValidatedAt: null,\n        renderKey: undefined,\n      }\n    }\n\n    const state: LicenseState = {\n      status: 'valid',\n      tier: 'pro',\n      activations: usage,\n      maxActivations: response.limitActivations ?? 0,\n      domain: activationLabel,\n      expiresAt: response.expiresAt,\n      validatedAt: now,\n      serverValidatedAt,\n      renderKey: generateRenderKey(normalizedKey, activationLabel),\n    }\n    if (domain) writeCache(domain, state, normalizedKey)\n    return state\n  } catch (error) {\n    if (error instanceof PolarApiError && error.statusCode === 404) {\n      return {\n        status: 'invalid',\n        tier: 'free',\n        activations: 0,\n        maxActivations: 0,\n        domain: null,\n        expiresAt: null,\n        validatedAt: now,\n        serverValidatedAt: null,\n        renderKey: undefined,\n      }\n    }\n    if (error instanceof PolarApiError && error.statusCode === 403) {\n      return {\n        status: 'invalid',\n        tier: 'free',\n        activations: 0,\n        maxActivations: 0,\n        domain: null,\n        expiresAt: null,\n        validatedAt: now,\n        serverValidatedAt: null,\n        renderKey: undefined,\n      }\n    }\n    if (error instanceof PolarParseError) {\n      return {\n        status: 'error',\n        tier: 'free',\n        activations: 0,\n        maxActivations: 0,\n        domain: null,\n        expiresAt: null,\n        validatedAt: now,\n        serverValidatedAt: null,\n        renderKey: undefined,\n      }\n    }\n    return {\n      status: 'error',\n      tier: 'free',\n      activations: 0,\n      maxActivations: 0,\n      domain: null,\n      expiresAt: null,\n      validatedAt: now,\n      serverValidatedAt: null,\n      renderKey: undefined,\n    }\n  }\n}\n","/**\n * Consumer-supplied trial configuration. Passed to <LicenseProvider trialDays={14} />\n * along with the implicit `issuedAt` derived from the license's first validation\n * (or a future server-side field when Polar ships one).\n *\n * Polar's /v1/customer-portal/license-keys/validate endpoint does NOT emit a\n * `tier` field today (confirmed Phase 0 task 0.6, memory project_polar_api_findings.md\n * entry #187). Trial state is therefore CLIENT-DERIVED. If Polar adds server-side\n * trial signalling later, getDaysLeft will accept an optional server-provided\n * override (marked `FUTURE:` below) — additive, non-breaking.\n */\nexport interface TrialConfig {\n  /** Unix ms timestamp of when the trial started. Sourced from license issuance time. */\n  issuedAt: number\n  /** Length of the trial window in whole days. E.g. 14. */\n  trialDays: number\n  /** Local Date.now() timestamp captured when validation ran. */\n  validatedAt: number\n  /** Polar last_validated_at parsed to Unix ms. Null when unavailable. */\n  serverValidatedAt?: number | null\n}\n\n/**\n * Compute days remaining in the trial window. Uses Polar's server validation\n * timestamp plus local elapsed time when available, and falls back to `now`\n * when no server anchor exists. Clamps to [0, trialDays].\n *\n * The serverValidatedAt + (now - validatedAt) algebra absorbs client clock\n * skew: Polar gives the server anchor at validation time; the local clock only\n * contributes the (now - validatedAt) delta, which on a normal machine is the\n * real elapsed time and on a skewed machine is the same delta (skew cancels).\n *\n * @param config The trial config from <LicenseProvider>.\n * @param now Override for testing. Defaults to Date.now().\n * @returns Integer days remaining in [0, trialDays].\n */\nexport function getDaysLeft(config: TrialConfig, now: number = Date.now()): number {\n  const trustedNow =\n    config.serverValidatedAt && config.serverValidatedAt > 0\n      ? config.serverValidatedAt + Math.max(0, now - config.validatedAt)\n      : now\n  const elapsedMs = Math.max(0, trustedNow - config.issuedAt)\n  const elapsedDays = Math.floor(elapsedMs / 86_400_000)\n  const remaining = config.trialDays - elapsedDays\n  // FUTURE: if Polar adds `tier='trial'` to the validate response, accept an\n  // optional serverDaysLeft override here and return it when defined.\n  return Math.max(0, Math.min(config.trialDays, remaining))\n}\n","'use client'\n\nimport { logger } from '@tour-kit/core'\nimport { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { clearCache, hasFreshCache } from '../lib/cache'\nimport { getCurrentDomain, isDevEnvironment } from '../lib/domain'\nimport {\n  createDevBypassState,\n  createUnlicensedState,\n  normalizeLicenseKey,\n} from '../lib/license-state'\nimport { validateLicenseKey } from '../lib/polar-client'\nimport { getDaysLeft } from '../lib/trial'\nimport type {\n  LicenseContextValue,\n  LicenseProviderProps,\n  LicenseState,\n  TrialContextValue,\n} from '../types'\n\nconst LOADING_STATE: LicenseState = {\n  status: 'loading',\n  tier: 'free',\n  activations: 0,\n  maxActivations: 0,\n  domain: null,\n  expiresAt: null,\n  validatedAt: 0,\n  serverValidatedAt: null,\n  renderKey: undefined,\n}\n\nexport const LicenseContext = createContext<LicenseContextValue | null>(null)\n\nexport const LicenseRenderContext = createContext<string | undefined>(undefined)\n\nexport function LicenseProvider({\n  licenseKey,\n  organizationId,\n  apiBase,\n  trialDays,\n  trialIssuedAt,\n  children,\n  onValidate,\n  onError,\n}: LicenseProviderProps) {\n  const [state, setState] = useState<LicenseState>(LOADING_STATE)\n\n  // Stabilize user-supplied callbacks via refs so inline `onValidate`/`onError`\n  // props do not invalidate `validate` on every render and trigger a re-validation loop.\n  const onValidateRef = useRef(onValidate)\n  const onErrorRef = useRef(onError)\n  useEffect(() => {\n    onValidateRef.current = onValidate\n    onErrorRef.current = onError\n  })\n\n  const validate = useCallback(async () => {\n    const normalizedKey = normalizeLicenseKey(licenseKey)\n\n    // Missing key is unlicensed on every host — including localhost. This must\n    // run before the dev short-circuit so a missing env var surfaces the same\n    // unlicensed watermark locally that it would in production.\n    if (normalizedKey.length === 0) {\n      const next = createUnlicensedState()\n      setState(next)\n      onValidateRef.current?.(next)\n      return\n    }\n\n    if (isDevEnvironment()) {\n      const next = createDevBypassState()\n      setState(next)\n      onValidateRef.current?.(next)\n      return\n    }\n\n    try {\n      // Preserve back-compat call shape: when no apiBase override is in play,\n      // call with the same positional surface v1.2.x consumers (and existing\n      // tests) expect. Only widen to the 3-arg form when an apiBase override\n      // is set, since that's the only case that needs it.\n      let result: LicenseState\n      if (apiBase) {\n        result = organizationId\n          ? await validateLicenseKey(normalizedKey, organizationId, { apiBase })\n          : await validateLicenseKey(normalizedKey, undefined, { apiBase })\n      } else if (organizationId) {\n        result = await validateLicenseKey(normalizedKey, organizationId)\n      } else {\n        result = await validateLicenseKey(normalizedKey)\n      }\n      setState(result)\n      onValidateRef.current?.(result)\n    } catch (error) {\n      const errorState: LicenseState = {\n        status: 'error',\n        tier: 'free',\n        activations: 0,\n        maxActivations: 0,\n        domain: null,\n        expiresAt: null,\n        validatedAt: Date.now(),\n        serverValidatedAt: null,\n        renderKey: undefined,\n      }\n      setState(errorState)\n      onErrorRef.current?.(error instanceof Error ? error : new Error(String(error)))\n    }\n  }, [licenseKey, organizationId, apiBase])\n\n  useEffect(() => {\n    validate()\n  }, [validate])\n\n  const refresh = useCallback(async () => {\n    const domain = getCurrentDomain()\n    if (domain) {\n      clearCache(domain)\n    }\n    await validate()\n  }, [validate])\n\n  // Derived gating signals — computed once per state change so consumers\n  // (`useLicenseGate`, `<LicenseGate>`, `<ProGate>`) never read localStorage\n  // on every render. Both gates now share this single source of truth.\n  const { isGated, isLoading, gracePeriodActive } = useMemo(() => {\n    const normalizedKey = normalizeLicenseKey(licenseKey)\n\n    // Dev bypass only applies when a non-empty key is configured. A missing\n    // key on localhost falls through to the normal status-based gating so the\n    // unlicensed watermark appears just like in production.\n    if (isDevEnvironment() && normalizedKey.length > 0) {\n      return { isGated: false, isLoading: false, gracePeriodActive: false }\n    }\n    if (state.status === 'loading') {\n      return { isGated: false, isLoading: true, gracePeriodActive: false }\n    }\n    if (state.status === 'valid' && state.tier === 'pro' && state.renderKey !== undefined) {\n      return { isGated: false, isLoading: false, gracePeriodActive: false }\n    }\n    if (state.status === 'error') {\n      const domain = getCurrentDomain()\n      // Use the normalized key so the hash matches what polar-client writes.\n      const grace = domain ? hasFreshCache(domain, normalizedKey) : false\n      return { isGated: !grace, isLoading: false, gracePeriodActive: grace }\n    }\n    return { isGated: true, isLoading: false, gracePeriodActive: false }\n  }, [state, licenseKey])\n\n  // Trial slice — client-derived from issuedAt + trialDays because Polar's\n  // validate endpoint has no `tier` field (Phase 0 task 0.6, memory #187).\n  const trial = useMemo<TrialContextValue | null>(() => {\n    if (trialDays === undefined) return null\n    if (trialDays <= 0) {\n      if (process.env.NODE_ENV !== 'production') {\n        logger.warn('<LicenseProvider> received non-positive trialDays; ignoring')\n      }\n      return null\n    }\n    const issuedAt = trialIssuedAt ?? state.serverValidatedAt ?? state.validatedAt\n    if (!issuedAt || issuedAt <= 0) return null\n    const daysLeft = getDaysLeft({\n      issuedAt,\n      trialDays,\n      validatedAt: state.validatedAt,\n      serverValidatedAt: state.serverValidatedAt,\n    })\n    return { daysLeft, isTrialing: daysLeft > 0 }\n  }, [trialDays, trialIssuedAt, state.validatedAt, state.serverValidatedAt])\n\n  const contextValue = useMemo<LicenseContextValue>(\n    () => ({ state, refresh, isGated, isLoading, gracePeriodActive, trial }),\n    [state, refresh, isGated, isLoading, gracePeriodActive, trial]\n  )\n\n  return (\n    <LicenseContext.Provider value={contextValue}>\n      <LicenseRenderContext.Provider value={state.renderKey}>\n        {children}\n      </LicenseRenderContext.Provider>\n    </LicenseContext.Provider>\n  )\n}\n","'use client'\n\nimport { useEffect } from 'react'\n\n// Module-level guard so the unlicensed warning prints once per page load even\n// when several Pro packages each mount a <LicenseGate> (and therefore a\n// <LicenseWarning>). Also absorbs React Strict Mode's double effect invocation.\nlet hasWarned = false\n\n/** Test-only: reset the once-per-session warning guard. */\nexport function __resetLicenseWarningForTests(): void {\n  hasWarned = false\n}\n\nexport function LicenseWarning() {\n  useEffect(() => {\n    if (process.env.NODE_ENV === 'production') return\n    if (hasWarned) return\n    hasWarned = true\n\n    console.warn(\n      '%c[TourKit]%c This application is using Tour Kit Pro without a valid license.\\nPurchase a license at https://usertourkit.com/pricing',\n      'color: #e74c3c; font-weight: bold',\n      'color: inherit'\n    )\n  }, [])\n\n  return null\n}\n","'use client'\n\nimport { type CSSProperties, useEffect, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nconst WATERMARK_URL =\n  'https://usertourkit.com/pricing?utm_source=unlicensed_badge&utm_medium=in_app&utm_campaign=watermark'\n\nconst wrapperStyle: CSSProperties = {\n  position: 'fixed',\n  right: '16px',\n  bottom: '16px',\n  zIndex: 2147483647,\n  pointerEvents: 'none',\n  fontFamily:\n    '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n}\n\nconst linkStyle: CSSProperties = {\n  pointerEvents: 'auto',\n  display: 'inline-flex',\n  alignItems: 'center',\n  gap: '8px',\n  padding: '6px 10px',\n  borderRadius: '8px',\n  background: 'rgba(17, 24, 39, 0.92)',\n  color: '#fff',\n  fontSize: '12px',\n  lineHeight: 1.2,\n  textDecoration: 'none',\n  boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n}\n\nconst logoStyle: CSSProperties = {\n  width: '14px',\n  height: '14px',\n  flexShrink: 0,\n}\n\nconst labelStyle: CSSProperties = {\n  fontWeight: 600,\n}\n\nconst ctaStyle: CSSProperties = {\n  marginLeft: '6px',\n  opacity: 0.85,\n  textDecoration: 'underline',\n}\n\nfunction UserTourKitLogo() {\n  return (\n    <svg\n      style={logoStyle}\n      viewBox=\"0 0 926 1342\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n    >\n      <path\n        d=\"M637.387 360.13C637.387 374.436 625.773 386.063 611.467 386.063H314.227C299.933 386.063 288.307 374.436 288.307 360.13C288.307 345.85 299.933 334.223 314.227 334.223H611.467C625.773 334.223 637.387 345.85 637.387 360.13Z\"\n        fill=\"#FFE20A\"\n      />\n      <path\n        d=\"M552.533 205.048V280.568H373.16V205.048C373.16 155.595 413.387 115.355 462.853 115.355C512.307 115.355 552.533 155.595 552.533 205.048Z\"\n        fill=\"#FFE20A\"\n      />\n      <path\n        d=\"M309.12 528.716L268.013 828.143C242.453 830.89 217.32 838.05 194.227 849.237C147.24 872.01 93.3601 872.01 46.3734 849.237L0 826.743V564.53C0 544.756 16.0267 528.716 35.8 528.716H309.12Z\"\n        fill=\"#0197F6\"\n      />\n      <path\n        d=\"M925.707 564.53V826.743L879.333 849.237C832.64 871.85 779.16 872.01 732.4 849.677L731.453 849.223C708.373 838.037 683.24 830.89 657.68 828.143L616.573 528.717H889.907C909.68 528.717 925.707 544.757 925.707 564.53Z\"\n        fill=\"#0197F6\"\n      />\n      <path\n        d=\"M813.68 1181.04C726.36 1282.76 599.44 1341.85 462.853 1341.85C326.253 1341.85 199.347 1282.76 112.027 1181.04C148.187 1182.36 184.56 1174.93 217.64 1158.89C240.56 1147.8 266.12 1141.92 291.573 1141.92C316.573 1141.92 341.68 1147.57 364.267 1158.3L365.507 1158.89C395.667 1173.52 429.32 1181.25 462.853 1181.25C496.333 1181.25 529.96 1173.53 560.08 1158.94L560.187 1158.89C606.867 1136.26 660.36 1136.12 707.12 1158.44L708.067 1158.89C741.147 1174.93 777.52 1182.36 813.68 1181.04Z\"\n        fill=\"#0197F6\"\n      />\n      <path\n        d=\"M925.64 886.41C924.333 968.836 901.293 1048.9 858.707 1118.98C817.36 1132.68 771.84 1129.89 732.373 1111.06L731.453 1110.62C701.307 1096 667.64 1088.26 634.12 1088.26C600.627 1088.26 566.973 1096 536.84 1110.58L536.773 1110.62C490.24 1133.2 436.893 1133.38 390.213 1111.25L388.907 1110.61C358.747 1096 325.08 1088.26 291.574 1088.26C258.054 1088.26 224.4 1096 194.227 1110.62C154.56 1129.85 108.667 1132.78 67.0001 1118.98C24.4134 1048.9 1.36013 968.836 0.0534668 886.41L22.9602 897.517C53.1336 912.143 86.7869 919.863 120.294 919.863C153.827 919.863 187.48 912.143 217.64 897.517C240.534 886.41 266.107 880.543 291.574 880.543C317.04 880.543 342.613 886.41 365.52 897.517C395.68 912.143 429.333 919.863 462.853 919.863C496.32 919.863 529.933 912.157 560.067 897.57L560.187 897.503C606.867 874.89 660.36 874.717 707.133 897.063L708.067 897.517C738.213 912.143 771.88 919.863 805.4 919.863C838.92 919.863 872.573 912.143 902.733 897.517L925.64 886.41Z\"\n        fill=\"#0197F6\"\n      />\n      <path\n        d=\"M798.72 280.568H625.974C611.16 280.568 599.16 268.554 599.16 253.741C599.16 238.928 611.16 226.915 625.974 226.915H798.72C813.534 226.915 825.534 238.928 825.534 253.741C825.534 268.554 813.534 280.568 798.72 280.568Z\"\n        fill=\"#0197F6\"\n      />\n      <path\n        d=\"M582.947 135.515C574.987 123.021 578.64 106.434 591.133 98.4744L738.853 4.20775C751.347 -3.75225 767.933 -0.085535 775.893 12.3945C783.867 24.8878 780.2 41.4745 767.707 49.4478L620 143.701C607.507 151.661 590.92 148.008 582.947 135.515Z\"\n        fill=\"#0197F6\"\n      />\n      <path\n        d=\"M299.72 280.568H126.987C112.173 280.568 100.173 268.554 100.173 253.741C100.173 238.928 112.173 226.915 126.987 226.915H299.72C314.547 226.915 326.547 238.928 326.547 253.741C326.547 268.554 314.547 280.568 299.72 280.568Z\"\n        fill=\"#0197F6\"\n      />\n      <path\n        d=\"M305.707 143.701L158 49.4478C145.507 41.4745 141.84 24.8878 149.813 12.3945C157.773 -0.085535 174.36 -3.75225 186.853 4.20775L334.574 98.4744C347.067 106.434 350.72 123.021 342.76 135.515C334.787 148.008 318.2 151.661 305.707 143.701Z\"\n        fill=\"#0197F6\"\n      />\n      <path\n        d=\"M503.213 638.796C503.213 643.29 499.573 646.93 495.093 646.93H430.613C426.133 646.93 422.493 643.29 422.493 638.796V596.583C422.493 574.29 440.56 556.223 462.853 556.223C474 556.223 484.093 560.73 491.387 568.036C498.693 575.343 503.213 585.436 503.213 596.583V638.796ZM550.2 439.703H375.507L322.04 829.01C345.213 832.223 367.907 839.05 388.92 849.236C411.827 860.343 437.4 866.21 462.853 866.21C488.307 866.21 513.867 860.343 536.773 849.236L536.787 849.223C536.787 849.223 536.787 849.223 536.8 849.223L536.867 849.196C557.853 839.023 580.52 832.196 603.653 828.996L550.2 439.703Z\"\n        fill=\"#FFE20A\"\n      />\n    </svg>\n  )\n}\n\ntype WindowWithAnalytics = Window & {\n  gtag?: (event: 'event', name: string, params: Record<string, unknown>) => void\n  dataLayer?: Array<Record<string, unknown>>\n}\n\ntype WatermarkInstance = {\n  id: symbol\n  setOwner: (isOwner: boolean) => void\n}\n\nconst instances: WatermarkInstance[] = []\nlet ownerId: symbol | null = null\n\nfunction electOwner(): void {\n  ownerId = instances[0]?.id ?? null\n  for (const instance of instances) {\n    instance.setOwner(instance.id === ownerId)\n  }\n}\n\nfunction dispatchClickEvent(): void {\n  if (typeof window === 'undefined') return\n\n  const win = window as WindowWithAnalytics\n  const hostname = window.location?.hostname ?? ''\n  const payload = {\n    placement: 'watermark',\n    hostname,\n  }\n\n  try {\n    if (typeof win.gtag === 'function') {\n      win.gtag('event', 'unlicensed_badge_clicked', payload)\n      return\n    }\n    if (Array.isArray(win.dataLayer)) {\n      win.dataLayer.push({ event: 'unlicensed_badge_clicked', ...payload })\n    }\n  } catch {\n    // Analytics dispatch must never throw.\n  }\n}\n\nexport function LicenseWatermark() {\n  const [isOwner, setIsOwner] = useState(false)\n  const [mounted, setMounted] = useState(false)\n\n  useEffect(() => {\n    setMounted(true)\n    const entry: WatermarkInstance = {\n      id: Symbol('watermark'),\n      setOwner: setIsOwner,\n    }\n    instances.push(entry)\n    electOwner()\n\n    return () => {\n      const idx = instances.findIndex((x) => x.id === entry.id)\n      if (idx !== -1) instances.splice(idx, 1)\n      electOwner()\n    }\n  }, [])\n\n  if (!mounted || !isOwner) return null\n  if (typeof document === 'undefined') return null\n\n  return createPortal(\n    <section\n      data-tourkit-watermark=\"\"\n      aria-label=\"userTourKit license required\"\n      style={wrapperStyle}\n    >\n      <a\n        href={WATERMARK_URL}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        style={linkStyle}\n        onClick={dispatchClickEvent}\n        aria-label=\"userTourKit unlicensed — remove this badge with a one-time $99 license\"\n      >\n        <UserTourKitLogo />\n        <span style={labelStyle}>userTourKit</span>\n        <span aria-hidden=\"true\">·</span>\n        <span>Unlicensed</span>\n        <span style={ctaStyle}>Remove for $99</span>\n      </a>\n    </section>,\n    document.body\n  )\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { LicenseContext } from '../context/license-context'\nimport { isDevEnvironment } from '../lib/domain'\nimport type { LicenseGateProps } from '../types'\nimport { LicenseWarning } from './license-warning'\nimport { LicenseWatermark } from './license-watermark'\n\n/**\n * Soft gate for Tour Kit Pro packages.\n *\n * Renders children unconditionally; on non-localhost hosts without a valid\n * license, layers a single small badge ({@link LicenseWatermark}) and a\n * dev-only console warning ({@link LicenseWarning}) on top. Tolerates a\n * missing `<LicenseProvider>` so Pro packages stay rendered during evaluation.\n */\nexport function LicenseGate({ require: _require, children, fallback, loading }: LicenseGateProps) {\n  const context = useContext(LicenseContext)\n\n  // No-provider branch. Provider's internal dev short-circuit cannot help here,\n  // so check the host directly to keep localhost quiet.\n  if (context === null) {\n    if (isDevEnvironment()) return <>{children}</>\n    return (\n      <>\n        {children}\n        <LicenseWatermark />\n        <LicenseWarning />\n      </>\n    )\n  }\n\n  // Loading default is children, not null: `useEffect` doesn't fire during SSR,\n  // so the loading state is the *only* state the server ever sees. Returning\n  // null here blanks every Pro provider's subtree in SSR HTML and forces a\n  // post-hydration pop-in. Consumers who want a skeleton still pass `loading`.\n  if (context.isLoading) return <>{loading ?? children}</>\n  if (!context.isGated) return <>{children}</>\n  if (fallback) return <>{fallback}</>\n\n  return (\n    <>\n      {children}\n      <LicenseWatermark />\n      <LicenseWarning />\n    </>\n  )\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { LicenseContext } from '../context/license-context'\nimport { isDevEnvironment } from '../lib/domain'\n\nexport interface LicenseGateResult {\n  /** True if the component should be blocked (show placeholder) */\n  isGated: boolean\n  /** True while license validation is in progress */\n  isLoading: boolean\n}\n\n/**\n * Determines whether a pro component should render or show a placeholder.\n *\n * Provider state wins over hostname. When `<LicenseProvider>` is mounted, the\n * provider's derived `isGated`/`isLoading` flags drive the result so a missing\n * key on localhost still surfaces as gated. Only when no provider is in the\n * tree do we fall back to the hostname check — at that point we have no key to\n * inspect, so localhost stays quiet.\n *\n * Provider-derived signals (see LicenseProvider for the full table):\n * - status 'loading' → not gated, isLoading=true (avoid flash)\n * - status 'valid' + pro + renderKey → not gated\n * - status 'error' + fresh cache → not gated (grace period)\n * - status 'error' + no cache → gated\n * - status 'invalid' / 'expired' / 'revoked' → gated\n *\n * No-provider fallback:\n * - dev host → not gated (cannot inspect a key that does not exist)\n * - non-dev host → gated\n */\nexport function useLicenseGate(): LicenseGateResult {\n  const context = useContext(LicenseContext)\n\n  // Provider precedence: when a `<LicenseProvider>` is in the tree, trust its\n  // derived gate state. The provider already accounts for the dev bypass for\n  // non-empty keys and falls through to gated state when the key is missing.\n  if (context !== null) {\n    return { isGated: context.isGated, isLoading: context.isLoading }\n  }\n\n  // No provider — fall back to the hostname check. Locally we cannot tell\n  // whether a key was configured, so stay quiet on dev hosts.\n  if (isDevEnvironment()) {\n    return { isGated: false, isLoading: false }\n  }\n\n  return { isGated: true, isLoading: false }\n}\n","'use client'\n\nimport * as React from 'react'\nimport { useLicenseGate } from '../hooks/use-license-gate'\n\nexport interface ProGateProps {\n  /** The npm package name being gated (shown in placeholder + console) */\n  package: string\n  children: React.ReactNode\n}\n\nconst placeholderContainerStyles: React.CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  padding: '24px',\n  minHeight: '80px',\n  border: '1px solid #e5e7eb',\n  borderRadius: '8px',\n  backgroundColor: '#f9fafb',\n  fontFamily:\n    '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n}\n\nconst placeholderInnerStyles: React.CSSProperties = {\n  textAlign: 'center',\n  maxWidth: '400px',\n}\n\nconst titleStyles: React.CSSProperties = {\n  margin: '0 0 8px 0',\n  fontSize: '14px',\n  fontWeight: 600,\n  color: '#374151',\n}\n\nconst packageStyles: React.CSSProperties = {\n  display: 'block',\n  marginBottom: '8px',\n  fontSize: '12px',\n  fontFamily: 'monospace',\n  color: '#6b7280',\n}\n\nconst linkStyles: React.CSSProperties = {\n  fontSize: '13px',\n  color: '#2563eb',\n  textDecoration: 'underline',\n}\n\n/**\n * Hard gate for Tour Kit Pro packages.\n * Renders children when licensed, a branded placeholder when not.\n * Dev environments (localhost, 127.0.0.1, *.local) always render children.\n */\nexport function ProGate({ package: packageName, children }: ProGateProps) {\n  const { isGated, isLoading } = useLicenseGate()\n  const warnedRef = React.useRef(false)\n\n  React.useEffect(() => {\n    if (isGated && !isLoading && !warnedRef.current) {\n      warnedRef.current = true\n      console.error(\n        `[${packageName}] Tour Kit Pro license required. Add a <LicenseProvider> with a valid license key. Get one at https://usertourkit.com/pricing`\n      )\n    }\n  }, [isGated, isLoading, packageName])\n\n  // Loading or licensed — render children\n  if (!isGated) {\n    return <>{children}</>\n  }\n\n  // Gated — render placeholder\n  return (\n    // biome-ignore lint/a11y/useSemanticElements: role=status for live-region announcement, no semantic element fits\n    <div style={placeholderContainerStyles} role=\"status\" aria-label=\"License required\">\n      <div style={placeholderInnerStyles}>\n        <p style={titleStyles}>Tour Kit Pro license required</p>\n        <span style={packageStyles}>{packageName}</span>\n        <a\n          href=\"https://usertourkit.com/pricing\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          style={linkStyles}\n        >\n          Get a license →\n        </a>\n      </div>\n    </div>\n  )\n}\n","'use client'\n\nimport { logger } from '@tour-kit/core'\nimport { useContext } from 'react'\nimport { LicenseContext } from '../context/license-context'\n\nexport type TrialBadgeRenderProps = {\n  daysLeft: number\n  isTrialing: boolean\n  isUrgent: boolean\n}\n\nexport type TrialBadgeProps = {\n  /** Override daysLeft from context. When omitted, reads from `useLicense().trial.daysLeft`. */\n  daysLeft?: number\n  /** URL the Upgrade CTA links to. Defaults to the @tour-kit/license pricing page. */\n  pricingUrl?: string\n  /** Custom render — receives the resolved daysLeft + isTrialing/isUrgent flags. */\n  children?: (props: TrialBadgeRenderProps) => React.ReactNode\n  className?: string\n}\n\nconst UPGRADE_CTA_THRESHOLD = 3\nconst DEFAULT_PRICING_URL = 'https://usertourkit.com/pricing'\n\n/**\n * Trial countdown surface. Renders \"{n} days left\" when above the threshold;\n * renders an Upgrade `<a>` when `daysLeft <= 3`. Renders `null` (and warns\n * once in dev) when no `daysLeft` prop is passed and no `trial` slice exists\n * on the surrounding `<LicenseProvider>`.\n */\nexport function TrialBadge({\n  daysLeft: daysLeftProp,\n  pricingUrl,\n  children,\n  className,\n}: TrialBadgeProps) {\n  const ctx = useContext(LicenseContext)\n  const fromContext = ctx?.trial?.daysLeft\n  const resolved = daysLeftProp ?? fromContext\n\n  if (resolved === undefined) {\n    if (process.env.NODE_ENV !== 'production') {\n      logger.warn(\n        '<TrialBadge> rendered without trialDays — pass trialDays to <LicenseProvider> to enable the trial countdown surface.'\n      )\n    }\n    return null\n  }\n\n  const isTrialing = resolved > 0\n  const isUrgent = resolved <= UPGRADE_CTA_THRESHOLD\n\n  if (children) {\n    return <>{children({ daysLeft: resolved, isTrialing, isUrgent })}</>\n  }\n\n  if (!isTrialing || isUrgent) {\n    return (\n      <a\n        href={pricingUrl ?? DEFAULT_PRICING_URL}\n        className={className}\n        data-trial-state=\"upgrade\"\n        aria-label=\"Upgrade — trial ending soon\"\n      >\n        Upgrade\n      </a>\n    )\n  }\n\n  return (\n    <span\n      className={className}\n      data-trial-state=\"active\"\n      aria-label={`${resolved} days left in trial`}\n    >\n      {resolved} days left\n    </span>\n  )\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { LicenseContext } from '../context/license-context'\nimport { isDevEnvironment } from '../lib/domain'\n\nexport type LicenseDebugPanelProps = {\n  className?: string\n  /**\n   * When false (default), renders null in production. Set true to force-render\n   * at consumer's risk — strongly discouraged. Useful only for staging branches\n   * where NODE_ENV is misconfigured.\n   */\n  showInProduction?: boolean\n}\n\nfunction readEnvLicenseKey(): boolean {\n  if (typeof process === 'undefined') return false\n  // biome-ignore lint/complexity/useLiteralKeys: dynamic env access avoids bundler inlining\n  return Boolean(process.env?.['NEXT_PUBLIC_TOUR_KIT_LICENSE_KEY'])\n}\n\n/**\n * Drop into a dev or admin route to inspect the current license state. Renders\n * nothing in production by default. Specifically replaces the ambiguous\n * `status: valid, renderKey: dev_bypass` log line that the dashboard-next demo\n * surfaced as confusing — when dev bypass is active, the panel renders the\n * literal copy \"🟢 Dev bypass active (NEXT_PUBLIC_TOUR_KIT_LICENSE_KEY set,\n * hostname=localhost)\" so it is unambiguous what is happening.\n */\nexport function LicenseDebugPanel({ className, showInProduction = false }: LicenseDebugPanelProps) {\n  const ctx = useContext(LicenseContext)\n  const inProd = process.env.NODE_ENV === 'production'\n  if (inProd && !showInProduction) return null\n  if (!ctx) return null\n\n  const { state, trial } = ctx\n  const devBypassActive = state.renderKey === 'dev_bypass'\n  const localhost = isDevEnvironment()\n  const hasEnvKey = readEnvLicenseKey()\n\n  return (\n    <section\n      className={className}\n      data-tourkit-license-debug-panel=\"\"\n      aria-label=\"Tour Kit license debug panel\"\n    >\n      <h2>Tour Kit License — Debug</h2>\n      {devBypassActive ? (\n        <p data-state=\"dev-bypass\">\n          🟢 Dev bypass active ({hasEnvKey ? 'NEXT_PUBLIC_TOUR_KIT_LICENSE_KEY set' : 'no env key'},\n          hostname={localhost ? 'localhost' : 'production'})\n        </p>\n      ) : (\n        <p data-state={state.status}>\n          Status: <strong>{state.status}</strong> · Tier: <strong>{state.tier}</strong> · Domain:{' '}\n          <strong>{state.domain ?? 'unset'}</strong>\n        </p>\n      )}\n      {trial ? (\n        <p data-trial-active={trial.isTrialing}>\n          Trial: <strong>{trial.daysLeft}</strong> days left\n        </p>\n      ) : null}\n    </section>\n  )\n}\n","'use client'\n\nimport { useEffect, useMemo } from 'react'\nimport { LicenseContext, LicenseRenderContext } from '../context/license-context'\nimport type { LicenseContextValue, LicenseState } from '../types'\n\nexport type LicenseTestModeProps =\n  | { tier: 'invalid'; children: React.ReactNode }\n  | { tier: 'pro'; children: React.ReactNode }\n  | { tier: 'free'; children: React.ReactNode }\n\n/**\n * QA-only: override `<LicenseProvider>` context with a simulated state so the\n * watermark, adoption gate, and Pro fallbacks can be verified on a real\n * production-like domain without unsetting `NEXT_PUBLIC_TOUR_KIT_LICENSE_KEY`\n * or hitting the live Polar API.\n *\n * MUST NOT be imported from application src/. Use only in __tests__/ and\n * examples/. Enforced by `packages/license/scripts/check-license-test-mode.mjs`.\n * Production use also emits a loud `console.warn` so an accidental ship is\n * detectable in the browser console.\n */\nexport function LicenseTestMode(props: LicenseTestModeProps) {\n  const { tier, children } = props\n\n  useEffect(() => {\n    if (process.env.NODE_ENV === 'production') {\n      console.warn(\n        '<LicenseTestMode> active in production — this overrides real license state and MUST be removed before deploy.'\n      )\n    }\n  }, [])\n\n  const value = useMemo<LicenseContextValue>(() => {\n    const now = Date.now()\n    let state: LicenseState\n    if (tier === 'pro') {\n      state = {\n        status: 'valid',\n        tier: 'pro',\n        activations: 1,\n        maxActivations: 5,\n        domain: 'test-mode.local',\n        expiresAt: null,\n        validatedAt: now,\n        serverValidatedAt: null,\n        renderKey: 'test_mode_pro',\n      }\n    } else if (tier === 'free') {\n      state = {\n        status: 'valid',\n        tier: 'free',\n        activations: 0,\n        maxActivations: 0,\n        domain: null,\n        expiresAt: null,\n        validatedAt: now,\n        serverValidatedAt: null,\n        renderKey: undefined,\n      }\n    } else {\n      state = {\n        status: 'invalid',\n        tier: 'free',\n        activations: 0,\n        maxActivations: 0,\n        domain: null,\n        expiresAt: null,\n        validatedAt: now,\n        serverValidatedAt: null,\n        renderKey: undefined,\n      }\n    }\n\n    return {\n      state,\n      refresh: async () => {},\n      isGated: tier !== 'pro',\n      isLoading: false,\n      gracePeriodActive: false,\n      trial: null,\n    }\n  }, [tier])\n\n  return (\n    <LicenseContext.Provider value={value}>\n      <LicenseRenderContext.Provider value={value.state.renderKey}>\n        {children}\n      </LicenseRenderContext.Provider>\n    </LicenseContext.Provider>\n  )\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { LicenseContext } from '../context/license-context'\nimport type { LicenseContextValue } from '../types'\n\nexport function useLicense(): LicenseContextValue {\n  const context = useContext(LicenseContext)\n  if (context === null) {\n    throw new Error('useLicense must be used within a <LicenseProvider>')\n  }\n  return context\n}\n","'use client'\n\nimport { useLicense } from './use-license'\n\nexport function useIsPro(): boolean {\n  const { state } = useLicense()\n  return state.status === 'valid' && state.tier === 'pro'\n}\n"]}