@dloizides/game-shell 0.1.1 → 0.1.2

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/crash/crashKind.ts","../src/dom.ts","../src/crash/crashOverlay.ts","../src/crash/crash.ts","../src/fit/fit.ts","../src/icons.ts","../src/install/banner.ts","../src/install/platform.ts","../src/install/snooze.ts","../src/install/install.ts","../src/lifecycle/lifecycle.ts","../src/styles.ts","../src/version/versionPoll.ts","../src/initGameShell.ts"],"names":["svg"],"mappings":"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","file":"index.js","sourcesContent":["export const CRASH_KIND = {\n Error: 'error',\n Rejection: 'rejection',\n} as const;\n\nexport type CrashKind = (typeof CRASH_KIND)[keyof typeof CRASH_KIND];\n\nexport interface CrashInfo {\n kind: CrashKind;\n message: string;\n source?: string;\n}\n","export function el<K extends keyof HTMLElementTagNameMap>(\n doc: Document,\n tag: K,\n className = '',\n text = '',\n): HTMLElementTagNameMap[K] {\n const node = doc.createElement(tag);\n if (className !== '') {\n node.className = className;\n }\n if (text !== '') {\n node.textContent = text;\n }\n return node;\n}\n\nexport function iconSpan(doc: Document, svg: string): HTMLSpanElement {\n const span = el(doc, 'span', 'gs-ico');\n span.innerHTML = svg;\n return span;\n}\n\nexport interface ButtonSpec {\n className: string;\n text?: string;\n ariaLabel?: string;\n icon?: string;\n onClick(): void;\n}\n\nexport function button(doc: Document, spec: ButtonSpec): HTMLButtonElement {\n const btn = el(doc, 'button', spec.className);\n btn.type = 'button';\n if (spec.icon !== undefined) {\n btn.append(iconSpan(doc, spec.icon));\n }\n if (spec.text !== undefined) {\n btn.append(doc.createTextNode(spec.text));\n }\n if (spec.ariaLabel !== undefined) {\n btn.setAttribute('aria-label', spec.ariaLabel);\n }\n btn.addEventListener('click', () => spec.onClick());\n return btn;\n}\n","import { button, el } from '../dom';\nimport type { CrashLabels } from '../types';\n\nexport const CRASH_TITLE_ID = 'gs-crash-title';\nconst CRASH_BODY_ID = 'gs-crash-body';\n\nexport interface CrashOverlayProps {\n doc: Document;\n labels: CrashLabels;\n reference?: string;\n onReload(): void;\n onCopy(): void;\n}\n\nexport interface CrashOverlayView {\n root: HTMLElement;\n reload: HTMLButtonElement;\n}\n\nexport function renderCrashOverlay(p: CrashOverlayProps): CrashOverlayView {\n const root = el(p.doc, 'div', 'gs gs-crash');\n root.setAttribute('role', 'alertdialog');\n root.setAttribute('aria-modal', 'true');\n root.setAttribute('aria-labelledby', CRASH_TITLE_ID);\n root.setAttribute('aria-describedby', CRASH_BODY_ID);\n const panel = el(p.doc, 'div', 'gs-panel');\n const title = el(p.doc, 'h2', 'gs-h', p.labels.crashTitle);\n title.id = CRASH_TITLE_ID;\n const body = el(p.doc, 'p', '', p.labels.crashBody);\n body.id = CRASH_BODY_ID;\n const acts = el(p.doc, 'div', 'gs-acts');\n const reload = button(p.doc, { className: 'gs-btn gs-primary', text: p.labels.reload, onClick: p.onReload });\n acts.append(reload, button(p.doc, { className: 'gs-btn gs-ghost', text: p.labels.copyDetails, onClick: p.onCopy }));\n panel.append(title, body, acts);\n if (p.reference !== undefined && p.reference !== '') {\n panel.append(el(p.doc, 'p', 'gs-ref', `${p.labels.errorReported} ${p.reference}`));\n }\n root.append(panel);\n return { root, reload };\n}\n","import type { CrashLabels, Disposable } from '../types';\nimport { CRASH_KIND, type CrashInfo } from './crashKind';\nimport { renderCrashOverlay } from './crashOverlay';\n\nexport interface CrashOptions {\n labels: CrashLabels;\n report?: (info: CrashInfo) => string | void;\n appVersion?: string;\n win?: Window;\n reload?: () => void;\n}\n\nfunction fromErrorEvent(e: ErrorEvent): CrashInfo {\n const err: unknown = e.error;\n const stack = err instanceof Error ? err.stack : undefined;\n const location = e.filename !== '' ? `${e.filename}:${e.lineno}:${e.colno}` : undefined;\n const message = e.message !== '' ? e.message : String(err);\n return { kind: CRASH_KIND.Error, message, source: stack ?? location };\n}\n\nfunction fromRejection(e: Event): CrashInfo {\n const reason: unknown = (e as PromiseRejectionEvent).reason;\n if (reason instanceof Error) {\n return { kind: CRASH_KIND.Rejection, message: reason.message, source: reason.stack };\n }\n return { kind: CRASH_KIND.Rejection, message: String(reason) };\n}\n\nfunction safeReport(opts: CrashOptions, info: CrashInfo): string | undefined {\n try {\n return opts.report?.(info) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction copyDetails(win: Window, info: CrashInfo, appVersion?: string): void {\n const text = [info.message, info.source, appVersion]\n .filter((part): part is string => part !== undefined && part !== '')\n .join('\\n');\n try {\n win.navigator.clipboard.writeText(text).catch(() => undefined);\n } catch {\n // No clipboard API (insecure context): nothing to copy into.\n }\n}\n\nexport function startCrash(opts: CrashOptions): Disposable {\n const win = opts.win ?? window;\n const reload = opts.reload ?? ((): void => win.location.reload());\n let overlay: HTMLElement | null = null;\n\n const handle = (info: CrashInfo): void => {\n const reference = safeReport(opts, info);\n if (overlay) {\n return;\n }\n const view = renderCrashOverlay({\n doc: win.document,\n labels: opts.labels,\n reference,\n onReload: reload,\n onCopy: () => copyDetails(win, info, opts.appVersion),\n });\n overlay = view.root;\n win.document.body.append(overlay);\n view.reload.focus();\n };\n const onError = (e: Event): void => {\n if (e instanceof ErrorEvent) {\n handle(fromErrorEvent(e));\n }\n };\n const onRejection = (e: Event): void => handle(fromRejection(e));\n\n win.addEventListener('error', onError);\n win.addEventListener('unhandledrejection', onRejection);\n return {\n dispose: (): void => {\n win.removeEventListener('error', onError);\n win.removeEventListener('unhandledrejection', onRejection);\n overlay?.remove();\n overlay = null;\n },\n };\n}\n","import type { Disposable } from '../types';\n\nexport const GS_RESIZE_EVENT = 'gs:resize';\nexport const GS_VH_VAR = '--gs-vh';\n\nexport interface GsResizeDetail {\n width: number;\n height: number;\n}\n\nfunction measure(win: Window): GsResizeDetail {\n const vv = win.visualViewport;\n if (vv) {\n return { width: vv.width, height: vv.height };\n }\n return { width: win.innerWidth, height: win.innerHeight };\n}\n\nfunction scheduler(win: Window): (cb: () => void) => void {\n if (typeof win.requestAnimationFrame === 'function') {\n return (cb) => {\n win.requestAnimationFrame(() => cb());\n };\n }\n return (cb) => {\n win.setTimeout(cb, 0);\n };\n}\n\nexport function startFit(win: Window = window): Disposable {\n const root = win.document.documentElement;\n const schedule = scheduler(win);\n let last = measure(win);\n let pending = false;\n let disposed = false;\n root.style.setProperty(GS_VH_VAR, `${last.height}px`);\n\n const apply = (): void => {\n pending = false;\n const next = measure(win);\n const unchanged = next.width === last.width && next.height === last.height;\n if (disposed || unchanged) {\n return;\n }\n last = next;\n root.style.setProperty(GS_VH_VAR, `${next.height}px`);\n win.dispatchEvent(new CustomEvent<GsResizeDetail>(GS_RESIZE_EVENT, { detail: next }));\n };\n const onChange = (): void => {\n if (pending) {\n return;\n }\n pending = true;\n schedule(apply);\n };\n\n const vv = win.visualViewport;\n vv?.addEventListener('resize', onChange);\n win.addEventListener('resize', onChange);\n win.addEventListener('orientationchange', onChange);\n return {\n dispose: (): void => {\n disposed = true;\n vv?.removeEventListener('resize', onChange);\n win.removeEventListener('resize', onChange);\n win.removeEventListener('orientationchange', onChange);\n },\n };\n}\n","const svg = (paths: string): string =>\n `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths}</svg>`;\n\nexport const ICONS = {\n download: svg('<path d=\"M12 4v11M7 10l5 5 5-5M5 20h14\"/>'),\n add: svg('<path d=\"M12 5v14M5 12h14\"/>'),\n close: svg('<path d=\"M6 6l12 12M18 6L6 18\"/>'),\n share: svg('<path d=\"M12 15V4M8 8l4-4 4 4M6 12v8h12v-8\"/>'),\n} as const;\n","import { button, el, iconSpan } from '../dom';\nimport { ICONS } from '../icons';\nimport type { InstallLabels } from '../types';\nimport { BannerLayout } from './BannerLayout';\nimport { InstallVariant } from './InstallVariant';\n\nexport const STEPS_ID = 'gs-install-steps';\n\nexport interface BannerProps {\n doc: Document;\n layout: BannerLayout;\n variant: InstallVariant;\n appName: string;\n labels: InstallLabels;\n onInstall(): void;\n onDismiss(): void;\n}\n\nfunction renderSteps(p: BannerProps): HTMLOListElement {\n const list = el(p.doc, 'ol', 'gs-steps');\n list.id = STEPS_ID;\n const share = el(p.doc, 'li');\n share.append(iconSpan(p.doc, ICONS.share), p.doc.createTextNode(p.labels.tapShare));\n const add = el(p.doc, 'li');\n add.append(iconSpan(p.doc, ICONS.add), p.doc.createTextNode(p.labels.tapAdd));\n list.append(share, add);\n return list;\n}\n\nfunction closeButton(p: BannerProps): HTMLButtonElement {\n return button(p.doc, { className: 'gs-x', ariaLabel: p.labels.notNow, icon: ICONS.close, onClick: p.onDismiss });\n}\n\nfunction renderChip(p: BannerProps): HTMLElement[] {\n const seal = el(p.doc, 'div', 'gs-seal');\n if (p.variant === InstallVariant.Prompt) {\n seal.append(button(p.doc, { className: 'gs-chip', text: p.labels.install, icon: ICONS.download, onClick: p.onInstall }));\n seal.append(closeButton(p));\n return [seal];\n }\n const steps = renderSteps(p);\n steps.hidden = true;\n const chip = button(p.doc, {\n className: 'gs-chip',\n text: p.labels.addToHome,\n icon: ICONS.add,\n onClick: () => {\n steps.hidden = !steps.hidden;\n chip.setAttribute('aria-expanded', String(!steps.hidden));\n },\n });\n chip.setAttribute('aria-expanded', 'false');\n chip.setAttribute('aria-controls', STEPS_ID);\n seal.append(chip, closeButton(p));\n return [seal, steps];\n}\n\nfunction renderCard(p: BannerProps): HTMLElement[] {\n const card = el(p.doc, 'div', 'gs-card');\n const app = el(p.doc, 'div', 'gs-app');\n app.append(el(p.doc, 'i'));\n const txt = el(p.doc, 'div', 'gs-txt');\n txt.append(el(p.doc, 'b', '', p.appName), el(p.doc, 'span', '', p.labels.installBody));\n const acts = el(p.doc, 'div', 'gs-acts');\n if (p.variant === InstallVariant.Prompt) {\n acts.append(button(p.doc, { className: 'gs-btn gs-primary', text: p.labels.install, icon: ICONS.download, onClick: p.onInstall }));\n }\n acts.append(button(p.doc, { className: 'gs-btn gs-ghost', text: p.labels.notNow, onClick: p.onDismiss }));\n card.append(closeButton(p), app, txt);\n if (p.variant === InstallVariant.Ios) {\n card.append(renderSteps(p));\n }\n card.append(acts);\n return [card];\n}\n\nexport function renderBanner(p: BannerProps): HTMLElement {\n const wrap = el(p.doc, 'div', 'gs gs-install');\n wrap.dataset.layout = p.layout;\n wrap.dataset.variant = p.variant;\n wrap.setAttribute('role', 'region');\n wrap.setAttribute('aria-label', p.variant === InstallVariant.Prompt ? p.labels.install : p.labels.addToHome);\n wrap.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n p.onDismiss();\n }\n });\n wrap.append(...(p.layout === BannerLayout.Card ? renderCard(p) : renderChip(p)));\n return wrap;\n}\n","export const DESKTOP_MIN_WIDTH = 1024;\nconst IOS_DEVICE_RE = /iPad|iPhone|iPod/;\nconst IOS_OTHER_BROWSER_RE = /CriOS|FxiOS|EdgiOS|OPiOS/;\n\ninterface IosNavigator extends Navigator {\n standalone?: boolean;\n}\n\nexport function isStandalone(win: Window): boolean {\n const media = typeof win.matchMedia === 'function' && win.matchMedia('(display-mode: standalone)').matches;\n return media || (win.navigator as IosNavigator).standalone === true;\n}\n\nexport function isIosSafari(win: Window): boolean {\n const ua = win.navigator.userAgent;\n const iPadAsMac = ua.includes('Macintosh') && win.navigator.maxTouchPoints > 1;\n const iosDevice = IOS_DEVICE_RE.test(ua) || iPadAsMac;\n return iosDevice && !IOS_OTHER_BROWSER_RE.test(ua);\n}\n\nexport function isDesktop(win: Window): boolean {\n return win.innerWidth >= DESKTOP_MIN_WIDTH;\n}\n","const DAY_MS = 86_400_000;\n\nexport function snoozeKey(appName: string, override?: string): string {\n return override ?? `gs-install-snooze:${appName}`;\n}\n\nexport function isSnoozed(win: Window, key: string, days: number, now: number): boolean {\n try {\n const raw = win.localStorage.getItem(key);\n if (raw === null) {\n return false;\n }\n const at = Number(raw);\n return Number.isFinite(at) && now - at < days * DAY_MS;\n } catch {\n return false;\n }\n}\n\nexport function writeSnooze(win: Window, key: string, now: number): void {\n try {\n win.localStorage.setItem(key, String(now));\n } catch {\n // Storage blocked (private mode, quota): the banner simply shows again next load.\n }\n}\n","import type { Disposable, InstallLabels } from '../types';\nimport { renderBanner } from './banner';\nimport { BannerLayout } from './BannerLayout';\nimport { InstallVariant } from './InstallVariant';\nimport { isDesktop, isIosSafari, isStandalone } from './platform';\nimport { isSnoozed, snoozeKey, writeSnooze } from './snooze';\n\nexport const DEFAULT_SNOOZE_DAYS = 14;\nconst ACCEPTED = 'accepted';\n\nexport interface BeforeInstallPromptEvent extends Event {\n prompt(): Promise<void>;\n userChoice: Promise<{ outcome: string }>;\n}\n\nexport interface InstallOptions {\n appName: string;\n labels: InstallLabels;\n snoozeDays?: number;\n storageKey?: string;\n win?: Window;\n now?: () => number;\n}\n\ninterface InstallState {\n deferred: BeforeInstallPromptEvent | null;\n variant: InstallVariant | null;\n node: HTMLElement | null;\n}\n\nfunction createController(opts: InstallOptions, win: Window, now: () => number): {\n state: InstallState;\n mount(): void;\n unmount(): void;\n} {\n const key = snoozeKey(opts.appName, opts.storageKey);\n const state: InstallState = { deferred: null, variant: null, node: null };\n const unmount = (): void => {\n state.node?.remove();\n state.node = null;\n };\n const dismiss = (): void => {\n writeSnooze(win, key, now());\n unmount();\n };\n const install = async (): Promise<void> => {\n const evt = state.deferred;\n state.deferred = null;\n if (!evt) {\n return;\n }\n try {\n await evt.prompt();\n const choice = await evt.userChoice;\n if (choice.outcome === ACCEPTED) {\n unmount();\n return;\n }\n dismiss();\n } catch {\n unmount();\n }\n };\n const mount = (): void => {\n if (state.variant === null) {\n return;\n }\n unmount();\n state.node = renderBanner({\n doc: win.document,\n layout: isDesktop(win) ? BannerLayout.Card : BannerLayout.Chip,\n variant: state.variant,\n appName: opts.appName,\n labels: opts.labels,\n onInstall: () => void install(),\n onDismiss: dismiss,\n });\n win.document.body.append(state.node);\n };\n return { state, mount, unmount };\n}\n\nexport function startInstall(opts: InstallOptions): Disposable {\n const win = opts.win ?? window;\n const now = opts.now ?? ((): number => Date.now());\n const key = snoozeKey(opts.appName, opts.storageKey);\n if (isStandalone(win) || isSnoozed(win, key, opts.snoozeDays ?? DEFAULT_SNOOZE_DAYS, now())) {\n return { dispose: (): void => undefined };\n }\n const ctl = createController(opts, win, now);\n const onPrompt = (e: Event): void => {\n e.preventDefault();\n ctl.state.deferred = e as BeforeInstallPromptEvent;\n ctl.state.variant = InstallVariant.Prompt;\n ctl.mount();\n };\n const onInstalled = (): void => {\n ctl.state.variant = null;\n ctl.unmount();\n };\n const onResize = (): void => {\n const node = ctl.state.node;\n if (node && (node.dataset.layout === BannerLayout.Card) !== isDesktop(win)) {\n ctl.mount();\n }\n };\n win.addEventListener('beforeinstallprompt', onPrompt);\n win.addEventListener('appinstalled', onInstalled);\n win.addEventListener('resize', onResize);\n if (isIosSafari(win)) {\n ctl.state.variant = InstallVariant.Ios;\n ctl.mount();\n }\n return {\n dispose: (): void => {\n win.removeEventListener('beforeinstallprompt', onPrompt);\n win.removeEventListener('appinstalled', onInstalled);\n win.removeEventListener('resize', onResize);\n ctl.unmount();\n },\n };\n}\n","import type { Disposable } from '../types';\n\nexport interface LifecycleOptions {\n onHidden?(): void;\n onVisible?(): void;\n}\n\nexport interface ResumableAudio {\n resume(): Promise<void> | void;\n}\n\nconst REDUCED_MOTION_QUERY = '(prefers-reduced-motion: reduce)';\nconst UNLOCK_EVENTS = ['pointerdown', 'keydown'] as const;\n\nexport function startLifecycle(opts: LifecycleOptions, doc: Document = document): Disposable {\n const onChange = (): void => {\n if (doc.visibilityState === 'hidden') {\n opts.onHidden?.();\n return;\n }\n opts.onVisible?.();\n };\n doc.addEventListener('visibilitychange', onChange);\n return { dispose: (): void => doc.removeEventListener('visibilitychange', onChange) };\n}\n\nexport function unlockAudio(ctx: ResumableAudio, win: Window = window): Disposable {\n const detach = (): void => {\n UNLOCK_EVENTS.forEach((type) => win.removeEventListener(type, onFirst, true));\n };\n function onFirst(): void {\n detach();\n try {\n Promise.resolve(ctx.resume()).catch(() => undefined);\n } catch {\n // A browser that refuses resume() leaves the game silent, never crashed.\n }\n }\n UNLOCK_EVENTS.forEach((type) => win.addEventListener(type, onFirst, true));\n return { dispose: detach };\n}\n\nexport function prefersReducedMotion(win: Window = window): boolean {\n if (new URLSearchParams(win.location.search).get('reducedMotion') === '1') {\n return true;\n }\n return typeof win.matchMedia === 'function' && win.matchMedia(REDUCED_MOTION_QUERY).matches;\n}\n","const STYLE_ID = 'gs-styles';\n\nconst THEME = `:where(:root){--gs-font-display:system-ui,'Segoe UI',sans-serif;--gs-font-text:system-ui,'Segoe UI',sans-serif;--gs-surface:rgba(24,26,29,.95);--gs-surface-solid:#181a1d;--gs-edge:#41464d;--gs-ink:#f3f3f1;--gs-ink-dim:#b9bdc2;--gs-accent:#f3f3f1;--gs-on-accent:#181a1d;--gs-scrim:rgba(0,0,0,.72);--gs-radius:12px;--gs-radius-pill:12px;--gs-focus:#9cc2ff;--gs-card-bottom:60px;--gs-safe-top:env(safe-area-inset-top,0px);--gs-safe-right:env(safe-area-inset-right,0px);--gs-safe-bottom:env(safe-area-inset-bottom,0px);--gs-safe-left:env(safe-area-inset-left,0px)}`;\n\nconst ROOT = `.gs-root{width:100%;height:100vh;height:100dvh;height:var(--gs-vh,100dvh)}`;\n\nconst BASE = `.gs{font-family:var(--gs-font-text);color:var(--gs-ink);box-sizing:border-box}\n.gs *{box-sizing:border-box}\n.gs button{min-width:44px;min-height:44px;margin:0;border:0;background:none;color:inherit;font:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}\n.gs button:focus-visible{outline:2px solid var(--gs-focus);outline-offset:2px}\n.gs svg{width:20px;height:20px;flex:none}\n.gs-ico{display:inline-flex}\n.gs-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 18px;border-radius:var(--gs-radius);font:700 16px/1 var(--gs-font-text);white-space:nowrap}\n.gs-primary{background:var(--gs-accent);color:var(--gs-on-accent)}\n.gs .gs-ghost{color:var(--gs-ink);border:1px solid var(--gs-edge)}\n.gs-x{width:44px;height:44px;display:grid;place-items:center;color:var(--gs-ink-dim);flex:none}\n.gs-txt{min-width:0}\n.gs-txt b{display:block;font:400 18px/1.2 var(--gs-font-display);color:var(--gs-ink)}\n.gs-txt span{display:block;font-size:14px;line-height:1.4;color:var(--gs-ink-dim);margin-top:3px}`;\n\nconst INSTALL = `.gs-install{position:fixed;z-index:2147483000;top:calc(12px + var(--gs-safe-top));left:calc(12px + var(--gs-safe-left))}\n.gs-install[data-layout=card]{top:auto;left:auto;right:calc(24px + var(--gs-safe-right));bottom:calc(var(--gs-card-bottom,60px) + var(--gs-safe-bottom))}\n.gs-seal{display:flex;align-items:center;background:var(--gs-surface);border:1px solid var(--gs-edge);border-radius:var(--gs-radius-pill)}\n.gs-chip{display:flex;align-items:center;gap:8px;padding:0 6px 0 14px;font:700 15px var(--gs-font-text);color:var(--gs-ink)}\n.gs-chip svg{color:var(--gs-accent)}\n.gs-seal .gs-x{border-left:1px solid var(--gs-edge)}\n.gs-steps{margin:8px 0 0;width:262px;padding:10px 14px;list-style:none;background:var(--gs-surface);border:1px solid var(--gs-edge);border-radius:var(--gs-radius);display:grid;gap:2px;counter-reset:s}\n.gs-steps[hidden]{display:none}\n.gs-steps li{display:flex;align-items:center;gap:10px;min-height:36px;font-size:15px;color:var(--gs-ink);counter-increment:s}\n.gs-steps li::before{content:counter(s);font:400 15px var(--gs-font-display);color:var(--gs-ink-dim);width:12px}\n.gs-steps svg{width:17px;height:17px;color:var(--gs-accent)}\n.gs-card{position:relative;width:344px;max-width:calc(100vw - 48px);padding:18px;border-radius:var(--gs-radius);background:var(--gs-surface);border:1px solid var(--gs-edge);display:grid;gap:12px}\n.gs-card .gs-x{position:absolute;top:4px;right:4px}\n.gs-card .gs-txt{padding-right:36px}\n.gs-card .gs-acts{display:flex;gap:8px}\n.gs-card .gs-steps{width:auto;margin:0;border:0;padding:0;background:none}\n.gs-app{width:40px;height:40px;border-radius:var(--gs-radius);background:var(--gs-surface-solid);border:1px solid var(--gs-edge);display:grid;place-items:center}\n.gs-app i{width:13px;height:13px;border-radius:50%;background:var(--gs-accent);box-shadow:0 0 10px var(--gs-accent)}`;\n\nconst CRASH = `.gs-crash{position:fixed;inset:0;z-index:2147483001;background:var(--gs-scrim);display:grid;place-items:center;padding:20px}\n.gs-panel{max-width:340px;background:var(--gs-surface-solid);border:1px solid var(--gs-edge);border-radius:var(--gs-radius);padding:24px}\n.gs-h{margin:0;font:400 28px/1.15 var(--gs-font-display);color:var(--gs-ink)}\n.gs-panel p{font-size:16px;line-height:1.5;color:var(--gs-ink-dim);margin:10px 0 0}\n.gs-panel .gs-acts{display:flex;flex-direction:column;gap:8px;margin-top:20px}\n.gs-panel .gs-ref{font:13px ui-monospace,monospace}\n@media (min-width:1024px){.gs-panel{max-width:460px;padding:32px}.gs-panel .gs-acts{flex-direction:row}}`;\n\nexport const GAME_SHELL_CSS = [THEME, ROOT, BASE, INSTALL, CRASH].join('\\n');\n\nexport function injectStyles(doc: Document = document): void {\n if (doc.getElementById(STYLE_ID)) {\n return;\n }\n const style = doc.createElement('style');\n style.id = STYLE_ID;\n style.textContent = GAME_SHELL_CSS;\n doc.head.append(style);\n}\n","import type { Disposable } from '../types';\n\nexport interface VersionPollOptions {\n url: string;\n intervalMs: number;\n onNewVersion(): void;\n fetchFn?: typeof fetch;\n win?: Window;\n}\n\nexport function startVersionPoll(opts: VersionPollOptions): Disposable {\n const win = opts.win ?? window;\n const fetchFn = opts.fetchFn ?? ((input: RequestInfo | URL, init?: RequestInit): Promise<Response> => win.fetch(input, init));\n let baseline: string | null = null;\n let fired = false;\n let busy = false;\n\n const check = async (): Promise<void> => {\n if (fired || busy) {\n return;\n }\n busy = true;\n try {\n const res = await fetchFn(opts.url, { cache: 'no-store' });\n if (!res.ok) {\n return;\n }\n const value = (await res.text()).trim();\n if (baseline === null) {\n baseline = value;\n } else if (value !== baseline) {\n fired = true;\n opts.onNewVersion();\n }\n } catch {\n // Offline or a deploy mid-flight: the next tick tries again.\n } finally {\n busy = false;\n }\n };\n const onVisibility = (): void => {\n if (win.document.visibilityState === 'visible') {\n void check();\n }\n };\n\n void check();\n const timer = win.setInterval(() => void check(), opts.intervalMs);\n win.document.addEventListener('visibilitychange', onVisibility);\n return {\n dispose: (): void => {\n win.clearInterval(timer);\n win.document.removeEventListener('visibilitychange', onVisibility);\n },\n };\n}\n","import { startCrash } from './crash/crash';\nimport type { CrashInfo } from './crash/crashKind';\nimport { startFit } from './fit/fit';\nimport { startInstall } from './install/install';\nimport { startLifecycle, type LifecycleOptions } from './lifecycle/lifecycle';\nimport { injectStyles } from './styles';\nimport type { Disposable, GameShellLabels } from './types';\nimport { startVersionPoll } from './version/versionPoll';\n\nexport interface GameShellOptions {\n root: HTMLElement;\n appName: string;\n labels: GameShellLabels;\n appVersion?: string;\n install?: { snoozeDays?: number; storageKey?: string } | false;\n version?: { url: string; intervalMs: number; onNewVersion(): void };\n crash?: { report?(info: CrashInfo): string | void } | false;\n lifecycle?: LifecycleOptions;\n}\n\nexport function initGameShell(opts: GameShellOptions): Disposable {\n const doc = opts.root.ownerDocument;\n injectStyles(doc);\n opts.root.classList.add('gs-root');\n const parts: Disposable[] = [startFit()];\n if (opts.install !== false) {\n parts.push(startInstall({ appName: opts.appName, labels: opts.labels, ...opts.install }));\n }\n if (opts.crash !== false) {\n parts.push(startCrash({ labels: opts.labels, report: opts.crash?.report, appVersion: opts.appVersion }));\n }\n if (opts.lifecycle) {\n parts.push(startLifecycle(opts.lifecycle, doc));\n }\n if (opts.version) {\n parts.push(startVersionPoll(opts.version));\n }\n return {\n dispose: (): void => {\n parts.forEach((part) => part.dispose());\n opts.root.classList.remove('gs-root');\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/crash/crashKind.ts","../src/dom.ts","../src/crash/crashOverlay.ts","../src/crash/crash.ts","../src/fit/fit.ts","../src/icons.ts","../src/install/banner.ts","../src/install/platform.ts","../src/install/snooze.ts","../src/install/install.ts","../src/lifecycle/lifecycle.ts","../src/styles.ts","../src/version/versionPoll.ts","../src/initGameShell.ts"],"names":["svg"],"mappings":"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","file":"index.js","sourcesContent":["export const CRASH_KIND = {\n Error: 'error',\n Rejection: 'rejection',\n} as const;\n\nexport type CrashKind = (typeof CRASH_KIND)[keyof typeof CRASH_KIND];\n\nexport interface CrashInfo {\n kind: CrashKind;\n message: string;\n source?: string;\n}\n","export function el<K extends keyof HTMLElementTagNameMap>(\n doc: Document,\n tag: K,\n className = '',\n text = '',\n): HTMLElementTagNameMap[K] {\n const node = doc.createElement(tag);\n if (className !== '') {\n node.className = className;\n }\n if (text !== '') {\n node.textContent = text;\n }\n return node;\n}\n\nexport function iconSpan(doc: Document, svg: string): HTMLSpanElement {\n const span = el(doc, 'span', 'gs-ico');\n span.innerHTML = svg;\n return span;\n}\n\ninterface ButtonSpec {\n className: string;\n text?: string;\n ariaLabel?: string;\n icon?: string;\n onClick(): void;\n}\n\nexport function button(doc: Document, spec: ButtonSpec): HTMLButtonElement {\n const btn = el(doc, 'button', spec.className);\n btn.type = 'button';\n if (spec.icon !== undefined) {\n btn.append(iconSpan(doc, spec.icon));\n }\n if (spec.text !== undefined) {\n btn.append(doc.createTextNode(spec.text));\n }\n if (spec.ariaLabel !== undefined) {\n btn.setAttribute('aria-label', spec.ariaLabel);\n }\n btn.addEventListener('click', () => spec.onClick());\n return btn;\n}\n","import { button, el } from '../dom';\nimport type { CrashLabels } from '../types';\n\nconst CRASH_TITLE_ID = 'gs-crash-title';\nconst CRASH_BODY_ID = 'gs-crash-body';\n\ninterface CrashOverlayProps {\n doc: Document;\n labels: CrashLabels;\n reference?: string;\n onReload(): void;\n onCopy(): void;\n}\n\ninterface CrashOverlayView {\n root: HTMLElement;\n reload: HTMLButtonElement;\n}\n\nexport function renderCrashOverlay(p: CrashOverlayProps): CrashOverlayView {\n const root = el(p.doc, 'div', 'gs gs-crash');\n root.setAttribute('role', 'alertdialog');\n root.setAttribute('aria-modal', 'true');\n root.setAttribute('aria-labelledby', CRASH_TITLE_ID);\n root.setAttribute('aria-describedby', CRASH_BODY_ID);\n const panel = el(p.doc, 'div', 'gs-panel');\n const title = el(p.doc, 'h2', 'gs-h', p.labels.crashTitle);\n title.id = CRASH_TITLE_ID;\n const body = el(p.doc, 'p', '', p.labels.crashBody);\n body.id = CRASH_BODY_ID;\n const acts = el(p.doc, 'div', 'gs-acts');\n const reload = button(p.doc, { className: 'gs-btn gs-primary', text: p.labels.reload, onClick: p.onReload });\n acts.append(reload, button(p.doc, { className: 'gs-btn gs-ghost', text: p.labels.copyDetails, onClick: p.onCopy }));\n panel.append(title, body, acts);\n if (p.reference !== undefined && p.reference !== '') {\n panel.append(el(p.doc, 'p', 'gs-ref', `${p.labels.errorReported} ${p.reference}`));\n }\n root.append(panel);\n return { root, reload };\n}\n","import type { CrashLabels, Disposable } from '../types';\nimport { CRASH_KIND, type CrashInfo } from './crashKind';\nimport { renderCrashOverlay } from './crashOverlay';\n\nexport interface CrashOptions {\n labels: CrashLabels;\n report?: (info: CrashInfo) => string | void;\n appVersion?: string;\n win?: Window;\n reload?: () => void;\n}\n\nfunction fromErrorEvent(e: ErrorEvent): CrashInfo {\n const err: unknown = e.error;\n const stack = err instanceof Error ? err.stack : undefined;\n const location = e.filename !== '' ? `${e.filename}:${e.lineno}:${e.colno}` : undefined;\n const message = e.message !== '' ? e.message : String(err);\n return { kind: CRASH_KIND.Error, message, source: stack ?? location };\n}\n\nfunction fromRejection(e: Event): CrashInfo {\n const reason: unknown = (e as PromiseRejectionEvent).reason;\n if (reason instanceof Error) {\n return { kind: CRASH_KIND.Rejection, message: reason.message, source: reason.stack };\n }\n return { kind: CRASH_KIND.Rejection, message: String(reason) };\n}\n\nfunction isErrorEvent(e: Event): e is ErrorEvent {\n return typeof (e as Partial<ErrorEvent>).message === 'string';\n}\n\nfunction safeReport(opts: CrashOptions, info: CrashInfo): string | undefined {\n try {\n return opts.report?.(info) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction copyDetails(win: Window, info: CrashInfo, appVersion?: string): void {\n const text = [info.message, info.source, appVersion]\n .filter((part): part is string => part !== undefined && part !== '')\n .join('\\n');\n try {\n win.navigator.clipboard.writeText(text).catch(() => undefined);\n } catch {\n // No clipboard API (insecure context): nothing to copy into.\n }\n}\n\nexport function startCrash(opts: CrashOptions): Disposable {\n const win = opts.win ?? window;\n const reload = opts.reload ?? ((): void => win.location.reload());\n let overlay: HTMLElement | null = null;\n\n const handle = (info: CrashInfo): void => {\n const reference = safeReport(opts, info);\n if (overlay) {\n return;\n }\n const view = renderCrashOverlay({\n doc: win.document,\n labels: opts.labels,\n reference,\n onReload: reload,\n onCopy: () => copyDetails(win, info, opts.appVersion),\n });\n overlay = view.root;\n win.document.body.append(overlay);\n view.reload.focus();\n };\n const onError = (e: Event): void => {\n if (isErrorEvent(e)) {\n handle(fromErrorEvent(e));\n }\n };\n const onRejection = (e: Event): void => handle(fromRejection(e));\n\n win.addEventListener('error', onError);\n win.addEventListener('unhandledrejection', onRejection);\n return {\n dispose: (): void => {\n win.removeEventListener('error', onError);\n win.removeEventListener('unhandledrejection', onRejection);\n overlay?.remove();\n overlay = null;\n },\n };\n}\n","import type { Disposable } from '../types';\n\nexport const GS_RESIZE_EVENT = 'gs:resize';\nexport const GS_VH_VAR = '--gs-vh';\n\nexport interface GsResizeDetail {\n width: number;\n height: number;\n}\n\nfunction measure(win: Window): GsResizeDetail {\n const vv = win.visualViewport;\n if (vv) {\n return { width: vv.width, height: vv.height };\n }\n return { width: win.innerWidth, height: win.innerHeight };\n}\n\nfunction scheduler(win: Window): (cb: () => void) => void {\n if (typeof win.requestAnimationFrame === 'function') {\n return (cb) => {\n win.requestAnimationFrame(() => cb());\n };\n }\n return (cb) => {\n win.setTimeout(cb, 0);\n };\n}\n\nexport function startFit(win: Window = window): Disposable {\n const root = win.document.documentElement;\n const schedule = scheduler(win);\n let last = measure(win);\n let pending = false;\n let disposed = false;\n root.style.setProperty(GS_VH_VAR, `${last.height}px`);\n\n const apply = (): void => {\n pending = false;\n const next = measure(win);\n const unchanged = next.width === last.width && next.height === last.height;\n if (disposed || unchanged) {\n return;\n }\n last = next;\n root.style.setProperty(GS_VH_VAR, `${next.height}px`);\n win.dispatchEvent(new CustomEvent<GsResizeDetail>(GS_RESIZE_EVENT, { detail: next }));\n };\n const onChange = (): void => {\n if (pending) {\n return;\n }\n pending = true;\n schedule(apply);\n };\n\n const vv = win.visualViewport;\n vv?.addEventListener('resize', onChange);\n win.addEventListener('resize', onChange);\n win.addEventListener('orientationchange', onChange);\n return {\n dispose: (): void => {\n disposed = true;\n root.style.removeProperty(GS_VH_VAR);\n vv?.removeEventListener('resize', onChange);\n win.removeEventListener('resize', onChange);\n win.removeEventListener('orientationchange', onChange);\n },\n };\n}\n","const svg = (paths: string): string =>\n `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths}</svg>`;\n\nexport const ICONS = {\n download: svg('<path d=\"M12 4v11M7 10l5 5 5-5M5 20h14\"/>'),\n add: svg('<path d=\"M12 5v14M5 12h14\"/>'),\n close: svg('<path d=\"M6 6l12 12M18 6L6 18\"/>'),\n share: svg('<path d=\"M12 15V4M8 8l4-4 4 4M6 12v8h12v-8\"/>'),\n} as const;\n","import { button, el, iconSpan } from '../dom';\nimport { ICONS } from '../icons';\nimport type { InstallLabels } from '../types';\nimport { BannerLayout } from './BannerLayout';\nimport { InstallVariant } from './InstallVariant';\n\nconst STEPS_ID = 'gs-install-steps';\n\ninterface BannerProps {\n doc: Document;\n layout: BannerLayout;\n variant: InstallVariant;\n appName: string;\n labels: InstallLabels;\n onInstall(): void;\n onDismiss(): void;\n}\n\nfunction renderSteps(p: BannerProps): HTMLOListElement {\n const list = el(p.doc, 'ol', 'gs-steps');\n list.id = STEPS_ID;\n const share = el(p.doc, 'li');\n share.append(iconSpan(p.doc, ICONS.share), p.doc.createTextNode(p.labels.tapShare));\n const add = el(p.doc, 'li');\n add.append(iconSpan(p.doc, ICONS.add), p.doc.createTextNode(p.labels.tapAdd));\n list.append(share, add);\n return list;\n}\n\nfunction closeButton(p: BannerProps, ariaLabel: string = p.labels.notNow): HTMLButtonElement {\n return button(p.doc, { className: 'gs-x', ariaLabel, icon: ICONS.close, onClick: p.onDismiss });\n}\n\nfunction renderChip(p: BannerProps): HTMLElement[] {\n const seal = el(p.doc, 'div', 'gs-seal');\n if (p.variant === InstallVariant.Prompt) {\n seal.append(button(p.doc, { className: 'gs-chip', text: p.labels.install, icon: ICONS.download, onClick: p.onInstall }));\n seal.append(closeButton(p));\n return [seal];\n }\n const steps = renderSteps(p);\n steps.hidden = true;\n const chip = button(p.doc, {\n className: 'gs-chip',\n text: p.labels.addToHome,\n icon: ICONS.add,\n onClick: () => {\n steps.hidden = !steps.hidden;\n chip.setAttribute('aria-expanded', String(!steps.hidden));\n },\n });\n chip.setAttribute('aria-expanded', 'false');\n chip.setAttribute('aria-controls', STEPS_ID);\n seal.append(chip, closeButton(p));\n return [seal, steps];\n}\n\nfunction renderCard(p: BannerProps): HTMLElement[] {\n const card = el(p.doc, 'div', 'gs-card');\n const app = el(p.doc, 'div', 'gs-app');\n app.append(el(p.doc, 'i'));\n const txt = el(p.doc, 'div', 'gs-txt');\n txt.append(el(p.doc, 'b', '', p.appName), el(p.doc, 'span', '', p.labels.installBody));\n const acts = el(p.doc, 'div', 'gs-acts');\n if (p.variant === InstallVariant.Prompt) {\n acts.append(button(p.doc, { className: 'gs-btn gs-primary', text: p.labels.install, icon: ICONS.download, onClick: p.onInstall }));\n }\n acts.append(button(p.doc, { className: 'gs-btn gs-ghost', text: p.labels.notNow, onClick: p.onDismiss }));\n card.append(closeButton(p, p.labels.close ?? p.labels.notNow), app, txt);\n if (p.variant === InstallVariant.Ios) {\n card.append(renderSteps(p));\n }\n card.append(acts);\n return [card];\n}\n\nexport function renderBanner(p: BannerProps): HTMLElement {\n const wrap = el(p.doc, 'div', 'gs gs-install');\n wrap.dataset.layout = p.layout;\n wrap.dataset.variant = p.variant;\n wrap.setAttribute('role', 'region');\n wrap.setAttribute('aria-label', p.variant === InstallVariant.Prompt ? p.labels.install : p.labels.addToHome);\n wrap.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n p.onDismiss();\n }\n });\n wrap.append(...(p.layout === BannerLayout.Card ? renderCard(p) : renderChip(p)));\n return wrap;\n}\n","export const DESKTOP_MIN_WIDTH = 1024;\nconst IOS_DEVICE_RE = /iPad|iPhone|iPod/;\nconst INSTALLED_DISPLAY_MODES = ['standalone', 'fullscreen'] as const;\nconst IOS_OTHER_BROWSER_RE = /CriOS|FxiOS|EdgiOS|OPiOS/;\n\ninterface IosNavigator extends Navigator {\n standalone?: boolean;\n}\n\nexport function isStandalone(win: Window): boolean {\n const media =\n typeof win.matchMedia === 'function' &&\n INSTALLED_DISPLAY_MODES.some((mode) => win.matchMedia(`(display-mode: ${mode})`).matches);\n return media || (win.navigator as IosNavigator).standalone === true;\n}\n\nexport function isIosSafari(win: Window): boolean {\n const ua = win.navigator.userAgent;\n const iPadAsMac = ua.includes('Macintosh') && win.navigator.maxTouchPoints > 1;\n const iosDevice = IOS_DEVICE_RE.test(ua) || iPadAsMac;\n return iosDevice && !IOS_OTHER_BROWSER_RE.test(ua);\n}\n\nexport function isDesktop(win: Window): boolean {\n return win.innerWidth >= DESKTOP_MIN_WIDTH;\n}\n","const DAY_MS = 86_400_000;\n\nexport function snoozeKey(appName: string, override?: string): string {\n return override ?? `gs-install-snooze:${appName}`;\n}\n\nexport function isSnoozed(win: Window, key: string, days: number, now: number): boolean {\n try {\n const raw = win.localStorage.getItem(key);\n if (raw === null) {\n return false;\n }\n const at = Number(raw);\n return Number.isFinite(at) && now - at < days * DAY_MS;\n } catch {\n return false;\n }\n}\n\nexport function writeSnooze(win: Window, key: string, now: number): void {\n try {\n win.localStorage.setItem(key, String(now));\n } catch {\n // Storage blocked (private mode, quota): the banner simply shows again next load.\n }\n}\n","import type { Disposable, InstallLabels } from '../types';\nimport { renderBanner } from './banner';\nimport { BannerLayout } from './BannerLayout';\nimport { InstallVariant } from './InstallVariant';\nimport { isDesktop, isIosSafari, isStandalone } from './platform';\nimport { isSnoozed, snoozeKey, writeSnooze } from './snooze';\n\nexport const DEFAULT_SNOOZE_DAYS = 14;\nconst ACCEPTED = 'accepted';\n\nexport interface BeforeInstallPromptEvent extends Event {\n prompt(): Promise<void>;\n userChoice: Promise<{ outcome: string }>;\n}\n\nexport interface InstallOptions {\n appName: string;\n labels: InstallLabels;\n snoozeDays?: number;\n storageKey?: string;\n win?: Window;\n now?: () => number;\n}\n\ninterface InstallState {\n deferred: BeforeInstallPromptEvent | null;\n variant: InstallVariant | null;\n node: HTMLElement | null;\n}\n\nfunction createController(opts: InstallOptions, win: Window, now: () => number): {\n state: InstallState;\n isDismissed(): boolean;\n mount(): void;\n unmount(): void;\n} {\n const key = snoozeKey(opts.appName, opts.storageKey);\n const state: InstallState = { deferred: null, variant: null, node: null };\n let dismissed = false;\n const unmount = (): void => {\n state.node?.remove();\n state.node = null;\n };\n const snooze = (): void => {\n writeSnooze(win, key, now());\n unmount();\n };\n const install = async (): Promise<void> => {\n const evt = state.deferred;\n state.deferred = null;\n if (!evt) {\n return;\n }\n try {\n await evt.prompt();\n const choice = await evt.userChoice;\n if (choice.outcome === ACCEPTED) {\n unmount();\n return;\n }\n snooze();\n } catch {\n unmount();\n }\n };\n const mount = (): void => {\n if (state.variant === null) {\n return;\n }\n unmount();\n state.node = renderBanner({\n doc: win.document,\n layout: isDesktop(win) ? BannerLayout.Card : BannerLayout.Chip,\n variant: state.variant,\n appName: opts.appName,\n labels: opts.labels,\n onInstall: () => void install(),\n onDismiss: () => {\n dismissed = true;\n snooze();\n },\n });\n win.document.body.append(state.node);\n };\n return { state, isDismissed: (): boolean => dismissed, mount, unmount };\n}\n\nexport function startInstall(opts: InstallOptions): Disposable {\n const win = opts.win ?? window;\n const now = opts.now ?? ((): number => Date.now());\n const key = snoozeKey(opts.appName, opts.storageKey);\n if (isStandalone(win) || isSnoozed(win, key, opts.snoozeDays ?? DEFAULT_SNOOZE_DAYS, now())) {\n return { dispose: (): void => undefined };\n }\n const ctl = createController(opts, win, now);\n const onPrompt = (e: Event): void => {\n e.preventDefault();\n ctl.state.deferred = e as BeforeInstallPromptEvent;\n ctl.state.variant = InstallVariant.Prompt;\n if (!ctl.isDismissed()) {\n ctl.mount();\n }\n };\n const onInstalled = (): void => {\n ctl.state.variant = null;\n ctl.unmount();\n };\n const onResize = (): void => {\n const node = ctl.state.node;\n if (node && (node.dataset.layout === BannerLayout.Card) !== isDesktop(win)) {\n ctl.mount();\n }\n };\n win.addEventListener('beforeinstallprompt', onPrompt);\n win.addEventListener('appinstalled', onInstalled);\n win.addEventListener('resize', onResize);\n if (isIosSafari(win)) {\n ctl.state.variant = InstallVariant.Ios;\n ctl.mount();\n }\n return {\n dispose: (): void => {\n win.removeEventListener('beforeinstallprompt', onPrompt);\n win.removeEventListener('appinstalled', onInstalled);\n win.removeEventListener('resize', onResize);\n ctl.unmount();\n },\n };\n}\n","import type { Disposable } from '../types';\n\nexport interface LifecycleOptions {\n onHidden?(): void;\n onVisible?(): void;\n}\n\nexport interface ResumableAudio {\n readonly state?: string;\n resume(): Promise<void> | void;\n}\n\nconst REDUCED_MOTION_QUERY = '(prefers-reduced-motion: reduce)';\nconst UNLOCK_EVENTS = ['pointerup', 'touchend', 'keydown'] as const;\nconst RUNNING = 'running';\n\nexport function startLifecycle(opts: LifecycleOptions, doc: Document = document): Disposable {\n const onChange = (): void => {\n if (doc.visibilityState === 'hidden') {\n opts.onHidden?.();\n return;\n }\n opts.onVisible?.();\n };\n doc.addEventListener('visibilitychange', onChange);\n return { dispose: (): void => doc.removeEventListener('visibilitychange', onChange) };\n}\n\nexport function unlockAudio(ctx: ResumableAudio, win: Window = window): Disposable {\n const detach = (): void => {\n UNLOCK_EVENTS.forEach((type) => win.removeEventListener(type, onGesture, true));\n };\n const settle = (): void => {\n if (ctx.state === undefined || ctx.state === RUNNING) {\n detach();\n }\n };\n function onGesture(): void {\n if (ctx.state === RUNNING) {\n detach();\n return;\n }\n try {\n Promise.resolve(ctx.resume()).then(settle, () => undefined);\n } catch {\n // A browser that refuses resume() leaves the game silent, never crashed.\n }\n }\n UNLOCK_EVENTS.forEach((type) => win.addEventListener(type, onGesture, true));\n return { dispose: detach };\n}\n\nexport function prefersReducedMotion(win: Window = window): boolean {\n if (new URLSearchParams(win.location.search).get('reducedMotion') === '1') {\n return true;\n }\n return typeof win.matchMedia === 'function' && win.matchMedia(REDUCED_MOTION_QUERY).matches;\n}\n","const STYLE_ID = 'gs-styles';\n\nconst THEME = `:where(:root){--gs-font-display:system-ui,'Segoe UI',sans-serif;--gs-font-text:system-ui,'Segoe UI',sans-serif;--gs-surface:rgba(24,26,29,.95);--gs-surface-solid:#181a1d;--gs-edge:#41464d;--gs-ink:#f3f3f1;--gs-ink-dim:#b9bdc2;--gs-accent:#f3f3f1;--gs-on-accent:#181a1d;--gs-scrim:rgba(0,0,0,.72);--gs-radius:12px;--gs-radius-pill:12px;--gs-focus:#9cc2ff;--gs-card-bottom:60px;--gs-safe-top:env(safe-area-inset-top,0px);--gs-safe-right:env(safe-area-inset-right,0px);--gs-safe-bottom:env(safe-area-inset-bottom,0px);--gs-safe-left:env(safe-area-inset-left,0px)}`;\n\nconst ROOT = `.gs-root{width:100%;height:100vh;height:100dvh;height:var(--gs-vh,100dvh)}`;\n\nconst BASE = `.gs{font-family:var(--gs-font-text);color:var(--gs-ink);box-sizing:border-box}\n.gs *{box-sizing:border-box}\n.gs button{min-width:44px;min-height:44px;margin:0;border:0;background:none;color:inherit;font:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}\n.gs button:focus-visible{outline:2px solid var(--gs-focus);outline-offset:2px}\n.gs svg{width:20px;height:20px;flex:none}\n.gs-ico{display:inline-flex}\n.gs-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 18px;border-radius:var(--gs-radius);font:700 16px/1 var(--gs-font-text);white-space:nowrap}\n.gs-primary{background:var(--gs-accent);color:var(--gs-on-accent)}\n.gs .gs-ghost{color:var(--gs-ink);border:1px solid var(--gs-edge)}\n.gs-x{width:44px;height:44px;display:grid;place-items:center;color:var(--gs-ink-dim);flex:none}\n.gs-txt{min-width:0}\n.gs-txt b{display:block;font:400 18px/1.2 var(--gs-font-display);color:var(--gs-ink)}\n.gs-txt span{display:block;font-size:14px;line-height:1.4;color:var(--gs-ink-dim);margin-top:3px}`;\n\nconst INSTALL = `.gs-install{position:fixed;z-index:2147483000;top:calc(12px + var(--gs-safe-top));left:calc(12px + var(--gs-safe-left))}\n.gs-install[data-layout=card]{top:auto;left:auto;right:calc(24px + var(--gs-safe-right));bottom:calc(var(--gs-card-bottom,60px) + var(--gs-safe-bottom))}\n.gs-seal{display:flex;align-items:center;background:var(--gs-surface);border:1px solid var(--gs-edge);border-radius:var(--gs-radius-pill)}\n.gs-chip{display:flex;align-items:center;gap:8px;padding:0 6px 0 14px;font:700 15px var(--gs-font-text);color:var(--gs-ink)}\n.gs-chip svg{color:var(--gs-accent)}\n.gs-seal .gs-x{border-left:1px solid var(--gs-edge)}\n.gs-steps{margin:8px 0 0;width:262px;padding:10px 14px;list-style:none;background:var(--gs-surface);border:1px solid var(--gs-edge);border-radius:var(--gs-radius);display:grid;gap:2px;counter-reset:s}\n.gs-steps[hidden]{display:none}\n.gs-steps li{display:flex;align-items:center;gap:10px;min-height:36px;font-size:15px;color:var(--gs-ink);counter-increment:s}\n.gs-steps li::before{content:counter(s);font:400 15px var(--gs-font-display);color:var(--gs-ink-dim);width:12px}\n.gs-steps svg{width:17px;height:17px;color:var(--gs-accent)}\n.gs-card{position:relative;width:344px;max-width:calc(100vw - 48px);padding:18px;border-radius:var(--gs-radius);background:var(--gs-surface);border:1px solid var(--gs-edge);display:grid;gap:12px}\n.gs-card .gs-x{position:absolute;top:4px;right:4px}\n.gs-card .gs-txt{padding-right:36px}\n.gs-card .gs-acts{display:flex;gap:8px}\n.gs-card .gs-steps{width:auto;margin:0;border:0;padding:0;background:none}\n.gs-app{width:40px;height:40px;border-radius:var(--gs-radius);background:var(--gs-surface-solid);border:1px solid var(--gs-edge);display:grid;place-items:center}\n.gs-app i{width:13px;height:13px;border-radius:50%;background:var(--gs-accent);box-shadow:0 0 10px var(--gs-accent)}`;\n\nconst CRASH = `.gs-crash{position:fixed;inset:0;z-index:2147483001;background:var(--gs-scrim);display:grid;place-items:center;padding:20px}\n.gs-panel{max-width:340px;background:var(--gs-surface-solid);border:1px solid var(--gs-edge);border-radius:var(--gs-radius);padding:24px}\n.gs-h{margin:0;font:400 28px/1.15 var(--gs-font-display);color:var(--gs-ink)}\n.gs-panel p{font-size:16px;line-height:1.5;color:var(--gs-ink-dim);margin:10px 0 0}\n.gs-panel .gs-acts{display:flex;flex-direction:column;gap:8px;margin-top:20px}\n.gs-panel .gs-ref{font:13px ui-monospace,monospace}\n@media (min-width:1024px){.gs-panel{max-width:460px;padding:32px}.gs-panel .gs-acts{flex-direction:row}}`;\n\nexport const GAME_SHELL_CSS = [THEME, ROOT, BASE, INSTALL, CRASH].join('\\n');\n\nexport function injectStyles(doc: Document = document): void {\n if (doc.getElementById(STYLE_ID)) {\n return;\n }\n const style = doc.createElement('style');\n style.id = STYLE_ID;\n style.textContent = GAME_SHELL_CSS;\n doc.head.append(style);\n}\n","import type { Disposable } from '../types';\n\nexport interface VersionPollOptions {\n url: string;\n intervalMs: number;\n onNewVersion(): void;\n fetchFn?: typeof fetch;\n win?: Window;\n}\n\nexport function startVersionPoll(opts: VersionPollOptions): Disposable {\n const win = opts.win ?? window;\n const fetchFn = opts.fetchFn ?? ((input: RequestInfo | URL, init?: RequestInit): Promise<Response> => win.fetch(input, init));\n let baseline: string | null = null;\n let fired = false;\n let busy = false;\n let disposed = false;\n let timer = 0;\n const stop = (): void => {\n win.clearInterval(timer);\n win.document.removeEventListener('visibilitychange', onVisibility);\n };\n\n const check = async (): Promise<void> => {\n if (fired || busy || disposed) {\n return;\n }\n busy = true;\n try {\n const res = await fetchFn(opts.url, { cache: 'no-store' });\n if (!res.ok || disposed) {\n return;\n }\n const value = (await res.text()).trim();\n if (disposed) {\n return;\n }\n if (baseline === null) {\n baseline = value;\n } else if (value !== baseline) {\n fired = true;\n stop();\n opts.onNewVersion();\n }\n } catch {\n // Offline or a deploy mid-flight: the next tick tries again.\n } finally {\n busy = false;\n }\n };\n function onVisibility(): void {\n if (win.document.visibilityState === 'visible') {\n void check();\n }\n }\n\n void check();\n timer = win.setInterval(() => void check(), opts.intervalMs);\n win.document.addEventListener('visibilitychange', onVisibility);\n return {\n dispose: (): void => {\n disposed = true;\n stop();\n },\n };\n}\n","import { startCrash } from './crash/crash';\nimport type { CrashInfo } from './crash/crashKind';\nimport { startFit } from './fit/fit';\nimport { startInstall } from './install/install';\nimport { startLifecycle, type LifecycleOptions } from './lifecycle/lifecycle';\nimport { injectStyles } from './styles';\nimport type { Disposable, GameShellLabels } from './types';\nimport { startVersionPoll } from './version/versionPoll';\n\nexport interface GameShellOptions {\n root: HTMLElement;\n appName: string;\n labels: GameShellLabels;\n appVersion?: string;\n install?: { snoozeDays?: number; storageKey?: string } | false;\n version?: { url: string; intervalMs: number; onNewVersion(): void };\n crash?: { report?(info: CrashInfo): string | void } | false;\n lifecycle?: LifecycleOptions;\n}\n\nexport function initGameShell(opts: GameShellOptions): Disposable {\n const doc = opts.root.ownerDocument;\n const win = doc.defaultView ?? window;\n injectStyles(doc);\n opts.root.classList.add('gs-root');\n const parts: Disposable[] = [startFit(win)];\n if (opts.install !== false) {\n parts.push(startInstall({ appName: opts.appName, labels: opts.labels, ...opts.install, win }));\n }\n if (opts.crash !== false) {\n parts.push(startCrash({ labels: opts.labels, report: opts.crash?.report, appVersion: opts.appVersion, win }));\n }\n if (opts.lifecycle) {\n parts.push(startLifecycle(opts.lifecycle, doc));\n }\n if (opts.version) {\n parts.push(startVersionPoll({ ...opts.version, win }));\n }\n return {\n dispose: (): void => {\n parts.forEach((part) => part.dispose());\n opts.root.classList.remove('gs-root');\n },\n };\n}\n"]}
package/dist/index.mjs CHANGED
@@ -76,6 +76,9 @@ function fromRejection(e) {
76
76
  }
77
77
  return { kind: CRASH_KIND.Rejection, message: String(reason) };
78
78
  }
79
+ function isErrorEvent(e) {
80
+ return typeof e.message === "string";
81
+ }
79
82
  function safeReport(opts, info) {
80
83
  try {
81
84
  return opts.report?.(info) ?? void 0;
@@ -111,7 +114,7 @@ function startCrash(opts) {
111
114
  view.reload.focus();
112
115
  };
113
116
  const onError = (e) => {
114
- if (e instanceof ErrorEvent) {
117
+ if (isErrorEvent(e)) {
115
118
  handle(fromErrorEvent(e));
116
119
  }
117
120
  };
@@ -180,6 +183,7 @@ function startFit(win = window) {
180
183
  return {
181
184
  dispose: () => {
182
185
  disposed = true;
186
+ root.style.removeProperty(GS_VH_VAR);
183
187
  vv?.removeEventListener("resize", onChange);
184
188
  win.removeEventListener("resize", onChange);
185
189
  win.removeEventListener("orientationchange", onChange);
@@ -208,8 +212,8 @@ function renderSteps(p) {
208
212
  list.append(share, add);
209
213
  return list;
210
214
  }
211
- function closeButton(p) {
212
- return button(p.doc, { className: "gs-x", ariaLabel: p.labels.notNow, icon: ICONS.close, onClick: p.onDismiss });
215
+ function closeButton(p, ariaLabel = p.labels.notNow) {
216
+ return button(p.doc, { className: "gs-x", ariaLabel, icon: ICONS.close, onClick: p.onDismiss });
213
217
  }
214
218
  function renderChip(p) {
215
219
  const seal = el(p.doc, "div", "gs-seal");
@@ -245,7 +249,7 @@ function renderCard(p) {
245
249
  acts.append(button(p.doc, { className: "gs-btn gs-primary", text: p.labels.install, icon: ICONS.download, onClick: p.onInstall }));
246
250
  }
247
251
  acts.append(button(p.doc, { className: "gs-btn gs-ghost", text: p.labels.notNow, onClick: p.onDismiss }));
248
- card.append(closeButton(p), app, txt);
252
+ card.append(closeButton(p, p.labels.close ?? p.labels.notNow), app, txt);
249
253
  if (p.variant === "ios" /* Ios */) {
250
254
  card.append(renderSteps(p));
251
255
  }
@@ -260,6 +264,7 @@ function renderBanner(p) {
260
264
  wrap.setAttribute("aria-label", p.variant === "prompt" /* Prompt */ ? p.labels.install : p.labels.addToHome);
261
265
  wrap.addEventListener("keydown", (e) => {
262
266
  if (e.key === "Escape") {
267
+ e.stopPropagation();
263
268
  p.onDismiss();
264
269
  }
265
270
  });
@@ -270,9 +275,10 @@ function renderBanner(p) {
270
275
  // src/install/platform.ts
271
276
  var DESKTOP_MIN_WIDTH = 1024;
272
277
  var IOS_DEVICE_RE = /iPad|iPhone|iPod/;
278
+ var INSTALLED_DISPLAY_MODES = ["standalone", "fullscreen"];
273
279
  var IOS_OTHER_BROWSER_RE = /CriOS|FxiOS|EdgiOS|OPiOS/;
274
280
  function isStandalone(win) {
275
- const media = typeof win.matchMedia === "function" && win.matchMedia("(display-mode: standalone)").matches;
281
+ const media = typeof win.matchMedia === "function" && INSTALLED_DISPLAY_MODES.some((mode) => win.matchMedia(`(display-mode: ${mode})`).matches);
276
282
  return media || win.navigator.standalone === true;
277
283
  }
278
284
  function isIosSafari(win) {
@@ -315,11 +321,12 @@ var ACCEPTED = "accepted";
315
321
  function createController(opts, win, now) {
316
322
  const key = snoozeKey(opts.appName, opts.storageKey);
317
323
  const state = { deferred: null, variant: null, node: null };
324
+ let dismissed = false;
318
325
  const unmount = () => {
319
326
  state.node?.remove();
320
327
  state.node = null;
321
328
  };
322
- const dismiss = () => {
329
+ const snooze = () => {
323
330
  writeSnooze(win, key, now());
324
331
  unmount();
325
332
  };
@@ -336,7 +343,7 @@ function createController(opts, win, now) {
336
343
  unmount();
337
344
  return;
338
345
  }
339
- dismiss();
346
+ snooze();
340
347
  } catch {
341
348
  unmount();
342
349
  }
@@ -353,11 +360,14 @@ function createController(opts, win, now) {
353
360
  appName: opts.appName,
354
361
  labels: opts.labels,
355
362
  onInstall: () => void install(),
356
- onDismiss: dismiss
363
+ onDismiss: () => {
364
+ dismissed = true;
365
+ snooze();
366
+ }
357
367
  });
358
368
  win.document.body.append(state.node);
359
369
  };
360
- return { state, mount, unmount };
370
+ return { state, isDismissed: () => dismissed, mount, unmount };
361
371
  }
362
372
  function startInstall(opts) {
363
373
  const win = opts.win ?? window;
@@ -371,7 +381,9 @@ function startInstall(opts) {
371
381
  e.preventDefault();
372
382
  ctl.state.deferred = e;
373
383
  ctl.state.variant = "prompt" /* Prompt */;
374
- ctl.mount();
384
+ if (!ctl.isDismissed()) {
385
+ ctl.mount();
386
+ }
375
387
  };
376
388
  const onInstalled = () => {
377
389
  ctl.state.variant = null;
@@ -402,7 +414,8 @@ function startInstall(opts) {
402
414
 
403
415
  // src/lifecycle/lifecycle.ts
404
416
  var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
405
- var UNLOCK_EVENTS = ["pointerdown", "keydown"];
417
+ var UNLOCK_EVENTS = ["pointerup", "touchend", "keydown"];
418
+ var RUNNING = "running";
406
419
  function startLifecycle(opts, doc = document) {
407
420
  const onChange = () => {
408
421
  if (doc.visibilityState === "hidden") {
@@ -416,16 +429,24 @@ function startLifecycle(opts, doc = document) {
416
429
  }
417
430
  function unlockAudio(ctx, win = window) {
418
431
  const detach = () => {
419
- UNLOCK_EVENTS.forEach((type) => win.removeEventListener(type, onFirst, true));
432
+ UNLOCK_EVENTS.forEach((type) => win.removeEventListener(type, onGesture, true));
433
+ };
434
+ const settle = () => {
435
+ if (ctx.state === void 0 || ctx.state === RUNNING) {
436
+ detach();
437
+ }
420
438
  };
421
- function onFirst() {
422
- detach();
439
+ function onGesture() {
440
+ if (ctx.state === RUNNING) {
441
+ detach();
442
+ return;
443
+ }
423
444
  try {
424
- Promise.resolve(ctx.resume()).catch(() => void 0);
445
+ Promise.resolve(ctx.resume()).then(settle, () => void 0);
425
446
  } catch {
426
447
  }
427
448
  }
428
- UNLOCK_EVENTS.forEach((type) => win.addEventListener(type, onFirst, true));
449
+ UNLOCK_EVENTS.forEach((type) => win.addEventListener(type, onGesture, true));
429
450
  return { dispose: detach };
430
451
  }
431
452
  function prefersReducedMotion(win = window) {
@@ -495,21 +516,31 @@ function startVersionPoll(opts) {
495
516
  let baseline = null;
496
517
  let fired = false;
497
518
  let busy = false;
519
+ let disposed = false;
520
+ let timer = 0;
521
+ const stop = () => {
522
+ win.clearInterval(timer);
523
+ win.document.removeEventListener("visibilitychange", onVisibility);
524
+ };
498
525
  const check = async () => {
499
- if (fired || busy) {
526
+ if (fired || busy || disposed) {
500
527
  return;
501
528
  }
502
529
  busy = true;
503
530
  try {
504
531
  const res = await fetchFn(opts.url, { cache: "no-store" });
505
- if (!res.ok) {
532
+ if (!res.ok || disposed) {
506
533
  return;
507
534
  }
508
535
  const value = (await res.text()).trim();
536
+ if (disposed) {
537
+ return;
538
+ }
509
539
  if (baseline === null) {
510
540
  baseline = value;
511
541
  } else if (value !== baseline) {
512
542
  fired = true;
543
+ stop();
513
544
  opts.onNewVersion();
514
545
  }
515
546
  } catch {
@@ -517,18 +548,18 @@ function startVersionPoll(opts) {
517
548
  busy = false;
518
549
  }
519
550
  };
520
- const onVisibility = () => {
551
+ function onVisibility() {
521
552
  if (win.document.visibilityState === "visible") {
522
553
  void check();
523
554
  }
524
- };
555
+ }
525
556
  void check();
526
- const timer = win.setInterval(() => void check(), opts.intervalMs);
557
+ timer = win.setInterval(() => void check(), opts.intervalMs);
527
558
  win.document.addEventListener("visibilitychange", onVisibility);
528
559
  return {
529
560
  dispose: () => {
530
- win.clearInterval(timer);
531
- win.document.removeEventListener("visibilitychange", onVisibility);
561
+ disposed = true;
562
+ stop();
532
563
  }
533
564
  };
534
565
  }
@@ -536,20 +567,21 @@ function startVersionPoll(opts) {
536
567
  // src/initGameShell.ts
537
568
  function initGameShell(opts) {
538
569
  const doc = opts.root.ownerDocument;
570
+ const win = doc.defaultView ?? window;
539
571
  injectStyles(doc);
540
572
  opts.root.classList.add("gs-root");
541
- const parts = [startFit()];
573
+ const parts = [startFit(win)];
542
574
  if (opts.install !== false) {
543
- parts.push(startInstall({ appName: opts.appName, labels: opts.labels, ...opts.install }));
575
+ parts.push(startInstall({ appName: opts.appName, labels: opts.labels, ...opts.install, win }));
544
576
  }
545
577
  if (opts.crash !== false) {
546
- parts.push(startCrash({ labels: opts.labels, report: opts.crash?.report, appVersion: opts.appVersion }));
578
+ parts.push(startCrash({ labels: opts.labels, report: opts.crash?.report, appVersion: opts.appVersion, win }));
547
579
  }
548
580
  if (opts.lifecycle) {
549
581
  parts.push(startLifecycle(opts.lifecycle, doc));
550
582
  }
551
583
  if (opts.version) {
552
- parts.push(startVersionPoll(opts.version));
584
+ parts.push(startVersionPoll({ ...opts.version, win }));
553
585
  }
554
586
  return {
555
587
  dispose: () => {