packing-bingo 0.3.0 → 0.4.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.
@@ -1,8 +1,8 @@
1
- "use strict";var PackingBingo=(()=>{var Pe=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Tt=Object.getOwnPropertyNames;var Ot=Object.prototype.hasOwnProperty;var At=(t,n)=>{for(var s in n)Pe(t,s,{get:n[s],enumerable:!0})},Pt=(t,n,s,c)=>{if(n&&typeof n=="object"||typeof n=="function")for(let b of Tt(n))!Ot.call(t,b)&&b!==s&&Pe(t,b,{get:()=>n[b],enumerable:!(c=zt(n,b))||c.enumerable});return t};var Ft=t=>Pt(Pe({},"__esModule",{value:!0}),t);var Ht={};At(Ht,{DEFAULT_ITEMS:()=>ie,LINES:()=>Rt,bingoLines:()=>Re,createPackingBingo:()=>Dt,en:()=>it,ja:()=>qe});var ie=[{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 xe=2,Fe=10,ve=t=>{throw new Error(`[packing-bingo] ${t}`)};function Ie(t){if(t.items)return t.items;let n=t.size;return n==null||!Number.isInteger(n)||n<xe?ie:ie.slice(0,n*n-(t.free?1:0))}function at(t,n){(!Number.isInteger(t)||t<xe||t>Fe)&&ve(`"size" must be a whole number from ${xe} to ${Fe} (got ${t}).`),n&&t%2===0&&ve(`"free" needs an odd size such as 3 or 5, so that the card has a center (got ${t}).`)}function rt(t,n){let s=k=>Array.from({length:t},(l,d)=>k(d)),c=[...s(k=>s(l=>k*t+l)),...s(k=>s(l=>l*t+k)),s(k=>k*(t+1)),s(k=>(k+1)*(t-1))],b=n?(t*t-1)/2:-1,L=k=>n&&k>b?k-1:k;return{center:b,cellLines:c,lines:c.map(k=>k.filter(l=>l!==b).map(L))}}function ot(t){let n=Ie(t),s=!!t.free,c=t.size;if(c==null){let g=n.length,M=v=>{let $=Math.round(Math.sqrt(v));return $*$===v&&$>=xe&&$<=Fe?$:0};if(c=M(g+(s?1:0)),!c){let v=M(g+(s?0:1)),$=s?v?`; ${g} items fill a ${v}\xD7${v} card without "free"`:"":v%2?`, or set "free" for a ${v}\xD7${v} card with a FREE center`:"";ve(s?`With "free", "items" must have one less than an odd square number of entries (8, 24, 48, 80)${$} (got ${g}).`:`"items" must have a square number of entries (4, 9, 16, 25, \u2026, 100)${$} (got ${g}).`)}}at(c,s);let b=c*c-(s?1:0);if(n.length!==b){let g=`a ${c}\xD7${c} card${s?" with a FREE center":""}`;ve(t.items?`"items" must have exactly ${b} entries for ${g} (got ${n.length}).`:`A ${g.slice(2)} needs ${b} items, but DEFAULT_ITEMS has only ${ie.length}. Pass "items".`)}let{center:L,cellLines:k,lines:l}=rt(c,s),d=n.map((g,M)=>s&&M>=L?M+1:M);return{size:c,free:s,items:n,itemCell:d,center:L,cellLines:k,lines:l}}function Re(t,n=!1){return at(t,n),rt(t,n).lines}var qe={title:"\u6301\u3061\u3082\u306E\u30D3\u30F3\u30B4",tag:"\u4FEE\u5B66\u65C5\u884C",subtitle:"",packed:"\u305D\u308D\u3063\u305F",bingo:"BINGO",score:"SCORE",combo:t=>`${t} COMBO`,comboPop:t=>`${t} COMBO!`,reset:"\u30EA\u30BB\u30C3\u30C8",soundOn:"\u{1F50A} \u97F3\u3042\u308A",soundOff:"\u{1F507} \u97F3\u306A\u3057",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:t=>`${t} \u30E9\u30A4\u30F3\u76EE\uFF01`,bannerMulti:t=>`\u4E00\u6C17\u306B ${t} \u30E9\u30A4\u30F3\uFF01`,statusStart:()=>"",statusLines:(t,n)=>`\u30D3\u30F3\u30B4 ${t} \u30E9\u30A4\u30F3\uFF01 \u306E\u3053\u308A ${n} \u3053`,statusReach:t=>`\u30EA\u30FC\u30C1\uFF01 \u3042\u3068${t.slice(0,2).map(n=>`\u300C${n}\u300D`).join("\u304B")}${t.length>2?"\u306A\u3069":""}\u3067\u30D3\u30F3\u30B4`,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:t=>`${t}\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:t=>`PERFECT BONUS +${t}`,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"},it={title:"Packing Bingo",tag:"School trip",subtitle:"",packed:"PACKED",bingo:"BINGO",score:"SCORE",combo:t=>`${t} COMBO`,comboPop:t=>`${t} COMBO!`,reset:"Reset",soundOn:"\u{1F50A} Sound on",soundOff:"\u{1F507} Muted",stamp:"OK",free:"FREE",reachBadge:"REACH",reachPop:"Reach!",bannerSingle:"BINGO!",bannerDouble:"DOUBLE BINGO!",bannerTriple:"TRIPLE BINGO!",bannerNth:t=>`Line ${t}!`,bannerMulti:t=>`${t} lines at once!`,statusStart:()=>"",statusLines:(t,n)=>`${t} bingo line${t===1?"":"s"}! ${n} to go`,statusReach:t=>`Reach! Pack ${t.slice(0,2).join(" or ")}${t.length>2?" (or more)":""} for a bingo`,statusDone:"\u{1F389} Perfect! Nothing left behind.",perfectTag:"\u{1F3C6} PERFECT",perfectStamp:`ALL
4
- SET`,perfectTitle:"Perfect!",perfectBody:t=>`All ${t} packed!
5
- Have a great trip!`,perfectBonus:t=>`PERFECT BONUS +${t}`,statScore:"SCORE",statCombo:"MAX COMBO",statLines:"BINGO",close:"Close",demoLabel:"Demo:",demoBingo:"\u25B6 Show a bingo",demoPerfect:"\u25B6 Combo \u2192 perfect",demoRestore:"Restore"};var st=[0,2,4,7,9,12,14,16,19,21,24,26,28,31,33,36],V=t=>523.25*Math.pow(2,t/12);function pt(t){let n=null,s=null;function c(){if(t()||typeof window>"u")return null;let l=navigator.userActivation;if(!n&&l&&!l.hasBeenActive)return null;if(!n){let d=window.AudioContext??window.webkitAudioContext;if(!d)return null;n=new d;let g=n.createDynamicsCompressor();s=n.createGain(),s.gain.value=.6,s.connect(g).connect(n.destination)}return n.state==="suspended"&&n.resume(),n}function b(l,d=0,g=.15,M="triangle",v=.2,$=0){let F=c();if(!F||!s)return;let u=F.currentTime+d,I=F.createOscillator(),C=F.createGain();I.type=M,I.frequency.setValueAtTime(l,u),$&&I.frequency.exponentialRampToValueAtTime($,u+g),C.gain.setValueAtTime(1e-4,u),C.gain.exponentialRampToValueAtTime(v,u+.01),C.gain.exponentialRampToValueAtTime(1e-4,u+g),I.connect(C).connect(s),I.start(u),I.stop(u+g+.05)}function L(l=0,d=.3,g=.25,M=1200){let v=c();if(!v||!s)return;let $=v.currentTime+l,F=Math.ceil(v.sampleRate*d),u=v.createBuffer(1,F,v.sampleRate),I=u.getChannelData(0);for(let S=0;S<F;S++)I[S]=(Math.random()*2-1)*Math.pow(1-S/F,2.5);let C=v.createBufferSource(),H=v.createBiquadFilter(),z=v.createGain();C.buffer=u,H.type="bandpass",H.frequency.value=M,H.Q.value=.7,z.gain.value=g,C.connect(H).connect(z).connect(s),C.start($)}let k=l=>V(st[Math.min(Math.max(l,0),st.length-1)]);return{pop(l){let d=k(l);b(d,0,.16,"triangle",.22),b(d*2,0,.08,"sine",.06),b(150,0,.09,"sine",.25,60)},off:()=>b(392,0,.1,"sine",.1,262),reach(){b(988,0,.08,"square",.05),b(1319,.09,.14,"square",.05)},bingo(l){[0,4,7,12,16,19].forEach((d,g)=>b(V(d),g*.06,.22,"square",.06)),[12,16,19].forEach(d=>b(V(d),.38,.6,"triangle",.12)),l>1&&[24,28,31].forEach(d=>b(V(d),.55,.6,"triangle",.08)),L(0,.25,.12,3e3)},perfect(){[0,4,7,12,16,19,24].forEach((l,d)=>b(V(l-12),d*.07,.25,"square",.06)),[0,4,7,12].forEach(l=>b(V(l),.55,1.2,"triangle",.12)),[12,16,19].forEach(l=>b(V(l),.55,1.2,"sawtooth",.03)),b(V(-12),.55,1.2,"sine",.2)},boom(){L(0,.5,.3,500),b(90,0,.3,"sine",.25,40)},tick:()=>b(1760,0,.03,"square",.03),note:(l,d=0)=>b(k(l),d,.12,"square",.05),close(){n&&n.close().catch(()=>{}),n=null,s=null}}}function lt(t){return t.controlled?null:t.storageKey!==void 0?t.storageKey||null:t.demo?null:It(Ie(t))}function It(t){let n=t.map(c=>`${c.emoji}\0${c.label}`).join(""),s=2166136261;for(let c=0;c<n.length;c++)s^=n.charCodeAt(c),s=Math.imul(s,16777619);return`packing-bingo:${(s>>>0).toString(36)}`}var ct="https://fonts.googleapis.com/css2?family=Dela+Gothic+One&family=M+PLUS+Rounded+1c:wght@500;800&display=swap",bt=`
1
+ "use strict";var PackingBingo=(()=>{var We=Object.defineProperty;var Vt=Object.getOwnPropertyDescriptor;var Xt=Object.getOwnPropertyNames;var Yt=Object.prototype.hasOwnProperty;var Jt=(n,a)=>{for(var s in a)We(n,s,{get:a[s],enumerable:!0})},Zt=(n,a,s,m)=>{if(a&&typeof a=="object"||typeof a=="function")for(let c of Xt(a))!Yt.call(n,c)&&c!==s&&We(n,c,{get:()=>a[c],enumerable:!(m=Vt(a,c))||m.enumerable});return n};var Qt=n=>Zt(We({},"__esModule",{value:!0}),n);var pn={};Jt(pn,{DEFAULT_ITEMS:()=>ce,LINES:()=>tn,bingoLines:()=>Ye,createPackingBingo:()=>sn,en:()=>wt,ja:()=>Je});var ce=[{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 ze=2,Ve=10,Te=n=>{throw new Error(`[packing-bingo] ${n}`)};function Xe(n){if(n.items)return n.items;let a=n.size;return a==null||!Number.isInteger(a)||a<ze?ce:ce.slice(0,a*a-(n.free?1:0))}function xt(n,a){(!Number.isInteger(n)||n<ze||n>Ve)&&Te(`"size" must be a whole number from ${ze} to ${Ve} (got ${n}).`),a&&n%2===0&&Te(`"free" needs an odd size such as 3 or 5, so that the card has a center (got ${n}).`)}function vt(n,a){let s=b=>Array.from({length:n},(l,k)=>b(k)),m=[...s(b=>s(l=>b*n+l)),...s(b=>s(l=>l*n+b)),s(b=>b*(n+1)),s(b=>(b+1)*(n-1))],c=a?(n*n-1)/2:-1,x=b=>a&&b>c?b-1:b;return{center:c,cellLines:m,lines:m.map(b=>b.filter(l=>l!==c).map(x))}}function yt(n){let a=Xe(n),s=!!n.free,m=n.size;if(m==null){let v=a.length,$=u=>{let M=Math.round(Math.sqrt(u));return M*M===u&&M>=ze&&M<=Ve?M:0};if(m=$(v+(s?1:0)),!m){let u=$(v+(s?0:1)),M=s?u?`; ${v} items fill a ${u}\xD7${u} card without "free"`:"":u%2?`, or set "free" for a ${u}\xD7${u} card with a FREE center`:"";Te(s?`With "free", "items" must have one less than an odd square number of entries (8, 24, 48, 80)${M} (got ${v}).`:`"items" must have a square number of entries (4, 9, 16, 25, \u2026, 100)${M} (got ${v}).`)}}xt(m,s);let c=m*m-(s?1:0);if(a.length!==c){let v=`a ${m}\xD7${m} card${s?" with a FREE center":""}`;Te(n.items?`"items" must have exactly ${c} entries for ${v} (got ${a.length}).`:`A ${v.slice(2)} needs ${c} items, but DEFAULT_ITEMS has only ${ce.length}. Pass "items".`)}let{center:x,cellLines:b,lines:l}=vt(m,s),k=a.map((v,$)=>s&&$>=x?$+1:$);return{size:m,free:s,items:a,itemCell:k,center:x,cellLines:b,lines:l}}function Ye(n,a=!1){return xt(n,a),vt(n,a).lines}var Je={title:"\u6301\u3061\u3082\u306E\u30D3\u30F3\u30B4",tag:"",subtitle:"",packed:"\u305D\u308D\u3063\u305F",bingo:"BINGO",score:"SCORE",combo:n=>`${n} COMBO`,comboPop:n=>`${n} 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",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:n=>`${n} \u30E9\u30A4\u30F3\u76EE\uFF01`,bannerMulti:n=>`\u4E00\u6C17\u306B ${n} \u30E9\u30A4\u30F3\uFF01`,statusStart:()=>"",statusLines:(n,a)=>`\u30D3\u30F3\u30B4 ${n} \u30E9\u30A4\u30F3\uFF01 \u306E\u3053\u308A ${a} \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:n=>`${n}\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:n=>`PERFECT BONUS +${n}`,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"},wt={title:"Packing Bingo",tag:"",subtitle:"",packed:"PACKED",bingo:"BINGO",score:"SCORE",combo:n=>`${n} COMBO`,comboPop:n=>`${n} COMBO!`,reset:"Reset",shuffle:"\u{1F500} Shuffle",soundOn:"\u{1F50A} Sound on",soundOff:"\u{1F507} Muted",stamp:"OK",free:"FREE",reachBadge:"REACH",reachPop:"Reach!",bannerSingle:"BINGO!",bannerDouble:"DOUBLE BINGO!",bannerTriple:"TRIPLE BINGO!",bannerNth:n=>`Line ${n}!`,bannerMulti:n=>`${n} lines at once!`,statusStart:()=>"",statusLines:(n,a)=>`${n} bingo line${n===1?"":"s"}! ${a} to go`,statusReach:()=>"",statusDone:"\u{1F389} Perfect! Nothing left behind.",perfectTag:"\u{1F3C6} PERFECT",perfectStamp:`ALL
4
+ SET`,perfectTitle:"Perfect!",perfectBody:n=>`All ${n} packed!
5
+ Have a great trip!`,perfectBonus:n=>`PERFECT BONUS +${n}`,statScore:"SCORE",statCombo:"MAX COMBO",statLines:"BINGO",close:"Close",demoLabel:"Demo:",demoBingo:"\u25B6 Show a bingo",demoPerfect:"\u25B6 Combo \u2192 perfect",demoRestore:"Restore"};var Et=[0,2,4,7,9,12,14,16,19,21,24,26,28,31,33,36],D=n=>523.25*Math.pow(2,n/12);function Lt(n){let a=null,s=null;function m(){if(n()||typeof window>"u")return null;let l=navigator.userActivation;if(!a&&l&&!l.hasBeenActive)return null;if(!a){let k=window.AudioContext??window.webkitAudioContext;if(!k)return null;a=new k;let v=a.createDynamicsCompressor();s=a.createGain(),s.gain.value=.6,s.connect(v).connect(a.destination)}return a.state==="suspended"&&a.resume(),a}function c(l,k=0,v=.15,$="triangle",u=.2,M=0){let E=m();if(!E||!s)return;let T=E.currentTime+k,q=E.createOscillator(),P=E.createGain();q.type=$,q.frequency.setValueAtTime(l,T),M&&q.frequency.exponentialRampToValueAtTime(M,T+v),P.gain.setValueAtTime(1e-4,T),P.gain.exponentialRampToValueAtTime(u,T+.01),P.gain.exponentialRampToValueAtTime(1e-4,T+v),q.connect(P).connect(s),q.start(T),q.stop(T+v+.05)}function x(l=0,k=.3,v=.25,$=1200){let u=m();if(!u||!s)return;let M=u.currentTime+l,E=Math.ceil(u.sampleRate*k),T=u.createBuffer(1,E,u.sampleRate),q=T.getChannelData(0);for(let g=0;g<E;g++)q[g]=(Math.random()*2-1)*Math.pow(1-g/E,2.5);let P=u.createBufferSource(),ee=u.createBiquadFilter(),ve=u.createGain();P.buffer=T,ee.type="bandpass",ee.frequency.value=$,ee.Q.value=.7,ve.gain.value=v,P.connect(ee).connect(ve).connect(s),P.start(M)}let b=l=>D(Et[Math.min(Math.max(l,0),Et.length-1)]);return{pop(l){let k=b(l);c(k,0,.16,"triangle",.22),c(k*2,0,.08,"sine",.06),c(150,0,.09,"sine",.25,60)},off:()=>c(392,0,.1,"sine",.1,262),reach(){c(988,0,.08,"square",.05),c(1319,.09,.14,"square",.05)},bingo(l){[0,4,7,12,16,19].forEach((k,v)=>c(D(k),v*.06,.22,"square",.06)),[12,16,19].forEach(k=>c(D(k),.38,.6,"triangle",.12)),l>1&&[24,28,31].forEach(k=>c(D(k),.55,.6,"triangle",.08)),x(0,.25,.12,3e3)},perfect(){[0,4,7,12,16,19,24].forEach((l,k)=>c(D(l-12),k*.07,.25,"square",.06)),[0,4,7,12].forEach(l=>c(D(l),.55,1.2,"triangle",.12)),[12,16,19].forEach(l=>c(D(l),.55,1.2,"sawtooth",.03)),c(D(-12),.55,1.2,"sine",.2)},boom(){x(0,.5,.3,500),c(90,0,.3,"sine",.25,40)},tick:()=>c(1760,0,.03,"square",.03),note:(l,k=0)=>c(b(l),k,.12,"square",.05),shuffle(){for(let l=0;l<7;l++)x(l*.042,.05,.16,1600+l*260);c(D(7),.34,.12,"triangle",.14),c(D(12),.42,.2,"triangle",.14)},close(){a&&a.close().catch(()=>{}),a=null,s=null}}}function St(n){return n.controlled?null:n.storageKey!==void 0?n.storageKey||null:n.demo?null:en(Xe(n))}function en(n){let a=n.map(m=>`${m.emoji}\0${m.label}`).join(""),s=2166136261;for(let m=0;m<a.length;m++)s^=a.charCodeAt(m),s=Math.imul(s,16777619);return`packing-bingo:${(s>>>0).toString(36)}`}var Mt=`
6
6
  .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
7
  .pkb,.pkb *{box-sizing:border-box;margin:0;padding:0}
8
8
  .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}
@@ -13,6 +13,7 @@ Have a great trip!`,perfectBonus:t=>`PERFECT BONUS +${t}`,statScore:"SCORE",stat
13
13
  .pkb-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px 16px;margin-bottom:18px}
14
14
  .pkb-tags{display:flex;gap:8px;align-items:center}
15
15
  .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}
16
+ .pkb-kicker:empty{display:none}
16
17
  .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}
17
18
  @keyframes pkb-rb{to{background-position:-200% 0}}
18
19
  .pkb button{font-family:var(--pk-body)}
@@ -69,8 +70,13 @@ Have a great trip!`,perfectBonus:t=>`PERFECT BONUS +${t}`,statScore:"SCORE",stat
69
70
  .pkb-lines .pkb-o{stroke:var(--pk-ink);stroke-width:calc(6px*var(--pk-d))}
70
71
  .pkb-lines .pkb-draw line{animation:pkb-draw .45s ease-out .3s both}
71
72
  @keyframes pkb-draw{from{stroke-dashoffset:1}}
72
- .pkb-foot{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:18px;font-weight:800;font-size:13px;word-break:auto-phrase}
73
- .pkb-reset{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}
73
+ .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}
74
+ .pkb-foot>span{flex:1 1 14em}
75
+ .pkb-foot>span:empty{flex-basis:0}
76
+ .pkb-acts{display:flex;gap:8px;flex:none;margin-left:auto}
77
+ .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}
78
+ .pkb-shuf{background:var(--pk-paper);box-shadow:2px 2px 0 var(--pk-ink)}
79
+ .pkb-shuf:active{transform:translate(2px,2px);box-shadow:none}
74
80
  .pkb-flash{position:absolute;inset:0;z-index:7;background:#fff;opacity:0;pointer-events:none}
75
81
  .pkb-flash.pkb-go{animation:pkb-flash .4s ease-out}
76
82
  @keyframes pkb-flash{0%{opacity:.8}100%{opacity:0}}
@@ -110,21 +116,21 @@ Have a great trip!`,perfectBonus:t=>`PERFECT BONUS +${t}`,statScore:"SCORE",stat
110
116
  @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}}
111
117
  @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-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{transition:none}}
112
118
  @keyframes pkb-fade{0%,100%{opacity:0}15%,80%{opacity:1}}
113
- `;var Rt=Re(4),dt=["#E8473B","#2F6FED","#1FA971","#FFFDF6","#2A1F14","#FF9F1C"],mt=["#FF9F1C","#1FA971","#2F6FED","#9B5DE5","#E8473B"],qt=2500,ft="packing-bingo-muted",x=t=>t.replace(/[&<>"']/g,n=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[n]);function ut(t){try{return localStorage.getItem(t)}catch{return null}}function kt(t,n){try{localStorage.setItem(t,n)}catch{}}function Nt(t){if(!document.getElementById("pkb-styles")){let n=document.createElement("style");n.id="pkb-styles",n.textContent=bt,document.head.appendChild(n)}if(t&&!document.getElementById("pkb-fonts")){let n=document.createElement("link");n.id="pkb-fonts",n.rel="stylesheet",n.href=ct,document.head.appendChild(n)}}function jt(t,n,s){let c=t.size,b=Array.from({length:c*c},(l,d)=>{let g=`--pkb-gd:${+((Math.floor(d/c)+d%c)*.36/Math.max(1,c-1)).toFixed(3)}s`;if(d===t.center)return`<div class="pkb-tile pkb-free pkb-on" style="${g}"><span class="pkb-stamp">${x(n.free)}</span></div>`;let M=t.items[t.itemCell.indexOf(d)];return`<label class="pkb-tile" data-reach="${x(n.reachBadge)}" style="${g}"><input type="checkbox"><span class="pkb-emo" aria-hidden="true">${x(M.emoji)}</span><span class="pkb-lbl">${x(M.label).replace(/・/g,"\u30FB<wbr>")}</span><span class="pkb-stamp" aria-hidden="true">${x(n.stamp)}</span></label>`}).join(""),L=`--pk-n:${c};--pk-s:${+Math.min(1.35,4/c).toFixed(3)};--pk-d:${+Math.min(1,4/c).toFixed(3)}`,k=s?`<div class="pkb-demo"><span>${x(n.demoLabel)}</span><button type="button" data-r="dB">${x(n.demoBingo)}</button><button type="button" data-r="dP">${x(n.demoPerfect)}</button><button type="button" data-r="dR">${x(n.demoRestore)}</button></div>`:"";return`<div class="pkb" style="${L}"><div class="pkb-board">
119
+ `;var tn=Ye(4),Bt=["#E8473B","#2F6FED","#1FA971","#FFFDF6","#2A1F14","#FF9F1C"],$t=["#FF9F1C","#1FA971","#2F6FED","#9B5DE5","#E8473B"],nn=2500,Ct="packing-bingo-muted",an="packing-bingo-order:",h=n=>n.replace(/[&<>"']/g,a=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[a]);function Ze(n){try{return localStorage.getItem(n)}catch{return null}}function Qe(n,a){try{localStorage.setItem(n,a)}catch{}}var Tt=(n,a)=>`${+((Math.floor(n/a)+n%a)*.36/Math.max(1,a-1)).toFixed(3)}s`,Oe=n=>n.slice().sort((a,s)=>a-s).join(","),zt=560;function rn(){if(document.getElementById("pkb-styles"))return;let n=document.createElement("style");n.id="pkb-styles",n.textContent=Mt,document.head.appendChild(n)}function on(n,a,{demo:s,shuffle:m,vibrate:c}){let x=n.size,b=c?'<input type="checkbox" switch role="checkbox">':'<input type="checkbox">',l=Array.from({length:x*x},($,u)=>{let M=`--pkb-gd:${Tt(u,x)}`;if(u===n.center)return`<div class="pkb-tile pkb-free pkb-on" style="${M}"><span class="pkb-stamp">${h(a.free)}</span></div>`;let E=n.items[n.itemCell.indexOf(u)];return`<label class="pkb-tile" data-reach="${h(a.reachBadge)}" style="${M}">${b}<span class="pkb-emo" aria-hidden="true">${h(E.emoji)}</span><span class="pkb-lbl">${h(E.label).replace(/・/g,"\u30FB<wbr>")}</span><span class="pkb-stamp" aria-hidden="true">${h(a.stamp)}</span></label>`}).join(""),k=`--pk-n:${x};--pk-s:${+Math.min(1.35,4/x).toFixed(3)};--pk-d:${+Math.min(1,4/x).toFixed(3)}`,v=s?`<div class="pkb-demo"><span>${h(a.demoLabel)}</span><button type="button" data-r="dB">${h(a.demoBingo)}</button><button type="button" data-r="dP">${h(a.demoPerfect)}</button><button type="button" data-r="dR">${h(a.demoRestore)}</button></div>`:"";return`<div class="pkb" style="${k}"><div class="pkb-board">
114
120
  <div class="pkb-head"><div>
115
- <div class="pkb-tags"><span class="pkb-kicker" data-r="kick">${x(n.tag)}</span><button type="button" class="pkb-snd" data-r="snd"></button></div>
116
- <h2 class="pkb-title">${x(n.title)}</h2>${n.subtitle?`<p class="pkb-sub">${x(n.subtitle)}</p>`:""}</div>
121
+ <div class="pkb-tags"><span class="pkb-kicker" data-r="kick">${h(a.tag)}</span><button type="button" class="pkb-snd" data-r="snd"></button></div>
122
+ <h2 class="pkb-title">${h(a.title)}</h2>${a.subtitle?`<p class="pkb-sub">${h(a.subtitle)}</p>`:""}</div>
117
123
  <div class="pkb-side"><div class="pkb-score">
118
- <div class="pkb-pill"><small>${x(n.packed)}</small><b data-r="cnt"></b></div>
119
- <div class="pkb-pill" data-r="bp"><small>${x(n.bingo)}</small><b data-r="bng"></b></div>
120
- <div class="pkb-pill pkb-sc" data-r="sp"><small>${x(n.score)}</small><b data-r="sc">0</b></div></div>
124
+ <div class="pkb-pill"><small>${h(a.packed)}</small><b data-r="cnt"></b></div>
125
+ <div class="pkb-pill" data-r="bp"><small>${h(a.bingo)}</small><b data-r="bng"></b></div>
126
+ <div class="pkb-pill pkb-sc" data-r="sp"><small>${h(a.score)}</small><b data-r="sc">0</b></div></div>
121
127
  <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>
122
- <div class="pkb-gw"><div class="pkb-grid">${b}</div><svg class="pkb-lines" aria-hidden="true"></svg>
128
+ <div class="pkb-gw"><div class="pkb-grid">${l}</div><svg class="pkb-lines" aria-hidden="true"></svg>
123
129
  <div class="pkb-banner" data-r="banner" aria-hidden="true"><b data-r="bT"></b><span data-r="bS"></span></div></div>
124
- <div class="pkb-foot"><span data-r="msg" aria-live="polite"></span><button type="button" class="pkb-reset" data-r="reset">${x(n.reset)}</button></div>
130
+ <div class="pkb-foot"><span data-r="msg" aria-live="polite"></span><div class="pkb-acts">${m?`<button type="button" class="pkb-shuf" data-r="shuf">${h(a.shuffle)}</button>`:""}<button type="button" class="pkb-reset" data-r="reset">${h(a.reset)}</button></div></div>
125
131
  <div class="pkb-flash" data-r="flash"></div>
126
- <div class="pkb-perfect" data-r="perfect"><div class="pkb-card" role="dialog" aria-label="${x(n.perfectTitle)}">
127
- <div class="pkb-medal">${x(n.perfectStamp)}</div><h3 class="pkb-ptitle">${x(n.perfectTitle)}</h3><p class="pkb-pbody" data-r="pbody">${x(gt(n,t.items.length))}</p>
128
- <div class="pkb-stats"><div><small>${x(n.statScore)}</small><b data-r="sScore">0</b></div><div><small>${x(n.statCombo)}</small><b data-r="sCombo">\xD70</b></div><div><small>${x(n.statLines)}</small><b data-r="sBingo">0</b></div></div>
129
- <button type="button" class="pkb-close" data-r="close">${x(n.close)}</button></div></div>
130
- <canvas class="pkb-fx"></canvas></div>${k}</div>`}var gt=(t,n)=>typeof t.perfectBody=="function"?t.perfectBody(n):t.perfectBody;function Dt(t,n={}){let s=ot(n),{items:c,lines:b,cellLines:L}=s,k=s.size,l=c.length,d=e=>Array.from({length:l},(a,r)=>!!e?.[r]),g=[...L[0],...L[2*k].slice(1,-1)],M=new Set(s.itemCell.flatMap((e,a)=>g.includes(e)?[a]:[])),v=()=>Array.from({length:l},(e,a)=>M.has(a)),$=e=>Math.floor(e/k)+e%k,F=Math.min(1,4/k),u={...qe,...n.messages};n.title!=null&&(u.title=n.title),n.tag!=null&&(u.tag=n.tag),n.subtitle!=null&&(u.subtitle=n.subtitle);let I=!!n.controlled,C=lt(n),H=!!n.demo,z=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,S=!1,J=new Set,R=(e,a)=>{let r=window.setTimeout(()=>{J.delete(r),S||e()},a);J.add(r)},ht=e=>new Promise(a=>window.setTimeout(a,e)),se=0;Nt(n.fonts!==!1),t.innerHTML=jt(s,u,H);let m=e=>{let a=t.querySelector(`[data-r="${e}"]`);if(!a)throw new Error(`[packing-bingo] internal: missing element "${e}"`);return a},G=t.querySelector(".pkb-board"),de=t.querySelector(".pkb-gw"),ye=t.querySelector(".pkb-grid"),Ne=t.querySelector(".pkb-lines"),pe=t.querySelector(".pkb-fx"),y=pe.getContext("2d"),Z=Array.from(ye.children),Q=s.itemCell.map(e=>Z[e]),xt=s.center>=0?Z[s.center]:null,me=Q.map(e=>e.querySelector("input")),je=m("kick"),we=m("snd"),U=m("perfect"),w=d(void 0),B=[],fe=new Set,Ee=new Set,ue=!1,De=0,O=0,le=0,T=0,ee=0,He=0,Le=!1,ce=new Set,te=new Set,Ge=ut(ft),X=Ge!=null?Ge==="1":n.sound===!1,A=pt(()=>X),Ue=()=>{we.textContent=X?u.soundOff:u.soundOn,we.setAttribute("aria-pressed",String(!X))};we.addEventListener("click",()=>{X=!X,kt(ft,X?"1":"0"),Ue(),X||A.pop(4)}),Ue();let _=[],Y=0,be=1,K=0,W=0,_e=()=>{let e=G.getBoundingClientRect();be=Math.min(2,window.devicePixelRatio||1),K=e.width,W=e.height,pe.width=Math.round(K*be),pe.height=Math.round(W*be)},Se=(e,a,r,o,p,i,f,E)=>({x:e,y:a,vx:r,vy:o,g:p,life:f,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]}),Be=()=>{!Y&&y&&(Y=requestAnimationFrame(Ke))};function ne(e,a,r,o={}){if(!z){for(let p=0;p<r;p++){let i=(o.angle??-Math.PI/2)+(Math.random()-.5)*(o.spread??Math.PI*2),f=(o.speed??10)*(.35+Math.random()*.85),E=Math.random()<(o.star??.15)?"star":Math.random()<.3?"round":"rect";_.push(Se(e,a,Math.cos(i)*f,Math.sin(i)*f,o.g??.28,o.size??1,(o.life??110)+Math.random()*40,E))}Be()}}function vt(e){if(z)return;let a=performance.now()+e,r=()=>{for(let o=0;o<4;o++)_.push(Se(Math.random()*K,-12,(Math.random()-.5)*2,2+Math.random()*3,.045,1,420,Math.random()<.2?"star":"rect"));Be(),performance.now()<a&&R(r,45)};r()}function yt(e){if(z)return;let a=performance.now()+e,r=()=>{let o=Se(Math.random()*K,-30,(Math.random()-.5)*1.5,1.5+Math.random()*2,.05,1,500,"emoji");o.e=c[Math.random()*c.length|0].emoji,o.w=22+Math.random()*12,o.vr=(Math.random()-.5)*.06,_.push(o),Be(),performance.now()<a&&R(r,110)};r()}function wt(e,a){ne(e,a,80,{speed:7.5,g:.06,life:85,star:.4}),A.boom()}function Et(e,a){e.beginPath();for(let r=0;r<10;r++){let o=r*Math.PI/5-Math.PI/2,p=r%2?a*.45:a;e.lineTo(Math.cos(o)*p,Math.sin(o)*p)}e.closePath(),e.fill()}function Ke(){if(Y=0,!(S||!y)){y.setTransform(be,0,0,be,0,0),y.clearRect(0,0,K,W),_=_.filter(e=>e.life>0&&e.y<W+40);for(let e of _)e.vx*=.985,e.vy=e.vy*.985+e.g,e.x+=e.vx,e.y+=e.vy,e.r+=e.vr,e.life--,y.save(),y.globalAlpha=Math.min(1,e.life/25),y.translate(e.x,e.y),y.rotate(e.r),y.fillStyle=e.c,e.shape==="round"?(y.beginPath(),y.arc(0,0,e.h/1.6,0,7),y.fill()):e.shape==="star"?Et(y,e.w*.8):e.shape==="emoji"?(y.font=`${e.w}px "Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji",sans-serif`,y.textAlign="center",y.textBaseline="middle",y.fillText(e.e??"",0,0)):(y.scale(1,Math.cos(e.r*2.3)),y.fillRect(-e.w/2,-e.h/2,e.w,e.h)),y.restore();_.length&&(Y=requestAnimationFrame(Ke))}}let ke=e=>{let a=G.getBoundingClientRect(),r=e.getBoundingClientRect();return{x:r.left-a.left+r.width/2,y:r.top-a.top+r.height/2}},P=(e,a)=>{e.classList.remove(a),e.offsetWidth,e.classList.add(a)},We=(e,a)=>{z||(e.classList.remove("pkb-squash"),e.style.setProperty("--pkb-d",a+"ms"),P(e,"pkb-hop"))};ye.addEventListener("animationend",e=>{let a=e.target;a.classList.contains("pkb-tile")&&(e.animationName==="pkb-hop"||e.animationName==="pkb-squash")&&a.classList.remove(e.animationName)});let Lt=e=>{let a=document.createElement("span");a.className="pkb-ring",e.appendChild(a),a.addEventListener("animationend",()=>a.remove())},Me=e=>{let a=navigator.userActivation;if(!(a&&!a.hasBeenActive))try{navigator.vibrate?.(e)}catch{}},ge=(e,a,r,o,p=0,i)=>{let f=document.createElement("div");f.className="pkb-float pkb-"+o,f.textContent=e,f.style.left=a+"px",f.style.top=r+"px",p&&(f.style.animationDelay=p+"ms"),i&&(f.style.color=i),G.appendChild(f),f.addEventListener("animationend",()=>f.remove())},Ve=(e,a,r)=>Math.max(0,Math.min(1,(e-a)/r)),Xe=e=>1-Math.pow(1-e,3),he=0;function $e(){cancelAnimationFrame(he);let e=le,a=O,r=performance.now(),o=p=>{if(S)return;let i=Ve(p,r,450);le=Math.round(e+(a-e)*Xe(i)),m("sc").textContent=le.toLocaleString(),i<1&&(he=requestAnimationFrame(o))};o(r),z||P(m("sp"),"pkb-bump")}let Ye=(e,a,r,o="pt")=>{ge(`+${e}`,a,r,o),$e()};function Ce(e,a,r,o,p,i=!1){let f=performance.now(),E=se,j=0,D=q=>{if(S||E!==se)return;let oe=Ve(q,f,o);e.textContent=p(Math.round(a+(r-a)*Xe(oe))),i&&oe<1&&q-j>55&&(A.tick(),j=q),oe<1?requestAnimationFrame(D):z||P(e,"pkb-bump")};D(f)}let Je=e=>({x:e.offsetLeft+e.offsetWidth/2,y:e.offsetTop+e.offsetHeight/2});function Ze(e=[]){Ne.setAttribute("viewBox",`0 0 ${de.clientWidth} ${de.clientHeight}`),Ne.innerHTML=B.map(a=>{let r=Je(Z[L[a][0]]),o=Je(Z[L[a][k-1]]),p=o.x-r.x,i=o.y-r.y,f=Math.hypot(p,i)||1,E=26*F,j=p/f*E,D=i/f*E,q=`x1="${r.x-j}" y1="${r.y-D}" x2="${o.x+j}" y2="${o.y+D}" pathLength="1"`;return`<g${e.includes(a)?' class="pkb-draw"':""}><line class="pkb-u" ${q}/><line class="pkb-o" ${q}/></g>`}).join("")}function St(e,a){let r=ke(Q[e]);if(!a){T=0,m("combo").classList.remove("pkb-on"),A.off();return}let o=performance.now();T=o-He<qt?T+1:1,He=o,ee=Math.max(ee,T),A.pop(T-1),z||(P(Q[e],"pkb-squash"),Lt(Q[e])),ne(r.x,r.y,18,{speed:6,g:.2,life:30,size:.6,star:.5}),ce.has(e)||(ce.add(e),O+=10*T,Ye(10*T,r.x,r.y-12)),T>=2&&(ge(u.comboPop(T),r.x,r.y+22,"cmb",90,mt[(T-2)%mt.length]),m("cmbN").textContent=u.combo(T),P(m("combo"),"pkb-on")),Me(12)}m("cbar").addEventListener("animationend",()=>{m("combo").classList.remove("pkb-on"),T=0});function Bt(e){e.forEach(a=>{let r=ke(Q[a]);ge(u.reachPop,r.x,r.y-34,"rch",150)}),R(()=>A.reach(),150)}function Mt(e,a){let r=e.length,o=[...new Set(e.flatMap(i=>L[i]))].map(i=>Z[i]),p=Math.min(70,300/o.length);o.forEach((i,f)=>R(()=>{We(i,0);let E=ke(i);ne(E.x,E.y,14,{speed:5,g:.15,life:30,size:.7,star:.8}),A.note(f+3)},f*p)),R(()=>{m("bT").textContent=r>=3?u.bannerTriple:r===2?u.bannerDouble:u.bannerSingle,m("bS").textContent=r>1?u.bannerMulti(r):u.bannerNth(B.length),P(m("banner"),"pkb-show"),z||(P(m("flash"),"pkb-go"),P(G,"pkb-punch"));let i=ke(de);ne(i.x,i.y,r>1?180:110,{speed:r>1?16:13,star:.3}),A.bingo(r),Me(r>1?[40,60,40,60,90]:[40,60,40]),a&&R(()=>Ye(a,i.x,i.y+105,"big"),350)},o.length*p+60)}function $t(e){let a=Le?0:1e3;Le=!0,O+=a,Z.forEach((o,p)=>We(o,$(p)*180/Math.max(1,k-1))),A.perfect(),z||P(m("flash"),"pkb-go"),m("pbody").textContent=gt(u,l),m("sScore").textContent="0",m("sCombo").textContent="\xD70",m("sBingo").textContent="0",R(()=>{P(U,"pkb-show"),m("close").focus({preventScroll:!0}),R(()=>{z||P(G,"pkb-shake"),A.boom(),ne(0,W,90,{angle:-Math.PI/3,spread:.8,speed:22,g:.32,star:.3}),ne(K,W,90,{angle:-Math.PI*2/3,spread:.8,speed:22,g:.32,star:.3}),vt(3500),Me([60,80,60,80,200]),a&&ge(u.perfectBonus(a),K/2,W*.16,"big"),Ce(m("sScore"),0,O,1300,o=>o.toLocaleString(),!0),Ce(m("sCombo"),0,ee,700,o=>"\xD7"+o),Ce(m("sBingo"),0,B.length,700,String),$e()},720),[1300,1650,2e3,2350,2700].forEach(o=>R(()=>wt(K*(.15+Math.random()*.7),W*(.12+Math.random()*.3)),o)),R(()=>yt(3e3),1500)},520);let r={score:O,maxCombo:ee};e.push(()=>n.onPerfect?.(r))}function Qe(){se++,J.forEach(e=>clearTimeout(e)),J.clear(),cancelAnimationFrame(he),le=O,m("sc").textContent=O.toLocaleString()}function Ct(){_=[],cancelAnimationFrame(Y),Y=0,y?.clearRect(0,0,pe.width,pe.height),G.querySelectorAll(".pkb-float, .pkb-ring").forEach(e=>e.remove()),m("banner").classList.remove("pkb-show"),m("flash").classList.remove("pkb-go"),m("combo").classList.remove("pkb-on"),U.classList.remove("pkb-show")}function ze(e,a){let r=[],o=w,p=o.filter(Boolean).length;B=b.flatMap((h,N)=>h.every(Ae=>o[Ae])?[N]:[]);let i=B.filter(h=>!fe.has(h));[...fe].some(h=>!B.includes(h))&&(Qe(),p<l&&U.classList.remove("pkb-show"));let f=new Set(B.flatMap(h=>L[h])),E=new Set;for(let h of b){let N=h.filter(Ae=>!o[Ae]);N.length===1&&E.add(N[0])}Q.forEach((h,N)=>{h.classList.toggle("pkb-on",o[N]),h.classList.toggle("pkb-line",f.has(s.itemCell[N])),h.classList.toggle("pkb-reach",E.has(N))}),xt?.classList.toggle("pkb-line",f.has(s.center)),G.classList.toggle("pkb-all",p===l),je.classList.toggle("pkb-gold",p===l),je.textContent=p===l?u.perfectTag:u.tag,m("cnt").textContent=`${p}/${l}`,m("bng").textContent=String(B.length);let j=m("bp");B.length>De&&(j.classList.remove("pkb-hot"),j.offsetWidth),j.classList.toggle("pkb-hot",B.length>0),De=B.length,Ze(i),e!==null&&St(e,o[e]);let D=i.filter(h=>!te.has(h));D.forEach(h=>te.add(h));let q=100*D.length*D.length;if(O+=q,a)q&&$e();else if(p===l&&!ue)$t(r);else if(i.length){Mt(i,q);let h={newLines:i,totalLines:B.length,score:O};r.push(()=>n.onBingo?.(h))}else if(e!==null&&o[e]){let h=[...E].filter(N=>!Ee.has(N));h.length&&Bt(h)}fe=new Set(B),Ee=E,ue=p===l;let oe=[...E].map(h=>c[h].label);return m("msg").textContent=p===l?u.statusDone:oe.length?u.statusReach(oe):B.length?u.statusLines(B.length,l-p):u.statusStart(l-p),r}let et=e=>{for(let a of e){if(S)return;a()}},tt=()=>{C&&kt(C,JSON.stringify(w))};function nt(e,a,r){w=e,me.forEach((p,i)=>p.checked=w[i]);let o=ze(a,r);return tt(),o}function Te(e){Qe(),Ct(),w=e,me.forEach((a,r)=>a.checked=w[r]),ce.clear(),te.clear(),w.forEach((a,r)=>a&&ce.add(r)),b.forEach((a,r)=>a.every(o=>w[o])&&te.add(r)),fe=new Set(te),Ee=new Set,ue=w.every(Boolean),Le=ue,O=le=ce.size*10+te.size*100,T=0,ee=0,m("sc").textContent=O.toLocaleString(),ze(null,!0),tt()}function ae(e,a,r={}){if(I){me.forEach((p,i)=>p.checked=w[i]),n.onChange?.(e.slice());return}let o=[];r.reset?Te(e):o=nt(e,a,!!r.quiet),n.onChange?.(w.slice()),et(o)}if(ye.addEventListener("change",e=>{let a=me.indexOf(e.target);if(a<0)return;let r=w.slice();r[a]=!r[a],ae(r,a)}),m("reset").addEventListener("click",()=>ae(d(void 0),null,{reset:!0})),m("close").addEventListener("click",()=>U.classList.remove("pkb-show")),U.addEventListener("click",e=>{e.target===U&&U.classList.remove("pkb-show")}),H){let e=!1,a=()=>{w.every(Boolean)?ae(d(void 0),null,{reset:!0}):U.classList.remove("pkb-show")},r=async o=>{if(!e){e=!0;try{a();let p=se;for(let i of o){if(await ht(i.delay),S||p!==se)return;let f=w.slice();f[i.i]=!0,ae(f,i.i,{quiet:i.quiet})}}finally{e=!1}}};m("dB").addEventListener("click",()=>{let o=()=>b.map(i=>i.filter(f=>!w[f])).filter(i=>i.length).sort((i,f)=>i.length-f.length)[0]??[],p=w.every(Boolean)?[...b[0]]:o();r(p.map(i=>({i,delay:320})))}),m("dP").addEventListener("click",()=>{let o=c.map((i,f)=>f),p=w.every(Boolean)?o:o.filter(i=>!w[i]);r(p.map((i,f)=>f<p.length-1?{i,delay:170,quiet:!0}:{i,delay:450}))}),m("dR").addEventListener("click",()=>{e||ae(v(),null,{reset:!0})})}let re=null;if(C)try{let e=JSON.parse(ut(C)??"null");Array.isArray(e)&&(re=d(e))}catch{}!re&&n.defaultChecked&&(re=d(n.defaultChecked)),!re&&H&&(re=v()),_e(),Te(re??d(void 0));let Oe=typeof ResizeObserver=="function"?new ResizeObserver(()=>{_e(),Ze()}):null;return Oe?.observe(G),Oe?.observe(de),{setChecked(e,a={}){if(S)return;let r=d(e),o=r.flatMap((p,i)=>p!==w[i]?[i]:[]);if(o.length){if(!a.animate||o.length!==1){Te(r);return}et(nt(r,o[0],!1))}},reset(){S||ae(d(void 0),null,{reset:!0})},refresh(){S||ze(null,!0)},getState(){return{checked:w.slice(),lines:B.slice(),score:O,maxCombo:ee,complete:w.every(Boolean),size:k,free:s.free}},destroy(){S||(S=!0,J.forEach(e=>clearTimeout(e)),J.clear(),cancelAnimationFrame(Y),cancelAnimationFrame(he),Oe?.disconnect(),A.close(),t.innerHTML="")}}}return Ft(Ht);})();
132
+ <div class="pkb-perfect" data-r="perfect"><div class="pkb-card" role="dialog" aria-label="${h(a.perfectTitle)}">
133
+ <div class="pkb-medal">${h(a.perfectStamp)}</div><h3 class="pkb-ptitle">${h(a.perfectTitle)}</h3><p class="pkb-pbody" data-r="pbody">${h(Ot(a,n.items.length))}</p>
134
+ <div class="pkb-stats"><div><small>${h(a.statScore)}</small><b data-r="sScore">0</b></div><div><small>${h(a.statCombo)}</small><b data-r="sCombo">\xD70</b></div><div><small>${h(a.statLines)}</small><b data-r="sBingo">0</b></div></div>
135
+ <button type="button" class="pkb-close" data-r="close">${h(a.close)}</button></div></div>
136
+ <canvas class="pkb-fx"></canvas></div>${v}</div>`}var Ot=(n,a)=>typeof n.perfectBody=="function"?n.perfectBody(a):n.perfectBody;function sn(n,a={}){let s=yt(a),{items:m,cellLines:c}=s,x=s.size,b=m.length,l=e=>Array.from({length:b},(t,r)=>!!e?.[r]),k=()=>Array.from({length:b},(e,t)=>t),v=e=>e.every((t,r)=>t===r),$=e=>Array.isArray(e)&&e.length===b&&e.every(t=>Number.isInteger(t)&&t>=0&&t<b)&&new Set(e).size===b,u=k(),M=k(),E=s.lines,T=[...c[0],...c[2*x].slice(1,-1)],q=s.itemCell.flatMap((e,t)=>T.includes(e)?[t]:[]),P=()=>{let e=l(void 0);return q.forEach(t=>e[u[t]]=!0),e},ee=e=>Math.floor(e/x)+e%x,ve=Math.min(1,4/x),g={...Je,...a.messages};a.title!=null&&(g.title=a.title),a.tag!=null&&(g.tag=a.tag),a.subtitle!=null&&(g.subtitle=a.subtitle);let At=!!a.controlled,te=St(a),ye=te&&an+te,Ae=!!a.demo,et=a.vibrate!==!1,I=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,C=!1,ne=new Set,N=(e,t)=>{let r=window.setTimeout(()=>{ne.delete(r),C||e()},t);ne.add(r)},Ft=e=>new Promise(t=>window.setTimeout(t,e)),be=0;rn(),n.innerHTML=on(s,g,{demo:Ae,shuffle:a.shuffle!==!1,vibrate:et});let f=e=>{let t=n.querySelector(`[data-r="${e}"]`);if(!t)throw new Error(`[packing-bingo] internal: missing element "${e}"`);return t},_=n.querySelector(".pkb-board"),we=n.querySelector(".pkb-gw"),de=n.querySelector(".pkb-grid"),Ee=n.querySelector(".pkb-lines"),fe=n.querySelector(".pkb-fx"),L=fe.getContext("2d"),K=Array.from(de.children),H=s.itemCell.map(e=>K[e]),Pt=s.center>=0?K[s.center]:null,Le=H.map(e=>e.querySelector("input")),tt=f("kick"),Fe=f("snd"),U=f("perfect"),w=l(void 0),B=[],me=new Set,Pe=new Set,Se=!1,nt=0,O=0,ue=0,z=0,ae=0,at=0,Ie=!1,re=new Set,J=new Set,rt=Ze(Ct),Z=rt!=null?rt==="1":a.sound===!1,A=Lt(()=>Z),ot=()=>{Fe.textContent=Z?g.soundOff:g.soundOn,Fe.setAttribute("aria-pressed",String(!Z))};Fe.addEventListener("click",()=>{Z=!Z,Qe(Ct,Z?"1":"0"),ot(),Z||A.pop(4)}),ot();let W=[],Q=0,ke=1,V=0,X=0,it=()=>{let e=_.getBoundingClientRect();ke=Math.min(2,window.devicePixelRatio||1),V=e.width,X=e.height,fe.width=Math.round(V*ke),fe.height=Math.round(X*ke)},Re=(e,t,r,o,p,i,d,S)=>({x:e,y:t,vx:r,vy:o,g:p,life:d,shape:S,w:(5+Math.random()*6)*i,h:(3+Math.random()*5)*i,r:Math.random()*6,vr:(Math.random()-.5)*.35,c:Bt[Math.random()*Bt.length|0]}),qe=()=>{!Q&&L&&(Q=requestAnimationFrame(st))};function oe(e,t,r,o={}){if(!I){for(let p=0;p<r;p++){let i=(o.angle??-Math.PI/2)+(Math.random()-.5)*(o.spread??Math.PI*2),d=(o.speed??10)*(.35+Math.random()*.85),S=Math.random()<(o.star??.15)?"star":Math.random()<.3?"round":"rect";W.push(Re(e,t,Math.cos(i)*d,Math.sin(i)*d,o.g??.28,o.size??1,(o.life??110)+Math.random()*40,S))}qe()}}function It(e){if(I)return;let t=performance.now()+e,r=()=>{for(let o=0;o<4;o++)W.push(Re(Math.random()*V,-12,(Math.random()-.5)*2,2+Math.random()*3,.045,1,420,Math.random()<.2?"star":"rect"));qe(),performance.now()<t&&N(r,45)};r()}function Rt(e){if(I)return;let t=performance.now()+e,r=()=>{let o=Re(Math.random()*V,-30,(Math.random()-.5)*1.5,1.5+Math.random()*2,.05,1,500,"emoji");o.e=m[Math.random()*m.length|0].emoji,o.w=22+Math.random()*12,o.vr=(Math.random()-.5)*.06,W.push(o),qe(),performance.now()<t&&N(r,110)};r()}function qt(e,t){oe(e,t,80,{speed:7.5,g:.06,life:85,star:.4}),A.boom()}function Nt(e,t){e.beginPath();for(let r=0;r<10;r++){let o=r*Math.PI/5-Math.PI/2,p=r%2?t*.45:t;e.lineTo(Math.cos(o)*p,Math.sin(o)*p)}e.closePath(),e.fill()}function st(){if(Q=0,!(C||!L)){L.setTransform(ke,0,0,ke,0,0),L.clearRect(0,0,V,X),W=W.filter(e=>e.life>0&&e.y<X+40);for(let e of W)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"?Nt(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();W.length&&(Q=requestAnimationFrame(st))}}let Me=e=>{let t=_.getBoundingClientRect(),r=e.getBoundingClientRect();return{x:r.left-t.left+r.width/2,y:r.top-t.top+r.height/2}},R=(e,t)=>{e.classList.remove(t),e.offsetWidth,e.classList.add(t)},pt=(e,t)=>{I||(e.classList.remove("pkb-squash"),e.style.setProperty("--pkb-d",t+"ms"),R(e,"pkb-hop"))};de.addEventListener("animationend",e=>{let t=e.target;t.classList.contains("pkb-tile")&&(e.animationName==="pkb-hop"||e.animationName==="pkb-squash")&&t.classList.remove(e.animationName)});let jt=e=>{let t=document.createElement("span");t.className="pkb-ring",e.appendChild(t),t.addEventListener("animationend",()=>t.remove())},ge=e=>{if(!et)return;let t=navigator.userActivation;if(!(t&&!t.hasBeenActive))try{navigator.vibrate?.(e)}catch{}},Be=(e,t,r,o,p=0,i)=>{let d=document.createElement("div");d.className="pkb-float pkb-"+o,d.textContent=e,d.style.left=t+"px",d.style.top=r+"px",p&&(d.style.animationDelay=p+"ms"),i&&(d.style.color=i),_.appendChild(d),d.addEventListener("animationend",()=>d.remove())},lt=(e,t,r)=>Math.max(0,Math.min(1,(e-t)/r)),ct=e=>1-Math.pow(1-e,3),$e=0;function Ne(){cancelAnimationFrame($e);let e=ue,t=O,r=performance.now(),o=p=>{if(C)return;let i=lt(p,r,450);ue=Math.round(e+(t-e)*ct(i)),f("sc").textContent=ue.toLocaleString(),i<1&&($e=requestAnimationFrame(o))};o(r),I||R(f("sp"),"pkb-bump")}let bt=(e,t,r,o="pt")=>{Be(`+${e}`,t,r,o),Ne()};function je(e,t,r,o,p,i=!1){let d=performance.now(),S=be,F=0,G=j=>{if(C||S!==be)return;let le=lt(j,d,o);e.textContent=p(Math.round(t+(r-t)*ct(le))),i&&le<1&&j-F>55&&(A.tick(),F=j),le<1?requestAnimationFrame(G):I||R(e,"pkb-bump")};G(d)}let dt=e=>({x:e.offsetLeft+e.offsetWidth/2,y:e.offsetTop+e.offsetHeight/2}),he=0;function De(e=[]){if(he){Ee.innerHTML="";return}Ee.setAttribute("viewBox",`0 0 ${we.clientWidth} ${we.clientHeight}`),Ee.innerHTML=B.map(t=>{let r=dt(K[c[t][0]]),o=dt(K[c[t][x-1]]),p=o.x-r.x,i=o.y-r.y,d=Math.hypot(p,i)||1,S=26*ve,F=p/d*S,G=i/d*S,j=`x1="${r.x-F}" y1="${r.y-G}" x2="${o.x+F}" y2="${o.y+G}" pathLength="1"`;return`<g${e.includes(t)?' class="pkb-draw"':""}><line class="pkb-u" ${j}/><line class="pkb-o" ${j}/></g>`}).join("")}function Dt(e,t){let r=Me(H[e]);if(!t){z=0,f("combo").classList.remove("pkb-on"),A.off(),ge(8);return}let o=performance.now();z=o-at<nn?z+1:1,at=o,ae=Math.max(ae,z),A.pop(z-1),I||(R(H[e],"pkb-squash"),jt(H[e])),oe(r.x,r.y,18,{speed:6,g:.2,life:30,size:.6,star:.5}),re.has(e)||(re.add(e),O+=10*z,bt(10*z,r.x,r.y-12)),z>=2&&(Be(g.comboPop(z),r.x,r.y+22,"cmb",90,$t[(z-2)%$t.length]),f("cmbN").textContent=g.combo(z),R(f("combo"),"pkb-on")),ge(18)}f("cbar").addEventListener("animationend",()=>{f("combo").classList.remove("pkb-on"),z=0});function Ht(e){e.forEach(t=>{let r=Me(H[t]);Be(g.reachPop,r.x,r.y-34,"rch",150)}),N(()=>A.reach(),150)}function Gt(e,t){let r=e.length,o=[...new Set(e.flatMap(i=>c[i]))].map(i=>K[i]),p=Math.min(70,300/o.length);o.forEach((i,d)=>N(()=>{pt(i,0);let S=Me(i);oe(S.x,S.y,14,{speed:5,g:.15,life:30,size:.7,star:.8}),A.note(d+3)},d*p)),N(()=>{f("bT").textContent=r>=3?g.bannerTriple:r===2?g.bannerDouble:g.bannerSingle,f("bS").textContent=r>1?g.bannerMulti(r):g.bannerNth(B.length),R(f("banner"),"pkb-show"),I||(R(f("flash"),"pkb-go"),R(_,"pkb-punch"));let i=Me(we);oe(i.x,i.y,r>1?180:110,{speed:r>1?16:13,star:.3}),A.bingo(r),ge(r>1?[40,60,40,60,90]:[40,60,40]),t&&N(()=>bt(t,i.x,i.y+105,"big"),350)},o.length*p+60)}function _t(e){let t=Ie?0:1e3;Ie=!0,O+=t,K.forEach((o,p)=>pt(o,ee(p)*180/Math.max(1,x-1))),A.perfect(),I||R(f("flash"),"pkb-go"),f("pbody").textContent=Ot(g,b),f("sScore").textContent="0",f("sCombo").textContent="\xD70",f("sBingo").textContent="0",N(()=>{R(U,"pkb-show"),f("close").focus({preventScroll:!0}),N(()=>{I||R(_,"pkb-shake"),A.boom(),oe(0,X,90,{angle:-Math.PI/3,spread:.8,speed:22,g:.32,star:.3}),oe(V,X,90,{angle:-Math.PI*2/3,spread:.8,speed:22,g:.32,star:.3}),It(3500),ge([60,80,60,80,200]),t&&Be(g.perfectBonus(t),V/2,X*.16,"big"),je(f("sScore"),0,O,1300,o=>o.toLocaleString(),!0),je(f("sCombo"),0,ae,700,o=>"\xD7"+o),je(f("sBingo"),0,B.length,700,String),Ne()},720),[1300,1650,2e3,2350,2700].forEach(o=>N(()=>qt(V*(.15+Math.random()*.7),X*(.12+Math.random()*.3)),o)),N(()=>Rt(3e3),1500)},520);let r={score:O,maxCombo:ae};e.push(()=>a.onPerfect?.(r))}function He(){be++,ne.forEach(e=>clearTimeout(e)),ne.clear(),cancelAnimationFrame($e),ue=O,f("sc").textContent=O.toLocaleString()}function Kt(){W=[],cancelAnimationFrame(Q),Q=0,L?.clearRect(0,0,fe.width,fe.height),_.querySelectorAll(".pkb-float, .pkb-ring").forEach(e=>e.remove()),f("banner").classList.remove("pkb-show"),f("flash").classList.remove("pkb-go"),f("combo").classList.remove("pkb-on"),U.classList.remove("pkb-show")}let Ge=()=>E.flatMap((e,t)=>e.every(r=>w[r])?[t]:[]);function Ce(e,t){let r=[],o=w,p=o.filter(Boolean).length;B=Ge();let i=B.filter(y=>!me.has(y));[...me].some(y=>!B.includes(y))&&(He(),p<b&&U.classList.remove("pkb-show"));let d=new Set(B.flatMap(y=>c[y])),S=new Set;for(let y of E){let Y=y.filter(Wt=>!o[Wt]);Y.length===1&&S.add(Y[0])}H.forEach((y,Y)=>{y.classList.toggle("pkb-on",o[Y]),y.classList.toggle("pkb-line",d.has(s.itemCell[M[Y]])),y.classList.toggle("pkb-reach",S.has(Y))}),Pt?.classList.toggle("pkb-line",d.has(s.center)),_.classList.toggle("pkb-all",p===b),tt.classList.toggle("pkb-gold",p===b),tt.textContent=p===b?g.perfectTag:g.tag,f("cnt").textContent=`${p}/${b}`,f("bng").textContent=String(B.length);let F=f("bp");B.length>nt&&(F.classList.remove("pkb-hot"),F.offsetWidth),F.classList.toggle("pkb-hot",B.length>0),nt=B.length,De(i),e!==null&&Dt(e,o[e]);let G=i.map(y=>Oe(E[y])).filter(y=>!J.has(y));G.forEach(y=>J.add(y));let j=100*G.length*G.length;if(O+=j,t)j&&Ne();else if(p===b&&!Se)_t(r);else if(i.length){Gt(i,j);let y={newLines:i,totalLines:B.length,score:O};r.push(()=>a.onBingo?.(y))}else if(e!==null&&o[e]){let y=[...S].filter(Y=>!Pe.has(Y));y.length&&Ht(y)}me=new Set(B),Pe=S,Se=p===b;let le=[...S].map(y=>m[y].label);return f("msg").textContent=p===b?g.statusDone:le.length?g.statusReach(le):B.length?g.statusLines(B.length,b-p):g.statusStart(b-p),r}let ft=e=>{for(let t of e){if(C)return;t()}},mt=()=>{te&&Qe(te,JSON.stringify(w))};function ut(e,t,r){w=e,Le.forEach((p,i)=>p.checked=w[i]);let o=Ce(t,r);return mt(),o}function _e(e){He(),Kt(),w=e,Le.forEach((r,o)=>r.checked=w[o]),re.clear(),J.clear(),w.forEach((r,o)=>r&&re.add(o));let t=Ge();t.forEach(r=>J.add(Oe(E[r]))),me=new Set(t),Pe=new Set,Se=w.every(Boolean),Ie=Se,O=ue=re.size*10+J.size*100,z=0,ae=0,f("sc").textContent=O.toLocaleString(),Ce(null,!0),mt()}function ie(e,t,r={}){if(At){Le.forEach((p,i)=>p.checked=w[i]),a.onChange?.(e.slice());return}let o=[];r.reset?_e(e):o=ut(e,t,!!r.quiet),a.onChange?.(w.slice()),ft(o)}function kt(e){u=e,u.forEach((r,o)=>{M[r]=o,K[s.itemCell[o]]=H[r]}),E=s.lines.map(r=>r.map(o=>u[o]));let t=document.activeElement;K.forEach((r,o)=>{r.style.setProperty("--pkb-gd",Tt(o,x)),de.appendChild(r)}),t instanceof HTMLElement&&de.contains(t)&&document.activeElement!==t&&t.focus({preventScroll:!0})}let Ut=()=>{ye&&Qe(ye,JSON.stringify(u))},xe=[];function gt(e){w.every(Boolean)||He();let t=I?null:H.map(o=>o.getBoundingClientRect());xe.forEach(o=>o.cancel()),xe=[],kt(e),E.forEach(o=>{o.every(p=>re.has(p))&&J.add(Oe(o))});let r=Ge();r.forEach(o=>J.add(Oe(E[o]))),me=new Set(r),Ce(null,!0),Ut(),!(!t||typeof Element.prototype.animate!="function")&&(H.forEach((o,p)=>{let i=t[p],d=o.getBoundingClientRect(),S=i.left-d.left,F=i.top-d.top;Math.abs(S)+Math.abs(F)<1||xe.push(o.animate([{transform:`translate(${S}px,${F}px)`},{transform:"none"}],{duration:zt-140,delay:Math.random()*140,easing:"cubic-bezier(.3,1.25,.5,1)",fill:"backwards"}))}),clearTimeout(he),he=window.setTimeout(()=>{he=0,xe=[],C||De(B)},zt),Ee.innerHTML="")}function ht(){let e=u.slice();do for(let t=b-1;t>0;t--){let r=Math.floor(Math.random()*(t+1));[e[t],e[r]]=[e[r],e[t]]}while(e.every((t,r)=>t===u[r]));gt(e),A.shuffle(),ge([10,40,10,40,10,40,24])}let Ke=()=>{v(u)||gt(k())};if(de.addEventListener("change",e=>{let t=Le.indexOf(e.target);if(t<0)return;let r=w.slice();r[t]=!r[t],ie(r,t)}),n.querySelector('[data-r="shuf"]')?.addEventListener("click",ht),f("reset").addEventListener("click",()=>{Ke(),ie(l(void 0),null,{reset:!0})}),f("close").addEventListener("click",()=>U.classList.remove("pkb-show")),U.addEventListener("click",e=>{e.target===U&&U.classList.remove("pkb-show")}),Ae){let e=!1,t=()=>{w.every(Boolean)?ie(l(void 0),null,{reset:!0}):U.classList.remove("pkb-show")},r=async o=>{if(!e){e=!0;try{t();let p=be;for(let i of o){if(await Ft(i.delay),C||p!==be)return;let d=w.slice();d[i.i]=!0,ie(d,i.i,{quiet:i.quiet})}}finally{e=!1}}};f("dB").addEventListener("click",()=>{let o=()=>E.map(i=>i.filter(d=>!w[d])).filter(i=>i.length).sort((i,d)=>i.length-d.length)[0]??[],p=w.every(Boolean)?[...E[0]]:o();r(p.map(i=>({i,delay:320})))}),f("dP").addEventListener("click",()=>{let o=m.map((i,d)=>d),p=w.every(Boolean)?o:o.filter(i=>!w[i]);r(p.map((i,d)=>d<p.length-1?{i,delay:170,quiet:!0}:{i,delay:450}))}),f("dR").addEventListener("click",()=>{e||(Ke(),ie(P(),null,{reset:!0}))})}let se=null;if(ye)try{let e=JSON.parse(Ze(ye)??"null");$(e)&&(se=e)}catch{}!se&&$(a.defaultOrder)&&(se=a.defaultOrder.slice()),se&&!v(se)&&kt(se);let pe=null;if(te)try{let e=JSON.parse(Ze(te)??"null");Array.isArray(e)&&(pe=l(e))}catch{}!pe&&a.defaultChecked&&(pe=l(a.defaultChecked)),!pe&&Ae&&(pe=P()),it(),_e(pe??l(void 0));let Ue=typeof ResizeObserver=="function"?new ResizeObserver(()=>{it(),De()}):null;return Ue?.observe(_),Ue?.observe(we),{setChecked(e,t={}){if(C)return;let r=l(e),o=r.flatMap((p,i)=>p!==w[i]?[i]:[]);if(o.length){if(!t.animate||o.length!==1){_e(r);return}ft(ut(r,o[0],!1))}},reset(){C||(Ke(),ie(l(void 0),null,{reset:!0}))},shuffle(){C||ht()},refresh(){C||Ce(null,!0)},getState(){return{checked:w.slice(),lines:B.slice(),score:O,maxCombo:ae,complete:w.every(Boolean),size:x,free:s.free,order:u.slice()}},destroy(){C||(C=!0,ne.forEach(e=>clearTimeout(e)),ne.clear(),clearTimeout(he),xe.forEach(e=>e.cancel()),cancelAnimationFrame(Q),cancelAnimationFrame($e),Ue?.disconnect(),A.close(),n.innerHTML="")}}}return Qt(pn);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "packing-bingo",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "A school-trip packing checklist that plays like bingo, as a React component (or plain JS): combos, fanfares and fireworks.",
5
5
  "license": "MIT",
6
6
  "author": "Jin-hiroo",