felt/frontend/build/_app/immutable/nodes/0.C1R4dMGA.js
Mikkel Georgsen 7f91301efa feat(01-13): layout shell with header, tabs, FAB, toast, data table
- Persistent header: clock countdown, level, blinds, player count (red pulse <10s, PAUSED/BREAK badges)
- Bottom tab bar (mobile): Overview, Players, Tables, Financials, More with 48px touch targets
- Desktop sidebar (>=768px): vertical nav replacing bottom tabs
- FAB: expandable quick actions (Bust, Buy In, Rebuy, Add-On, Pause/Resume) with backdrop
- Toast notification system: success/info/warning/error with auto-dismiss and stacking
- DataTable: sortable columns, sticky header, search/filter, mobile swipe actions, skeleton loading
- Multi-tournament tabs: horizontal scrollable selector when 2+ tournaments active
- Loading components: spinner (sm/md/lg), skeleton rows, full-page overlay
- Root layout: auth guard, responsive shell (mobile bottom tabs / desktop sidebar)
- Route pages: overview, players, tables, financials, more with placeholder content

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 04:13:17 +01:00

1 line
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var da=u=>{throw TypeError(u)};var xa=(u,a,e)=>a.has(u)||da("Cannot "+e);var C=(u,a,e)=>(xa(u,a,"read from private field"),e?e.call(u):a.get(u)),sa=(u,a,e)=>a.has(u)?da("Cannot add the same private member more than once"):a instanceof WeakSet?a.add(u):a.set(u,e);import{a as f,f as m,c as la}from"../chunks/Q5CB4WY5.js";import{o as ka}from"../chunks/nIaoZoCo.js";import{T as ya,V as wa,p as W,c,r as i,a as j,f as V,g as s,s as h,aR as Ta,t as O,i as ba,a0 as Aa,b as ra,d as U,e as ha,x as Fa}from"../chunks/C4An0dnW.js";import{B as Ba,i as E}from"../chunks/D__6P984.js";import{a as fa}from"../chunks/D3f6eoxz.js";import{g as Ia}from"../chunks/DQNCp18R.js";import{p as oa}from"../chunks/DyXP65qD.js";import{i as H}from"../chunks/BViIIwgj.js";import{s as y,d as ca,e as Pa,a as z}from"../chunks/CQQh_IlD.js";import{a as D,e as aa,s as N,i as na}from"../chunks/BeLKMLqR.js";import{t as B}from"../chunks/C5aWxL5p.js";import{s as va}from"../chunks/BTkWS7xQ.js";function pa(u,a,...e){var d=new Ba(u);ya(()=>{const o=a()??null;d.ensure(o,o&&(b=>o(b,...e)))},wa)}const Sa=!0,Ma=!1,we=Object.freeze(Object.defineProperty({__proto__:null,prerender:Sa,ssr:Ma},Symbol.toStringTag,{value:"Module"}));var $a=m('<span class="status-badge paused-badge svelte-1elxaub">PAUSED</span>'),Ea=m('<span class="status-badge break-badge svelte-1elxaub">BREAK</span>'),Na=m('<span class="blinds ante-value hide-mobile svelte-1elxaub"> </span>'),Ra=m('<div><!> <span class="timer clock-time svelte-1elxaub"> </span></div> <div class="header-level svelte-1elxaub"><span class="level-number svelte-1elxaub"> </span> <span class="level-name hide-mobile svelte-1elxaub"> </span></div> <div class="header-blinds svelte-1elxaub"><span class="blinds-label hide-mobile svelte-1elxaub">Blinds</span> <span class="blinds blinds-value svelte-1elxaub"> </span> <!></div> <div class="header-players svelte-1elxaub"><span class="number player-count svelte-1elxaub"> </span> <span class="player-label hide-mobile svelte-1elxaub">remaining</span></div>',1),qa=m('<div class="header-empty svelte-1elxaub"><span class="brand svelte-1elxaub">Felt</span> <span class="no-data svelte-1elxaub">No active tournament</span></div>'),Oa=m('<header class="header svelte-1elxaub"><div class="header-inner svelte-1elxaub"><!></div></header>');function La(u,a){W(a,!1);function e(n){n<0&&(n=0);const t=Math.floor(n/60),v=n%60;return`${String(t).padStart(2,"0")}:${String(v).padStart(2,"0")}`}function d(n,t){return`${n.toLocaleString()}/${t.toLocaleString()}`}H();var o=Oa(),b=c(o),l=c(b);{var r=n=>{const t=ba(()=>B.clock),v=ba(()=>s(t).remaining_seconds<=10&&!s(t).is_break&&!s(t).is_paused);var _=Ra(),g=V(_);let k;var x=c(g);{var I=F=>{var $=$a();f(F,$)},S=F=>{var $=Ea();f(F,$)};E(x,F=>{s(t).is_paused?F(I):s(t).is_break&&F(S,1)})}var T=h(x,2),M=c(T,!0);i(T),i(g);var K=h(g,2),w=c(K),A=c(w);i(w);var R=h(w,2),L=c(R,!0);i(R),i(K);var G=h(K,2),P=h(c(G),2),J=c(P,!0);i(P);var ia=h(P,2);{var ea=F=>{var $=Na(),_a=c($);i($),O(ga=>y(_a,`Ante ${ga??""}`),[()=>s(t).ante.toLocaleString()]),f(F,$)};E(ia,F=>{s(t).ante>0&&F(ea)})}i(G);var ta=h(G,2),ua=c(ta),ma=c(ua);i(ua),Ta(2),i(ta),O((F,$)=>{k=D(g,1,"header-clock svelte-1elxaub",null,k,{urgent:s(v),paused:s(t).is_paused,"on-break":s(t).is_break}),y(M,F),y(A,`L${s(t).level??""}`),y(L,s(t).name),y(J,$),y(ma,`${B.remainingPlayers??""}/${B.totalPlayers??""}`)},[()=>e(s(t).remaining_seconds),()=>d(s(t).small_blind,s(t).big_blind)]),f(n,_)},p=n=>{var t=qa();f(n,t)};E(l,n=>{B.clock?n(r):n(p,!1)})}i(b),i(o),f(u,o),j()}var Ca=m('<a role="tab"><span class="tab-icon svelte-1pn9dat" aria-hidden="true"> </span> <span class="tab-label svelte-1pn9dat"> </span></a>'),Ua=m('<div class="bottom-tabs svelte-1pn9dat" role="tablist" aria-label="Main navigation"></div>');function Da(u,a){W(a,!1);const e=[{label:"Overview",href:"/overview",icon:"🏠"},{label:"Players",href:"/players",icon:"👥"},{label:"Tables",href:"/tables",icon:"🪑"},{label:"Financials",href:"/financials",icon:"💰"},{label:"More",href:"/more",icon:"⚙"}];function d(b){var r;const l=((r=oa.url)==null?void 0:r.pathname)??"/";return b==="/overview"?l==="/"||l==="/overview"||l.startsWith("/overview/"):l===b||l.startsWith(b+"/")}H();var o=Ua();aa(o,5,()=>e,na,(b,l)=>{var r=Ca();let p;var n=c(r),t=c(n,!0);i(n);var v=h(n,2),_=c(v,!0);i(v),i(r),O((g,k)=>{N(r,"href",s(l).href),p=D(r,1,"tab-item svelte-1pn9dat",null,p,g),N(r,"aria-selected",k),N(r,"aria-label",s(l).label),y(t,s(l).icon),y(_,s(l).label)},[()=>({active:d(s(l).href)}),()=>d(s(l).href)]),f(b,r)}),i(o),f(u,o),j()}var Wa=m('<li><a><span class="nav-icon svelte-129hoe0" aria-hidden="true"> </span> <span class="nav-label svelte-129hoe0"> </span></a></li>'),ja=m('<nav class="sidebar svelte-129hoe0" aria-label="Main navigation"><div class="sidebar-brand svelte-129hoe0"><span class="brand-name svelte-129hoe0">Felt</span></div> <ul class="sidebar-nav svelte-129hoe0" role="list"></ul></nav>');function Ka(u,a){W(a,!1);const e=[{label:"Overview",href:"/overview",icon:"🏠"},{label:"Players",href:"/players",icon:"👥"},{label:"Tables",href:"/tables",icon:"🪑"},{label:"Financials",href:"/financials",icon:"💰"},{label:"More",href:"/more",icon:"⚙"}];function d(l){var p;const r=((p=oa.url)==null?void 0:p.pathname)??"/";return l==="/overview"?r==="/"||r==="/overview"||r.startsWith("/overview/"):r===l||r.startsWith(l+"/")}H();var o=ja(),b=h(c(o),2);aa(b,5,()=>e,na,(l,r)=>{var p=Wa(),n=c(p);let t;var v=c(n),_=c(v,!0);i(v);var g=h(v,2),k=c(g,!0);i(g),i(n),i(p),O((x,I)=>{N(n,"href",s(r).href),t=D(n,1,"nav-item svelte-129hoe0",null,t,x),N(n,"aria-current",I),y(_,s(r).icon),y(k,s(r).label)},[()=>({active:d(s(r).href)}),()=>d(s(r).href)?"page":void 0]),f(l,p)}),i(b),i(o),f(u,o),j()}var za=m('<div class="fab-backdrop svelte-6hll69" role="presentation"></div>'),Va=m('<button class="fab-action touch-target svelte-6hll69"><span class="fab-action-icon svelte-6hll69" aria-hidden="true"> </span> <span class="fab-action-label svelte-6hll69"> </span></button>'),Ga=m('<div class="fab-actions svelte-6hll69"></div>'),Ja=m('<!> <div><!> <button><span class="fab-icon svelte-6hll69" aria-hidden="true"> </span></button></div>',1);function Qa(u,a){var M,K;W(a,!0);let e=ra(!1);const d=[{id:"bust",label:"Bust",icon:"❌",color:"var(--color-error)",visible:()=>B.remainingPlayers>0},{id:"buyin",label:"Buy In",icon:"",color:"var(--color-success)",visible:()=>!0},{id:"rebuy",label:"Rebuy",icon:"🔄",color:"var(--color-primary)",visible:()=>B.remainingPlayers>0},{id:"addon",label:"Add-On",icon:"⬆",color:"var(--color-warning)",visible:()=>B.clock!==null},{id:"pause-resume",label:(M=B.clock)!=null&&M.is_paused?"Resume":"Pause",icon:(K=B.clock)!=null&&K.is_paused?"▶":"⏸",color:"var(--ctp-peach)",visible:()=>B.clock!==null}];function o(){U(e,!s(e))}function b(w){var A;U(e,!1),(A=a.onaction)==null||A.call(a,w)}function l(){U(e,!1)}function r(w){w.key==="Escape"&&s(e)&&U(e,!1)}var p=Ja();Pa("keydown",Aa,r);var n=V(p);{var t=w=>{var A=za();z("click",A,l),z("keydown",A,R=>R.key==="Enter"&&l()),f(w,A)};E(n,w=>{s(e)&&w(t)})}var v=h(n,2);let _;var g=c(v);{var k=w=>{var A=Ga();aa(A,21,()=>d.filter(R=>R.visible()),na,(R,L,G)=>{var P=Va(),J=c(P),ia=c(J,!0);i(J);var ea=h(J,2),ta=c(ea,!0);i(ea),i(P),O(()=>{va(P,`--action-color: ${s(L).color??""}; --action-delay: ${G*40}ms`),N(P,"aria-label",s(L).label),y(ia,s(L).icon),y(ta,s(L).label)}),z("click",P,()=>b(s(L).id)),f(R,P)}),i(A),f(w,A)};E(g,w=>{s(e)&&w(k)})}var x=h(g,2);let I;var S=c(x),T=c(S,!0);i(S),i(x),i(v),O(()=>{_=D(v,1,"fab-container svelte-6hll69",null,_,{expanded:s(e)}),I=D(x,1,"fab-main touch-target svelte-6hll69",null,I,{expanded:s(e)}),N(x,"aria-label",s(e)?"Close actions":"Open quick actions"),N(x,"aria-expanded",s(e)),y(T,s(e)?"✕":"+")}),z("click",x,o),f(u,p),j()}ca(["click","keydown"]);const Xa={success:3e3,info:4e3,warning:5e3,error:8e3};let Ya=0;var X;class Za{constructor(){sa(this,X,ra(ha([])))}get toasts(){return s(C(this,X))}set toasts(a){U(C(this,X),a,!0)}success(a,e){return this.add("success",a,e)}info(a,e){return this.add("info",a,e)}warning(a,e){return this.add("warning",a,e)}error(a,e){return this.add("error",a,e)}dismiss(a){const e=this.toasts.find(d=>d.id===a);e!=null&&e.timer&&clearTimeout(e.timer),this.toasts=this.toasts.filter(d=>d.id!==a)}dismissAll(){for(const a of this.toasts)a.timer&&clearTimeout(a.timer);this.toasts=[]}add(a,e,d){const o=`toast-${++Ya}`,b=d??Xa[a],l={id:o,type:a,message:e,duration:b,dismissible:a==="error"};return l.timer=setTimeout(()=>{this.dismiss(o)},b),this.toasts=[...this.toasts,l],o}}X=new WeakMap;const q=new Za;var Ha=m('<button class="toast-dismiss svelte-1cpok13" aria-label="Dismiss notification">&times;</button>'),ae=m('<div role="alert"><span class="toast-icon svelte-1cpok13" aria-hidden="true"> </span> <span class="toast-message svelte-1cpok13"> </span> <!></div>'),ee=m('<div class="toast-container svelte-1cpok13" role="region" aria-label="Notifications" aria-live="polite"></div>');function te(u,a){W(a,!1);function e(r){switch(r){case"success":return"var(--color-success)";case"info":return"var(--color-primary)";case"warning":return"var(--color-warning)";case"error":return"var(--color-error)";default:return"var(--color-text)"}}function d(r){switch(r){case"success":return"✓";case"info":return"";case"warning":return"⚠";case"error":return"✗";default:return""}}H();var o=la(),b=V(o);{var l=r=>{var p=ee();aa(p,5,()=>q.toasts,n=>n.id,(n,t)=>{var v=ae(),_=c(v),g=c(_,!0);i(_);var k=h(_,2),x=c(k,!0);i(k);var I=h(k,2);{var S=T=>{var M=Ha();z("click",M,()=>q.dismiss(s(t).id)),f(T,M)};E(I,T=>{s(t).dismissible&&T(S)})}i(v),O((T,M)=>{D(v,1,`toast toast-${s(t).type??""}`,"svelte-1cpok13"),va(v,`--toast-color: ${T??""}`),y(g,M),y(x,s(t).message)},[()=>e(s(t).type),()=>d(s(t).type)]),f(n,v)}),i(p),f(r,p)};E(b,r=>{q.toasts.length>0&&r(l)})}f(u,o),j()}ca(["click"]);var Y,Z;class se{constructor(){sa(this,Y,ra(ha([])));sa(this,Z,ra(null))}get tournaments(){return s(C(this,Y))}set tournaments(a){U(C(this,Y),a,!0)}get activeId(){return s(C(this,Z))}set activeId(a){U(C(this,Z),a,!0)}get isMulti(){return this.tournaments.length>=2}get activeTournament(){return this.tournaments.find(a=>a.id===this.activeId)??null}setTournaments(a){this.tournaments=a,a.length===0?this.activeId=null:a.length===1?this.activeId=a[0].id:(!this.activeId||!a.find(e=>e.id===this.activeId))&&(this.activeId=a[0].id)}switchTo(a){this.tournaments.find(e=>e.id===a)&&(this.activeId=a,B.id=a)}routeMessage(a){const e=a.tournament_id;if(a.type==="tournament.status"&&e){const d=a.data,o=this.tournaments.find(b=>b.id===e);o&&(d.name&&(o.name=d.name),d.status&&(o.status=d.status))}(!e||e===this.activeId)&&B.handleMessage(a)}reset(){this.tournaments=[],this.activeId=null}}Y=new WeakMap,Z=new WeakMap;const Q=new se;var re=m('<button role="tab"><span class="status-dot svelte-ldvvqt" aria-hidden="true"></span> <span class="tab-name svelte-ldvvqt"> </span></button>'),ne=m('<div class="tournament-tabs svelte-ldvvqt" role="tablist" aria-label="Tournament selection"></div>');function ie(u,a){W(a,!1);function e(l){switch(l){case"active":return"var(--color-success)";case"paused":return"var(--ctp-peach)";case"break":return"var(--color-break)";case"completed":return"var(--color-text-muted)";default:return"var(--color-text-secondary)"}}H();var d=la(),o=V(d);{var b=l=>{var r=ne();aa(r,5,()=>Q.tournaments,na,(p,n)=>{var t=re();let v;var _=c(t),g=h(_,2),k=c(g,!0);i(g),i(t),O(x=>{v=D(t,1,"tournament-tab touch-target svelte-ldvvqt",null,v,{active:s(n).id===Q.activeId}),N(t,"aria-selected",s(n).id===Q.activeId),va(_,`background-color: ${x??""}`),y(k,s(n).name)},[()=>e(s(n).status)]),z("click",t,()=>Q.switchTo(s(n).id)),f(p,t)}),i(r),f(l,r)};E(o,l=>{Q.isMulti&&l(b)})}f(u,d),j()}ca(["click"]);var le=m('<div class="app-shell svelte-12qhfyh"><!> <!> <!> <main class="main-content svelte-12qhfyh"><!></main> <!> <!></div>'),oe=m('<div class="redirect-screen svelte-12qhfyh"><p>Redirecting to login...</p></div>'),ce=m("<!> <!>",1);function Te(u,a){W(a,!0);let e=Fa(()=>{var t;return(((t=oa.url)==null?void 0:t.pathname)??"")==="/login"});ka(()=>{!fa.isAuthenticated&&!s(e)&&Ia("/login")});function d(t){switch(t){case"bust":q.info("Bust flow: coming in Plan N");break;case"buyin":q.info("Buy-in flow: coming in Plan N");break;case"rebuy":q.info("Rebuy flow: coming in Plan N");break;case"addon":q.info("Add-on flow: coming in Plan N");break;case"pause-resume":q.info("Pause/Resume: coming in Plan N");break;default:console.warn(`Unknown FAB action: ${t}`)}}var o=ce(),b=V(o);{var l=t=>{var v=la(),_=V(v);pa(_,()=>a.children),f(t,v)},r=t=>{var v=le(),_=c(v);La(_,{});var g=h(_,2);Ka(g,{});var k=h(g,2);ie(k,{});var x=h(k,2),I=c(x);pa(I,()=>a.children),i(x);var S=h(x,2);Da(S,{});var T=h(S,2);Qa(T,{onaction:d}),i(v),f(t,v)},p=t=>{var v=oe();f(t,v)};E(b,t=>{s(e)?t(l):fa.isAuthenticated?t(r,1):t(p,!1)})}var n=h(b,2);te(n,{}),f(u,o),j()}export{Te as component,we as universal};