packing-bingo 0.5.0 → 0.6.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.
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { CSSProperties } from 'react';
3
- import { PackingBingoOptions, PackingBingoState } from './core.cjs';
4
- export { BingoEvent, BingoItem, DEFAULT_ITEMS, LINES, Messages, PackingBingoInstance, PerfectEvent, bingoLines, createPackingBingo, en, ja } from './core.cjs';
3
+ import { PackingBingoOptions, BingoMode, PackingBingoState } from './core.cjs';
4
+ export { BingoEvent, BingoItem, DEFAULT_ITEMS, FinishEvent, LINES, Messages, PackingBingoInstance, PerfectEvent, bingoLines, createPackingBingo, en, ja, speedBonus } from './core.cjs';
5
5
 
6
6
  interface PackingBingoProps extends Omit<PackingBingoOptions, "controlled" | "defaultChecked"> {
7
7
  /** Controlled state (one boolean per item). Update it from `onChange`. */
@@ -16,6 +16,10 @@ interface PackingBingoHandle {
16
16
  reset(): void;
17
17
  /** Move the items to random squares, as the 🔀 button does. Checks stay with their items. */
18
18
  shuffle(): void;
19
+ /** Switch between the packing card and the infinite mode, as the switch does (with its animation). */
20
+ setMode(mode: BingoMode): void;
21
+ /** End a running infinite game and show its results, as the 🏁 FINISH button does. */
22
+ finish(): void;
19
23
  /** Set the card. A one-item change plays like a tap; bigger jumps apply quietly. */
20
24
  setChecked(checked: readonly boolean[]): void;
21
25
  getState(): PackingBingoState | null;
@@ -26,5 +30,5 @@ interface PackingBingoHandle {
26
30
  */
27
31
  declare const PackingBingo: react.ForwardRefExoticComponent<PackingBingoProps & react.RefAttributes<PackingBingoHandle>>;
28
32
 
29
- export { PackingBingo, PackingBingoOptions, PackingBingoState };
33
+ export { BingoMode, PackingBingo, PackingBingoOptions, PackingBingoState };
30
34
  export type { PackingBingoHandle, PackingBingoProps };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { CSSProperties } from 'react';
3
- import { PackingBingoOptions, PackingBingoState } from './core.js';
4
- export { BingoEvent, BingoItem, DEFAULT_ITEMS, LINES, Messages, PackingBingoInstance, PerfectEvent, bingoLines, createPackingBingo, en, ja } from './core.js';
3
+ import { PackingBingoOptions, BingoMode, PackingBingoState } from './core.js';
4
+ export { BingoEvent, BingoItem, DEFAULT_ITEMS, FinishEvent, LINES, Messages, PackingBingoInstance, PerfectEvent, bingoLines, createPackingBingo, en, ja, speedBonus } from './core.js';
5
5
 
6
6
  interface PackingBingoProps extends Omit<PackingBingoOptions, "controlled" | "defaultChecked"> {
7
7
  /** Controlled state (one boolean per item). Update it from `onChange`. */
@@ -16,6 +16,10 @@ interface PackingBingoHandle {
16
16
  reset(): void;
17
17
  /** Move the items to random squares, as the 🔀 button does. Checks stay with their items. */
18
18
  shuffle(): void;
19
+ /** Switch between the packing card and the infinite mode, as the switch does (with its animation). */
20
+ setMode(mode: BingoMode): void;
21
+ /** End a running infinite game and show its results, as the 🏁 FINISH button does. */
22
+ finish(): void;
19
23
  /** Set the card. A one-item change plays like a tap; bigger jumps apply quietly. */
20
24
  setChecked(checked: readonly boolean[]): void;
21
25
  getState(): PackingBingoState | null;
@@ -26,5 +30,5 @@ interface PackingBingoHandle {
26
30
  */
27
31
  declare const PackingBingo: react.ForwardRefExoticComponent<PackingBingoProps & react.RefAttributes<PackingBingoHandle>>;
28
32
 
29
- export { PackingBingo, PackingBingoOptions, PackingBingoState };
33
+ export { BingoMode, PackingBingo, PackingBingoOptions, PackingBingoState };
30
34
  export type { PackingBingoHandle, PackingBingoProps };
package/dist/index.js CHANGED
@@ -6,18 +6,20 @@ import {
6
6
  createPackingBingo,
7
7
  en,
8
8
  ja,
9
- resolveStorageKey
10
- } from "./chunk-ZPZZDZUH.js";
9
+ resolveStorageKey,
10
+ speedBonus
11
+ } from "./chunk-A5JVNVWS.js";
11
12
 
12
13
  // src/react.tsx
13
14
  import { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
14
15
  import { jsx } from "react/jsx-runtime";
15
16
  var PackingBingo = forwardRef(function PackingBingo2(props, ref) {
16
- const { checked, defaultChecked, defaultOrder, className, style, onChange, onBingo, onPerfect, messages, fonts: _fonts, ...config } = props;
17
+ const { checked, defaultChecked, defaultOrder, className, style, onChange, onBingo, onPerfect, onModeChange, onFinish, mode, messages, fonts: _fonts, ...config } = props;
17
18
  const host = useRef(null);
18
19
  const inst = useRef(null);
19
- const callbacks = useRef({ onChange, onBingo, onPerfect });
20
- callbacks.current = { onChange, onBingo, onPerfect };
20
+ const callbacks = useRef({ onChange, onBingo, onPerfect, onModeChange, onFinish });
21
+ callbacks.current = { onChange, onBingo, onPerfect, onModeChange, onFinish };
22
+ const latestMode = useRef(mode);
21
23
  const messagesRef = useRef(messages);
22
24
  messagesRef.current = messages;
23
25
  const controlled = checked !== void 0;
@@ -47,13 +49,20 @@ var PackingBingo = forwardRef(function PackingBingo2(props, ref) {
47
49
  callbacks.current.onChange?.(next);
48
50
  },
49
51
  onBingo: (e) => callbacks.current.onBingo?.(e),
50
- onPerfect: (e) => callbacks.current.onPerfect?.(e)
52
+ onPerfect: (e) => callbacks.current.onPerfect?.(e),
53
+ onFinish: (e) => callbacks.current.onFinish?.(e),
54
+ mode: latestMode.current,
55
+ onModeChange: (m) => {
56
+ latestMode.current = m;
57
+ callbacks.current.onModeChange?.(m);
58
+ }
51
59
  });
52
60
  inst.current = instance;
53
61
  return () => {
54
62
  const state = instance.getState();
55
- if (!controlled) latest.current = state.checked;
56
- latestOrder.current = state.order;
63
+ const packed = state.packing ?? state;
64
+ if (!controlled) latest.current = packed.checked;
65
+ latestOrder.current = packed.order;
57
66
  latestKey.current = storageKey;
58
67
  instance.destroy();
59
68
  if (inst.current === instance) inst.current = null;
@@ -65,11 +74,16 @@ var PackingBingo = forwardRef(function PackingBingo2(props, ref) {
65
74
  useEffect(() => {
66
75
  if (controlled && checked) inst.current?.setChecked(checked, { animate: true });
67
76
  }, [controlled, checked]);
77
+ useEffect(() => {
78
+ if (mode) inst.current?.setMode(mode);
79
+ }, [mode]);
68
80
  useImperativeHandle(
69
81
  ref,
70
82
  () => ({
71
83
  reset: () => inst.current?.reset(),
72
84
  shuffle: () => inst.current?.shuffle(),
85
+ setMode: (m) => inst.current?.setMode(m),
86
+ finish: () => inst.current?.finish(),
73
87
  setChecked: (next) => inst.current?.setChecked(next, { animate: true }),
74
88
  getState: () => inst.current?.getState() ?? null
75
89
  }),
@@ -84,5 +98,6 @@ export {
84
98
  bingoLines,
85
99
  createPackingBingo,
86
100
  en,
87
- ja
101
+ ja,
102
+ speedBonus
88
103
  };
@@ -1,8 +1,6 @@
1
- "use strict";var PackingBingo=(()=>{var tt=Object.defineProperty;var sn=Object.getOwnPropertyDescriptor;var pn=Object.getOwnPropertyNames;var ln=Object.prototype.hasOwnProperty;var cn=(a,t)=>{for(var p in t)tt(a,p,{get:t[p],enumerable:!0})},bn=(a,t,p,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let x of pn(t))!ln.call(a,x)&&x!==p&&tt(a,x,{get:()=>t[x],enumerable:!(u=sn(t,x))||u.enumerable});return a};var dn=a=>bn(tt({},"__esModule",{value:!0}),a);var wn={};cn(wn,{DEFAULT_ITEMS:()=>ue,LINES:()=>kn,bingoLines:()=>rt,createPackingBingo:()=>yn,en:()=>Pt,ja:()=>ke});var ue=[{emoji:"\u{1F45B}",label:"\u8CA1\u5E03"},{emoji:"\u{1F4F1}",label:"\u30B9\u30DE\u30DB"},{emoji:"\u{1F50B}",label:"\u30E2\u30D0\u30A4\u30EB\u200B\u5145\u96FB\u5668"},{emoji:"\u{1F4CB}",label:"\u5065\u5EB7\u8ABF\u67FB\u7968"},{emoji:"\u{1FAAA}",label:"\u30DE\u30A4\u30CA\u30AB\u30FC\u30C9\u200B\u307E\u305F\u306F\u4FDD\u967A\u8A3C"},{emoji:"\u{1F4D6}",label:"\u3057\u304A\u308A"},{emoji:"\u{1F637}",label:"\u30DE\u30B9\u30AF"},{emoji:"\u{1F927}",label:"\u30CF\u30F3\u30AB\u30C1"},{emoji:"\u{1F48A}",label:"\u5E38\u5099\u85AC"},{emoji:"\u{1F6CD}\uFE0F",label:"\u30D3\u30CB\u30FC\u30EB\u888B"},{emoji:"\u{1F9E4}",label:"\u8ECD\u624B\uFF08\u5B66\u6821\u652F\u7D66\uFF09"},{emoji:"\u{1F526}",label:"\u30D8\u30C3\u30C9\u30E9\u30A4\u30C8"},{emoji:"\u{1F455}",label:"\u30B8\u30E3\u30FC\u30B8"},{emoji:"\u2614",label:"\u96E8\u5177"},{emoji:"\u{1F6C1}",label:"\u30BF\u30AA\u30EB"},{emoji:"\u{1F9F4}",label:"\u65E5\u713C\u3051\u6B62\u3081"}];var Re=2,nt=10,Ie=a=>{throw new Error(`[packing-bingo] ${a}`)};function at(a){if(a.items)return a.items;let t=a.size;return t==null||!Number.isInteger(t)||t<Re?ue:ue.slice(0,t*t-(a.free?1:0))}function $t(a,t){(!Number.isInteger(a)||a<Re||a>nt)&&Ie(`"size" must be a whole number from ${Re} to ${nt} (got ${a}).`),t&&a%2===0&&Ie(`"free" needs an odd size such as 3 or 5, so that the card has a center (got ${a}).`)}function zt(a,t){let p=d=>Array.from({length:a},(f,B)=>d(B)),u=[...p(d=>p(f=>d*a+f)),...p(d=>p(f=>f*a+d)),p(d=>d*(a+1)),p(d=>(d+1)*(a-1))],x=t?(a*a-1)/2:-1,h=d=>t&&d>x?d-1:d;return{center:x,cellLines:u,lines:u.map(d=>d.filter(f=>f!==x).map(h))}}function At(a){let t=at(a),p=!!a.free,u=a.size;if(u==null){let T=t.length,l=c=>{let k=Math.round(Math.sqrt(c));return k*k===c&&k>=Re&&k<=nt?k:0};if(u=l(T+(p?1:0)),!u){let c=l(T+(p?0:1)),k=p?c?`; ${T} items fill a ${c}\xD7${c} card without "free"`:"":c%2?`, or set "free" for a ${c}\xD7${c} card with a FREE center`:"";Ie(p?`With "free", "items" must have one less than an odd square number of entries (8, 24, 48, 80)${k} (got ${T}).`:`"items" must have a square number of entries (4, 9, 16, 25, \u2026, 100)${k} (got ${T}).`)}}$t(u,p);let x=u*u-(p?1:0);if(t.length!==x){let T=`a ${u}\xD7${u} card${p?" with a FREE center":""}`;Ie(a.items?`"items" must have exactly ${x} entries for ${T} (got ${t.length}).`:`A ${T.slice(2)} needs ${x} items, but DEFAULT_ITEMS has only ${ue.length}. Pass "items".`)}let{center:h,cellLines:d,lines:f}=zt(u,p),B=t.map((T,l)=>p&&l>=h?l+1:l);return{size:u,free:p,items:t,itemCell:B,center:h,cellLines:d,lines:f}}function rt(a,t=!1){return $t(a,t),zt(a,t).lines}var ke={title:"\u6301\u3061\u3082\u306E\u30D3\u30F3\u30B4",tag:"",subtitle:"",packed:"\u305D\u308D\u3063\u305F",bingo:"BINGO",score:"SCORE",combo:a=>`${a} COMBO`,comboPop:a=>`${a} COMBO!`,reset:"\u30EA\u30BB\u30C3\u30C8",shuffle:"\u{1F500} \u30B7\u30E3\u30C3\u30D5\u30EB",soundOn:"\u{1F50A} \u97F3\u3042\u308A",soundOff:"\u{1F507} \u97F3\u306A\u3057",soundHint:"\u7AEF\u672B\u306E\u97F3\u91CF\u3092\u4E0A\u3052\u3066\u306D\u3002",vibrationHint:"Android\u3067\u632F\u52D5\u3092\u697D\u3057\u3080\u306B\u306F\u3001\u304A\u3084\u3059\u307F\u30E2\u30FC\u30C9\uFF08Do Not Disturb\uFF09\u3092OFF\u306B\u3057\u3066\u306D\u3002",playTitle:"\u97F3\u3068\u632F\u52D5\u306E\u6E96\u5099\u306FOK\uFF1F",playStart:"\u6E96\u5099OK\uFF01\u306F\u3058\u3081\u308B",playSkip:"\u3053\u306E\u307E\u307E\u904A\u3076",stamp:"OK",free:"FREE",reachBadge:"\u30EA\u30FC\u30C1",reachPop:"\u30EA\u30FC\u30C1!",bannerSingle:"BINGO!",bannerDouble:"\u30C0\u30D6\u30EB\u30D3\u30F3\u30B4!",bannerTriple:"\u30C8\u30EA\u30D7\u30EB\u30D3\u30F3\u30B4!",bannerNth:a=>`${a} \u30E9\u30A4\u30F3\u76EE\uFF01`,bannerMulti:a=>`\u4E00\u6C17\u306B ${a} \u30E9\u30A4\u30F3\uFF01`,statusStart:()=>"",statusLines:(a,t)=>`\u30D3\u30F3\u30B4 ${a} \u30E9\u30A4\u30F3\uFF01 \u306E\u3053\u308A ${t} \u3053`,statusReach:()=>"",statusDone:"\u{1F389} \u30D1\u30FC\u30D5\u30A7\u30AF\u30C8\uFF01\u5FD8\u308C\u7269\u30BC\u30ED\u3067\u51FA\u767A\u3067\u304D\u307E\u3059",perfectTag:"\u{1F3C6} PERFECT",perfectStamp:`\u6E96\u5099
2
- \u5B8C\u4E86`,perfectTitle:"\u30D1\u30FC\u30D5\u30A7\u30AF\u30C8\uFF01",perfectBody:a=>`${a}\u3053 \u305C\u3093\u3076\u305D\u308D\u3063\u305F\uFF01
3
- \u5FD8\u308C\u7269\u30BC\u30ED\u3067\u3001\u3044\u3063\u3066\u3089\u3063\u3057\u3083\u3044\uFF01`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",statCombo:"MAX COMBO",statLines:"BINGO",close:"\u3068\u3058\u308B",demoLabel:"\u30C7\u30E2\uFF1A",demoBingo:"\u25B6 \u30D3\u30F3\u30B4\u3092\u898B\u308B",demoPerfect:"\u25B6 \u30B3\u30F3\u30DC \u2192 \u30D1\u30FC\u30D5\u30A7\u30AF\u30C8",demoRestore:"\u6700\u521D\u306B\u623B\u3059"},Pt={title:"Packing Bingo",tag:"",subtitle:"",packed:"PACKED",bingo:"BINGO",score:"SCORE",combo:a=>`${a} COMBO`,comboPop:a=>`${a} COMBO!`,reset:"Reset",shuffle:"\u{1F500} Shuffle",soundOn:"\u{1F50A} Sound on",soundOff:"\u{1F507} Muted",soundHint:"Turn up your device volume before playing.",vibrationHint:"On Android, turn off Do Not Disturb to enjoy vibration.",playTitle:"Ready for sound and vibration?",playStart:"Ready! Let's play",playSkip:"Play as is",stamp:"OK",free:"FREE",reachBadge:"REACH",reachPop:"Reach!",bannerSingle:"BINGO!",bannerDouble:"DOUBLE BINGO!",bannerTriple:"TRIPLE BINGO!",bannerNth:a=>`Line ${a}!`,bannerMulti:a=>`${a} lines at once!`,statusStart:()=>"",statusLines:(a,t)=>`${a} bingo line${a===1?"":"s"}! ${t} to go`,statusReach:()=>"",statusDone:"\u{1F389} Perfect! Nothing left behind.",perfectTag:"\u{1F3C6} PERFECT",perfectStamp:`ALL
4
- SET`,perfectTitle:"Perfect!",perfectBody:a=>`All ${a} packed!
5
- Have a great trip!`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",statCombo:"MAX COMBO",statLines:"BINGO",close:"Close",demoLabel:"Demo:",demoBingo:"\u25B6 Show a bingo",demoPerfect:"\u25B6 Combo \u2192 perfect",demoRestore:"Restore"};var Ot=[0,2,4,7,9,12,14,16,19,21,24,26,28,31,33,36],W=a=>523.25*Math.pow(2,a/12);function Ft(a){let t=null,p=null,u=new Map;function x(l,c,k,w){u.set(l,{gain:c,start:k}),l.onended=()=>{u.delete(l),l.disconnect(),w.forEach(M=>M.disconnect())}}function h(){let l=t?.currentTime??0;u.forEach(({gain:c,start:k},w)=>{try{if(k>l)c.gain.cancelScheduledValues(l),c.gain.setValueAtTime(0,l),w.stop(l);else{if(typeof c.gain.cancelAndHoldAtTime=="function")c.gain.cancelAndHoldAtTime(l);else{let M=c.gain.value;c.gain.cancelScheduledValues(l),c.gain.setValueAtTime(M,l)}c.gain.linearRampToValueAtTime(0,l+.01),w.stop(l+.01)}}catch{}}),u.clear()}function d(){if(a()||typeof window>"u"||document.hidden)return null;let l=navigator.userActivation;if(!t&&l&&!l.hasBeenActive)return null;if(!t){let c=window.AudioContext??window.webkitAudioContext;if(!c)return null;t=new c;let k=t.createDynamicsCompressor();p=t.createGain(),p.gain.value=.6,p.connect(k).connect(t.destination)}return t.state==="suspended"&&t.resume(),t}function f(l,c=0,k=.15,w="triangle",M=.2,G=0){let z=d();if(!z||!p)return;let F=z.currentTime+c,j=z.createOscillator(),g=z.createGain();j.type=w,j.frequency.setValueAtTime(l,F),G&&j.frequency.exponentialRampToValueAtTime(G,F+k),g.gain.setValueAtTime(1e-4,F),g.gain.exponentialRampToValueAtTime(M,F+.01),g.gain.exponentialRampToValueAtTime(1e-4,F+k),j.connect(g).connect(p),x(j,g,F,[g]),j.start(F),j.stop(F+k+.05)}function B(l=0,c=.3,k=.25,w=1200){let M=d();if(!M||!p)return;let G=M.currentTime+l,z=Math.ceil(M.sampleRate*c),F=M.createBuffer(1,z,M.sampleRate),j=F.getChannelData(0);for(let Y=0;Y<z;Y++)j[Y]=(Math.random()*2-1)*Math.pow(1-Y/z,2.5);let g=M.createBufferSource(),ae=M.createBiquadFilter(),_=M.createGain();g.buffer=F,ae.type="bandpass",ae.frequency.value=w,ae.Q.value=.7,_.gain.value=k,g.connect(ae).connect(_).connect(p),x(g,_,G,[ae,_]),g.start(G)}let T=l=>W(Ot[Math.min(Math.max(l,0),Ot.length-1)]);return{pop(l){let c=T(l),k=Math.min(3,Math.floor((l+1)/3));f(c,0,.16,"triangle",.22),f(c*2,0,.08,"sine",.06),f(170+k*15,0,.11,"sine",.28,48),B(0,.035,.1+k*.025,1800),k&&f(c*1.5,.035,.11,"triangle",.04+k*.015)},off:()=>f(392,0,.1,"sine",.1,262),reach(){f(988,0,.08,"square",.05),f(1319,.09,.14,"square",.05)},bingo(l){[0,4,7,12,16,19].forEach((c,k)=>f(W(c),k*.06,.22,"square",.06)),[12,16,19].forEach(c=>f(W(c),.38,.6,"triangle",.12)),l>1&&[24,28,31].forEach(c=>f(W(c),.55,.6,"triangle",.08)),B(0,.25,.12,3e3)},perfect(){[0,4,7,12,16,19,24].forEach((l,c)=>f(W(l-12),c*.07,.25,"square",.06)),[0,4,7,12].forEach(l=>f(W(l),.55,1.2,"triangle",.12)),[12,16,19].forEach(l=>f(W(l),.55,1.2,"sawtooth",.03)),f(W(-12),.55,1.2,"sine",.2)},boom(){B(0,.5,.3,500),f(90,0,.3,"sine",.25,40)},tick:()=>f(1760,0,.03,"square",.03),note:(l,c=0)=>f(T(l),c,.12,"square",.05),shuffle(){for(let l=0;l<7;l++)B(l*.042,.05,.16,1600+l*260);f(W(7),.34,.12,"triangle",.14),f(W(12),.42,.2,"triangle",.14)},stop:h,close(){h(),t&&t.close().catch(()=>{}),t=null,p=null}}}var qe=null;function Rt(a){let t={},p=0,u=()=>{if(p++,qe===t){qe=null;try{navigator.vibrate?.(0)}catch{}}},x=h=>{if(!a||document.hidden||typeof navigator.vibrate!="function"||navigator.userActivation&&!navigator.userActivation.hasBeenActive)return!1;try{if(navigator.vibrate(h))return qe=t,!0}catch{}return!1};return{play(h,d=1,f=1,B=360){let T=++p,l=Math.min(3,Math.floor(d/3)),c=Math.max(80,B-40),k=h==="off"?35:h==="perfect"?[160,45,100]:h==="bingo"?f>=3?[c,40,500,50,650,50,850]:f===2?[c,40,500,50,650]:[c,40,500]:h==="reach"?[140,40,240]:h==="shuffle"?[90,35,90,35,220]:l?[100+l*20,15,80+l*20]:90;if(x(k))return w=>{p===T&&qe===t&&x([...w])}},stop:u}}var It=[260,45,160],qt=[{at:1820,beat:[200]},{at:2170,beat:[100,35,160]},{at:2520,beat:[260]},{at:3e3,beat:[110,40,110]},{at:3430,beat:[320]},{at:3950,beat:[140,40,200]},{at:4540,beat:[460]}];function Nt(a){return a.controlled?null:a.storageKey!==void 0?a.storageKey||null:a.demo?null:fn(at(a))}function fn(a){let t=a.map(u=>`${u.emoji}\0${u.label}`).join(""),p=2166136261;for(let u=0;u<t.length;u++)p^=t.charCodeAt(u),p=Math.imul(p,16777619);return`packing-bingo:${(p>>>0).toString(36)}`}var Ht=`
1
+ "use strict";var PackingBingo=(()=>{var Pt=Object.defineProperty;var aa=Object.getOwnPropertyDescriptor;var ra=Object.getOwnPropertyNames;var ia=Object.prototype.hasOwnProperty;var oa=(r,n)=>{for(var f in n)Pt(r,f,{get:n[f],enumerable:!0})},sa=(r,n,f,u)=>{if(n&&typeof n=="object"||typeof n=="function")for(let y of ra(n))!ia.call(r,y)&&y!==f&&Pt(r,y,{get:()=>n[y],enumerable:!(u=aa(n,y))||u.enumerable});return r};var pa=r=>sa(Pt({},"__esModule",{value:!0}),r);var va={};oa(va,{DEFAULT_ITEMS:()=>qe,LINES:()=>ba,bingoLines:()=>It,createPackingBingo:()=>ya,en:()=>Cn,formatTime:()=>Ze,ja:()=>S,speedBonus:()=>Nn});var qe=[{emoji:"\u{1F45B}",label:"\u8CA1\u5E03"},{emoji:"\u{1F4F1}",label:"\u30B9\u30DE\u30DB"},{emoji:"\u{1F50B}",label:"\u30E2\u30D0\u30A4\u30EB\u200B\u5145\u96FB\u5668"},{emoji:"\u{1F4CB}",label:"\u5065\u5EB7\u8ABF\u67FB\u7968"},{emoji:"\u{1FAAA}",label:"\u30DE\u30A4\u30CA\u30AB\u30FC\u30C9\u200B\u307E\u305F\u306F\u4FDD\u967A\u8A3C"},{emoji:"\u{1F4D6}",label:"\u3057\u304A\u308A"},{emoji:"\u{1F637}",label:"\u30DE\u30B9\u30AF"},{emoji:"\u{1F927}",label:"\u30CF\u30F3\u30AB\u30C1"},{emoji:"\u{1F48A}",label:"\u5E38\u5099\u85AC"},{emoji:"\u{1F6CD}\uFE0F",label:"\u30D3\u30CB\u30FC\u30EB\u888B"},{emoji:"\u{1F9E4}",label:"\u8ECD\u624B\uFF08\u5B66\u6821\u652F\u7D66\uFF09"},{emoji:"\u{1F526}",label:"\u30D8\u30C3\u30C9\u30E9\u30A4\u30C8"},{emoji:"\u{1F455}",label:"\u30B8\u30E3\u30FC\u30B8"},{emoji:"\u2614",label:"\u96E8\u5177"},{emoji:"\u{1F6C1}",label:"\u30BF\u30AA\u30EB"},{emoji:"\u{1F9F4}",label:"\u65E5\u713C\u3051\u6B62\u3081"}];var pt=2,Ot=10,lt=r=>{throw new Error(`[packing-bingo] ${r}`)};function Rt(r){if(r.items)return r.items;let n=r.size;return n==null||!Number.isInteger(n)||n<pt?qe:qe.slice(0,n*n-(r.free?1:0))}function Tn(r,n){(!Number.isInteger(r)||r<pt||r>Ot)&&lt(`"size" must be a whole number from ${pt} to ${Ot} (got ${r}).`),n&&r%2===0&&lt(`"free" needs an odd size such as 3 or 5, so that the card has a center (got ${r}).`)}function Mn(r,n){let f=h=>Array.from({length:r},(p,T)=>h(T)),u=[...f(h=>f(p=>h*r+p)),...f(h=>f(p=>p*r+h)),f(h=>h*(r+1)),f(h=>(h+1)*(r-1))],y=n?(r*r-1)/2:-1,x=h=>n&&h>y?h-1:h;return{center:y,cellLines:u,lines:u.map(h=>h.filter(p=>p!==y).map(x))}}function Bn(r){let n=Rt(r),f=!!r.free,u=r.size;if(u==null){let M=n.length,b=c=>{let k=Math.round(Math.sqrt(c));return k*k===c&&k>=pt&&k<=Ot?k:0};if(u=b(M+(f?1:0)),!u){let c=b(M+(f?0:1)),k=f?c?`; ${M} items fill a ${c}\xD7${c} card without "free"`:"":c%2?`, or set "free" for a ${c}\xD7${c} card with a FREE center`:"";lt(f?`With "free", "items" must have one less than an odd square number of entries (8, 24, 48, 80)${k} (got ${M}).`:`"items" must have a square number of entries (4, 9, 16, 25, \u2026, 100)${k} (got ${M}).`)}}Tn(u,f);let y=u*u-(f?1:0);if(n.length!==y){let M=`a ${u}\xD7${u} card${f?" with a FREE center":""}`;lt(r.items?`"items" must have exactly ${y} entries for ${M} (got ${n.length}).`:`A ${M.slice(2)} needs ${y} items, but DEFAULT_ITEMS has only ${qe.length}. Pass "items".`)}let{center:x,cellLines:h,lines:p}=Mn(u,f),T=n.map((M,b)=>f&&b>=x?b+1:b);return{size:u,free:f,items:n,itemCell:T,center:x,cellLines:h,lines:p}}function It(r,n=!1){return Tn(r,n),Mn(r,n).lines}var S={title:"\u6301\u3061\u3082\u306E\u30D3\u30F3\u30B4",tag:"",subtitle:"",packed:"\u305D\u308D\u3063\u305F",bingo:"BINGO",score:"SCORE",combo:r=>`${r} COMBO`,comboPop:r=>`${r} COMBO!`,reset:"\u30EA\u30BB\u30C3\u30C8",shuffle:"\u{1F500} \u30B7\u30E3\u30C3\u30D5\u30EB",soundOn:"\u{1F50A} \u97F3\u3042\u308A",soundOff:"\u{1F507} \u97F3\u306A\u3057",readyTitle:"Are you ready?",readyPrompt:"",soundHint:"\u7AEF\u672B\u306E\u97F3\u91CF\u3092MAX\u306B",vibrationHint:"\u304A\u3084\u3059\u307F\u30E2\u30FC\u30C9\u3092\u30AA\u30D5",readyTap:"\u30BF\u30C3\u30D7\u3067\u30B9\u30BF\u30FC\u30C8",readyGo:"START!",time:"\u30BF\u30A4\u30E0",statTime:"\u30AF\u30EA\u30A2\u30BF\u30A4\u30E0",modeLabel:"\u30E2\u30FC\u30C9",modeNormal:"\u901A\u5E38",modeInfinite:"\u221E \u7121\u9650",normalTitle:"NORMAL",normalSub:"\u901A\u5E38\u30E2\u30FC\u30C9",infiniteTitle:"INFINITE",infiniteSub:"\u7121\u9650\u30D3\u30F3\u30B4",infiniteRule:"\u305D\u308D\u3063\u305F\u5217\u306F\u6D88\u3048\u3066\u3001\u307E\u305F\u57CB\u3081\u3089\u308C\u308B\u3002\u4F55\u5EA6\u3067\u3082\u30D3\u30F3\u30B4\uFF01",finish:"\u{1F3C1} FINISH",finishTitle:"\u30D5\u30A3\u30CB\u30C3\u30B7\u30E5\uFF01",finishStamp:"\u221E",finishTime:"\u30D7\u30EC\u30A4\u30BF\u30A4\u30E0",again:"\u3082\u3046\u4E00\u5EA6",stamp:"OK",free:"FREE",reachBadge:"\u30EA\u30FC\u30C1",reachPop:"\u30EA\u30FC\u30C1!",bannerSingle:"BINGO!",bannerDouble:"\u30C0\u30D6\u30EB\u30D3\u30F3\u30B4!",bannerTriple:"\u30C8\u30EA\u30D7\u30EB\u30D3\u30F3\u30B4!",bannerNth:r=>`${r} \u30E9\u30A4\u30F3\u76EE\uFF01`,bannerMulti:r=>`\u4E00\u6C17\u306B ${r} \u30E9\u30A4\u30F3\uFF01`,statusStart:()=>"",statusLines:()=>"",statusReach:()=>"",statusDone:"",perfectTag:"\u{1F3C6} PERFECT",perfectStamp:`\u6E96\u5099
2
+ \u5B8C\u4E86`,perfectTitle:"\u30D1\u30FC\u30D5\u30A7\u30AF\u30C8\uFF01",perfectBody:"",perfectBonus:r=>`PERFECT BONUS +${r}`,speedBonus:r=>`SPEED BONUS +${r.toLocaleString()}`,statScore:"SCORE",statCombo:"MAX COMBO",statLines:"BINGO",close:"\u3068\u3058\u308B",demoLabel:"\u30C7\u30E2\uFF1A",demoBingo:"\u25B6 \u30D3\u30F3\u30B4\u3092\u898B\u308B",demoPerfect:"\u25B6 \u30B3\u30F3\u30DC \u2192 \u30D1\u30FC\u30D5\u30A7\u30AF\u30C8",demoRestore:"\u6700\u521D\u306B\u623B\u3059"},Cn={title:"Packing Bingo",tag:"",subtitle:"",packed:"PACKED",bingo:"BINGO",score:"SCORE",combo:r=>`${r} COMBO`,comboPop:r=>`${r} COMBO!`,reset:"Reset",shuffle:"\u{1F500} Shuffle",soundOn:"\u{1F50A} Sound on",soundOff:"\u{1F507} Muted",readyTitle:"Are you ready?",readyPrompt:"",soundHint:"Turn your volume to MAX",vibrationHint:"Turn off Do Not Disturb",readyTap:"Tap to start",readyGo:"GO!",time:"Time",statTime:"Time",modeLabel:"Mode",modeNormal:"Normal",modeInfinite:"\u221E Infinite",normalTitle:"NORMAL",normalSub:"Normal mode",infiniteTitle:"INFINITE",infiniteSub:"Infinite bingo",infiniteRule:"Completed lines clear, so you can fill them again. Bingo forever!",finish:"\u{1F3C1} FINISH",finishTitle:"Finish!",finishStamp:"\u221E",finishTime:"Time played",again:"Play again",stamp:"OK",free:"FREE",reachBadge:"REACH",reachPop:"Reach!",bannerSingle:"BINGO!",bannerDouble:"DOUBLE BINGO!",bannerTriple:"TRIPLE BINGO!",bannerNth:r=>`Line ${r}!`,bannerMulti:r=>`${r} lines at once!`,statusStart:()=>"",statusLines:()=>"",statusReach:()=>"",statusDone:"",perfectTag:"\u{1F3C6} PERFECT",perfectStamp:`ALL
3
+ SET`,perfectTitle:"Perfect!",perfectBody:"",perfectBonus:r=>`PERFECT BONUS +${r}`,speedBonus:r=>`SPEED BONUS +${r.toLocaleString()}`,statScore:"SCORE",statCombo:"MAX COMBO",statLines:"BINGO",close:"Close",demoLabel:"Demo:",demoBingo:"\u25B6 Show a bingo",demoPerfect:"\u25B6 Combo \u2192 perfect",demoRestore:"Restore"};var qt=[0,2,4,7,9,12,14,16,19,21,24,26,28,31,33,36],O=r=>523.25*Math.pow(2,r/12);function zn(r){let n=null,f=null,u=new Map;function y(b,c,k,L){u.set(b,{gain:c,start:k}),b.onended=()=>{u.delete(b),b.disconnect(),L.forEach($=>$.disconnect())}}function x(){let b=n?.currentTime??0;u.forEach(({gain:c,start:k},L)=>{try{if(k>b)c.gain.cancelScheduledValues(b),c.gain.setValueAtTime(0,b),L.stop(b);else{if(typeof c.gain.cancelAndHoldAtTime=="function")c.gain.cancelAndHoldAtTime(b);else{let $=c.gain.value;c.gain.cancelScheduledValues(b),c.gain.setValueAtTime($,b)}c.gain.linearRampToValueAtTime(0,b+.01),L.stop(b+.01)}}catch{}}),u.clear()}function h(){if(r()||typeof window>"u"||document.hidden)return null;let b=navigator.userActivation;if(!n&&b&&!b.hasBeenActive)return null;if(!n){let c=window.AudioContext??window.webkitAudioContext;if(!c)return null;n=new c;let k=n.createDynamicsCompressor();f=n.createGain(),f.gain.value=.6,f.connect(k).connect(n.destination)}return n.state==="suspended"&&n.resume(),n}function p(b,c=0,k=.15,L="triangle",$=.2,se=0){let W=h();if(!W||!f)return;let V=W.currentTime+c,_=W.createOscillator(),m=W.createGain();_.type=L,_.frequency.setValueAtTime(b,V),se&&_.frequency.exponentialRampToValueAtTime(se,V+k),m.gain.setValueAtTime(1e-4,V),m.gain.exponentialRampToValueAtTime($,V+.01),m.gain.exponentialRampToValueAtTime(1e-4,V+k),_.connect(m).connect(f),y(_,m,V,[m]),_.start(V),_.stop(V+k+.05)}function T(b=0,c=.3,k=.25,L=1200){let $=h();if(!$||!f)return;let se=$.currentTime+b,W=Math.ceil($.sampleRate*c),V=$.createBuffer(1,W,$.sampleRate),_=V.getChannelData(0);for(let pe=0;pe<W;pe++)_[pe]=(Math.random()*2-1)*Math.pow(1-pe/W,2.5);let m=$.createBufferSource(),re=$.createBiquadFilter(),G=$.createGain();m.buffer=V,re.type="bandpass",re.frequency.value=L,re.Q.value=.7,G.gain.value=k,m.connect(re).connect(G).connect(f),y(m,G,se,[re,G]),m.start(se)}let M=b=>O(qt[Math.min(Math.max(b,0),qt.length-1)]);return{pop(b){let c=M(b),k=Math.min(3,Math.floor((b+1)/3));p(c,0,.16,"triangle",.22),p(c*2,0,.08,"sine",.06),p(170+k*15,0,.11,"sine",.28,48),T(0,.035,.1+k*.025,1800),k&&p(c*1.5,.035,.11,"triangle",.04+k*.015)},off:()=>p(392,0,.1,"sine",.1,262),reach(){p(988,0,.08,"square",.05),p(1319,.09,.14,"square",.05)},bingo(b){[0,4,7,12,16,19].forEach((c,k)=>p(O(c),k*.06,.22,"square",.06)),[12,16,19].forEach(c=>p(O(c),.38,.6,"triangle",.12)),b>1&&[24,28,31].forEach(c=>p(O(c),.55,.6,"triangle",.08)),T(0,.25,.12,3e3)},perfect(){[0,4,7,12,16,19,24].forEach((b,c)=>p(O(b-12),c*.07,.25,"square",.06)),[0,4,7,12].forEach(b=>p(O(b),.55,1.2,"triangle",.12)),[12,16,19].forEach(b=>p(O(b),.55,1.2,"sawtooth",.03)),p(O(-12),.55,1.2,"sine",.2)},boom(){T(0,.5,.3,500),p(90,0,.3,"sine",.25,40)},tick:()=>p(1760,0,.03,"square",.03),note:(b,c=0)=>p(M(b),c,.12,"square",.05),shuffle(){for(let b=0;b<7;b++)T(b*.042,.05,.16,1600+b*260);p(O(7),.34,.12,"triangle",.14),p(O(12),.42,.2,"triangle",.14)},count(b){b?(p(O(12),0,.5,"square",.07),p(O(24),0,.5,"triangle",.14),T(0,.2,.12,3e3)):(p(O(5),0,.14,"square",.07),p(O(17),0,.14,"triangle",.12))},mode(b){b?(p(196,0,.42,"sine",.12,784),[0,2,4,7,9,12,14,16,19,21,24].forEach((c,k)=>p(O(c-12),k*.032,.16,"triangle",.07)),[12,16,19,24].forEach(c=>p(O(c),.38,1.1,"sine",.07)),p(O(31),.38,.9,"triangle",.03),T(0,.5,.07,6500),T(.36,.7,.05,9e3)):(p(O(7),0,.1,"square",.05),p(O(0),.1,.28,"triangle",.14),p(160,.1,.2,"sine",.26,55),T(.1,.12,.14,1400))},clear(b){let c=Math.max(1,Math.min(8,b));for(let k=0;k<c;k++)p(M(qt.length-1-k*2),k*.035,.18,"sine",.07);T(0,.3,.08,7e3)},stop:x,close(){x(),n&&n.close().catch(()=>{}),n=null,f=null}}}var ct=null;function An(r){let n={},f=0,u=()=>{if(f++,ct===n){ct=null;try{navigator.vibrate?.(0)}catch{}}},y=x=>{if(!r||document.hidden||typeof navigator.vibrate!="function"||navigator.userActivation&&!navigator.userActivation.hasBeenActive)return!1;try{if(navigator.vibrate(x))return ct=n,!0}catch{}return!1};return{play(x,h=1,p=1,T=360){let M=++f,b=Math.min(3,Math.floor(h/3)),c=Math.max(80,T-40),k=x==="off"?35:x==="perfect"?[160,45,100]:x==="bingo"?p>=3?[c,40,500,50,650,50,850]:p===2?[c,40,500,50,650]:[c,40,500]:x==="reach"?[140,40,240]:x==="shuffle"?[90,35,90,35,220]:x==="count"?60:x==="go"?260:x==="infinite"?[25,30,35,30,45,30,220]:x==="normal"?[50,70,160]:x==="finish"?[120,40,120,40,320]:b?[100+b*20,15,80+b*20]:90;if(y(k))return L=>{f===M&&ct===n&&y([...L])}},stop:u}}var Nt=[260,45,160],Dt=[{at:1820,beat:[200]},{at:2170,beat:[100,35,160]},{at:2520,beat:[260]},{at:3e3,beat:[110,40,110]},{at:3430,beat:[320]},{at:3950,beat:[140,40,200]},{at:4540,beat:[460]}];function $n(r){return r.controlled?null:r.storageKey!==void 0?r.storageKey||null:r.demo?null:la(Rt(r))}function la(r){let n=r.map(u=>`${u.emoji}\0${u.label}`).join(""),f=2166136261;for(let u=0;u<n.length;u++)f^=n.charCodeAt(u),f=Math.imul(f,16777619);return`packing-bingo:${(f>>>0).toString(36)}`}var Pn=`
6
4
  .pkb{--pk-sun:var(--pkb-sun,#FFD54F);--pk-ink:var(--pkb-ink,#2A1F14);--pk-paper:var(--pkb-paper,#FFFDF6);--pk-red:var(--pkb-red,#E8473B);--pk-mint:var(--pkb-mint,#BDEBD2);--pk-display:"Dela Gothic One",var(--pkb-font-fallback,sans-serif);--pk-body:"M PLUS Rounded 1c","Hiragino Maru Gothic ProN",var(--pkb-font-fallback,sans-serif);--pk-n:4;--pk-s:1;--pk-d:1;container-type:inline-size;isolation:isolate;width:100%}
7
5
  .pkb,.pkb *{box-sizing:border-box;margin:0;padding:0}
8
6
  .pkb-board{position:relative;overflow:hidden;max-width:720px;margin:0 auto;padding:22px 26px 20px;border-radius:24px;background-color:var(--pk-sun);background-image:radial-gradient(rgba(42,31,20,.12) 1.3px,transparent 1.6px);background-size:16px 16px;border:2.5px solid var(--pk-ink);color:var(--pk-ink);font-family:var(--pk-body);line-height:1.4;text-align:left}
@@ -11,24 +9,17 @@ Have a great trip!`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",stat
11
9
  .pkb-board.pkb-punch{animation:pkb-punch .4s cubic-bezier(.3,1.6,.5,1)}
12
10
  @keyframes pkb-punch{30%{transform:scale(1.018)}}
13
11
  .pkb-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px 16px;margin-bottom:18px}
14
- .pkb-play-dialog{position:fixed;inset:0;margin:auto;width:400px;max-width:calc(100vw - 32px);max-height:calc(100dvh - 32px);overflow:auto;padding:24px;border:2.5px solid var(--pk-ink);border-radius:20px;background:var(--pk-paper);color:var(--pk-ink);font-family:var(--pk-body);text-align:left}
15
- .pkb-play-dialog:not([open]){display:none}
16
- .pkb-play-dialog::backdrop{background:rgba(42,31,20,.6)}
17
- .pkb-play-dialog h3{margin-bottom:16px;font-size:22px;font-weight:800;line-height:1.4}
18
- .pkb-play-dialog p{margin-bottom:12px;font-size:15px;font-weight:700;line-height:1.7;overflow-wrap:anywhere}
19
- .pkb-play-actions{display:grid;gap:10px;margin-top:22px}
20
- .pkb-play-dialog button{padding:12px 16px;border:2px solid var(--pk-ink);border-radius:12px;color:var(--pk-ink);font-size:15px;font-weight:800;line-height:1.5;cursor:pointer}
21
- .pkb-play-start{background:var(--pk-sun)}
22
- .pkb-play-skip{background:transparent}
23
- .pkb-play-dialog button:focus-visible{outline:3px solid var(--pk-ink);outline-offset:3px}
24
- .pkb-play-dialog button:hover{filter:brightness(.96)}
25
- .pkb-tags{display:flex;gap:8px;align-items:center}
12
+ .pkb-tags{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
26
13
  .pkb-kicker{display:inline-block;background:var(--pk-ink);color:var(--pk-sun);font-weight:800;font-size:11px;letter-spacing:.14em;padding:4px 10px;border-radius:999px}
27
14
  .pkb-kicker:empty{display:none}
28
15
  .pkb-kicker.pkb-gold{color:#fff;background:linear-gradient(90deg,#E8473B,#FF9F1C,#1FA971,#2F6FED,#E8473B);background-size:200% 100%;animation:pkb-rb 2s linear infinite}
29
16
  @keyframes pkb-rb{to{background-position:-200% 0}}
30
17
  .pkb button{font-family:var(--pk-body)}
31
18
  .pkb-snd{appearance:none;border:2px solid var(--pk-ink);background:var(--pk-paper);border-radius:999px;padding:2px 9px;font-weight:800;font-size:11px;line-height:1.4;color:var(--pk-ink);cursor:pointer}
19
+ .pkb-watch{display:inline-block;min-width:5.4em;padding:3px 10px 2px;border-radius:999px;background:var(--pk-ink);color:var(--pk-paper);font-family:var(--pk-display);font-size:13px;line-height:1.3;text-align:center;font-variant-numeric:tabular-nums;letter-spacing:.03em}
20
+ .pkb-watch::before{content:"\u23F1 ";font-family:var(--pk-body)}
21
+ .pkb-watch.pkb-run{color:var(--pk-sun)}
22
+ .pkb-watch.pkb-done{background:var(--pk-red);color:#fff}
32
23
  .pkb-title{font-family:var(--pk-display);font-weight:400;font-size:34px;line-height:1.15;margin-top:8px;letter-spacing:.02em;color:inherit}
33
24
  .pkb-sub{font-weight:800;font-size:13px;margin-top:4px;word-break:auto-phrase}
34
25
  .pkb-side{display:flex;flex-direction:column;gap:8px;flex:none}
@@ -51,7 +42,7 @@ Have a great trip!`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",stat
51
42
  .pkb-gw{position:relative}
52
43
  .pkb-grid{display:grid;grid-template-columns:repeat(var(--pk-n),minmax(0,1fr));gap:calc(12px*var(--pk-d))}
53
44
  .pkb-tile{position:relative;min-width:0;place-self:stretch;aspect-ratio:1/.82;background:var(--pk-paper);border:2.5px solid var(--pk-ink);border-radius:calc(16px*var(--pk-d));box-shadow:4px 4px 0 var(--pk-ink);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(6px*var(--pk-d));cursor:pointer;user-select:none;-webkit-tap-highlight-color:transparent;transition:transform .1s,box-shadow .1s,background-color .25s}
54
- .pkb-tile:active:not(.pkb-free){transform:translate(3px,3px);box-shadow:1px 1px 0 var(--pk-ink)}
45
+ .pkb-tile:active:not(.pkb-free):not(.pkb-lock){transform:translate(3px,3px);box-shadow:1px 1px 0 var(--pk-ink)}
55
46
  .pkb-tile input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px}
56
47
  .pkb-tile:has(input:focus-visible){outline:3px solid var(--pk-ink);outline-offset:3px}
57
48
  .pkb-emo{font-size:max(14px,calc(32px*var(--pk-s)));line-height:1;transition:opacity .2s}
@@ -59,6 +50,7 @@ Have a great trip!`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",stat
59
50
  .pkb-stamp{position:absolute;left:50%;top:50%;width:64%;aspect-ratio:1;border-radius:50%;border:3px solid var(--pk-red);box-shadow:inset 0 0 0 2px var(--pk-paper),inset 0 0 0 4px var(--pk-red);color:var(--pk-red);display:grid;place-items:center;font-family:var(--pk-display);font-size:max(9px,calc(20px*var(--pk-s)));letter-spacing:.04em;opacity:0;transform:translate(-50%,-50%) rotate(-16deg) scale(1.7);transition:transform .25s cubic-bezier(.3,1.5,.5,1),opacity .15s;pointer-events:none}
60
51
  .pkb-tile.pkb-on .pkb-stamp{opacity:.9;transform:translate(-50%,-50%) rotate(-16deg) scale(1)}
61
52
  .pkb-tile.pkb-on .pkb-emo,.pkb-tile.pkb-on .pkb-lbl{opacity:.35}
53
+ .pkb-tile.pkb-lock{cursor:default}
62
54
  .pkb-tile.pkb-free{cursor:default;container-type:inline-size}
63
55
  .pkb-tile.pkb-free .pkb-stamp{width:72%;opacity:1;transition:none;font-size:17cqi;letter-spacing:.02em;line-height:1;text-align:center;background:var(--pk-red);color:var(--pk-paper);border-color:var(--pk-red);box-shadow:inset 0 0 0 2px var(--pk-red),inset 0 0 0 4px var(--pk-paper)}
64
56
  .pkb-tile.pkb-line{background-color:var(--pk-mint)}
@@ -86,10 +78,11 @@ Have a great trip!`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",stat
86
78
  .pkb-foot{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 10px;margin-top:18px;font-weight:800;font-size:13px;word-break:auto-phrase}
87
79
  .pkb-foot>span{flex:1 1 14em}
88
80
  .pkb-foot>span:empty{flex-basis:0}
89
- .pkb-acts{display:flex;gap:8px;flex:none;margin-left:auto}
81
+ .pkb-acts{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px;flex:0 1 auto;max-width:100%;margin-left:auto}
90
82
  .pkb-reset,.pkb-shuf{appearance:none;flex:none;border:2px solid var(--pk-ink);background:transparent;border-radius:999px;padding:5px 12px;font-weight:800;font-size:12px;line-height:1.4;color:var(--pk-ink);cursor:pointer}
91
83
  .pkb-shuf{background:var(--pk-paper);box-shadow:2px 2px 0 var(--pk-ink)}
92
- .pkb-shuf:active{transform:translate(2px,2px);box-shadow:none}
84
+ .pkb-shuf:active:not(:disabled){transform:translate(2px,2px);box-shadow:none}
85
+ .pkb-shuf:disabled{cursor:default;opacity:.4}
93
86
  .pkb-flash{position:absolute;inset:0;z-index:7;background:#fff;opacity:0;pointer-events:none}
94
87
  .pkb-flash.pkb-go{animation:pkb-flash .4s ease-out}
95
88
  @keyframes pkb-flash{0%{opacity:.8}100%{opacity:0}}
@@ -106,8 +99,33 @@ Have a great trip!`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",stat
106
99
  .pkb-float.pkb-big{font-size:clamp(14px,5.6cqi,34px);color:#FFE066}
107
100
  .pkb-float.pkb-rch{font-size:20px;color:var(--pk-red);-webkit-text-stroke:4px var(--pk-paper)}
108
101
  @keyframes pkb-rise{0%{opacity:0;transform:translate(-50%,-20%) scale(.4)}18%{opacity:1;transform:translate(-50%,-60%) scale(1.2)}30%{transform:translate(-50%,-70%) scale(1)}75%{opacity:1}100%{opacity:0;transform:translate(-50%,-190%) scale(1)}}
102
+ .pkb-ready{appearance:none;position:absolute;inset:0;z-index:12;display:grid;place-items:center;padding:20px;border:0;border-radius:inherit;background:rgba(42,31,20,.5);color:var(--pk-ink);font:inherit;text-align:center;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background-color .35s}
103
+ .pkb-ready[hidden]{display:none}
104
+ .pkb-ready:focus-visible{outline:3px solid var(--pk-ink);outline-offset:-6px}
105
+ .pkb-ready.pkb-gone{pointer-events:none;background-color:transparent}
106
+ .pkb-board.pkb-waiting .pkb-snd{position:relative;z-index:13}
107
+ .pkb-ready-in,.pkb-count{grid-area:1/1}
108
+ .pkb-ready-in{display:flex;flex-direction:column;align-items:center;width:min(400px,100%);padding:24px 22px 22px;border:2.5px solid var(--pk-ink);border-radius:22px;background:var(--pk-paper)}
109
+ .pkb-ready.pkb-counting .pkb-ready-in{visibility:hidden}
110
+ .pkb-ready-t{font-family:var(--pk-display);font-weight:400;font-size:clamp(26px,7.5cqi,36px);line-height:1.15;color:var(--pk-red)}
111
+ .pkb-ready-q{margin-top:6px;font-weight:800;font-size:18px;line-height:1.4}
112
+ .pkb-ready-l{display:flex;flex-direction:column;gap:4px;width:100%;margin-top:14px;padding:12px 14px;border-radius:14px;background:rgba(42,31,20,.07);font-weight:800;font-size:16px;line-height:1.6;text-align:left;overflow-wrap:anywhere;word-break:auto-phrase}
113
+ .pkb-ready-l>span::before{content:"\u30FB"}
114
+ .pkb-ready-go{margin-top:18px;padding:10px 30px;border:2.5px solid var(--pk-ink);border-radius:999px;background:var(--pk-sun);font-weight:800;font-size:16px;line-height:1.4;box-shadow:3px 3px 0 var(--pk-ink);animation:pkb-beat 1.2s ease-in-out infinite}
115
+ @keyframes pkb-beat{50%{transform:scale(1.06)}}
116
+ .pkb-count{font-family:var(--pk-display);font-weight:400;line-height:1.1;paint-order:stroke fill;font-size:clamp(90px,34cqi,200px);color:var(--pk-sun);-webkit-text-stroke:5px var(--pk-ink);text-shadow:7px 7px 0 var(--pk-ink);opacity:0;pointer-events:none}
117
+ .pkb-count.pkb-go{font-size:clamp(48px,17cqi,120px);color:var(--pk-red);white-space:nowrap}
118
+ .pkb-count.pkb-tick{animation:pkb-cnt 1s cubic-bezier(.2,1.4,.4,1) forwards}
119
+ .pkb-count.pkb-go.pkb-tick{animation:pkb-cnt-go .75s cubic-bezier(.2,1.4,.4,1) forwards}
120
+ @keyframes pkb-cnt{0%{opacity:0;transform:scale(2.2)}18%{opacity:1;transform:scale(.92)}30%{transform:scale(1)}75%{opacity:1}100%{opacity:0;transform:scale(.8)}}
121
+ @keyframes pkb-cnt-go{0%{opacity:0;transform:scale(.4) rotate(-8deg)}25%{opacity:1;transform:scale(1.12) rotate(-5deg)}40%{transform:scale(1) rotate(-5deg)}70%{opacity:1}100%{opacity:0;transform:scale(1.5) rotate(-5deg)}}
122
+ .pkb-ptime{display:inline-flex;align-items:baseline;gap:8px;margin:-4px 0 14px;padding:5px 16px 4px;border-radius:999px;background:var(--pk-ink);color:var(--pk-sun)}
123
+ .pkb-ptime[hidden]{display:none}
124
+ .pkb-ptime small{font-size:11px;font-weight:800;letter-spacing:.08em;color:#fff}
125
+ .pkb-ptime b{font-family:var(--pk-display);font-weight:400;font-size:22px;line-height:1.2;font-variant-numeric:tabular-nums}
109
126
  .pkb-perfect{position:absolute;inset:0;z-index:8;display:grid;place-items:center;padding:20px;background:rgba(42,31,20,.5);opacity:0;visibility:hidden;transition:opacity .3s,visibility .3s}
110
- .pkb-perfect.pkb-show{opacity:1;visibility:visible}
127
+ /* Visible at once when opening (focus can't land on a hidden dialog); hidden only after the fade when closing. */
128
+ .pkb-perfect.pkb-show{opacity:1;visibility:visible;transition:opacity .3s,visibility 0s}
111
129
  .pkb-card{width:min(400px,100%);background:var(--pk-paper);border:2.5px solid var(--pk-ink);border-radius:22px;box-shadow:6px 6px 0 var(--pk-ink);padding:26px 22px 20px;text-align:center;transform:scale(.6) translateY(30px);transition:transform .45s cubic-bezier(.3,1.5,.5,1)}
112
130
  .pkb-perfect.pkb-show .pkb-card{transform:none}
113
131
  .pkb-medal{width:124px;height:124px;margin:0 auto 12px;border-radius:50%;border:5px solid var(--pk-red);box-shadow:inset 0 0 0 4px var(--pk-paper),inset 0 0 0 7px var(--pk-red);color:var(--pk-red);display:grid;place-content:center;font-family:var(--pk-display);font-size:26px;line-height:1.15;white-space:pre-line;opacity:0;transform:rotate(-14deg) scale(2.6)}
@@ -117,6 +135,7 @@ Have a great trip!`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",stat
117
135
  @keyframes pkb-slam{to{opacity:1;transform:rotate(-14deg) scale(1)}}
118
136
  .pkb-ptitle{font-family:var(--pk-display);font-weight:400;font-size:30px;line-height:1.3;color:inherit}
119
137
  .pkb-pbody{font-weight:800;font-size:13.5px;line-height:1.6;margin:6px 0 14px;white-space:pre-line;word-break:auto-phrase}
138
+ .pkb-pbody:empty{margin:0 0 14px}
120
139
  .pkb-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:16px}
121
140
  .pkb-stats>div{border:2px solid var(--pk-ink);border-radius:12px;padding:6px 4px 5px;background:#fff}
122
141
  .pkb-stats small{display:block;font-size:9.5px;font-weight:800;letter-spacing:.1em}
@@ -126,30 +145,89 @@ Have a great trip!`,perfectBonus:a=>`PERFECT BONUS +${a}`,statScore:"SCORE",stat
126
145
  .pkb-fx{position:absolute;inset:0;width:100%;height:100%;z-index:10;pointer-events:none}
127
146
  .pkb-demo{max-width:720px;margin:12px auto 4px;display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-family:var(--pk-body);font-size:12px;color:#666}
128
147
  .pkb-demo button{appearance:none;border:1px solid #ccc;background:#f3f3f3;color:#222;border-radius:999px;padding:5px 12px;font-size:12px;cursor:pointer}
129
- @container (max-width:560px){.pkb-board{padding:18px 14px 16px}.pkb-head{flex-direction:column;align-items:stretch;gap:12px}.pkb-score{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pkb-pill,.pkb-pill.pkb-sc{min-width:0;padding:5px 4px 4px}.pkb-pill b{font-size:19px}.pkb-title{font-size:26px}.pkb-grid{gap:max(3px,calc(8px*var(--pk-d)))}.pkb-tile{border-radius:calc(12px*var(--pk-d));box-shadow:3px 3px 0 var(--pk-ink);gap:calc(3px*var(--pk-d));aspect-ratio:1/1}.pkb-emo{font-size:max(13px,calc(24px*var(--pk-s)))}.pkb-lbl{font-size:max(8.5px,calc(10.5px*var(--pk-s)));padding:0 calc(2px*var(--pk-d))}.pkb-stamp{font-size:max(9px,calc(14px*var(--pk-s)))}.pkb-tile.pkb-reach::after{font-size:9px;padding:2px 5px;top:-9px;right:-5px}.pkb-lines .pkb-u{stroke-width:calc(10px*var(--pk-d))}.pkb-lines .pkb-o{stroke-width:calc(5px*var(--pk-d))}.pkb-banner::before{width:380px;height:380px;margin:-190px 0 0 -190px}.pkb-banner span{font-size:12px}.pkb-medal{width:96px;height:96px;font-size:20px}.pkb-card{padding:20px 14px 16px}.pkb-ptitle{font-size:24px}.pkb-stats b{font-size:17px}.pkb-float.pkb-pt{font-size:17px}.pkb-float.pkb-cmb{font-size:13px}}
130
- @container (max-width:400px){.pkb-board{padding:16px 10px 14px}.pkb-grid{gap:max(3px,calc(6px*var(--pk-d)))}.pkb-lbl{font-size:max(8.5px,calc(10px*var(--pk-s)));padding:0 calc(1px*var(--pk-d))}.pkb-emo{font-size:max(12px,calc(22px*var(--pk-s)))}.pkb-stamp{font-size:max(9px,calc(13px*var(--pk-s)))}.pkb-foot{margin-top:14px;font-size:12px}.pkb-perfect{padding:12px}.pkb-stats{gap:6px}.pkb-stats>div{padding:6px 2px 5px}.pkb-stats small{letter-spacing:.02em}}
148
+ .pkb-mode{position:relative;isolation:isolate;display:inline-grid;grid-auto-flow:column;grid-auto-columns:1fr;padding:2px;border-radius:999px;background:var(--pk-ink);transition:box-shadow .4s}
149
+ .pkb-mode::after{content:"";position:absolute;inset:0;z-index:2;border-radius:inherit;pointer-events:none;background:linear-gradient(110deg,transparent 30%,rgba(255,255,255,.75) 45%,transparent 60%) no-repeat;background-size:250% 100%;background-position:200% 0;opacity:0}
150
+ .pkb-mode button{appearance:none;position:relative;z-index:1;border:0;background:none;border-radius:999px;padding:3px 11px 2px;font-weight:800;font-size:11px;line-height:1.4;letter-spacing:.04em;white-space:nowrap;color:var(--pk-paper);opacity:.72;cursor:pointer;transition:color .3s,opacity .3s;-webkit-tap-highlight-color:transparent}
151
+ .pkb-mode button[aria-checked="true"]{opacity:1;color:var(--pk-ink);cursor:default}
152
+ .pkb-mode button:focus-visible{outline:2px solid var(--pk-paper);outline-offset:-4px}
153
+ .pkb-mode-th{position:absolute;top:2px;bottom:2px;left:2px;width:calc(50% - 2px);border-radius:999px;background:var(--pk-sun);transition:transform .55s cubic-bezier(.3,1.45,.45,1)}
154
+ .pkb.pkb-inf .pkb-mode{box-shadow:0 0 14px 1px rgba(155,93,229,.6)}
155
+ .pkb.pkb-inf .pkb-mode::after{opacity:1;animation:pkb-glint 3.2s ease-in-out infinite}
156
+ .pkb.pkb-inf .pkb-mode-th{transform:translateX(100%);background:linear-gradient(90deg,#FF9F1C,#E8473B,#9B5DE5,#2F6FED,#1FA971,#FF9F1C) 0 0/200% 100%;animation:pkb-rb 2.4s linear infinite}
157
+ .pkb.pkb-inf .pkb-mode button[data-m="infinite"]{color:#fff;text-shadow:0 1px 1px rgba(42,31,20,.55)}
158
+ .pkb-board.pkb-waiting .pkb-mode,.pkb-board.pkb-switching .pkb-mode{z-index:15}
159
+ .pkb-board.pkb-switching .pkb-fx{z-index:16}
160
+ .pkb.pkb-inf .pkb-board{border-color:transparent;background:radial-gradient(rgba(42,31,20,.12) 1.3px,transparent 1.6px) 0 0/16px 16px padding-box,linear-gradient(var(--pk-sun),var(--pk-sun)) padding-box,linear-gradient(120deg,#FF9F1C,#E8473B 22%,#9B5DE5 45%,#2F6FED 68%,#1FA971 88%,#FF9F1C) border-box;box-shadow:0 0 0 2px var(--pk-ink),0 10px 34px -10px rgba(155,93,229,.7)}
161
+ .pkb.pkb-inf .pkb-demo [data-r="dP"],.pkb.pkb-inf .pkb-demo [data-r="dR"]{display:none}
162
+ .pkb-ready-b,.pkb-ready-r{display:none}
163
+ .pkb.pkb-inf .pkb-ready-in{border-color:transparent;background:linear-gradient(var(--pk-paper),var(--pk-paper)) padding-box,linear-gradient(120deg,#FF9F1C,#E8473B 22%,#9B5DE5 45%,#2F6FED 68%,#1FA971 88%,#FF9F1C) border-box;box-shadow:0 0 0 2px var(--pk-ink),0 0 32px rgba(155,93,229,.5)}
164
+ .pkb.pkb-inf .pkb-ready-b{display:inline-block;margin-bottom:10px;padding:4px 14px 3px;border-radius:999px;background:linear-gradient(90deg,#FF9F1C,#E8473B,#9B5DE5,#2F6FED,#1FA971,#FF9F1C) 0 0/200% 100%;color:#fff;font-weight:800;font-size:13px;line-height:1.4;letter-spacing:.08em;text-shadow:0 1px 1px rgba(42,31,20,.5);box-shadow:0 0 14px rgba(155,93,229,.55);animation:pkb-rb 2.4s linear infinite}
165
+ .pkb.pkb-inf .pkb-ready-r{display:block;margin-top:8px;font-weight:800;font-size:15px;line-height:1.5;word-break:auto-phrase}
166
+ .pkb-tile.pkb-clr{animation:pkb-clr .62s var(--pkb-cd,0ms) both}
167
+ @keyframes pkb-clr{0%{transform:perspective(600px) rotateY(0);animation-timing-function:cubic-bezier(.55,0,.9,.45)}42%{transform:perspective(600px) rotateY(90deg) scale(.9)}42.01%{transform:perspective(600px) rotateY(-90deg) scale(.9);animation-timing-function:cubic-bezier(.2,1.45,.4,1)}100%{transform:perspective(600px) rotateY(0)}}
168
+ .pkb-mfx{position:absolute;inset:0;z-index:14;display:grid;place-items:center;overflow:hidden;border-radius:inherit;pointer-events:none;visibility:hidden;opacity:0;text-align:center}
169
+ .pkb-mfx.pkb-show{visibility:visible;animation:pkb-mfx 1.7s ease-out forwards}
170
+ @keyframes pkb-mfx{0%{opacity:0}9%{opacity:1}72%{opacity:1}100%{opacity:0}}
171
+ .pkb-mfx-inf{background:radial-gradient(120% 95% at 50% 42%,#33205c 0%,#170f2e 52%,#08060f 100%)}
172
+ .pkb-mfx-n{background:var(--pk-sun) radial-gradient(rgba(42,31,20,.16) 1.3px,transparent 1.6px) 0 0/16px 16px}
173
+ .pkb-mfx::after{content:"";position:absolute;top:-30%;bottom:-30%;left:-50%;width:50%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.55),transparent);transform:skewX(-18deg);opacity:0}
174
+ .pkb-mfx.pkb-show::after{animation:pkb-beam 1s cubic-bezier(.4,0,.2,1) .22s both}
175
+ @keyframes pkb-beam{0%{opacity:1;transform:skewX(-18deg) translateX(0)}100%{opacity:1;transform:skewX(-18deg) translateX(400%)}}
176
+ .pkb-mfx-glow{position:absolute;left:50%;top:46%;width:min(150cqi,1000px);aspect-ratio:1;translate:-50% -50%;border-radius:50%;background:conic-gradient(#FF9F1C,#E8473B,#9B5DE5,#2F6FED,#1FA971,#FF9F1C);-webkit-mask:radial-gradient(circle,transparent 14%,#000 30%,rgba(0,0,0,.4) 48%,transparent 68%);mask:radial-gradient(circle,transparent 14%,#000 30%,rgba(0,0,0,.4) 48%,transparent 68%);filter:blur(28px);opacity:0}
177
+ .pkb-mfx.pkb-show .pkb-mfx-glow{animation:pkb-spin 3s linear infinite,pkb-glow 1.7s ease-out both}
178
+ @keyframes pkb-glow{0%{opacity:0;scale:.35}30%{opacity:.8;scale:1}100%{opacity:.5;scale:1.12}}
179
+ .pkb-mfx i{position:absolute;left:var(--x);top:var(--y);width:calc(20px*var(--s));aspect-ratio:1;background:var(--c);clip-path:polygon(50% 0,62% 38%,100% 50%,62% 62%,50% 100%,38% 62%,0 50%,38% 38%);opacity:0}
180
+ .pkb-mfx.pkb-show i{animation:pkb-twk .85s ease-in-out var(--t) both}
181
+ @keyframes pkb-twk{0%{opacity:0;scale:0;rotate:0deg}45%{opacity:1;scale:1;rotate:70deg}100%{opacity:0;scale:.2;rotate:160deg}}
182
+ .pkb-mfx-in{position:relative;display:flex;flex-direction:column;align-items:center;padding:0 16px}
183
+ .pkb-mfx-sym{display:block;font-family:var(--pk-display);font-weight:400;line-height:1}
184
+ .pkb-mfx-inf .pkb-mfx-sym{font-size:clamp(110px,36cqi,230px);line-height:.9;padding:0 .06em;background:linear-gradient(90deg,#FFE066,#FF9F1C,#E8473B,#9B5DE5,#2F6FED,#1FA971,#FFE066) 0 0/200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 0 22px rgba(155,93,229,.9)) drop-shadow(0 0 3px rgba(255,255,255,.8))}
185
+ .pkb-mfx.pkb-show.pkb-mfx-inf .pkb-mfx-sym{animation:pkb-sym 1.7s cubic-bezier(.2,1.25,.35,1) both,pkb-rb 1.7s linear both}
186
+ @keyframes pkb-sym{0%{opacity:0;transform:scale(.25) rotate(-30deg)}26%{opacity:1;transform:scale(1.1) rotate(4deg)}38%{transform:scale(1) rotate(0)}100%{opacity:1;transform:scale(1.06)}}
187
+ .pkb-mfx-n .pkb-mfx-sym{display:grid;place-items:center;width:clamp(110px,30cqi,170px);aspect-ratio:1;border-radius:50%;border:5px solid var(--pk-red);box-shadow:inset 0 0 0 4px var(--pk-sun),inset 0 0 0 7px var(--pk-red);color:var(--pk-red);font-size:clamp(34px,10cqi,56px);letter-spacing:.04em;transform:rotate(-14deg)}
188
+ .pkb-mfx.pkb-show.pkb-mfx-n .pkb-mfx-sym{animation:pkb-mslam .42s cubic-bezier(.5,0,.75,0) .08s both}
189
+ @keyframes pkb-mslam{from{opacity:0;transform:rotate(-14deg) scale(2.6)}to{opacity:1;transform:rotate(-14deg) scale(1)}}
190
+ .pkb-mfx-t{display:block;margin-top:6px;font-family:var(--pk-display);font-weight:400;font-size:clamp(24px,8.5cqi,52px);line-height:1.1;letter-spacing:.2em;margin-right:-.2em;white-space:nowrap}
191
+ .pkb-mfx-inf .pkb-mfx-t{color:#fff;text-shadow:0 0 18px rgba(155,93,229,.95),0 0 4px rgba(255,255,255,.9)}
192
+ .pkb-mfx-n .pkb-mfx-t{margin-top:16px;color:var(--pk-ink)}
193
+ .pkb-mfx.pkb-show .pkb-mfx-t{animation:pkb-track 1.7s cubic-bezier(.16,1,.3,1) .12s both}
194
+ @keyframes pkb-track{0%{opacity:0;letter-spacing:.9em;margin-right:-.9em;filter:blur(8px)}40%{opacity:1;letter-spacing:.2em;margin-right:-.2em;filter:blur(0)}100%{opacity:1;letter-spacing:.24em;margin-right:-.24em}}
195
+ .pkb-mfx-s{display:inline-block;margin-top:12px;padding:5px 16px 4px;border-radius:999px;font-weight:800;font-size:14px;line-height:1.4;letter-spacing:.06em}
196
+ .pkb-mfx-inf .pkb-mfx-s{color:#fff;background:rgba(255,255,255,.12);border:1.5px solid rgba(255,255,255,.4)}
197
+ .pkb-mfx-n .pkb-mfx-s{background:var(--pk-ink);color:var(--pk-sun)}
198
+ .pkb-mfx.pkb-show .pkb-mfx-s{animation:pkb-up .6s cubic-bezier(.2,1.3,.4,1) .4s both}
199
+ @keyframes pkb-up{from{opacity:0;transform:translateY(12px)}}
200
+ .pkb-finbtn{display:none;appearance:none;flex:none;border:2px solid var(--pk-ink);border-radius:999px;padding:5px 14px;font-weight:800;font-size:12px;line-height:1.4;letter-spacing:.04em;color:#fff;text-shadow:0 1px 1px rgba(42,31,20,.55);background:linear-gradient(90deg,#FF9F1C,#E8473B,#9B5DE5,#2F6FED,#1FA971,#FF9F1C) 0 0/200% 100%;box-shadow:2px 2px 0 var(--pk-ink),0 0 12px rgba(155,93,229,.45);cursor:pointer;animation:pkb-rb 2.4s linear infinite}
201
+ .pkb.pkb-inf .pkb-finbtn{display:inline-block}
202
+ .pkb-finbtn:active:not(:disabled){transform:translate(2px,2px);box-shadow:none}
203
+ .pkb-finbtn:disabled{cursor:default;opacity:.4;animation:none;box-shadow:2px 2px 0 var(--pk-ink)}
204
+ .pkb-board.pkb-over .pkb-grid{opacity:.55;filter:saturate(.5);transition:opacity .4s,filter .4s}
205
+ .pkb-pbtns{display:flex;flex-wrap:wrap;justify-content:center;gap:10px}
206
+ .pkb-perfect.pkb-fin .pkb-card{border-color:transparent;background:linear-gradient(var(--pk-paper),var(--pk-paper)) padding-box,linear-gradient(120deg,#FF9F1C,#E8473B 22%,#9B5DE5 45%,#2F6FED 68%,#1FA971 88%,#FF9F1C) border-box;box-shadow:0 0 0 2px var(--pk-ink),6px 6px 0 2px var(--pk-ink),0 0 40px rgba(155,93,229,.5)}
207
+ .pkb-perfect.pkb-fin .pkb-medal{border-color:transparent;background:linear-gradient(var(--pk-paper),var(--pk-paper)) padding-box,conic-gradient(#FF9F1C,#E8473B,#9B5DE5,#2F6FED,#1FA971,#FF9F1C) border-box;box-shadow:0 0 18px rgba(155,93,229,.55);color:#7B3FD0;font-size:clamp(44px,14cqi,64px);line-height:1;text-shadow:0 0 12px rgba(155,93,229,.45)}
208
+ .pkb-perfect.pkb-fin .pkb-again{background:linear-gradient(90deg,#FF9F1C,#E8473B,#9B5DE5,#2F6FED,#1FA971,#FF9F1C) 0 0/200% 100%;color:#fff;text-shadow:0 1px 1px rgba(42,31,20,.55);animation:pkb-rb 2.4s linear infinite}
209
+ .pkb-perfect.pkb-fin .pkb-close:not(.pkb-again){background:var(--pk-paper)}
210
+ @container (max-width:560px){.pkb-board{padding:18px 14px 16px}.pkb-head{flex-direction:column;align-items:stretch;gap:12px}.pkb-score{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pkb-pill,.pkb-pill.pkb-sc{min-width:0;padding:5px 4px 4px}.pkb-pill b{font-size:19px}.pkb-title{font-size:26px}.pkb-grid{gap:max(3px,calc(8px*var(--pk-d)))}.pkb-tile{border-radius:calc(12px*var(--pk-d));box-shadow:3px 3px 0 var(--pk-ink);gap:calc(3px*var(--pk-d));aspect-ratio:1/1}.pkb-emo{font-size:max(13px,calc(24px*var(--pk-s)))}.pkb-lbl{font-size:max(8.5px,calc(10.5px*var(--pk-s)));padding:0 calc(2px*var(--pk-d))}.pkb-stamp{font-size:max(9px,calc(14px*var(--pk-s)))}.pkb-tile.pkb-reach::after{font-size:9px;padding:2px 5px;top:-9px;right:-5px}.pkb-lines .pkb-u{stroke-width:calc(10px*var(--pk-d))}.pkb-lines .pkb-o{stroke-width:calc(5px*var(--pk-d))}.pkb-banner::before{width:380px;height:380px;margin:-190px 0 0 -190px}.pkb-banner span{font-size:12px}.pkb-medal{width:96px;height:96px;font-size:20px}.pkb-card{padding:20px 14px 16px}.pkb-ptitle{font-size:24px}.pkb-stats b{font-size:17px}.pkb-float.pkb-pt{font-size:17px}.pkb-float.pkb-cmb{font-size:13px}.pkb-ready-in{padding:20px 16px 18px}.pkb-ready-l{font-size:15px;padding:10px 12px}.pkb-ready-go{font-size:15px}.pkb-ptime b{font-size:19px}}
211
+ @container (max-width:400px){.pkb-board{padding:16px 10px 14px}.pkb-mode button{padding:3px 8px 2px}.pkb-grid{gap:max(3px,calc(6px*var(--pk-d)))}.pkb-lbl{font-size:max(8.5px,calc(10px*var(--pk-s)));padding:0 calc(1px*var(--pk-d))}.pkb-emo{font-size:max(12px,calc(22px*var(--pk-s)))}.pkb-stamp{font-size:max(9px,calc(13px*var(--pk-s)))}.pkb-foot{margin-top:14px;font-size:12px}.pkb-perfect,.pkb-ready{padding:12px}.pkb-stats{gap:6px}.pkb-stats>div{padding:6px 2px 5px}.pkb-stats small{letter-spacing:.02em}}
131
212
  @container (max-width:320px){.pkb-board{padding-inline:8px}.pkb-grid{gap:max(3px,calc(5px*var(--pk-d)))}.pkb-lbl{font-size:max(8.5px,calc(9.5px*var(--pk-s)));padding:0}}
132
- @media (prefers-reduced-motion:reduce){.pkb-board.pkb-shake,.pkb-board.pkb-punch,.pkb-flash.pkb-go,.pkb-tile.pkb-hop,.pkb-tile.pkb-squash,.pkb-tile.pkb-on .pkb-stamp.pkb-hit,.pkb-tile.pkb-reach,.pkb-tile.pkb-line::before,.pkb-pill.pkb-hot,.pkb-bump,.pkb-tile.pkb-reach::after,.pkb-banner::before,.pkb-lines .pkb-draw line,.pkb-kicker.pkb-gold{animation:none}.pkb-banner.pkb-show{animation:pkb-fade 1.8s forwards}.pkb-float{animation:pkb-fade 1s both}.pkb-perfect.pkb-show .pkb-medal{animation:none;opacity:1;transform:rotate(-14deg)}.pkb-card,.pkb-tile,.pkb-stamp{transition:none}}
213
+ @media (prefers-reduced-motion:reduce){.pkb-board.pkb-shake,.pkb-board.pkb-punch,.pkb-flash.pkb-go,.pkb-tile.pkb-hop,.pkb-tile.pkb-squash,.pkb-tile.pkb-on .pkb-stamp.pkb-hit,.pkb-tile.pkb-reach,.pkb-tile.pkb-line::before,.pkb-pill.pkb-hot,.pkb-bump,.pkb-tile.pkb-reach::after,.pkb-banner::before,.pkb-lines .pkb-draw line,.pkb-kicker.pkb-gold,.pkb-ready-go,.pkb.pkb-inf .pkb-mode-th,.pkb.pkb-inf .pkb-mode::after,.pkb.pkb-inf .pkb-ready-b,.pkb-tile.pkb-clr,.pkb-finbtn,.pkb-perfect.pkb-fin .pkb-again,.pkb-mfx.pkb-show.pkb-mfx-inf .pkb-mfx-sym,.pkb-mfx.pkb-show.pkb-mfx-n .pkb-mfx-sym,.pkb-mfx.pkb-show .pkb-mfx-t,.pkb-mfx.pkb-show .pkb-mfx-s,.pkb-mfx.pkb-show .pkb-mfx-glow,.pkb-mfx.pkb-show::after{animation:none}.pkb-count.pkb-tick,.pkb-count.pkb-go.pkb-tick{animation:pkb-fade 1s forwards}.pkb-mfx.pkb-show{animation:pkb-fade 1.4s forwards}.pkb-mode-th{transition:none}.pkb-ready{transition:none}.pkb-banner.pkb-show{animation:pkb-fade 1.8s forwards}.pkb-float{animation:pkb-fade 1s both}.pkb-perfect.pkb-show .pkb-medal{animation:none;opacity:1;transform:rotate(-14deg)}.pkb-card,.pkb-tile,.pkb-stamp{transition:none}}
133
214
  @keyframes pkb-fade{0%,100%{opacity:0}15%,80%{opacity:1}}
134
- `;var kn=rt(4),Dt=["#E8473B","#2F6FED","#1FA971","#FFFDF6","#2A1F14","#FF9F1C"],jt=["#FF9F1C","#1FA971","#2F6FED","#9B5DE5","#E8473B"],gn=2500,_t="packing-bingo-muted",Kt=new WeakSet,hn="packing-bingo-order:",v=a=>a.replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t]);function ot(a){try{return localStorage.getItem(a)}catch{return null}}function it(a,t){try{localStorage.setItem(a,t)}catch{}}var Vt=(a,t)=>`${+((Math.floor(a/t)+a%t)*.36/Math.max(1,t-1)).toFixed(3)}s`,Ne=a=>a.slice().sort((t,p)=>t-p).join(","),Gt=560;function xn(){if(document.getElementById("pkb-styles"))return;let a=document.createElement("style");a.id="pkb-styles",a.textContent=Ht,document.head.appendChild(a)}function vn(a,t,{demo:p,shuffle:u,vibrate:x}){let h=a.size,d=x?'<input type="checkbox" switch role="checkbox">':'<input type="checkbox">',f=Array.from({length:h*h},(w,M)=>{let G=`--pkb-gd:${Vt(M,h)}`;if(M===a.center)return`<div class="pkb-tile pkb-free pkb-on" style="${G}"><span class="pkb-stamp">${v(t.free)}</span></div>`;let z=a.items[a.itemCell.indexOf(M)];return`<label class="pkb-tile" data-reach="${v(t.reachBadge)}" style="${G}">${d}<span class="pkb-emo" aria-hidden="true">${v(z.emoji)}</span><span class="pkb-lbl">${v(z.label).replace(/・/g,"\u30FB<wbr>")}</span><span class="pkb-stamp" aria-hidden="true">${v(t.stamp)}</span></label>`}).join(""),B=`--pk-n:${h};--pk-s:${+Math.min(1.35,4/h).toFixed(3)};--pk-d:${+Math.min(1,4/h).toFixed(3)}`,T=p?`<div class="pkb-demo"><span>${v(t.demoLabel)}</span><button type="button" data-r="dB">${v(t.demoBingo)}</button><button type="button" data-r="dP">${v(t.demoPerfect)}</button><button type="button" data-r="dR">${v(t.demoRestore)}</button></div>`:"",l=[t.soundHint??"",x?t.vibrationHint??"":""].filter(Boolean),c=t.playTitle?.trim()||ke.playTitle||t.title,k=l.length?`<dialog class="pkb-play-dialog" data-r="play" aria-label="${v(c)}">
135
- <h3>${v(c)}</h3>
136
- ${l.map(w=>`<p>${v(w)}</p>`).join("")}
137
- <div class="pkb-play-actions"><button type="button" class="pkb-play-start">${v(t.playStart?.trim()||ke.playStart||t.close)}</button>
138
- <button type="button" class="pkb-play-skip">${v(t.playSkip?.trim()||ke.playSkip||t.close)}</button></div></dialog>`:"";return`<div class="pkb" style="${B}"><div class="pkb-board">
215
+ `;var ba=It(4),da=["#E8473B","#2F6FED","#1FA971","#FFFDF6","#2A1F14","#FF9F1C"],Rn=["#FF9F1C","#1FA971","#2F6FED","#9B5DE5","#E8473B"],fa=2500,In="packing-bingo-muted",ma="packing-bingo-order:",g=r=>r.replace(/[&<>"']/g,n=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[n]);function Ht(r){try{return localStorage.getItem(r)}catch{return null}}function bt(r,n){try{localStorage.setItem(r,n)}catch{}}var qn=(r,n)=>`${+((Math.floor(r/n)+r%n)*.36/Math.max(1,n-1)).toFixed(3)}s`,Je=r=>r.slice().sort((n,f)=>n-f).join(","),ka=1e3,ua=750;function Ze(r,n=1){let f=10**n,u=Math.floor(Math.max(0,r)/(1e3/f)),y=n?"."+String(u%f).padStart(n,"0"):"",x=Math.floor(u/f),h=x%60,p=Math.floor(x/60)%60,T=Math.floor(x/3600),M=b=>String(b).padStart(2,"0");return(T?`${T}:${M(p)}`:String(p))+`:${M(h)}${y}`}function Nn(r,n){return Math.round(r*1e6/Math.max(n,1))}var jt=560,ga=1e3,Be=["#FFFFFF","#FFE066","#FF9F1C","#E8473B","#9B5DE5","#2F6FED","#1FA971"];function ha(){if(document.getElementById("pkb-styles"))return;let r=document.createElement("style");r.id="pkb-styles",r.textContent=Pn,document.head.appendChild(r)}var dt=(r,n)=>r??n??"";function xa(r,n,{demo:f,shuffle:u,vibrate:y,ready:x,modes:h}){let p=r.size,T=y?'<input type="checkbox" switch role="checkbox">':'<input type="checkbox">',M=Array.from({length:p*p},(_,m)=>{let re=`--pkb-gd:${qn(m,p)}`;if(m===r.center)return`<div class="pkb-tile pkb-free pkb-on" style="${re}"><span class="pkb-stamp">${g(n.free)}</span></div>`;let G=r.items[r.itemCell.indexOf(m)];return`<label class="pkb-tile" data-reach="${g(n.reachBadge)}" style="${re}">${T}<span class="pkb-emo" aria-hidden="true">${g(G.emoji)}</span><span class="pkb-lbl">${g(G.label).replace(/・/g,"\u30FB<wbr>")}</span><span class="pkb-stamp" aria-hidden="true">${g(n.stamp)}</span></label>`}).join(""),b=`--pk-n:${p};--pk-s:${+Math.min(1.35,4/p).toFixed(3)};--pk-d:${+Math.min(1,4/p).toFixed(3)}`,c=f?`<div class="pkb-demo"><span>${g(n.demoLabel)}</span><button type="button" data-r="dB">${g(n.demoBingo)}</button><button type="button" data-r="dP">${g(n.demoPerfect)}</button><button type="button" data-r="dR">${g(n.demoRestore)}</button></div>`:"",k=[dt(n.soundHint,S.soundHint),y?dt(n.vibrationHint,S.vibrationHint):""].filter(_=>_.trim()),L=dt(n.readyPrompt,S.readyPrompt),$=dt(n.infiniteRule,S.infiniteRule),se=x?`<button type="button" class="pkb-ready" data-r="ready"><span class="pkb-ready-in"><span class="pkb-ready-b">\u221E ${g(n.infiniteSub?.trim()||S.infiniteSub)}</span><b class="pkb-ready-t">${g(n.readyTitle?.trim()||S.readyTitle)}</b>`+(L.trim()?`<span class="pkb-ready-q">${g(L)}</span>`:"")+($.trim()?`<span class="pkb-ready-r">${g($)}</span>`:"")+(k.length?`<span class="pkb-ready-l">${k.map(_=>`<span>${g(_)}</span>`).join("")}</span>`:"")+`<span class="pkb-ready-go">${g(n.readyTap?.trim()||S.readyTap)}</span></span><b class="pkb-count" data-r="count" aria-live="assertive"></b></button>`:"",W=n.time?.trim()||S.time,V=h?`<span class="pkb-mode" data-r="mode" role="radiogroup" aria-label="${g(n.modeLabel?.trim()||S.modeLabel)}"><i class="pkb-mode-th" data-r="modeTh"></i><button type="button" role="radio" data-m="normal">${g(n.modeNormal?.trim()||S.modeNormal)}</button><button type="button" role="radio" data-m="infinite">${g(n.modeInfinite?.trim()||S.modeInfinite)}</button></span>`:"";return`<div class="pkb" style="${b}"><div class="pkb-board">
139
216
  <div class="pkb-head"><div>
140
- <div class="pkb-tags"><span class="pkb-kicker" data-r="kick">${v(t.tag)}</span><button type="button" class="pkb-snd" data-r="snd"></button></div>
141
- <h2 class="pkb-title">${v(t.title)}</h2>${t.subtitle?`<p class="pkb-sub">${v(t.subtitle)}</p>`:""}</div>
217
+ <div class="pkb-tags"><span class="pkb-kicker" data-r="kick">${g(n.tag)}</span>${V}<button type="button" class="pkb-snd" data-r="snd"></button><span class="pkb-watch" data-r="watch" role="timer" aria-label="${g(W)}">${Ze(0)}</span></div>
218
+ <h2 class="pkb-title">${g(n.title)}</h2>${n.subtitle?`<p class="pkb-sub">${g(n.subtitle)}</p>`:""}</div>
142
219
  <div class="pkb-side"><div class="pkb-score">
143
- <div class="pkb-pill"><small>${v(t.packed)}</small><b data-r="cnt"></b></div>
144
- <div class="pkb-pill" data-r="bp"><small>${v(t.bingo)}</small><b data-r="bng"></b></div>
145
- <div class="pkb-pill pkb-sc" data-r="sp"><small>${v(t.score)}</small><b data-r="sc">0</b></div></div>
220
+ <div class="pkb-pill"><small>${g(n.packed)}</small><b data-r="cnt"></b></div>
221
+ <div class="pkb-pill" data-r="bp"><small>${g(n.bingo)}</small><b data-r="bng"></b></div>
222
+ <div class="pkb-pill pkb-sc" data-r="sp"><small>${g(n.score)}</small><b data-r="sc">0</b></div></div>
146
223
  <div class="pkb-combo" data-r="combo"><b data-r="cmbN"></b><span class="pkb-bar"><i data-r="cbar"></i></span></div></div></div>
147
- <div class="pkb-gw"><div class="pkb-grid">${f}</div><svg class="pkb-lines" aria-hidden="true"></svg>
224
+ <div class="pkb-gw"><div class="pkb-grid">${M}</div><svg class="pkb-lines" aria-hidden="true"></svg>
148
225
  <div class="pkb-banner" data-r="banner" aria-hidden="true"><b data-r="bT"></b><span data-r="bS"></span></div></div>
149
- <div class="pkb-foot"><span data-r="msg" aria-live="polite"></span><div class="pkb-acts">${u?`<button type="button" class="pkb-shuf" data-r="shuf">${v(t.shuffle)}</button>`:""}<button type="button" class="pkb-reset" data-r="reset">${v(t.reset)}</button></div></div>
226
+ <div class="pkb-foot"><span data-r="msg" aria-live="polite"></span><div class="pkb-acts"><button type="button" class="pkb-finbtn" data-r="fin" disabled>${g(n.finish?.trim()||S.finish)}</button>${u?`<button type="button" class="pkb-shuf" data-r="shuf">${g(n.shuffle)}</button>`:""}<button type="button" class="pkb-reset" data-r="reset">${g(n.reset)}</button></div></div>
150
227
  <div class="pkb-flash" data-r="flash"></div>
151
- <div class="pkb-perfect" data-r="perfect"><div class="pkb-card" role="dialog" aria-label="${v(t.perfectTitle)}">
152
- <div class="pkb-medal">${v(t.perfectStamp)}</div><h3 class="pkb-ptitle">${v(t.perfectTitle)}</h3><p class="pkb-pbody" data-r="pbody">${v(Ut(t,a.items.length))}</p>
153
- <div class="pkb-stats"><div><small>${v(t.statScore)}</small><b data-r="sScore">0</b></div><div><small>${v(t.statCombo)}</small><b data-r="sCombo">\xD70</b></div><div><small>${v(t.statLines)}</small><b data-r="sBingo">0</b></div></div>
154
- <button type="button" class="pkb-close" data-r="close">${v(t.close)}</button></div></div>
155
- <canvas class="pkb-fx"></canvas></div>${T}${k}</div>`}var Ut=(a,t)=>typeof a.perfectBody=="function"?a.perfectBody(t):a.perfectBody;function yn(a,t={}){let p=At(t),{items:u,cellLines:x}=p,h=p.size,d=u.length,f=e=>Array.from({length:d},(n,r)=>!!e?.[r]),B=()=>Array.from({length:d},(e,n)=>n),T=e=>e.every((n,r)=>n===r),l=e=>Array.isArray(e)&&e.length===d&&e.every(n=>Number.isInteger(n)&&n>=0&&n<d)&&new Set(e).size===d,c=B(),k=B(),w=p.lines,M=[...x[0],...x[2*h].slice(1,-1)],G=p.itemCell.flatMap((e,n)=>M.includes(e)?[n]:[]),z=()=>{let e=f(void 0);return G.forEach(n=>e[c[n]]=!0),e},F=e=>Math.floor(e/h)+e%h,j=Math.min(1,4/h),g={...ke,...t.messages};t.title!=null&&(g.title=t.title),t.tag!=null&&(g.tag=t.tag),t.subtitle!=null&&(g.subtitle=t.subtitle);let ae=!!t.controlled,_=Nt(t),Y=_&&hn+_,He=!!t.demo,st=t.vibrate!==!1,N=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,ge=Rt(st),A=!1,pe=new Set,V=(e,n)=>{let r=window.setTimeout(()=>{pe.delete(r),A||e()},n);pe.add(r)},Wt=e=>new Promise(n=>window.setTimeout(n,e)),he=0;xn(),a.innerHTML=vn(p,g,{demo:He,shuffle:t.shuffle!==!1,vibrate:st});let b=e=>{let n=a.querySelector(`[data-r="${e}"]`);if(!n)throw new Error(`[packing-bingo] internal: missing element "${e}"`);return n},X=a.querySelector(".pkb-board"),Me=a.querySelector(".pkb-gw"),re=a.querySelector(".pkb-grid"),Te=a.querySelector(".pkb-lines"),xe=a.querySelector(".pkb-fx"),L=xe.getContext("2d"),J=Array.from(re.children),K=p.itemCell.map(e=>J[e]),Yt=p.center>=0?J[p.center]:null,Ce=K.map(e=>e.querySelector("input")),De=K.map(e=>e.querySelector(".pkb-stamp")),pt=b("kick"),je=b("snd"),H=b("perfect"),Z=a.querySelector('[data-r="play"]'),lt=e=>{!Z||Kt.has(a.ownerDocument)||typeof Z.showModal!="function"||!(e.target instanceof Element)||!e.target.closest(".pkb-tile:not(.pkb-free)")||(e.preventDefault(),e.stopImmediatePropagation(),Z.showModal())};re.addEventListener("click",lt,!0),Z?.querySelectorAll("button").forEach(e=>{e.addEventListener("click",()=>Z.close())}),Z?.addEventListener("close",()=>{A||Kt.add(a.ownerDocument)});let S=f(void 0),C=[],ve=new Set,Be=new Set,ye=!1,$e=!1,_e=!1,ct,bt=0,R=0,we=0,$=0,oe=0,dt=0,Ke=!1,le=new Set,ie=new Set,ft=ot(_t),Q=ft!=null?ft==="1":t.sound===!1,P=Ft(()=>Q),mt=()=>{je.textContent=Q?g.soundOff:g.soundOn,je.setAttribute("aria-pressed",String(!Q))};je.addEventListener("click",()=>{Q=!Q,it(_t,Q?"1":"0"),Q&&P.stop(),mt(),Q||P.pop(4)}),mt();let ee=[],se=0,Ee=1,te=0,ne=0,ut=()=>{let e=X.getBoundingClientRect();Ee=Math.min(2,window.devicePixelRatio||1),te=e.width,ne=e.height,xe.width=Math.round(te*Ee),xe.height=Math.round(ne*Ee)},Ge=(e,n,r,o,s,i,m,E)=>({x:e,y:n,vx:r,vy:o,g:s,life:m,shape:E,w:(5+Math.random()*6)*i,h:(3+Math.random()*5)*i,r:Math.random()*6,vr:(Math.random()-.5)*.35,c:Dt[Math.random()*Dt.length|0]}),Ve=()=>{!se&&L&&(se=requestAnimationFrame(kt))};function ce(e,n,r,o={}){if(!N){for(let s=0;s<r;s++){let i=(o.angle??-Math.PI/2)+(Math.random()-.5)*(o.spread??Math.PI*2),m=(o.speed??10)*(.35+Math.random()*.85),E=Math.random()<(o.star??.15)?"star":Math.random()<.3?"round":"rect";ee.push(Ge(e,n,Math.cos(i)*m,Math.sin(i)*m,o.g??.28,o.size??1,(o.life??110)+Math.random()*40,E))}Ve()}}function Xt(e){if(N)return;let n=performance.now()+e,r=()=>{for(let o=0;o<4;o++)ee.push(Ge(Math.random()*te,-12,(Math.random()-.5)*2,2+Math.random()*3,.045,1,420,Math.random()<.2?"star":"rect"));Ve(),performance.now()<n&&V(r,45)};r()}function Jt(e){if(N)return;let n=performance.now()+e,r=()=>{let o=Ge(Math.random()*te,-30,(Math.random()-.5)*1.5,1.5+Math.random()*2,.05,1,500,"emoji");o.e=u[Math.random()*u.length|0].emoji,o.w=22+Math.random()*12,o.vr=(Math.random()-.5)*.06,ee.push(o),Ve(),performance.now()<n&&V(r,110)};r()}function Zt(e,n){ce(e,n,80,{speed:7.5,g:.06,life:85,star:.4}),P.boom()}function Qt(e,n){e.beginPath();for(let r=0;r<10;r++){let o=r*Math.PI/5-Math.PI/2,s=r%2?n*.45:n;e.lineTo(Math.cos(o)*s,Math.sin(o)*s)}e.closePath(),e.fill()}function kt(){if(se=0,!(A||!L)){L.setTransform(Ee,0,0,Ee,0,0),L.clearRect(0,0,te,ne),ee=ee.filter(e=>e.life>0&&e.y<ne+40);for(let e of ee)e.vx*=.985,e.vy=e.vy*.985+e.g,e.x+=e.vx,e.y+=e.vy,e.r+=e.vr,e.life--,L.save(),L.globalAlpha=Math.min(1,e.life/25),L.translate(e.x,e.y),L.rotate(e.r),L.fillStyle=e.c,e.shape==="round"?(L.beginPath(),L.arc(0,0,e.h/1.6,0,7),L.fill()):e.shape==="star"?Qt(L,e.w*.8):e.shape==="emoji"?(L.font=`${e.w}px "Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji",sans-serif`,L.textAlign="center",L.textBaseline="middle",L.fillText(e.e??"",0,0)):(L.scale(1,Math.cos(e.r*2.3)),L.fillRect(-e.w/2,-e.h/2,e.w,e.h)),L.restore();ee.length&&(se=requestAnimationFrame(kt))}}let ze=e=>{let n=X.getBoundingClientRect(),r=e.getBoundingClientRect();return{x:r.left-n.left+r.width/2,y:r.top-n.top+r.height/2}},I=(e,n)=>{e.classList.remove(n),e.offsetWidth,e.classList.add(n)},gt=(e,n)=>{N||(e.classList.remove("pkb-squash"),e.style.setProperty("--pkb-d",n+"ms"),I(e,"pkb-hop"))};re.addEventListener("animationend",e=>{let n=e.target;e.animationName==="pkb-stamp-hit"&&n.classList.remove("pkb-hit"),n.classList.contains("pkb-tile")&&(e.animationName==="pkb-hop"||e.animationName==="pkb-squash")&&n.classList.remove(e.animationName)});let en=e=>{let n=document.createElement("span");n.className="pkb-ring",e.appendChild(n),n.addEventListener("animationend",()=>n.remove())},Ae=(e,n,r,o,s=0,i)=>{let m=document.createElement("div");m.className="pkb-float pkb-"+o,m.textContent=e,m.style.left=n+"px",m.style.top=r+"px",s&&(m.style.animationDelay=s+"ms"),i&&(m.style.color=i),X.appendChild(m),m.addEventListener("animationend",()=>m.remove())},ht=(e,n,r)=>Math.max(0,Math.min(1,(e-n)/r)),xt=e=>1-Math.pow(1-e,3),Pe=0;function Ue(){cancelAnimationFrame(Pe);let e=we,n=R,r=performance.now(),o=s=>{if(A)return;let i=ht(s,r,450);we=Math.round(e+(n-e)*xt(i)),b("sc").textContent=we.toLocaleString(),i<1&&(Pe=requestAnimationFrame(o))};o(r),N||I(b("sp"),"pkb-bump")}let vt=(e,n,r,o="pt")=>{Ae(`+${e}`,n,r,o),Ue()};function We(e,n,r,o,s,i=!1){let m=performance.now(),E=he,O=0,q=D=>{if(A||E!==he)return;let me=ht(D,m,o);e.textContent=s(Math.round(n+(r-n)*xt(me))),i&&me<1&&D-O>55&&(P.tick(),O=D),me<1?requestAnimationFrame(q):N||I(e,"pkb-bump")};q(m)}let yt=e=>({x:e.offsetLeft+e.offsetWidth/2,y:e.offsetTop+e.offsetHeight/2}),Se=0;function Ye(e=[]){if(Se){Te.innerHTML="";return}Te.setAttribute("viewBox",`0 0 ${Me.clientWidth} ${Me.clientHeight}`),Te.innerHTML=C.map(n=>{let r=yt(J[x[n][0]]),o=yt(J[x[n][h-1]]),s=o.x-r.x,i=o.y-r.y,m=Math.hypot(s,i)||1,E=26*j,O=s/m*E,q=i/m*E,D=`x1="${r.x-O}" y1="${r.y-q}" x2="${o.x+O}" y2="${o.y+q}" pathLength="1"`;return`<g${e.includes(n)?' class="pkb-draw"':""}><line class="pkb-u" ${D}/><line class="pkb-o" ${D}/></g>`}).join("")}function tn(e,n,r,o){let s=ze(K[e]);if(!n){De[e].classList.remove("pkb-hit"),$=0,b("combo").classList.remove("pkb-on"),P.off(),ge.play("off");return}let i=performance.now();$=i-dt<gn?$+1:1,dt=i,oe=Math.max(oe,$);let m=new Set(o.flatMap(D=>x[D])).size,E=Math.min(70*m,300)+60,O=ge.play(r,$,o.length,E);ct=r==="perfect"?O:void 0;let q=Math.min(3,Math.floor($/3));P.pop($-1),N||(K[e].style.setProperty("--pkb-impact",String(q)),I(K[e],"pkb-squash"),I(De[e],"pkb-hit"),en(K[e])),ce(s.x,s.y,18+q*6,{speed:6+q,g:.2,life:30,size:.6,star:.5}),le.has(e)||(le.add(e),R+=10*$,vt(10*$,s.x,s.y-12)),$>=2&&(Ae(g.comboPop($),s.x,s.y+22,"cmb",90,jt[($-2)%jt.length]),b("cmbN").textContent=g.combo($),b("combo").classList.add("pkb-on"),I(b("cbar"),"pkb-draining"),N||I(b("cmbN"),"pkb-bump"))}b("cbar").addEventListener("animationend",()=>{b("combo").classList.remove("pkb-on"),$=0});function nn(e){e.forEach(n=>{let r=ze(K[n]);Ae(g.reachPop,r.x,r.y-34,"rch",150)}),V(()=>P.reach(),150)}function an(e,n){let r=e.length,o=[...new Set(e.flatMap(i=>x[i]))].map(i=>J[i]),s=Math.min(70,300/o.length);o.forEach((i,m)=>V(()=>{gt(i,0);let E=ze(i);ce(E.x,E.y,14,{speed:5,g:.15,life:30,size:.7,star:.8}),P.note(m+3)},m*s)),V(()=>{b("bT").textContent=r>=3?g.bannerTriple:r===2?g.bannerDouble:g.bannerSingle,b("bS").textContent=r>1?g.bannerMulti(r):g.bannerNth(C.length),I(b("banner"),"pkb-show"),N||(I(b("flash"),"pkb-go"),I(X,"pkb-punch"));let i=ze(Me);ce(i.x,i.y,r>1?180:110,{speed:r>1?16:13,star:.3}),P.bingo(r),n&&V(()=>vt(n,i.x,i.y+105,"big"),350)},o.length*s+60)}function rn(e){let n=ct;$e=!0,H.classList.remove("pkb-settled");let r=Ke?0:1e3;Ke=!0,R+=r,J.forEach((s,i)=>gt(s,F(i)*180/Math.max(1,h-1))),P.perfect(),N||I(b("flash"),"pkb-go"),b("pbody").textContent=Ut(g,d),b("sScore").textContent="0",b("sCombo").textContent="\xD70",b("sBingo").textContent="0",V(()=>{$e=!1,I(H,"pkb-show"),b("close").focus({preventScroll:!0}),V(()=>{N||I(X,"pkb-shake"),P.boom(),n?.(It),ce(0,ne,90,{angle:-Math.PI/3,spread:.8,speed:22,g:.32,star:.3}),ce(te,ne,90,{angle:-Math.PI*2/3,spread:.8,speed:22,g:.32,star:.3}),Xt(3500),r&&Ae(g.perfectBonus(r),te/2,ne*.16,"big"),We(b("sScore"),0,R,1300,s=>s.toLocaleString(),!0),We(b("sCombo"),0,oe,700,s=>"\xD7"+s),We(b("sBingo"),0,C.length,700,String),Ue()},720),V(()=>Jt(3e3),1500)},520),qt.forEach(({at:s,beat:i})=>V(()=>{Zt(te*(.15+Math.random()*.7),ne*(.12+Math.random()*.3)),n?.(i)},s));let o={score:R,maxCombo:oe};e.push(()=>t.onPerfect?.(o))}function Oe(){he++,$e=!1,pe.forEach(e=>clearTimeout(e)),pe.clear(),ge.stop(),P.stop(),cancelAnimationFrame(Pe),we=R,b("sc").textContent=R.toLocaleString()}function wt(e=!1){ee=[],cancelAnimationFrame(se),se=0,L?.clearRect(0,0,xe.width,xe.height),X.querySelectorAll(".pkb-float, .pkb-ring").forEach(n=>n.remove()),b("banner").classList.remove("pkb-show"),b("flash").classList.remove("pkb-go"),b("combo").classList.remove("pkb-on"),b("cbar").classList.remove("pkb-draining"),J.forEach(n=>n.classList.remove("pkb-squash","pkb-hop")),De.forEach(n=>n.classList.remove("pkb-hit")),X.classList.remove("pkb-punch","pkb-shake"),e||H.classList.remove("pkb-show","pkb-settled")}let Xe=()=>w.flatMap((e,n)=>e.every(r=>S[r])?[n]:[]);function Fe(e,n){let r=[],o=S,s=o.filter(Boolean).length;C=Xe();let i=C.filter(y=>!ve.has(y));[...ve].some(y=>!C.includes(y))&&(Oe(),s<d&&H.classList.remove("pkb-show"));let m=new Set(C.flatMap(y=>x[y])),E=new Set;for(let y of w){let U=y.filter(et=>!o[et]);U.length===1&&E.add(U[0])}K.forEach((y,U)=>{y.classList.toggle("pkb-on",o[U]),y.classList.toggle("pkb-line",m.has(p.itemCell[k[U]])),y.classList.toggle("pkb-reach",E.has(U))}),Yt?.classList.toggle("pkb-line",m.has(p.center)),X.classList.toggle("pkb-all",s===d),pt.classList.toggle("pkb-gold",s===d),pt.textContent=s===d?g.perfectTag:g.tag,b("cnt").textContent=`${s}/${d}`,b("bng").textContent=String(C.length);let O=b("bp");if(C.length>bt&&(O.classList.remove("pkb-hot"),O.offsetWidth),O.classList.toggle("pkb-hot",C.length>0),bt=C.length,Ye(i),e!==null){let y=[...E].some(et=>!Be.has(et)),U=!n&&s===d&&!ye?"perfect":!n&&i.length?"bingo":!n&&y?"reach":"tap";tn(e,o[e],U,i)}let q=i.map(y=>Ne(w[y])).filter(y=>!ie.has(y));q.forEach(y=>ie.add(y));let D=100*q.length*q.length;if(R+=D,n)D&&Ue();else if(s===d&&!ye)rn(r);else if(i.length){an(i,D);let y={newLines:i,totalLines:C.length,score:R};r.push(()=>t.onBingo?.(y))}else if(e!==null&&o[e]){let y=[...E].filter(U=>!Be.has(U));y.length&&nn(y)}ve=new Set(C),Be=E,ye=s===d;let me=[...E].map(y=>u[y].label);return b("msg").textContent=s===d?g.statusDone:me.length?g.statusReach(me):C.length?g.statusLines(C.length,d-s):g.statusStart(d-s),r}let Et=e=>{for(let n of e){if(A)return;n()}},St=()=>{_&&it(_,JSON.stringify(S))};function Lt(e,n,r){S=e,Ce.forEach((s,i)=>s.checked=S[i]);let o=Fe(n,r);return St(),o}function Je(e){Oe(),wt(),S=e,Ce.forEach((r,o)=>r.checked=S[o]),le.clear(),ie.clear(),S.forEach((r,o)=>r&&le.add(o));let n=Xe();n.forEach(r=>ie.add(Ne(w[r]))),ve=new Set(n),Be=new Set,ye=S.every(Boolean),Ke=ye,R=we=le.size*10+ie.size*100,$=0,oe=0,b("sc").textContent=R.toLocaleString(),Fe(null,!0),St()}function be(e,n,r={}){if(ae){Ce.forEach((s,i)=>s.checked=S[i]),t.onChange?.(e.slice());return}let o=[];r.reset?Je(e):o=Lt(e,n,!!r.quiet),t.onChange?.(S.slice()),Et(o)}function Mt(e){c=e,c.forEach((r,o)=>{k[r]=o,J[p.itemCell[o]]=K[r]}),w=p.lines.map(r=>r.map(o=>c[o]));let n=document.activeElement;J.forEach((r,o)=>{r.style.setProperty("--pkb-gd",Vt(o,h)),re.appendChild(r)}),n instanceof HTMLElement&&re.contains(n)&&document.activeElement!==n&&n.focus({preventScroll:!0})}let on=()=>{Y&&it(Y,JSON.stringify(c))},Le=[];function Tt(e){S.every(Boolean)||Oe();let n=N?null:K.map(o=>o.getBoundingClientRect());Le.forEach(o=>o.cancel()),Le=[],Mt(e),w.forEach(o=>{o.every(s=>le.has(s))&&ie.add(Ne(o))});let r=Xe();r.forEach(o=>ie.add(Ne(w[o]))),ve=new Set(r),Fe(null,!0),on(),!(!n||typeof Element.prototype.animate!="function")&&(K.forEach((o,s)=>{let i=n[s],m=o.getBoundingClientRect(),E=i.left-m.left,O=i.top-m.top;Math.abs(E)+Math.abs(O)<1||Le.push(o.animate([{transform:`translate(${E}px,${O}px)`},{transform:"none"}],{duration:Gt-140,delay:Math.random()*140,easing:"cubic-bezier(.3,1.25,.5,1)",fill:"backwards"}))}),clearTimeout(Se),Se=window.setTimeout(()=>{Se=0,Le=[],A||Ye(C)},Gt),Te.innerHTML="")}function Ct(){let e=c.slice();do for(let n=d-1;n>0;n--){let r=Math.floor(Math.random()*(n+1));[e[n],e[r]]=[e[r],e[n]]}while(e.every((n,r)=>n===c[r]));Tt(e),P.shuffle(),ge.play("shuffle")}let Ze=()=>{T(c)||Tt(B())};if(re.addEventListener("change",e=>{let n=Ce.indexOf(e.target);if(n<0)return;let r=S.slice();r[n]=!r[n],be(r,n)}),a.querySelector('[data-r="shuf"]')?.addEventListener("click",Ct),b("reset").addEventListener("click",()=>{Ze(),be(f(void 0),null,{reset:!0})}),b("close").addEventListener("click",()=>H.classList.remove("pkb-show")),H.addEventListener("click",e=>{e.target===H&&H.classList.remove("pkb-show")}),He){let e=!1,n=()=>{S.every(Boolean)?be(f(void 0),null,{reset:!0}):H.classList.remove("pkb-show")},r=async o=>{if(!e){e=!0;try{n();let s=he;for(let i of o){if(await Wt(i.delay),A||s!==he)return;let m=S.slice();m[i.i]=!0,be(m,i.i,{quiet:i.quiet})}}finally{e=!1}}};b("dB").addEventListener("click",()=>{let o=()=>w.map(i=>i.filter(m=>!S[m])).filter(i=>i.length).sort((i,m)=>i.length-m.length)[0]??[],s=S.every(Boolean)?[...w[0]]:o();r(s.map(i=>({i,delay:320})))}),b("dP").addEventListener("click",()=>{let o=u.map((i,m)=>m),s=S.every(Boolean)?o:o.filter(i=>!S[i]);r(s.map((i,m)=>m<s.length-1?{i,delay:170,quiet:!0}:{i,delay:450}))}),b("dR").addEventListener("click",()=>{e||(Ze(),be(z(),null,{reset:!0}))})}let de=null;if(Y)try{let e=JSON.parse(ot(Y)??"null");l(e)&&(de=e)}catch{}!de&&l(t.defaultOrder)&&(de=t.defaultOrder.slice()),de&&!T(de)&&Mt(de);let fe=null;if(_)try{let e=JSON.parse(ot(_)??"null");Array.isArray(e)&&(fe=f(e))}catch{}!fe&&t.defaultChecked&&(fe=f(t.defaultChecked)),!fe&&He&&(fe=z()),ut(),Je(fe??f(void 0));let Qe=typeof ResizeObserver=="function"?new ResizeObserver(()=>{ut(),Ye()}):null;Qe?.observe(X),Qe?.observe(Me);let Bt=()=>{if(!document.hidden){_e&&H.classList.contains("pkb-show")&&b("close").focus({preventScroll:!0}),_e=!1;return}let e=$e||H.classList.contains("pkb-show");_e=e,Oe(),wt(e),e&&(b("sScore").textContent=R.toLocaleString(),b("sCombo").textContent="\xD7"+oe,b("sBingo").textContent=String(C.length),H.classList.add("pkb-show","pkb-settled")),$=0};return document.addEventListener("visibilitychange",Bt),{setChecked(e,n={}){if(A)return;let r=f(e),o=r.flatMap((s,i)=>s!==S[i]?[i]:[]);if(o.length){if(!n.animate||o.length!==1){Je(r);return}Et(Lt(r,o[0],!1))}},reset(){A||(Ze(),be(f(void 0),null,{reset:!0}))},shuffle(){A||Ct()},refresh(){A||Fe(null,!0)},getState(){return{checked:S.slice(),lines:C.slice(),score:R,maxCombo:oe,complete:S.every(Boolean),size:h,free:p.free,order:c.slice()}},destroy(){A||(A=!0,re.removeEventListener("click",lt,!0),Z?.open&&Z.close(),pe.forEach(e=>clearTimeout(e)),pe.clear(),clearTimeout(Se),Le.forEach(e=>e.cancel()),cancelAnimationFrame(se),cancelAnimationFrame(Pe),Qe?.disconnect(),document.removeEventListener("visibilitychange",Bt),ge.stop(),P.close(),a.innerHTML="")}}}return dn(wn);})();
228
+ <div class="pkb-perfect" data-r="perfect"><div class="pkb-card" data-r="pcard" role="dialog" aria-label="${g(n.perfectTitle)}">
229
+ <div class="pkb-medal" data-r="medal">${g(n.perfectStamp)}</div><h3 class="pkb-ptitle" data-r="ptitle">${g(n.perfectTitle)}</h3><p class="pkb-pbody" data-r="pbody">${g(Dn(n,r.items.length))}</p>
230
+ <p class="pkb-ptime" data-r="ptime" hidden><small data-r="pTl">${g(n.statTime?.trim()||S.statTime)}</small><b data-r="pT"></b></p>
231
+ <div class="pkb-stats"><div><small>${g(n.statScore)}</small><b data-r="sScore">0</b></div><div><small>${g(n.statCombo)}</small><b data-r="sCombo">\xD70</b></div><div><small>${g(n.statLines)}</small><b data-r="sBingo">0</b></div></div>
232
+ <div class="pkb-pbtns"><button type="button" class="pkb-close pkb-again" data-r="again" hidden>${g(n.again?.trim()||S.again)}</button><button type="button" class="pkb-close" data-r="close">${g(n.close)}</button></div></div></div>
233
+ <canvas class="pkb-fx"></canvas>${se}<div class="pkb-mfx" data-r="mfx" aria-hidden="true"></div></div>${c}</div>`}var Dn=(r,n)=>typeof r.perfectBody=="function"?r.perfectBody(n):r.perfectBody;function ya(r,n={}){let f=Bn(n),{items:u,cellLines:y}=f,x=f.size,h=u.length,p=e=>Array.from({length:h},(t,a)=>!!e?.[a]),T=()=>Array.from({length:h},(e,t)=>t),M=e=>e.every((t,a)=>t===a),b=e=>Array.isArray(e)&&e.length===h&&e.every(t=>Number.isInteger(t)&&t>=0&&t<h)&&new Set(e).size===h,c=T(),k=T(),L=f.lines,$=[...y[0],...y[2*x].slice(1,-1)],se=f.itemCell.flatMap((e,t)=>$.includes(e)?[t]:[]),W=()=>{let e=p(void 0);return se.forEach(t=>e[c[t]]=!0),e},V=e=>Math.floor(e/x)+e%x,_=Math.min(1,4/x),m={...S,...n.messages};n.title!=null&&(m.title=n.title),n.tag!=null&&(m.tag=n.tag),n.subtitle!=null&&(m.subtitle=n.subtitle);let re=!!n.controlled,G=$n(n),pe=G&&ma+G,ft=!!n.demo,_t=n.vibrate!==!1,Gt=n.uncheck===!0,R=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,ke=An(_t),le=n.mode==="infinite"?"infinite":"normal",E=()=>le==="infinite",ce=null,ye=0,ie=new Set,oe=0,Kt=0,q=!1,Ce=new Set,J=(e,t)=>{let a=window.setTimeout(()=>{Ce.delete(a),q||e()},t);Ce.add(a)},Hn=e=>new Promise(t=>window.setTimeout(t,e)),Ne=0;ha(),r.innerHTML=xa(f,m,{demo:ft,shuffle:n.shuffle!==!1,vibrate:_t,ready:n.ready!==!1,modes:n.modeSwitch!==!1});let l=e=>{let t=r.querySelector(`[data-r="${e}"]`);if(!t)throw new Error(`[packing-bingo] internal: missing element "${e}"`);return t},jn=r.querySelector(".pkb"),N=r.querySelector(".pkb-board"),De=r.querySelector(".pkb-gw"),Q=r.querySelector(".pkb-grid"),Qe=r.querySelector(".pkb-lines"),He=r.querySelector(".pkb-fx"),B=He.getContext("2d"),be=Array.from(Q.children),ee=f.itemCell.map(e=>be[e]),_n=f.center>=0?be[f.center]:null,de=ee.map(e=>e.querySelector("input")),mt=ee.map(e=>e.querySelector(".pkb-stamp")),Ut=l("kick"),kt=l("snd"),K=l("perfect"),ue=l("mfx"),v=p(void 0),X=[],ze=new Set,et=new Set,je=!1,tt=!1,ut=!1,Vt,Yt=0,Y=0,_e=0,D=0,fe=0,Xt=0,nt=!1,ve=new Set,me=new Set,Wt=Ht(In),ge=Wt!=null?Wt==="1":n.sound===!1,P=zn(()=>ge),Jt=()=>{kt.textContent=ge?m.soundOff:m.soundOn,kt.setAttribute("aria-pressed",String(!ge))};kt.addEventListener("click",()=>{ge=!ge,bt(In,ge?"1":"0"),ge&&P.stop(),Jt(),ge||P.pop(4)}),Jt();let he=[],we=0,Ge=1,te=0,ne=0,Zt=()=>{let e=N.getBoundingClientRect();Ge=Math.min(2,window.devicePixelRatio||1),te=e.width,ne=e.height,He.width=Math.round(te*Ge),He.height=Math.round(ne*Ge)},gt=(e,t,a,i,d,o,s,F,A=da)=>({x:e,y:t,vx:a,vy:i,g:d,life:s,shape:F,w:(5+Math.random()*6)*o,h:(3+Math.random()*5)*o,r:Math.random()*6,vr:(Math.random()-.5)*.35,c:A[Math.random()*A.length|0]}),ht=()=>{!we&&B&&(we=requestAnimationFrame(tn))};function ae(e,t,a,i={}){if(!R){for(let d=0;d<a;d++){let o=(i.angle??-Math.PI/2)+(Math.random()-.5)*(i.spread??Math.PI*2),s=(i.speed??10)*(.35+Math.random()*.85),F=Math.random()<(i.star??.15)?"star":Math.random()<.3?"round":"rect";he.push(gt(e,t,Math.cos(o)*s,Math.sin(o)*s,i.g??.28,i.size??1,(i.life??110)+Math.random()*40,F,i.colors))}ht()}}function Qt(e){if(R)return;let t=performance.now()+e,a=()=>{for(let i=0;i<4;i++)he.push(gt(Math.random()*te,-12,(Math.random()-.5)*2,2+Math.random()*3,.045,1,420,Math.random()<.2?"star":"rect"));ht(),performance.now()<t&&J(a,45)};a()}function Gn(e){if(R)return;let t=performance.now()+e,a=()=>{let i=gt(Math.random()*te,-30,(Math.random()-.5)*1.5,1.5+Math.random()*2,.05,1,500,"emoji");i.e=u[Math.random()*u.length|0].emoji,i.w=22+Math.random()*12,i.vr=(Math.random()-.5)*.06,he.push(i),ht(),performance.now()<t&&J(a,110)};a()}function en(e,t){ae(e,t,80,{speed:7.5,g:.06,life:85,star:.4}),P.boom()}function Kn(e,t){e.beginPath();for(let a=0;a<10;a++){let i=a*Math.PI/5-Math.PI/2,d=a%2?t*.45:t;e.lineTo(Math.cos(i)*d,Math.sin(i)*d)}e.closePath(),e.fill()}function tn(){if(we=0,!(q||!B)){B.setTransform(Ge,0,0,Ge,0,0),B.clearRect(0,0,te,ne),he=he.filter(e=>e.life>0&&e.y<ne+40);for(let e of he)e.vx*=.985,e.vy=e.vy*.985+e.g,e.x+=e.vx,e.y+=e.vy,e.r+=e.vr,e.life--,B.save(),B.globalAlpha=Math.min(1,e.life/25),B.translate(e.x,e.y),B.rotate(e.r),B.fillStyle=e.c,e.shape==="round"?(B.beginPath(),B.arc(0,0,e.h/1.6,0,7),B.fill()):e.shape==="star"?Kn(B,e.w*.8):e.shape==="emoji"?(B.font=`${e.w}px "Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji",sans-serif`,B.textAlign="center",B.textBaseline="middle",B.fillText(e.e??"",0,0)):(B.scale(1,Math.cos(e.r*2.3)),B.fillRect(-e.w/2,-e.h/2,e.w,e.h)),B.restore();he.length&&(we=requestAnimationFrame(tn))}}let Ee=e=>{let t=N.getBoundingClientRect(),a=e.getBoundingClientRect();return{x:a.left-t.left+a.width/2,y:a.top-t.top+a.height/2}},C=(e,t)=>{e.classList.remove(t),e.offsetWidth,e.classList.add(t)},nn=(e,t)=>{R||(e.classList.remove("pkb-squash"),e.style.setProperty("--pkb-d",t+"ms"),C(e,"pkb-hop"))};Q.addEventListener("animationend",e=>{let t=e.target;e.animationName==="pkb-stamp-hit"&&t.classList.remove("pkb-hit"),t.classList.contains("pkb-tile")&&(e.animationName==="pkb-hop"||e.animationName==="pkb-squash")&&t.classList.remove(e.animationName),t.classList.contains("pkb-tile")&&e.animationName==="pkb-clr"&&t.classList.remove("pkb-clr")});let Un=e=>{let t=document.createElement("span");t.className="pkb-ring",e.appendChild(t),t.addEventListener("animationend",()=>t.remove())},Ke=(e,t,a,i,d=0,o)=>{let s=document.createElement("div");s.className="pkb-float pkb-"+i,s.textContent=e,s.style.left=t+"px",s.style.top=a+"px",d&&(s.style.animationDelay=d+"ms"),o&&(s.style.color=o),N.appendChild(s),s.addEventListener("animationend",()=>s.remove())},an=(e,t,a)=>Math.max(0,Math.min(1,(e-t)/a)),rn=e=>1-Math.pow(1-e,3),at=0;function xt(){cancelAnimationFrame(at);let e=_e,t=Y,a=performance.now(),i=d=>{if(q)return;let o=an(d,a,450);_e=Math.round(e+(t-e)*rn(o)),l("sc").textContent=_e.toLocaleString(),o<1&&(at=requestAnimationFrame(i))};i(a),R||C(l("sp"),"pkb-bump")}let on=(e,t,a,i="pt")=>{Ke(`+${e}`,t,a,i),xt()};function Ae(e,t,a,i,d,o=!1){let s=performance.now(),F=Ne,A=0,I=j=>{if(q||F!==Ne)return;let Me=an(j,s,i);e.textContent=d(Math.round(t+(a-t)*rn(Me))),o&&Me<1&&j-A>55&&(P.tick(),A=j),Me<1?requestAnimationFrame(I):R||C(e,"pkb-bump")};I(s)}let sn=e=>({x:e.offsetLeft+e.offsetWidth/2,y:e.offsetTop+e.offsetHeight/2}),Fe=0;function yt(e=[]){if(Fe){Qe.innerHTML="";return}Qe.setAttribute("viewBox",`0 0 ${De.clientWidth} ${De.clientHeight}`),Qe.innerHTML=X.map(t=>{let a=sn(be[y[t][0]]),i=sn(be[y[t][x-1]]),d=i.x-a.x,o=i.y-a.y,s=Math.hypot(d,o)||1,F=26*_,A=d/s*F,I=o/s*F,j=`x1="${a.x-A}" y1="${a.y-I}" x2="${i.x+A}" y2="${i.y+I}" pathLength="1"`;return`<g${e.includes(t)?' class="pkb-draw"':""}><line class="pkb-u" ${j}/><line class="pkb-o" ${j}/></g>`}).join("")}let H=r.querySelector('[data-r="ready"]'),$e=l("watch"),z="idle",rt=0,Ue=0,Z=null,it=new Set,pn=(e,t)=>{let a=window.setTimeout(()=>{it.delete(a),q||e()},t);it.add(a)},ot=()=>{it.forEach(e=>clearTimeout(e)),it.clear(),clearInterval(Ue)},ln=()=>z==="play"?performance.now()-rt:Z??0,Ve=()=>{$e.textContent=Ze(ln())};function vt(){z="play",rt=performance.now(),Z=null,clearInterval(Ue),Ue=window.setInterval(Ve,100),$e.classList.remove("pkb-done"),$e.classList.add("pkb-run"),Ve(),wt()}let cn=l("fin"),bn=r.querySelector('[data-r="shuf"]'),wt=()=>{cn.disabled=!(E()&&z==="play"),bn&&(bn.disabled=E()&&z==="done")};function dn(){z==="play"?(Z=performance.now()-rt,$e.classList.replace("pkb-run","pkb-done")):z!=="done"&&(ot(),Et(!1)),z="done",clearInterval(Ue),Ve()}function Et(e){if(Q.removeAttribute("inert"),!H||H.hidden)return;let t=document.activeElement===H;H.classList.add("pkb-gone"),N.classList.remove("pkb-waiting"),H.tabIndex=-1,t&&Q.querySelector("input")?.focus({preventScroll:!0}),e?pn(()=>H.hidden=!0,ua):H.hidden=!0}function Pe(){ot(),Z=null,$e.classList.remove("pkb-run","pkb-done"),z=H?"ready":"idle",Ve(),wt(),N.classList.remove("pkb-over"),Q.removeAttribute("inert"),H&&(H.hidden=!1,H.removeAttribute("tabindex"),H.classList.remove("pkb-gone","pkb-counting"),N.classList.add("pkb-waiting"),l("count").textContent="",Q.setAttribute("inert",""))}let Se=!1,Ft=()=>{!re||!v.some(Boolean)?Pe():Se=!0};function Vn(){z==="play"||z==="done"||(ot(),Et(!1),vt())}function Yn(){if(z!=="ready")return;z="count",H.classList.add("pkb-counting");let e=l("count"),t=["3","2","1",m.readyGo?.trim()||S.readyGo];t.forEach((a,i)=>{let d=i===t.length-1,o=()=>{e.textContent=a,e.classList.toggle("pkb-go",d),C(e,"pkb-tick"),P.count(d),ke.play(d?"go":"count"),d&&(vt(),Et(!0))};i?pn(o,i*ka):o()})}H?.addEventListener("click",Yn);function Xn(e,t,a,i){let d=Ee(ee[e]);if(!t){mt[e].classList.remove("pkb-hit"),D=0,l("combo").classList.remove("pkb-on"),P.off(),ke.play("off");return}let o=performance.now();D=o-Xt<fa?D+1:1,Xt=o,fe=Math.max(fe,D);let s=new Set(i.flatMap(j=>y[j])).size,F=Math.min(70*s,300)+60,A=ke.play(a,D,i.length,F);Vt=a==="perfect"?A:void 0;let I=Math.min(3,Math.floor(D/3));P.pop(D-1),R||(ee[e].style.setProperty("--pkb-impact",String(I)),C(ee[e],"pkb-squash"),C(mt[e],"pkb-hit"),Un(ee[e])),ae(d.x,d.y,18+I*6,{speed:6+I,g:.2,life:30,size:.6,star:.5}),ve.has(e)||(ve.add(e),Y+=10*D,on(10*D,d.x,d.y-12)),D>=2&&(Ke(m.comboPop(D),d.x,d.y+22,"cmb",90,Rn[(D-2)%Rn.length]),l("cmbN").textContent=m.combo(D),l("combo").classList.add("pkb-on"),C(l("cbar"),"pkb-draining"),R||C(l("cmbN"),"pkb-bump"))}l("cbar").addEventListener("animationend",()=>{l("combo").classList.remove("pkb-on"),D=0});function Wn(e){e.forEach(t=>{let a=Ee(ee[t]);Ke(m.reachPop,a.x,a.y-34,"rch",150)}),J(()=>P.reach(),150)}function Jn(e,t,a){let i=e.length,d=[...new Set(e.flatMap(s=>y[s]))].map(s=>be[s]),o=Math.min(70,300/d.length);d.forEach((s,F)=>J(()=>{nn(s,0);let A=Ee(s);ae(A.x,A.y,14,{speed:5,g:.15,life:30,size:.7,star:.8}),P.note(F+3)},F*o)),J(()=>{l("bT").textContent=i>=3?m.bannerTriple:i===2?m.bannerDouble:m.bannerSingle,l("bS").textContent=i>1?m.bannerMulti(i):m.bannerNth(a),C(l("banner"),"pkb-show"),R||(C(l("flash"),"pkb-go"),C(N,"pkb-punch"));let s=Ee(De);ae(s.x,s.y,i>1?180:110,{speed:i>1?16:13,star:.3}),P.bingo(i),t&&J(()=>on(t,s.x,s.y+105,"big"),350)},d.length*o+60)}function Zn(e){let t=Vt;tt=!0,K.classList.remove("pkb-settled");let a=nt?0:1e3,i=nt||Z==null?0:Nn(h,Z);nt=!0,Y+=a+i,be.forEach((o,s)=>nn(o,V(s)*180/Math.max(1,x-1))),P.perfect(),R||C(l("flash"),"pkb-go"),mn(!1),l("pbody").textContent=Dn(m,h),l("ptime").hidden=Z==null,l("pT").textContent=Ze(Z??0,2),l("sScore").textContent="0",l("sCombo").textContent="\xD70",l("sBingo").textContent="0",J(()=>{tt=!1,C(K,"pkb-show"),l("close").focus({preventScroll:!0}),J(()=>{R||C(N,"pkb-shake"),P.boom(),t?.(Nt),ae(0,ne,90,{angle:-Math.PI/3,spread:.8,speed:22,g:.32,star:.3}),ae(te,ne,90,{angle:-Math.PI*2/3,spread:.8,speed:22,g:.32,star:.3}),Qt(3500),a&&Ke(m.perfectBonus(a),te/2,ne*.16,"big");let o=Math.min(34,Math.max(14,te*.056))*1.3+6;i&&Ke((m.speedBonus??S.speedBonus)(i),te/2,Math.max(o/2+4,ne*.16-o),"big"),Ae(l("sScore"),0,Y,1300,s=>s.toLocaleString(),!0),Ae(l("sCombo"),0,fe,700,s=>"\xD7"+s),Ae(l("sBingo"),0,kn(),700,String),xt()},720),J(()=>Gn(3e3),1500)},520),Dt.forEach(({at:o,beat:s})=>J(()=>{en(te*(.15+Math.random()*.7),ne*(.12+Math.random()*.3)),t?.(s)},o));let d={score:Y,maxCombo:fe,time:Z==null?null:Math.round(Z),speedBonus:i};e.push(()=>n.onPerfect?.(d))}function fn(e){if(clearTimeout(oe),oe=0,!ie.size)return;let t=[...ie].filter(i=>v[i]);ie.clear(),v=v.slice(),t.forEach(i=>{v[i]=!1,de[i].checked=!1,ve.delete(i)}),me.clear();let a=st();a.forEach(i=>me.add(Je(L[i]))),ze=new Set(a),Xe(null,!0),!(!e||!t.length)&&(P.clear(t.length),t.forEach((i,d)=>{let o=ee[i];R||(o.style.setProperty("--pkb-cd",Math.min(d*28,280)+"ms"),o.classList.remove("pkb-squash","pkb-hop"),C(o,"pkb-clr"));let s=Ee(o);ae(s.x,s.y,9,{speed:4.5,g:.06,life:45,size:.75,star:1,colors:Be.slice(1)})}))}function Qn(e){let t=performance.now()+e;oe&&t<=Kt||(clearTimeout(oe),Kt=t,oe=window.setTimeout(()=>{oe=0,q||fn(!0)},e))}let ea=()=>{clearTimeout(oe),oe=0,ie.clear()};function mn(e){let t=e?m.finishTitle?.trim()||S.finishTitle:m.perfectTitle;K.classList.toggle("pkb-fin",e),l("pcard").setAttribute("aria-label",t),l("medal").textContent=e?m.finishStamp?.trim()||S.finishStamp:m.perfectStamp,l("ptitle").textContent=t,l("pTl").textContent=e?m.finishTime?.trim()||S.finishTime:m.statTime?.trim()||S.statTime,l("again").hidden=!e}let kn=()=>E()?ye:X.length,un=()=>l(K.classList.contains("pkb-fin")?"again":"close");function Ye(){ie.size&&fn(!1),Ne++,tt=!1,Ce.forEach(e=>clearTimeout(e)),Ce.clear(),ke.stop(),P.stop(),cancelAnimationFrame(at),_e=Y,l("sc").textContent=Y.toLocaleString()}function St(e=!1){he=[],cancelAnimationFrame(we),we=0,B?.clearRect(0,0,He.width,He.height),N.querySelectorAll(".pkb-float, .pkb-ring").forEach(t=>t.remove()),l("banner").classList.remove("pkb-show"),l("flash").classList.remove("pkb-go"),l("combo").classList.remove("pkb-on"),l("cbar").classList.remove("pkb-draining"),be.forEach(t=>t.classList.remove("pkb-squash","pkb-hop","pkb-clr")),mt.forEach(t=>t.classList.remove("pkb-hit")),N.classList.remove("pkb-punch","pkb-shake","pkb-switching"),ue.classList.remove("pkb-show"),e||K.classList.remove("pkb-show","pkb-settled")}let st=()=>L.flatMap((e,t)=>e.every(a=>v[a])?[t]:[]);function Xe(e,t){let a=[],i=v,d=i.filter(Boolean).length,o=E(),s=d===h&&!o;X=st();let F=X.filter(w=>!ze.has(w));if([...ze].some(w=>!X.includes(w))&&(Ye(),d<h&&K.classList.remove("pkb-show")),o&&(t||(ye+=F.length),X.length)){let w=ie.size;X.forEach(U=>L[U].forEach(xe=>ie.add(xe))),(ie.size>w||!oe)&&Qn(!t&&F.length?ga:jt+200)}let A=new Set(X.flatMap(w=>y[w])),I=new Set;for(let w of L){let U=w.filter(xe=>!i[xe]);U.length===1&&I.add(U[0])}ee.forEach((w,U)=>{w.classList.toggle("pkb-on",i[U]);let xe=i[U]&&(!Gt||ie.has(U));w.classList.toggle("pkb-lock",xe),xe?de[U].setAttribute("aria-readonly","true"):de[U].removeAttribute("aria-readonly"),w.classList.toggle("pkb-line",A.has(f.itemCell[k[U]])),w.classList.toggle("pkb-reach",I.has(U))}),_n?.classList.toggle("pkb-line",A.has(f.center)),N.classList.toggle("pkb-all",s),Ut.classList.toggle("pkb-gold",s),Ut.textContent=s?m.perfectTag:m.tag,l("cnt").textContent=`${d}/${h}`;let j=o?ye:X.length;l("bng").textContent=String(j);let Me=l("bp");if(j>Yt&&(Me.classList.remove("pkb-hot"),Me.offsetWidth),Me.classList.toggle("pkb-hot",j>0),Yt=j,yt(F),e!==null){let w=[...I].some(xe=>!et.has(xe)),U=!t&&s&&!je?"perfect":!t&&F.length?"bingo":!t&&w?"reach":"tap";Xn(e,i[e],U,F)}let At=F.map(w=>Je(L[w])).filter(w=>!me.has(w));At.forEach(w=>me.add(w));let $t=100*At.length*At.length;if(Y+=$t,t)$t&&xt();else if(s&&!je)Zn(a);else if(F.length){Jn(F,$t,j);let w={newLines:F,totalLines:j,score:Y,mode:le};a.push(()=>n.onBingo?.(w))}else if(e!==null&&i[e]){let w=[...I].filter(U=>!et.has(U));w.length&&Wn(w)}ze=new Set(X),et=I,je=s;let Ln=[...I].map(w=>u[w].label);return l("msg").textContent=s?m.statusDone:Ln.length?m.statusReach(Ln):X.length?m.statusLines(X.length,h-d):m.statusStart(h-d),a}let gn=e=>{for(let t of e){if(q)return;t()}},hn=()=>{G&&!E()&&bt(G,JSON.stringify(v))};function xn(e,t,a){z==="idle"&&t!==null&&e[t]&&vt(),!E()&&e.every(Boolean)&&dn(),v=e,de.forEach((d,o)=>d.checked=v[o]);let i=Xe(t,a);return hn(),i}function We(e){ea(),ye=0,Ye(),St(),!E()&&e.every(Boolean)?dn():(z==="play"||z==="done")&&!e.some(Boolean)&&Pe(),v=e,de.forEach((a,i)=>a.checked=v[i]),ve.clear(),me.clear(),v.forEach((a,i)=>a&&ve.add(i));let t=st();t.forEach(a=>me.add(Je(L[a]))),ze=new Set(t),et=new Set,je=!E()&&v.every(Boolean),nt=je,Y=_e=ve.size*10+me.size*100,D=0,fe=0,l("sc").textContent=Y.toLocaleString(),Xe(null,!0),hn()}function Oe(e,t,a={}){let i=E();if(re&&!i){Se=!!a.reset&&Se,de.forEach((o,s)=>o.checked=v[s]),n.onChange?.(e.slice());return}let d=[];a.reset?We(e):d=xn(e,t,!!a.quiet),i||n.onChange?.(v.slice()),gn(d)}function Lt(e){c=e,c.forEach((a,i)=>{k[a]=i,be[f.itemCell[i]]=ee[a]}),L=f.lines.map(a=>a.map(i=>c[i]));let t=document.activeElement;be.forEach((a,i)=>{a.style.setProperty("--pkb-gd",qn(i,x)),Q.appendChild(a)}),t instanceof HTMLElement&&Q.contains(t)&&document.activeElement!==t&&t.focus({preventScroll:!0})}let ta=()=>{!pe||E()||bt(pe,JSON.stringify(c))},Le=[];function yn(e){(E()||!v.every(Boolean))&&Ye();let t=R?null:ee.map(i=>i.getBoundingClientRect());Le.forEach(i=>i.cancel()),Le=[],Lt(e),L.forEach(i=>{i.every(d=>ve.has(d))&&me.add(Je(i))});let a=st();a.forEach(i=>me.add(Je(L[i]))),ze=new Set(a),Xe(null,!0),ta(),!(!t||typeof Element.prototype.animate!="function")&&(ee.forEach((i,d)=>{let o=t[d],s=i.getBoundingClientRect(),F=o.left-s.left,A=o.top-s.top;Math.abs(F)+Math.abs(A)<1||Le.push(i.animate([{transform:`translate(${F}px,${A}px)`},{transform:"none"}],{duration:jt-140,delay:Math.random()*140,easing:"cubic-bezier(.3,1.25,.5,1)",fill:"backwards"}))}),clearTimeout(Fe),Fe=window.setTimeout(()=>{Fe=0,Le=[],q||yt(X)},jt),Qe.innerHTML="")}function vn(){if(E()&&z==="done")return;let e=c.slice();do for(let t=h-1;t>0;t--){let a=Math.floor(Math.random()*(t+1));[e[t],e[a]]=[e[a],e[t]]}while(e.every((t,a)=>t===c[a]));yn(e),P.shuffle(),ke.play("shuffle")}let Tt=()=>{M(c)||yn(T())},wn=e=>v[e]&&(!Gt||ie.has(e));Q.addEventListener("click",e=>{let t=de.indexOf(e.target);t>=0&&wn(t)&&e.preventDefault()}),Q.addEventListener("change",e=>{let t=de.indexOf(e.target);if(t<0)return;if(wn(t)){de[t].checked=!0;return}let a=v.slice();a[t]=!a[t],Oe(a,t)}),r.querySelector('[data-r="shuf"]')?.addEventListener("click",vn);let Mt=()=>{We(p(void 0)),Pe()};l("reset").addEventListener("click",()=>{if(E())return Mt();Tt(),Ft(),Oe(p(void 0),null,{reset:!0})}),l("close").addEventListener("click",()=>K.classList.remove("pkb-show")),l("again").addEventListener("click",()=>{E()&&(Mt(),(H&&!H.hidden?H:Q.querySelector("input"))?.focus({preventScroll:!0}))});function En(){if(q||!E()||z!=="play")return;Ye(),St(),Z=performance.now()-rt,z="done",clearInterval(Ue),$e.classList.replace("pkb-run","pkb-done"),Ve(),wt(),D=0,Q.setAttribute("inert",""),N.classList.add("pkb-over"),mn(!0),l("pbody").textContent="",l("ptime").hidden=!1,l("pT").textContent=Ze(Z,2),l("sScore").textContent="0",l("sCombo").textContent="\xD70",l("sBingo").textContent="0",K.classList.remove("pkb-settled"),C(K,"pkb-show"),un().focus({preventScroll:!0}),P.perfect();let e=ke.play("finish");R||C(l("flash"),"pkb-go"),J(()=>{R||C(N,"pkb-shake"),P.boom(),e?.(Nt),ae(0,ne,80,{angle:-Math.PI/3,spread:.8,speed:21,g:.32,star:.5,colors:Be}),ae(te,ne,80,{angle:-Math.PI*2/3,spread:.8,speed:21,g:.32,star:.5,colors:Be}),Qt(2500),Ae(l("sScore"),0,Y,1300,a=>a.toLocaleString(),!0),Ae(l("sCombo"),0,fe,700,a=>"\xD7"+a),Ae(l("sBingo"),0,ye,700,String)},720),[1250,1700,2200].forEach((a,i)=>J(()=>{en(te*(.15+Math.random()*.7),ne*(.12+Math.random()*.3)),e?.(Dt[i*2].beat)},a));let t={score:Y,maxCombo:fe,lines:ye,time:Math.round(Z)};n.onFinish?.(t)}if(cn.addEventListener("click",En),K.addEventListener("click",e=>{e.target===K&&K.classList.remove("pkb-show")}),ft){let e=!1,t=()=>{!E()&&v.every(Boolean)?Oe(p(void 0),null,{reset:!0}):K.classList.remove("pkb-show")},a=async i=>{if(!e){e=!0;try{t(),Vn();let d=Ne;for(let o of i){if(await Hn(o.delay),q||d!==Ne)return;let s=v.slice();s[o.i]=!0,Oe(s,o.i,{quiet:o.quiet})}}finally{e=!1}}};l("dB").addEventListener("click",()=>{if(E()&&z==="done")return;let i=()=>L.map(o=>o.filter(s=>!v[s])).filter(o=>o.length).sort((o,s)=>o.length-s.length)[0]??[],d=!E()&&v.every(Boolean)?[...L[0]]:i();a(d.map(o=>({i:o,delay:320})))}),l("dP").addEventListener("click",()=>{if(E())return;let i=u.map((o,s)=>s),d=v.every(Boolean)?i:i.filter(o=>!v[o]);a(d.map((o,s)=>s<d.length-1?{i:o,delay:170,quiet:!0}:{i:o,delay:450}))}),l("dR").addEventListener("click",()=>{e||E()||(Tt(),Ft(),Oe(W(),null,{reset:!0}))})}let Re=r.querySelector('[data-r="mode"]'),Bt=Re?Array.from(Re.querySelectorAll("button[data-m]")):[],Fn=()=>{jn.classList.toggle("pkb-inf",E()),Bt.forEach(e=>{let t=e.dataset.m===le;e.setAttribute("aria-checked",String(t)),e.tabIndex=t?0:-1})};function na(){let e=E(),t=e?m.infiniteTitle?.trim()||S.infiniteTitle:m.normalTitle?.trim()||S.normalTitle,a=e?m.infiniteSub?.trim()||S.infiniteSub:m.normalSub?.trim()||S.normalSub,i=e&&!R?Array.from({length:18},(o,s)=>{let F=(5+Math.random()*90).toFixed(1),A=(6+Math.random()*88).toFixed(1),I=(.45+Math.random()*.95).toFixed(2),j=Math.round(100+Math.random()*950);return`<i style="--x:${F}%;--y:${A}%;--s:${I};--t:${j}ms;--c:${Be[s%Be.length]}"></i>`}).join(""):"";ue.className="pkb-mfx "+(e?"pkb-mfx-inf":"pkb-mfx-n"),ue.innerHTML=(e?'<span class="pkb-mfx-glow"></span>':"")+i+`<span class="pkb-mfx-in"><b class="pkb-mfx-sym">${e?"\u221E":g(m.stamp)}</b><b class="pkb-mfx-t">${g(t)}</b><span class="pkb-mfx-s">${g(a)}</span></span>`,C(ue,"pkb-show"),N.classList.add("pkb-switching"),Re&&!R&&C(Re,"pkb-bump"),P.mode(e),ke.play(e?"infinite":"normal");let d=Bt.find(o=>o.dataset.m===le);if(d){let o=Ee(d);ae(o.x,o.y,e?46:24,{speed:e?7:5,g:.1,life:55,size:.8,star:e?.9:.3,colors:e?Be:void 0})}J(()=>{let o=Ee(De);e?ae(o.x,o.y,90,{speed:12,g:.07,life:90,star:.75,colors:Be}):(R||C(N,"pkb-punch"),ae(o.x,o.y,70,{speed:11,star:.2}))},e?260:430)}ue.addEventListener("animationend",e=>{e.target===ue&&(ue.classList.remove("pkb-show"),N.classList.remove("pkb-switching"),ue.innerHTML="")});function Ct(e){if(q||e===le||e!=="normal"&&e!=="infinite")return;let t=ce;e==="infinite"?ce={checked:v.slice(),order:c.slice()}:ce=null,le=e,Se=!1,t&&t.order.some((a,i)=>a!==c[i])&&(Le.forEach(a=>a.cancel()),Le=[],clearTimeout(Fe),Fe=0,Lt(t.order)),Fn(),Pe(),We(t?t.checked:p(void 0)),na(),n.onModeChange?.(le)}Re?.addEventListener("click",e=>{let t=e.target.closest("button[data-m]");t&&Ct(t.dataset.m)}),Re?.addEventListener("keydown",e=>{["ArrowLeft","ArrowRight","ArrowUp","ArrowDown"].includes(e.key)&&(e.preventDefault(),Ct(E()?"normal":"infinite"),Bt.find(t=>t.dataset.m===le)?.focus())});let Ie=null;if(pe)try{let e=JSON.parse(Ht(pe)??"null");b(e)&&(Ie=e)}catch{}!Ie&&b(n.defaultOrder)&&(Ie=n.defaultOrder.slice()),Ie&&!M(Ie)&&Lt(Ie);let Te=null;if(G)try{let e=JSON.parse(Ht(G)??"null");Array.isArray(e)&&(Te=p(e))}catch{}!Te&&n.defaultChecked&&(Te=p(n.defaultChecked)),!Te&&ft&&(Te=W()),Zt(),E()&&(ce={checked:Te??p(void 0),order:c.slice()}),Fn(),We(E()?p(void 0):Te??p(void 0)),z!=="done"&&Pe();let zt=typeof ResizeObserver=="function"?new ResizeObserver(()=>{Zt(),yt()}):null;zt?.observe(N),zt?.observe(De);let Sn=()=>{if(!document.hidden){ut&&K.classList.contains("pkb-show")&&un().focus({preventScroll:!0}),ut=!1;return}let e=tt||K.classList.contains("pkb-show");ut=e,Ye(),St(e),e&&(l("sScore").textContent=Y.toLocaleString(),l("sCombo").textContent="\xD7"+fe,l("sBingo").textContent=String(kn()),K.classList.add("pkb-show","pkb-settled")),D=0};return document.addEventListener("visibilitychange",Sn),{setChecked(e,t={}){if(q)return;let a=p(e);if(ce){ce.checked=a,Se=!1,G&&bt(G,JSON.stringify(a));return}Se&&!a.some(Boolean)&&Pe(),Se=!1;let i=a.flatMap((d,o)=>d!==v[o]?[o]:[]);if(i.length){if(!t.animate||i.length!==1){We(a);return}gn(xn(a,i[0],!1))}},reset(){if(!q){if(E())return Mt();Tt(),Ft(),Oe(p(void 0),null,{reset:!0})}},shuffle(){q||vn()},setMode(e){Ct(e)},finish(){En()},refresh(){q||Xe(null,!0)},getState(){return{checked:v.slice(),lines:X.slice(),score:Y,maxCombo:fe,complete:!E()&&v.every(Boolean),mode:le,cleared:ye,finished:E()&&z==="done",packing:ce&&{checked:ce.checked.slice(),order:ce.order.slice()},size:x,free:f.free,order:c.slice(),time:Math.round(ln())}},destroy(){q||(q=!0,ot(),Ce.forEach(e=>clearTimeout(e)),Ce.clear(),clearTimeout(Fe),clearTimeout(oe),Le.forEach(e=>e.cancel()),cancelAnimationFrame(we),cancelAnimationFrame(at),zt?.disconnect(),document.removeEventListener("visibilitychange",Sn),ke.stop(),P.close(),r.innerHTML="")}}}return pa(va);})();