zero-hour 1.3.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["DEFAULT_CSS_TEXT"],"sources":["../src/index.ts"],"sourcesContent":["import './zero-hour.css';\nimport DEFAULT_CSS_TEXT from './zero-hour.css?inline';\n\nexport const zeroHourCssText: string = DEFAULT_CSS_TEXT;\n\nfunction digitToSheetIndex(d: string): number {\n const n = d.charCodeAt(0) - 48;\n\n if (n >= 0 && n <= 9) return n;\n\n return 0;\n}\n\nfunction clampNonNegative(n: number): number {\n return n < 0 ? 0 : n;\n}\n\ntype Dhms = { d: number; h: number; m: number; s: number; totalSec: number };\n\nconst DEFAULT_UNITS = {\n showDays: true,\n showHours: true,\n showMinutes: true,\n showSeconds: true,\n} as const;\n\nconst ZERO_TIME = { hours: 0, minutes: 0, seconds: 0 } as const;\n\ntype StylesInput = CSSStyleSheet | string | null | undefined;\n\nfunction supportsAdoptedStyleSheets(root: ShadowRoot): boolean {\n return 'adoptedStyleSheets' in root;\n}\n\nfunction makeConstructableSheet(cssText: string): CSSStyleSheet | null {\n try {\n const sheet = new CSSStyleSheet();\n\n sheet.replaceSync(cssText);\n\n return sheet;\n } catch {\n return null;\n }\n}\n\nconst DEFAULT_STYLESHEET = makeConstructableSheet(DEFAULT_CSS_TEXT);\n\nfunction msToDhms(ms: number): Dhms {\n const totalSec = Math.floor(ms / 1000);\n const s = totalSec % 60;\n const m = Math.floor(totalSec / 60) % 60;\n const hTotal = Math.floor(totalSec / 3600);\n const d = Math.floor(hTotal / 24);\n const h = hTotal % 24;\n\n return { d, h, m, s, totalSec };\n}\n\nfunction pad2(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nfunction toDigitChars(n: number, minDigits: number): string[] {\n const str = String(n).padStart(minDigits, '0');\n\n return [...str];\n}\n\nfunction hasBoolAttr(el: HTMLElement, name: string, defaultValue: boolean): boolean {\n if (!el.hasAttribute(name)) return defaultValue;\n\n const raw = el.getAttribute(name);\n\n if (raw == null || raw === '') return true;\n\n return raw !== 'false';\n}\n\nfunction parseYmdDate(raw: string | null): { year: number; month: number; day: number } | null {\n if (raw == null) return null;\n\n const trimmed = raw.trim();\n\n if (!trimmed) return null;\n\n const m = trimmed.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n\n if (!m) return null;\n\n const year = Number(m[1]);\n const month = Number(m[2]);\n const day = Number(m[3]);\n\n if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) return null;\n\n return { year, month, day };\n}\n\nfunction parseHmsTime(raw: string | null): {\n hours: number;\n minutes: number;\n seconds: number;\n} {\n if (raw == null) return { ...ZERO_TIME };\n\n const trimmed = raw.trim();\n\n if (!trimmed) return { ...ZERO_TIME };\n\n const parts = trimmed.split(':');\n const h = Number(parts[0] ?? '0');\n const m = Number(parts[1] ?? '0');\n const s = Number(parts[2] ?? '0');\n\n return {\n hours: Number.isFinite(h) ? h : 0,\n minutes: Number.isFinite(m) ? m : 0,\n seconds: Number.isFinite(s) ? s : 0,\n };\n}\n\nfunction parseHmsTimeStrict(\n raw: string | null,\n): { hours: number; minutes: number; seconds: number } | null {\n if (raw == null) return null;\n\n const trimmed = raw.trim();\n\n if (!trimmed) return null;\n\n const m = trimmed.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/);\n\n if (!m) return null;\n\n const hours = Number(m[1]);\n const minutes = Number(m[2]);\n const seconds = Number(m[3] ?? '0');\n\n if (!Number.isFinite(hours) || !Number.isFinite(minutes) || !Number.isFinite(seconds))\n return null;\n\n if (hours < 0 || hours > 23) return null;\n if (minutes < 0 || minutes > 59) return null;\n if (seconds < 0 || seconds > 59) return null;\n\n return { hours, minutes, seconds };\n}\n\nfunction parseUtcOffsetMinutes(raw: string | null): number | null {\n if (raw == null) return null;\n\n let trimmed = raw.trim();\n\n if (!trimmed) return null;\n\n if (/^utc/i.test(trimmed)) {\n trimmed = trimmed.slice(3);\n }\n\n let sign = 1;\n\n if (trimmed[0] === '+') {\n trimmed = trimmed.slice(1);\n } else if (trimmed[0] === '-') {\n sign = -1;\n trimmed = trimmed.slice(1);\n }\n\n if (!trimmed) return null;\n\n const [hStr, mStr = '0'] = trimmed.split(':');\n const h = Number(hStr);\n const m = Number(mStr);\n\n if (!Number.isFinite(h) || !Number.isFinite(m)) return null;\n\n const totalMinutes = h * 60 + m;\n\n return sign * totalMinutes;\n}\n\ntype ZeroHourQueryOverrides = {\n date?: string;\n time?: string;\n utc?: string;\n units?: string;\n};\n\nfunction readZeroHourQueryOverrides(): ZeroHourQueryOverrides | null {\n if (typeof window === 'undefined') return null;\n if (!('location' in window)) return null;\n\n const search = window.location?.search ?? '';\n\n if (!search) return null;\n\n const sp = new URLSearchParams(search);\n const overrides: ZeroHourQueryOverrides = {};\n\n const date = sp.get('date')?.trim();\n\n if (date) overrides.date = date;\n\n const time = sp.get('time')?.trim();\n\n if (time) overrides.time = time;\n\n const utc = sp.get('utc')?.trim();\n\n if (utc) overrides.utc = utc;\n\n const units = sp.get('units')?.trim();\n\n if (units) overrides.units = units;\n\n return Object.keys(overrides).length ? overrides : null;\n}\n\nfunction parseUnitsPattern(raw: string | null): {\n showDays: boolean;\n showHours: boolean;\n showMinutes: boolean;\n showSeconds: boolean;\n} {\n const pattern = (raw ?? '').trim().toLowerCase();\n\n if (!pattern) {\n return DEFAULT_UNITS;\n }\n\n const parts = pattern\n .split(':')\n .map((p) => p.trim())\n .filter(Boolean);\n\n if (!parts.length) {\n return DEFAULT_UNITS;\n }\n\n const set = new Set(parts);\n\n const showDays = set.has('d');\n const showHours = set.has('h');\n const showMinutes = set.has('m');\n const showSeconds = set.has('s');\n\n if (!showDays && !showHours && !showMinutes && !showSeconds) {\n return DEFAULT_UNITS;\n }\n\n return { showDays, showHours, showMinutes, showSeconds };\n}\n\nclass ZeroHour extends HTMLElement {\n static defaultStylesheet: CSSStyleSheet | null = DEFAULT_STYLESHEET;\n\n static observedAttributes = [\n 'digits-url',\n 'separator-url',\n 'autostart',\n 'date',\n 'time',\n 'utc',\n 'units',\n 'mode',\n ];\n\n private readonly shadow = this.attachShadow({ mode: 'open' });\n\n private digitsUrl: string | null = null;\n private separatorUrl: string | null = null;\n private autostart = true;\n\n private durationMs = 0;\n\n private targetEpochMs: number | null = null;\n\n private startEpochMs: number | null = null;\n private nextTickTimeout: number | null = null;\n private doneFired = false;\n\n private rootEl!: HTMLElement;\n private daysEl!: HTMLElement;\n private hoursEl!: HTMLElement;\n private minutesEl!: HTMLElement;\n private secondsEl!: HTMLElement;\n private a11yEl!: HTMLElement;\n private sep0El!: HTMLElement;\n private sep1El!: HTMLElement;\n private sep2El!: HTMLElement;\n private styleEl: HTMLStyleElement | null = null;\n\n private showDays = true;\n private showHours = true;\n private showMinutes = true;\n private showSeconds = true;\n private mode: 'static' | 'scroll' = 'static';\n private hasDigitsRendered = false;\n\n connectedCallback(): void {\n this.render();\n this.readAttributes();\n\n if (this.autostart) this.start();\n else this.renderStaticInitial();\n }\n\n disconnectedCallback(): void {\n this.stop();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n void name;\n void oldValue;\n void newValue;\n\n if (!this.isConnected) return;\n\n const wasRunning = this.isRunning();\n\n this.readAttributes();\n this.doneFired = false;\n\n if (wasRunning && this.autostart) this.start();\n else this.renderStaticInitial();\n }\n\n public start(): void {\n this.stop();\n\n if (!this.digitsUrl) return;\n\n this.durationMs = this.targetEpochMs != null ? this.targetEpochMs - Date.now() : 0;\n\n this.startEpochMs = Date.now();\n\n this.tick();\n this.scheduleNextSecondBoundary();\n }\n\n public stop(): void {\n if (this.nextTickTimeout != null) {\n window.clearTimeout(this.nextTickTimeout);\n\n this.nextTickTimeout = null;\n }\n\n this.startEpochMs = null;\n }\n\n public reset(): void {\n this.doneFired = false;\n\n if (this.autostart) this.start();\n else this.renderStaticInitial();\n }\n\n public isRunning(): boolean {\n return this.startEpochMs != null && this.nextTickTimeout != null;\n }\n\n public isDone(): boolean {\n if (!this.digitsUrl) return false;\n if (this.targetEpochMs == null) return false;\n\n return Date.now() >= this.targetEpochMs;\n }\n\n private readAttributes(): void {\n if (!this.rootEl) this.render();\n\n const query = readZeroHourQueryOverrides();\n\n this.digitsUrl = this.getAttribute('digits-url');\n this.separatorUrl = this.getAttribute('separator-url');\n this.autostart = hasBoolAttr(this, 'autostart', true);\n\n const modeRaw = (this.getAttribute('mode') ?? '').trim().toLowerCase();\n\n this.mode = modeRaw === 'scroll' ? 'scroll' : 'static';\n\n const units = parseUnitsPattern(query?.units ?? this.getAttribute('units'));\n\n this.showDays = units.showDays;\n this.showHours = units.showHours;\n this.showMinutes = units.showMinutes;\n this.showSeconds = units.showSeconds;\n\n const dateFromAttr = parseYmdDate(this.getAttribute('date'));\n const dateFromQuery = parseYmdDate(query?.date ?? null);\n const date = dateFromQuery ?? dateFromAttr;\n\n const timeFromAttr = parseHmsTime(this.getAttribute('time'));\n const timeFromQuery = parseHmsTimeStrict(query?.time ?? null);\n const time = timeFromQuery ?? timeFromAttr;\n\n const offsetMinutesFromAttr = parseUtcOffsetMinutes(this.getAttribute('utc'));\n const offsetMinutesFromQuery = parseUtcOffsetMinutes(query?.utc ?? null);\n const offsetMinutes = offsetMinutesFromQuery ?? offsetMinutesFromAttr ?? 0;\n\n if (!date) {\n this.targetEpochMs = null;\n } else {\n const utcMs = Date.UTC(\n date.year,\n date.month - 1,\n date.day,\n time.hours,\n time.minutes,\n time.seconds,\n );\n\n this.targetEpochMs = utcMs - offsetMinutes * 60 * 1000;\n }\n\n this.durationMs = 0;\n\n if (!this.digitsUrl) {\n this.setTextFallback('—:—:—:—');\n\n return;\n }\n\n this.rootEl.style.setProperty('--zh-digits-url', `url(\"${this.digitsUrl}\")`);\n\n if (this.separatorUrl) {\n this.rootEl.style.setProperty('--zh-sep-url', `url(\"${this.separatorUrl}\")`);\n } else {\n this.rootEl.style.removeProperty('--zh-sep-url');\n }\n\n this.applyUnitsVisibility();\n this.rootEl.classList.toggle('zh--mode-scroll', this.mode === 'scroll');\n }\n\n private renderStaticInitial(): void {\n if (this.targetEpochMs != null) {\n const now = Date.now();\n const diffMs = clampNonNegative(this.targetEpochMs - now);\n const { d, h, m, s } = msToDhms(diffMs);\n\n this.setDigits({ d, h, m, s }, false);\n } else {\n this.setDigits({ d: 0, h: 0, m: 0, s: 0 }, false);\n }\n }\n\n private render(): void {\n this.applyStyles(null);\n\n this.rootEl = document.createElement('div');\n this.rootEl.className = 'zh';\n\n this.daysEl = document.createElement('div');\n this.daysEl.className = 'zh__group';\n this.hoursEl = document.createElement('div');\n this.hoursEl.className = 'zh__group';\n this.minutesEl = document.createElement('div');\n this.minutesEl.className = 'zh__group';\n this.secondsEl = document.createElement('div');\n this.secondsEl.className = 'zh__group';\n\n this.sep0El = document.createElement('span');\n this.sep0El.className = 'zh__sep';\n\n this.sep1El = document.createElement('span');\n this.sep1El.className = 'zh__sep';\n\n this.sep2El = document.createElement('span');\n this.sep2El.className = 'zh__sep';\n\n this.a11yEl = document.createElement('span');\n this.a11yEl.className = 'zh__a11y';\n this.a11yEl.setAttribute('aria-live', 'polite');\n\n this.rootEl.append(\n this.daysEl,\n this.sep0El,\n this.hoursEl,\n this.sep1El,\n this.minutesEl,\n this.sep2El,\n this.secondsEl,\n this.a11yEl,\n );\n\n this.shadow.innerHTML = '';\n\n if (this.styleEl) this.shadow.append(this.styleEl);\n\n this.shadow.append(this.rootEl);\n\n this.setDigits({ d: 0, h: 0, m: 0, s: 0 }, false);\n this.hasDigitsRendered = false;\n }\n\n private setTextFallback(text: string): void {\n this.a11yEl.textContent = text;\n }\n\n private applyUnitsVisibility(): void {\n if (!this.rootEl) return;\n\n this.daysEl.style.display = this.showDays ? '' : 'none';\n this.hoursEl.style.display = this.showHours ? '' : 'none';\n this.minutesEl.style.display = this.showMinutes ? '' : 'none';\n this.secondsEl.style.display = this.showSeconds ? '' : 'none';\n\n const hasSeparator = !!this.separatorUrl;\n\n if (!hasSeparator) {\n this.sep0El.style.display = 'none';\n this.sep1El.style.display = 'none';\n this.sep2El.style.display = 'none';\n\n return;\n }\n\n const groupVisible = [this.showDays, this.showHours, this.showMinutes, this.showSeconds];\n const visibleIndexes: number[] = [];\n\n for (let i = 0; i < groupVisible.length; i++) {\n if (groupVisible[i]) visibleIndexes.push(i);\n }\n\n this.rootEl.style.setProperty('--zh-groups', String(visibleIndexes.length));\n\n const sepUsed = [false, false, false];\n\n if (visibleIndexes.length >= 2) {\n for (let i = 0; i < visibleIndexes.length - 1; i++) {\n const rightIdx = visibleIndexes[i + 1];\n const sepIndex = Math.min(2, Math.max(0, rightIdx - 1));\n\n sepUsed[sepIndex] = true;\n }\n }\n\n this.sep0El.style.display = sepUsed[0] ? '' : 'none';\n this.sep1El.style.display = sepUsed[1] ? '' : 'none';\n this.sep2El.style.display = sepUsed[2] ? '' : 'none';\n }\n\n private setDigits(\n { d, h, m, s }: { d: number; h: number; m: number; s: number },\n animate = true,\n ): void {\n let shouldAnimate = animate;\n\n if (!this.hasDigitsRendered) shouldAnimate = false;\n\n const daysChars = toDigitChars(Math.min(d, 99), 2);\n const hoursChars = toDigitChars(h, 2);\n const minChars = [...pad2(m)];\n const secChars = [...pad2(s)];\n\n this.syncDigitGroup(this.daysEl, daysChars, shouldAnimate);\n this.syncDigitGroup(this.hoursEl, hoursChars, shouldAnimate);\n this.syncDigitGroup(this.minutesEl, minChars, shouldAnimate);\n this.syncDigitGroup(this.secondsEl, secChars, shouldAnimate);\n\n const parts: string[] = [];\n\n if (this.showDays) parts.push(daysChars.join(''));\n if (this.showHours) parts.push(hoursChars.join(''));\n if (this.showMinutes) parts.push(minChars.join(''));\n if (this.showSeconds) parts.push(secChars.join(''));\n\n this.a11yEl.textContent = parts.length ? parts.join(':') : '—';\n this.hasDigitsRendered = true;\n }\n\n private syncDigitGroup(groupEl: HTMLElement, chars: string[], animate: boolean): void {\n while (groupEl.children.length < chars.length) {\n const idx = groupEl.children.length;\n\n groupEl.appendChild(this.createDigitSlot(chars[idx]));\n }\n\n while (groupEl.children.length > chars.length) {\n const last = groupEl.lastElementChild;\n\n if (!last) break;\n\n groupEl.removeChild(last);\n }\n\n for (let i = 0; i < chars.length; i++) {\n const el = groupEl.children[i] as HTMLElement;\n\n this.syncDigitSlot(el, chars[i], animate);\n }\n }\n\n private createDigitSlot(char: string): HTMLElement {\n const digit = document.createElement('span');\n\n digit.className = 'zh__digit';\n\n const track = document.createElement('span');\n\n track.className = 'zh__digit-track';\n\n const face = this.createDigitFace(char);\n\n face.classList.add('zh__digit-face--current');\n\n track.append(face);\n digit.append(track);\n\n return digit;\n }\n\n private createDigitFace(char: string): HTMLElement {\n const face = document.createElement('span');\n\n face.className = 'zh__digit-face';\n\n this.setFaceDigit(face, char);\n\n return face;\n }\n\n private setFaceDigit(face: HTMLElement, char: string): void {\n face.dataset.zhDigit = char;\n\n const idx = digitToSheetIndex(char);\n\n face.style.setProperty('--zh-sheet-index', String(idx));\n }\n\n private ensureDigitTrack(slot: HTMLElement): HTMLElement {\n let track = slot.querySelector<HTMLElement>('.zh__digit-track');\n\n if (!track) {\n track = document.createElement('span');\n track.className = 'zh__digit-track';\n slot.innerHTML = '';\n slot.append(track);\n }\n\n return track;\n }\n\n private getOrCreateCurrentFace(track: HTMLElement, fallbackChar: string): HTMLElement {\n let current = track.querySelector<HTMLElement>('.zh__digit-face--current');\n\n if (!current) {\n const existing = track.querySelector<HTMLElement>('.zh__digit-face');\n\n current = existing ?? this.createDigitFace(fallbackChar);\n current.classList.add('zh__digit-face--current');\n\n this.setFaceDigit(current, current.dataset.zhDigit ?? fallbackChar);\n\n track.innerHTML = '';\n track.append(current);\n } else {\n const faces = Array.from(track.children);\n\n for (const face of faces) {\n if (face !== current) track.removeChild(face);\n }\n }\n\n return current;\n }\n\n private cleanupTrack(track: HTMLElement, faceToKeep: HTMLElement): void {\n if (!track.contains(faceToKeep)) return;\n\n const faces = Array.from(track.children);\n\n for (const face of faces) {\n if (face !== faceToKeep) track.removeChild(face);\n }\n\n faceToKeep.classList.remove('zh__digit-face--next');\n faceToKeep.classList.add('zh__digit-face--current');\n\n track.style.transition = this.mode === 'scroll' ? '' : 'none';\n track.style.transform = 'translateY(0)';\n }\n\n private parseTransitionMs(el: HTMLElement): number {\n const style = window.getComputedStyle(el);\n const durations = style.transitionDuration.split(',').map((v) => v.trim());\n const delays = style.transitionDelay.split(',').map((v) => v.trim());\n\n const toMs = (val: string): number => {\n if (!val) return 0;\n if (val.endsWith('ms')) return Number.parseFloat(val);\n if (val.endsWith('s')) return Number.parseFloat(val) * 1000;\n\n return Number.parseFloat(val) || 0;\n };\n\n const d = durations[0] ? toMs(durations[0]) : 0;\n const delay = delays[0] ? toMs(delays[0]) : 0;\n\n return d + delay;\n }\n\n private animateDigitChange(track: HTMLElement, currentFace: HTMLElement, newChar: string): void {\n const nextFace = this.createDigitFace(newChar);\n\n nextFace.classList.add('zh__digit-face--next');\n\n track.innerHTML = '';\n track.append(nextFace, currentFace);\n\n track.style.transition = 'none';\n track.style.transform = 'translateY(-100%)';\n\n void track.offsetHeight;\n\n track.style.transition = '';\n track.style.transform = 'translateY(0)';\n\n const cleanup = () => {\n track.removeEventListener('transitionend', cleanup);\n\n if (!track.contains(nextFace)) return;\n\n this.cleanupTrack(track, nextFace);\n };\n\n track.addEventListener('transitionend', cleanup, { once: true });\n\n const guardMs = this.parseTransitionMs(track) + 150;\n\n window.setTimeout(cleanup, guardMs || 800);\n }\n\n private syncDigitSlot(slot: HTMLElement, char: string, animate: boolean): void {\n const track = this.ensureDigitTrack(slot);\n const currentFace = this.getOrCreateCurrentFace(track, char);\n const currentChar = currentFace.dataset.zhDigit ?? char;\n\n this.setFaceDigit(currentFace, currentChar);\n\n if (currentChar === char || !animate || this.mode !== 'scroll') {\n if (currentChar !== char) this.setFaceDigit(currentFace, char);\n\n this.cleanupTrack(track, currentFace);\n\n return;\n }\n\n this.animateDigitChange(track, currentFace, char);\n }\n\n private tick(): void {\n if (!this.digitsUrl) return;\n\n const durationMs = clampNonNegative(this.durationMs);\n\n if (durationMs === 0) {\n this.setDigits({ d: 0, h: 0, m: 0, s: 0 });\n this.fireDoneOnce();\n this.stop();\n\n return;\n }\n\n const start = this.startEpochMs ?? Date.now();\n const elapsedMs = clampNonNegative(Date.now() - start);\n const shownMs = clampNonNegative(durationMs - elapsedMs);\n\n const { d, h, m, s, totalSec } = msToDhms(shownMs);\n\n this.setDigits({ d, h, m, s });\n\n const isDone = totalSec === 0;\n\n if (isDone) {\n this.fireDoneOnce();\n this.stop();\n }\n }\n\n private fireDoneOnce(): void {\n if (this.doneFired) return;\n\n this.doneFired = true;\n\n this.dispatchEvent(new CustomEvent('done'));\n }\n\n private scheduleNextSecondBoundary(): void {\n const now = Date.now();\n const msToNextSecond = 1000 - (now % 1000);\n\n this.nextTickTimeout = window.setTimeout(() => {\n this.tick();\n\n if (this.isRunning()) this.scheduleNextSecondBoundary();\n }, msToNextSecond);\n }\n\n public adoptStylesheet(sheet: CSSStyleSheet): void {\n this.applyStyles(sheet);\n }\n\n public adoptStyles(styles: StylesInput): void {\n this.applyStyles(styles);\n }\n\n private applyStyles(styles: StylesInput): void {\n if (typeof styles === 'string') {\n if (supportsAdoptedStyleSheets(this.shadow)) {\n const sheet = makeConstructableSheet(styles);\n\n if (sheet) {\n this.shadow.adoptedStyleSheets = [sheet];\n this.styleEl = null;\n\n return;\n }\n }\n\n if (!this.styleEl) this.styleEl = document.createElement('style');\n\n this.styleEl.textContent = styles;\n\n return;\n }\n\n if (styles && supportsAdoptedStyleSheets(this.shadow)) {\n this.shadow.adoptedStyleSheets = [styles];\n this.styleEl = null;\n\n return;\n }\n\n if (ZeroHour.defaultStylesheet && supportsAdoptedStyleSheets(this.shadow)) {\n this.shadow.adoptedStyleSheets = [ZeroHour.defaultStylesheet];\n this.styleEl = null;\n\n return;\n }\n\n if (!this.styleEl) this.styleEl = document.createElement('style');\n\n this.styleEl.textContent = DEFAULT_CSS_TEXT;\n }\n}\n\nif (!customElements.get('countdown-timer')) {\n customElements.define('countdown-timer', ZeroHour);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'countdown-timer': ZeroHour;\n }\n}\n\nexport function initCountdownTimers(\n options: {\n selector?: string;\n onDone?: (el: HTMLElement) => void;\n stylesheet?: CSSStyleSheet | string | null;\n } = {},\n): HTMLElement[] {\n const { selector = 'countdown-timer', onDone, stylesheet } = options;\n const elements = Array.from(document.querySelectorAll<HTMLElement>(selector));\n\n if (onDone) {\n const notified = new WeakSet<HTMLElement>();\n const notifyOnce = (el: HTMLElement) => {\n if (notified.has(el)) return;\n\n notified.add(el);\n\n onDone(el);\n };\n\n elements.forEach((el) => {\n el.addEventListener('done', () => notifyOnce(el));\n\n const zh = el as unknown as ZeroHour;\n\n if (typeof (zh as unknown as { isDone?: unknown }).isDone === 'function' && zh.isDone()) {\n notifyOnce(el);\n }\n });\n }\n\n if (stylesheet) {\n elements.forEach((el) => {\n const zh = el as unknown as ZeroHour;\n\n if (typeof stylesheet === 'string') zh.adoptStyles(stylesheet);\n else zh.adoptStylesheet(stylesheet);\n });\n }\n\n return elements;\n}\n"],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ //#region src/index.d.ts
2
+ declare const zeroHourCssText: string;
3
+ type StylesInput = CSSStyleSheet | string | null | undefined;
4
+ declare class ZeroHour extends HTMLElement {
5
+ static defaultStylesheet: CSSStyleSheet | null;
6
+ static observedAttributes: string[];
7
+ private readonly shadow;
8
+ private digitsUrl;
9
+ private separatorUrl;
10
+ private autostart;
11
+ private durationMs;
12
+ private targetEpochMs;
13
+ private startEpochMs;
14
+ private nextTickTimeout;
15
+ private doneFired;
16
+ private rootEl;
17
+ private daysEl;
18
+ private hoursEl;
19
+ private minutesEl;
20
+ private secondsEl;
21
+ private a11yEl;
22
+ private sep0El;
23
+ private sep1El;
24
+ private sep2El;
25
+ private styleEl;
26
+ private showDays;
27
+ private showHours;
28
+ private showMinutes;
29
+ private showSeconds;
30
+ private mode;
31
+ private hasDigitsRendered;
32
+ connectedCallback(): void;
33
+ disconnectedCallback(): void;
34
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
35
+ start(): void;
36
+ stop(): void;
37
+ reset(): void;
38
+ isRunning(): boolean;
39
+ isDone(): boolean;
40
+ private readAttributes;
41
+ private renderStaticInitial;
42
+ private render;
43
+ private setTextFallback;
44
+ private applyUnitsVisibility;
45
+ private setDigits;
46
+ private syncDigitGroup;
47
+ private createDigitSlot;
48
+ private createDigitFace;
49
+ private setFaceDigit;
50
+ private ensureDigitTrack;
51
+ private getOrCreateCurrentFace;
52
+ private cleanupTrack;
53
+ private parseTransitionMs;
54
+ private animateDigitChange;
55
+ private syncDigitSlot;
56
+ private tick;
57
+ private fireDoneOnce;
58
+ private scheduleNextSecondBoundary;
59
+ adoptStylesheet(sheet: CSSStyleSheet): void;
60
+ adoptStyles(styles: StylesInput): void;
61
+ private applyStyles;
62
+ }
63
+ declare global {
64
+ interface HTMLElementTagNameMap {
65
+ 'countdown-timer': ZeroHour;
66
+ }
67
+ }
68
+ declare function initCountdownTimers(options?: {
69
+ selector?: string;
70
+ onDone?: (el: HTMLElement) => void;
71
+ stylesheet?: CSSStyleSheet | string | null;
72
+ }): HTMLElement[];
73
+ //#endregion
74
+ export { initCountdownTimers, zeroHourCssText };
75
+ //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,61 +1,75 @@
1
- export declare const zeroHourCssText: string;
1
+ //#region src/index.d.ts
2
+ declare const zeroHourCssText: string;
2
3
  type StylesInput = CSSStyleSheet | string | null | undefined;
3
4
  declare class ZeroHour extends HTMLElement {
4
- static defaultStylesheet: CSSStyleSheet | null;
5
- static observedAttributes: string[];
6
- private readonly shadow;
7
- private digitsUrl;
8
- private separatorUrl;
9
- private autostart;
10
- private durationMs;
11
- private targetEpochMs;
12
- private startEpochMs;
13
- private nextTickTimeout;
14
- private doneFired;
15
- private rootEl;
16
- private daysEl;
17
- private hoursEl;
18
- private minutesEl;
19
- private secondsEl;
20
- private a11yEl;
21
- private sep0El;
22
- private sep1El;
23
- private sep2El;
24
- private styleEl;
25
- private showDays;
26
- private showHours;
27
- private showMinutes;
28
- private showSeconds;
29
- connectedCallback(): void;
30
- disconnectedCallback(): void;
31
- attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
32
- start(): void;
33
- stop(): void;
34
- reset(): void;
35
- isRunning(): boolean;
36
- isDone(): boolean;
37
- private readAttributes;
38
- private renderStaticInitial;
39
- private render;
40
- private setTextFallback;
41
- private applyUnitsVisibility;
42
- private setDigits;
43
- private syncDigitGroup;
44
- private tick;
45
- private fireDoneOnce;
46
- private scheduleNextSecondBoundary;
47
- adoptStylesheet(sheet: CSSStyleSheet): void;
48
- adoptStyles(styles: StylesInput): void;
49
- private applyStyles;
5
+ static defaultStylesheet: CSSStyleSheet | null;
6
+ static observedAttributes: string[];
7
+ private readonly shadow;
8
+ private digitsUrl;
9
+ private separatorUrl;
10
+ private autostart;
11
+ private durationMs;
12
+ private targetEpochMs;
13
+ private startEpochMs;
14
+ private nextTickTimeout;
15
+ private doneFired;
16
+ private rootEl;
17
+ private daysEl;
18
+ private hoursEl;
19
+ private minutesEl;
20
+ private secondsEl;
21
+ private a11yEl;
22
+ private sep0El;
23
+ private sep1El;
24
+ private sep2El;
25
+ private styleEl;
26
+ private showDays;
27
+ private showHours;
28
+ private showMinutes;
29
+ private showSeconds;
30
+ private mode;
31
+ private hasDigitsRendered;
32
+ connectedCallback(): void;
33
+ disconnectedCallback(): void;
34
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
35
+ start(): void;
36
+ stop(): void;
37
+ reset(): void;
38
+ isRunning(): boolean;
39
+ isDone(): boolean;
40
+ private readAttributes;
41
+ private renderStaticInitial;
42
+ private render;
43
+ private setTextFallback;
44
+ private applyUnitsVisibility;
45
+ private setDigits;
46
+ private syncDigitGroup;
47
+ private createDigitSlot;
48
+ private createDigitFace;
49
+ private setFaceDigit;
50
+ private ensureDigitTrack;
51
+ private getOrCreateCurrentFace;
52
+ private cleanupTrack;
53
+ private parseTransitionMs;
54
+ private animateDigitChange;
55
+ private syncDigitSlot;
56
+ private tick;
57
+ private fireDoneOnce;
58
+ private scheduleNextSecondBoundary;
59
+ adoptStylesheet(sheet: CSSStyleSheet): void;
60
+ adoptStyles(styles: StylesInput): void;
61
+ private applyStyles;
50
62
  }
51
63
  declare global {
52
- interface HTMLElementTagNameMap {
53
- 'countdown-timer': ZeroHour;
54
- }
64
+ interface HTMLElementTagNameMap {
65
+ 'countdown-timer': ZeroHour;
66
+ }
55
67
  }
56
- export declare function initCountdownTimers(options?: {
57
- selector?: string;
58
- onDone?: (el: HTMLElement) => void;
59
- stylesheet?: CSSStyleSheet | string | null;
68
+ declare function initCountdownTimers(options?: {
69
+ selector?: string;
70
+ onDone?: (el: HTMLElement) => void;
71
+ stylesheet?: CSSStyleSheet | string | null;
60
72
  }): HTMLElement[];
61
- export {};
73
+ //#endregion
74
+ export { initCountdownTimers, zeroHourCssText };
75
+ //# sourceMappingURL=index.d.ts.map