{
  "version": 3,
  "sources": ["/cdn/shop/t/20/assets/cf-countdown.js?cfv=60"],
  "sourcesContent": ["/*\n * <cf-countdown> \u2014 ticks down to either a fixed datetime or a recurring weekly\n * cutoff, both resolved in a named timezone rather than the visitor's.\n *\n * The weekly mode exists because the store's real ordering rhythm is a Sunday\n * 8PM Pacific cutoff, so the homepage can show the same deadline the preorder\n * pages enforce without anyone editing a date every week.\n *\n * Attributes:\n *   mode=\"weekly|fixed\"\n *   weekday=\"0-6\"      (weekly, 0 = Sunday)\n *   hour=\"0-23\"        (weekly)\n *   minute=\"0-59\"      (weekly)\n *   deadline=\"YYYY-MM-DDTHH:MM\"  (fixed, wall time in `timezone`)\n *   timezone=\"America/Los_Angeles\"\n */\nclass CFCountdown extends HTMLElement {\n  connectedCallback() {\n    this.timezone = this.getAttribute('timezone') || 'America/Los_Angeles';\n    this.mode = this.getAttribute('mode') === 'fixed' ? 'fixed' : 'weekly';\n    this.output = this.querySelector('[data-cf-countdown-output]');\n    this.expiredText = this.getAttribute('expired-text') || '';\n    if (!this.output) return;\n    this.tick();\n    this.timer = setInterval(() => this.tick(), 1000);\n  }\n\n  disconnectedCallback() {\n    clearInterval(this.timer);\n  }\n\n  /* Offset in ms between the given instant and how the zone displays it. */\n  zoneOffset(instant) {\n    const dtf = new Intl.DateTimeFormat('en-US', {\n      timeZone: this.timezone,\n      hour12: false,\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n      hour: '2-digit',\n      minute: '2-digit',\n      second: '2-digit',\n    });\n    const parts = {};\n    for (const { type, value } of dtf.formatToParts(instant)) parts[type] = value;\n    const asUTC = Date.UTC(\n      Number(parts.year),\n      Number(parts.month) - 1,\n      Number(parts.day),\n      Number(parts.hour) % 24,\n      Number(parts.minute),\n      Number(parts.second)\n    );\n    return asUTC - instant;\n  }\n\n  /* Convert a wall-clock time in the zone into a real instant. */\n  wallTimeToInstant(y, m, d, h, min) {\n    const guess = Date.UTC(y, m - 1, d, h, min, 0);\n    return guess - this.zoneOffset(guess);\n  }\n\n  zoneParts(instant) {\n    const dtf = new Intl.DateTimeFormat('en-US', {\n      timeZone: this.timezone,\n      hour12: false,\n      weekday: 'short',\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n    });\n    const parts = {};\n    for (const { type, value } of dtf.formatToParts(instant)) parts[type] = value;\n    const weekdays = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };\n    return {\n      year: Number(parts.year),\n      month: Number(parts.month),\n      day: Number(parts.day),\n      weekday: weekdays[parts.weekday],\n    };\n  }\n\n  target(now) {\n    if (this.mode === 'fixed') {\n      const raw = this.getAttribute('deadline') || '';\n      const m = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2}))?/);\n      if (!m) return null;\n      return this.wallTimeToInstant(+m[1], +m[2], +m[3], m[4] ? +m[4] : 0, m[5] ? +m[5] : 0);\n    }\n\n    const weekday = Number(this.getAttribute('weekday') ?? 0);\n    const hour = Number(this.getAttribute('hour') ?? 20);\n    const minute = Number(this.getAttribute('minute') ?? 0);\n    const today = this.zoneParts(now);\n    const daysAhead = (weekday - today.weekday + 7) % 7;\n\n    // Advance the zone's calendar date by whole days, then resolve the wall time\n    const base = Date.UTC(today.year, today.month - 1, today.day) + daysAhead * 86400000;\n    const cal = new Date(base);\n    let instant = this.wallTimeToInstant(\n      cal.getUTCFullYear(),\n      cal.getUTCMonth() + 1,\n      cal.getUTCDate(),\n      hour,\n      minute\n    );\n    if (instant <= now) {\n      const next = new Date(base + 7 * 86400000);\n      instant = this.wallTimeToInstant(\n        next.getUTCFullYear(),\n        next.getUTCMonth() + 1,\n        next.getUTCDate(),\n        hour,\n        minute\n      );\n    }\n    return instant;\n  }\n\n  tick() {\n    const now = Date.now();\n    const target = this.target(now);\n    if (target === null) return;\n\n    let remaining = Math.max(0, target - now);\n    if (remaining === 0 && this.mode === 'fixed') {\n      this.output.textContent = this.expiredText;\n      this.setAttribute('data-expired', '');\n      clearInterval(this.timer);\n      return;\n    }\n\n    const total = Math.floor(remaining / 1000);\n    const days = Math.floor(total / 86400);\n    const hours = Math.floor((total % 86400) / 3600);\n    const minutes = Math.floor((total % 3600) / 60);\n    const seconds = total % 60;\n\n    const pad = (n) => String(n).padStart(2, '0');\n    const segments = [\n      [days, days === 1 ? 'day' : 'days'],\n      [pad(hours), 'hrs'],\n      [pad(minutes), 'min'],\n      [pad(seconds), 'sec'],\n    ];\n\n    this.output.innerHTML = segments\n      .map(\n        ([value, label]) =>\n          `<span class=\"cf-countdown__segment\"><span class=\"cf-countdown__value\">${value}</span><span class=\"cf-countdown__label\">${label}</span></span>`\n      )\n      .join('');\n  }\n}\n\nif (!customElements.get('cf-countdown')) {\n  customElements.define('cf-countdown', CFCountdown);\n}\n"],
  "mappings": "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",
  "names": []
}
