Added a workflow to let the agent automatically deploy frontend onto the esp32.

This commit is contained in:
Patedam committed 2026-03-08 15:19:17 -04:00
1 parent 9388bf17af
commit 56acf92f75
10 files changed
+240 -2

No files matched your search

@@ -0,0 +1,21 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Calendink Provider</title>
<script type="module">const kr=!1;var en=Array.isArray,Jn=Array.prototype.indexOf,Rt=Array.prototype.includes,pr=Array.from,Zn=Object.defineProperty,Nt=Object.getOwnPropertyDescriptor,Xn=Object.getOwnPropertyDescriptors,Qn=Object.prototype,ea=Array.prototype,tn=Object.getPrototypeOf,Hr=Object.isExtensible;const ta=()=>{};function ra(e){for(var t=0;t<e.length;t++)e[t]()}function rn(){var e,t,r=new Promise((n,a)=>{e=n,t=a});return{promise:r,resolve:e,reject:t}}function na(e,t){if(Array.isArray(e))return e;if(!(Symbol.iterator in e))return Array.from(e);const r=[];for(const n of e)if(r.push(n),r.length===t)break;return r}const ce=2,nr=4,tr=8,nn=1<<24,xt=16,Ye=32,Ot=64,Tr=128,Le=512,fe=1024,ve=2048,We=4096,Me=8192,nt=16384,qt=32768,Ut=65536,qr=1<<17,aa=1<<18,Vt=1<<19,sa=1<<20,rt=1<<25,It=65536,Er=1<<21,Fr=1<<22,ht=1<<23,ur=Symbol("$state"),ia=Symbol("legacy props"),oa=Symbol(""),Et=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"};function la(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function fa(e,t,r){throw new Error("https://svelte.dev/e/each_key_duplicate")}function ua(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function da(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function ca(e){throw new Error("https://svelte.dev/e/effect_orphan")}function va(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function pa(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function _a(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function ha(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function ba(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function ma(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const ga=1,xa=2,an=4,ya=8,wa=16,ka=1,Ta=4,Ea=8,Sa=16,$a=1,Aa=2,de=Symbol(),sn="http://www.w3.org/1999/xhtml";function Ca(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function on(e){return e===this.v}function Da(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function ln(e){return!Da(e,this.v)}let Ia=!1,Be=null;function Lt(e){Be=e}function Wt(e,t=!1,r){Be={p:Be,i:!1,c:null,e:null,s:e,x:null,l:null}}function Yt(e){var t=Be,r=t.e;if(r!==null){t.e=null;for(var n of r)Cn(n)}return t.i=!0,Be=t.p,{}}function fn(){return!0}let St=[];function un(){var e=St;St=[],ra(e)}function at(e){if(St.length===0&&!Qt){var t=St;queueMicrotask(()=>{t===St&&un()})}St.push(e)}function Ma(){for(;St.length>0;)un()}function dn(e){var t=U;if(t===null)return P.f|=ht,e;if((t.f&qt)===0&&(t.f&nr)===0)throw e;ct(e,t)}function ct(e,t){for(;t!==null;){if((t.f&Tr)!==0){if((t.f&qt)===0)throw e;try{t.b.error(e);return}catch(r){e=r}}t=t.parent}throw e}const Oa=-7169;function re(e,t){e.f=e.f&Oa|t}function Nr(e){(e.f&Le)!==0||e.deps===null?re(e,fe):re(e,We)}function cn(e){if(e!==null)for(const t of e)(t.f&ce)===0||(t.f&It)===0||(t.f^=It,cn(t.deps))}function vn(e,t,r){(e.f&ve)!==0?t.add(e):(e.f&We)!==0&&r.add(e),cn(e.deps),re(e,fe)}const or=new Set;let q=null,Sr=null,He=null,Te=[],_r=null,Qt=!1,jt=null;class bt{current=new Map;previous=new Map;#e=new Set;#o=new Set;#t=0;#i=0;#r=null;#s=new Set;#n=new Set;#a=new Map;is_fork=!1;#l=!1;#u(){return this.is_fork||this.#i>0}skip_effect(t){this.#a.has(t)||this.#a.set(t,{d:[],m:[]})}unskip_effect(t){var r=this.#a.get(t);if(r){this.#a.delete(t);for(var n of r.d)re(n,ve),qe(n);for(n of r.m)re(n,We),qe(n)}}process(t){Te=[],this.apply();var r=jt=[],n=[];for(const a of t)this.#f(a,r,n);if(jt=null,this.#u()){this.#d(n),this.#d(r);for(const[a,s]of this.#a)bn(a,s)}else{Sr=this,q=null;for(const a of this.#e)a(this);this.#e.clear(),this.#t===0&&this.#c(),Vr(n),Vr(r),this.#s.clear(),this.#n.clear(),Sr=null,this.#r?.resolve()}He=null}#f(t,r,n){t.f^=fe;for(var a=t.first;a!==null;){var s=a.f,l=(s&(Ye|Ot))!==0,u=l&&(s&fe)!==0,o=u||(s&Me)!==0||this.#a.has(a);if(!o&&a.fn!==null){l?a.f^=fe:(s&nr)!==0?r.push(a):sr(a)&&((s&xt)!==0&&this.#n.add(a),Ht(a));var f=a.first;if(f!==null){a=f;continue}}for(;a!==null;){var d=a.next;if(d!==null){a=d;break}a=a.parent}}}#d(t){for(var r=0;r<t.length;r+=1)vn(t[r],this.#s,this.#n)}capture(t,r){r!==de&&!this.previous.has(t)&&this.previous.set(t,r),(t.f&ht)===0&&(this.current.set(t,t.v),He?.set(t,t.v))}activate(){q=this,this.apply()}deactivate(){q===this&&(q=null,He=null)}flush(){if(Te.length>0)q=this,pn();else if(this.#t===0&&!this.is_fork){for(const t of this.#e)t(this);this.#e.clear(),this.#c(),this.#r?.resolve()}this.deactivate()}discard(){for(const t of this.#o)t(this);this.#o.clear()}#c(){if(or.size>1){this.previous.clear();var t=q,r=He,n=!0;for(const s of or){if(s===this){n=!1;continue}const l=[];for(const[o,f]of this.current){if(s.current.has(o))if(n&&f!==s.current.get(o))s.current.set(o,f);else continue;l.push(o)}if(l.length===0)continue;const u=[...s.current.keys()].filter(o=>!this.current.has(o));Line truncated
${i(b)?"border-accent bg-accent/5":"border-border hover:border-border-hover bg-bg-primary/20"}
${i(n)==="uploading"?"opacity-50 pointer-events-none":""}`),Or(Q,"accept",i(d)==="bundle"?".bundle":".bin"),O(K,i(d)==="frontend"?"🎨":"⚙️")}),Dt("dragover",B,H=>{H.preventDefault(),c(b,!0)}),Dt("dragleave",B,()=>c(b,!1)),Dt("drop",B,g),z("change",Q,x),y(be,X)};N(ot,be=>{i(n)==="success"?be(Oe):be(Pt,!1)})}R(be=>{O(ie,`OTA Upgrade (${i(d)==="frontend"?"UI":"Firmware"})`),O(Ze,be)},[()=>i(I)()]),y(Y,M)};N(j,Y=>{i(f)&&Y(J)})}R(()=>{Se(Z,1,`text-[10px] font-bold uppercase tracking-tight px-2 py-1 rounded transition-colors
${i(f)&&i(d)==="frontend"?"bg-accent text-white":"bg-border text-text-secondary hover:text-text-primary"}`),Se(pe,1,`text-[10px] font-bold uppercase tracking-tight px-2 py-1 rounded transition-colors
${i(f)&&i(d)==="firmware"?"bg-accent text-white":"bg-border text-text-secondary hover:text-text-primary"}`),Se(we,1,`text-[10px] font-bold uppercase tracking-tight px-2 py-1 rounded transition-colors
${i(f)&&i(d)==="bundle"?"bg-accent text-white":"bg-border text-text-secondary hover:text-text-primary"}`),O(le,`Slot: ${i(l).active_partition??""} `),O(ae,i(u).firmware),O($,`Active: ${i(l).active_slot===0?"ota_0":"ota_1"}`)}),z("click",Z,()=>E("frontend")),z("click",pe,()=>E("firmware")),z("click",we,()=>E("bundle")),y(C,w)};N(V,C=>{C(te)})}y(e,L),Yt()}ir(["click","change"]);var ei=k('<span class="sidebar-title svelte-1nhzsi7">Menu</span>'),ti=k('<span class="nav-label svelte-1nhzsi7"> </span>'),ri=k('<button><span class="nav-icon svelte-1nhzsi7"> </span> <!></button>'),ni=k('<aside><div class="sidebar-header svelte-1nhzsi7"><!> <button><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" class="svelte-1nhzsi7"><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg></button></div> <nav class="sidebar-nav svelte-1nhzsi7"></nav></aside>');function ai(e,t){Wt(t,!0);let r=_t(t,"currentView",3,"dashboard"),n=_t(t,"onNavigate",3,()=>{}),a=_t(t,"isOpen",3,!1),s=_t(t,"onToggle",3,null),l=A(!1);zt(()=>{typeof window<"u"&&window.innerWidth<=1024&&window.innerWidth>768&&c(l,!0)});const u=[{id:"dashboard",label:"Dashboard",icon:"🏠"},{id:"tasks",label:"Tasks",icon:"📋"},{id:"users",label:"Users",icon:"👥"}];var o=ni(),f=v(o),d=v(f);{var b=g=>{var S=ei();y(g,S)};N(d,g=>{i(l)||g(b)})}var _=h(d,2),x=h(f,2);pt(x,21,()=>u,vt,(g,S)=>{var m=ri(),E=v(m),I=v(E),L=h(E,2);{var V=te=>{var C=ti(),w=v(C);R(()=>O(w,i(S).label)),y(te,C)};N(L,te=>{i(l)||te(V)})}R(()=>{Se(m,1,`nav-item ${r()===i(S).id?"active":""}`,"svelte-1nhzsi7"),Or(m,"title",i(S).label),O(I,i(S).icon)}),z("click",m,()=>n()(i(S).id)),y(g,m)}),R(()=>{Se(o,1,`sidebar ${i(l)?"collapsed":""} ${a()?"mobile-open":""}`,"svelte-1nhzsi7"),Se(_,1,`collapse-btn ${s()?"mobile-only":""}`,"svelte-1nhzsi7"),Or(_,"title",i(l)?"Expand":"Collapse")}),z("click",_,()=>s()?s()():c(l,!i(l))),y(e,o),Yt()}ir(["click"]);var si=k('<div role="button" tabindex="0"><span class="user-name"> </span></div>'),ii=k('<div class="user-bar svelte-mekxsd"><div class="user-chips svelte-mekxsd"></div></div>'),oi=k('<div class="modal-overlay svelte-mekxsd"><form class="add-user-modal svelte-mekxsd"><h3 class="text-lg font-semibold">Add User</h3> <input type="text" placeholder="Name..." class="modal-input svelte-mekxsd"/> <div class="modal-actions svelte-mekxsd"><button type="button" class="btn-secondary svelte-mekxsd">Cancel</button> <button type="submit" class="btn-primary svelte-mekxsd">Add User</button></div></form></div>'),li=k('<form class="edit-row svelte-mekxsd"><input type="text" class="edit-input svelte-mekxsd"/> <div class="edit-actions svelte-mekxsd"><button type="submit" class="save-btn svelte-mekxsd" title="Save">✓</button> <button type="button" class="cancel-btn svelte-mekxsd" title="Cancel">✕</button></div></form>'),fi=k('<button class="action-btn danger svelte-mekxsd">Delete!</button> <button class="action-btn svelte-mekxsd">Cancel</button>',1),ui=k('<button class="action-btn svelte-mekxsd" title="Delete">🗑️</button>'),di=k('<div class="user-info svelte-mekxsd"><span class="user-name-large svelte-mekxsd"> </span> <span class="user-id svelte-mekxsd"> </span></div> <div class="user-actions svelte-mekxsd"><button class="action-btn svelte-mekxsd" title="Rename">✏️</button> <!></div>',1),ci=k('<div class="user-item svelte-mekxsd"><!></div>'),vi=k('<div class="empty-state svelte-mekxsd">No users found. Create one to get started!</div>'),pi=k('<header class="manager-header svelte-mekxsd"><h1 class="text-xl font-bold text-text-primary">User Management</h1> <button class="add-user-btn-large svelte-mekxsd">+ New User</button></header> <!> <div class="user-list svelte-mekxsd"></div>',1),_i=k('<div class="user-error svelte-mekxsd"> </div>'),hi=k("<div><!> <!></div>");function Kn(e,t){Wt(t,!0);let r=_t(t,"selectedUserId",15,null),n=_t(t,"onUsersChanged",3,()=>{}),a=_t(t,"mode",3,"selector"),s=A(Ie([])),l=A(""),u=A(!1),o=A(""),f=A(null),d=A(null),b=A("");async function _(){try{c(s,await Fs(),!0),i(s).length>0&&!r()&&a()==="selector"&&r(i(s)[0].id),r()&&!i(s).find(w=>w.id===r())&&r(i(s).length>0?i(s)[0].id:null),c(o,"")}catch(w){c(o,w.message,!0)}}async function x(){if(i(l).trim())try{const w=await Ns(i(l).trim());c(l,""),c(u,!1),await _(),a()==="selector"&&r(w.id),n()()}catch(w){c(o,w.message,!0)}}async function g(w){try{await Rs(w),c(f,null),await _(),n()()}catch(F){c(o,F.message,!0)}}function S(w){c(d,w.id,!0),c(b,w.name,!0)}async function m(){if(i(b).trim())try{await Us(i(d),i(b).trim()),c(d,null),await _(),n()()}catch(w){c(o,w.message,!0)}}zt(()=>{_()});var E=hi(),I=v(E);{var L=w=>{var F=ii(),ue=v(F);pt(ue,21,()=>i(s),vt,(Z,pe)=>{var we=si(),Je=v(we),_e=v(Je);R(()=>{Se(we,1,`user-chip ${r()===i(pe).id?"selected":""}`,"svelte-mekxsd"),O(_e,i(pe).name)}),z("click",we,()=>r(i(pe).id)),z("keydown",we,T=>{T.key==="Enter"&&r(i(pe).id)}),y(Z,Line truncated
bg-danger/10 text-danger border border-danger/20
hover:bg-danger/20 hover:border-danger/30
disabled:opacity-40 disabled:cursor-not-allowed">Reboot</button></div></div> <!></div></div>`,1),Ki=k('<div class="bg-bg-card border border-border rounded-xl p-6 shadow-xl"><!></div>'),Gi=k('<div class="bg-bg-card border border-border rounded-xl p-8 shadow-xl"><!></div>'),Ji=k('<div class="fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4 backdrop-blur-sm"><div class="bg-bg-card border border-border rounded-xl p-6 max-w-sm w-full space-y-4 shadow-2xl"><h3 class="text-lg font-semibold text-text-primary">Confirm Reboot</h3> <p class="text-sm text-text-secondary">Are you sure you want to reboot the ESP32? The device will be temporarily unavailable.</p> <div class="flex gap-3 justify-end"><button class="px-4 py-2 text-sm rounded-lg bg-border/30 text-text-secondary hover:bg-border/50 transition-colors">Cancel</button> <button class="px-4 py-2 text-sm font-medium rounded-lg bg-danger text-white hover:bg-danger-hover transition-colors shadow-lg shadow-danger/20">Reboot Now</button></div></div></div>'),Zi=k('<div class="app-layout svelte-1n46o8q"><!> <!> <main class="main-content svelte-1n46o8q"><header class="mobile-header svelte-1n46o8q"><button class="hamburger svelte-1n46o8q"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-1n46o8q"><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg></button> <span class="mobile-title svelte-1n46o8q">Calendink</span> <div style="width: 40px;"></div></header> <div class="w-full max-w-6xl mx-auto space-y-8"><div class="text-center"><h1 class="text-2xl font-bold text-accent">Calendink Provider 📅📅🚀🚀⚡</h1> <p class="text-text-secondary text-sm"></p> <div class="flex justify-center mt-4"><!></div></div> <!> <!></div></main></div>');function Xi(e,t){Wt(t,!0);let r=A("loading"),n=A(""),a=A(!1),s=A(!1),l=A("dashboard"),u=A(!1),o=A(Ie({chip:"—",freeHeap:0,uptime:0,firmware:"—",connection:"—"})),f=A(Ie({partitions:[],active_partition:"—",running_firmware_label:"—"})),d=A(Ie({users:[]}));function b(p){const $=Math.floor(p/86400),j=Math.floor(p%86400/3600),J=Math.floor(p%3600/60),Y=p%60,M=[];return $>0&&M.push(`${$}d`),j>0&&M.push(`${j}h`),J>0&&M.push(`${J}m`),M.push(`${Y}s`),M.join(" ")}function _(p){return p>=1048576?`${(p/1048576).toFixed(1)} MB`:p>=1024?`${(p/1024).toFixed(1)} KB`:`${p} B`}function x(p){const $=Date.now()/1e3,j=p-$,J=Math.abs(j);if(J<3600){const M=Math.round(J/60);return j<0?`${M}m ago`:`in ${M}m`}if(J<86400){const M=Math.round(J/3600);return j<0?`${M}h ago`:`in ${M}h`}const Y=Math.round(J/86400);return j<0?`${Y}d ago`:`in ${Y}d`}function g(p){return p<Date.now()/1e3}async function S(){try{const[p,$,j]=await Promise.all([Pr(),Yn(),js().catch(()=>({users:[]}))]);c(o,p,!0),c(f,$,!0),c(d,j,!0),c(r,"ok"),c(n,"")}catch(p){i(s)||(c(r,"error"),c(n,p.message||"Connection failed",!0))}}async function m(){c(a,!1),c(r,"rebooting"),c(s,!0);try{await Is()}catch{}}zt(()=>{S();const p=setInterval(S,5e3);return()=>clearInterval(p)}),zt(()=>{if(i(s)){const p=setInterval(async()=>{try{await Pr()&&(console.log("Device back online! Refreshing UI..."),window.location.reload())}catch{console.log("Waiting for device...")}},2e3);return()=>clearInterval(p)}});const E=mn(()=>[{label:"Chip",value:i(o).chip,icon:"🔧"},{label:"Free Heap",value:_(i(o).freeHeap),icon:"💾"},{label:"Uptime",value:b(i(o).uptime),icon:"⏱️"},{label:"Firmware",value:i(o).firmware,icon:"📦"},{label:"Connection",value:i(o).connection,icon:"🌐"}]);var I=Zi(),L=v(I);ai(L,{get currentView(){return i(l)},get isOpen(){return i(u)},onNavigate:p=>{c(l,p,!0),c(u,!1)},onToggle:()=>c(u,!i(u))});var V=h(L,2);{var te=p=>{var $=Di();z("click",$,()=>c(u,!1)),y(p,$)};N(V,p=>{i(u)&&p(te)})}var C=h(V,2),w=v(C),F=v(w),ue=h(w,2),Z=v(ue),pe=h(v(Z),2);pe.textContent="ESP32-S3 System Dashboard v0.1.16";var we=h(pe,2),Je=v(we);{var _e=p=>{var $=Ii();y(p,$)},T=p=>{var $=Mi();y(p,$)},D=p=>{var $=Oi();y(p,$)},W=p=>{var $=Pi(),j=h(v($),2),J=v(j);R(()=>O(J,`Offline — ${i(n)??""}`)),y(p,$)};N(Je,p=>{i(r)==="loading"?p(_e):i(r)==="ok"?p(T,1):i(r)==="rebooting"?p(D,2):p(W,!1)})}var le=h(Z,2);{var ge=p=>{var $=Yi(),j=Ue($);{var J=X=>{var B=Li(),Q=h(v(B),2);pt(Q,21,()=>i(d).users,vt,(Pe,K)=>{var Xe=Ui(),Qe=v(Xe),lt=v(Qe),Ke=h(Qe,2);{var kt=Fe=>{var xe=Fi();y(Fe,xe)},Tt=Fe=>{var xe=Ri();pt(xe,21,()=>i(K).tasks,vt,(H,ee)=>{var me=Ni(),et=v(me),Kt=v(et),Ft=h(et,2),Gt=v(Ft);R((mr,gr)=>{Se(et,1,`text-[10px] mt-0.5 ${mr??""} font-mono whitespace-nowrap`),O(Kt,gr),O(Gt,i(ee).title)},[()=>g(i(ee).due_date)?"text-danger":"text-text-secondary",()=>x(i(ee).due_date)]),y(H,me)}),y(Fe,xe)};N(Ke,Fe=>{i(K).tasks.length===0?Fe(kt):Fe(Tt,!1)})}R(()=>O(lt,i(K).name)),y(Pe,Xe)}),y(X,B)};N(j,X=>{i(d).users.length>0&&X(J)})}var Y=h(j,2),M=v(Y),se=v(M),ke=h(v(se),2);pt(ke,21,()=>i(E),vt,(X,B)=>{var Q=Bi(),Pe=v(Q),K=v(Pe),Xe=v(K),Qe=h(K,2),lt=v(Qe),Ke=hLine truncated
<style rel="stylesheet" crossorigin>@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-xl:36rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-tight:1.25;--radius-lg:.5rem;--radius-xl:.75rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg-primary:#0f172a;--color-bg-card:#1e293b;--color-bg-card-hover:#263548;--color-text-primary:#f1f5f9;--color-text-secondary:#94a3b8;--color-accent:#38bdf8;--color-border:#334155;--color-success:#22c55e;--color-danger:#ef4444;--color-danger-hover:#f87171}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacityLine truncated
</head>
<body>
<div id="app"></div>
</body>
</html>