PageSourceSearch

https://playsolitaire.io/_astro/whats-new-state.By1VfmkN.js

js playsolitaire.io collected 2026-10-02 06:43:25 UTC 4,321 bytes, 2 lines download raw bytes

1/*! @preserve Third-party software notices: /legal/THIRD_PARTY_NOTICES.txt; asset licenses: /legal/ASSET_LICENSES.txt; CycloneDX SBOM: /legal/sbom.cdx.json */
2import{STORAGE_KEYS as e}from"./constants.ClziSW2j.js";import{readLocal as t,writeLocal as n}from"./browser-state-gateway.C2b19Lbh.js";import{hasStartedDailyV2 as r,readDailyRecordV2 as i}from"./daily.BPwvHgHk.js";import{localeList as a}from"./config.ZXD9wyks.js";import{getLocalePath as o}from"./i18n.DDSf8M06.js";var s=[{id:`daily-competition`,date:`2026-08-25`,enTitle:`Compete in the Daily Challenge`,enBody:`Play the same daily deal as everyone else, compare Best Time and Fewest Moves on the Top 50 leaderboards, and review the standings from your win screen.`,cta:{kind:`daily`,enLabel:`Play today's Daily`}},{id:`rules-every-game`,date:`2026-08-23`,enTitle:`Rules without leaving the game`,enBody:`Open game-specific rules and keyboard shortcuts without leaving your deal, with a side-by-side desktop view and a reader that pauses the game on smaller screens.`},{id:`card-size-10-levels`,date:`2026-08-08`,enTitle:`Choose your card size`,enBody:`On desktop and tablet, use the new 10-step card-size slider below the board or in Settings to resize cards without restarting your game.`},{id:`optional-accounts`,date:`2026-08-05`,enTitle:`Keep your progress across devices`,enBody:`Keep playing as a guest, or create a free optional account to carry current games, statistics, Daily progress, preferences and recent games between devices.`,cta:{kind:`account`,enLabel:`Open account`}},{id:`klondike-draw-2`,date:`2026-08-02`,enTitle:`Try Draw 2 Solitaire`,enBody:`Solitaire now includes Draw 2 alongside Draw 1 and Draw 3, with its own saved game and unlimited stock recycling.`,cta:{kind:`settings`,enLabel:`Choose draw mode`}},{id:`klondike-verified-deals`,date:`2026-07-23`,enTitle:`Pick your Solitaire challenge`,enBody:`Draw 1 and Draw 3 offer six verified levels from Easy through Grandmaster, plus Any Winnable and Random.`,cta:{kind:`klondike-deals`,enLabel:`Change deal`}},{id:`spider-verified-deals`,date:`2026-07-22`,enTitle:`Pick your Spider challenge`,enBody:`Choose 1, 2 or 4 suits, then select any available verified level from Easy through Grandmaster — or play Random.`,cta:{kind:`spider-deals`,enLabel:`Pick a deal`}},{id:`custom-themes`,date:`2026-07-13`,enTitle:`Make the table yours`,enBody:`Build a custom theme with seven color pickers for the table, cards and HUD — one tap resets to classic felt.`,cta:{kind:`settings`,enLabel:`Open themes`}},{id:`daily-duels`,date:`2026-07-08`,enTitle:`Challenge a friend`,enBody:`Finish today's Daily Challenge, then send the same deal to a friend and see who solves it faster.`,cta:{kind:`daily`,enLabel:`Play today's Daily`}},{id:`smart-hints`,date:`2026-07-05`,enTitle:`Smarter hints`,enBody:`When a winning line is known, hints follow it — tap Hint or press H.`}],c=s[0].id,l=s[0].date,u=3,d=30;function f(e){return e.toISOString().slice(0,10)}function p(){try{let n=t(e.WHATS_NEW);if(!n)return null;let r=JSON.parse(n);if(typeof r!=`object`||!r)return null;let i=r.seen,a=r.dotDays;return{seen:typeof i==`string`?i:null,dotDays:Array.isArray(a)?a.filter(e=>typeof e==`string`):[]}}catch{return null}}function m(t){n(e.WHATS_NEW,JSON.stringify(t))}function h(){m({seen:c,dotDays:[]})}function g(e){let t=e.headId??c,n=e.headDate??l,r=e.state;if(r?.seen===t||e.now.getTime()-new Date(`${n}T00:00:00Z`).getTime()>d*864e5)return{show:!1,nextState:null};if(!r&&!e.returningProfile)return{show:!1,nextState:{seen:t,dotDays:[]}};let i=f(e.now),a=(r?.dotDays??[]).filter(e=>e!==i);return a.length>=u?{show:!1,nextState:{seen:t,dotDays:[]}}:e.hasDailyRecord&&!e.startedDailyToday?{show:!1,nextState:null}:{show:!0,nextState:{seen:r?.seen??null,dotDays:[...a,i]}}}function _(){return!!(t(e.STATS_LIFETIME)||t(e.DAILY))}async function v(e){if(typeof window>`u`)return!1;let t=!1,n=!1;try{let[a,o]=await Promise.all([i(),r(e.getTime())]);t=a!==null,n=o}catch{}let a=g({now:e,state:p(),returningProfile:_(),hasDailyRecord:t,startedDailyToday:n});return a.nextState&&m(a.nextState),a.show}function y(e){let t=(e??(typeof window<`u`?window.location.pathname:`/`)).split(`/`)[1]??``;return o(`/whats-new`,a.includes(t)?t:`en`)}export{v as evaluateWhatsNewDot,h as stampWhatsNewSeen,y as whatsNewHref};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.