From 2b4fd5dee8d496fc67e5dd8f6f6826cacad63d5e Mon Sep 17 00:00:00 2001 From: Vadym Samoilenko Date: Wed, 6 May 2026 20:08:44 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20premium=20redesign=20=E2=80=94=20cyan/t?= =?UTF-8?q?eal=20design=20system=20+=20bug=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design: - Replace purple SaaS theme with operational dark navy (#0b1020) + cyan (#57c7ff) - Satoshi + JetBrains Mono fonts via CSS @import - KpiCard: hero variant for Total Hours, tabular-nums for all values - Sidebar: cyan active state instead of amber, dimmer inactive icons - Dashboard: skeleton loading states for all charts, polished empty states - TopBar: cyan user avatar consistent with sidebar Fixes: - Live Feed: SSE URL was /api/events/stream (wrong) → /api/events; pass JWT as ?token= query param - Dashboard: default preset changed to 'today' instead of '30d' - index.html: Cache-Control: no-cache to prevent stale asset issues Co-Authored-By: Claude Sonnet 4.6 --- src/main.py | 7 +- ...View-CJ79dSWf.js => AdminView-BMl1f4sR.js} | 2 +- src/static/assets/AppLayout-BrbiIY_d.js | 1 + src/static/assets/AppLayout-DXx1REXd.js | 1 - ...e_type_script_setup_true_lang-BV0smx_q.js} | 2 +- ...e_type_script_setup_true_lang-mCZU1D3b.js} | 2 +- ...w-DQ2Hqx4H.js => CalendarView-SX7Koh5E.js} | 2 +- ...e_type_script_setup_true_lang-B1uPgvNK.js} | 2 +- ...e_type_script_setup_true_lang-Twj0MqtU.js} | 2 +- src/static/assets/DashboardView-C9SpkquZ.js | 1 + src/static/assets/DashboardView-CQAK2qP6.js | 1 - ...e_type_script_setup_true_lang-BF-ub_3g.js} | 2 +- ...e_type_script_setup_true_lang-CBtApgd6.js} | 2 +- ...sView-BzDjpAPG.js => KeysView-BJjLTbGZ.js} | 2 +- src/static/assets/LiveView-4Mk1DKtX.js | 1 - src/static/assets/LiveView-BsPW_Vxj.js | 1 + ...View-C8KUpWjz.js => LoginView-BTX9oEgY.js} | 2 +- ...ew-D1tzk_DZ.js => PlannerView-CskuH3RG.js} | 2 +- ...e_type_script_setup_true_lang-o01-BFVV.js} | 2 +- ...n-onp.js => ProjectDetailView-BJap0IQ0.js} | 2 +- ...w-CmpkpAqw.js => ProjectsView-CZF7uexl.js} | 2 +- ...ew-RRBaLOSo.js => ReportsView-EBcs_rl2.js} | 2 +- ...w-451r_a8J.js => SettingsView-CDMmQA_8.js} | 2 +- ...e_type_script_setup_true_lang-DBxohyhw.js} | 2 +- .../{admin-s3id3yDK.js => admin-CT_XX4Td.js} | 2 +- ...oard-4_z0ZWLj.js => dashboard-DFJs0AgU.js} | 2 +- ...{devops-D_lPg6L8.js => devops-Dn5wUB1p.js} | 2 +- .../{index-CO3lBHVT.js => index-B9hhyP-T.js} | 4 +- src/static/assets/index-jWLq2uh_.css | 1 + src/static/assets/index-vw6q8aQU.css | 1 - .../{utils-B1YxgOQw.js => utils-DuVQys2y.js} | 2 +- src/static/index.html | 4 +- web/src/components/dashboard/KpiCard.vue | 92 +++++----- web/src/components/shared/Sidebar.vue | 54 +++--- web/src/components/shared/TopBar.vue | 2 +- web/src/styles/globals.css | 135 ++++++++++----- web/src/views/DashboardView.vue | 161 +++++++++++------- web/src/views/LiveView.vue | 6 +- 38 files changed, 300 insertions(+), 215 deletions(-) rename src/static/assets/{AdminView-CJ79dSWf.js => AdminView-BMl1f4sR.js} (88%) create mode 100644 src/static/assets/AppLayout-BrbiIY_d.js delete mode 100644 src/static/assets/AppLayout-DXx1REXd.js rename src/static/assets/{Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js => Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js} (83%) rename src/static/assets/{Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js => Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js} (91%) rename src/static/assets/{CalendarView-DQ2Hqx4H.js => CalendarView-SX7Koh5E.js} (98%) rename src/static/assets/{CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js => CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js} (73%) rename src/static/assets/{CardTitle.vue_vue_type_script_setup_true_lang-CpgNrOxB.js => CardTitle.vue_vue_type_script_setup_true_lang-Twj0MqtU.js} (75%) create mode 100644 src/static/assets/DashboardView-C9SpkquZ.js delete mode 100644 src/static/assets/DashboardView-CQAK2qP6.js rename src/static/assets/{Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js => Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js} (90%) rename src/static/assets/{Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js => Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js} (89%) rename src/static/assets/{KeysView-BzDjpAPG.js => KeysView-BJjLTbGZ.js} (89%) delete mode 100644 src/static/assets/LiveView-4Mk1DKtX.js create mode 100644 src/static/assets/LiveView-BsPW_Vxj.js rename src/static/assets/{LoginView-C8KUpWjz.js => LoginView-BTX9oEgY.js} (87%) rename src/static/assets/{PlannerView-D1tzk_DZ.js => PlannerView-CskuH3RG.js} (93%) rename src/static/assets/{Progress.vue_vue_type_script_setup_true_lang-C9HXKxSB.js => Progress.vue_vue_type_script_setup_true_lang-o01-BFVV.js} (81%) rename src/static/assets/{ProjectDetailView-CJKn-onp.js => ProjectDetailView-BJap0IQ0.js} (94%) rename src/static/assets/{ProjectsView-CmpkpAqw.js => ProjectsView-CZF7uexl.js} (89%) rename src/static/assets/{ReportsView-RRBaLOSo.js => ReportsView-EBcs_rl2.js} (99%) rename src/static/assets/{SettingsView-451r_a8J.js => SettingsView-CDMmQA_8.js} (93%) rename src/static/assets/{TaskForm.vue_vue_type_script_setup_true_lang-CUKCWjzn.js => TaskForm.vue_vue_type_script_setup_true_lang-DBxohyhw.js} (95%) rename src/static/assets/{admin-s3id3yDK.js => admin-CT_XX4Td.js} (68%) rename src/static/assets/{dashboard-4_z0ZWLj.js => dashboard-DFJs0AgU.js} (88%) rename src/static/assets/{devops-D_lPg6L8.js => devops-Dn5wUB1p.js} (94%) rename src/static/assets/{index-CO3lBHVT.js => index-B9hhyP-T.js} (99%) create mode 100644 src/static/assets/index-jWLq2uh_.css delete mode 100644 src/static/assets/index-vw6q8aQU.css rename src/static/assets/{utils-B1YxgOQw.js => utils-DuVQys2y.js} (99%) diff --git a/src/main.py b/src/main.py index e6de185..96ef2cb 100644 --- a/src/main.py +++ b/src/main.py @@ -104,10 +104,13 @@ async def health(): app.mount("/static", StaticFiles(directory="src/static"), name="static") +_NO_CACHE = {"Cache-Control": "no-cache, no-store, must-revalidate"} + + @app.get("/", include_in_schema=False) @app.get("", include_in_schema=False) async def spa_root(): - return FileResponse("src/static/index.html") + return FileResponse("src/static/index.html", headers=_NO_CACHE) @app.get("/{path:path}", include_in_schema=False) @@ -116,4 +119,4 @@ async def spa_fallback(path: str, request: Request): from fastapi import HTTPException raise HTTPException(status_code=404) - return FileResponse("src/static/index.html") + return FileResponse("src/static/index.html", headers=_NO_CACHE) diff --git a/src/static/assets/AdminView-CJ79dSWf.js b/src/static/assets/AdminView-BMl1f4sR.js similarity index 88% rename from src/static/assets/AdminView-CJ79dSWf.js rename to src/static/assets/AdminView-BMl1f4sR.js index b9edb7b..f8220dd 100644 --- a/src/static/assets/AdminView-CJ79dSWf.js +++ b/src/static/assets/AdminView-BMl1f4sR.js @@ -1 +1 @@ -import{d as p,u as y,x as h,c as r,a as t,e as n,n as v,w as d,f as b,r as u,o as s,F as g,l as k,t as a,k as m,i as A}from"./index-CO3lBHVT.js";import{a as w}from"./admin-s3id3yDK.js";import{_ as B,a as S}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import{_ as x}from"./Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js";import{_ as V,a as $}from"./utils-B1YxgOQw.js";const N={class:"p-6"},C={key:0,class:"flex items-center justify-center h-20"},D={class:"w-full"},E={class:"px-4 py-3"},F={class:"text-sm font-medium text-foreground"},R={class:"px-4 py-3 text-sm text-muted-foreground"},U={class:"px-4 py-3"},j={class:"px-4 py-3"},I={class:"px-4 py-3 text-xs text-muted-foreground"},G=p({__name:"AdminView",setup(J){const f=y(),_=b(),i=u([]),l=u(!1);return h(async()=>{if(!f.isAdmin){_.push("/");return}l.value=!0;try{const c=await w.users();i.value=c.data}finally{l.value=!1}}),(c,o)=>(s(),r("div",N,[o[1]||(o[1]=t("h2",{class:"text-lg font-semibold text-foreground mb-6"},"Admin — Users",-1)),l.value?(s(),r("div",C,[n(V,{class:"text-primary"})])):(s(),v(B,{key:1},{default:d(()=>[n(S,{class:"p-0"},{default:d(()=>[t("table",D,[o[0]||(o[0]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"User"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Email"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Role"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Status"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Joined")])],-1)),t("tbody",null,[(s(!0),r(g,null,k(i.value,e=>(s(),r("tr",{key:e.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",E,[t("p",F,a(e.username),1)]),t("td",R,a(e.email),1),t("td",U,[n(x,{variant:e.role==="admin"?"default":"secondary",class:"text-xs"},{default:d(()=>[m(a(e.role),1)]),_:2},1032,["variant"])]),t("td",j,[n(x,{variant:e.is_active?"success":"outline",class:"text-xs"},{default:d(()=>[m(a(e.is_active?"Active":"Inactive"),1)]),_:2},1032,["variant"])]),t("td",I,a(A($)(e.created_at)),1)]))),128))])])]),_:1})]),_:1}))]))}});export{G as default}; +import{d as p,u as y,x as h,c as r,a as t,e as n,n as v,w as d,f as b,r as u,o as s,F as g,l as k,t as a,k as m,i as A}from"./index-B9hhyP-T.js";import{a as w}from"./admin-CT_XX4Td.js";import{_ as B,a as S}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import{_ as x}from"./Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js";import{_ as V,a as $}from"./utils-DuVQys2y.js";const N={class:"p-6"},C={key:0,class:"flex items-center justify-center h-20"},D={class:"w-full"},E={class:"px-4 py-3"},F={class:"text-sm font-medium text-foreground"},R={class:"px-4 py-3 text-sm text-muted-foreground"},U={class:"px-4 py-3"},j={class:"px-4 py-3"},I={class:"px-4 py-3 text-xs text-muted-foreground"},G=p({__name:"AdminView",setup(J){const f=y(),_=b(),i=u([]),l=u(!1);return h(async()=>{if(!f.isAdmin){_.push("/");return}l.value=!0;try{const c=await w.users();i.value=c.data}finally{l.value=!1}}),(c,o)=>(s(),r("div",N,[o[1]||(o[1]=t("h2",{class:"text-lg font-semibold text-foreground mb-6"},"Admin — Users",-1)),l.value?(s(),r("div",C,[n(V,{class:"text-primary"})])):(s(),v(B,{key:1},{default:d(()=>[n(S,{class:"p-0"},{default:d(()=>[t("table",D,[o[0]||(o[0]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"User"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Email"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Role"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Status"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Joined")])],-1)),t("tbody",null,[(s(!0),r(g,null,k(i.value,e=>(s(),r("tr",{key:e.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",E,[t("p",F,a(e.username),1)]),t("td",R,a(e.email),1),t("td",U,[n(x,{variant:e.role==="admin"?"default":"secondary",class:"text-xs"},{default:d(()=>[m(a(e.role),1)]),_:2},1032,["variant"])]),t("td",j,[n(x,{variant:e.is_active?"success":"outline",class:"text-xs"},{default:d(()=>[m(a(e.is_active?"Active":"Inactive"),1)]),_:2},1032,["variant"])]),t("td",I,a(A($)(e.created_at)),1)]))),128))])])]),_:1})]),_:1}))]))}});export{G as default}; diff --git a/src/static/assets/AppLayout-BrbiIY_d.js b/src/static/assets/AppLayout-BrbiIY_d.js new file mode 100644 index 0000000..916764a --- /dev/null +++ b/src/static/assets/AppLayout-BrbiIY_d.js @@ -0,0 +1 @@ +import{d as j,u as M,c as s,b as V,a as e,F as $,l as A,t as m,i as h,m as b,o as n,n as H,w as _,j as C,p as d,q as z,g as B,s as S,k as T,K as L,f as D,e as k,T as R,r as O}from"./index-B9hhyP-T.js";const P={class:"flex flex-col h-full bg-[hsl(220_44%_8%)] border-r border-border"},I={class:"flex-1 px-2 py-3 space-y-0.5 overflow-y-auto"},N={key:0,class:"absolute left-0 top-1/2 -translate-y-1/2 w-0.5 h-4 bg-primary rounded-r-full"},F={class:"text-sm"},K={class:"p-3 border-t border-border shrink-0"},q={class:"flex items-center gap-3 px-2 py-2 rounded-lg"},E={class:"h-7 w-7 rounded-full bg-primary/15 ring-1 ring-primary/20 flex items-center justify-center text-[10px] font-bold text-primary shrink-0"},U={class:"flex-1 min-w-0"},W={class:"text-xs font-medium text-foreground truncate"},G=j({__name:"Sidebar",emits:["close"],setup(y,{emit:g}){const a=B(),i=M(),v=g,u=[{name:"Dashboard",path:"/",icon:"grid"},{name:"Calendar",path:"/calendar",icon:"calendar"},{name:"Planner",path:"/planner",icon:"check-square"},{name:"Projects",path:"/projects",icon:"folder"},{name:"Live Feed",path:"/live",icon:"activity"},{name:"Reports",path:"/reports",icon:"file-text"},{name:"Keys",path:"/keys",icon:"key"},{name:"Settings",path:"/settings",icon:"settings"},{name:"Admin",path:"/admin",icon:"shield",adminOnly:!0}],f=b(()=>u.filter(c=>!c.adminOnly||i.isAdmin));function r(c){return c==="/"?a.path==="/":a.path.startsWith(c)}const l=b(()=>{var t,p;return(((t=i.user)==null?void 0:t.username)??((p=i.user)==null?void 0:p.email)??"?").slice(0,2).toUpperCase()});return(c,t)=>{var x,w;const p=z("RouterLink");return n(),s("aside",P,[t[11]||(t[11]=V('

CC Dashboard

Oliver Agency

',1)),e("nav",I,[(n(!0),s($,null,A(f.value,o=>(n(),H(p,{key:o.path,to:o.path,class:d(["relative flex items-center gap-3 px-3 h-10 rounded-lg text-sm font-medium transition-all duration-150 group",r(o.path)?"bg-primary/10 text-primary":"text-muted-foreground hover:bg-muted/50 hover:text-foreground"]),onClick:t[0]||(t[0]=se=>v("close"))},{default:_(()=>[r(o.path)?(n(),s("span",N)):C("",!0),o.icon==="grid"?(n(),s("svg",{key:1,class:d(["h-4 w-4 shrink-0 transition-colors",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[1]||(t[1]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"},null,-1)])],2)):o.icon==="calendar"?(n(),s("svg",{key:2,class:d(["h-4 w-4 shrink-0",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[2]||(t[2]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"},null,-1)])],2)):o.icon==="check-square"?(n(),s("svg",{key:3,class:d(["h-4 w-4 shrink-0",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[3]||(t[3]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"},null,-1)])],2)):o.icon==="folder"?(n(),s("svg",{key:4,class:d(["h-4 w-4 shrink-0",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 7a2 2 0 012-2h3.586a1 1 0 01.707.293l1.414 1.414A1 1 0 0011.414 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V7z"},null,-1)])],2)):o.icon==="activity"?(n(),s("svg",{key:5,class:d(["h-4 w-4 shrink-0",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[5]||(t[5]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"},null,-1)])],2)):o.icon==="file-text"?(n(),s("svg",{key:6,class:d(["h-4 w-4 shrink-0",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[6]||(t[6]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"},null,-1)])],2)):o.icon==="key"?(n(),s("svg",{key:7,class:d(["h-4 w-4 shrink-0",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[7]||(t[7]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"},null,-1)])],2)):o.icon==="settings"?(n(),s("svg",{key:8,class:d(["h-4 w-4 shrink-0",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[8]||(t[8]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"},null,-1),e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},null,-1)])],2)):o.icon==="shield"?(n(),s("svg",{key:9,class:d(["h-4 w-4 shrink-0",r(o.path)?"text-primary":"text-muted-foreground/60 group-hover:text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[9]||(t[9]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"},null,-1)])],2)):C("",!0),e("span",F,m(o.name),1)]),_:2},1032,["to","class"]))),128))]),e("div",K,[e("div",q,[e("div",E,m(l.value),1),e("div",U,[e("p",W,m(((x=h(i).user)==null?void 0:x.username)??((w=h(i).user)==null?void 0:w.email)),1),t[10]||(t[10]=e("div",{class:"flex items-center gap-1 mt-0.5"},[e("div",{class:"h-1.5 w-1.5 rounded-full bg-[hsl(var(--success))]"}),e("span",{class:"text-[10px] text-muted-foreground"},"Online")],-1))])])])])}}}),J={class:"h-14 border-b border-border bg-card/95 backdrop-blur-sm flex items-center px-4 gap-3 shrink-0 sticky top-0 z-10"},Q={class:"flex-1"},X={class:"text-sm font-semibold text-foreground"},Y={class:"flex items-center gap-2.5"},Z={class:"h-7 w-7 rounded-full bg-primary/15 ring-1 ring-primary/25 flex items-center justify-center text-[10px] font-bold text-primary shrink-0"},ee={class:"hidden sm:block text-xs font-medium text-foreground max-w-[120px] truncate"},te=j({__name:"TopBar",props:{title:{},sidebarOpen:{type:Boolean}},emits:["toggleSidebar","toggleDark"],setup(y,{emit:g}){const a=g,i=M(),v=D();async function u(){await i.logout(),L.success("Logged out"),v.push({name:"login"})}function f(){document.documentElement.classList.toggle("dark"),a("toggleDark")}return(r,l)=>{var c,t,p,x;return n(),s("header",J,[e("button",{class:"lg:hidden flex h-9 w-9 items-center justify-center rounded-lg text-muted-foreground hover:bg-muted hover:text-foreground transition-colors","aria-label":"Toggle sidebar",onClick:l[0]||(l[0]=w=>a("toggleSidebar"))},[...l[1]||(l[1]=[e("svg",{class:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 12h16M4 18h16"})],-1)])]),e("div",Q,[e("h1",X,m(y.title??"CC Dashboard"),1)]),S(r.$slots,"actions"),e("button",{class:"flex h-9 w-9 items-center justify-center rounded-lg text-muted-foreground hover:bg-muted hover:text-foreground transition-colors","aria-label":"Toggle dark mode",onClick:f},[...l[2]||(l[2]=[e("svg",{class:"h-4 w-4 hidden dark:block",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"})],-1),e("svg",{class:"h-4 w-4 dark:hidden",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"})],-1)])]),l[4]||(l[4]=e("div",{class:"h-6 w-px bg-border"},null,-1)),e("div",Y,[e("div",Z,m((((c=h(i).user)==null?void 0:c.username)??((t=h(i).user)==null?void 0:t.email)??"?").slice(0,2).toUpperCase()),1),e("span",ee,m(((p=h(i).user)==null?void 0:p.username)??((x=h(i).user)==null?void 0:x.email)),1),e("button",{class:"flex h-7 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground hover:bg-muted hover:text-foreground transition-colors",onClick:u},[...l[3]||(l[3]=[e("svg",{class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"})],-1),T(" Sign out ",-1)])])])])}}}),oe={class:"h-screen flex overflow-hidden bg-background"},re={class:"flex-1 flex flex-col overflow-hidden min-w-0"},ne={class:"flex-1 overflow-y-auto"},ie=j({__name:"AppLayout",setup(y){const g=B(),a=O(!1),i=b(()=>({dashboard:"Dashboard",calendar:"Calendar",planner:"Planner",projects:"Projects","project-detail":"Project Details",live:"Live Feed",reports:"AI Reports",keys:"API Keys",settings:"Settings",admin:"Admin"})[g.name]??"CC Dashboard");return(v,u)=>{const f=z("RouterView");return n(),s("div",oe,[k(R,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:_(()=>[a.value?(n(),s("div",{key:0,class:"fixed inset-0 z-20 bg-black/60 lg:hidden",onClick:u[0]||(u[0]=r=>a.value=!1)})):C("",!0)]),_:1}),e("div",{class:d(["fixed inset-y-0 left-0 z-30 w-60 transform transition-transform duration-300 lg:relative lg:translate-x-0",a.value?"translate-x-0":"-translate-x-full"])},[k(G,{onClose:u[1]||(u[1]=r=>a.value=!1)})],2),e("div",re,[k(te,{title:i.value,"sidebar-open":a.value,onToggleSidebar:u[2]||(u[2]=r=>a.value=!a.value)},null,8,["title","sidebar-open"]),e("main",ne,[k(f)])])])}}});export{ie as default}; diff --git a/src/static/assets/AppLayout-DXx1REXd.js b/src/static/assets/AppLayout-DXx1REXd.js deleted file mode 100644 index a8e727d..0000000 --- a/src/static/assets/AppLayout-DXx1REXd.js +++ /dev/null @@ -1 +0,0 @@ -import{d as j,u as M,c as n,b as V,a as e,F as $,l as A,t as v,i as p,m as y,o as r,n as H,w as _,j as C,p as d,q as z,g as B,s as S,k as T,K as L,f as D,e as f,T as R,r as O}from"./index-CO3lBHVT.js";const P={class:"flex flex-col h-full bg-gradient-to-b from-slate-900 via-slate-900 to-slate-950 border-r border-slate-800"},I={class:"flex-1 px-2 py-3 space-y-0.5 overflow-y-auto"},N={key:0,class:"absolute left-0 top-1/2 -translate-y-1/2 w-0.5 h-5 bg-amber-400 rounded-r-full"},F={class:"p-3 border-t border-slate-800 shrink-0"},K={class:"flex items-center gap-3 px-2 py-2 rounded-lg hover:bg-slate-800/50 transition-colors"},q={class:"h-7 w-7 rounded-full bg-gradient-to-br from-amber-400 to-amber-600 flex items-center justify-center text-[10px] font-bold text-white shrink-0"},E={class:"flex-1 min-w-0"},U={class:"text-xs font-medium text-slate-300 truncate"},W=j({__name:"Sidebar",emits:["close"],setup(b,{emit:m}){const a=B(),l=M(),x=m,u=[{name:"Dashboard",path:"/",icon:"grid"},{name:"Calendar",path:"/calendar",icon:"calendar"},{name:"Planner",path:"/planner",icon:"check-square"},{name:"Projects",path:"/projects",icon:"folder"},{name:"Live Feed",path:"/live",icon:"activity"},{name:"Reports",path:"/reports",icon:"file-text"},{name:"Keys",path:"/keys",icon:"key"},{name:"Settings",path:"/settings",icon:"settings"},{name:"Admin",path:"/admin",icon:"shield",adminOnly:!0}],k=y(()=>u.filter(c=>!c.adminOnly||l.isAdmin));function s(c){return c==="/"?a.path==="/":a.path.startsWith(c)}const i=y(()=>{var t,h;return(((t=l.user)==null?void 0:t.username)??((h=l.user)==null?void 0:h.email)??"?").slice(0,2).toUpperCase()});return(c,t)=>{var g,w;const h=z("RouterLink");return r(),n("aside",P,[t[11]||(t[11]=V('

CC Dashboard

Oliver Agency

',1)),e("nav",I,[(r(!0),n($,null,A(k.value,o=>(r(),H(h,{key:o.path,to:o.path,class:d(["relative flex items-center gap-3 px-3 h-11 rounded-lg text-sm font-medium transition-all duration-200 group",s(o.path)?"bg-gradient-to-r from-amber-500/20 to-amber-600/10 text-amber-400 shadow-sm border border-amber-500/20":"text-slate-400 hover:bg-slate-800/60 hover:text-slate-100"]),onClick:t[0]||(t[0]=re=>x("close"))},{default:_(()=>[s(o.path)?(r(),n("span",N)):C("",!0),o.icon==="grid"?(r(),n("svg",{key:1,class:d(["h-4 w-4 shrink-0 transition-colors",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[1]||(t[1]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"},null,-1)])],2)):o.icon==="calendar"?(r(),n("svg",{key:2,class:d(["h-4 w-4 shrink-0",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[2]||(t[2]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"},null,-1)])],2)):o.icon==="check-square"?(r(),n("svg",{key:3,class:d(["h-4 w-4 shrink-0",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[3]||(t[3]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"},null,-1)])],2)):o.icon==="folder"?(r(),n("svg",{key:4,class:d(["h-4 w-4 shrink-0",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 7a2 2 0 012-2h3.586a1 1 0 01.707.293l1.414 1.414A1 1 0 0011.414 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V7z"},null,-1)])],2)):o.icon==="activity"?(r(),n("svg",{key:5,class:d(["h-4 w-4 shrink-0",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[5]||(t[5]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"},null,-1)])],2)):o.icon==="file-text"?(r(),n("svg",{key:6,class:d(["h-4 w-4 shrink-0",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[6]||(t[6]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"},null,-1)])],2)):o.icon==="key"?(r(),n("svg",{key:7,class:d(["h-4 w-4 shrink-0",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[7]||(t[7]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"},null,-1)])],2)):o.icon==="settings"?(r(),n("svg",{key:8,class:d(["h-4 w-4 shrink-0",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[8]||(t[8]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"},null,-1),e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},null,-1)])],2)):o.icon==="shield"?(r(),n("svg",{key:9,class:d(["h-4 w-4 shrink-0",s(o.path)?"text-amber-400":"text-slate-500 group-hover:text-slate-300"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[9]||(t[9]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"},null,-1)])],2)):C("",!0),e("span",null,v(o.name),1)]),_:2},1032,["to","class"]))),128))]),e("div",F,[e("div",K,[e("div",q,v(i.value),1),e("div",E,[e("p",U,v(((g=p(l).user)==null?void 0:g.username)??((w=p(l).user)==null?void 0:w.email)),1),t[10]||(t[10]=e("div",{class:"flex items-center gap-1 mt-0.5"},[e("div",{class:"h-1.5 w-1.5 rounded-full bg-emerald-500"}),e("span",{class:"text-[10px] text-slate-500"},"Online")],-1))])])])])}}}),G={class:"h-14 border-b border-border bg-card/95 backdrop-blur-sm flex items-center px-4 gap-3 shrink-0 sticky top-0 z-10"},J={class:"flex-1"},Q={class:"text-sm font-semibold text-foreground"},X={class:"flex items-center gap-2.5"},Y={class:"h-7 w-7 rounded-full bg-gradient-to-br from-amber-400 to-amber-600 flex items-center justify-center text-[10px] font-bold text-white shrink-0"},Z={class:"hidden sm:block text-xs font-medium text-foreground max-w-[120px] truncate"},ee=j({__name:"TopBar",props:{title:{},sidebarOpen:{type:Boolean}},emits:["toggleSidebar","toggleDark"],setup(b,{emit:m}){const a=m,l=M(),x=D();async function u(){await l.logout(),L.success("Logged out"),x.push({name:"login"})}function k(){document.documentElement.classList.toggle("dark"),a("toggleDark")}return(s,i)=>{var c,t,h,g;return r(),n("header",G,[e("button",{class:"lg:hidden flex h-9 w-9 items-center justify-center rounded-lg text-muted-foreground hover:bg-muted hover:text-foreground transition-colors","aria-label":"Toggle sidebar",onClick:i[0]||(i[0]=w=>a("toggleSidebar"))},[...i[1]||(i[1]=[e("svg",{class:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 12h16M4 18h16"})],-1)])]),e("div",J,[e("h1",Q,v(b.title??"CC Dashboard"),1)]),S(s.$slots,"actions"),e("button",{class:"flex h-9 w-9 items-center justify-center rounded-lg text-muted-foreground hover:bg-muted hover:text-foreground transition-colors","aria-label":"Toggle dark mode",onClick:k},[...i[2]||(i[2]=[e("svg",{class:"h-4 w-4 hidden dark:block",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"})],-1),e("svg",{class:"h-4 w-4 dark:hidden",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"})],-1)])]),i[4]||(i[4]=e("div",{class:"h-6 w-px bg-border"},null,-1)),e("div",X,[e("div",Y,v((((c=p(l).user)==null?void 0:c.username)??((t=p(l).user)==null?void 0:t.email)??"?").slice(0,2).toUpperCase()),1),e("span",Z,v(((h=p(l).user)==null?void 0:h.username)??((g=p(l).user)==null?void 0:g.email)),1),e("button",{class:"flex h-7 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground hover:bg-muted hover:text-foreground transition-colors",onClick:u},[...i[3]||(i[3]=[e("svg",{class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"})],-1),T(" Sign out ",-1)])])])])}}}),te={class:"h-screen flex overflow-hidden bg-background"},oe={class:"flex-1 flex flex-col overflow-hidden min-w-0"},se={class:"flex-1 overflow-y-auto"},ae=j({__name:"AppLayout",setup(b){const m=B(),a=O(!1),l=y(()=>({dashboard:"Dashboard",calendar:"Calendar",planner:"Planner",projects:"Projects","project-detail":"Project Details",live:"Live Feed",reports:"AI Reports",keys:"API Keys",settings:"Settings",admin:"Admin"})[m.name]??"CC Dashboard");return(x,u)=>{const k=z("RouterView");return r(),n("div",te,[f(R,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:_(()=>[a.value?(r(),n("div",{key:0,class:"fixed inset-0 z-20 bg-black/60 lg:hidden",onClick:u[0]||(u[0]=s=>a.value=!1)})):C("",!0)]),_:1}),e("div",{class:d(["fixed inset-y-0 left-0 z-30 w-60 transform transition-transform duration-300 lg:relative lg:translate-x-0",a.value?"translate-x-0":"-translate-x-full"])},[f(W,{onClose:u[1]||(u[1]=s=>a.value=!1)})],2),e("div",oe,[f(ee,{title:l.value,"sidebar-open":a.value,onToggleSidebar:u[2]||(u[2]=s=>a.value=!a.value)},null,8,["title","sidebar-open"]),e("main",se,[f(k)])])])}}});export{ae as default}; diff --git a/src/static/assets/Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js b/src/static/assets/Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js similarity index 83% rename from src/static/assets/Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js rename to src/static/assets/Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js index 9394d89..7cf4a42 100644 --- a/src/static/assets/Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js +++ b/src/static/assets/Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js @@ -1 +1 @@ -import{c as a}from"./utils-B1YxgOQw.js";import{d as n,o as s,c as o,p as d,i,s as c}from"./index-CO3lBHVT.js";const f=n({__name:"Badge",props:{variant:{default:"default"},class:{}},setup(r){const e=r;return(t,l)=>(s(),o("span",{class:d(i(a)("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold transition-colors",{"bg-primary text-primary-foreground":e.variant==="default","bg-secondary text-secondary-foreground":e.variant==="secondary","bg-destructive text-destructive-foreground":e.variant==="destructive","border border-border text-foreground":e.variant==="outline","bg-emerald-500/20 text-emerald-400":e.variant==="success","bg-amber-500/20 text-amber-400":e.variant==="warning"},e.class))},[c(t.$slots,"default")],2))}});export{f as _}; +import{c as a}from"./utils-DuVQys2y.js";import{d as n,o as s,c as o,p as d,i,s as c}from"./index-B9hhyP-T.js";const f=n({__name:"Badge",props:{variant:{default:"default"},class:{}},setup(r){const e=r;return(t,l)=>(s(),o("span",{class:d(i(a)("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold transition-colors",{"bg-primary text-primary-foreground":e.variant==="default","bg-secondary text-secondary-foreground":e.variant==="secondary","bg-destructive text-destructive-foreground":e.variant==="destructive","border border-border text-foreground":e.variant==="outline","bg-emerald-500/20 text-emerald-400":e.variant==="success","bg-amber-500/20 text-amber-400":e.variant==="warning"},e.class))},[c(t.$slots,"default")],2))}});export{f as _}; diff --git a/src/static/assets/Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js b/src/static/assets/Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js similarity index 91% rename from src/static/assets/Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js rename to src/static/assets/Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js index 80217a7..cee37dc 100644 --- a/src/static/assets/Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js +++ b/src/static/assets/Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js @@ -1 +1 @@ -import{c,_ as l}from"./utils-B1YxgOQw.js";import{d as u,c as f,p as m,n as b,j as v,s as g,m as p,o as n}from"./index-CO3lBHVT.js";const y=["type","disabled"],k=u({__name:"Button",props:{variant:{default:"default"},size:{default:"md"},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},type:{default:"button"},class:{}},emits:["click"],setup(t,{emit:o}){const e=t,a=o,r=p(()=>c("inline-flex items-center justify-center rounded-md font-medium transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:pointer-events-none disabled:opacity-50",{"bg-primary text-primary-foreground hover:bg-primary/90":e.variant==="default","border border-input bg-background hover:bg-accent hover:text-accent-foreground":e.variant==="outline","hover:bg-accent hover:text-accent-foreground":e.variant==="ghost","bg-destructive text-destructive-foreground hover:bg-destructive/90":e.variant==="destructive","bg-secondary text-secondary-foreground hover:bg-secondary/80":e.variant==="secondary","underline-offset-4 hover:underline text-primary":e.variant==="link","h-8 px-3 text-xs":e.size==="sm","h-10 px-4 py-2 text-sm":e.size==="md","h-11 px-8 text-base":e.size==="lg","h-9 w-9 p-0":e.size==="icon"},e.class));return(i,s)=>(n(),f("button",{class:m(r.value),type:t.type,disabled:t.disabled||t.loading,onClick:s[0]||(s[0]=d=>a("click",d))},[t.loading?(n(),b(l,{key:0,size:"sm",class:"mr-2"})):v("",!0),g(i.$slots,"default")],10,y))}});export{k as _}; +import{c,_ as l}from"./utils-DuVQys2y.js";import{d as u,c as f,p as m,n as b,j as v,s as g,m as p,o as n}from"./index-B9hhyP-T.js";const y=["type","disabled"],k=u({__name:"Button",props:{variant:{default:"default"},size:{default:"md"},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},type:{default:"button"},class:{}},emits:["click"],setup(t,{emit:o}){const e=t,a=o,r=p(()=>c("inline-flex items-center justify-center rounded-md font-medium transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:pointer-events-none disabled:opacity-50",{"bg-primary text-primary-foreground hover:bg-primary/90":e.variant==="default","border border-input bg-background hover:bg-accent hover:text-accent-foreground":e.variant==="outline","hover:bg-accent hover:text-accent-foreground":e.variant==="ghost","bg-destructive text-destructive-foreground hover:bg-destructive/90":e.variant==="destructive","bg-secondary text-secondary-foreground hover:bg-secondary/80":e.variant==="secondary","underline-offset-4 hover:underline text-primary":e.variant==="link","h-8 px-3 text-xs":e.size==="sm","h-10 px-4 py-2 text-sm":e.size==="md","h-11 px-8 text-base":e.size==="lg","h-9 w-9 p-0":e.size==="icon"},e.class));return(i,s)=>(n(),f("button",{class:m(r.value),type:t.type,disabled:t.disabled||t.loading,onClick:s[0]||(s[0]=d=>a("click",d))},[t.loading?(n(),b(l,{key:0,size:"sm",class:"mr-2"})):v("",!0),g(i.$slots,"default")],10,y))}});export{k as _}; diff --git a/src/static/assets/CalendarView-DQ2Hqx4H.js b/src/static/assets/CalendarView-SX7Koh5E.js similarity index 98% rename from src/static/assets/CalendarView-DQ2Hqx4H.js rename to src/static/assets/CalendarView-SX7Koh5E.js index 268a4e0..e4b6f89 100644 --- a/src/static/assets/CalendarView-DQ2Hqx4H.js +++ b/src/static/assets/CalendarView-SX7Koh5E.js @@ -1 +1 @@ -import{B as Ee,r as S,m as W,d as G,o as w,c as v,a as f,e as E,w as Q,k as pe,t as M,i as y,j as T,p as q,A as j,h as De,_ as $e,F,l as B,n as Ye,x as _e,K as me}from"./index-CO3lBHVT.js";import{d as Fe}from"./dashboard-4_z0ZWLj.js";import{i as P,f as U}from"./utils-B1YxgOQw.js";import{_ as K}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import{u as se,_ as Be}from"./TaskForm.vue_vue_type_script_setup_true_lang-CUKCWjzn.js";import{_ as Ne}from"./Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js";import"./Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js";import"./Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js";import"./devops-D_lPg6L8.js";const Z=40/30;function Le(t){if(t.length===0)return[];const n=[...t].sort((o,c)=>new Date(o.start_at).getTime()-new Date(c.start_at).getTime()),e=[],r=[];for(const o of n){const c=new Date(o.start_at).getTime(),i=new Date(o.end_at).getTime();let l=-1;for(let d=0;d{const i=new Date(o.start_at).getTime(),l=new Date(o.end_at).getTime();let d=c;for(const u of r){const h=new Date(u.block.start_at).getTime(),m=new Date(u.block.end_at).getTime();hi&&u.lane>d&&(d=u.lane)}return{block:o,lane:c,totalLanes:d+1}})}function je(t,n=7){return((t.getHours()-n)*60+t.getMinutes())*Z}function He(t,n){const e=(n.getTime()-t.getTime())/6e4;return Math.max(e*Z,20)}function he(t){const n=t.getDay(),e=new Date(t);return e.setDate(t.getDate()-(n+6)%7),e.setHours(0,0,0,0),Array.from({length:7},(r,a)=>{const o=new Date(e);return o.setDate(e.getDate()+a),o})}function ge(t,n=15){return Math.round(t/n)*n}const J=Ee("calendar",()=>{const t=S([]),n=S(new Date),e=S("week"),r=S(!1),a=S(null),o=W(()=>he(n.value));async function c(s,_,x){r.value=!0,a.value=null;try{const b=await Fe.calendar({from:s,to:_,view:x});t.value=b.data}catch(b){const O=b;a.value=O.message??"Failed to fetch calendar"}finally{r.value=!1}}async function i(){if(e.value==="week"){const s=he(n.value),_=P(s[0]),x=P(s[6]);await c(_,x,"week")}else{const s=P(n.value);await c(s,s,"day")}}function l(){const s=new Date(n.value);e.value==="week"?s.setDate(s.getDate()-7):s.setDate(s.getDate()-1),n.value=s}function d(){const s=new Date(n.value);e.value==="week"?s.setDate(s.getDate()+7):s.setDate(s.getDate()+1),n.value=s}function u(){n.value=new Date}function h(s){e.value=s}function m(s){t.value.push(s)}function p(s){const _=t.value.findIndex(x=>x.id===s.id);_!==-1&&(t.value[_]=s)}function D(s){t.value=t.value.filter(_=>_.id!==s)}function g(s){const _=P(s);return t.value.filter(x=>P(new Date(x.start_at))===_)}return{blocks:t,currentDate:n,view:e,loading:r,error:a,weekDays:o,fetch:c,fetchCurrentView:i,navigatePrev:l,navigateNext:d,goToToday:u,setView:h,addBlock:m,updateBlock:p,removeBlock:D,getBlocksForDay:g}});function C(t){const n=Object.prototype.toString.call(t);return t instanceof Date||typeof t=="object"&&n==="[object Date]"?new t.constructor(+t):typeof t=="number"||n==="[object Number]"||typeof t=="string"||n==="[object String]"?new Date(t):new Date(NaN)}function z(t,n){return t instanceof Date?new t.constructor(n):new Date(n)}const Me=6048e5,qe=864e5;let ze={};function te(){return ze}function X(t,n){var i,l,d,u;const e=te(),r=(n==null?void 0:n.weekStartsOn)??((l=(i=n==null?void 0:n.locale)==null?void 0:i.options)==null?void 0:l.weekStartsOn)??e.weekStartsOn??((u=(d=e.locale)==null?void 0:d.options)==null?void 0:u.weekStartsOn)??0,a=C(t),o=a.getDay(),c=(o=a.getTime()?e+1:n.getTime()>=c.getTime()?e:e-1}function we(t){const n=C(t);return n.setHours(0,0,0,0),n}function ve(t){const n=C(t),e=new Date(Date.UTC(n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds(),n.getMilliseconds()));return e.setUTCFullYear(n.getFullYear()),+t-+e}function Re(t,n){const e=we(t),r=we(n),a=+e-ve(e),o=+r-ve(r);return Math.round((a-o)/qe)}function Ve(t){const n=Pe(t),e=z(t,0);return e.setFullYear(n,0,4),e.setHours(0,0,0,0),ee(e)}function Ae(t){return t instanceof Date||typeof t=="object"&&Object.prototype.toString.call(t)==="[object Date]"}function Ie(t){if(!Ae(t)&&typeof t!="number")return!1;const n=C(t);return!isNaN(Number(n))}function Qe(t){const n=C(t),e=z(t,0);return e.setFullYear(n.getFullYear(),0,1),e.setHours(0,0,0,0),e}const Xe={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},Ge=(t,n,e)=>{let r;const a=Xe[t];return typeof a=="string"?r=a:n===1?r=a.one:r=a.other.replace("{{count}}",n.toString()),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?"in "+r:r+" ago":r};function ae(t){return(n={})=>{const e=n.width?String(n.width):t.defaultWidth;return t.formats[e]||t.formats[t.defaultWidth]}}const Je={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Ue={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Ke={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Ze={date:ae({formats:Je,defaultWidth:"full"}),time:ae({formats:Ue,defaultWidth:"full"}),dateTime:ae({formats:Ke,defaultWidth:"full"})},et={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},tt=(t,n,e,r)=>et[t];function A(t){return(n,e)=>{const r=e!=null&&e.context?String(e.context):"standalone";let a;if(r==="formatting"&&t.formattingValues){const c=t.defaultFormattingWidth||t.defaultWidth,i=e!=null&&e.width?String(e.width):c;a=t.formattingValues[i]||t.formattingValues[c]}else{const c=t.defaultWidth,i=e!=null&&e.width?String(e.width):t.defaultWidth;a=t.values[i]||t.values[c]}const o=t.argumentCallback?t.argumentCallback(n):n;return a[o]}}const nt={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},rt={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},at={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},ot={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},st={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},it={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},ut=(t,n)=>{const e=Number(t),r=e%100;if(r>20||r<10)switch(r%10){case 1:return e+"st";case 2:return e+"nd";case 3:return e+"rd"}return e+"th"},ct={ordinalNumber:ut,era:A({values:nt,defaultWidth:"wide"}),quarter:A({values:rt,defaultWidth:"wide",argumentCallback:t=>t-1}),month:A({values:at,defaultWidth:"wide"}),day:A({values:ot,defaultWidth:"wide"}),dayPeriod:A({values:st,defaultWidth:"wide",formattingValues:it,defaultFormattingWidth:"wide"})};function I(t){return(n,e={})=>{const r=e.width,a=r&&t.matchPatterns[r]||t.matchPatterns[t.defaultMatchWidth],o=n.match(a);if(!o)return null;const c=o[0],i=r&&t.parsePatterns[r]||t.parsePatterns[t.defaultParseWidth],l=Array.isArray(i)?lt(i,h=>h.test(c)):dt(i,h=>h.test(c));let d;d=t.valueCallback?t.valueCallback(l):l,d=e.valueCallback?e.valueCallback(d):d;const u=n.slice(c.length);return{value:d,rest:u}}}function dt(t,n){for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e)&&n(t[e]))return e}function lt(t,n){for(let e=0;e{const r=n.match(t.matchPattern);if(!r)return null;const a=r[0],o=n.match(t.parsePattern);if(!o)return null;let c=t.valueCallback?t.valueCallback(o[0]):o[0];c=e.valueCallback?e.valueCallback(c):c;const i=n.slice(a.length);return{value:c,rest:i}}}const mt=/^(\d+)(th|st|nd|rd)?/i,ht=/\d+/i,gt={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},wt={any:[/^b/i,/^(a|c)/i]},vt={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},yt={any:[/1/i,/2/i,/3/i,/4/i]},bt={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},kt={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},xt={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},pt={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},Dt={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},_t={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},Mt={ordinalNumber:ft({matchPattern:mt,parsePattern:ht,valueCallback:t=>parseInt(t,10)}),era:I({matchPatterns:gt,defaultMatchWidth:"wide",parsePatterns:wt,defaultParseWidth:"any"}),quarter:I({matchPatterns:vt,defaultMatchWidth:"wide",parsePatterns:yt,defaultParseWidth:"any",valueCallback:t=>t+1}),month:I({matchPatterns:bt,defaultMatchWidth:"wide",parsePatterns:kt,defaultParseWidth:"any"}),day:I({matchPatterns:xt,defaultMatchWidth:"wide",parsePatterns:pt,defaultParseWidth:"any"}),dayPeriod:I({matchPatterns:Dt,defaultMatchWidth:"any",parsePatterns:_t,defaultParseWidth:"any"})},Pt={code:"en-US",formatDistance:Ge,formatLong:Ze,formatRelative:tt,localize:ct,match:Mt,options:{weekStartsOn:0,firstWeekContainsDate:1}};function St(t){const n=C(t);return Re(n,Qe(n))+1}function Tt(t){const n=C(t),e=+ee(n)-+Ve(n);return Math.round(e/Me)+1}function Se(t,n){var u,h,m,p;const e=C(t),r=e.getFullYear(),a=te(),o=(n==null?void 0:n.firstWeekContainsDate)??((h=(u=n==null?void 0:n.locale)==null?void 0:u.options)==null?void 0:h.firstWeekContainsDate)??a.firstWeekContainsDate??((p=(m=a.locale)==null?void 0:m.options)==null?void 0:p.firstWeekContainsDate)??1,c=z(t,0);c.setFullYear(r+1,0,o),c.setHours(0,0,0,0);const i=X(c,n),l=z(t,0);l.setFullYear(r,0,o),l.setHours(0,0,0,0);const d=X(l,n);return e.getTime()>=i.getTime()?r+1:e.getTime()>=d.getTime()?r:r-1}function Ot(t,n){var i,l,d,u;const e=te(),r=(n==null?void 0:n.firstWeekContainsDate)??((l=(i=n==null?void 0:n.locale)==null?void 0:i.options)==null?void 0:l.firstWeekContainsDate)??e.firstWeekContainsDate??((u=(d=e.locale)==null?void 0:d.options)==null?void 0:u.firstWeekContainsDate)??1,a=Se(t,n),o=z(t,0);return o.setFullYear(a,0,r),o.setHours(0,0,0,0),X(o,n)}function Ct(t,n){const e=C(t),r=+X(e,n)-+Ot(e,n);return Math.round(r/Me)+1}function k(t,n){const e=t<0?"-":"",r=Math.abs(t).toString().padStart(n,"0");return e+r}const $={y(t,n){const e=t.getFullYear(),r=e>0?e:1-e;return k(n==="yy"?r%100:r,n.length)},M(t,n){const e=t.getMonth();return n==="M"?String(e+1):k(e+1,2)},d(t,n){return k(t.getDate(),n.length)},a(t,n){const e=t.getHours()/12>=1?"pm":"am";switch(n){case"a":case"aa":return e.toUpperCase();case"aaa":return e;case"aaaaa":return e[0];case"aaaa":default:return e==="am"?"a.m.":"p.m."}},h(t,n){return k(t.getHours()%12||12,n.length)},H(t,n){return k(t.getHours(),n.length)},m(t,n){return k(t.getMinutes(),n.length)},s(t,n){return k(t.getSeconds(),n.length)},S(t,n){const e=n.length,r=t.getMilliseconds(),a=Math.trunc(r*Math.pow(10,e-3));return k(a,n.length)}},R={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},ye={G:function(t,n,e){const r=t.getFullYear()>0?1:0;switch(n){case"G":case"GG":case"GGG":return e.era(r,{width:"abbreviated"});case"GGGGG":return e.era(r,{width:"narrow"});case"GGGG":default:return e.era(r,{width:"wide"})}},y:function(t,n,e){if(n==="yo"){const r=t.getFullYear(),a=r>0?r:1-r;return e.ordinalNumber(a,{unit:"year"})}return $.y(t,n)},Y:function(t,n,e,r){const a=Se(t,r),o=a>0?a:1-a;if(n==="YY"){const c=o%100;return k(c,2)}return n==="Yo"?e.ordinalNumber(o,{unit:"year"}):k(o,n.length)},R:function(t,n){const e=Pe(t);return k(e,n.length)},u:function(t,n){const e=t.getFullYear();return k(e,n.length)},Q:function(t,n,e){const r=Math.ceil((t.getMonth()+1)/3);switch(n){case"Q":return String(r);case"QQ":return k(r,2);case"Qo":return e.ordinalNumber(r,{unit:"quarter"});case"QQQ":return e.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return e.quarter(r,{width:"narrow",context:"formatting"});case"QQQQ":default:return e.quarter(r,{width:"wide",context:"formatting"})}},q:function(t,n,e){const r=Math.ceil((t.getMonth()+1)/3);switch(n){case"q":return String(r);case"qq":return k(r,2);case"qo":return e.ordinalNumber(r,{unit:"quarter"});case"qqq":return e.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return e.quarter(r,{width:"narrow",context:"standalone"});case"qqqq":default:return e.quarter(r,{width:"wide",context:"standalone"})}},M:function(t,n,e){const r=t.getMonth();switch(n){case"M":case"MM":return $.M(t,n);case"Mo":return e.ordinalNumber(r+1,{unit:"month"});case"MMM":return e.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return e.month(r,{width:"narrow",context:"formatting"});case"MMMM":default:return e.month(r,{width:"wide",context:"formatting"})}},L:function(t,n,e){const r=t.getMonth();switch(n){case"L":return String(r+1);case"LL":return k(r+1,2);case"Lo":return e.ordinalNumber(r+1,{unit:"month"});case"LLL":return e.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return e.month(r,{width:"narrow",context:"standalone"});case"LLLL":default:return e.month(r,{width:"wide",context:"standalone"})}},w:function(t,n,e,r){const a=Ct(t,r);return n==="wo"?e.ordinalNumber(a,{unit:"week"}):k(a,n.length)},I:function(t,n,e){const r=Tt(t);return n==="Io"?e.ordinalNumber(r,{unit:"week"}):k(r,n.length)},d:function(t,n,e){return n==="do"?e.ordinalNumber(t.getDate(),{unit:"date"}):$.d(t,n)},D:function(t,n,e){const r=St(t);return n==="Do"?e.ordinalNumber(r,{unit:"dayOfYear"}):k(r,n.length)},E:function(t,n,e){const r=t.getDay();switch(n){case"E":case"EE":case"EEE":return e.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return e.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return e.day(r,{width:"short",context:"formatting"});case"EEEE":default:return e.day(r,{width:"wide",context:"formatting"})}},e:function(t,n,e,r){const a=t.getDay(),o=(a-r.weekStartsOn+8)%7||7;switch(n){case"e":return String(o);case"ee":return k(o,2);case"eo":return e.ordinalNumber(o,{unit:"day"});case"eee":return e.day(a,{width:"abbreviated",context:"formatting"});case"eeeee":return e.day(a,{width:"narrow",context:"formatting"});case"eeeeee":return e.day(a,{width:"short",context:"formatting"});case"eeee":default:return e.day(a,{width:"wide",context:"formatting"})}},c:function(t,n,e,r){const a=t.getDay(),o=(a-r.weekStartsOn+8)%7||7;switch(n){case"c":return String(o);case"cc":return k(o,n.length);case"co":return e.ordinalNumber(o,{unit:"day"});case"ccc":return e.day(a,{width:"abbreviated",context:"standalone"});case"ccccc":return e.day(a,{width:"narrow",context:"standalone"});case"cccccc":return e.day(a,{width:"short",context:"standalone"});case"cccc":default:return e.day(a,{width:"wide",context:"standalone"})}},i:function(t,n,e){const r=t.getDay(),a=r===0?7:r;switch(n){case"i":return String(a);case"ii":return k(a,n.length);case"io":return e.ordinalNumber(a,{unit:"day"});case"iii":return e.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return e.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return e.day(r,{width:"short",context:"formatting"});case"iiii":default:return e.day(r,{width:"wide",context:"formatting"})}},a:function(t,n,e){const a=t.getHours()/12>=1?"pm":"am";switch(n){case"a":case"aa":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"aaa":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return e.dayPeriod(a,{width:"narrow",context:"formatting"});case"aaaa":default:return e.dayPeriod(a,{width:"wide",context:"formatting"})}},b:function(t,n,e){const r=t.getHours();let a;switch(r===12?a=R.noon:r===0?a=R.midnight:a=r/12>=1?"pm":"am",n){case"b":case"bb":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"bbb":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return e.dayPeriod(a,{width:"narrow",context:"formatting"});case"bbbb":default:return e.dayPeriod(a,{width:"wide",context:"formatting"})}},B:function(t,n,e){const r=t.getHours();let a;switch(r>=17?a=R.evening:r>=12?a=R.afternoon:r>=4?a=R.morning:a=R.night,n){case"B":case"BB":case"BBB":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"BBBBB":return e.dayPeriod(a,{width:"narrow",context:"formatting"});case"BBBB":default:return e.dayPeriod(a,{width:"wide",context:"formatting"})}},h:function(t,n,e){if(n==="ho"){let r=t.getHours()%12;return r===0&&(r=12),e.ordinalNumber(r,{unit:"hour"})}return $.h(t,n)},H:function(t,n,e){return n==="Ho"?e.ordinalNumber(t.getHours(),{unit:"hour"}):$.H(t,n)},K:function(t,n,e){const r=t.getHours()%12;return n==="Ko"?e.ordinalNumber(r,{unit:"hour"}):k(r,n.length)},k:function(t,n,e){let r=t.getHours();return r===0&&(r=24),n==="ko"?e.ordinalNumber(r,{unit:"hour"}):k(r,n.length)},m:function(t,n,e){return n==="mo"?e.ordinalNumber(t.getMinutes(),{unit:"minute"}):$.m(t,n)},s:function(t,n,e){return n==="so"?e.ordinalNumber(t.getSeconds(),{unit:"second"}):$.s(t,n)},S:function(t,n){return $.S(t,n)},X:function(t,n,e){const r=t.getTimezoneOffset();if(r===0)return"Z";switch(n){case"X":return ke(r);case"XXXX":case"XX":return L(r);case"XXXXX":case"XXX":default:return L(r,":")}},x:function(t,n,e){const r=t.getTimezoneOffset();switch(n){case"x":return ke(r);case"xxxx":case"xx":return L(r);case"xxxxx":case"xxx":default:return L(r,":")}},O:function(t,n,e){const r=t.getTimezoneOffset();switch(n){case"O":case"OO":case"OOO":return"GMT"+be(r,":");case"OOOO":default:return"GMT"+L(r,":")}},z:function(t,n,e){const r=t.getTimezoneOffset();switch(n){case"z":case"zz":case"zzz":return"GMT"+be(r,":");case"zzzz":default:return"GMT"+L(r,":")}},t:function(t,n,e){const r=Math.trunc(t.getTime()/1e3);return k(r,n.length)},T:function(t,n,e){const r=t.getTime();return k(r,n.length)}};function be(t,n=""){const e=t>0?"-":"+",r=Math.abs(t),a=Math.trunc(r/60),o=r%60;return o===0?e+String(a):e+String(a)+n+k(o,2)}function ke(t,n){return t%60===0?(t>0?"-":"+")+k(Math.abs(t)/60,2):L(t,n)}function L(t,n=""){const e=t>0?"-":"+",r=Math.abs(t),a=k(Math.trunc(r/60),2),o=k(r%60,2);return e+a+n+o}const xe=(t,n)=>{switch(t){case"P":return n.date({width:"short"});case"PP":return n.date({width:"medium"});case"PPP":return n.date({width:"long"});case"PPPP":default:return n.date({width:"full"})}},Te=(t,n)=>{switch(t){case"p":return n.time({width:"short"});case"pp":return n.time({width:"medium"});case"ppp":return n.time({width:"long"});case"pppp":default:return n.time({width:"full"})}},Wt=(t,n)=>{const e=t.match(/(P+)(p+)?/)||[],r=e[1],a=e[2];if(!a)return xe(t,n);let o;switch(r){case"P":o=n.dateTime({width:"short"});break;case"PP":o=n.dateTime({width:"medium"});break;case"PPP":o=n.dateTime({width:"long"});break;case"PPPP":default:o=n.dateTime({width:"full"});break}return o.replace("{{date}}",xe(r,n)).replace("{{time}}",Te(a,n))},Et={p:Te,P:Wt},$t=/^D+$/,Yt=/^Y+$/,Ft=["D","DD","YY","YYYY"];function Bt(t){return $t.test(t)}function Nt(t){return Yt.test(t)}function Lt(t,n,e){const r=jt(t,n,e);if(console.warn(r),Ft.includes(t))throw new RangeError(r)}function jt(t,n,e){const r=t[0]==="Y"?"years":"days of the month";return`Use \`${t.toLowerCase()}\` instead of \`${t}\` (in \`${n}\`) for formatting ${r} to the input \`${e}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const Ht=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,qt=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,zt=/^'([^]*?)'?$/,Rt=/''/g,Vt=/[a-zA-Z]/;function H(t,n,e){var u,h,m,p,D,g,s,_;const r=te(),a=(e==null?void 0:e.locale)??r.locale??Pt,o=(e==null?void 0:e.firstWeekContainsDate)??((h=(u=e==null?void 0:e.locale)==null?void 0:u.options)==null?void 0:h.firstWeekContainsDate)??r.firstWeekContainsDate??((p=(m=r.locale)==null?void 0:m.options)==null?void 0:p.firstWeekContainsDate)??1,c=(e==null?void 0:e.weekStartsOn)??((g=(D=e==null?void 0:e.locale)==null?void 0:D.options)==null?void 0:g.weekStartsOn)??r.weekStartsOn??((_=(s=r.locale)==null?void 0:s.options)==null?void 0:_.weekStartsOn)??0,i=C(t);if(!Ie(i))throw new RangeError("Invalid time value");let l=n.match(qt).map(x=>{const b=x[0];if(b==="p"||b==="P"){const O=Et[b];return O(x,a.formatLong)}return x}).join("").match(Ht).map(x=>{if(x==="''")return{isToken:!1,value:"'"};const b=x[0];if(b==="'")return{isToken:!1,value:At(x)};if(ye[b])return{isToken:!0,value:x};if(b.match(Vt))throw new RangeError("Format string contains an unescaped latin alphabet character `"+b+"`");return{isToken:!1,value:x}});a.localize.preprocessor&&(l=a.localize.preprocessor(i,l));const d={firstWeekContainsDate:o,weekStartsOn:c,locale:a};return l.map(x=>{if(!x.isToken)return x.value;const b=x.value;(!(e!=null&&e.useAdditionalWeekYearTokens)&&Nt(b)||!(e!=null&&e.useAdditionalDayOfYearTokens)&&Bt(b))&&Lt(b,n,String(t));const O=ye[b[0]];return O(i,b,a.localize,d)}).join("")}function At(t){const n=t.match(zt);return n?n[1].replace(Rt,"'"):t}const It={class:"flex items-center gap-2 flex-wrap"},Qt={class:"flex items-center gap-1"},Xt={class:"text-sm font-medium text-foreground flex-1 min-w-0 truncate"},Gt={key:0,class:"text-xs text-muted-foreground"},Jt={class:"flex items-center rounded-md border border-border overflow-hidden"},Ut=G({__name:"CalendarToolbar",setup(t){const n=J(),e=W(()=>{if(n.view==="week"){const c=n.weekDays;if(!c.length)return"";const i=c[0],l=c[6];return i.getMonth()===l.getMonth()?`${H(i,"MMM d")} – ${H(l,"d, yyyy")}`:`${H(i,"MMM d")} – ${H(l,"MMM d, yyyy")}`}else return H(n.currentDate,"EEEE, MMMM d, yyyy")});async function r(c){c==="prev"?n.navigatePrev():n.navigateNext(),await n.fetchCurrentView()}async function a(){n.goToToday(),await n.fetchCurrentView()}async function o(c){n.setView(c),await n.fetchCurrentView()}return(c,i)=>(w(),v("div",It,[f("div",Qt,[E(K,{variant:"outline",size:"sm",onClick:i[0]||(i[0]=l=>r("prev"))},{default:Q(()=>[...i[4]||(i[4]=[f("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[f("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)])]),_:1}),E(K,{variant:"outline",size:"sm",onClick:a},{default:Q(()=>[...i[5]||(i[5]=[pe("Today",-1)])]),_:1}),E(K,{variant:"outline",size:"sm",onClick:i[1]||(i[1]=l=>r("next"))},{default:Q(()=>[...i[6]||(i[6]=[f("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[f("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1})]),f("span",Xt,M(e.value),1),y(n).loading?(w(),v("div",Gt,"Loading...")):T("",!0),f("div",Jt,[f("button",{class:q(["px-3 py-1.5 text-xs font-medium transition-colors",y(n).view==="day"?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"]),onClick:i[2]||(i[2]=l=>o("day"))}," Day ",2),f("button",{class:q(["px-3 py-1.5 text-xs font-medium transition-colors",y(n).view==="week"?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"]),onClick:i[3]||(i[3]=l=>o("week"))}," Week ",2)])]))}}),Kt=7;function Oe(){const t=se(),n=J(),e=S(null),r=S(null),a=S(null),o=S(null);function c(D,g){var s,_;e.value=D.id,(s=g.dataTransfer)==null||s.setData("task_id",D.id),(_=g.dataTransfer)==null||_.setData("estimate_hours",String(D.estimate_hours??1))}function i(D,g){g.preventDefault(),r.value=P(D)}function l(){r.value=null}async function d(D,g){var le,fe;g.preventDefault(),r.value=null,e.value=null;const s=(le=g.dataTransfer)==null?void 0:le.getData("task_id"),_=parseFloat(((fe=g.dataTransfer)==null?void 0:fe.getData("estimate_hours"))??"1")||1;if(!s)return;const b=g.currentTarget.getBoundingClientRect(),O=g.clientY-b.top,ie=ge(O/Z,15),ne=Math.max(0,Math.min(ie,12*60)),N=new Date(D);N.setHours(Kt,0,0,0),N.setMinutes(N.getMinutes()+ne);const re=new Date(N);re.setMinutes(re.getMinutes()+Math.round(_*60));const ue=N.toISOString(),ce=re.toISOString(),de=`temp_${Date.now()}`,Ce={kind:"planned",id:de,project_id:null,job_number:"",display_name:"Loading...",start_at:ue,end_at:ce,title:"",color_hue:260,tags:[],task_id:s,session_id:null,manual_entry_id:null};n.addBlock(Ce);try{await t.createBlock(s,{start_at:ue,end_at:ce}),await n.fetchCurrentView()}catch(We){n.removeBlock(de),console.error("Failed to create task block:",We)}}let u=0,h="",m=null;function p(D,g){g.preventDefault(),g.stopPropagation(),a.value=D,m=D,u=g.clientY,h=D.end_at,o.value=D.end_at;const s=x=>{if(!m)return;const b=x.clientY-u,O=ge(b/Z,15),ne=new Date(h).getTime()+O*6e4,N=new Date(m.start_at).getTime()+15*6e4;o.value=new Date(Math.max(ne,N)).toISOString()},_=async()=>{if(document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",_),!m||!o.value){a.value=null;return}const x=m.id,b=o.value;if(b===h){a.value=null,o.value=null;return}try{m.task_id&&await t.updateBlock(x,{end_at:b}),n.updateBlock({...m,end_at:b})}catch(O){console.error("Failed to resize block:",O),n.updateBlock({...m,end_at:h})}a.value=null,o.value=null,m=null};document.addEventListener("mousemove",s),document.addEventListener("mouseup",_)}return{draggingTaskId:e,dragOverDay:r,resizingBlock:a,resizePreviewEnd:o,onDragStart:c,onDragOver:i,onDragLeave:l,onDrop:d,onResizeStart:p}}function Zt(t){return`hsla(${t}, 65%, 45%, 0.85)`}function en(t){return`hsla(${t}, 65%, 55%, 1)`}const tn={class:"px-1.5 py-1 h-full flex flex-col text-white overflow-hidden"},nn={class:"text-xs font-semibold leading-tight truncate"},rn={key:0,class:"text-xs opacity-75 truncate"},an={key:1,class:"text-xs opacity-75 mt-auto"},on=G({__name:"CalendarBlock",props:{block:{},lane:{},totalLanes:{},top:{},height:{},resizeEnd:{}},emits:["resizeStart","click"],setup(t,{emit:n}){const e=t,r=n,a=W(()=>e.resizeEnd?new Date(e.resizeEnd):new Date(e.block.end_at)),o=W(()=>{if(!e.resizeEnd)return e.height;const u=(a.value.getTime()-new Date(e.block.start_at).getTime())/6e4;return Math.max(u*(40/30),20)}),c=W(()=>{const d=a.value.getTime()-new Date(e.block.start_at).getTime();return U(d/36e5)}),i=W(()=>{const d=`calc(${100/e.totalLanes}% - 2px)`,u=`calc(${e.lane/e.totalLanes*100}% + 1px)`;return{top:`${e.top}px`,height:`${o.value}px`,width:d,left:u,backgroundColor:Zt(e.block.color_hue),borderColor:en(e.block.color_hue)}}),l=W(()=>o.value<40);return(d,u)=>(w(),v("div",{class:q(["absolute rounded overflow-hidden cursor-pointer select-none group",{"border-2":t.block.kind==="session","border-2 border-dashed opacity-80":t.block.kind==="planned","border-2 calendar-block--manual":t.block.kind==="manual"}]),style:j(i.value),onClick:u[1]||(u[1]=h=>r("click",t.block))},[f("div",tn,[f("p",nn,M(t.block.display_name),1),!l.value&&t.block.job_number?(w(),v("p",rn,M(t.block.job_number),1)):T("",!0),l.value?T("",!0):(w(),v("p",an,M(c.value),1))]),f("div",{class:"absolute bottom-0 left-0 right-0 h-2 cursor-s-resize opacity-0 group-hover:opacity-100 flex items-center justify-center",onMousedown:u[0]||(u[0]=De(h=>r("resizeStart",h),["stop"]))},[...u[2]||(u[2]=[f("div",{class:"w-8 h-0.5 bg-white/60 rounded"},null,-1)])],32)],6))}}),sn=$e(on,[["__scopeId","data-v-5829880c"]]),un={class:"flex overflow-auto h-full"},cn={class:"flex flex-1 gap-px min-w-0"},dn=["onDragover","onDrop"],ln={key:1,class:"absolute inset-0 bg-primary/10 pointer-events-none z-0"},Y=7,oe=19,V=40,fn=G({__name:"CalendarGrid",emits:["blockClick"],setup(t,{emit:n}){const e=Array.from({length:oe-Y+1},(p,D)=>Y+D),r=J(),a=Oe(),o=n,c=W(()=>r.view==="week"?r.weekDays:[r.currentDate]),i=P(new Date);function l(p){const D=r.getBlocksForDay(p);return Le(D)}function d(p){return je(new Date(p.start_at),Y)}function u(p){return He(new Date(p.start_at),new Date(p.end_at))}function h(p){var D;return((D=a.resizingBlock.value)==null?void 0:D.id)===p.id}function m(p){return p===12?"12 PM":p>12?`${p-12} PM`:`${p} AM`}return(p,D)=>(w(),v("div",un,[f("div",{class:"w-12 shrink-0 relative",style:j({height:`${(oe-Y+1)*V*2}px`})},[(w(!0),v(F,null,B(y(e),g=>(w(),v("div",{key:g,class:"absolute right-2 text-xs text-muted-foreground",style:j({top:`${(g-Y)*V*2-6}px`})},M(m(g)),5))),128))],4),f("div",cn,[(w(!0),v(F,null,B(c.value,g=>(w(),v("div",{key:y(P)(g),class:q(["flex-1 relative border-l border-border",{"bg-primary/5":y(P)(g)===y(i)}]),style:j({height:`${(oe-Y)*V*2}px`}),onDragover:s=>y(a).onDragOver(g,s),onDragleave:D[0]||(D[0]=s=>y(a).onDragLeave()),onDrop:s=>y(a).onDrop(g,s)},[y(r).view==="week"?(w(),v("div",{key:0,class:q(["sticky top-0 z-10 text-center py-1 text-xs font-medium border-b border-border bg-background",y(P)(g)===y(i)?"text-primary":"text-muted-foreground"])},[f("div",null,M(y(H)(g,"EEE")),1),f("div",{class:q(["inline-flex h-6 w-6 mx-auto items-center justify-center rounded-full text-sm",y(P)(g)===y(i)?"bg-primary text-primary-foreground":""])},M(y(H)(g,"d")),3)],2)):T("",!0),(w(!0),v(F,null,B(y(e),s=>(w(),v("div",{key:s,class:"absolute left-0 right-0 border-t border-border/40",style:j({top:`${(s-Y)*V*2}px`})},null,4))),128)),(w(!0),v(F,null,B(y(e).slice(0,-1),s=>(w(),v("div",{key:`half-${s}`,class:"absolute left-0 right-0 border-t border-border/20",style:j({top:`${(s-Y)*V*2+V}px`})},null,4))),128)),y(a).dragOverDay.value===y(P)(g)?(w(),v("div",ln)):T("",!0),(w(!0),v(F,null,B(l(g),({block:s,lane:_,totalLanes:x})=>(w(),Ye(sn,{key:s.id,block:s,lane:_,"total-lanes":x,top:d(s),height:u(s),"resize-end":h(s)?y(a).resizePreviewEnd.value:null,onClick:b=>o("blockClick",s),onResizeStart:b=>y(a).onResizeStart(s,b)},null,8,["block","lane","total-lanes","top","height","resize-end","onClick","onResizeStart"]))),128))],46,dn))),128))])]))}}),mn={class:"flex flex-col h-full bg-card border-l border-border"},hn={class:"p-3 border-b border-border flex items-center justify-between shrink-0"},gn={class:"flex-1 overflow-y-auto p-2 space-y-1.5"},wn={key:0,class:"text-xs text-muted-foreground p-2"},vn={key:1,class:"text-xs text-muted-foreground p-2 text-center"},yn=["onDragstart"],bn={class:"flex items-start gap-2"},kn={class:"flex-1 min-w-0"},xn={class:"text-xs font-medium text-foreground leading-tight truncate"},pn={class:"flex items-center gap-1.5 mt-1 flex-wrap"},Dn={key:0,class:"text-xs text-muted-foreground"},_n={key:0,class:"p-3 border-t border-border shrink-0"},Mn={class:"space-y-1"},Pn={class:"text-muted-foreground truncate max-w-[100px]"},Sn={class:"text-foreground"},Tn=G({__name:"PlannerSidebar",emits:["createTask"],setup(t,{emit:n}){const e=se(),r=J(),a=Oe(),o=n,c=W(()=>P(r.currentDate));_e(()=>{e.fetchForDate(c.value)});const i=u=>({todo:"outline",doing:"default",done:"success",cancelled:"secondary"})[u],l=u=>u>=4?"bg-red-500":u===3?"bg-amber-500":"bg-emerald-500",d=W(()=>{const u={};for(const h of e.tasks){const m=h.project_id??"_none";u[m]||(u[m]={name:h.project_id?m:"No Project",planned:0,actual:0}),u[m].planned+=h.estimate_hours??0,u[m].actual+=h.actual_hours??0}return Object.values(u)});return(u,h)=>(w(),v("div",mn,[f("div",hn,[h[2]||(h[2]=f("h3",{class:"text-sm font-semibold text-foreground"},"Planner",-1)),E(K,{size:"sm",variant:"ghost",onClick:h[0]||(h[0]=m=>o("createTask"))},{default:Q(()=>[...h[1]||(h[1]=[f("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[f("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1)])]),_:1})]),f("div",gn,[y(e).loading?(w(),v("div",wn,"Loading...")):y(e).tasks.length===0?(w(),v("div",vn," No tasks for today ")):T("",!0),(w(!0),v(F,null,B(y(e).tasks,m=>(w(),v("div",{key:m.id,class:"rounded-md border border-border bg-background p-2 cursor-grab active:cursor-grabbing hover:border-primary/50 transition-colors",draggable:"true",onDragstart:p=>y(a).onDragStart(m,p)},[f("div",bn,[f("div",{class:q(["h-2 w-2 rounded-full mt-1.5 shrink-0",l(m.priority)])},null,2),f("div",kn,[f("p",xn,M(m.title),1),f("div",pn,[E(Ne,{variant:i(m.status),class:"text-xs py-0"},{default:Q(()=>[pe(M(m.status),1)]),_:2},1032,["variant"]),m.estimate_hours?(w(),v("span",Dn,M(y(U)(m.estimate_hours)),1)):T("",!0)])])])],40,yn))),128))]),d.value.length?(w(),v("div",_n,[h[3]||(h[3]=f("p",{class:"text-xs font-medium text-muted-foreground mb-2"},"Plan vs Actual",-1)),f("div",Mn,[(w(!0),v(F,null,B(d.value,m=>(w(),v("div",{key:m.name,class:"flex items-center justify-between text-xs"},[f("span",Pn,M(m.name),1),f("span",Sn,M(y(U)(m.planned))+" / "+M(y(U)(m.actual)),1)]))),128))])])):T("",!0)]))}}),On={class:"h-full flex flex-col"},Cn={class:"p-4 border-b border-border flex items-center gap-3 flex-wrap"},Wn={class:"flex items-center gap-2 ml-auto"},En={class:"flex-1 flex overflow-hidden"},$n={class:"flex-1 overflow-auto"},Yn={key:0,class:"w-56 shrink-0 overflow-hidden"},Fn={class:"bg-card border border-border rounded-lg shadow-xl p-4 w-72"},Bn={class:"flex items-start justify-between gap-2 mb-3"},Nn={class:"font-semibold text-sm text-foreground"},Ln={key:0,class:"text-xs text-muted-foreground"},jn={class:"space-y-1 text-xs text-muted-foreground"},Hn={key:0,class:"mt-2 flex flex-wrap gap-1"},Jn=G({__name:"CalendarView",setup(t){const n=J(),e=se(),r=S(!0),a=S(!1),o=S(null);_e(()=>{n.fetchCurrentView()});function c(l){o.value=l}async function i(l){try{await e.create(l),me.success("Task created"),a.value=!1,e.fetchForDate(P(n.currentDate))}catch{me.error("Failed to create task")}}return(l,d)=>(w(),v("div",On,[f("div",Cn,[E(Ut),f("div",Wn,[f("button",{class:"text-xs text-muted-foreground hover:text-foreground transition-colors",onClick:d[0]||(d[0]=u=>r.value=!r.value)},M(r.value?"Hide Planner":"Show Planner"),1)])]),f("div",En,[f("div",$n,[E(fn,{onBlockClick:c})]),r.value?(w(),v("div",Yn,[E(Tn,{onCreateTask:d[1]||(d[1]=u=>a.value=!0)})])):T("",!0)]),o.value?(w(),v("div",{key:0,class:"fixed inset-0 z-40 flex items-center justify-center p-4",onClick:d[3]||(d[3]=De(u=>o.value=null,["self"]))},[f("div",Fn,[f("div",Bn,[f("div",null,[f("p",Nn,M(o.value.display_name),1),o.value.job_number?(w(),v("p",Ln,M(o.value.job_number),1)):T("",!0)]),f("button",{class:"text-muted-foreground hover:text-foreground",onClick:d[2]||(d[2]=u=>o.value=null)},[...d[5]||(d[5]=[f("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[f("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),f("div",jn,[f("p",null,"Start: "+M(new Date(o.value.start_at).toLocaleString()),1),f("p",null,"End: "+M(new Date(o.value.end_at).toLocaleString()),1),f("p",null,"Type: "+M(o.value.kind),1)]),o.value.tags.length?(w(),v("div",Hn,[(w(!0),v(F,null,B(o.value.tags,u=>(w(),v("span",{key:u.id,class:"px-1.5 py-0.5 rounded text-xs",style:j({background:`${u.color_hex}22`,color:u.color_hex})},M(u.name),5))),128))])):T("",!0)])])):T("",!0),E(Be,{open:a.value,"default-date":y(P)(y(n).currentDate),onClose:d[4]||(d[4]=u=>a.value=!1),onSave:i},null,8,["open","default-date"])]))}});export{Jn as default}; +import{B as Ee,r as S,m as W,d as G,o as w,c as v,a as f,e as E,w as Q,k as pe,t as M,i as y,j as T,p as q,A as j,h as De,_ as $e,F,l as B,n as Ye,x as _e,K as me}from"./index-B9hhyP-T.js";import{d as Fe}from"./dashboard-DFJs0AgU.js";import{i as P,f as U}from"./utils-DuVQys2y.js";import{_ as K}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import{u as se,_ as Be}from"./TaskForm.vue_vue_type_script_setup_true_lang-DBxohyhw.js";import{_ as Ne}from"./Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js";import"./Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js";import"./Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js";import"./devops-Dn5wUB1p.js";const Z=40/30;function Le(t){if(t.length===0)return[];const n=[...t].sort((o,c)=>new Date(o.start_at).getTime()-new Date(c.start_at).getTime()),e=[],r=[];for(const o of n){const c=new Date(o.start_at).getTime(),i=new Date(o.end_at).getTime();let l=-1;for(let d=0;d{const i=new Date(o.start_at).getTime(),l=new Date(o.end_at).getTime();let d=c;for(const u of r){const h=new Date(u.block.start_at).getTime(),m=new Date(u.block.end_at).getTime();hi&&u.lane>d&&(d=u.lane)}return{block:o,lane:c,totalLanes:d+1}})}function je(t,n=7){return((t.getHours()-n)*60+t.getMinutes())*Z}function He(t,n){const e=(n.getTime()-t.getTime())/6e4;return Math.max(e*Z,20)}function he(t){const n=t.getDay(),e=new Date(t);return e.setDate(t.getDate()-(n+6)%7),e.setHours(0,0,0,0),Array.from({length:7},(r,a)=>{const o=new Date(e);return o.setDate(e.getDate()+a),o})}function ge(t,n=15){return Math.round(t/n)*n}const J=Ee("calendar",()=>{const t=S([]),n=S(new Date),e=S("week"),r=S(!1),a=S(null),o=W(()=>he(n.value));async function c(s,_,x){r.value=!0,a.value=null;try{const b=await Fe.calendar({from:s,to:_,view:x});t.value=b.data}catch(b){const O=b;a.value=O.message??"Failed to fetch calendar"}finally{r.value=!1}}async function i(){if(e.value==="week"){const s=he(n.value),_=P(s[0]),x=P(s[6]);await c(_,x,"week")}else{const s=P(n.value);await c(s,s,"day")}}function l(){const s=new Date(n.value);e.value==="week"?s.setDate(s.getDate()-7):s.setDate(s.getDate()-1),n.value=s}function d(){const s=new Date(n.value);e.value==="week"?s.setDate(s.getDate()+7):s.setDate(s.getDate()+1),n.value=s}function u(){n.value=new Date}function h(s){e.value=s}function m(s){t.value.push(s)}function p(s){const _=t.value.findIndex(x=>x.id===s.id);_!==-1&&(t.value[_]=s)}function D(s){t.value=t.value.filter(_=>_.id!==s)}function g(s){const _=P(s);return t.value.filter(x=>P(new Date(x.start_at))===_)}return{blocks:t,currentDate:n,view:e,loading:r,error:a,weekDays:o,fetch:c,fetchCurrentView:i,navigatePrev:l,navigateNext:d,goToToday:u,setView:h,addBlock:m,updateBlock:p,removeBlock:D,getBlocksForDay:g}});function C(t){const n=Object.prototype.toString.call(t);return t instanceof Date||typeof t=="object"&&n==="[object Date]"?new t.constructor(+t):typeof t=="number"||n==="[object Number]"||typeof t=="string"||n==="[object String]"?new Date(t):new Date(NaN)}function z(t,n){return t instanceof Date?new t.constructor(n):new Date(n)}const Me=6048e5,qe=864e5;let ze={};function te(){return ze}function X(t,n){var i,l,d,u;const e=te(),r=(n==null?void 0:n.weekStartsOn)??((l=(i=n==null?void 0:n.locale)==null?void 0:i.options)==null?void 0:l.weekStartsOn)??e.weekStartsOn??((u=(d=e.locale)==null?void 0:d.options)==null?void 0:u.weekStartsOn)??0,a=C(t),o=a.getDay(),c=(o=a.getTime()?e+1:n.getTime()>=c.getTime()?e:e-1}function we(t){const n=C(t);return n.setHours(0,0,0,0),n}function ve(t){const n=C(t),e=new Date(Date.UTC(n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds(),n.getMilliseconds()));return e.setUTCFullYear(n.getFullYear()),+t-+e}function Re(t,n){const e=we(t),r=we(n),a=+e-ve(e),o=+r-ve(r);return Math.round((a-o)/qe)}function Ve(t){const n=Pe(t),e=z(t,0);return e.setFullYear(n,0,4),e.setHours(0,0,0,0),ee(e)}function Ae(t){return t instanceof Date||typeof t=="object"&&Object.prototype.toString.call(t)==="[object Date]"}function Ie(t){if(!Ae(t)&&typeof t!="number")return!1;const n=C(t);return!isNaN(Number(n))}function Qe(t){const n=C(t),e=z(t,0);return e.setFullYear(n.getFullYear(),0,1),e.setHours(0,0,0,0),e}const Xe={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},Ge=(t,n,e)=>{let r;const a=Xe[t];return typeof a=="string"?r=a:n===1?r=a.one:r=a.other.replace("{{count}}",n.toString()),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?"in "+r:r+" ago":r};function ae(t){return(n={})=>{const e=n.width?String(n.width):t.defaultWidth;return t.formats[e]||t.formats[t.defaultWidth]}}const Je={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Ue={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Ke={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Ze={date:ae({formats:Je,defaultWidth:"full"}),time:ae({formats:Ue,defaultWidth:"full"}),dateTime:ae({formats:Ke,defaultWidth:"full"})},et={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},tt=(t,n,e,r)=>et[t];function A(t){return(n,e)=>{const r=e!=null&&e.context?String(e.context):"standalone";let a;if(r==="formatting"&&t.formattingValues){const c=t.defaultFormattingWidth||t.defaultWidth,i=e!=null&&e.width?String(e.width):c;a=t.formattingValues[i]||t.formattingValues[c]}else{const c=t.defaultWidth,i=e!=null&&e.width?String(e.width):t.defaultWidth;a=t.values[i]||t.values[c]}const o=t.argumentCallback?t.argumentCallback(n):n;return a[o]}}const nt={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},rt={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},at={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},ot={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},st={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},it={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},ut=(t,n)=>{const e=Number(t),r=e%100;if(r>20||r<10)switch(r%10){case 1:return e+"st";case 2:return e+"nd";case 3:return e+"rd"}return e+"th"},ct={ordinalNumber:ut,era:A({values:nt,defaultWidth:"wide"}),quarter:A({values:rt,defaultWidth:"wide",argumentCallback:t=>t-1}),month:A({values:at,defaultWidth:"wide"}),day:A({values:ot,defaultWidth:"wide"}),dayPeriod:A({values:st,defaultWidth:"wide",formattingValues:it,defaultFormattingWidth:"wide"})};function I(t){return(n,e={})=>{const r=e.width,a=r&&t.matchPatterns[r]||t.matchPatterns[t.defaultMatchWidth],o=n.match(a);if(!o)return null;const c=o[0],i=r&&t.parsePatterns[r]||t.parsePatterns[t.defaultParseWidth],l=Array.isArray(i)?lt(i,h=>h.test(c)):dt(i,h=>h.test(c));let d;d=t.valueCallback?t.valueCallback(l):l,d=e.valueCallback?e.valueCallback(d):d;const u=n.slice(c.length);return{value:d,rest:u}}}function dt(t,n){for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e)&&n(t[e]))return e}function lt(t,n){for(let e=0;e{const r=n.match(t.matchPattern);if(!r)return null;const a=r[0],o=n.match(t.parsePattern);if(!o)return null;let c=t.valueCallback?t.valueCallback(o[0]):o[0];c=e.valueCallback?e.valueCallback(c):c;const i=n.slice(a.length);return{value:c,rest:i}}}const mt=/^(\d+)(th|st|nd|rd)?/i,ht=/\d+/i,gt={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},wt={any:[/^b/i,/^(a|c)/i]},vt={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},yt={any:[/1/i,/2/i,/3/i,/4/i]},bt={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},kt={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},xt={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},pt={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},Dt={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},_t={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},Mt={ordinalNumber:ft({matchPattern:mt,parsePattern:ht,valueCallback:t=>parseInt(t,10)}),era:I({matchPatterns:gt,defaultMatchWidth:"wide",parsePatterns:wt,defaultParseWidth:"any"}),quarter:I({matchPatterns:vt,defaultMatchWidth:"wide",parsePatterns:yt,defaultParseWidth:"any",valueCallback:t=>t+1}),month:I({matchPatterns:bt,defaultMatchWidth:"wide",parsePatterns:kt,defaultParseWidth:"any"}),day:I({matchPatterns:xt,defaultMatchWidth:"wide",parsePatterns:pt,defaultParseWidth:"any"}),dayPeriod:I({matchPatterns:Dt,defaultMatchWidth:"any",parsePatterns:_t,defaultParseWidth:"any"})},Pt={code:"en-US",formatDistance:Ge,formatLong:Ze,formatRelative:tt,localize:ct,match:Mt,options:{weekStartsOn:0,firstWeekContainsDate:1}};function St(t){const n=C(t);return Re(n,Qe(n))+1}function Tt(t){const n=C(t),e=+ee(n)-+Ve(n);return Math.round(e/Me)+1}function Se(t,n){var u,h,m,p;const e=C(t),r=e.getFullYear(),a=te(),o=(n==null?void 0:n.firstWeekContainsDate)??((h=(u=n==null?void 0:n.locale)==null?void 0:u.options)==null?void 0:h.firstWeekContainsDate)??a.firstWeekContainsDate??((p=(m=a.locale)==null?void 0:m.options)==null?void 0:p.firstWeekContainsDate)??1,c=z(t,0);c.setFullYear(r+1,0,o),c.setHours(0,0,0,0);const i=X(c,n),l=z(t,0);l.setFullYear(r,0,o),l.setHours(0,0,0,0);const d=X(l,n);return e.getTime()>=i.getTime()?r+1:e.getTime()>=d.getTime()?r:r-1}function Ot(t,n){var i,l,d,u;const e=te(),r=(n==null?void 0:n.firstWeekContainsDate)??((l=(i=n==null?void 0:n.locale)==null?void 0:i.options)==null?void 0:l.firstWeekContainsDate)??e.firstWeekContainsDate??((u=(d=e.locale)==null?void 0:d.options)==null?void 0:u.firstWeekContainsDate)??1,a=Se(t,n),o=z(t,0);return o.setFullYear(a,0,r),o.setHours(0,0,0,0),X(o,n)}function Ct(t,n){const e=C(t),r=+X(e,n)-+Ot(e,n);return Math.round(r/Me)+1}function k(t,n){const e=t<0?"-":"",r=Math.abs(t).toString().padStart(n,"0");return e+r}const $={y(t,n){const e=t.getFullYear(),r=e>0?e:1-e;return k(n==="yy"?r%100:r,n.length)},M(t,n){const e=t.getMonth();return n==="M"?String(e+1):k(e+1,2)},d(t,n){return k(t.getDate(),n.length)},a(t,n){const e=t.getHours()/12>=1?"pm":"am";switch(n){case"a":case"aa":return e.toUpperCase();case"aaa":return e;case"aaaaa":return e[0];case"aaaa":default:return e==="am"?"a.m.":"p.m."}},h(t,n){return k(t.getHours()%12||12,n.length)},H(t,n){return k(t.getHours(),n.length)},m(t,n){return k(t.getMinutes(),n.length)},s(t,n){return k(t.getSeconds(),n.length)},S(t,n){const e=n.length,r=t.getMilliseconds(),a=Math.trunc(r*Math.pow(10,e-3));return k(a,n.length)}},R={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},ye={G:function(t,n,e){const r=t.getFullYear()>0?1:0;switch(n){case"G":case"GG":case"GGG":return e.era(r,{width:"abbreviated"});case"GGGGG":return e.era(r,{width:"narrow"});case"GGGG":default:return e.era(r,{width:"wide"})}},y:function(t,n,e){if(n==="yo"){const r=t.getFullYear(),a=r>0?r:1-r;return e.ordinalNumber(a,{unit:"year"})}return $.y(t,n)},Y:function(t,n,e,r){const a=Se(t,r),o=a>0?a:1-a;if(n==="YY"){const c=o%100;return k(c,2)}return n==="Yo"?e.ordinalNumber(o,{unit:"year"}):k(o,n.length)},R:function(t,n){const e=Pe(t);return k(e,n.length)},u:function(t,n){const e=t.getFullYear();return k(e,n.length)},Q:function(t,n,e){const r=Math.ceil((t.getMonth()+1)/3);switch(n){case"Q":return String(r);case"QQ":return k(r,2);case"Qo":return e.ordinalNumber(r,{unit:"quarter"});case"QQQ":return e.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return e.quarter(r,{width:"narrow",context:"formatting"});case"QQQQ":default:return e.quarter(r,{width:"wide",context:"formatting"})}},q:function(t,n,e){const r=Math.ceil((t.getMonth()+1)/3);switch(n){case"q":return String(r);case"qq":return k(r,2);case"qo":return e.ordinalNumber(r,{unit:"quarter"});case"qqq":return e.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return e.quarter(r,{width:"narrow",context:"standalone"});case"qqqq":default:return e.quarter(r,{width:"wide",context:"standalone"})}},M:function(t,n,e){const r=t.getMonth();switch(n){case"M":case"MM":return $.M(t,n);case"Mo":return e.ordinalNumber(r+1,{unit:"month"});case"MMM":return e.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return e.month(r,{width:"narrow",context:"formatting"});case"MMMM":default:return e.month(r,{width:"wide",context:"formatting"})}},L:function(t,n,e){const r=t.getMonth();switch(n){case"L":return String(r+1);case"LL":return k(r+1,2);case"Lo":return e.ordinalNumber(r+1,{unit:"month"});case"LLL":return e.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return e.month(r,{width:"narrow",context:"standalone"});case"LLLL":default:return e.month(r,{width:"wide",context:"standalone"})}},w:function(t,n,e,r){const a=Ct(t,r);return n==="wo"?e.ordinalNumber(a,{unit:"week"}):k(a,n.length)},I:function(t,n,e){const r=Tt(t);return n==="Io"?e.ordinalNumber(r,{unit:"week"}):k(r,n.length)},d:function(t,n,e){return n==="do"?e.ordinalNumber(t.getDate(),{unit:"date"}):$.d(t,n)},D:function(t,n,e){const r=St(t);return n==="Do"?e.ordinalNumber(r,{unit:"dayOfYear"}):k(r,n.length)},E:function(t,n,e){const r=t.getDay();switch(n){case"E":case"EE":case"EEE":return e.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return e.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return e.day(r,{width:"short",context:"formatting"});case"EEEE":default:return e.day(r,{width:"wide",context:"formatting"})}},e:function(t,n,e,r){const a=t.getDay(),o=(a-r.weekStartsOn+8)%7||7;switch(n){case"e":return String(o);case"ee":return k(o,2);case"eo":return e.ordinalNumber(o,{unit:"day"});case"eee":return e.day(a,{width:"abbreviated",context:"formatting"});case"eeeee":return e.day(a,{width:"narrow",context:"formatting"});case"eeeeee":return e.day(a,{width:"short",context:"formatting"});case"eeee":default:return e.day(a,{width:"wide",context:"formatting"})}},c:function(t,n,e,r){const a=t.getDay(),o=(a-r.weekStartsOn+8)%7||7;switch(n){case"c":return String(o);case"cc":return k(o,n.length);case"co":return e.ordinalNumber(o,{unit:"day"});case"ccc":return e.day(a,{width:"abbreviated",context:"standalone"});case"ccccc":return e.day(a,{width:"narrow",context:"standalone"});case"cccccc":return e.day(a,{width:"short",context:"standalone"});case"cccc":default:return e.day(a,{width:"wide",context:"standalone"})}},i:function(t,n,e){const r=t.getDay(),a=r===0?7:r;switch(n){case"i":return String(a);case"ii":return k(a,n.length);case"io":return e.ordinalNumber(a,{unit:"day"});case"iii":return e.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return e.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return e.day(r,{width:"short",context:"formatting"});case"iiii":default:return e.day(r,{width:"wide",context:"formatting"})}},a:function(t,n,e){const a=t.getHours()/12>=1?"pm":"am";switch(n){case"a":case"aa":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"aaa":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return e.dayPeriod(a,{width:"narrow",context:"formatting"});case"aaaa":default:return e.dayPeriod(a,{width:"wide",context:"formatting"})}},b:function(t,n,e){const r=t.getHours();let a;switch(r===12?a=R.noon:r===0?a=R.midnight:a=r/12>=1?"pm":"am",n){case"b":case"bb":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"bbb":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return e.dayPeriod(a,{width:"narrow",context:"formatting"});case"bbbb":default:return e.dayPeriod(a,{width:"wide",context:"formatting"})}},B:function(t,n,e){const r=t.getHours();let a;switch(r>=17?a=R.evening:r>=12?a=R.afternoon:r>=4?a=R.morning:a=R.night,n){case"B":case"BB":case"BBB":return e.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"BBBBB":return e.dayPeriod(a,{width:"narrow",context:"formatting"});case"BBBB":default:return e.dayPeriod(a,{width:"wide",context:"formatting"})}},h:function(t,n,e){if(n==="ho"){let r=t.getHours()%12;return r===0&&(r=12),e.ordinalNumber(r,{unit:"hour"})}return $.h(t,n)},H:function(t,n,e){return n==="Ho"?e.ordinalNumber(t.getHours(),{unit:"hour"}):$.H(t,n)},K:function(t,n,e){const r=t.getHours()%12;return n==="Ko"?e.ordinalNumber(r,{unit:"hour"}):k(r,n.length)},k:function(t,n,e){let r=t.getHours();return r===0&&(r=24),n==="ko"?e.ordinalNumber(r,{unit:"hour"}):k(r,n.length)},m:function(t,n,e){return n==="mo"?e.ordinalNumber(t.getMinutes(),{unit:"minute"}):$.m(t,n)},s:function(t,n,e){return n==="so"?e.ordinalNumber(t.getSeconds(),{unit:"second"}):$.s(t,n)},S:function(t,n){return $.S(t,n)},X:function(t,n,e){const r=t.getTimezoneOffset();if(r===0)return"Z";switch(n){case"X":return ke(r);case"XXXX":case"XX":return L(r);case"XXXXX":case"XXX":default:return L(r,":")}},x:function(t,n,e){const r=t.getTimezoneOffset();switch(n){case"x":return ke(r);case"xxxx":case"xx":return L(r);case"xxxxx":case"xxx":default:return L(r,":")}},O:function(t,n,e){const r=t.getTimezoneOffset();switch(n){case"O":case"OO":case"OOO":return"GMT"+be(r,":");case"OOOO":default:return"GMT"+L(r,":")}},z:function(t,n,e){const r=t.getTimezoneOffset();switch(n){case"z":case"zz":case"zzz":return"GMT"+be(r,":");case"zzzz":default:return"GMT"+L(r,":")}},t:function(t,n,e){const r=Math.trunc(t.getTime()/1e3);return k(r,n.length)},T:function(t,n,e){const r=t.getTime();return k(r,n.length)}};function be(t,n=""){const e=t>0?"-":"+",r=Math.abs(t),a=Math.trunc(r/60),o=r%60;return o===0?e+String(a):e+String(a)+n+k(o,2)}function ke(t,n){return t%60===0?(t>0?"-":"+")+k(Math.abs(t)/60,2):L(t,n)}function L(t,n=""){const e=t>0?"-":"+",r=Math.abs(t),a=k(Math.trunc(r/60),2),o=k(r%60,2);return e+a+n+o}const xe=(t,n)=>{switch(t){case"P":return n.date({width:"short"});case"PP":return n.date({width:"medium"});case"PPP":return n.date({width:"long"});case"PPPP":default:return n.date({width:"full"})}},Te=(t,n)=>{switch(t){case"p":return n.time({width:"short"});case"pp":return n.time({width:"medium"});case"ppp":return n.time({width:"long"});case"pppp":default:return n.time({width:"full"})}},Wt=(t,n)=>{const e=t.match(/(P+)(p+)?/)||[],r=e[1],a=e[2];if(!a)return xe(t,n);let o;switch(r){case"P":o=n.dateTime({width:"short"});break;case"PP":o=n.dateTime({width:"medium"});break;case"PPP":o=n.dateTime({width:"long"});break;case"PPPP":default:o=n.dateTime({width:"full"});break}return o.replace("{{date}}",xe(r,n)).replace("{{time}}",Te(a,n))},Et={p:Te,P:Wt},$t=/^D+$/,Yt=/^Y+$/,Ft=["D","DD","YY","YYYY"];function Bt(t){return $t.test(t)}function Nt(t){return Yt.test(t)}function Lt(t,n,e){const r=jt(t,n,e);if(console.warn(r),Ft.includes(t))throw new RangeError(r)}function jt(t,n,e){const r=t[0]==="Y"?"years":"days of the month";return`Use \`${t.toLowerCase()}\` instead of \`${t}\` (in \`${n}\`) for formatting ${r} to the input \`${e}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const Ht=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,qt=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,zt=/^'([^]*?)'?$/,Rt=/''/g,Vt=/[a-zA-Z]/;function H(t,n,e){var u,h,m,p,D,g,s,_;const r=te(),a=(e==null?void 0:e.locale)??r.locale??Pt,o=(e==null?void 0:e.firstWeekContainsDate)??((h=(u=e==null?void 0:e.locale)==null?void 0:u.options)==null?void 0:h.firstWeekContainsDate)??r.firstWeekContainsDate??((p=(m=r.locale)==null?void 0:m.options)==null?void 0:p.firstWeekContainsDate)??1,c=(e==null?void 0:e.weekStartsOn)??((g=(D=e==null?void 0:e.locale)==null?void 0:D.options)==null?void 0:g.weekStartsOn)??r.weekStartsOn??((_=(s=r.locale)==null?void 0:s.options)==null?void 0:_.weekStartsOn)??0,i=C(t);if(!Ie(i))throw new RangeError("Invalid time value");let l=n.match(qt).map(x=>{const b=x[0];if(b==="p"||b==="P"){const O=Et[b];return O(x,a.formatLong)}return x}).join("").match(Ht).map(x=>{if(x==="''")return{isToken:!1,value:"'"};const b=x[0];if(b==="'")return{isToken:!1,value:At(x)};if(ye[b])return{isToken:!0,value:x};if(b.match(Vt))throw new RangeError("Format string contains an unescaped latin alphabet character `"+b+"`");return{isToken:!1,value:x}});a.localize.preprocessor&&(l=a.localize.preprocessor(i,l));const d={firstWeekContainsDate:o,weekStartsOn:c,locale:a};return l.map(x=>{if(!x.isToken)return x.value;const b=x.value;(!(e!=null&&e.useAdditionalWeekYearTokens)&&Nt(b)||!(e!=null&&e.useAdditionalDayOfYearTokens)&&Bt(b))&&Lt(b,n,String(t));const O=ye[b[0]];return O(i,b,a.localize,d)}).join("")}function At(t){const n=t.match(zt);return n?n[1].replace(Rt,"'"):t}const It={class:"flex items-center gap-2 flex-wrap"},Qt={class:"flex items-center gap-1"},Xt={class:"text-sm font-medium text-foreground flex-1 min-w-0 truncate"},Gt={key:0,class:"text-xs text-muted-foreground"},Jt={class:"flex items-center rounded-md border border-border overflow-hidden"},Ut=G({__name:"CalendarToolbar",setup(t){const n=J(),e=W(()=>{if(n.view==="week"){const c=n.weekDays;if(!c.length)return"";const i=c[0],l=c[6];return i.getMonth()===l.getMonth()?`${H(i,"MMM d")} – ${H(l,"d, yyyy")}`:`${H(i,"MMM d")} – ${H(l,"MMM d, yyyy")}`}else return H(n.currentDate,"EEEE, MMMM d, yyyy")});async function r(c){c==="prev"?n.navigatePrev():n.navigateNext(),await n.fetchCurrentView()}async function a(){n.goToToday(),await n.fetchCurrentView()}async function o(c){n.setView(c),await n.fetchCurrentView()}return(c,i)=>(w(),v("div",It,[f("div",Qt,[E(K,{variant:"outline",size:"sm",onClick:i[0]||(i[0]=l=>r("prev"))},{default:Q(()=>[...i[4]||(i[4]=[f("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[f("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)])]),_:1}),E(K,{variant:"outline",size:"sm",onClick:a},{default:Q(()=>[...i[5]||(i[5]=[pe("Today",-1)])]),_:1}),E(K,{variant:"outline",size:"sm",onClick:i[1]||(i[1]=l=>r("next"))},{default:Q(()=>[...i[6]||(i[6]=[f("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[f("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1})]),f("span",Xt,M(e.value),1),y(n).loading?(w(),v("div",Gt,"Loading...")):T("",!0),f("div",Jt,[f("button",{class:q(["px-3 py-1.5 text-xs font-medium transition-colors",y(n).view==="day"?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"]),onClick:i[2]||(i[2]=l=>o("day"))}," Day ",2),f("button",{class:q(["px-3 py-1.5 text-xs font-medium transition-colors",y(n).view==="week"?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"]),onClick:i[3]||(i[3]=l=>o("week"))}," Week ",2)])]))}}),Kt=7;function Oe(){const t=se(),n=J(),e=S(null),r=S(null),a=S(null),o=S(null);function c(D,g){var s,_;e.value=D.id,(s=g.dataTransfer)==null||s.setData("task_id",D.id),(_=g.dataTransfer)==null||_.setData("estimate_hours",String(D.estimate_hours??1))}function i(D,g){g.preventDefault(),r.value=P(D)}function l(){r.value=null}async function d(D,g){var le,fe;g.preventDefault(),r.value=null,e.value=null;const s=(le=g.dataTransfer)==null?void 0:le.getData("task_id"),_=parseFloat(((fe=g.dataTransfer)==null?void 0:fe.getData("estimate_hours"))??"1")||1;if(!s)return;const b=g.currentTarget.getBoundingClientRect(),O=g.clientY-b.top,ie=ge(O/Z,15),ne=Math.max(0,Math.min(ie,12*60)),N=new Date(D);N.setHours(Kt,0,0,0),N.setMinutes(N.getMinutes()+ne);const re=new Date(N);re.setMinutes(re.getMinutes()+Math.round(_*60));const ue=N.toISOString(),ce=re.toISOString(),de=`temp_${Date.now()}`,Ce={kind:"planned",id:de,project_id:null,job_number:"",display_name:"Loading...",start_at:ue,end_at:ce,title:"",color_hue:260,tags:[],task_id:s,session_id:null,manual_entry_id:null};n.addBlock(Ce);try{await t.createBlock(s,{start_at:ue,end_at:ce}),await n.fetchCurrentView()}catch(We){n.removeBlock(de),console.error("Failed to create task block:",We)}}let u=0,h="",m=null;function p(D,g){g.preventDefault(),g.stopPropagation(),a.value=D,m=D,u=g.clientY,h=D.end_at,o.value=D.end_at;const s=x=>{if(!m)return;const b=x.clientY-u,O=ge(b/Z,15),ne=new Date(h).getTime()+O*6e4,N=new Date(m.start_at).getTime()+15*6e4;o.value=new Date(Math.max(ne,N)).toISOString()},_=async()=>{if(document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",_),!m||!o.value){a.value=null;return}const x=m.id,b=o.value;if(b===h){a.value=null,o.value=null;return}try{m.task_id&&await t.updateBlock(x,{end_at:b}),n.updateBlock({...m,end_at:b})}catch(O){console.error("Failed to resize block:",O),n.updateBlock({...m,end_at:h})}a.value=null,o.value=null,m=null};document.addEventListener("mousemove",s),document.addEventListener("mouseup",_)}return{draggingTaskId:e,dragOverDay:r,resizingBlock:a,resizePreviewEnd:o,onDragStart:c,onDragOver:i,onDragLeave:l,onDrop:d,onResizeStart:p}}function Zt(t){return`hsla(${t}, 65%, 45%, 0.85)`}function en(t){return`hsla(${t}, 65%, 55%, 1)`}const tn={class:"px-1.5 py-1 h-full flex flex-col text-white overflow-hidden"},nn={class:"text-xs font-semibold leading-tight truncate"},rn={key:0,class:"text-xs opacity-75 truncate"},an={key:1,class:"text-xs opacity-75 mt-auto"},on=G({__name:"CalendarBlock",props:{block:{},lane:{},totalLanes:{},top:{},height:{},resizeEnd:{}},emits:["resizeStart","click"],setup(t,{emit:n}){const e=t,r=n,a=W(()=>e.resizeEnd?new Date(e.resizeEnd):new Date(e.block.end_at)),o=W(()=>{if(!e.resizeEnd)return e.height;const u=(a.value.getTime()-new Date(e.block.start_at).getTime())/6e4;return Math.max(u*(40/30),20)}),c=W(()=>{const d=a.value.getTime()-new Date(e.block.start_at).getTime();return U(d/36e5)}),i=W(()=>{const d=`calc(${100/e.totalLanes}% - 2px)`,u=`calc(${e.lane/e.totalLanes*100}% + 1px)`;return{top:`${e.top}px`,height:`${o.value}px`,width:d,left:u,backgroundColor:Zt(e.block.color_hue),borderColor:en(e.block.color_hue)}}),l=W(()=>o.value<40);return(d,u)=>(w(),v("div",{class:q(["absolute rounded overflow-hidden cursor-pointer select-none group",{"border-2":t.block.kind==="session","border-2 border-dashed opacity-80":t.block.kind==="planned","border-2 calendar-block--manual":t.block.kind==="manual"}]),style:j(i.value),onClick:u[1]||(u[1]=h=>r("click",t.block))},[f("div",tn,[f("p",nn,M(t.block.display_name),1),!l.value&&t.block.job_number?(w(),v("p",rn,M(t.block.job_number),1)):T("",!0),l.value?T("",!0):(w(),v("p",an,M(c.value),1))]),f("div",{class:"absolute bottom-0 left-0 right-0 h-2 cursor-s-resize opacity-0 group-hover:opacity-100 flex items-center justify-center",onMousedown:u[0]||(u[0]=De(h=>r("resizeStart",h),["stop"]))},[...u[2]||(u[2]=[f("div",{class:"w-8 h-0.5 bg-white/60 rounded"},null,-1)])],32)],6))}}),sn=$e(on,[["__scopeId","data-v-5829880c"]]),un={class:"flex overflow-auto h-full"},cn={class:"flex flex-1 gap-px min-w-0"},dn=["onDragover","onDrop"],ln={key:1,class:"absolute inset-0 bg-primary/10 pointer-events-none z-0"},Y=7,oe=19,V=40,fn=G({__name:"CalendarGrid",emits:["blockClick"],setup(t,{emit:n}){const e=Array.from({length:oe-Y+1},(p,D)=>Y+D),r=J(),a=Oe(),o=n,c=W(()=>r.view==="week"?r.weekDays:[r.currentDate]),i=P(new Date);function l(p){const D=r.getBlocksForDay(p);return Le(D)}function d(p){return je(new Date(p.start_at),Y)}function u(p){return He(new Date(p.start_at),new Date(p.end_at))}function h(p){var D;return((D=a.resizingBlock.value)==null?void 0:D.id)===p.id}function m(p){return p===12?"12 PM":p>12?`${p-12} PM`:`${p} AM`}return(p,D)=>(w(),v("div",un,[f("div",{class:"w-12 shrink-0 relative",style:j({height:`${(oe-Y+1)*V*2}px`})},[(w(!0),v(F,null,B(y(e),g=>(w(),v("div",{key:g,class:"absolute right-2 text-xs text-muted-foreground",style:j({top:`${(g-Y)*V*2-6}px`})},M(m(g)),5))),128))],4),f("div",cn,[(w(!0),v(F,null,B(c.value,g=>(w(),v("div",{key:y(P)(g),class:q(["flex-1 relative border-l border-border",{"bg-primary/5":y(P)(g)===y(i)}]),style:j({height:`${(oe-Y)*V*2}px`}),onDragover:s=>y(a).onDragOver(g,s),onDragleave:D[0]||(D[0]=s=>y(a).onDragLeave()),onDrop:s=>y(a).onDrop(g,s)},[y(r).view==="week"?(w(),v("div",{key:0,class:q(["sticky top-0 z-10 text-center py-1 text-xs font-medium border-b border-border bg-background",y(P)(g)===y(i)?"text-primary":"text-muted-foreground"])},[f("div",null,M(y(H)(g,"EEE")),1),f("div",{class:q(["inline-flex h-6 w-6 mx-auto items-center justify-center rounded-full text-sm",y(P)(g)===y(i)?"bg-primary text-primary-foreground":""])},M(y(H)(g,"d")),3)],2)):T("",!0),(w(!0),v(F,null,B(y(e),s=>(w(),v("div",{key:s,class:"absolute left-0 right-0 border-t border-border/40",style:j({top:`${(s-Y)*V*2}px`})},null,4))),128)),(w(!0),v(F,null,B(y(e).slice(0,-1),s=>(w(),v("div",{key:`half-${s}`,class:"absolute left-0 right-0 border-t border-border/20",style:j({top:`${(s-Y)*V*2+V}px`})},null,4))),128)),y(a).dragOverDay.value===y(P)(g)?(w(),v("div",ln)):T("",!0),(w(!0),v(F,null,B(l(g),({block:s,lane:_,totalLanes:x})=>(w(),Ye(sn,{key:s.id,block:s,lane:_,"total-lanes":x,top:d(s),height:u(s),"resize-end":h(s)?y(a).resizePreviewEnd.value:null,onClick:b=>o("blockClick",s),onResizeStart:b=>y(a).onResizeStart(s,b)},null,8,["block","lane","total-lanes","top","height","resize-end","onClick","onResizeStart"]))),128))],46,dn))),128))])]))}}),mn={class:"flex flex-col h-full bg-card border-l border-border"},hn={class:"p-3 border-b border-border flex items-center justify-between shrink-0"},gn={class:"flex-1 overflow-y-auto p-2 space-y-1.5"},wn={key:0,class:"text-xs text-muted-foreground p-2"},vn={key:1,class:"text-xs text-muted-foreground p-2 text-center"},yn=["onDragstart"],bn={class:"flex items-start gap-2"},kn={class:"flex-1 min-w-0"},xn={class:"text-xs font-medium text-foreground leading-tight truncate"},pn={class:"flex items-center gap-1.5 mt-1 flex-wrap"},Dn={key:0,class:"text-xs text-muted-foreground"},_n={key:0,class:"p-3 border-t border-border shrink-0"},Mn={class:"space-y-1"},Pn={class:"text-muted-foreground truncate max-w-[100px]"},Sn={class:"text-foreground"},Tn=G({__name:"PlannerSidebar",emits:["createTask"],setup(t,{emit:n}){const e=se(),r=J(),a=Oe(),o=n,c=W(()=>P(r.currentDate));_e(()=>{e.fetchForDate(c.value)});const i=u=>({todo:"outline",doing:"default",done:"success",cancelled:"secondary"})[u],l=u=>u>=4?"bg-red-500":u===3?"bg-amber-500":"bg-emerald-500",d=W(()=>{const u={};for(const h of e.tasks){const m=h.project_id??"_none";u[m]||(u[m]={name:h.project_id?m:"No Project",planned:0,actual:0}),u[m].planned+=h.estimate_hours??0,u[m].actual+=h.actual_hours??0}return Object.values(u)});return(u,h)=>(w(),v("div",mn,[f("div",hn,[h[2]||(h[2]=f("h3",{class:"text-sm font-semibold text-foreground"},"Planner",-1)),E(K,{size:"sm",variant:"ghost",onClick:h[0]||(h[0]=m=>o("createTask"))},{default:Q(()=>[...h[1]||(h[1]=[f("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[f("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1)])]),_:1})]),f("div",gn,[y(e).loading?(w(),v("div",wn,"Loading...")):y(e).tasks.length===0?(w(),v("div",vn," No tasks for today ")):T("",!0),(w(!0),v(F,null,B(y(e).tasks,m=>(w(),v("div",{key:m.id,class:"rounded-md border border-border bg-background p-2 cursor-grab active:cursor-grabbing hover:border-primary/50 transition-colors",draggable:"true",onDragstart:p=>y(a).onDragStart(m,p)},[f("div",bn,[f("div",{class:q(["h-2 w-2 rounded-full mt-1.5 shrink-0",l(m.priority)])},null,2),f("div",kn,[f("p",xn,M(m.title),1),f("div",pn,[E(Ne,{variant:i(m.status),class:"text-xs py-0"},{default:Q(()=>[pe(M(m.status),1)]),_:2},1032,["variant"]),m.estimate_hours?(w(),v("span",Dn,M(y(U)(m.estimate_hours)),1)):T("",!0)])])])],40,yn))),128))]),d.value.length?(w(),v("div",_n,[h[3]||(h[3]=f("p",{class:"text-xs font-medium text-muted-foreground mb-2"},"Plan vs Actual",-1)),f("div",Mn,[(w(!0),v(F,null,B(d.value,m=>(w(),v("div",{key:m.name,class:"flex items-center justify-between text-xs"},[f("span",Pn,M(m.name),1),f("span",Sn,M(y(U)(m.planned))+" / "+M(y(U)(m.actual)),1)]))),128))])])):T("",!0)]))}}),On={class:"h-full flex flex-col"},Cn={class:"p-4 border-b border-border flex items-center gap-3 flex-wrap"},Wn={class:"flex items-center gap-2 ml-auto"},En={class:"flex-1 flex overflow-hidden"},$n={class:"flex-1 overflow-auto"},Yn={key:0,class:"w-56 shrink-0 overflow-hidden"},Fn={class:"bg-card border border-border rounded-lg shadow-xl p-4 w-72"},Bn={class:"flex items-start justify-between gap-2 mb-3"},Nn={class:"font-semibold text-sm text-foreground"},Ln={key:0,class:"text-xs text-muted-foreground"},jn={class:"space-y-1 text-xs text-muted-foreground"},Hn={key:0,class:"mt-2 flex flex-wrap gap-1"},Jn=G({__name:"CalendarView",setup(t){const n=J(),e=se(),r=S(!0),a=S(!1),o=S(null);_e(()=>{n.fetchCurrentView()});function c(l){o.value=l}async function i(l){try{await e.create(l),me.success("Task created"),a.value=!1,e.fetchForDate(P(n.currentDate))}catch{me.error("Failed to create task")}}return(l,d)=>(w(),v("div",On,[f("div",Cn,[E(Ut),f("div",Wn,[f("button",{class:"text-xs text-muted-foreground hover:text-foreground transition-colors",onClick:d[0]||(d[0]=u=>r.value=!r.value)},M(r.value?"Hide Planner":"Show Planner"),1)])]),f("div",En,[f("div",$n,[E(fn,{onBlockClick:c})]),r.value?(w(),v("div",Yn,[E(Tn,{onCreateTask:d[1]||(d[1]=u=>a.value=!0)})])):T("",!0)]),o.value?(w(),v("div",{key:0,class:"fixed inset-0 z-40 flex items-center justify-center p-4",onClick:d[3]||(d[3]=De(u=>o.value=null,["self"]))},[f("div",Fn,[f("div",Bn,[f("div",null,[f("p",Nn,M(o.value.display_name),1),o.value.job_number?(w(),v("p",Ln,M(o.value.job_number),1)):T("",!0)]),f("button",{class:"text-muted-foreground hover:text-foreground",onClick:d[2]||(d[2]=u=>o.value=null)},[...d[5]||(d[5]=[f("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[f("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),f("div",jn,[f("p",null,"Start: "+M(new Date(o.value.start_at).toLocaleString()),1),f("p",null,"End: "+M(new Date(o.value.end_at).toLocaleString()),1),f("p",null,"Type: "+M(o.value.kind),1)]),o.value.tags.length?(w(),v("div",Hn,[(w(!0),v(F,null,B(o.value.tags,u=>(w(),v("span",{key:u.id,class:"px-1.5 py-0.5 rounded text-xs",style:j({background:`${u.color_hex}22`,color:u.color_hex})},M(u.name),5))),128))])):T("",!0)])])):T("",!0),E(Be,{open:a.value,"default-date":y(P)(y(n).currentDate),onClose:d[4]||(d[4]=u=>a.value=!1),onSave:i},null,8,["open","default-date"])]))}});export{Jn as default}; diff --git a/src/static/assets/CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js b/src/static/assets/CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js similarity index 73% rename from src/static/assets/CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js rename to src/static/assets/CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js index 77b99e5..a04784f 100644 --- a/src/static/assets/CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js +++ b/src/static/assets/CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js @@ -1 +1 @@ -import{c as e}from"./utils-B1YxgOQw.js";import{d as o,c as t,p as n,i as c,s as p,o as l}from"./index-CO3lBHVT.js";const _=o({__name:"Card",props:{class:{}},setup(s){const a=s;return(r,d)=>(l(),t("div",{class:n(c(e)("rounded-lg border bg-card text-card-foreground shadow-sm",a.class))},[p(r.$slots,"default")],2))}}),f=o({__name:"CardContent",props:{class:{}},setup(s){const a=s;return(r,d)=>(l(),t("div",{class:n(c(e)("p-6 pt-0",a.class))},[p(r.$slots,"default")],2))}});export{_,f as a}; +import{c as e}from"./utils-DuVQys2y.js";import{d as o,c as t,p as n,i as c,s as p,o as l}from"./index-B9hhyP-T.js";const _=o({__name:"Card",props:{class:{}},setup(s){const a=s;return(r,d)=>(l(),t("div",{class:n(c(e)("rounded-lg border bg-card text-card-foreground shadow-sm",a.class))},[p(r.$slots,"default")],2))}}),f=o({__name:"CardContent",props:{class:{}},setup(s){const a=s;return(r,d)=>(l(),t("div",{class:n(c(e)("p-6 pt-0",a.class))},[p(r.$slots,"default")],2))}});export{_,f as a}; diff --git a/src/static/assets/CardTitle.vue_vue_type_script_setup_true_lang-CpgNrOxB.js b/src/static/assets/CardTitle.vue_vue_type_script_setup_true_lang-Twj0MqtU.js similarity index 75% rename from src/static/assets/CardTitle.vue_vue_type_script_setup_true_lang-CpgNrOxB.js rename to src/static/assets/CardTitle.vue_vue_type_script_setup_true_lang-Twj0MqtU.js index e1e9f64..5d83f69 100644 --- a/src/static/assets/CardTitle.vue_vue_type_script_setup_true_lang-CpgNrOxB.js +++ b/src/static/assets/CardTitle.vue_vue_type_script_setup_true_lang-Twj0MqtU.js @@ -1 +1 @@ -import{c as t}from"./utils-B1YxgOQw.js";import{d as o,o as n,c as r,p as c,i as l,s as p}from"./index-CO3lBHVT.js";const f=o({__name:"CardHeader",props:{class:{}},setup(s){const e=s;return(a,i)=>(n(),r("div",{class:c(l(t)("flex flex-col space-y-1.5 p-6",e.class))},[p(a.$slots,"default")],2))}}),_=o({__name:"CardTitle",props:{class:{}},setup(s){const e=s;return(a,i)=>(n(),r("h3",{class:c(l(t)("text-lg font-semibold leading-none tracking-tight",e.class))},[p(a.$slots,"default")],2))}});export{f as _,_ as a}; +import{c as t}from"./utils-DuVQys2y.js";import{d as o,o as n,c as r,p as c,i as l,s as p}from"./index-B9hhyP-T.js";const f=o({__name:"CardHeader",props:{class:{}},setup(s){const e=s;return(a,i)=>(n(),r("div",{class:c(l(t)("flex flex-col space-y-1.5 p-6",e.class))},[p(a.$slots,"default")],2))}}),_=o({__name:"CardTitle",props:{class:{}},setup(s){const e=s;return(a,i)=>(n(),r("h3",{class:c(l(t)("text-lg font-semibold leading-none tracking-tight",e.class))},[p(a.$slots,"default")],2))}});export{f as _,_ as a}; diff --git a/src/static/assets/DashboardView-C9SpkquZ.js b/src/static/assets/DashboardView-C9SpkquZ.js new file mode 100644 index 0000000..e6cd475 --- /dev/null +++ b/src/static/assets/DashboardView-C9SpkquZ.js @@ -0,0 +1 @@ +import{d as L,n as O,w as i,p as u,m as M,o,a as e,e as d,t as g,c as s,j as D,k as w,v as Q,x as X,F as v,l as x,y as E,z as K,i as _,r as h,A as p}from"./index-B9hhyP-T.js";import{d as $}from"./dashboard-DFJs0AgU.js";import{_ as C,a as B}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import{_ as F,a as P}from"./CardTitle.vue_vue_type_script_setup_true_lang-Twj0MqtU.js";import{_ as Y}from"./Progress.vue_vue_type_script_setup_true_lang-o01-BFVV.js";import{_ as Z}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import{f as j,i as W}from"./utils-DuVQys2y.js";const ee={class:"flex items-start justify-between gap-2"},te={class:"flex-1 min-w-0"},le={class:"mt-2"},oe={key:0,class:"h-7 w-20 bg-muted animate-pulse rounded"},se={key:0,class:"text-xs text-muted-foreground mt-1.5 truncate"},re={key:0,class:"mt-3 flex items-center gap-1.5 text-xs"},ae={class:"h-3 w-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},ne={key:0,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 10l7-7m0 0l7 7m-7-7v18"},de={key:1,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M19 14l-7 7m0 0l-7-7m7 7V3"},ie={key:2,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 12h14"},k=L({__name:"KpiCard",props:{label:{},value:{},icon:{},trend:{},description:{},loading:{type:Boolean},hero:{type:Boolean}},setup(r){const m=r,y=M(()=>m.hero?"relative overflow-hidden transition-all duration-200 border-primary/20 bg-primary/5 ring-1 ring-primary/15 panel-glow-hover":"relative overflow-hidden transition-all duration-200 border-border/60 panel-glow-hover");return(b,a)=>(o(),O(C,{class:u(y.value)},{default:i(()=>[e("span",{class:u(["pointer-events-none absolute -right-4 -top-4 h-14 w-14 rounded-full",r.hero?"bg-primary/10":"bg-primary/5"])},null,2),e("span",{class:u(["pointer-events-none absolute -right-1 -top-1 h-6 w-6 rounded-full",r.hero?"bg-primary/15":"bg-primary/8"])},null,2),d(B,{class:"p-5"},{default:i(()=>[e("div",ee,[e("div",te,[e("p",{class:u(["text-[10px] font-semibold uppercase tracking-[0.1em] truncate",r.hero?"text-primary/80":"text-muted-foreground"])},g(r.label),3),e("div",le,[r.loading?(o(),s("div",oe)):(o(),s("p",{key:1,class:u(["kpi-value font-bold tracking-tight leading-none",r.hero?"text-3xl text-primary":"text-2xl text-foreground"])},g(r.value),3))]),r.description?(o(),s("p",se,g(r.description),1)):D("",!0)]),r.icon?(o(),s("div",{key:0,class:u(["rounded-xl flex items-center justify-center shrink-0",[r.hero?"h-11 w-11 bg-primary/15 ring-1 ring-primary/25":"h-9 w-9 bg-muted ring-1 ring-border"]])},[r.icon==="clock"?(o(),s("svg",{key:0,class:u(["shrink-0",r.hero?"h-5 w-5 text-primary":"h-4 w-4 text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...a[0]||(a[0]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])],2)):r.icon==="calendar"?(o(),s("svg",{key:1,class:u(["shrink-0",r.hero?"h-5 w-5 text-primary":"h-4 w-4 text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...a[1]||(a[1]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"},null,-1)])],2)):r.icon==="folder"?(o(),s("svg",{key:2,class:u(["shrink-0",r.hero?"h-5 w-5 text-primary":"h-4 w-4 text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...a[2]||(a[2]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 7a2 2 0 012-2h3.586a1 1 0 01.707.293l1.414 1.414A1 1 0 0011.414 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V7z"},null,-1)])],2)):r.icon==="trending-up"?(o(),s("svg",{key:3,class:u(["shrink-0",r.hero?"h-5 w-5 text-primary":"h-4 w-4 text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...a[3]||(a[3]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"},null,-1)])],2)):r.icon==="git"?(o(),s("svg",{key:4,class:u(["shrink-0",r.hero?"h-5 w-5 text-primary":"h-4 w-4 text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...a[4]||(a[4]=[e("circle",{cx:"12",cy:"12",r:"4",stroke:"currentColor","stroke-width":"2"},null,-1),e("path",{"stroke-linecap":"round","stroke-width":"2",d:"M2 12h6M16 12h6"},null,-1)])],2)):(o(),s("svg",{key:5,class:u(["shrink-0",r.hero?"h-5 w-5 text-primary":"h-4 w-4 text-muted-foreground"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...a[5]||(a[5]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"},null,-1)])],2))],2)):D("",!0)]),r.trend!==void 0?(o(),s("div",re,[e("div",{class:u(["flex items-center gap-1 font-semibold tabular-nums",r.trend>0?"text-[hsl(var(--success))]":r.trend<0?"text-destructive":"text-muted-foreground"])},[(o(),s("svg",ae,[r.trend>0?(o(),s("path",ne)):r.trend<0?(o(),s("path",de)):(o(),s("path",ie))])),w(" "+g(r.trend>0?"+":"")+g(Math.abs(r.trend))+"% ",1)],2),a[6]||(a[6]=e("span",{class:"text-muted-foreground"},"vs last period",-1))])):D("",!0),e("div",{class:u(["mt-3 h-px rounded-full",r.hero?"w-full bg-primary/20":"w-10 bg-primary/20"])},null,2)]),_:1})]),_:1},8,["class"]))}}),ue={class:"p-6 space-y-6"},ce={class:"flex flex-wrap items-center gap-3"},me={class:"flex items-center rounded-lg border border-border overflow-hidden bg-muted/30"},ge=["onClick"],fe={class:"grid grid-cols-2 md:grid-cols-3 xl:grid-cols-6 gap-4"},ve={class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},xe={key:0,class:"h-40 flex items-end gap-px"},he={key:1,class:"h-40 flex flex-col items-center justify-center gap-2"},pe={key:2,class:"h-40 flex items-end gap-px"},ye=["title"],ke={key:0,class:"h-40 flex items-end gap-2"},we={key:1,class:"h-40 flex flex-col items-center justify-center gap-2"},be={key:2,class:"h-40 flex items-end gap-2"},_e=["title"],$e={class:"text-[10px] text-muted-foreground font-medium"},je={class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},Me={key:0,class:"space-y-3"},Ce={key:1,class:"flex flex-col items-center justify-center py-8 gap-2"},Be={key:2,class:"space-y-2.5"},De={class:"text-xs text-foreground w-24 truncate shrink-0 tabular-nums"},Ve={class:"flex-1 h-1.5 bg-muted rounded-full overflow-hidden"},ze={class:"text-xs text-muted-foreground w-9 text-right shrink-0 tabular-nums"},He={key:0,class:"space-y-3"},Ne={class:"flex justify-between"},Te={key:1,class:"flex flex-col items-center justify-center py-8 gap-2"},Ae={key:2,class:"space-y-2.5"},Fe={class:"flex items-center justify-between text-xs mb-1"},Pe={class:"text-foreground truncate max-w-[160px] font-medium"},Se={class:"text-muted-foreground shrink-0 tabular-nums ml-2"},Ge=L({__name:"DashboardView",setup(r){const m=h("today"),y=h(""),b=h(""),a=h(null),S=h([]),V=h([]),z=h([]),H=h([]),c=h(!1),R=M(()=>{const n=new Date,t=W(n);if(m.value==="today")return{from:t,to:t};if(m.value==="7d"){const f=new Date(n);return f.setDate(n.getDate()-7),{from:W(f),to:t}}else if(m.value==="30d"){const f=new Date(n);return f.setDate(n.getDate()-30),{from:W(f),to:t}}else return{from:y.value||t,to:b.value||t}});async function U(){if(!(m.value==="custom"&&(!y.value||!b.value))){c.value=!0;try{const n=R.value,[t,f,N,T,A]=await Promise.all([$.summary(n),$.projects(n),$.monthly(n),$.dow(n),$.tools(n)]);a.value=t.data,S.value=f.data,V.value=N.data,z.value=T.data,H.value=A.data}catch(n){console.error("Failed to load dashboard data",n)}finally{c.value=!1}}}Q(m,()=>{m.value!=="custom"&&U()}),X(()=>U());const q=M(()=>Math.max(...V.value.map(n=>n.hours),1)),G=M(()=>Math.max(...z.value.map(n=>n.hours),1)),I=M(()=>Math.max(...H.value.map(n=>n.pct),1)),J=n=>n?n>90?"danger":n>70?"warning":"success":"default";return(n,t)=>{var f,N,T,A;return o(),s("div",ue,[e("div",ce,[t[4]||(t[4]=e("h2",{class:"text-base font-semibold text-foreground flex-1 tracking-tight"},"Overview",-1)),e("div",me,[(o(),s(v,null,x(["today","7d","30d","custom"],l=>e("button",{key:l,class:u(["px-3 py-1.5 text-xs font-medium transition-colors",m.value===l?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted/50"]),onClick:Ue=>m.value=l},g(l==="today"?"Today":l==="7d"?"7 days":l==="30d"?"30 days":"Custom"),11,ge)),64))]),m.value==="custom"?(o(),s(v,{key:0},[E(e("input",{"onUpdate:modelValue":t[0]||(t[0]=l=>y.value=l),type:"date",class:"h-8 rounded-lg border border-input bg-muted/30 px-2 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-ring"},null,512),[[K,y.value]]),t[3]||(t[3]=e("span",{class:"text-xs text-muted-foreground"},"to",-1)),E(e("input",{"onUpdate:modelValue":t[1]||(t[1]=l=>b.value=l),type:"date",class:"h-8 rounded-lg border border-input bg-muted/30 px-2 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-ring"},null,512),[[K,b.value]]),d(Z,{size:"sm",loading:c.value,onClick:U},{default:i(()=>[...t[2]||(t[2]=[w("Apply",-1)])]),_:1},8,["loading"])],64)):D("",!0)]),e("div",fe,[d(k,{label:"Total Hours",value:a.value?_(j)(a.value.total_hours):"—",icon:"clock",loading:c.value,hero:!0},null,8,["value","loading"]),d(k,{label:"Working Days",value:((f=a.value)==null?void 0:f.working_days)??"—",icon:"calendar",loading:c.value},null,8,["value","loading"]),d(k,{label:"Projects",value:((N=a.value)==null?void 0:N.total_projects)??"—",icon:"folder",loading:c.value},null,8,["value","loading"]),d(k,{label:"Avg / Day",value:a.value?_(j)(a.value.avg_hours_per_day):"—",icon:"trending-up",loading:c.value},null,8,["value","loading"]),d(k,{label:"Top Project",value:((T=a.value)==null?void 0:T.top_project)??"—",icon:"star",loading:c.value},null,8,["value","loading"]),d(k,{label:"Commits",value:((A=a.value)==null?void 0:A.total_commits)??"—",icon:"git",loading:c.value},null,8,["value","loading"])]),e("div",ve,[d(C,{class:"border-border/60 bg-card panel-glow"},{default:i(()=>[d(F,{class:"pb-2"},{default:i(()=>[d(P,{class:"text-xs font-semibold text-muted-foreground uppercase tracking-widest"},{default:i(()=>[...t[5]||(t[5]=[w("Hours by Day",-1)])]),_:1})]),_:1}),d(B,null,{default:i(()=>[c.value?(o(),s("div",xe,[(o(),s(v,null,x(30,l=>e("div",{key:l,class:"flex-1 bg-muted animate-pulse rounded-t",style:p({height:`${20+Math.random()*60}%`})},null,4)),64))])):V.value.length===0?(o(),s("div",he,[...t[6]||(t[6]=[e("svg",{class:"h-8 w-8 text-muted-foreground/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"})],-1),e("p",{class:"text-xs text-muted-foreground"},"No sessions in this period",-1)])])):(o(),s("div",pe,[(o(!0),s(v,null,x(V.value,l=>(o(),s("div",{key:l.date,class:"flex-1 flex flex-col items-center group",title:`${l.date}: ${_(j)(l.hours)}`},[e("div",{class:"w-full bg-primary/40 hover:bg-primary rounded-t transition-colors duration-150",style:p({height:`${l.hours/q.value*100}%`,minHeight:"2px"})},null,4)],8,ye))),128))]))]),_:1})]),_:1}),d(C,{class:"border-border/60 bg-card panel-glow"},{default:i(()=>[d(F,{class:"pb-2"},{default:i(()=>[d(P,{class:"text-xs font-semibold text-muted-foreground uppercase tracking-widest"},{default:i(()=>[...t[7]||(t[7]=[w("By Day of Week",-1)])]),_:1})]),_:1}),d(B,null,{default:i(()=>[c.value?(o(),s("div",ke,[(o(),s(v,null,x(7,l=>e("div",{key:l,class:"flex-1 flex flex-col items-center gap-1"},[e("div",{class:"w-full bg-muted animate-pulse rounded-t",style:p({height:`${30+l*8}%`})},null,4),t[8]||(t[8]=e("div",{class:"h-3 w-4 bg-muted animate-pulse rounded"},null,-1))])),64))])):z.value.length===0?(o(),s("div",we,[...t[9]||(t[9]=[e("svg",{class:"h-8 w-8 text-muted-foreground/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})],-1),e("p",{class:"text-xs text-muted-foreground"},"No sessions in this period",-1)])])):(o(),s("div",be,[(o(!0),s(v,null,x(z.value,l=>(o(),s("div",{key:l.dow,class:"flex-1 flex flex-col items-center gap-1"},[e("div",{class:"w-full bg-primary/40 hover:bg-primary rounded-t transition-colors duration-150",style:p({height:`${Math.max(l.hours/G.value*100,2)}%`}),title:`${l.label}: ${_(j)(l.hours)}`},null,12,_e),e("span",$e,g(l.label.slice(0,2)),1)]))),128))]))]),_:1})]),_:1})]),e("div",je,[d(C,{class:"border-border/60 bg-card panel-glow"},{default:i(()=>[d(F,{class:"pb-2"},{default:i(()=>[d(P,{class:"text-xs font-semibold text-muted-foreground uppercase tracking-widest"},{default:i(()=>[...t[10]||(t[10]=[w("Tool Usage",-1)])]),_:1})]),_:1}),d(B,null,{default:i(()=>[c.value?(o(),s("div",Me,[(o(),s(v,null,x(5,l=>e("div",{key:l,class:"flex items-center gap-2"},[e("div",{class:"h-3 rounded bg-muted animate-pulse",style:p({width:`${40+l*10}px`})},null,4),t[11]||(t[11]=e("div",{class:"flex-1 h-2 bg-muted animate-pulse rounded-full"},null,-1)),t[12]||(t[12]=e("div",{class:"h-3 w-8 bg-muted animate-pulse rounded"},null,-1))])),64))])):H.value.length===0?(o(),s("div",Ce,[...t[13]||(t[13]=[e("svg",{class:"h-8 w-8 text-muted-foreground/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"})],-1),e("p",{class:"text-xs text-muted-foreground"},"No tool data yet",-1)])])):(o(),s("div",Be,[(o(!0),s(v,null,x(H.value.slice(0,8),l=>(o(),s("div",{key:l.tool,class:"flex items-center gap-2.5"},[e("span",De,g(l.tool),1),e("div",Ve,[e("div",{class:"h-full bg-primary/70 rounded-full transition-all duration-300",style:p({width:`${l.pct/I.value*100}%`})},null,4)]),e("span",ze,g((l.pct??0).toFixed(0))+"% ",1)]))),128))]))]),_:1})]),_:1}),d(C,{class:"border-border/60 bg-card panel-glow"},{default:i(()=>[d(F,{class:"pb-2"},{default:i(()=>[d(P,{class:"text-xs font-semibold text-muted-foreground uppercase tracking-widest"},{default:i(()=>[...t[14]||(t[14]=[w("Projects",-1)])]),_:1})]),_:1}),d(B,null,{default:i(()=>[c.value?(o(),s("div",He,[(o(),s(v,null,x(5,l=>e("div",{key:l,class:"space-y-1.5"},[e("div",Ne,[e("div",{class:"h-3 rounded bg-muted animate-pulse",style:p({width:`${80+l*15}px`})},null,4),t[15]||(t[15]=e("div",{class:"h-3 w-12 bg-muted animate-pulse rounded"},null,-1))]),t[16]||(t[16]=e("div",{class:"h-1.5 bg-muted animate-pulse rounded-full"},null,-1))])),64))])):S.value.length===0?(o(),s("div",Te,[...t[17]||(t[17]=[e("svg",{class:"h-8 w-8 text-muted-foreground/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M3 7a2 2 0 012-2h3.586a1 1 0 01.707.293l1.414 1.414A1 1 0 0011.414 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V7z"})],-1),e("p",{class:"text-xs text-muted-foreground"},"No project data yet",-1)])])):(o(),s("div",Ae,[(o(!0),s(v,null,x(S.value.slice(0,8),l=>(o(),s("div",{key:l.project_id},[e("div",Fe,[e("span",Pe,g(l.display_name),1),e("span",Se,g(_(j)(l.total_hours)),1)]),l.progress_pct!==null?(o(),O(Y,{key:0,value:l.progress_pct,color:J(l.progress_pct)},null,8,["value","color"])):D("",!0)]))),128))]))]),_:1})]),_:1})])])}}});export{Ge as default}; diff --git a/src/static/assets/DashboardView-CQAK2qP6.js b/src/static/assets/DashboardView-CQAK2qP6.js deleted file mode 100644 index 25ef111..0000000 --- a/src/static/assets/DashboardView-CQAK2qP6.js +++ /dev/null @@ -1 +0,0 @@ -import{d as E,n as K,w as i,o as e,a as s,e as r,t as c,c as t,j,k as y,p as O,v as Q,x as X,F as x,l as h,y as U,z as W,i as k,r as g,m as N,A as S}from"./index-CO3lBHVT.js";import{d as _}from"./dashboard-4_z0ZWLj.js";import{_ as b,a as $}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import{_ as T,a as A}from"./CardTitle.vue_vue_type_script_setup_true_lang-CpgNrOxB.js";import{_ as Y}from"./Progress.vue_vue_type_script_setup_true_lang-C9HXKxSB.js";import{_ as Z}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import{f as w,i as L}from"./utils-B1YxgOQw.js";const ee={class:"flex items-start justify-between gap-2"},te={class:"flex-1 min-w-0"},se={class:"text-[11px] text-muted-foreground font-semibold uppercase tracking-widest truncate"},oe={class:"mt-1.5"},le={key:0,class:"h-8 w-24 bg-muted animate-pulse rounded"},ae={key:1,class:"text-2xl font-bold text-foreground tracking-tight"},ne={key:0,class:"text-xs text-muted-foreground mt-1 truncate"},re={key:0,class:"h-10 w-10 rounded-xl bg-primary/10 ring-1 ring-primary/20 flex items-center justify-center shrink-0"},de={key:0,class:"h-5 w-5 text-primary",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},ie={key:1,class:"h-5 w-5 text-primary",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},ue={key:2,class:"h-5 w-5 text-primary",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},ce={key:3,class:"h-5 w-5 text-primary",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},me={key:4,class:"h-5 w-5 text-primary",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},ve={key:5,class:"h-5 w-5 text-primary",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},fe={key:0,class:"mt-3 flex items-center gap-1.5 text-xs"},ge={class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},xe={key:0,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 10l7-7m0 0l7 7m-7-7v18"},he={key:1,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M19 14l-7 7m0 0l-7-7m7 7V3"},pe={key:2,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 12h14"},p=E({__name:"KpiCard",props:{label:{},value:{},icon:{},trend:{},description:{},loading:{type:Boolean}},setup(d){return(m,a)=>(e(),K(b,{class:"relative overflow-hidden transition-all duration-200 hover:shadow-md hover:-translate-y-px"},{default:i(()=>[a[8]||(a[8]=s("span",{class:"pointer-events-none absolute -right-6 -top-6 h-16 w-16 rounded-full bg-primary/5"},null,-1)),a[9]||(a[9]=s("span",{class:"pointer-events-none absolute -right-2 -top-2 h-8 w-8 rounded-full bg-primary/8"},null,-1)),r($,{class:"p-5"},{default:i(()=>[s("div",ee,[s("div",te,[s("p",se,c(d.label),1),s("div",oe,[d.loading?(e(),t("div",le)):(e(),t("p",ae,c(d.value),1))]),d.description?(e(),t("p",ne,c(d.description),1)):j("",!0)]),d.icon?(e(),t("div",re,[d.icon==="clock"?(e(),t("svg",de,[...a[0]||(a[0]=[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])):d.icon==="calendar"?(e(),t("svg",ie,[...a[1]||(a[1]=[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"},null,-1)])])):d.icon==="folder"?(e(),t("svg",ue,[...a[2]||(a[2]=[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 7a2 2 0 012-2h3.586a1 1 0 01.707.293l1.414 1.414A1 1 0 0011.414 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V7z"},null,-1)])])):d.icon==="trending-up"?(e(),t("svg",ce,[...a[3]||(a[3]=[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"},null,-1)])])):d.icon==="git"?(e(),t("svg",me,[...a[4]||(a[4]=[s("circle",{cx:"12",cy:"12",r:"4",stroke:"currentColor","stroke-width":"2"},null,-1),s("path",{"stroke-linecap":"round","stroke-width":"2",d:"M2 12h6M16 12h6"},null,-1)])])):(e(),t("svg",ve,[...a[5]||(a[5]=[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"},null,-1)])]))])):j("",!0)]),d.trend!==void 0?(e(),t("div",fe,[s("div",{class:O(["flex items-center gap-1 font-semibold",d.trend>0?"text-emerald-500":d.trend<0?"text-red-400":"text-muted-foreground"])},[(e(),t("svg",ge,[d.trend>0?(e(),t("path",xe)):d.trend<0?(e(),t("path",he)):(e(),t("path",pe))])),y(" "+c(d.trend>0?"+":"")+c(Math.abs(d.trend))+"% ",1)],2),a[6]||(a[6]=s("span",{class:"text-muted-foreground"},"vs last period",-1))])):j("",!0),a[7]||(a[7]=s("div",{class:"mt-3 h-0.5 w-12 rounded-full bg-primary/30"},null,-1))]),_:1})]),_:1}))}}),ye={class:"p-6 space-y-6"},ke={class:"flex flex-wrap items-center gap-3"},_e={class:"flex items-center rounded-md border border-border overflow-hidden"},we=["onClick"],be={class:"grid grid-cols-2 md:grid-cols-3 xl:grid-cols-6 gap-4"},$e={class:"grid grid-cols-1 lg:grid-cols-2 gap-6"},je={key:0,class:"h-40 flex items-center justify-center text-sm text-muted-foreground"},Ce={key:1,class:"h-40 flex items-center justify-center text-sm text-muted-foreground"},Me={key:2,class:"h-40 flex items-end gap-px"},De=["title"],Be={key:0,class:"h-40 flex items-center justify-center text-sm text-muted-foreground"},Ve={key:1,class:"h-40 flex items-center justify-center text-sm text-muted-foreground"},ze={key:2,class:"h-40 flex items-end gap-2"},He=["title"],Ne={class:"text-xs text-muted-foreground"},Te={class:"grid grid-cols-1 lg:grid-cols-2 gap-6"},Ae={key:0,class:"space-y-2"},Fe={key:1,class:"text-sm text-muted-foreground py-4 text-center"},Pe={key:2,class:"space-y-2"},Se={class:"text-xs text-foreground w-24 truncate shrink-0"},Le={class:"flex-1 h-2 bg-secondary rounded-full overflow-hidden"},Ue={class:"text-xs text-muted-foreground w-10 text-right shrink-0"},We={key:0,class:"space-y-2"},Ee={key:1,class:"text-sm text-muted-foreground py-4 text-center"},Ke={key:2,class:"space-y-2"},Oe={class:"flex items-center justify-between text-xs mb-0.5"},Re={class:"text-foreground truncate max-w-[160px]"},qe={class:"text-muted-foreground shrink-0"},tt=E({__name:"DashboardView",setup(d){const m=g("30d"),a=g(""),C=g(""),f=g(null),F=g([]),M=g([]),D=g([]),B=g([]),u=g(!1),R=N(()=>{const n=new Date,l=L(n);if(m.value==="today")return{from:l,to:l};if(m.value==="7d"){const v=new Date(n);return v.setDate(n.getDate()-7),{from:L(v),to:l}}else if(m.value==="30d"){const v=new Date(n);return v.setDate(n.getDate()-30),{from:L(v),to:l}}else return{from:a.value||l,to:C.value||l}});async function P(){if(!(m.value==="custom"&&(!a.value||!C.value))){u.value=!0;try{const n=R.value,[l,v,V,z,H]=await Promise.all([_.summary(n),_.projects(n),_.monthly(n),_.dow(n),_.tools(n)]);f.value=l.data,F.value=v.data,M.value=V.data,D.value=z.data,B.value=H.data}catch(n){console.error("Failed to load dashboard data",n)}finally{u.value=!1}}}Q(m,()=>{m.value!=="custom"&&P()}),X(()=>P());const q=N(()=>Math.max(...M.value.map(n=>n.hours),1)),G=N(()=>Math.max(...D.value.map(n=>n.hours),1)),I=N(()=>Math.max(...B.value.map(n=>n.pct),1)),J=n=>n?n>90?"danger":n>70?"warning":"success":"default";return(n,l)=>{var v,V,z,H;return e(),t("div",ye,[s("div",ke,[l[4]||(l[4]=s("h2",{class:"text-lg font-semibold text-foreground flex-1"},"Overview",-1)),s("div",_e,[(e(),t(x,null,h(["today","7d","30d","custom"],o=>s("button",{key:o,class:O(["px-3 py-1.5 text-xs font-medium transition-colors",m.value===o?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"]),onClick:Ge=>m.value=o},c(o==="today"?"Today":o==="7d"?"7 days":o==="30d"?"30 days":"Custom"),11,we)),64))]),m.value==="custom"?(e(),t(x,{key:0},[U(s("input",{"onUpdate:modelValue":l[0]||(l[0]=o=>a.value=o),type:"date",class:"h-8 rounded-md border border-input bg-background px-2 text-xs text-foreground focus:outline-none focus:ring-2 focus:ring-ring"},null,512),[[W,a.value]]),l[3]||(l[3]=s("span",{class:"text-xs text-muted-foreground"},"to",-1)),U(s("input",{"onUpdate:modelValue":l[1]||(l[1]=o=>C.value=o),type:"date",class:"h-8 rounded-md border border-input bg-background px-2 text-xs text-foreground focus:outline-none focus:ring-2 focus:ring-ring"},null,512),[[W,C.value]]),r(Z,{size:"sm",loading:u.value,onClick:P},{default:i(()=>[...l[2]||(l[2]=[y("Apply",-1)])]),_:1},8,["loading"])],64)):j("",!0)]),s("div",be,[r(p,{label:"Total Hours",value:f.value?k(w)(f.value.total_hours):"-",icon:"clock",loading:u.value},null,8,["value","loading"]),r(p,{label:"Working Days",value:((v=f.value)==null?void 0:v.working_days)??"-",icon:"calendar",loading:u.value},null,8,["value","loading"]),r(p,{label:"Projects",value:((V=f.value)==null?void 0:V.total_projects)??"-",icon:"folder",loading:u.value},null,8,["value","loading"]),r(p,{label:"Avg / Day",value:f.value?k(w)(f.value.avg_hours_per_day):"-",icon:"trending-up",loading:u.value},null,8,["value","loading"]),r(p,{label:"Top Project",value:((z=f.value)==null?void 0:z.top_project)??"-",icon:"star",loading:u.value},null,8,["value","loading"]),r(p,{label:"Commits",value:((H=f.value)==null?void 0:H.total_commits)??"-",icon:"git",loading:u.value},null,8,["value","loading"])]),s("div",$e,[r(b,null,{default:i(()=>[r(T,{class:"pb-2"},{default:i(()=>[r(A,{class:"text-sm"},{default:i(()=>[...l[5]||(l[5]=[y("Hours by Day",-1)])]),_:1})]),_:1}),r($,null,{default:i(()=>[u.value?(e(),t("div",je," Loading... ")):M.value.length===0?(e(),t("div",Ce," No data ")):(e(),t("div",Me,[(e(!0),t(x,null,h(M.value,o=>(e(),t("div",{key:o.date,class:"flex-1 flex flex-col items-center gap-0.5 group",title:`${o.date}: ${k(w)(o.hours)}`},[s("div",{class:"w-full bg-primary/70 hover:bg-primary rounded-t transition-colors",style:S({height:`${o.hours/q.value*100}%`})},null,4)],8,De))),128))]))]),_:1})]),_:1}),r(b,null,{default:i(()=>[r(T,{class:"pb-2"},{default:i(()=>[r(A,{class:"text-sm"},{default:i(()=>[...l[6]||(l[6]=[y("Hours by Day of Week",-1)])]),_:1})]),_:1}),r($,null,{default:i(()=>[u.value?(e(),t("div",Be," Loading... ")):D.value.length===0?(e(),t("div",Ve," No data ")):(e(),t("div",ze,[(e(!0),t(x,null,h(D.value,o=>(e(),t("div",{key:o.dow,class:"flex-1 flex flex-col items-center gap-1"},[s("div",{class:"w-full bg-primary/70 hover:bg-primary rounded-t transition-colors",style:S({height:`${Math.max(o.hours/G.value*100,2)}%`}),title:`${k(w)(o.hours)}`},null,12,He),s("span",Ne,c(o.label.slice(0,2)),1)]))),128))]))]),_:1})]),_:1})]),s("div",Te,[r(b,null,{default:i(()=>[r(T,{class:"pb-2"},{default:i(()=>[r(A,{class:"text-sm"},{default:i(()=>[...l[7]||(l[7]=[y("Tool Usage",-1)])]),_:1})]),_:1}),r($,null,{default:i(()=>[u.value?(e(),t("div",Ae,[(e(),t(x,null,h(5,o=>s("div",{key:o,class:"h-6 bg-muted animate-pulse rounded"})),64))])):B.value.length===0?(e(),t("div",Fe," No data ")):(e(),t("div",Pe,[(e(!0),t(x,null,h(B.value.slice(0,8),o=>(e(),t("div",{key:o.tool,class:"flex items-center gap-2"},[s("span",Se,c(o.tool),1),s("div",Le,[s("div",{class:"h-full bg-primary rounded-full",style:S({width:`${o.pct/I.value*100}%`})},null,4)]),s("span",Ue,c((o.pct??0).toFixed(0))+"% ",1)]))),128))]))]),_:1})]),_:1}),r(b,null,{default:i(()=>[r(T,{class:"pb-2"},{default:i(()=>[r(A,{class:"text-sm"},{default:i(()=>[...l[8]||(l[8]=[y("Projects",-1)])]),_:1})]),_:1}),r($,null,{default:i(()=>[u.value?(e(),t("div",We,[(e(),t(x,null,h(5,o=>s("div",{key:o,class:"h-8 bg-muted animate-pulse rounded"})),64))])):F.value.length===0?(e(),t("div",Ee," No data ")):(e(),t("div",Ke,[(e(!0),t(x,null,h(F.value.slice(0,8),o=>(e(),t("div",{key:o.project_id},[s("div",Oe,[s("span",Re,c(o.display_name),1),s("span",qe,c(k(w)(o.total_hours)),1)]),o.progress_pct!==null?(e(),K(Y,{key:0,value:o.progress_pct,color:J(o.progress_pct)},null,8,["value","color"])):j("",!0)]))),128))]))]),_:1})]),_:1})])])}}});export{tt as default}; diff --git a/src/static/assets/Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js b/src/static/assets/Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js similarity index 90% rename from src/static/assets/Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js rename to src/static/assets/Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js index 2d70860..fc9b031 100644 --- a/src/static/assets/Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js +++ b/src/static/assets/Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js @@ -1 +1 @@ -import{d as y,x as k,E as b,n as h,G as x,e as c,T as g,w as u,o as a,c as n,a as o,s as r,t as m,j as i,p as w}from"./index-CO3lBHVT.js";import{_ as $}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";const C={key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4"},B=["aria-label"],j={key:0,class:"flex items-center justify-between p-6 pb-4"},E={class:"text-lg font-semibold text-foreground"},z={key:0,class:"text-sm text-muted-foreground mt-1"},L={class:"px-6 pb-4"},M={key:1,class:"flex justify-end gap-2 px-6 pb-6"},V=y({__name:"Dialog",props:{open:{type:Boolean},title:{},description:{},maxWidth:{default:"max-w-lg"}},emits:["close"],setup(e,{emit:f}){const p=e,l=f;function d(t){t.key==="Escape"&&p.open&&l("close")}return k(()=>document.addEventListener("keydown",d)),b(()=>document.removeEventListener("keydown",d)),(t,s)=>(a(),h(x,{to:"body"},[c(g,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:u(()=>[e.open?(a(),n("div",C,[o("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:s[0]||(s[0]=v=>l("close"))}),o("div",{class:w(["relative w-full bg-card border border-border rounded-lg shadow-xl z-10",e.maxWidth]),role:"dialog","aria-modal":!0,"aria-label":e.title},[e.title||t.$slots.header?(a(),n("div",j,[o("div",null,[r(t.$slots,"header",{},()=>[o("h2",E,m(e.title),1),e.description?(a(),n("p",z,m(e.description),1)):i("",!0)])]),c($,{variant:"ghost",size:"icon",class:"shrink-0",onClick:s[1]||(s[1]=v=>l("close"))},{default:u(()=>[...s[2]||(s[2]=[o("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])]),_:1})])):i("",!0),o("div",L,[r(t.$slots,"default")]),t.$slots.footer?(a(),n("div",M,[r(t.$slots,"footer")])):i("",!0)],10,B)])):i("",!0)]),_:3})]))}});export{V as _}; +import{d as y,x as k,E as b,n as h,G as x,e as c,T as g,w as u,o as a,c as n,a as o,s as r,t as m,j as i,p as w}from"./index-B9hhyP-T.js";import{_ as $}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";const C={key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4"},B=["aria-label"],j={key:0,class:"flex items-center justify-between p-6 pb-4"},E={class:"text-lg font-semibold text-foreground"},z={key:0,class:"text-sm text-muted-foreground mt-1"},L={class:"px-6 pb-4"},M={key:1,class:"flex justify-end gap-2 px-6 pb-6"},V=y({__name:"Dialog",props:{open:{type:Boolean},title:{},description:{},maxWidth:{default:"max-w-lg"}},emits:["close"],setup(e,{emit:f}){const p=e,l=f;function d(t){t.key==="Escape"&&p.open&&l("close")}return k(()=>document.addEventListener("keydown",d)),b(()=>document.removeEventListener("keydown",d)),(t,s)=>(a(),h(x,{to:"body"},[c(g,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:u(()=>[e.open?(a(),n("div",C,[o("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm",onClick:s[0]||(s[0]=v=>l("close"))}),o("div",{class:w(["relative w-full bg-card border border-border rounded-lg shadow-xl z-10",e.maxWidth]),role:"dialog","aria-modal":!0,"aria-label":e.title},[e.title||t.$slots.header?(a(),n("div",j,[o("div",null,[r(t.$slots,"header",{},()=>[o("h2",E,m(e.title),1),e.description?(a(),n("p",z,m(e.description),1)):i("",!0)])]),c($,{variant:"ghost",size:"icon",class:"shrink-0",onClick:s[1]||(s[1]=v=>l("close"))},{default:u(()=>[...s[2]||(s[2]=[o("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[o("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])]),_:1})])):i("",!0),o("div",L,[r(t.$slots,"default")]),t.$slots.footer?(a(),n("div",M,[r(t.$slots,"footer")])):i("",!0)],10,B)])):i("",!0)]),_:3})]))}});export{V as _}; diff --git a/src/static/assets/Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js b/src/static/assets/Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js similarity index 89% rename from src/static/assets/Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js rename to src/static/assets/Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js index ccd458e..258ad6f 100644 --- a/src/static/assets/Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js +++ b/src/static/assets/Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js @@ -1 +1 @@ -import{c as i}from"./utils-B1YxgOQw.js";import{d,c as s,p as u,i as m,o as r}from"./index-CO3lBHVT.js";const c=["id","name","type","value","placeholder","disabled","autocomplete","min","max","step"],g=d({__name:"Input",props:{modelValue:{},type:{},placeholder:{},disabled:{type:Boolean},class:{},id:{},name:{},autocomplete:{},min:{},max:{},step:{}},emits:["update:modelValue","change","blur","focus"],setup(e,{emit:a}){const n=e,o=a;return(f,t)=>(r(),s("input",{id:e.id,name:e.name,type:e.type??"text",value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,autocomplete:e.autocomplete,min:e.min,max:e.max,step:e.step,class:u(m(i)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium","placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",n.class)),onInput:t[0]||(t[0]=l=>o("update:modelValue",l.target.value)),onChange:t[1]||(t[1]=l=>o("change",l.target.value)),onBlur:t[2]||(t[2]=l=>o("blur",l)),onFocus:t[3]||(t[3]=l=>o("focus",l))},null,42,c))}});export{g as _}; +import{c as i}from"./utils-DuVQys2y.js";import{d,c as s,p as u,i as m,o as r}from"./index-B9hhyP-T.js";const c=["id","name","type","value","placeholder","disabled","autocomplete","min","max","step"],g=d({__name:"Input",props:{modelValue:{},type:{},placeholder:{},disabled:{type:Boolean},class:{},id:{},name:{},autocomplete:{},min:{},max:{},step:{}},emits:["update:modelValue","change","blur","focus"],setup(e,{emit:a}){const n=e,o=a;return(f,t)=>(r(),s("input",{id:e.id,name:e.name,type:e.type??"text",value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,autocomplete:e.autocomplete,min:e.min,max:e.max,step:e.step,class:u(m(i)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium","placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",n.class)),onInput:t[0]||(t[0]=l=>o("update:modelValue",l.target.value)),onChange:t[1]||(t[1]=l=>o("change",l.target.value)),onBlur:t[2]||(t[2]=l=>o("blur",l)),onFocus:t[3]||(t[3]=l=>o("focus",l))},null,42,c))}});export{g as _}; diff --git a/src/static/assets/KeysView-BzDjpAPG.js b/src/static/assets/KeysView-BJjLTbGZ.js similarity index 89% rename from src/static/assets/KeysView-BzDjpAPG.js rename to src/static/assets/KeysView-BJjLTbGZ.js index 431f2a1..a972775 100644 --- a/src/static/assets/KeysView-BzDjpAPG.js +++ b/src/static/assets/KeysView-BJjLTbGZ.js @@ -1 +1 @@ -import{a as b}from"./admin-s3id3yDK.js";import{_ as K,a as $}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import{_ as v}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import{_ as V}from"./Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js";import{_ as N}from"./Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js";import{_ as A,a as k}from"./utils-B1YxgOQw.js";import{d as B,x as L,c as l,a as t,e as r,w as n,r as i,o as a,k as p,F as P,l as j,t as u,i as h,n as F,j as I,K as y}from"./index-CO3lBHVT.js";const D={class:"p-6"},R={class:"flex items-center justify-between mb-6"},z={key:0,class:"flex items-center justify-center h-20"},M={key:1,class:"text-center text-muted-foreground py-8 text-sm"},T={key:2,class:"w-full"},U={class:"px-4 py-3 text-sm text-foreground"},E={class:"px-4 py-3 text-sm font-mono text-muted-foreground"},H={class:"px-4 py-3 text-xs text-muted-foreground"},S={class:"px-4 py-3 text-xs text-muted-foreground"},q={class:"px-4 py-3 text-right"},G={class:"space-y-4"},J={key:0,class:"rounded-md bg-emerald-500/10 border border-emerald-500/30 p-3"},O={class:"text-xs font-mono text-foreground break-all"},Q={key:1,class:"space-y-1.5"},le=B({__name:"KeysView",setup(W){const f=i([]),_=i(!1),c=i(!1),m=i(""),x=i(!1),d=i(null);L(()=>g());async function g(){_.value=!0;try{const o=await b.keys();f.value=o.data}finally{_.value=!1}}async function w(){if(m.value.trim()){x.value=!0;try{const o=await b.createKey({label:m.value});d.value=o.data.key,y.success("API key created"),await g(),m.value=""}catch{y.error("Failed to create key")}finally{x.value=!1}}}async function C(o){if(confirm(`Revoke key "${o.label}"? This cannot be undone.`))try{await b.revokeKey(o.id),y.success("Key revoked"),f.value=f.value.filter(e=>e.id!==o.id)}catch{y.error("Failed to revoke key")}}return(o,e)=>(a(),l("div",D,[t("div",R,[e[5]||(e[5]=t("h2",{class:"text-lg font-semibold text-foreground"},"API Keys",-1)),r(v,{size:"sm",onClick:e[0]||(e[0]=s=>{c.value=!0,d.value=null})},{default:n(()=>[...e[4]||(e[4]=[t("svg",{class:"h-4 w-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),p(" New Key ",-1)])]),_:1})]),r(K,null,{default:n(()=>[r($,{class:"p-0"},{default:n(()=>[_.value?(a(),l("div",z,[r(A,{class:"text-primary"})])):f.value.length===0?(a(),l("div",M," No API keys ")):(a(),l("table",T,[e[7]||(e[7]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Label"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Prefix"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Created"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Last Used"),t("th",{class:"px-4 py-3"})])],-1)),t("tbody",null,[(a(!0),l(P,null,j(f.value,s=>(a(),l("tr",{key:s.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",U,u(s.label),1),t("td",E,u(s.prefix)+"...",1),t("td",H,u(h(k)(s.created_at)),1),t("td",S,u(s.last_used?h(k)(s.last_used):"Never"),1),t("td",q,[r(v,{variant:"ghost",size:"sm",class:"text-destructive",onClick:X=>C(s)},{default:n(()=>[...e[6]||(e[6]=[p(" Revoke ",-1)])]),_:1},8,["onClick"])])]))),128))])]))]),_:1})]),_:1}),r(V,{open:c.value,title:"Create API Key",onClose:e[3]||(e[3]=s=>c.value=!1)},{footer:n(()=>[r(v,{variant:"outline",onClick:e[2]||(e[2]=s=>c.value=!1)},{default:n(()=>[p(u(d.value?"Done":"Cancel"),1)]),_:1}),d.value?I("",!0):(a(),F(v,{key:0,loading:x.value,onClick:w},{default:n(()=>[...e[10]||(e[10]=[p(" Create ",-1)])]),_:1},8,["loading"]))]),default:n(()=>[t("div",G,[d.value?(a(),l("div",J,[e[8]||(e[8]=t("p",{class:"text-xs text-emerald-400 font-medium mb-1"},"Key created — save it now!",-1)),t("p",O,u(d.value),1)])):(a(),l("div",Q,[e[9]||(e[9]=t("label",{class:"text-sm font-medium text-foreground"},"Label",-1)),r(N,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=s=>m.value=s),placeholder:"e.g. claude-collector",disabled:x.value},null,8,["modelValue","disabled"])]))])]),_:1},8,["open"])]))}});export{le as default}; +import{a as b}from"./admin-CT_XX4Td.js";import{_ as K,a as $}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import{_ as v}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import{_ as V}from"./Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js";import{_ as N}from"./Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js";import{_ as A,a as k}from"./utils-DuVQys2y.js";import{d as B,x as L,c as l,a as t,e as r,w as n,r as i,o as a,k as p,F as P,l as j,t as u,i as h,n as F,j as I,K as y}from"./index-B9hhyP-T.js";const D={class:"p-6"},R={class:"flex items-center justify-between mb-6"},z={key:0,class:"flex items-center justify-center h-20"},M={key:1,class:"text-center text-muted-foreground py-8 text-sm"},T={key:2,class:"w-full"},U={class:"px-4 py-3 text-sm text-foreground"},E={class:"px-4 py-3 text-sm font-mono text-muted-foreground"},H={class:"px-4 py-3 text-xs text-muted-foreground"},S={class:"px-4 py-3 text-xs text-muted-foreground"},q={class:"px-4 py-3 text-right"},G={class:"space-y-4"},J={key:0,class:"rounded-md bg-emerald-500/10 border border-emerald-500/30 p-3"},O={class:"text-xs font-mono text-foreground break-all"},Q={key:1,class:"space-y-1.5"},le=B({__name:"KeysView",setup(W){const f=i([]),_=i(!1),c=i(!1),m=i(""),x=i(!1),d=i(null);L(()=>g());async function g(){_.value=!0;try{const o=await b.keys();f.value=o.data}finally{_.value=!1}}async function w(){if(m.value.trim()){x.value=!0;try{const o=await b.createKey({label:m.value});d.value=o.data.key,y.success("API key created"),await g(),m.value=""}catch{y.error("Failed to create key")}finally{x.value=!1}}}async function C(o){if(confirm(`Revoke key "${o.label}"? This cannot be undone.`))try{await b.revokeKey(o.id),y.success("Key revoked"),f.value=f.value.filter(e=>e.id!==o.id)}catch{y.error("Failed to revoke key")}}return(o,e)=>(a(),l("div",D,[t("div",R,[e[5]||(e[5]=t("h2",{class:"text-lg font-semibold text-foreground"},"API Keys",-1)),r(v,{size:"sm",onClick:e[0]||(e[0]=s=>{c.value=!0,d.value=null})},{default:n(()=>[...e[4]||(e[4]=[t("svg",{class:"h-4 w-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),p(" New Key ",-1)])]),_:1})]),r(K,null,{default:n(()=>[r($,{class:"p-0"},{default:n(()=>[_.value?(a(),l("div",z,[r(A,{class:"text-primary"})])):f.value.length===0?(a(),l("div",M," No API keys ")):(a(),l("table",T,[e[7]||(e[7]=t("thead",null,[t("tr",{class:"border-b border-border"},[t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Label"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Prefix"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Created"),t("th",{class:"text-left text-xs font-medium text-muted-foreground px-4 py-3"},"Last Used"),t("th",{class:"px-4 py-3"})])],-1)),t("tbody",null,[(a(!0),l(P,null,j(f.value,s=>(a(),l("tr",{key:s.id,class:"border-b border-border last:border-0 hover:bg-muted/30"},[t("td",U,u(s.label),1),t("td",E,u(s.prefix)+"...",1),t("td",H,u(h(k)(s.created_at)),1),t("td",S,u(s.last_used?h(k)(s.last_used):"Never"),1),t("td",q,[r(v,{variant:"ghost",size:"sm",class:"text-destructive",onClick:X=>C(s)},{default:n(()=>[...e[6]||(e[6]=[p(" Revoke ",-1)])]),_:1},8,["onClick"])])]))),128))])]))]),_:1})]),_:1}),r(V,{open:c.value,title:"Create API Key",onClose:e[3]||(e[3]=s=>c.value=!1)},{footer:n(()=>[r(v,{variant:"outline",onClick:e[2]||(e[2]=s=>c.value=!1)},{default:n(()=>[p(u(d.value?"Done":"Cancel"),1)]),_:1}),d.value?I("",!0):(a(),F(v,{key:0,loading:x.value,onClick:w},{default:n(()=>[...e[10]||(e[10]=[p(" Create ",-1)])]),_:1},8,["loading"]))]),default:n(()=>[t("div",G,[d.value?(a(),l("div",J,[e[8]||(e[8]=t("p",{class:"text-xs text-emerald-400 font-medium mb-1"},"Key created — save it now!",-1)),t("p",O,u(d.value),1)])):(a(),l("div",Q,[e[9]||(e[9]=t("label",{class:"text-sm font-medium text-foreground"},"Label",-1)),r(N,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=s=>m.value=s),placeholder:"e.g. claude-collector",disabled:x.value},null,8,["modelValue","disabled"])]))])]),_:1},8,["open"])]))}});export{le as default}; diff --git a/src/static/assets/LiveView-4Mk1DKtX.js b/src/static/assets/LiveView-4Mk1DKtX.js deleted file mode 100644 index 7ed5e74..0000000 --- a/src/static/assets/LiveView-4Mk1DKtX.js +++ /dev/null @@ -1 +0,0 @@ -import{E as j,r as g,d as L,u as J,x as O,c as d,a as r,p as b,i,t as v,n as T,w as x,j as k,e as E,o as l,k as S,F as V,l as B,m as F}from"./index-CO3lBHVT.js";import{_ as z,a as A}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import{_ as w}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import"./utils-B1YxgOQw.js";function D(C){const e=g([]),f=g(!1),o=g(null);let s=null,u=null,m=!1;function p(){if(!m)try{s=new EventSource(C),s.onopen=()=>{f.value=!0,o.value=null},s.onmessage=n=>{try{const h=JSON.parse(n.data);e.value.push({type:"message",data:h}),e.value.length>200&&e.value.shift()}catch{e.value.push({type:"message",data:n.data})}},s.addEventListener("session_start",n=>{try{e.value.push({type:"session_start",data:JSON.parse(n.data)})}catch{e.value.push({type:"session_start",data:n.data})}e.value.length>200&&e.value.shift()}),s.addEventListener("session_end",n=>{try{e.value.push({type:"session_end",data:JSON.parse(n.data)})}catch{e.value.push({type:"session_end",data:n.data})}e.value.length>200&&e.value.shift()}),s.addEventListener("activity",n=>{try{e.value.push({type:"activity",data:JSON.parse(n.data)})}catch{e.value.push({type:"activity",data:n.data})}e.value.length>200&&e.value.shift()}),s.onerror=()=>{f.value=!1,o.value="Connection lost, reconnecting...",s==null||s.close(),s=null,m||(u=setTimeout(()=>p(),5e3))}}catch{o.value="Failed to connect to event stream",m||(u=setTimeout(()=>p(),5e3))}}function _(){m=!0,u&&clearTimeout(u),s==null||s.close(),s=null,f.value=!1}function y(){e.value=[]}return j(()=>{_()}),{events:e,connected:f,error:o,connect:p,disconnect:_,clearEvents:y}}const $={class:"p-6 h-full flex flex-col"},I={class:"flex items-center gap-3 mb-4"},M={class:"flex items-center gap-2"},P={class:"text-xs text-muted-foreground"},R={key:0,class:"mb-4 text-xs text-amber-400 bg-amber-500/10 border border-amber-500/30 rounded px-3 py-2"},U={key:0,class:"flex items-center justify-center h-full text-sm text-muted-foreground"},W={key:1,class:"overflow-y-auto h-full font-mono text-xs"},q={class:"flex-1 min-w-0"},G={class:"flex items-center gap-2 flex-wrap"},H={key:0,class:"text-muted-foreground"},K={class:"text-muted-foreground truncate mt-0.5"},ee=L({__name:"LiveView",setup(C){const e=J(),{events:f,connected:o,error:s,connect:u,clearEvents:m}=D("/cc-dashboard/api/events/stream");O(()=>{e.isAuthenticated&&u()});const p=F(()=>[...f.value].reverse().slice(0,100));function _(t){return t==="session_start"?"text-emerald-400":t==="session_end"?"text-amber-400":t==="activity"?"text-blue-400":"text-muted-foreground"}function y(t){return t==="session_start"?"▶":t==="session_end"?"■":t==="activity"?"●":"○"}function n(t){if(typeof t=="string")return t;if(t&&typeof t=="object"){const a=t;return a.message||a.summary||JSON.stringify(t)}return String(t)}function h(t){if(t&&typeof t=="object"){const a=t;return a.display_name||a.project_id||""}return""}return(t,a)=>(l(),d("div",$,[r("div",I,[a[2]||(a[2]=r("h2",{class:"text-lg font-semibold text-foreground flex-1"},"Live Feed",-1)),r("div",M,[r("div",{class:b(["h-2 w-2 rounded-full",i(o)?"bg-emerald-500 animate-pulse":"bg-red-500"])},null,2),r("span",P,v(i(o)?"Connected":"Disconnected"),1)]),i(o)?k("",!0):(l(),T(w,{key:0,variant:"outline",size:"sm",onClick:i(u)},{default:x(()=>[...a[0]||(a[0]=[S(" Reconnect ",-1)])]),_:1},8,["onClick"])),E(w,{variant:"ghost",size:"sm",onClick:i(m)},{default:x(()=>[...a[1]||(a[1]=[S(" Clear ",-1)])]),_:1},8,["onClick"])]),i(s)&&!i(o)?(l(),d("div",R,v(i(s)),1)):k("",!0),E(z,{class:"flex-1 overflow-hidden"},{default:x(()=>[E(A,{class:"p-0 h-full"},{default:x(()=>[p.value.length===0?(l(),d("div",U,[...a[3]||(a[3]=[r("div",{class:"text-center"},[r("div",{class:"text-2xl mb-2"},"📡"),r("p",null,"Waiting for events..."),r("p",{class:"text-xs mt-1"},"Activity will appear here in real-time")],-1)])])):(l(),d("div",W,[(l(!0),d(V,null,B(p.value,(c,N)=>(l(),d("div",{key:N,class:"flex items-start gap-2 px-4 py-1.5 hover:bg-muted/50 border-b border-border/30"},[r("span",{class:b([_(c.type),"shrink-0 mt-0.5"])},v(y(c.type)),3),r("div",q,[r("div",G,[r("span",{class:b([_(c.type),"font-medium"])},v(c.type),3),h(c.data)?(l(),d("span",H,v(h(c.data)),1)):k("",!0)]),r("p",K,v(n(c.data)),1)])]))),128))]))]),_:1})]),_:1})]))}});export{ee as default}; diff --git a/src/static/assets/LiveView-BsPW_Vxj.js b/src/static/assets/LiveView-BsPW_Vxj.js new file mode 100644 index 0000000..cb04610 --- /dev/null +++ b/src/static/assets/LiveView-BsPW_Vxj.js @@ -0,0 +1 @@ +import{E as T,r as y,d as J,u as O,x as V,c as f,a as o,p as b,i,t as v,n as $,w as x,j as k,e as C,o as c,k as w,F as B,l as F,m as z}from"./index-B9hhyP-T.js";import{_ as A,a as D}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import{_ as N}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import"./utils-DuVQys2y.js";function U(E){const e=y([]),l=y(!1),m=y(null);let s=null,r=null,u=!1;function p(){if(!u)try{s=new EventSource(E),s.onopen=()=>{l.value=!0,m.value=null},s.onmessage=n=>{try{const g=JSON.parse(n.data);e.value.push({type:"message",data:g}),e.value.length>200&&e.value.shift()}catch{e.value.push({type:"message",data:n.data})}},s.addEventListener("session_start",n=>{try{e.value.push({type:"session_start",data:JSON.parse(n.data)})}catch{e.value.push({type:"session_start",data:n.data})}e.value.length>200&&e.value.shift()}),s.addEventListener("session_end",n=>{try{e.value.push({type:"session_end",data:JSON.parse(n.data)})}catch{e.value.push({type:"session_end",data:n.data})}e.value.length>200&&e.value.shift()}),s.addEventListener("activity",n=>{try{e.value.push({type:"activity",data:JSON.parse(n.data)})}catch{e.value.push({type:"activity",data:n.data})}e.value.length>200&&e.value.shift()}),s.onerror=()=>{l.value=!1,m.value="Connection lost, reconnecting...",s==null||s.close(),s=null,u||(r=setTimeout(()=>p(),5e3))}}catch{m.value="Failed to connect to event stream",u||(r=setTimeout(()=>p(),5e3))}}function _(){u=!0,r&&clearTimeout(r),s==null||s.close(),s=null,l.value=!1}function h(){e.value=[]}return T(()=>{_()}),{events:e,connected:l,error:m,connect:p,disconnect:_,clearEvents:h}}const I={class:"p-6 h-full flex flex-col"},R={class:"flex items-center gap-3 mb-4"},M={class:"flex items-center gap-2"},P={class:"text-xs text-muted-foreground"},W={key:0,class:"mb-4 text-xs text-amber-400 bg-amber-500/10 border border-amber-500/30 rounded px-3 py-2"},q={key:0,class:"flex items-center justify-center h-full text-sm text-muted-foreground"},G={key:1,class:"overflow-y-auto h-full font-mono text-xs"},H={class:"flex-1 min-w-0"},K={class:"flex items-center gap-2 flex-wrap"},Q={key:0,class:"text-muted-foreground"},X={class:"text-muted-foreground truncate mt-0.5"},se=J({__name:"LiveView",setup(E){const e=O(),l=e.getToken(),m=`/cc-dashboard/api/events${l?`?token=${encodeURIComponent(l)}`:""}`,{events:s,connected:r,error:u,connect:p,clearEvents:_}=U(m);V(()=>{e.isAuthenticated&&l&&p()});const h=z(()=>[...s.value].reverse().slice(0,100));function n(t){return t==="session_start"?"text-emerald-400":t==="session_end"?"text-amber-400":t==="activity"?"text-blue-400":"text-muted-foreground"}function g(t){return t==="session_start"?"▶":t==="session_end"?"■":t==="activity"?"●":"○"}function j(t){if(typeof t=="string")return t;if(t&&typeof t=="object"){const a=t;return a.message||a.summary||JSON.stringify(t)}return String(t)}function S(t){if(t&&typeof t=="object"){const a=t;return a.display_name||a.project_id||""}return""}return(t,a)=>(c(),f("div",I,[o("div",R,[a[2]||(a[2]=o("h2",{class:"text-lg font-semibold text-foreground flex-1"},"Live Feed",-1)),o("div",M,[o("div",{class:b(["h-2 w-2 rounded-full",i(r)?"bg-emerald-500 animate-pulse":"bg-red-500"])},null,2),o("span",P,v(i(r)?"Connected":"Disconnected"),1)]),i(r)?k("",!0):(c(),$(N,{key:0,variant:"outline",size:"sm",onClick:i(p)},{default:x(()=>[...a[0]||(a[0]=[w(" Reconnect ",-1)])]),_:1},8,["onClick"])),C(N,{variant:"ghost",size:"sm",onClick:i(_)},{default:x(()=>[...a[1]||(a[1]=[w(" Clear ",-1)])]),_:1},8,["onClick"])]),i(u)&&!i(r)?(c(),f("div",W,v(i(u)),1)):k("",!0),C(A,{class:"flex-1 overflow-hidden"},{default:x(()=>[C(D,{class:"p-0 h-full"},{default:x(()=>[h.value.length===0?(c(),f("div",q,[...a[3]||(a[3]=[o("div",{class:"text-center"},[o("div",{class:"text-2xl mb-2"},"📡"),o("p",null,"Waiting for events..."),o("p",{class:"text-xs mt-1"},"Activity will appear here in real-time")],-1)])])):(c(),f("div",G,[(c(!0),f(B,null,F(h.value,(d,L)=>(c(),f("div",{key:L,class:"flex items-start gap-2 px-4 py-1.5 hover:bg-muted/50 border-b border-border/30"},[o("span",{class:b([n(d.type),"shrink-0 mt-0.5"])},v(g(d.type)),3),o("div",H,[o("div",K,[o("span",{class:b([n(d.type),"font-medium"])},v(d.type),3),S(d.data)?(c(),f("span",Q,v(S(d.data)),1)):k("",!0)]),o("p",X,v(j(d.data)),1)])]))),128))]))]),_:1})]),_:1})]))}});export{se as default}; diff --git a/src/static/assets/LoginView-C8KUpWjz.js b/src/static/assets/LoginView-BTX9oEgY.js similarity index 87% rename from src/static/assets/LoginView-C8KUpWjz.js rename to src/static/assets/LoginView-BTX9oEgY.js index 3cf3c7d..8d4f7a4 100644 --- a/src/static/assets/LoginView-C8KUpWjz.js +++ b/src/static/assets/LoginView-BTX9oEgY.js @@ -1 +1 @@ -import{d as g,u as b,c as u,a as s,b as _,e as a,w as i,o as m,f as h,g as w,h as y,i as o,t as V,j as k,k as C,r as c}from"./index-CO3lBHVT.js";import{_ as S}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import{_ as p}from"./Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js";import{_ as N,a as j}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import"./utils-B1YxgOQw.js";const B={class:"min-h-screen flex items-center justify-center bg-background p-4"},$={class:"w-full max-w-sm"},q={key:0,class:"rounded-md bg-destructive/10 border border-destructive/30 px-3 py-2 text-sm text-destructive"},z={class:"space-y-1.5"},D={class:"space-y-1.5"},U=g({__name:"LoginView",setup(E){const f=h(),v=w(),t=b(),r=c(""),l=c("");async function x(){try{await t.login(r.value,l.value);const n=v.query.redirect;f.push(n??"/")}catch{}}return(n,e)=>(m(),u("div",B,[s("div",$,[e[5]||(e[5]=_('

CC Dashboard

Corporate Planning Hub

',1)),a(N,null,{default:i(()=>[a(j,{class:"pt-6"},{default:i(()=>[s("form",{class:"space-y-4",onSubmit:y(x,["prevent"])},[o(t).error?(m(),u("div",q,V(o(t).error),1)):k("",!0),s("div",z,[e[2]||(e[2]=s("label",{for:"email",class:"text-sm font-medium text-foreground"},"Email",-1)),a(p,{id:"email",modelValue:r.value,"onUpdate:modelValue":e[0]||(e[0]=d=>r.value=d),type:"email",placeholder:"you@company.com",autocomplete:"email",disabled:o(t).loading,required:""},null,8,["modelValue","disabled"])]),s("div",D,[e[3]||(e[3]=s("label",{for:"password",class:"text-sm font-medium text-foreground"},"Password",-1)),a(p,{id:"password",modelValue:l.value,"onUpdate:modelValue":e[1]||(e[1]=d=>l.value=d),type:"password",placeholder:"••••••••",autocomplete:"current-password",disabled:o(t).loading,required:""},null,8,["modelValue","disabled"])]),a(S,{type:"submit",class:"w-full",loading:o(t).loading},{default:i(()=>[...e[4]||(e[4]=[C(" Sign in ",-1)])]),_:1},8,["loading"])],32)]),_:1})]),_:1})])]))}});export{U as default}; +import{d as g,u as b,c as u,a as s,b as _,e as a,w as i,o as m,f as h,g as w,h as y,i as o,t as V,j as k,k as C,r as c}from"./index-B9hhyP-T.js";import{_ as S}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import{_ as p}from"./Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js";import{_ as N,a as j}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import"./utils-DuVQys2y.js";const B={class:"min-h-screen flex items-center justify-center bg-background p-4"},$={class:"w-full max-w-sm"},q={key:0,class:"rounded-md bg-destructive/10 border border-destructive/30 px-3 py-2 text-sm text-destructive"},z={class:"space-y-1.5"},D={class:"space-y-1.5"},U=g({__name:"LoginView",setup(E){const f=h(),v=w(),t=b(),r=c(""),l=c("");async function x(){try{await t.login(r.value,l.value);const n=v.query.redirect;f.push(n??"/")}catch{}}return(n,e)=>(m(),u("div",B,[s("div",$,[e[5]||(e[5]=_('

CC Dashboard

Corporate Planning Hub

',1)),a(N,null,{default:i(()=>[a(j,{class:"pt-6"},{default:i(()=>[s("form",{class:"space-y-4",onSubmit:y(x,["prevent"])},[o(t).error?(m(),u("div",q,V(o(t).error),1)):k("",!0),s("div",z,[e[2]||(e[2]=s("label",{for:"email",class:"text-sm font-medium text-foreground"},"Email",-1)),a(p,{id:"email",modelValue:r.value,"onUpdate:modelValue":e[0]||(e[0]=d=>r.value=d),type:"email",placeholder:"you@company.com",autocomplete:"email",disabled:o(t).loading,required:""},null,8,["modelValue","disabled"])]),s("div",D,[e[3]||(e[3]=s("label",{for:"password",class:"text-sm font-medium text-foreground"},"Password",-1)),a(p,{id:"password",modelValue:l.value,"onUpdate:modelValue":e[1]||(e[1]=d=>l.value=d),type:"password",placeholder:"••••••••",autocomplete:"current-password",disabled:o(t).loading,required:""},null,8,["modelValue","disabled"])]),a(S,{type:"submit",class:"w-full",loading:o(t).loading},{default:i(()=>[...e[4]||(e[4]=[C(" Sign in ",-1)])]),_:1},8,["loading"])],32)]),_:1})]),_:1})])]))}});export{U as default}; diff --git a/src/static/assets/PlannerView-D1tzk_DZ.js b/src/static/assets/PlannerView-CskuH3RG.js similarity index 93% rename from src/static/assets/PlannerView-D1tzk_DZ.js rename to src/static/assets/PlannerView-CskuH3RG.js index 48c030e..6de32c3 100644 --- a/src/static/assets/PlannerView-D1tzk_DZ.js +++ b/src/static/assets/PlannerView-CskuH3RG.js @@ -1 +1 @@ -import{u as N,_ as E}from"./TaskForm.vue_vue_type_script_setup_true_lang-CUKCWjzn.js";import{d as L,o as a,c as r,a as t,p as A,t as v,F as _,l as V,A as P,j as h,e as f,w,k as B,i as D,h as z,m as F,y as H,C as U,n as K,r as b,x as I,v as O,K as g}from"./index-CO3lBHVT.js";import{_ as q}from"./Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js";import{f as S,i as T}from"./utils-B1YxgOQw.js";import{_ as $}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import{_ as j}from"./Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js";import"./Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js";import"./devops-D_lPg6L8.js";const G=["draggable"],J={class:"flex items-start gap-2"},Q=["title"],R={class:"flex-1 min-w-0"},W={class:"text-sm font-medium text-foreground leading-tight truncate"},X={key:0,class:"flex items-center gap-1 mt-1 flex-wrap"},Y={class:"flex items-center gap-2 mt-1.5 flex-wrap"},Z={key:0,class:"text-xs text-muted-foreground"},ee={key:1,class:"text-xs text-emerald-400"},te={key:2,class:"text-xs text-blue-400 ml-auto",title:"Azure DevOps"},se={class:"flex items-center gap-1 opacity-0 group-hover:opacity-100 shrink-0"},oe=L({__name:"TaskCard",props:{task:{},draggable:{type:Boolean}},emits:["edit","complete","delete"],setup(s,{emit:d}){const n=d,c=u=>({todo:"outline",doing:"default",done:"success",cancelled:"secondary"})[u],m=u=>["","Low","Medium","High","Critical","Blocker"][u]??"Unknown",k=u=>u>=4?"bg-red-500":u===3?"bg-amber-500":"bg-emerald-500";return(u,o)=>(a(),r("div",{draggable:s.draggable,class:"rounded-lg border border-border bg-card p-3 hover:border-primary/50 transition-colors cursor-pointer group",onClick:o[2]||(o[2]=l=>n("edit",s.task))},[t("div",J,[t("div",{class:A(["h-2 w-2 rounded-full mt-1.5 shrink-0",k(s.task.priority)]),title:m(s.task.priority)},null,10,Q),t("div",R,[t("p",W,v(s.task.title),1),s.task.tags.length?(a(),r("div",X,[(a(!0),r(_,null,V(s.task.tags,l=>(a(),r("span",{key:l.id,class:"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium",style:P({background:`${l.color_hex}22`,color:l.color_hex})},v(l.name),5))),128))])):h("",!0),t("div",Y,[f(q,{variant:c(s.task.status),class:"text-xs py-0"},{default:w(()=>[B(v(s.task.status),1)]),_:1},8,["variant"]),s.task.estimate_hours?(a(),r("span",Z," ~"+v(D(S)(s.task.estimate_hours)),1)):h("",!0),s.task.actual_hours?(a(),r("span",ee,v(D(S)(s.task.actual_hours))+" actual ",1)):h("",!0),s.task.azure_work_item_id?(a(),r("span",te," #"+v(s.task.azure_work_item_id),1)):h("",!0)])]),t("div",se,[s.task.status!=="done"?(a(),r("button",{key:0,class:"p-1 rounded hover:bg-emerald-500/20 text-emerald-400",title:"Mark done",onClick:o[0]||(o[0]=z(l=>n("complete",s.task),["stop"]))},[...o[3]||(o[3]=[t("svg",{class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1)])])):h("",!0),t("button",{class:"p-1 rounded hover:bg-red-500/20 text-red-400",title:"Delete",onClick:o[1]||(o[1]=z(l=>n("delete",s.task),["stop"]))},[...o[4]||(o[4]=[t("svg",{class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])])])])],8,G))}}),ae={class:"space-y-6"},ne={key:0,class:"text-sm text-muted-foreground py-4 text-center"},le={class:"flex items-center gap-2 mb-2"},re={class:"text-xs font-semibold uppercase tracking-wide text-muted-foreground"},ie={class:"text-xs text-muted-foreground bg-muted px-1.5 py-0.5 rounded-full"},de={class:"space-y-2"},ue={key:0,class:"text-sm text-muted-foreground text-center py-8"},ce=L({__name:"TaskList",props:{tasks:{},loading:{type:Boolean}},emits:["edit","complete","delete"],setup(s,{emit:d}){const n=s,c=d,m=F(()=>{var o;const u={doing:[],todo:[],done:[],cancelled:[]};for(const l of n.tasks)(o=u[l.status])==null||o.push(l);return u}),k={doing:"In Progress",todo:"To Do",done:"Done",cancelled:"Cancelled"};return(u,o)=>(a(),r("div",ae,[s.loading?(a(),r("div",ne,"Loading tasks...")):(a(),r(_,{key:1},[(a(!0),r(_,null,V(m.value,(l,y)=>H((a(),r("div",{key:y},[t("div",le,[t("h3",re,v(k[y]),1),t("span",ie,v(l.length),1)]),t("div",de,[(a(!0),r(_,null,V(l,p=>(a(),K(oe,{key:p.id,task:p,draggable:"",onEdit:C=>c("edit",p),onComplete:C=>c("complete",p),onDelete:C=>c("delete",p)},null,8,["task","onEdit","onComplete","onDelete"]))),128))])])),[[U,l.length>0]])),128)),n.tasks.length?h("",!0):(a(),r("div",ue," No tasks found "))],64))]))}}),me={class:"p-6"},ke={class:"flex items-center gap-3 mb-6 flex-wrap"},fe={class:"flex items-center gap-1"},be=L({__name:"PlannerView",setup(s){const d=N(),n=b(T(new Date)),c=b(!1),m=b(null),k=b("");I(()=>{d.fetchAll()}),O(n,()=>{d.fetchForDate(n.value)});const u=F(()=>k.value?d.tasks.filter(i=>{var e;return((e=i.project_id)==null?void 0:e.toLowerCase().includes(k.value.toLowerCase()))||i.title.toLowerCase().includes(k.value.toLowerCase())}):d.tasks);function o(){m.value=null,c.value=!0}function l(i){m.value=i,c.value=!0}async function y(i){try{m.value?(await d.update(m.value.id,i),g.success("Task updated")):(await d.create(i),g.success("Task created")),c.value=!1,d.fetchForDate(n.value)}catch{g.error("Failed to save task")}}async function p(i){try{await d.complete(i.id),g.success("Task completed")}catch{g.error("Failed to complete task")}}async function C(i){if(confirm(`Delete "${i.title}"?`))try{await d.remove(i.id),g.success("Task deleted")}catch{g.error("Failed to delete task")}}function M(i){const e=new Date(n.value);e.setDate(e.getDate()+i),n.value=T(e)}return(i,e)=>(a(),r("div",me,[t("div",ke,[e[10]||(e[10]=t("h2",{class:"text-lg font-semibold text-foreground flex-1"},"Planner",-1)),t("div",fe,[f($,{variant:"outline",size:"sm",onClick:e[0]||(e[0]=x=>M(-1))},{default:w(()=>[...e[6]||(e[6]=[t("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)])]),_:1}),f(j,{modelValue:n.value,"onUpdate:modelValue":e[1]||(e[1]=x=>n.value=x),type:"date",class:"h-8 w-36 text-xs"},null,8,["modelValue"]),f($,{variant:"outline",size:"sm",onClick:e[2]||(e[2]=x=>M(1))},{default:w(()=>[...e[7]||(e[7]=[t("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1}),f($,{variant:"outline",size:"sm",onClick:e[3]||(e[3]=x=>n.value=D(T)(new Date))},{default:w(()=>[...e[8]||(e[8]=[B("Today",-1)])]),_:1})]),f(j,{modelValue:k.value,"onUpdate:modelValue":e[4]||(e[4]=x=>k.value=x),placeholder:"Search tasks...",class:"h-8 w-40 text-xs"},null,8,["modelValue"]),f($,{size:"sm",onClick:o},{default:w(()=>[...e[9]||(e[9]=[t("svg",{class:"h-4 w-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),B(" New Task ",-1)])]),_:1})]),f(ce,{tasks:u.value,loading:D(d).loading,onEdit:l,onComplete:p,onDelete:C},null,8,["tasks","loading"]),f(E,{open:c.value,task:m.value,"default-date":n.value,onClose:e[5]||(e[5]=x=>c.value=!1),onSave:y},null,8,["open","task","default-date"])]))}});export{be as default}; +import{u as N,_ as E}from"./TaskForm.vue_vue_type_script_setup_true_lang-DBxohyhw.js";import{d as L,o as a,c as r,a as t,p as A,t as v,F as _,l as V,A as P,j as h,e as f,w,k as B,i as D,h as z,m as F,y as H,C as U,n as K,r as b,x as I,v as O,K as g}from"./index-B9hhyP-T.js";import{_ as q}from"./Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js";import{f as S,i as T}from"./utils-DuVQys2y.js";import{_ as $}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import{_ as j}from"./Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js";import"./Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js";import"./devops-Dn5wUB1p.js";const G=["draggable"],J={class:"flex items-start gap-2"},Q=["title"],R={class:"flex-1 min-w-0"},W={class:"text-sm font-medium text-foreground leading-tight truncate"},X={key:0,class:"flex items-center gap-1 mt-1 flex-wrap"},Y={class:"flex items-center gap-2 mt-1.5 flex-wrap"},Z={key:0,class:"text-xs text-muted-foreground"},ee={key:1,class:"text-xs text-emerald-400"},te={key:2,class:"text-xs text-blue-400 ml-auto",title:"Azure DevOps"},se={class:"flex items-center gap-1 opacity-0 group-hover:opacity-100 shrink-0"},oe=L({__name:"TaskCard",props:{task:{},draggable:{type:Boolean}},emits:["edit","complete","delete"],setup(s,{emit:d}){const n=d,c=u=>({todo:"outline",doing:"default",done:"success",cancelled:"secondary"})[u],m=u=>["","Low","Medium","High","Critical","Blocker"][u]??"Unknown",k=u=>u>=4?"bg-red-500":u===3?"bg-amber-500":"bg-emerald-500";return(u,o)=>(a(),r("div",{draggable:s.draggable,class:"rounded-lg border border-border bg-card p-3 hover:border-primary/50 transition-colors cursor-pointer group",onClick:o[2]||(o[2]=l=>n("edit",s.task))},[t("div",J,[t("div",{class:A(["h-2 w-2 rounded-full mt-1.5 shrink-0",k(s.task.priority)]),title:m(s.task.priority)},null,10,Q),t("div",R,[t("p",W,v(s.task.title),1),s.task.tags.length?(a(),r("div",X,[(a(!0),r(_,null,V(s.task.tags,l=>(a(),r("span",{key:l.id,class:"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium",style:P({background:`${l.color_hex}22`,color:l.color_hex})},v(l.name),5))),128))])):h("",!0),t("div",Y,[f(q,{variant:c(s.task.status),class:"text-xs py-0"},{default:w(()=>[B(v(s.task.status),1)]),_:1},8,["variant"]),s.task.estimate_hours?(a(),r("span",Z," ~"+v(D(S)(s.task.estimate_hours)),1)):h("",!0),s.task.actual_hours?(a(),r("span",ee,v(D(S)(s.task.actual_hours))+" actual ",1)):h("",!0),s.task.azure_work_item_id?(a(),r("span",te," #"+v(s.task.azure_work_item_id),1)):h("",!0)])]),t("div",se,[s.task.status!=="done"?(a(),r("button",{key:0,class:"p-1 rounded hover:bg-emerald-500/20 text-emerald-400",title:"Mark done",onClick:o[0]||(o[0]=z(l=>n("complete",s.task),["stop"]))},[...o[3]||(o[3]=[t("svg",{class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1)])])):h("",!0),t("button",{class:"p-1 rounded hover:bg-red-500/20 text-red-400",title:"Delete",onClick:o[1]||(o[1]=z(l=>n("delete",s.task),["stop"]))},[...o[4]||(o[4]=[t("svg",{class:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])])])])],8,G))}}),ae={class:"space-y-6"},ne={key:0,class:"text-sm text-muted-foreground py-4 text-center"},le={class:"flex items-center gap-2 mb-2"},re={class:"text-xs font-semibold uppercase tracking-wide text-muted-foreground"},ie={class:"text-xs text-muted-foreground bg-muted px-1.5 py-0.5 rounded-full"},de={class:"space-y-2"},ue={key:0,class:"text-sm text-muted-foreground text-center py-8"},ce=L({__name:"TaskList",props:{tasks:{},loading:{type:Boolean}},emits:["edit","complete","delete"],setup(s,{emit:d}){const n=s,c=d,m=F(()=>{var o;const u={doing:[],todo:[],done:[],cancelled:[]};for(const l of n.tasks)(o=u[l.status])==null||o.push(l);return u}),k={doing:"In Progress",todo:"To Do",done:"Done",cancelled:"Cancelled"};return(u,o)=>(a(),r("div",ae,[s.loading?(a(),r("div",ne,"Loading tasks...")):(a(),r(_,{key:1},[(a(!0),r(_,null,V(m.value,(l,y)=>H((a(),r("div",{key:y},[t("div",le,[t("h3",re,v(k[y]),1),t("span",ie,v(l.length),1)]),t("div",de,[(a(!0),r(_,null,V(l,p=>(a(),K(oe,{key:p.id,task:p,draggable:"",onEdit:C=>c("edit",p),onComplete:C=>c("complete",p),onDelete:C=>c("delete",p)},null,8,["task","onEdit","onComplete","onDelete"]))),128))])])),[[U,l.length>0]])),128)),n.tasks.length?h("",!0):(a(),r("div",ue," No tasks found "))],64))]))}}),me={class:"p-6"},ke={class:"flex items-center gap-3 mb-6 flex-wrap"},fe={class:"flex items-center gap-1"},be=L({__name:"PlannerView",setup(s){const d=N(),n=b(T(new Date)),c=b(!1),m=b(null),k=b("");I(()=>{d.fetchAll()}),O(n,()=>{d.fetchForDate(n.value)});const u=F(()=>k.value?d.tasks.filter(i=>{var e;return((e=i.project_id)==null?void 0:e.toLowerCase().includes(k.value.toLowerCase()))||i.title.toLowerCase().includes(k.value.toLowerCase())}):d.tasks);function o(){m.value=null,c.value=!0}function l(i){m.value=i,c.value=!0}async function y(i){try{m.value?(await d.update(m.value.id,i),g.success("Task updated")):(await d.create(i),g.success("Task created")),c.value=!1,d.fetchForDate(n.value)}catch{g.error("Failed to save task")}}async function p(i){try{await d.complete(i.id),g.success("Task completed")}catch{g.error("Failed to complete task")}}async function C(i){if(confirm(`Delete "${i.title}"?`))try{await d.remove(i.id),g.success("Task deleted")}catch{g.error("Failed to delete task")}}function M(i){const e=new Date(n.value);e.setDate(e.getDate()+i),n.value=T(e)}return(i,e)=>(a(),r("div",me,[t("div",ke,[e[10]||(e[10]=t("h2",{class:"text-lg font-semibold text-foreground flex-1"},"Planner",-1)),t("div",fe,[f($,{variant:"outline",size:"sm",onClick:e[0]||(e[0]=x=>M(-1))},{default:w(()=>[...e[6]||(e[6]=[t("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)])]),_:1}),f(j,{modelValue:n.value,"onUpdate:modelValue":e[1]||(e[1]=x=>n.value=x),type:"date",class:"h-8 w-36 text-xs"},null,8,["modelValue"]),f($,{variant:"outline",size:"sm",onClick:e[2]||(e[2]=x=>M(1))},{default:w(()=>[...e[7]||(e[7]=[t("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1}),f($,{variant:"outline",size:"sm",onClick:e[3]||(e[3]=x=>n.value=D(T)(new Date))},{default:w(()=>[...e[8]||(e[8]=[B("Today",-1)])]),_:1})]),f(j,{modelValue:k.value,"onUpdate:modelValue":e[4]||(e[4]=x=>k.value=x),placeholder:"Search tasks...",class:"h-8 w-40 text-xs"},null,8,["modelValue"]),f($,{size:"sm",onClick:o},{default:w(()=>[...e[9]||(e[9]=[t("svg",{class:"h-4 w-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),B(" New Task ",-1)])]),_:1})]),f(ce,{tasks:u.value,loading:D(d).loading,onEdit:l,onComplete:p,onDelete:C},null,8,["tasks","loading"]),f(E,{open:c.value,task:m.value,"default-date":n.value,onClose:e[5]||(e[5]=x=>c.value=!1),onSave:y},null,8,["open","task","default-date"])]))}});export{be as default}; diff --git a/src/static/assets/Progress.vue_vue_type_script_setup_true_lang-C9HXKxSB.js b/src/static/assets/Progress.vue_vue_type_script_setup_true_lang-o01-BFVV.js similarity index 81% rename from src/static/assets/Progress.vue_vue_type_script_setup_true_lang-C9HXKxSB.js rename to src/static/assets/Progress.vue_vue_type_script_setup_true_lang-o01-BFVV.js index 7eaa5ce..9fcb003 100644 --- a/src/static/assets/Progress.vue_vue_type_script_setup_true_lang-C9HXKxSB.js +++ b/src/static/assets/Progress.vue_vue_type_script_setup_true_lang-o01-BFVV.js @@ -1 +1 @@ -import{c as r}from"./utils-B1YxgOQw.js";import{d as s,o as n,c as t,p as l,i as c,a as d,A as u}from"./index-CO3lBHVT.js";const h=s({__name:"Progress",props:{value:{},max:{default:100},class:{},color:{default:"default"}},setup(a){const e=a,o=()=>Math.min(100,Math.max(0,e.value/e.max*100));return(i,m)=>(n(),t("div",{class:l(c(r)("relative h-2 w-full overflow-hidden rounded-full bg-secondary",e.class))},[d("div",{class:l(["h-full rounded-full transition-all duration-300",{"bg-primary":a.color==="default","bg-emerald-500":a.color==="success","bg-amber-500":a.color==="warning","bg-red-500":a.color==="danger"}]),style:u({width:`${o()}%`})},null,6)],2))}});export{h as _}; +import{c as r}from"./utils-DuVQys2y.js";import{d as s,o as n,c as t,p as l,i as c,a as d,A as u}from"./index-B9hhyP-T.js";const h=s({__name:"Progress",props:{value:{},max:{default:100},class:{},color:{default:"default"}},setup(a){const e=a,o=()=>Math.min(100,Math.max(0,e.value/e.max*100));return(i,m)=>(n(),t("div",{class:l(c(r)("relative h-2 w-full overflow-hidden rounded-full bg-secondary",e.class))},[d("div",{class:l(["h-full rounded-full transition-all duration-300",{"bg-primary":a.color==="default","bg-emerald-500":a.color==="success","bg-amber-500":a.color==="warning","bg-red-500":a.color==="danger"}]),style:u({width:`${o()}%`})},null,6)],2))}});export{h as _}; diff --git a/src/static/assets/ProjectDetailView-CJKn-onp.js b/src/static/assets/ProjectDetailView-BJap0IQ0.js similarity index 94% rename from src/static/assets/ProjectDetailView-CJKn-onp.js rename to src/static/assets/ProjectDetailView-BJap0IQ0.js index 0f2e260..62b5506 100644 --- a/src/static/assets/ProjectDetailView-CJKn-onp.js +++ b/src/static/assets/ProjectDetailView-BJap0IQ0.js @@ -1 +1 @@ -import{d as $,x as N,c as t,e as l,F as u,a as o,t as n,j as c,i as _,w as r,g as D,r as b,o as e,k as m,l as x,A as k}from"./index-CO3lBHVT.js";import{d as T}from"./dashboard-4_z0ZWLj.js";import{_ as f,a as p}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import{_ as h,a as v}from"./CardTitle.vue_vue_type_script_setup_true_lang-CpgNrOxB.js";import{f as y,_ as V,b as F}from"./utils-B1YxgOQw.js";const A={class:"p-6"},B={key:0,class:"flex items-center justify-center h-40"},C={class:"mb-6"},R={class:"flex items-start justify-between gap-4 flex-wrap"},S={class:"text-xl font-bold text-foreground"},z={class:"flex items-center gap-3 mt-1 flex-wrap"},M={key:0,class:"text-sm text-muted-foreground"},P={key:1,class:"text-xs bg-muted text-muted-foreground px-2 py-1 rounded"},E=["href"],H={class:"text-right"},I={class:"text-2xl font-bold text-foreground"},L={class:"h-32 flex items-end gap-px"},U=["title"],q={class:"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6"},G={key:0,class:"text-sm text-muted-foreground"},J={key:1,class:"space-y-1.5"},K=["title"],O={class:"text-foreground shrink-0 ml-2"},Q={key:0,class:"text-sm text-muted-foreground"},W={key:1,class:"space-y-2"},X={class:"text-xs text-foreground w-24 truncate shrink-0"},Y={class:"flex-1 h-2 bg-secondary rounded-full overflow-hidden"},Z={class:"text-xs text-muted-foreground w-8 text-right shrink-0"},tt={key:0,class:"text-sm text-muted-foreground"},et={key:1,class:"space-y-2"},st={class:"flex-1 min-w-0"},ot={class:"text-xs text-foreground"},at={key:0,class:"text-xs text-muted-foreground mt-0.5 line-clamp-2"},lt={class:"text-right shrink-0"},rt={class:"text-xs font-medium text-foreground"},dt={class:"text-xs text-muted-foreground"},nt={key:2,class:"text-center text-muted-foreground py-12"},pt=$({__name:"ProjectDetailView",setup(it){const w=D().params.id,a=b(null),g=b(!1);N(async()=>{g.value=!0;try{const i=await T.project(w);a.value=i.data}finally{g.value=!1}});const j=()=>{var i;return Math.max(...((i=a.value)==null?void 0:i.timeline.map(d=>d.hours))??[1],1)};return(i,d)=>(e(),t("div",A,[g.value?(e(),t("div",B,[l(V,{size:"lg",class:"text-primary"})])):a.value?(e(),t(u,{key:1},[o("div",C,[o("div",R,[o("div",null,[o("h2",S,n(a.value.display_name),1),o("div",z,[a.value.client?(e(),t("span",M,n(a.value.client),1)):c("",!0),a.value.job_number?(e(),t("span",P,n(a.value.job_number),1)):c("",!0),a.value.repo_url?(e(),t("a",{key:2,href:a.value.repo_url,target:"_blank",class:"text-xs text-primary hover:underline"}," Repository → ",8,E)):c("",!0)])]),o("div",H,[o("p",I,n(_(y)(a.value.total_hours)),1),d[0]||(d[0]=o("p",{class:"text-xs text-muted-foreground"},"total hours",-1))])])]),l(f,{class:"mb-6"},{default:r(()=>[l(h,{class:"pb-2"},{default:r(()=>[l(v,{class:"text-sm"},{default:r(()=>[...d[1]||(d[1]=[m("Daily Activity",-1)])]),_:1})]),_:1}),l(p,null,{default:r(()=>[o("div",L,[(e(!0),t(u,null,x(a.value.timeline,s=>(e(),t("div",{key:s.date,class:"flex-1 bg-primary/70 hover:bg-primary rounded-t transition-colors",style:k({height:`${s.hours/j()*100}%`}),title:`${s.date}: ${_(y)(s.hours)}`},null,12,U))),128))])]),_:1})]),_:1}),o("div",q,[l(f,null,{default:r(()=>[l(h,{class:"pb-2"},{default:r(()=>[l(v,{class:"text-sm"},{default:r(()=>[...d[2]||(d[2]=[m("Top Files",-1)])]),_:1})]),_:1}),l(p,null,{default:r(()=>[a.value.top_files.length?(e(),t("div",J,[(e(!0),t(u,null,x(a.value.top_files.slice(0,10),s=>(e(),t("div",{key:s.path,class:"flex items-center justify-between text-xs"},[o("span",{class:"text-muted-foreground truncate max-w-[200px]",title:s.path},n(s.path.split("/").pop()),9,K),o("span",O,n(s.count)+"×",1)]))),128))])):(e(),t("div",G,"No data"))]),_:1})]),_:1}),l(f,null,{default:r(()=>[l(h,{class:"pb-2"},{default:r(()=>[l(v,{class:"text-sm"},{default:r(()=>[...d[3]||(d[3]=[m("Tool Usage",-1)])]),_:1})]),_:1}),l(p,null,{default:r(()=>[a.value.top_tools.length?(e(),t("div",W,[(e(!0),t(u,null,x(a.value.top_tools.slice(0,8),s=>(e(),t("div",{key:s.tool,class:"flex items-center gap-2"},[o("span",X,n(s.tool),1),o("div",Y,[o("div",{class:"h-full bg-primary rounded-full",style:k({width:`${s.pct}%`})},null,4)]),o("span",Z,n(s.pct.toFixed(0))+"% ",1)]))),128))])):(e(),t("div",Q,"No data"))]),_:1})]),_:1})]),l(f,null,{default:r(()=>[l(h,{class:"pb-2"},{default:r(()=>[l(v,{class:"text-sm"},{default:r(()=>[...d[4]||(d[4]=[m("Recent Sessions",-1)])]),_:1})]),_:1}),l(p,null,{default:r(()=>[a.value.sessions.length?(e(),t("div",et,[(e(!0),t(u,null,x(a.value.sessions.slice(0,50),s=>(e(),t("div",{key:s.id,class:"flex items-start gap-3 py-2 border-b border-border last:border-0"},[o("div",st,[o("p",ot,n(_(F)(s.start_at)),1),s.summary?(e(),t("p",at,n(s.summary),1)):c("",!0)]),o("div",lt,[o("p",rt,n(_(y)(s.duration_hours)),1),o("p",dt,n(s.commit_count)+" commits ",1)])]))),128))])):(e(),t("div",tt,"No sessions"))]),_:1})]),_:1})],64)):(e(),t("div",nt," Project not found "))]))}});export{pt as default}; +import{d as $,x as N,c as t,e as l,F as u,a as o,t as n,j as c,i as _,w as r,g as D,r as b,o as e,k as m,l as x,A as k}from"./index-B9hhyP-T.js";import{d as T}from"./dashboard-DFJs0AgU.js";import{_ as f,a as p}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import{_ as h,a as v}from"./CardTitle.vue_vue_type_script_setup_true_lang-Twj0MqtU.js";import{f as y,_ as V,b as F}from"./utils-DuVQys2y.js";const A={class:"p-6"},B={key:0,class:"flex items-center justify-center h-40"},C={class:"mb-6"},R={class:"flex items-start justify-between gap-4 flex-wrap"},S={class:"text-xl font-bold text-foreground"},z={class:"flex items-center gap-3 mt-1 flex-wrap"},M={key:0,class:"text-sm text-muted-foreground"},P={key:1,class:"text-xs bg-muted text-muted-foreground px-2 py-1 rounded"},E=["href"],H={class:"text-right"},I={class:"text-2xl font-bold text-foreground"},L={class:"h-32 flex items-end gap-px"},U=["title"],q={class:"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6"},G={key:0,class:"text-sm text-muted-foreground"},J={key:1,class:"space-y-1.5"},K=["title"],O={class:"text-foreground shrink-0 ml-2"},Q={key:0,class:"text-sm text-muted-foreground"},W={key:1,class:"space-y-2"},X={class:"text-xs text-foreground w-24 truncate shrink-0"},Y={class:"flex-1 h-2 bg-secondary rounded-full overflow-hidden"},Z={class:"text-xs text-muted-foreground w-8 text-right shrink-0"},tt={key:0,class:"text-sm text-muted-foreground"},et={key:1,class:"space-y-2"},st={class:"flex-1 min-w-0"},ot={class:"text-xs text-foreground"},at={key:0,class:"text-xs text-muted-foreground mt-0.5 line-clamp-2"},lt={class:"text-right shrink-0"},rt={class:"text-xs font-medium text-foreground"},dt={class:"text-xs text-muted-foreground"},nt={key:2,class:"text-center text-muted-foreground py-12"},pt=$({__name:"ProjectDetailView",setup(it){const w=D().params.id,a=b(null),g=b(!1);N(async()=>{g.value=!0;try{const i=await T.project(w);a.value=i.data}finally{g.value=!1}});const j=()=>{var i;return Math.max(...((i=a.value)==null?void 0:i.timeline.map(d=>d.hours))??[1],1)};return(i,d)=>(e(),t("div",A,[g.value?(e(),t("div",B,[l(V,{size:"lg",class:"text-primary"})])):a.value?(e(),t(u,{key:1},[o("div",C,[o("div",R,[o("div",null,[o("h2",S,n(a.value.display_name),1),o("div",z,[a.value.client?(e(),t("span",M,n(a.value.client),1)):c("",!0),a.value.job_number?(e(),t("span",P,n(a.value.job_number),1)):c("",!0),a.value.repo_url?(e(),t("a",{key:2,href:a.value.repo_url,target:"_blank",class:"text-xs text-primary hover:underline"}," Repository → ",8,E)):c("",!0)])]),o("div",H,[o("p",I,n(_(y)(a.value.total_hours)),1),d[0]||(d[0]=o("p",{class:"text-xs text-muted-foreground"},"total hours",-1))])])]),l(f,{class:"mb-6"},{default:r(()=>[l(h,{class:"pb-2"},{default:r(()=>[l(v,{class:"text-sm"},{default:r(()=>[...d[1]||(d[1]=[m("Daily Activity",-1)])]),_:1})]),_:1}),l(p,null,{default:r(()=>[o("div",L,[(e(!0),t(u,null,x(a.value.timeline,s=>(e(),t("div",{key:s.date,class:"flex-1 bg-primary/70 hover:bg-primary rounded-t transition-colors",style:k({height:`${s.hours/j()*100}%`}),title:`${s.date}: ${_(y)(s.hours)}`},null,12,U))),128))])]),_:1})]),_:1}),o("div",q,[l(f,null,{default:r(()=>[l(h,{class:"pb-2"},{default:r(()=>[l(v,{class:"text-sm"},{default:r(()=>[...d[2]||(d[2]=[m("Top Files",-1)])]),_:1})]),_:1}),l(p,null,{default:r(()=>[a.value.top_files.length?(e(),t("div",J,[(e(!0),t(u,null,x(a.value.top_files.slice(0,10),s=>(e(),t("div",{key:s.path,class:"flex items-center justify-between text-xs"},[o("span",{class:"text-muted-foreground truncate max-w-[200px]",title:s.path},n(s.path.split("/").pop()),9,K),o("span",O,n(s.count)+"×",1)]))),128))])):(e(),t("div",G,"No data"))]),_:1})]),_:1}),l(f,null,{default:r(()=>[l(h,{class:"pb-2"},{default:r(()=>[l(v,{class:"text-sm"},{default:r(()=>[...d[3]||(d[3]=[m("Tool Usage",-1)])]),_:1})]),_:1}),l(p,null,{default:r(()=>[a.value.top_tools.length?(e(),t("div",W,[(e(!0),t(u,null,x(a.value.top_tools.slice(0,8),s=>(e(),t("div",{key:s.tool,class:"flex items-center gap-2"},[o("span",X,n(s.tool),1),o("div",Y,[o("div",{class:"h-full bg-primary rounded-full",style:k({width:`${s.pct}%`})},null,4)]),o("span",Z,n(s.pct.toFixed(0))+"% ",1)]))),128))])):(e(),t("div",Q,"No data"))]),_:1})]),_:1})]),l(f,null,{default:r(()=>[l(h,{class:"pb-2"},{default:r(()=>[l(v,{class:"text-sm"},{default:r(()=>[...d[4]||(d[4]=[m("Recent Sessions",-1)])]),_:1})]),_:1}),l(p,null,{default:r(()=>[a.value.sessions.length?(e(),t("div",et,[(e(!0),t(u,null,x(a.value.sessions.slice(0,50),s=>(e(),t("div",{key:s.id,class:"flex items-start gap-3 py-2 border-b border-border last:border-0"},[o("div",st,[o("p",ot,n(_(F)(s.start_at)),1),s.summary?(e(),t("p",at,n(s.summary),1)):c("",!0)]),o("div",lt,[o("p",rt,n(_(y)(s.duration_hours)),1),o("p",dt,n(s.commit_count)+" commits ",1)])]))),128))])):(e(),t("div",tt,"No sessions"))]),_:1})]),_:1})],64)):(e(),t("div",nt," Project not found "))]))}});export{pt as default}; diff --git a/src/static/assets/ProjectsView-CmpkpAqw.js b/src/static/assets/ProjectsView-CZF7uexl.js similarity index 89% rename from src/static/assets/ProjectsView-CmpkpAqw.js rename to src/static/assets/ProjectsView-CZF7uexl.js index 82756c0..3477fb0 100644 --- a/src/static/assets/ProjectsView-CmpkpAqw.js +++ b/src/static/assets/ProjectsView-CZF7uexl.js @@ -1 +1 @@ -import{d as p,x as g,c as r,a as s,e as d,F as v,l as y,r as _,o,n as h,w as f,t as a,j as i,i as u,p as b,f as k}from"./index-CO3lBHVT.js";import{d as w}from"./dashboard-4_z0ZWLj.js";import{a as C,_ as $}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import{_ as B}from"./Progress.vue_vue_type_script_setup_true_lang-C9HXKxSB.js";import{_ as N,f as V,a as D}from"./utils-B1YxgOQw.js";const F={class:"p-6"},j={key:0,class:"flex items-center justify-center h-40"},z={key:1,class:"text-center text-muted-foreground py-12"},L={key:2,class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4"},P={class:"flex items-start justify-between gap-2 mb-3"},S={class:"min-w-0"},A={class:"font-semibold text-sm text-foreground truncate"},E={key:0,class:"text-xs text-muted-foreground truncate"},M={key:0,class:"text-xs bg-muted text-muted-foreground px-1.5 py-0.5 rounded shrink-0"},R={class:"space-y-1.5"},T={class:"flex items-center justify-between text-xs"},q={class:"font-medium text-foreground"},G={class:"flex items-center justify-between text-xs"},H={class:"text-foreground"},I={key:0,class:"flex items-center justify-between text-xs"},J={class:"text-foreground"},K={key:0,class:"mt-3"},O={class:"flex items-center justify-between text-xs mb-1"},st=p({__name:"ProjectsView",setup(Q){const m=k(),l=_([]),c=_(!1);g(async()=>{c.value=!0;try{const n=await w.projects({});l.value=n.data.sort((e,t)=>t.total_hours-e.total_hours)}finally{c.value=!1}});const x=n=>n?n>90?"danger":n>70?"warning":"success":"default";return(n,e)=>(o(),r("div",F,[e[4]||(e[4]=s("h2",{class:"text-lg font-semibold text-foreground mb-6"},"Projects",-1)),c.value?(o(),r("div",j,[d(N,{size:"lg",class:"text-primary"})])):l.value.length===0?(o(),r("div",z," No projects found ")):(o(),r("div",L,[(o(!0),r(v,null,y(l.value,t=>(o(),h($,{key:t.project_id,class:"cursor-pointer hover:border-primary/50 transition-colors",onClick:U=>u(m).push(`/projects/${t.project_id}`)},{default:f(()=>[d(C,{class:"p-4"},{default:f(()=>[s("div",P,[s("div",S,[s("p",A,a(t.display_name),1),t.client?(o(),r("p",E,a(t.client),1)):i("",!0)]),t.job_number?(o(),r("span",M,a(t.job_number),1)):i("",!0)]),s("div",R,[s("div",T,[e[0]||(e[0]=s("span",{class:"text-muted-foreground"},"Total hours",-1)),s("span",q,a(u(V)(t.total_hours)),1)]),s("div",G,[e[1]||(e[1]=s("span",{class:"text-muted-foreground"},"Sessions",-1)),s("span",H,a(t.session_count),1)]),t.last_active?(o(),r("div",I,[e[2]||(e[2]=s("span",{class:"text-muted-foreground"},"Last active",-1)),s("span",J,a(u(D)(t.last_active)),1)])):i("",!0)]),t.progress_pct!==null?(o(),r("div",K,[s("div",O,[e[3]||(e[3]=s("span",{class:"text-muted-foreground"},"Budget",-1)),s("span",{class:b(t.progress_pct>90?"text-red-400":"text-muted-foreground")},a(t.progress_pct.toFixed(0))+"% ",3)]),d(B,{value:t.progress_pct,color:x(t.progress_pct)},null,8,["value","color"])])):i("",!0)]),_:2},1024)]),_:2},1032,["onClick"]))),128))]))]))}});export{st as default}; +import{d as p,x as g,c as r,a as s,e as d,F as v,l as y,r as _,o,n as h,w as f,t as a,j as i,i as u,p as b,f as k}from"./index-B9hhyP-T.js";import{d as w}from"./dashboard-DFJs0AgU.js";import{a as C,_ as $}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import{_ as B}from"./Progress.vue_vue_type_script_setup_true_lang-o01-BFVV.js";import{_ as N,f as V,a as D}from"./utils-DuVQys2y.js";const F={class:"p-6"},j={key:0,class:"flex items-center justify-center h-40"},z={key:1,class:"text-center text-muted-foreground py-12"},L={key:2,class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4"},P={class:"flex items-start justify-between gap-2 mb-3"},S={class:"min-w-0"},A={class:"font-semibold text-sm text-foreground truncate"},E={key:0,class:"text-xs text-muted-foreground truncate"},M={key:0,class:"text-xs bg-muted text-muted-foreground px-1.5 py-0.5 rounded shrink-0"},R={class:"space-y-1.5"},T={class:"flex items-center justify-between text-xs"},q={class:"font-medium text-foreground"},G={class:"flex items-center justify-between text-xs"},H={class:"text-foreground"},I={key:0,class:"flex items-center justify-between text-xs"},J={class:"text-foreground"},K={key:0,class:"mt-3"},O={class:"flex items-center justify-between text-xs mb-1"},st=p({__name:"ProjectsView",setup(Q){const m=k(),l=_([]),c=_(!1);g(async()=>{c.value=!0;try{const n=await w.projects({});l.value=n.data.sort((e,t)=>t.total_hours-e.total_hours)}finally{c.value=!1}});const x=n=>n?n>90?"danger":n>70?"warning":"success":"default";return(n,e)=>(o(),r("div",F,[e[4]||(e[4]=s("h2",{class:"text-lg font-semibold text-foreground mb-6"},"Projects",-1)),c.value?(o(),r("div",j,[d(N,{size:"lg",class:"text-primary"})])):l.value.length===0?(o(),r("div",z," No projects found ")):(o(),r("div",L,[(o(!0),r(v,null,y(l.value,t=>(o(),h($,{key:t.project_id,class:"cursor-pointer hover:border-primary/50 transition-colors",onClick:U=>u(m).push(`/projects/${t.project_id}`)},{default:f(()=>[d(C,{class:"p-4"},{default:f(()=>[s("div",P,[s("div",S,[s("p",A,a(t.display_name),1),t.client?(o(),r("p",E,a(t.client),1)):i("",!0)]),t.job_number?(o(),r("span",M,a(t.job_number),1)):i("",!0)]),s("div",R,[s("div",T,[e[0]||(e[0]=s("span",{class:"text-muted-foreground"},"Total hours",-1)),s("span",q,a(u(V)(t.total_hours)),1)]),s("div",G,[e[1]||(e[1]=s("span",{class:"text-muted-foreground"},"Sessions",-1)),s("span",H,a(t.session_count),1)]),t.last_active?(o(),r("div",I,[e[2]||(e[2]=s("span",{class:"text-muted-foreground"},"Last active",-1)),s("span",J,a(u(D)(t.last_active)),1)])):i("",!0)]),t.progress_pct!==null?(o(),r("div",K,[s("div",O,[e[3]||(e[3]=s("span",{class:"text-muted-foreground"},"Budget",-1)),s("span",{class:b(t.progress_pct>90?"text-red-400":"text-muted-foreground")},a(t.progress_pct.toFixed(0))+"% ",3)]),d(B,{value:t.progress_pct,color:x(t.progress_pct)},null,8,["value","color"])])):i("",!0)]),_:2},1024)]),_:2},1032,["onClick"]))),128))]))]))}});export{st as default}; diff --git a/src/static/assets/ReportsView-RRBaLOSo.js b/src/static/assets/ReportsView-EBcs_rl2.js similarity index 99% rename from src/static/assets/ReportsView-RRBaLOSo.js rename to src/static/assets/ReportsView-EBcs_rl2.js index 9efd1c1..14f7a7a 100644 --- a/src/static/assets/ReportsView-RRBaLOSo.js +++ b/src/static/assets/ReportsView-EBcs_rl2.js @@ -1,4 +1,4 @@ -var Ce=Object.defineProperty;var ae=a=>{throw TypeError(a)};var Ee=(a,t,e)=>t in a?Ce(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e;var k=(a,t,e)=>Ee(a,typeof t!="symbol"?t+"":t,e),Le=(a,t,e)=>t.has(a)||ae("Cannot "+e);var ce=(a,t,e)=>t.has(a)?ae("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(a):t.set(a,e);var Z=(a,t,e)=>(Le(a,t,"access private method"),e);import{D as V,d as Be,x as qe,c as z,a as x,p as U,e as P,w as I,F as Ze,l as Pe,r as A,o as $,k as G,n as pe,t as W,i as De,j as he,K as ue,_ as Me}from"./index-CO3lBHVT.js";import{a as Qe,_ as je}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import{_ as fe}from"./Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js";import{_ as Ne}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import{_ as Oe,a as He,i as Fe}from"./utils-B1YxgOQw.js";const ge={list:()=>V.get("/api/reports"),get:a=>V.get(`/api/reports/${a}`),generate:a=>V.post("/api/reports/generate",a)};function J(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}let S=J();function we(a){S=a}const ye=/[&<>"']/,Ve=new RegExp(ye.source,"g"),$e=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Ue=new RegExp($e.source,"g"),Ge={"&":"&","<":"<",">":">",'"':""","'":"'"},de=a=>Ge[a];function m(a,t){if(t){if(ye.test(a))return a.replace(Ve,de)}else if($e.test(a))return a.replace(Ue,de);return a}const We=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Xe(a){return a.replace(We,(t,e)=>(e=e.toLowerCase(),e==="colon"?":":e.charAt(0)==="#"?e.charAt(1)==="x"?String.fromCharCode(parseInt(e.substring(2),16)):String.fromCharCode(+e.substring(1)):""))}const Ke=/(^|[^\[])\^/g;function d(a,t){let e=typeof a=="string"?a:a.source;t=t||"";const n={replace:(i,r)=>{let s=typeof r=="string"?r:r.source;return s=s.replace(Ke,"$1"),e=e.replace(i,s),n},getRegex:()=>new RegExp(e,t)};return n}function ke(a){try{a=encodeURI(a).replace(/%25/g,"%")}catch{return null}return a}const E={exec:()=>null};function xe(a,t){const e=a.replace(/\|/g,(r,s,l)=>{let o=!1,u=s;for(;--u>=0&&l[u]==="\\";)o=!o;return o?"|":" |"}),n=e.split(/ \|/);let i=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length{throw TypeError(a)};var Ee=(a,t,e)=>t in a?Ce(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e;var k=(a,t,e)=>Ee(a,typeof t!="symbol"?t+"":t,e),Le=(a,t,e)=>t.has(a)||ae("Cannot "+e);var ce=(a,t,e)=>t.has(a)?ae("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(a):t.set(a,e);var Z=(a,t,e)=>(Le(a,t,"access private method"),e);import{D as V,d as Be,x as qe,c as z,a as x,p as U,e as P,w as I,F as Ze,l as Pe,r as A,o as $,k as G,n as pe,t as W,i as De,j as he,K as ue,_ as Me}from"./index-B9hhyP-T.js";import{a as Qe,_ as je}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import{_ as fe}from"./Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js";import{_ as Ne}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import{_ as Oe,a as He,i as Fe}from"./utils-DuVQys2y.js";const ge={list:()=>V.get("/api/reports"),get:a=>V.get(`/api/reports/${a}`),generate:a=>V.post("/api/reports/generate",a)};function J(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}let S=J();function we(a){S=a}const ye=/[&<>"']/,Ve=new RegExp(ye.source,"g"),$e=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Ue=new RegExp($e.source,"g"),Ge={"&":"&","<":"<",">":">",'"':""","'":"'"},de=a=>Ge[a];function m(a,t){if(t){if(ye.test(a))return a.replace(Ve,de)}else if($e.test(a))return a.replace(Ue,de);return a}const We=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Xe(a){return a.replace(We,(t,e)=>(e=e.toLowerCase(),e==="colon"?":":e.charAt(0)==="#"?e.charAt(1)==="x"?String.fromCharCode(parseInt(e.substring(2),16)):String.fromCharCode(+e.substring(1)):""))}const Ke=/(^|[^\[])\^/g;function d(a,t){let e=typeof a=="string"?a:a.source;t=t||"";const n={replace:(i,r)=>{let s=typeof r=="string"?r:r.source;return s=s.replace(Ke,"$1"),e=e.replace(i,s),n},getRegex:()=>new RegExp(e,t)};return n}function ke(a){try{a=encodeURI(a).replace(/%25/g,"%")}catch{return null}return a}const E={exec:()=>null};function xe(a,t){const e=a.replace(/\|/g,(r,s,l)=>{let o=!1,u=s;for(;--u>=0&&l[u]==="\\";)o=!o;return o?"|":" |"}),n=e.split(/ \|/);let i=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length{const r=i.match(/^\s+/);if(r===null)return i;const[s]=r;return s.length>=n.length?i.slice(n.length):i}).join(` `)}class Q{constructor(t){k(this,"options");k(this,"rules");k(this,"lexer");this.options=t||S}space(t){const e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){const e=this.rules.block.code.exec(t);if(e){const n=e[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?n:D(n,` `)}}}fences(t){const e=this.rules.block.fences.exec(t);if(e){const n=e[0],i=Ye(n,e[3]||"");return{type:"code",raw:n,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:i}}}heading(t){const e=this.rules.block.heading.exec(t);if(e){let n=e[2].trim();if(/#$/.test(n)){const i=D(n,"#");(this.options.pedantic||!i||/ $/.test(i))&&(n=i.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(t){const e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:e[0]}}blockquote(t){const e=this.rules.block.blockquote.exec(t);if(e){let n=e[0].replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,` diff --git a/src/static/assets/SettingsView-451r_a8J.js b/src/static/assets/SettingsView-CDMmQA_8.js similarity index 93% rename from src/static/assets/SettingsView-451r_a8J.js rename to src/static/assets/SettingsView-CDMmQA_8.js index bfac6f9..593e698 100644 --- a/src/static/assets/SettingsView-451r_a8J.js +++ b/src/static/assets/SettingsView-CDMmQA_8.js @@ -1 +1 @@ -import{d as B,u as T,x as H,c as C,a,e as o,w as s,r as u,o as x,k as i,i as n,t as y,j as k,n as j,D as K,K as m}from"./index-CO3lBHVT.js";import{u as L}from"./devops-D_lPg6L8.js";import{_ as A,a as P}from"./CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js";import{_ as U,a as I}from"./CardTitle.vue_vue_type_script_setup_true_lang-CpgNrOxB.js";import{_ as f}from"./Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js";import{_}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import{i as O}from"./utils-B1YxgOQw.js";function M(v,d){const t=`/cc-dashboard/api/export/timesheet.csv?from=${v}&to=${d}`,r=document.createElement("a");r.href=t,r.download=`timesheet-${v}-${d}.csv`,r.click()}function q(v,d){const t=`/cc-dashboard/api/export/timesheet.ics?from=${v}&to=${d}`,r=document.createElement("a");r.href=t,r.download=`timesheet-${v}-${d}.ics`,r.click()}const G={class:"p-6 space-y-6 max-w-2xl"},J={class:"space-y-1.5"},Q={class:"space-y-1.5"},R={key:0,class:"text-xs text-muted-foreground space-y-1"},W={class:"text-foreground"},X={class:"text-foreground"},Y={key:0},Z={key:1,class:"text-red-400"},h={class:"grid grid-cols-2 gap-3"},ee={class:"space-y-1.5"},te={class:"space-y-1.5"},ae={class:"space-y-1.5"},oe={class:"text-sm font-medium text-foreground"},se={class:"flex items-center gap-2"},le={class:"flex items-center gap-3 flex-wrap"},ne={class:"space-y-1.5"},re={class:"space-y-1.5"},ie={class:"flex items-center gap-2"},ge=B({__name:"SettingsView",setup(v){const d=T(),t=L(),r=u(""),D=u(0),S=u(!1),c=u(""),p=u(""),g=u(""),b=u(!1),V=u(""),w=u("");H(()=>{d.user&&(r.value=d.user.username,D.value=d.user.daily_overhead_hours??0),t.fetchIntegration().then(()=>{t.integration&&(c.value=t.integration.org,p.value=t.integration.project)});const $=new Date;w.value=O($);const e=new Date($);e.setDate($.getDate()-30),V.value=O(e)});async function N(){S.value=!0;try{await K.patch("/api/auth/me",{username:r.value,daily_overhead_hours:D.value}),await d.fetchMe(),m.success("Profile saved")}catch{m.error("Failed to save profile")}finally{S.value=!1}}async function z(){if(!c.value||!p.value||!g.value){m.error("All ADO fields are required");return}b.value=!0;try{await t.saveIntegration({org:c.value,project:p.value,pat:g.value}),g.value="",m.success("Integration saved")}catch{m.error("Failed to save integration")}finally{b.value=!1}}async function E(){if(confirm("Delete ADO integration?"))try{await t.deleteIntegration(),c.value="",p.value="",g.value="",m.success("Integration deleted")}catch{m.error("Failed to delete integration")}}async function F(){try{await t.sync(),m.success("Sync complete")}catch{m.error(t.error??"Sync failed")}}return($,e)=>(x(),C("div",G,[e[26]||(e[26]=a("h2",{class:"text-lg font-semibold text-foreground"},"Settings",-1)),o(A,null,{default:s(()=>[o(U,null,{default:s(()=>[o(I,{class:"text-sm"},{default:s(()=>[...e[9]||(e[9]=[i("Profile",-1)])]),_:1})]),_:1}),o(P,{class:"space-y-4"},{default:s(()=>[a("div",J,[e[10]||(e[10]=a("label",{class:"text-sm font-medium text-foreground"},"Username",-1)),o(f,{modelValue:r.value,"onUpdate:modelValue":e[0]||(e[0]=l=>r.value=l),placeholder:"username"},null,8,["modelValue"])]),a("div",Q,[e[11]||(e[11]=a("label",{class:"text-sm font-medium text-foreground"},"Daily Overhead Hours",-1)),o(f,{modelValue:D.value,"onUpdate:modelValue":e[1]||(e[1]=l=>D.value=l),type:"number",min:"0",max:"8",step:"0.25",class:"w-32"},null,8,["modelValue"]),e[12]||(e[12]=a("p",{class:"text-xs text-muted-foreground"}," Hours per day to add for overhead / meetings ",-1))]),o(_,{loading:S.value,onClick:N},{default:s(()=>[...e[13]||(e[13]=[i("Save Profile",-1)])]),_:1},8,["loading"])]),_:1})]),_:1}),o(A,null,{default:s(()=>[o(U,null,{default:s(()=>[o(I,{class:"text-sm"},{default:s(()=>[...e[14]||(e[14]=[i("Azure DevOps Integration",-1)])]),_:1})]),_:1}),o(P,{class:"space-y-4"},{default:s(()=>[n(t).integration?(x(),C("div",R,[a("p",null,[e[15]||(e[15]=i(" Connected to ",-1)),a("strong",W,y(n(t).integration.org),1),e[16]||(e[16]=i(" / ",-1)),a("strong",X,y(n(t).integration.project),1)]),n(t).integration.last_synced_at?(x(),C("p",Y," Last synced: "+y(new Date(n(t).integration.last_synced_at).toLocaleString()),1)):k("",!0),n(t).integration.last_sync_error?(x(),C("p",Z," Error: "+y(n(t).integration.last_sync_error),1)):k("",!0)])):k("",!0),a("div",h,[a("div",ee,[e[17]||(e[17]=a("label",{class:"text-sm font-medium text-foreground"},"Organization",-1)),o(f,{modelValue:c.value,"onUpdate:modelValue":e[2]||(e[2]=l=>c.value=l),placeholder:"myorg"},null,8,["modelValue"])]),a("div",te,[e[18]||(e[18]=a("label",{class:"text-sm font-medium text-foreground"},"Project",-1)),o(f,{modelValue:p.value,"onUpdate:modelValue":e[3]||(e[3]=l=>p.value=l),placeholder:"myproject"},null,8,["modelValue"])])]),a("div",ae,[a("label",oe," Personal Access Token "+y(n(t).integration?"(leave blank to keep current)":""),1),o(f,{modelValue:g.value,"onUpdate:modelValue":e[4]||(e[4]=l=>g.value=l),type:"password",placeholder:"••••••••",autocomplete:"new-password"},null,8,["modelValue"])]),a("div",se,[o(_,{loading:b.value,onClick:z},{default:s(()=>[i(y(n(t).integration?"Update":"Connect"),1)]),_:1},8,["loading"]),n(t).integration?(x(),j(_,{key:0,variant:"outline",loading:n(t).syncing,onClick:F},{default:s(()=>[...e[19]||(e[19]=[i(" Sync Now ",-1)])]),_:1},8,["loading"])):k("",!0),n(t).integration?(x(),j(_,{key:1,variant:"destructive",size:"sm",onClick:E},{default:s(()=>[...e[20]||(e[20]=[i(" Disconnect ",-1)])]),_:1})):k("",!0)])]),_:1})]),_:1}),o(A,null,{default:s(()=>[o(U,null,{default:s(()=>[o(I,{class:"text-sm"},{default:s(()=>[...e[21]||(e[21]=[i("Export",-1)])]),_:1})]),_:1}),o(P,{class:"space-y-4"},{default:s(()=>[a("div",le,[a("div",ne,[e[22]||(e[22]=a("label",{class:"text-xs text-muted-foreground"},"From",-1)),o(f,{modelValue:V.value,"onUpdate:modelValue":e[5]||(e[5]=l=>V.value=l),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])]),a("div",re,[e[23]||(e[23]=a("label",{class:"text-xs text-muted-foreground"},"To",-1)),o(f,{modelValue:w.value,"onUpdate:modelValue":e[6]||(e[6]=l=>w.value=l),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])])]),a("div",ie,[o(_,{variant:"outline",size:"sm",onClick:e[7]||(e[7]=l=>n(M)(V.value,w.value))},{default:s(()=>[...e[24]||(e[24]=[i(" Download CSV ",-1)])]),_:1}),o(_,{variant:"outline",size:"sm",onClick:e[8]||(e[8]=l=>n(q)(V.value,w.value))},{default:s(()=>[...e[25]||(e[25]=[i(" Download ICS ",-1)])]),_:1})])]),_:1})]),_:1})]))}});export{ge as default}; +import{d as B,u as T,x as H,c as C,a,e as o,w as s,r as u,o as x,k as i,i as n,t as y,j as k,n as j,D as K,K as m}from"./index-B9hhyP-T.js";import{u as L}from"./devops-Dn5wUB1p.js";import{_ as A,a as P}from"./CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js";import{_ as U,a as I}from"./CardTitle.vue_vue_type_script_setup_true_lang-Twj0MqtU.js";import{_ as f}from"./Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js";import{_}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import{i as O}from"./utils-DuVQys2y.js";function M(v,d){const t=`/cc-dashboard/api/export/timesheet.csv?from=${v}&to=${d}`,r=document.createElement("a");r.href=t,r.download=`timesheet-${v}-${d}.csv`,r.click()}function q(v,d){const t=`/cc-dashboard/api/export/timesheet.ics?from=${v}&to=${d}`,r=document.createElement("a");r.href=t,r.download=`timesheet-${v}-${d}.ics`,r.click()}const G={class:"p-6 space-y-6 max-w-2xl"},J={class:"space-y-1.5"},Q={class:"space-y-1.5"},R={key:0,class:"text-xs text-muted-foreground space-y-1"},W={class:"text-foreground"},X={class:"text-foreground"},Y={key:0},Z={key:1,class:"text-red-400"},h={class:"grid grid-cols-2 gap-3"},ee={class:"space-y-1.5"},te={class:"space-y-1.5"},ae={class:"space-y-1.5"},oe={class:"text-sm font-medium text-foreground"},se={class:"flex items-center gap-2"},le={class:"flex items-center gap-3 flex-wrap"},ne={class:"space-y-1.5"},re={class:"space-y-1.5"},ie={class:"flex items-center gap-2"},ge=B({__name:"SettingsView",setup(v){const d=T(),t=L(),r=u(""),D=u(0),S=u(!1),c=u(""),p=u(""),g=u(""),b=u(!1),V=u(""),w=u("");H(()=>{d.user&&(r.value=d.user.username,D.value=d.user.daily_overhead_hours??0),t.fetchIntegration().then(()=>{t.integration&&(c.value=t.integration.org,p.value=t.integration.project)});const $=new Date;w.value=O($);const e=new Date($);e.setDate($.getDate()-30),V.value=O(e)});async function N(){S.value=!0;try{await K.patch("/api/auth/me",{username:r.value,daily_overhead_hours:D.value}),await d.fetchMe(),m.success("Profile saved")}catch{m.error("Failed to save profile")}finally{S.value=!1}}async function z(){if(!c.value||!p.value||!g.value){m.error("All ADO fields are required");return}b.value=!0;try{await t.saveIntegration({org:c.value,project:p.value,pat:g.value}),g.value="",m.success("Integration saved")}catch{m.error("Failed to save integration")}finally{b.value=!1}}async function E(){if(confirm("Delete ADO integration?"))try{await t.deleteIntegration(),c.value="",p.value="",g.value="",m.success("Integration deleted")}catch{m.error("Failed to delete integration")}}async function F(){try{await t.sync(),m.success("Sync complete")}catch{m.error(t.error??"Sync failed")}}return($,e)=>(x(),C("div",G,[e[26]||(e[26]=a("h2",{class:"text-lg font-semibold text-foreground"},"Settings",-1)),o(A,null,{default:s(()=>[o(U,null,{default:s(()=>[o(I,{class:"text-sm"},{default:s(()=>[...e[9]||(e[9]=[i("Profile",-1)])]),_:1})]),_:1}),o(P,{class:"space-y-4"},{default:s(()=>[a("div",J,[e[10]||(e[10]=a("label",{class:"text-sm font-medium text-foreground"},"Username",-1)),o(f,{modelValue:r.value,"onUpdate:modelValue":e[0]||(e[0]=l=>r.value=l),placeholder:"username"},null,8,["modelValue"])]),a("div",Q,[e[11]||(e[11]=a("label",{class:"text-sm font-medium text-foreground"},"Daily Overhead Hours",-1)),o(f,{modelValue:D.value,"onUpdate:modelValue":e[1]||(e[1]=l=>D.value=l),type:"number",min:"0",max:"8",step:"0.25",class:"w-32"},null,8,["modelValue"]),e[12]||(e[12]=a("p",{class:"text-xs text-muted-foreground"}," Hours per day to add for overhead / meetings ",-1))]),o(_,{loading:S.value,onClick:N},{default:s(()=>[...e[13]||(e[13]=[i("Save Profile",-1)])]),_:1},8,["loading"])]),_:1})]),_:1}),o(A,null,{default:s(()=>[o(U,null,{default:s(()=>[o(I,{class:"text-sm"},{default:s(()=>[...e[14]||(e[14]=[i("Azure DevOps Integration",-1)])]),_:1})]),_:1}),o(P,{class:"space-y-4"},{default:s(()=>[n(t).integration?(x(),C("div",R,[a("p",null,[e[15]||(e[15]=i(" Connected to ",-1)),a("strong",W,y(n(t).integration.org),1),e[16]||(e[16]=i(" / ",-1)),a("strong",X,y(n(t).integration.project),1)]),n(t).integration.last_synced_at?(x(),C("p",Y," Last synced: "+y(new Date(n(t).integration.last_synced_at).toLocaleString()),1)):k("",!0),n(t).integration.last_sync_error?(x(),C("p",Z," Error: "+y(n(t).integration.last_sync_error),1)):k("",!0)])):k("",!0),a("div",h,[a("div",ee,[e[17]||(e[17]=a("label",{class:"text-sm font-medium text-foreground"},"Organization",-1)),o(f,{modelValue:c.value,"onUpdate:modelValue":e[2]||(e[2]=l=>c.value=l),placeholder:"myorg"},null,8,["modelValue"])]),a("div",te,[e[18]||(e[18]=a("label",{class:"text-sm font-medium text-foreground"},"Project",-1)),o(f,{modelValue:p.value,"onUpdate:modelValue":e[3]||(e[3]=l=>p.value=l),placeholder:"myproject"},null,8,["modelValue"])])]),a("div",ae,[a("label",oe," Personal Access Token "+y(n(t).integration?"(leave blank to keep current)":""),1),o(f,{modelValue:g.value,"onUpdate:modelValue":e[4]||(e[4]=l=>g.value=l),type:"password",placeholder:"••••••••",autocomplete:"new-password"},null,8,["modelValue"])]),a("div",se,[o(_,{loading:b.value,onClick:z},{default:s(()=>[i(y(n(t).integration?"Update":"Connect"),1)]),_:1},8,["loading"]),n(t).integration?(x(),j(_,{key:0,variant:"outline",loading:n(t).syncing,onClick:F},{default:s(()=>[...e[19]||(e[19]=[i(" Sync Now ",-1)])]),_:1},8,["loading"])):k("",!0),n(t).integration?(x(),j(_,{key:1,variant:"destructive",size:"sm",onClick:E},{default:s(()=>[...e[20]||(e[20]=[i(" Disconnect ",-1)])]),_:1})):k("",!0)])]),_:1})]),_:1}),o(A,null,{default:s(()=>[o(U,null,{default:s(()=>[o(I,{class:"text-sm"},{default:s(()=>[...e[21]||(e[21]=[i("Export",-1)])]),_:1})]),_:1}),o(P,{class:"space-y-4"},{default:s(()=>[a("div",le,[a("div",ne,[e[22]||(e[22]=a("label",{class:"text-xs text-muted-foreground"},"From",-1)),o(f,{modelValue:V.value,"onUpdate:modelValue":e[5]||(e[5]=l=>V.value=l),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])]),a("div",re,[e[23]||(e[23]=a("label",{class:"text-xs text-muted-foreground"},"To",-1)),o(f,{modelValue:w.value,"onUpdate:modelValue":e[6]||(e[6]=l=>w.value=l),type:"date",class:"h-8 text-xs"},null,8,["modelValue"])])]),a("div",ie,[o(_,{variant:"outline",size:"sm",onClick:e[7]||(e[7]=l=>n(M)(V.value,w.value))},{default:s(()=>[...e[24]||(e[24]=[i(" Download CSV ",-1)])]),_:1}),o(_,{variant:"outline",size:"sm",onClick:e[8]||(e[8]=l=>n(q)(V.value,w.value))},{default:s(()=>[...e[25]||(e[25]=[i(" Download ICS ",-1)])]),_:1})])]),_:1})]),_:1})]))}});export{ge as default}; diff --git a/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-CUKCWjzn.js b/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-DBxohyhw.js similarity index 95% rename from src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-CUKCWjzn.js rename to src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-DBxohyhw.js index 09854df..dd9bce0 100644 --- a/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-CUKCWjzn.js +++ b/src/static/assets/TaskForm.vue_vue_type_script_setup_true_lang-DBxohyhw.js @@ -1 +1 @@ -import{D as c,B as N,r as _,d as C,o as b,c as y,p as D,i as $,t as V,j as T,s as F,v as A,n as E,w as k,a as l,e as v,F as L,l as M,h as P,k as z}from"./index-CO3lBHVT.js";import{_ as W}from"./Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js";import{_ as B}from"./Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js";import{c as U}from"./utils-B1YxgOQw.js";import{_ as S}from"./Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js";import{u as H}from"./devops-D_lPg6L8.js";const f={list:e=>c.get("/api/tasks",{params:e}),get:e=>c.get(`/api/tasks/${e}`),create:e=>c.post("/api/tasks",e),update:(e,n)=>c.patch(`/api/tasks/${e}`,n),remove:e=>c.delete(`/api/tasks/${e}`),complete:e=>c.post(`/api/tasks/${e}/complete`),blocks:e=>c.get(`/api/tasks/${e}/blocks`),createBlock:(e,n)=>c.post(`/api/tasks/${e}/blocks`,n),updateBlock:(e,n)=>c.patch(`/api/tasks/blocks/${e}`,n),deleteBlock:e=>c.delete(`/api/tasks/blocks/${e}`)},re=N("tasks",()=>{const e=_([]),n=_(!1),o=_(null);async function p(d){n.value=!0,o.value=null;try{const i=await f.list({date:d});e.value=i.data}catch(i){const r=i;o.value=r.message??"Failed to fetch tasks"}finally{n.value=!1}}async function m(d){n.value=!0,o.value=null;try{const i=await f.list(d?{project_id:d}:void 0);e.value=i.data}catch(i){const r=i;o.value=r.message??"Failed to fetch tasks"}finally{n.value=!1}}async function a(d){const i=await f.create(d);return e.value.push(i.data),i.data}async function u(d,i){const r=await f.update(d,i),w=e.value.findIndex(I=>I.id===d);return w!==-1&&(e.value[w]=r.data),r.data}async function x(d){await f.remove(d),e.value=e.value.filter(i=>i.id!==d)}async function g(d){const i=await f.complete(d),r=e.value.findIndex(w=>w.id===d);return r!==-1&&(e.value[r]=i.data),i.data}async function t(d,i){return(await f.createBlock(d,i)).data}async function s(d,i){return(await f.updateBlock(d,i)).data}async function j(d){await f.deleteBlock(d)}return{tasks:e,loading:n,error:o,fetchForDate:p,fetchAll:m,create:a,update:u,remove:x,complete:g,createBlock:t,updateBlock:s,deleteBlock:j}}),O=["id","value","placeholder","disabled","rows"],q=C({__name:"Textarea",props:{modelValue:{},placeholder:{},disabled:{type:Boolean},rows:{},class:{},id:{}},emits:["update:modelValue"],setup(e,{emit:n}){const o=e,p=n;return(m,a)=>(b(),y("textarea",{id:e.id,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,rows:e.rows??3,class:D($(U)("flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50 resize-none",o.class)),onInput:a[0]||(a[0]=u=>p("update:modelValue",u.target.value))},null,42,O))}}),G=["id","value","disabled"],J=["selected"],h=C({__name:"Select",props:{modelValue:{},disabled:{type:Boolean},class:{},id:{},placeholder:{}},emits:["update:modelValue","change"],setup(e,{emit:n}){const o=e,p=n;return(m,a)=>(b(),y("select",{id:e.id,value:e.modelValue,disabled:e.disabled,class:D($(U)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",o.class)),onChange:a[0]||(a[0]=u=>p("update:modelValue",u.target.value))},[e.placeholder?(b(),y("option",{key:0,value:"",disabled:"",selected:!e.modelValue},V(e.placeholder),9,J)):T("",!0),F(m.$slots,"default")],42,G))}}),K={class:"space-y-1.5"},Q={class:"space-y-1.5"},R={class:"grid grid-cols-2 gap-3"},X={class:"space-y-1.5"},Y={class:"space-y-1.5"},Z={class:"grid grid-cols-2 gap-3"},ee={class:"space-y-1.5"},te={class:"space-y-1.5"},ae={key:0,class:"space-y-1.5"},le=["value"],me=C({__name:"TaskForm",props:{open:{type:Boolean},task:{default:null},defaultDate:{}},emits:["close","save"],setup(e,{emit:n}){const o=e,p=n,m=H(),a=_({title:"",notes:"",planned_date:"",estimate_hours:1,status:"todo",priority:3,project_id:void 0,azure_work_item_id:void 0});A(()=>o.open,g=>{g&&(o.task?a.value={title:o.task.title,notes:o.task.notes??"",planned_date:o.task.planned_date??"",estimate_hours:o.task.estimate_hours??1,status:o.task.status,priority:o.task.priority,project_id:o.task.project_id??void 0,azure_work_item_id:o.task.azure_work_item_id??void 0}:a.value={title:"",notes:"",planned_date:o.defaultDate??"",estimate_hours:1,status:"todo",priority:3,project_id:void 0,azure_work_item_id:void 0},m.integration&&!m.workItems.length&&m.fetchWorkItems("open"))},{immediate:!0});const u=_(!1);async function x(){if(a.value.title.trim()){u.value=!0;try{const g={title:a.value.title,notes:a.value.notes||void 0,planned_date:a.value.planned_date,estimate_hours:a.value.estimate_hours,status:a.value.status,priority:a.value.priority,project_id:a.value.project_id||null,azure_work_item_id:a.value.azure_work_item_id||null};p("save",g)}finally{u.value=!1}}}return(g,t)=>(b(),E(W,{open:e.open,title:e.task?"Edit Task":"New Task","max-width":"max-w-md",onClose:t[8]||(t[8]=s=>p("close"))},{footer:k(()=>[v(S,{variant:"outline",disabled:u.value,onClick:t[7]||(t[7]=s=>p("close"))},{default:k(()=>[...t[18]||(t[18]=[z("Cancel",-1)])]),_:1},8,["disabled"]),v(S,{loading:u.value,onClick:x},{default:k(()=>[z(V(e.task?"Update":"Create"),1)]),_:1},8,["loading"])]),default:k(()=>[l("form",{class:"space-y-4",onSubmit:P(x,["prevent"])},[l("div",K,[t[9]||(t[9]=l("label",{class:"text-sm font-medium text-foreground"},"Title *",-1)),v(B,{modelValue:a.value.title,"onUpdate:modelValue":t[0]||(t[0]=s=>a.value.title=s),placeholder:"Task title...",disabled:u.value},null,8,["modelValue","disabled"])]),l("div",Q,[t[10]||(t[10]=l("label",{class:"text-sm font-medium text-foreground"},"Notes",-1)),v(q,{modelValue:a.value.notes,"onUpdate:modelValue":t[1]||(t[1]=s=>a.value.notes=s),placeholder:"Additional notes...",disabled:u.value},null,8,["modelValue","disabled"])]),l("div",R,[l("div",X,[t[11]||(t[11]=l("label",{class:"text-sm font-medium text-foreground"},"Planned Date",-1)),v(B,{modelValue:a.value.planned_date,"onUpdate:modelValue":t[2]||(t[2]=s=>a.value.planned_date=s),type:"date",disabled:u.value},null,8,["modelValue","disabled"])]),l("div",Y,[t[12]||(t[12]=l("label",{class:"text-sm font-medium text-foreground"},"Estimate (h)",-1)),v(B,{modelValue:a.value.estimate_hours,"onUpdate:modelValue":t[3]||(t[3]=s=>a.value.estimate_hours=s),type:"number",min:"0.25",max:"24",step:"0.25",disabled:u.value},null,8,["modelValue","disabled"])])]),l("div",Z,[l("div",ee,[t[14]||(t[14]=l("label",{class:"text-sm font-medium text-foreground"},"Status",-1)),v(h,{modelValue:a.value.status,"onUpdate:modelValue":t[4]||(t[4]=s=>a.value.status=s),disabled:u.value},{default:k(()=>[...t[13]||(t[13]=[l("option",{value:"todo"},"Todo",-1),l("option",{value:"doing"},"Doing",-1),l("option",{value:"done"},"Done",-1),l("option",{value:"cancelled"},"Cancelled",-1)])]),_:1},8,["modelValue","disabled"])]),l("div",te,[t[16]||(t[16]=l("label",{class:"text-sm font-medium text-foreground"},"Priority",-1)),v(h,{modelValue:a.value.priority,"onUpdate:modelValue":t[5]||(t[5]=s=>a.value.priority=s),disabled:u.value},{default:k(()=>[...t[15]||(t[15]=[l("option",{value:"1"},"1 - Low",-1),l("option",{value:"2"},"2 - Normal",-1),l("option",{value:"3"},"3 - Medium",-1),l("option",{value:"4"},"4 - High",-1),l("option",{value:"5"},"5 - Critical",-1)])]),_:1},8,["modelValue","disabled"])])]),$(m).workItems.length?(b(),y("div",ae,[t[17]||(t[17]=l("label",{class:"text-sm font-medium text-foreground"},"Azure DevOps Work Item",-1)),v(h,{modelValue:a.value.azure_work_item_id,"onUpdate:modelValue":t[6]||(t[6]=s=>a.value.azure_work_item_id=s),disabled:u.value,placeholder:"Link work item..."},{default:k(()=>[(b(!0),y(L,null,M($(m).workItems,s=>(b(),y("option",{key:s.id,value:String(s.id)}," #"+V(s.id)+" – "+V(s.title),9,le))),128))]),_:1},8,["modelValue","disabled"])])):T("",!0)],32)]),_:1},8,["open","title"]))}});export{me as _,re as u}; +import{D as c,B as N,r as _,d as C,o as b,c as y,p as D,i as $,t as V,j as T,s as F,v as A,n as E,w as k,a as l,e as v,F as L,l as M,h as P,k as z}from"./index-B9hhyP-T.js";import{_ as W}from"./Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js";import{_ as B}from"./Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js";import{c as U}from"./utils-DuVQys2y.js";import{_ as S}from"./Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js";import{u as H}from"./devops-Dn5wUB1p.js";const f={list:e=>c.get("/api/tasks",{params:e}),get:e=>c.get(`/api/tasks/${e}`),create:e=>c.post("/api/tasks",e),update:(e,n)=>c.patch(`/api/tasks/${e}`,n),remove:e=>c.delete(`/api/tasks/${e}`),complete:e=>c.post(`/api/tasks/${e}/complete`),blocks:e=>c.get(`/api/tasks/${e}/blocks`),createBlock:(e,n)=>c.post(`/api/tasks/${e}/blocks`,n),updateBlock:(e,n)=>c.patch(`/api/tasks/blocks/${e}`,n),deleteBlock:e=>c.delete(`/api/tasks/blocks/${e}`)},re=N("tasks",()=>{const e=_([]),n=_(!1),o=_(null);async function p(d){n.value=!0,o.value=null;try{const i=await f.list({date:d});e.value=i.data}catch(i){const r=i;o.value=r.message??"Failed to fetch tasks"}finally{n.value=!1}}async function m(d){n.value=!0,o.value=null;try{const i=await f.list(d?{project_id:d}:void 0);e.value=i.data}catch(i){const r=i;o.value=r.message??"Failed to fetch tasks"}finally{n.value=!1}}async function a(d){const i=await f.create(d);return e.value.push(i.data),i.data}async function u(d,i){const r=await f.update(d,i),w=e.value.findIndex(I=>I.id===d);return w!==-1&&(e.value[w]=r.data),r.data}async function x(d){await f.remove(d),e.value=e.value.filter(i=>i.id!==d)}async function g(d){const i=await f.complete(d),r=e.value.findIndex(w=>w.id===d);return r!==-1&&(e.value[r]=i.data),i.data}async function t(d,i){return(await f.createBlock(d,i)).data}async function s(d,i){return(await f.updateBlock(d,i)).data}async function j(d){await f.deleteBlock(d)}return{tasks:e,loading:n,error:o,fetchForDate:p,fetchAll:m,create:a,update:u,remove:x,complete:g,createBlock:t,updateBlock:s,deleteBlock:j}}),O=["id","value","placeholder","disabled","rows"],q=C({__name:"Textarea",props:{modelValue:{},placeholder:{},disabled:{type:Boolean},rows:{},class:{},id:{}},emits:["update:modelValue"],setup(e,{emit:n}){const o=e,p=n;return(m,a)=>(b(),y("textarea",{id:e.id,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,rows:e.rows??3,class:D($(U)("flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background placeholder:text-muted-foreground","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50 resize-none",o.class)),onInput:a[0]||(a[0]=u=>p("update:modelValue",u.target.value))},null,42,O))}}),G=["id","value","disabled"],J=["selected"],h=C({__name:"Select",props:{modelValue:{},disabled:{type:Boolean},class:{},id:{},placeholder:{}},emits:["update:modelValue","change"],setup(e,{emit:n}){const o=e,p=n;return(m,a)=>(b(),y("select",{id:e.id,value:e.modelValue,disabled:e.disabled,class:D($(U)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm","ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50",o.class)),onChange:a[0]||(a[0]=u=>p("update:modelValue",u.target.value))},[e.placeholder?(b(),y("option",{key:0,value:"",disabled:"",selected:!e.modelValue},V(e.placeholder),9,J)):T("",!0),F(m.$slots,"default")],42,G))}}),K={class:"space-y-1.5"},Q={class:"space-y-1.5"},R={class:"grid grid-cols-2 gap-3"},X={class:"space-y-1.5"},Y={class:"space-y-1.5"},Z={class:"grid grid-cols-2 gap-3"},ee={class:"space-y-1.5"},te={class:"space-y-1.5"},ae={key:0,class:"space-y-1.5"},le=["value"],me=C({__name:"TaskForm",props:{open:{type:Boolean},task:{default:null},defaultDate:{}},emits:["close","save"],setup(e,{emit:n}){const o=e,p=n,m=H(),a=_({title:"",notes:"",planned_date:"",estimate_hours:1,status:"todo",priority:3,project_id:void 0,azure_work_item_id:void 0});A(()=>o.open,g=>{g&&(o.task?a.value={title:o.task.title,notes:o.task.notes??"",planned_date:o.task.planned_date??"",estimate_hours:o.task.estimate_hours??1,status:o.task.status,priority:o.task.priority,project_id:o.task.project_id??void 0,azure_work_item_id:o.task.azure_work_item_id??void 0}:a.value={title:"",notes:"",planned_date:o.defaultDate??"",estimate_hours:1,status:"todo",priority:3,project_id:void 0,azure_work_item_id:void 0},m.integration&&!m.workItems.length&&m.fetchWorkItems("open"))},{immediate:!0});const u=_(!1);async function x(){if(a.value.title.trim()){u.value=!0;try{const g={title:a.value.title,notes:a.value.notes||void 0,planned_date:a.value.planned_date,estimate_hours:a.value.estimate_hours,status:a.value.status,priority:a.value.priority,project_id:a.value.project_id||null,azure_work_item_id:a.value.azure_work_item_id||null};p("save",g)}finally{u.value=!1}}}return(g,t)=>(b(),E(W,{open:e.open,title:e.task?"Edit Task":"New Task","max-width":"max-w-md",onClose:t[8]||(t[8]=s=>p("close"))},{footer:k(()=>[v(S,{variant:"outline",disabled:u.value,onClick:t[7]||(t[7]=s=>p("close"))},{default:k(()=>[...t[18]||(t[18]=[z("Cancel",-1)])]),_:1},8,["disabled"]),v(S,{loading:u.value,onClick:x},{default:k(()=>[z(V(e.task?"Update":"Create"),1)]),_:1},8,["loading"])]),default:k(()=>[l("form",{class:"space-y-4",onSubmit:P(x,["prevent"])},[l("div",K,[t[9]||(t[9]=l("label",{class:"text-sm font-medium text-foreground"},"Title *",-1)),v(B,{modelValue:a.value.title,"onUpdate:modelValue":t[0]||(t[0]=s=>a.value.title=s),placeholder:"Task title...",disabled:u.value},null,8,["modelValue","disabled"])]),l("div",Q,[t[10]||(t[10]=l("label",{class:"text-sm font-medium text-foreground"},"Notes",-1)),v(q,{modelValue:a.value.notes,"onUpdate:modelValue":t[1]||(t[1]=s=>a.value.notes=s),placeholder:"Additional notes...",disabled:u.value},null,8,["modelValue","disabled"])]),l("div",R,[l("div",X,[t[11]||(t[11]=l("label",{class:"text-sm font-medium text-foreground"},"Planned Date",-1)),v(B,{modelValue:a.value.planned_date,"onUpdate:modelValue":t[2]||(t[2]=s=>a.value.planned_date=s),type:"date",disabled:u.value},null,8,["modelValue","disabled"])]),l("div",Y,[t[12]||(t[12]=l("label",{class:"text-sm font-medium text-foreground"},"Estimate (h)",-1)),v(B,{modelValue:a.value.estimate_hours,"onUpdate:modelValue":t[3]||(t[3]=s=>a.value.estimate_hours=s),type:"number",min:"0.25",max:"24",step:"0.25",disabled:u.value},null,8,["modelValue","disabled"])])]),l("div",Z,[l("div",ee,[t[14]||(t[14]=l("label",{class:"text-sm font-medium text-foreground"},"Status",-1)),v(h,{modelValue:a.value.status,"onUpdate:modelValue":t[4]||(t[4]=s=>a.value.status=s),disabled:u.value},{default:k(()=>[...t[13]||(t[13]=[l("option",{value:"todo"},"Todo",-1),l("option",{value:"doing"},"Doing",-1),l("option",{value:"done"},"Done",-1),l("option",{value:"cancelled"},"Cancelled",-1)])]),_:1},8,["modelValue","disabled"])]),l("div",te,[t[16]||(t[16]=l("label",{class:"text-sm font-medium text-foreground"},"Priority",-1)),v(h,{modelValue:a.value.priority,"onUpdate:modelValue":t[5]||(t[5]=s=>a.value.priority=s),disabled:u.value},{default:k(()=>[...t[15]||(t[15]=[l("option",{value:"1"},"1 - Low",-1),l("option",{value:"2"},"2 - Normal",-1),l("option",{value:"3"},"3 - Medium",-1),l("option",{value:"4"},"4 - High",-1),l("option",{value:"5"},"5 - Critical",-1)])]),_:1},8,["modelValue","disabled"])])]),$(m).workItems.length?(b(),y("div",ae,[t[17]||(t[17]=l("label",{class:"text-sm font-medium text-foreground"},"Azure DevOps Work Item",-1)),v(h,{modelValue:a.value.azure_work_item_id,"onUpdate:modelValue":t[6]||(t[6]=s=>a.value.azure_work_item_id=s),disabled:u.value,placeholder:"Link work item..."},{default:k(()=>[(b(!0),y(L,null,M($(m).workItems,s=>(b(),y("option",{key:s.id,value:String(s.id)}," #"+V(s.id)+" – "+V(s.title),9,le))),128))]),_:1},8,["modelValue","disabled"])])):T("",!0)],32)]),_:1},8,["open","title"]))}});export{me as _,re as u}; diff --git a/src/static/assets/admin-s3id3yDK.js b/src/static/assets/admin-CT_XX4Td.js similarity index 68% rename from src/static/assets/admin-s3id3yDK.js rename to src/static/assets/admin-CT_XX4Td.js index 93a6b68..561c4e1 100644 --- a/src/static/assets/admin-s3id3yDK.js +++ b/src/static/assets/admin-CT_XX4Td.js @@ -1 +1 @@ -import{D as e}from"./index-CO3lBHVT.js";const i={users:()=>e.get("/api/admin/users"),keys:()=>e.get("/api/keys"),createKey:s=>e.post("/api/keys",s),revokeKey:s=>e.delete(`/api/keys/${s}`)};export{i as a}; +import{D as e}from"./index-B9hhyP-T.js";const i={users:()=>e.get("/api/admin/users"),keys:()=>e.get("/api/keys"),createKey:s=>e.post("/api/keys",s),revokeKey:s=>e.delete(`/api/keys/${s}`)};export{i as a}; diff --git a/src/static/assets/dashboard-4_z0ZWLj.js b/src/static/assets/dashboard-DFJs0AgU.js similarity index 88% rename from src/static/assets/dashboard-4_z0ZWLj.js rename to src/static/assets/dashboard-DFJs0AgU.js index 75a422a..82a9302 100644 --- a/src/static/assets/dashboard-4_z0ZWLj.js +++ b/src/static/assets/dashboard-DFJs0AgU.js @@ -1 +1 @@ -import{D as t}from"./index-CO3lBHVT.js";const e={summary:a=>t.get("/api/dashboard/summary",{params:a}),projects:a=>t.get("/api/dashboard/projects",{params:a}),timeline:a=>t.get("/api/dashboard/timeline",{params:a}),monthly:a=>t.get("/api/dashboard/monthly",{params:a}),dow:a=>t.get("/api/dashboard/dow",{params:a}),tools:a=>t.get("/api/dashboard/tools",{params:a}),activity:a=>t.get("/api/dashboard/activity",{params:a}),calendar:a=>t.get("/api/dashboard/calendar",{params:a}),project:(a,o)=>t.get("/api/dashboard/project/"+a,{params:o})};export{e as d}; +import{D as t}from"./index-B9hhyP-T.js";const e={summary:a=>t.get("/api/dashboard/summary",{params:a}),projects:a=>t.get("/api/dashboard/projects",{params:a}),timeline:a=>t.get("/api/dashboard/timeline",{params:a}),monthly:a=>t.get("/api/dashboard/monthly",{params:a}),dow:a=>t.get("/api/dashboard/dow",{params:a}),tools:a=>t.get("/api/dashboard/tools",{params:a}),activity:a=>t.get("/api/dashboard/activity",{params:a}),calendar:a=>t.get("/api/dashboard/calendar",{params:a}),project:(a,o)=>t.get("/api/dashboard/project/"+a,{params:o})};export{e as d}; diff --git a/src/static/assets/devops-D_lPg6L8.js b/src/static/assets/devops-Dn5wUB1p.js similarity index 94% rename from src/static/assets/devops-D_lPg6L8.js rename to src/static/assets/devops-Dn5wUB1p.js index e9cd897..07ea5f1 100644 --- a/src/static/assets/devops-D_lPg6L8.js +++ b/src/static/assets/devops-Dn5wUB1p.js @@ -1 +1 @@ -import{D as s,B as I,r as o}from"./index-CO3lBHVT.js";const i={getIntegration:()=>s.get("/api/devops/integration"),saveIntegration:e=>s.put("/api/devops/integration",e),deleteIntegration:()=>s.delete("/api/devops/integration"),sync:()=>s.post("/api/devops/sync"),workItems:e=>s.get("/api/devops/work-items",{params:e?{state:e}:void 0})},m=I("devops",()=>{const e=o(null),r=o([]),l=o(!1),n=o(!1),c=o(null);async function u(){n.value=!0;try{const t=await i.getIntegration();e.value=t.data}catch{e.value=null}finally{n.value=!1}}async function d(t){const a=await i.saveIntegration(t);e.value=a.data}async function g(){await i.deleteIntegration(),e.value=null}async function f(){var t,a;l.value=!0,c.value=null;try{await i.sync(),await u()}catch(v){const p=v;throw c.value=((a=(t=p.response)==null?void 0:t.data)==null?void 0:a.detail)??p.message??"Sync failed",v}finally{l.value=!1}}async function y(t){n.value=!0;try{const a=await i.workItems(t);r.value=a.data}catch{r.value=[]}finally{n.value=!1}}return{integration:e,workItems:r,syncing:l,loading:n,error:c,fetchIntegration:u,saveIntegration:d,deleteIntegration:g,sync:f,fetchWorkItems:y}});export{m as u}; +import{D as s,B as I,r as o}from"./index-B9hhyP-T.js";const i={getIntegration:()=>s.get("/api/devops/integration"),saveIntegration:e=>s.put("/api/devops/integration",e),deleteIntegration:()=>s.delete("/api/devops/integration"),sync:()=>s.post("/api/devops/sync"),workItems:e=>s.get("/api/devops/work-items",{params:e?{state:e}:void 0})},m=I("devops",()=>{const e=o(null),r=o([]),l=o(!1),n=o(!1),c=o(null);async function u(){n.value=!0;try{const t=await i.getIntegration();e.value=t.data}catch{e.value=null}finally{n.value=!1}}async function d(t){const a=await i.saveIntegration(t);e.value=a.data}async function g(){await i.deleteIntegration(),e.value=null}async function f(){var t,a;l.value=!0,c.value=null;try{await i.sync(),await u()}catch(v){const p=v;throw c.value=((a=(t=p.response)==null?void 0:t.data)==null?void 0:a.detail)??p.message??"Sync failed",v}finally{l.value=!1}}async function y(t){n.value=!0;try{const a=await i.workItems(t);r.value=a.data}catch{r.value=[]}finally{n.value=!1}}return{integration:e,workItems:r,syncing:l,loading:n,error:c,fetchIntegration:u,saveIntegration:d,deleteIntegration:g,sync:f,fetchWorkItems:y}});export{m as u}; diff --git a/src/static/assets/index-CO3lBHVT.js b/src/static/assets/index-B9hhyP-T.js similarity index 99% rename from src/static/assets/index-CO3lBHVT.js rename to src/static/assets/index-B9hhyP-T.js index 02483cf..0bbf6a7 100644 --- a/src/static/assets/index-CO3lBHVT.js +++ b/src/static/assets/index-B9hhyP-T.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LoginView-C8KUpWjz.js","assets/Button.vue_vue_type_script_setup_true_lang-BwCrpRUQ.js","assets/utils-B1YxgOQw.js","assets/Input.vue_vue_type_script_setup_true_lang-CDN6a_dJ.js","assets/CardContent.vue_vue_type_script_setup_true_lang-UcbhRP8Z.js","assets/DashboardView-CQAK2qP6.js","assets/dashboard-4_z0ZWLj.js","assets/CardTitle.vue_vue_type_script_setup_true_lang-CpgNrOxB.js","assets/Progress.vue_vue_type_script_setup_true_lang-C9HXKxSB.js","assets/CalendarView-DQ2Hqx4H.js","assets/TaskForm.vue_vue_type_script_setup_true_lang-CUKCWjzn.js","assets/Dialog.vue_vue_type_script_setup_true_lang-DU2Z0xrF.js","assets/devops-D_lPg6L8.js","assets/Badge.vue_vue_type_script_setup_true_lang-CocRK-vO.js","assets/CalendarView-DGmJamL9.css","assets/PlannerView-D1tzk_DZ.js","assets/ProjectsView-CmpkpAqw.js","assets/ProjectDetailView-CJKn-onp.js","assets/LiveView-4Mk1DKtX.js","assets/ReportsView-RRBaLOSo.js","assets/ReportsView-BczQ2gJa.css","assets/KeysView-BzDjpAPG.js","assets/admin-s3id3yDK.js","assets/SettingsView-451r_a8J.js","assets/AdminView-CJ79dSWf.js"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LoginView-BTX9oEgY.js","assets/Button.vue_vue_type_script_setup_true_lang-mCZU1D3b.js","assets/utils-DuVQys2y.js","assets/Input.vue_vue_type_script_setup_true_lang-CBtApgd6.js","assets/CardContent.vue_vue_type_script_setup_true_lang-B1uPgvNK.js","assets/DashboardView-C9SpkquZ.js","assets/dashboard-DFJs0AgU.js","assets/CardTitle.vue_vue_type_script_setup_true_lang-Twj0MqtU.js","assets/Progress.vue_vue_type_script_setup_true_lang-o01-BFVV.js","assets/CalendarView-SX7Koh5E.js","assets/TaskForm.vue_vue_type_script_setup_true_lang-DBxohyhw.js","assets/Dialog.vue_vue_type_script_setup_true_lang-BF-ub_3g.js","assets/devops-Dn5wUB1p.js","assets/Badge.vue_vue_type_script_setup_true_lang-BV0smx_q.js","assets/CalendarView-DGmJamL9.css","assets/PlannerView-CskuH3RG.js","assets/ProjectsView-CZF7uexl.js","assets/ProjectDetailView-BJap0IQ0.js","assets/LiveView-BsPW_Vxj.js","assets/ReportsView-EBcs_rl2.js","assets/ReportsView-BczQ2gJa.css","assets/KeysView-BJjLTbGZ.js","assets/admin-CT_XX4Td.js","assets/SettingsView-CDMmQA_8.js","assets/AdminView-BMl1f4sR.js"])))=>i.map(i=>d[i]); var ji=e=>{throw TypeError(e)};var ao=(e,t,n)=>t.has(e)||ji("Cannot "+n);var O=(e,t,n)=>(ao(e,t,"read from private field"),n?n.call(e):t.get(e)),pe=(e,t,n)=>t.has(e)?ji("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),ne=(e,t,n,s)=>(ao(e,t,"write to private field"),s?s.call(e,n):t.set(e,n),n),$e=(e,t,n)=>(ao(e,t,"access private method"),n);var lr=(e,t,n,s)=>({set _(r){ne(e,t,r,n)},get _(){return O(e,t,s)}});(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function n(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(r){if(r.ep)return;r.ep=!0;const o=n(r);fetch(r.href,o)}})();/** * @vue/shared v3.5.34 * (c) 2018-present Yuxi (Evan) You and Vue contributors @@ -37,4 +37,4 @@ var ji=e=>{throw TypeError(e)};var ao=(e,t,n)=>t.has(e)||ji("Cannot "+n);var O=( * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let Yy=()=>location.protocol+"//"+location.host;function Mu(e,t){const{pathname:n,search:s,hash:r}=t,o=e.indexOf("#");if(o>-1){let i=r.includes(e.slice(o))?e.slice(o).length:1,a=r.slice(i);return a[0]!=="/"&&(a="/"+a),nl(a,"")}return nl(n,e)+s+r}function Xy(e,t,n,s){let r=[],o=[],i=null;const a=({state:h})=>{const p=Mu(e,location),x=n.value,g=t.value;let w=0;if(h){if(n.value=p,t.value=h,i&&i===x){i=null;return}w=g?h.position-g.position:0}else s(p);r.forEach(E=>{E(n.value,x,{delta:w,type:si.pop,direction:w?w>0?Oo.forward:Oo.back:Oo.unknown})})};function l(){i=n.value}function u(h){r.push(h);const p=()=>{const x=r.indexOf(h);x>-1&&r.splice(x,1)};return o.push(p),p}function c(){if(document.visibilityState==="hidden"){const{history:h}=window;if(!h.state)return;h.replaceState(we({},h.state,{scroll:ro()}),"")}}function f(){for(const h of o)h();o=[],window.removeEventListener("popstate",a),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",a),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:l,listen:u,destroy:f}}function al(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?ro():null}}function Zy(e){const{history:t,location:n}=window,s={value:Mu(e,n)},r={value:t.state};r.value||o(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(l,u,c){const f=e.indexOf("#"),h=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+l:Yy()+e+l;try{t[c?"replaceState":"pushState"](u,"",h),r.value=u}catch(p){console.error(p),n[c?"replace":"assign"](h)}}function i(l,u){o(l,we({},t.state,al(r.value.back,l,r.value.forward,!0),u,{position:r.value.position}),!0),s.value=l}function a(l,u){const c=we({},r.value,t.state,{forward:l,scroll:ro()});o(c.current,c,!0),o(l,we({},al(s.value,l,null),{position:c.position+1},u),!1),s.value=l}return{location:s,state:r,push:a,replace:i}}function e0(e){e=ky(e);const t=Zy(e),n=Xy(e,t.state,t.location,t.replace);function s(o,i=!0){i||n.pauseListeners(),history.go(o)}const r=we({location:"",base:e,go:s,createHref:jy.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}let Dn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var je=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(je||{});const t0={type:Dn.Static,value:""},n0=/[a-zA-Z0-9_]/;function s0(e){if(!e)return[[]];if(e==="/")return[[t0]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(p){throw new Error(`ERR (${n})/"${u}": ${p}`)}let n=je.Static,s=n;const r=[];let o;function i(){o&&r.push(o),o=[]}let a=0,l,u="",c="";function f(){u&&(n===je.Static?o.push({type:Dn.Static,value:u}):n===je.Param||n===je.ParamRegExp||n===je.ParamRegExpEnd?(o.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),o.push({type:Dn.Param,value:u,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),u="")}function h(){u+=l}for(;at.length?t.length===1&&t[0]===nt.Static+nt.Segment?1:-1:0}function ku(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const l0={strict:!1,end:!0,sensitive:!1};function c0(e,t,n){const s=i0(s0(e.path),n),r=we(s,{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function u0(e,t){const n=[],s=new Map;t=tl(l0,t);function r(f){return s.get(f)}function o(f,h,p){const x=!p,g=fl(f);g.aliasOf=p&&p.record;const w=tl(t,f),E=[g];if("alias"in f){const v=typeof f.alias=="string"?[f.alias]:f.alias;for(const D of v)E.push(fl(we({},g,{components:p?p.record.components:g.components,path:D,aliasOf:p?p.record:g})))}let A,y;for(const v of E){const{path:D}=v;if(h&&D[0]!=="/"){const K=h.record.path,j=K[K.length-1]==="/"?"":"/";v.path=h.record.path+(D&&j+D)}if(A=c0(v,h,w),p?p.alias.push(A):(y=y||A,y!==A&&y.alias.push(A),x&&f.name&&!dl(A)&&i(f.name)),Bu(A)&&l(A),g.children){const K=g.children;for(let j=0;j{i(y)}:Fs}function i(f){if(Lu(f)){const h=s.get(f);h&&(s.delete(f),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(f);h>-1&&(n.splice(h,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function a(){return n}function l(f){const h=h0(f,n);n.splice(h,0,f),f.record.name&&!dl(f)&&s.set(f.record.name,f)}function u(f,h){let p,x={},g,w;if("name"in f&&f.name){if(p=s.get(f.name),!p)throw ps(Le.MATCHER_NOT_FOUND,{location:f});w=p.record.name,x=we(ul(h.params,p.keys.filter(y=>!y.optional).concat(p.parent?p.parent.keys.filter(y=>y.optional):[]).map(y=>y.name)),f.params&&ul(f.params,p.keys.map(y=>y.name))),g=p.stringify(x)}else if(f.path!=null)g=f.path,p=n.find(y=>y.re.test(g)),p&&(x=p.parse(g),w=p.record.name);else{if(p=h.name?s.get(h.name):n.find(y=>y.re.test(h.path)),!p)throw ps(Le.MATCHER_NOT_FOUND,{location:f,currentLocation:h});w=p.record.name,x=we({},h.params,f.params),g=p.stringify(x)}const E=[];let A=p;for(;A;)E.unshift(A.record),A=A.parent;return{name:w,path:g,params:x,matched:E,meta:d0(E)}}e.forEach(f=>o(f));function c(){n.length=0,s.clear()}return{addRoute:o,resolve:u,removeRoute:i,clearRoutes:c,getRoutes:a,getRecordMatcher:r}}function ul(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function fl(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:f0(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function f0(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function dl(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function d0(e){return e.reduce((t,n)=>we(t,n.meta),{})}function h0(e,t){let n=0,s=t.length;for(;n!==s;){const o=n+s>>1;ku(e,t[o])<0?s=o:n=o+1}const r=p0(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function p0(e){let t=e;for(;t=t.parent;)if(Bu(t)&&ku(e,t)===0)return t}function Bu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function hl(e){const t=xt(oo),n=xt(Fi),s=ge(()=>{const l=Ke(e.to);return t.resolve(l)}),r=ge(()=>{const{matched:l}=s.value,{length:u}=l,c=l[u-1],f=n.matched;if(!c||!f.length)return-1;const h=f.findIndex(hs.bind(null,c));if(h>-1)return h;const p=pl(l[u-2]);return u>1&&pl(c)===p&&f[f.length-1].path!==p?f.findIndex(hs.bind(null,l[u-2])):h}),o=ge(()=>r.value>-1&&b0(n.params,s.value.params)),i=ge(()=>r.value>-1&&r.value===n.matched.length-1&&Iu(n.params,s.value.params));function a(l={}){if(v0(l)){const u=t[Ke(e.replace)?"replace":"push"](Ke(e.to)).catch(Fs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>u),u}return Promise.resolve()}return{route:s,href:ge(()=>s.value.href),isActive:o,isExactActive:i,navigate:a}}function m0(e){return e.length===1?e[0]:e}const g0=Vn({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:hl,setup(e,{slots:t}){const n=Zs(hl(e)),{options:s}=xt(oo),r=ge(()=>({[ml(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ml(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&m0(t.default(n));return e.custom?o:Ai("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},o)}}}),y0=g0;function v0(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function b0(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!Tt(r)||r.length!==s.length||s.some((o,i)=>o.valueOf()!==r[i].valueOf()))return!1}return!0}function pl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ml=(e,t,n)=>e??t??n,w0=Vn({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=xt(oi),r=ge(()=>e.route||s.value),o=xt(il,0),i=ge(()=>{let u=Ke(o);const{matched:c}=r.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),a=ge(()=>r.value.matched[i.value]);yr(il,ge(()=>i.value+1)),yr(Gy,a),yr(oi,r);const l=fe();return wn(()=>[l.value,a.value,e.name],([u,c,f],[h,p,x])=>{c&&(c.instances[f]=u,p&&p!==c&&u&&u===h&&(c.leaveGuards.size||(c.leaveGuards=p.leaveGuards),c.updateGuards.size||(c.updateGuards=p.updateGuards))),u&&c&&(!p||!hs(c,p)||!h)&&(c.enterCallbacks[f]||[]).forEach(g=>g(u))},{flush:"post"}),()=>{const u=r.value,c=e.name,f=a.value,h=f&&f.components[c];if(!h)return gl(n.default,{Component:h,route:u});const p=f.props[c],x=p?p===!0?u.params:typeof p=="function"?p(u):p:null,w=Ai(h,we({},x,t,{onVnodeUnmounted:E=>{E.component.isUnmounted&&(f.instances[c]=null)},ref:l}));return gl(n.default,{Component:w,route:u})||w}}});function gl(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const _0=w0;function x0(e){const t=u0(e.routes,e),n=e.parseQuery||zy,s=e.stringifyQuery||ol,r=e.history,o=xs(),i=xs(),a=xs(),l=vf(on);let u=on;Gn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=Ao.bind(null,C=>""+C),f=Ao.bind(null,Py),h=Ao.bind(null,Ws);function p(C,L){let k,Q;return Lu(C)?(k=t.getRecordMatcher(C),Q=L):Q=C,t.addRoute(Q,k)}function x(C){const L=t.getRecordMatcher(C);L&&t.removeRoute(L)}function g(){return t.getRoutes().map(C=>C.record)}function w(C){return!!t.getRecordMatcher(C)}function E(C,L){if(L=we({},L||l.value),typeof C=="string"){const b=Ro(n,C,L.path),T=t.resolve({path:b.path},L),N=r.createHref(b.fullPath);return we(b,T,{params:h(T.params),hash:Ws(b.hash),redirectedFrom:void 0,href:N})}let k;if(C.path!=null)k=we({},C,{path:Ro(n,C.path,L.path).path});else{const b=we({},C.params);for(const T in b)b[T]==null&&delete b[T];k=we({},C,{params:f(b)}),L.params=f(L.params)}const Q=t.resolve(k,L),re=C.hash||"";Q.params=c(h(Q.params));const d=Iy(s,we({},C,{hash:Ry(re),path:Q.path})),m=r.createHref(d);return we({fullPath:d,hash:re,query:s===ol?Wy(C.query):C.query||{}},Q,{redirectedFrom:void 0,href:m})}function A(C){return typeof C=="string"?Ro(n,C,l.value.path):we({},C)}function y(C,L){if(u!==C)return ps(Le.NAVIGATION_CANCELLED,{from:L,to:C})}function v(C){return j(C)}function D(C){return v(we(A(C),{replace:!0}))}function K(C,L){const k=C.matched[C.matched.length-1];if(k&&k.redirect){const{redirect:Q}=k;let re=typeof Q=="function"?Q(C,L):Q;return typeof re=="string"&&(re=re.includes("?")||re.includes("#")?re=A(re):{path:re},re.params={}),we({query:C.query,hash:C.hash,params:re.path!=null?{}:C.params},re)}}function j(C,L){const k=u=E(C),Q=l.value,re=C.state,d=C.force,m=C.replace===!0,b=K(k,Q);if(b)return j(we(A(b),{state:typeof b=="object"?we({},re,b.state):re,force:d,replace:m}),L||k);const T=k;T.redirectedFrom=L;let N;return!d&&Ly(s,Q,k)&&(N=ps(Le.NAVIGATION_DUPLICATED,{to:T,from:Q}),De(Q,Q,!0,!1)),(N?Promise.resolve(N):I(T,Q)).catch(P=>$t(P)?$t(P,Le.NAVIGATION_GUARD_REDIRECT)?P:ue(P):ie(P,T,Q)).then(P=>{if(P){if($t(P,Le.NAVIGATION_GUARD_REDIRECT))return j(we({replace:m},A(P.to),{state:typeof P.to=="object"?we({},re,P.to.state):re,force:d}),L||T)}else P=F(T,Q,!0,m,re);return q(T,Q,P),P})}function B(C,L){const k=y(C,L);return k?Promise.reject(k):Promise.resolve()}function S(C){const L=Ve.values().next().value;return L&&typeof L.runWithContext=="function"?L.runWithContext(C):C()}function I(C,L){let k;const[Q,re,d]=Jy(C,L);k=To(Q.reverse(),"beforeRouteLeave",C,L);for(const b of Q)b.leaveGuards.forEach(T=>{k.push(dn(T,C,L))});const m=B.bind(null,C,L);return k.push(m),ae(k).then(()=>{k=[];for(const b of o.list())k.push(dn(b,C,L));return k.push(m),ae(k)}).then(()=>{k=To(re,"beforeRouteUpdate",C,L);for(const b of re)b.updateGuards.forEach(T=>{k.push(dn(T,C,L))});return k.push(m),ae(k)}).then(()=>{k=[];for(const b of d)if(b.beforeEnter)if(Tt(b.beforeEnter))for(const T of b.beforeEnter)k.push(dn(T,C,L));else k.push(dn(b.beforeEnter,C,L));return k.push(m),ae(k)}).then(()=>(C.matched.forEach(b=>b.enterCallbacks={}),k=To(d,"beforeRouteEnter",C,L,S),k.push(m),ae(k))).then(()=>{k=[];for(const b of i.list())k.push(dn(b,C,L));return k.push(m),ae(k)}).catch(b=>$t(b,Le.NAVIGATION_CANCELLED)?b:Promise.reject(b))}function q(C,L,k){a.list().forEach(Q=>S(()=>Q(C,L,k)))}function F(C,L,k,Q,re){const d=y(C,L);if(d)return d;const m=L===on,b=Gn?history.state:{};k&&(Q||m?r.replace(C.fullPath,we({scroll:m&&b&&b.scroll},re)):r.push(C.fullPath,re)),l.value=C,De(C,L,k,m),ue()}let W;function se(){W||(W=r.listen((C,L,k)=>{if(!R.listening)return;const Q=E(C),re=K(Q,R.currentRoute.value);if(re){j(we(re,{replace:!0,force:!0}),Q).catch(Fs);return}u=Q;const d=l.value;Gn&&qy(rl(d.fullPath,k.delta),ro()),I(Q,d).catch(m=>$t(m,Le.NAVIGATION_ABORTED|Le.NAVIGATION_CANCELLED)?m:$t(m,Le.NAVIGATION_GUARD_REDIRECT)?(j(we(A(m.to),{force:!0}),Q).then(b=>{$t(b,Le.NAVIGATION_ABORTED|Le.NAVIGATION_DUPLICATED)&&!k.delta&&k.type===si.pop&&r.go(-1,!1)}).catch(Fs),Promise.reject()):(k.delta&&r.go(-k.delta,!1),ie(m,Q,d))).then(m=>{m=m||F(Q,d,!1),m&&(k.delta&&!$t(m,Le.NAVIGATION_CANCELLED)?r.go(-k.delta,!1):k.type===si.pop&&$t(m,Le.NAVIGATION_ABORTED|Le.NAVIGATION_DUPLICATED)&&r.go(-1,!1)),q(Q,d,m)}).catch(Fs)}))}let de=xs(),le=xs(),X;function ie(C,L,k){ue(C);const Q=le.list();return Q.length?Q.forEach(re=>re(C,L,k)):console.error(C),Promise.reject(C)}function ve(){return X&&l.value!==on?Promise.resolve():new Promise((C,L)=>{de.add([C,L])})}function ue(C){return X||(X=!C,se(),de.list().forEach(([L,k])=>C?k(C):L()),de.reset()),C}function De(C,L,k,Q){const{scrollBehavior:re}=e;if(!Gn||!re)return Promise.resolve();const d=!k&&Vy(rl(C.fullPath,0))||(Q||!k)&&history.state&&history.state.scroll||null;return Hn().then(()=>re(C,L,d)).then(m=>m&&Hy(m)).catch(m=>ie(m,C,L))}const ke=C=>r.go(C);let Oe;const Ve=new Set,R={currentRoute:l,listening:!0,addRoute:p,removeRoute:x,clearRoutes:t.clearRoutes,hasRoute:w,getRoutes:g,resolve:E,options:e,push:v,replace:D,go:ke,back:()=>ke(-1),forward:()=>ke(1),beforeEach:o.add,beforeResolve:i.add,afterEach:a.add,onError:le.add,isReady:ve,install(C){C.component("RouterLink",y0),C.component("RouterView",_0),C.config.globalProperties.$router=R,Object.defineProperty(C.config.globalProperties,"$route",{enumerable:!0,get:()=>Ke(l)}),Gn&&!Oe&&l.value===on&&(Oe=!0,v(r.location).catch(Q=>{}));const L={};for(const Q in on)Object.defineProperty(L,Q,{get:()=>l.value[Q],enumerable:!0});C.provide(oo,R),C.provide(Fi,Zl(L)),C.provide(oi,l);const k=C.unmount;Ve.add(C),C.unmount=function(){Ve.delete(C),Ve.size<1&&(u=on,W&&W(),W=null,l.value=on,Oe=!1,X=!1),k()}}};function ae(C){return C.reduce((L,k)=>L.then(()=>S(k)),Promise.resolve())}return R}function Z0(){return xt(oo)}function ev(e){return xt(Fi)}const E0=[{path:"/login",name:"login",component:()=>bt(()=>import("./LoginView-C8KUpWjz.js"),__vite__mapDeps([0,1,2,3,4])),meta:{public:!0}},{path:"/",component:()=>bt(()=>import("./AppLayout-DXx1REXd.js"),[]),children:[{path:"",name:"dashboard",component:()=>bt(()=>import("./DashboardView-CQAK2qP6.js"),__vite__mapDeps([5,6,4,2,7,8,1]))},{path:"calendar",name:"calendar",component:()=>bt(()=>import("./CalendarView-DQ2Hqx4H.js"),__vite__mapDeps([9,6,2,1,10,11,3,12,13,14]))},{path:"planner",name:"planner",component:()=>bt(()=>import("./PlannerView-D1tzk_DZ.js"),__vite__mapDeps([15,10,11,1,2,3,12,13]))},{path:"projects",name:"projects",component:()=>bt(()=>import("./ProjectsView-CmpkpAqw.js"),__vite__mapDeps([16,6,4,2,8]))},{path:"projects/:id",name:"project-detail",component:()=>bt(()=>import("./ProjectDetailView-CJKn-onp.js"),__vite__mapDeps([17,6,4,2,7]))},{path:"live",name:"live",component:()=>bt(()=>import("./LiveView-4Mk1DKtX.js"),__vite__mapDeps([18,4,2,1]))},{path:"reports",name:"reports",component:()=>bt(()=>import("./ReportsView-RRBaLOSo.js"),__vite__mapDeps([19,4,2,13,1,20]))},{path:"keys",name:"keys",component:()=>bt(()=>import("./KeysView-BzDjpAPG.js"),__vite__mapDeps([21,22,4,2,1,11,3]))},{path:"settings",name:"settings",component:()=>bt(()=>import("./SettingsView-451r_a8J.js"),__vite__mapDeps([23,12,4,2,7,3,1]))},{path:"admin",name:"admin",component:()=>bt(()=>import("./AdminView-CJ79dSWf.js"),__vite__mapDeps([24,22,4,2,13])),meta:{adminOnly:!0}}]},{path:"/:pathMatch(.*)*",redirect:"/"}],Mi=x0({history:e0("/cc-dashboard/"),routes:E0});Mi.beforeEach((e,t,n)=>{const s=so();if(e.meta.public){n();return}if(!s.isAuthenticated){n({name:"login",query:{redirect:e.fullPath}});return}if(e.meta.adminOnly&&!s.isAdmin){n({name:"dashboard"});return}n()});const io=vh(py),S0=_h();io.use(S0);io.use(Mi);io.use(lp);const yl=so();qg(()=>yl.getToken(),()=>{yl.logout(),Mi.push({name:"login"})});io.mount("#app");export{bn as A,Rh as B,O0 as C,Ls as D,_i as E,Ae as F,A0 as G,N0 as K,$d as T,dy as _,J as a,R0 as b,ce as c,Vn as d,Te as e,Z0 as f,ev as g,Ra as h,Ke as i,st as j,Vs as k,ts as l,ge as m,Ut as n,ee as o,dt as p,Xf as q,fe as r,_t as s,Ct as t,so as u,wn as v,fn as w,Us as x,Df as y,dh as z}; + */let Yy=()=>location.protocol+"//"+location.host;function Mu(e,t){const{pathname:n,search:s,hash:r}=t,o=e.indexOf("#");if(o>-1){let i=r.includes(e.slice(o))?e.slice(o).length:1,a=r.slice(i);return a[0]!=="/"&&(a="/"+a),nl(a,"")}return nl(n,e)+s+r}function Xy(e,t,n,s){let r=[],o=[],i=null;const a=({state:h})=>{const p=Mu(e,location),x=n.value,g=t.value;let w=0;if(h){if(n.value=p,t.value=h,i&&i===x){i=null;return}w=g?h.position-g.position:0}else s(p);r.forEach(E=>{E(n.value,x,{delta:w,type:si.pop,direction:w?w>0?Oo.forward:Oo.back:Oo.unknown})})};function l(){i=n.value}function u(h){r.push(h);const p=()=>{const x=r.indexOf(h);x>-1&&r.splice(x,1)};return o.push(p),p}function c(){if(document.visibilityState==="hidden"){const{history:h}=window;if(!h.state)return;h.replaceState(we({},h.state,{scroll:ro()}),"")}}function f(){for(const h of o)h();o=[],window.removeEventListener("popstate",a),window.removeEventListener("pagehide",c),document.removeEventListener("visibilitychange",c)}return window.addEventListener("popstate",a),window.addEventListener("pagehide",c),document.addEventListener("visibilitychange",c),{pauseListeners:l,listen:u,destroy:f}}function al(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?ro():null}}function Zy(e){const{history:t,location:n}=window,s={value:Mu(e,n)},r={value:t.state};r.value||o(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(l,u,c){const f=e.indexOf("#"),h=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+l:Yy()+e+l;try{t[c?"replaceState":"pushState"](u,"",h),r.value=u}catch(p){console.error(p),n[c?"replace":"assign"](h)}}function i(l,u){o(l,we({},t.state,al(r.value.back,l,r.value.forward,!0),u,{position:r.value.position}),!0),s.value=l}function a(l,u){const c=we({},r.value,t.state,{forward:l,scroll:ro()});o(c.current,c,!0),o(l,we({},al(s.value,l,null),{position:c.position+1},u),!1),s.value=l}return{location:s,state:r,push:a,replace:i}}function e0(e){e=ky(e);const t=Zy(e),n=Xy(e,t.state,t.location,t.replace);function s(o,i=!0){i||n.pauseListeners(),history.go(o)}const r=we({location:"",base:e,go:s,createHref:jy.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}let Dn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var je=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(je||{});const t0={type:Dn.Static,value:""},n0=/[a-zA-Z0-9_]/;function s0(e){if(!e)return[[]];if(e==="/")return[[t0]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(p){throw new Error(`ERR (${n})/"${u}": ${p}`)}let n=je.Static,s=n;const r=[];let o;function i(){o&&r.push(o),o=[]}let a=0,l,u="",c="";function f(){u&&(n===je.Static?o.push({type:Dn.Static,value:u}):n===je.Param||n===je.ParamRegExp||n===je.ParamRegExpEnd?(o.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),o.push({type:Dn.Param,value:u,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),u="")}function h(){u+=l}for(;at.length?t.length===1&&t[0]===nt.Static+nt.Segment?1:-1:0}function ku(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const l0={strict:!1,end:!0,sensitive:!1};function c0(e,t,n){const s=i0(s0(e.path),n),r=we(s,{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function u0(e,t){const n=[],s=new Map;t=tl(l0,t);function r(f){return s.get(f)}function o(f,h,p){const x=!p,g=fl(f);g.aliasOf=p&&p.record;const w=tl(t,f),E=[g];if("alias"in f){const v=typeof f.alias=="string"?[f.alias]:f.alias;for(const D of v)E.push(fl(we({},g,{components:p?p.record.components:g.components,path:D,aliasOf:p?p.record:g})))}let A,y;for(const v of E){const{path:D}=v;if(h&&D[0]!=="/"){const K=h.record.path,j=K[K.length-1]==="/"?"":"/";v.path=h.record.path+(D&&j+D)}if(A=c0(v,h,w),p?p.alias.push(A):(y=y||A,y!==A&&y.alias.push(A),x&&f.name&&!dl(A)&&i(f.name)),Bu(A)&&l(A),g.children){const K=g.children;for(let j=0;j{i(y)}:Fs}function i(f){if(Lu(f)){const h=s.get(f);h&&(s.delete(f),n.splice(n.indexOf(h),1),h.children.forEach(i),h.alias.forEach(i))}else{const h=n.indexOf(f);h>-1&&(n.splice(h,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function a(){return n}function l(f){const h=h0(f,n);n.splice(h,0,f),f.record.name&&!dl(f)&&s.set(f.record.name,f)}function u(f,h){let p,x={},g,w;if("name"in f&&f.name){if(p=s.get(f.name),!p)throw ps(Le.MATCHER_NOT_FOUND,{location:f});w=p.record.name,x=we(ul(h.params,p.keys.filter(y=>!y.optional).concat(p.parent?p.parent.keys.filter(y=>y.optional):[]).map(y=>y.name)),f.params&&ul(f.params,p.keys.map(y=>y.name))),g=p.stringify(x)}else if(f.path!=null)g=f.path,p=n.find(y=>y.re.test(g)),p&&(x=p.parse(g),w=p.record.name);else{if(p=h.name?s.get(h.name):n.find(y=>y.re.test(h.path)),!p)throw ps(Le.MATCHER_NOT_FOUND,{location:f,currentLocation:h});w=p.record.name,x=we({},h.params,f.params),g=p.stringify(x)}const E=[];let A=p;for(;A;)E.unshift(A.record),A=A.parent;return{name:w,path:g,params:x,matched:E,meta:d0(E)}}e.forEach(f=>o(f));function c(){n.length=0,s.clear()}return{addRoute:o,resolve:u,removeRoute:i,clearRoutes:c,getRoutes:a,getRecordMatcher:r}}function ul(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function fl(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:f0(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function f0(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function dl(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function d0(e){return e.reduce((t,n)=>we(t,n.meta),{})}function h0(e,t){let n=0,s=t.length;for(;n!==s;){const o=n+s>>1;ku(e,t[o])<0?s=o:n=o+1}const r=p0(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function p0(e){let t=e;for(;t=t.parent;)if(Bu(t)&&ku(e,t)===0)return t}function Bu({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function hl(e){const t=xt(oo),n=xt(Fi),s=ge(()=>{const l=Ke(e.to);return t.resolve(l)}),r=ge(()=>{const{matched:l}=s.value,{length:u}=l,c=l[u-1],f=n.matched;if(!c||!f.length)return-1;const h=f.findIndex(hs.bind(null,c));if(h>-1)return h;const p=pl(l[u-2]);return u>1&&pl(c)===p&&f[f.length-1].path!==p?f.findIndex(hs.bind(null,l[u-2])):h}),o=ge(()=>r.value>-1&&b0(n.params,s.value.params)),i=ge(()=>r.value>-1&&r.value===n.matched.length-1&&Iu(n.params,s.value.params));function a(l={}){if(v0(l)){const u=t[Ke(e.replace)?"replace":"push"](Ke(e.to)).catch(Fs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>u),u}return Promise.resolve()}return{route:s,href:ge(()=>s.value.href),isActive:o,isExactActive:i,navigate:a}}function m0(e){return e.length===1?e[0]:e}const g0=Vn({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:hl,setup(e,{slots:t}){const n=Zs(hl(e)),{options:s}=xt(oo),r=ge(()=>({[ml(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[ml(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&m0(t.default(n));return e.custom?o:Ai("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},o)}}}),y0=g0;function v0(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function b0(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!Tt(r)||r.length!==s.length||s.some((o,i)=>o.valueOf()!==r[i].valueOf()))return!1}return!0}function pl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ml=(e,t,n)=>e??t??n,w0=Vn({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=xt(oi),r=ge(()=>e.route||s.value),o=xt(il,0),i=ge(()=>{let u=Ke(o);const{matched:c}=r.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),a=ge(()=>r.value.matched[i.value]);yr(il,ge(()=>i.value+1)),yr(Gy,a),yr(oi,r);const l=fe();return wn(()=>[l.value,a.value,e.name],([u,c,f],[h,p,x])=>{c&&(c.instances[f]=u,p&&p!==c&&u&&u===h&&(c.leaveGuards.size||(c.leaveGuards=p.leaveGuards),c.updateGuards.size||(c.updateGuards=p.updateGuards))),u&&c&&(!p||!hs(c,p)||!h)&&(c.enterCallbacks[f]||[]).forEach(g=>g(u))},{flush:"post"}),()=>{const u=r.value,c=e.name,f=a.value,h=f&&f.components[c];if(!h)return gl(n.default,{Component:h,route:u});const p=f.props[c],x=p?p===!0?u.params:typeof p=="function"?p(u):p:null,w=Ai(h,we({},x,t,{onVnodeUnmounted:E=>{E.component.isUnmounted&&(f.instances[c]=null)},ref:l}));return gl(n.default,{Component:w,route:u})||w}}});function gl(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const _0=w0;function x0(e){const t=u0(e.routes,e),n=e.parseQuery||zy,s=e.stringifyQuery||ol,r=e.history,o=xs(),i=xs(),a=xs(),l=vf(on);let u=on;Gn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=Ao.bind(null,C=>""+C),f=Ao.bind(null,Py),h=Ao.bind(null,Ws);function p(C,L){let k,Q;return Lu(C)?(k=t.getRecordMatcher(C),Q=L):Q=C,t.addRoute(Q,k)}function x(C){const L=t.getRecordMatcher(C);L&&t.removeRoute(L)}function g(){return t.getRoutes().map(C=>C.record)}function w(C){return!!t.getRecordMatcher(C)}function E(C,L){if(L=we({},L||l.value),typeof C=="string"){const b=Ro(n,C,L.path),T=t.resolve({path:b.path},L),N=r.createHref(b.fullPath);return we(b,T,{params:h(T.params),hash:Ws(b.hash),redirectedFrom:void 0,href:N})}let k;if(C.path!=null)k=we({},C,{path:Ro(n,C.path,L.path).path});else{const b=we({},C.params);for(const T in b)b[T]==null&&delete b[T];k=we({},C,{params:f(b)}),L.params=f(L.params)}const Q=t.resolve(k,L),re=C.hash||"";Q.params=c(h(Q.params));const d=Iy(s,we({},C,{hash:Ry(re),path:Q.path})),m=r.createHref(d);return we({fullPath:d,hash:re,query:s===ol?Wy(C.query):C.query||{}},Q,{redirectedFrom:void 0,href:m})}function A(C){return typeof C=="string"?Ro(n,C,l.value.path):we({},C)}function y(C,L){if(u!==C)return ps(Le.NAVIGATION_CANCELLED,{from:L,to:C})}function v(C){return j(C)}function D(C){return v(we(A(C),{replace:!0}))}function K(C,L){const k=C.matched[C.matched.length-1];if(k&&k.redirect){const{redirect:Q}=k;let re=typeof Q=="function"?Q(C,L):Q;return typeof re=="string"&&(re=re.includes("?")||re.includes("#")?re=A(re):{path:re},re.params={}),we({query:C.query,hash:C.hash,params:re.path!=null?{}:C.params},re)}}function j(C,L){const k=u=E(C),Q=l.value,re=C.state,d=C.force,m=C.replace===!0,b=K(k,Q);if(b)return j(we(A(b),{state:typeof b=="object"?we({},re,b.state):re,force:d,replace:m}),L||k);const T=k;T.redirectedFrom=L;let N;return!d&&Ly(s,Q,k)&&(N=ps(Le.NAVIGATION_DUPLICATED,{to:T,from:Q}),De(Q,Q,!0,!1)),(N?Promise.resolve(N):I(T,Q)).catch(P=>$t(P)?$t(P,Le.NAVIGATION_GUARD_REDIRECT)?P:ue(P):ie(P,T,Q)).then(P=>{if(P){if($t(P,Le.NAVIGATION_GUARD_REDIRECT))return j(we({replace:m},A(P.to),{state:typeof P.to=="object"?we({},re,P.to.state):re,force:d}),L||T)}else P=F(T,Q,!0,m,re);return q(T,Q,P),P})}function B(C,L){const k=y(C,L);return k?Promise.reject(k):Promise.resolve()}function S(C){const L=Ve.values().next().value;return L&&typeof L.runWithContext=="function"?L.runWithContext(C):C()}function I(C,L){let k;const[Q,re,d]=Jy(C,L);k=To(Q.reverse(),"beforeRouteLeave",C,L);for(const b of Q)b.leaveGuards.forEach(T=>{k.push(dn(T,C,L))});const m=B.bind(null,C,L);return k.push(m),ae(k).then(()=>{k=[];for(const b of o.list())k.push(dn(b,C,L));return k.push(m),ae(k)}).then(()=>{k=To(re,"beforeRouteUpdate",C,L);for(const b of re)b.updateGuards.forEach(T=>{k.push(dn(T,C,L))});return k.push(m),ae(k)}).then(()=>{k=[];for(const b of d)if(b.beforeEnter)if(Tt(b.beforeEnter))for(const T of b.beforeEnter)k.push(dn(T,C,L));else k.push(dn(b.beforeEnter,C,L));return k.push(m),ae(k)}).then(()=>(C.matched.forEach(b=>b.enterCallbacks={}),k=To(d,"beforeRouteEnter",C,L,S),k.push(m),ae(k))).then(()=>{k=[];for(const b of i.list())k.push(dn(b,C,L));return k.push(m),ae(k)}).catch(b=>$t(b,Le.NAVIGATION_CANCELLED)?b:Promise.reject(b))}function q(C,L,k){a.list().forEach(Q=>S(()=>Q(C,L,k)))}function F(C,L,k,Q,re){const d=y(C,L);if(d)return d;const m=L===on,b=Gn?history.state:{};k&&(Q||m?r.replace(C.fullPath,we({scroll:m&&b&&b.scroll},re)):r.push(C.fullPath,re)),l.value=C,De(C,L,k,m),ue()}let W;function se(){W||(W=r.listen((C,L,k)=>{if(!R.listening)return;const Q=E(C),re=K(Q,R.currentRoute.value);if(re){j(we(re,{replace:!0,force:!0}),Q).catch(Fs);return}u=Q;const d=l.value;Gn&&qy(rl(d.fullPath,k.delta),ro()),I(Q,d).catch(m=>$t(m,Le.NAVIGATION_ABORTED|Le.NAVIGATION_CANCELLED)?m:$t(m,Le.NAVIGATION_GUARD_REDIRECT)?(j(we(A(m.to),{force:!0}),Q).then(b=>{$t(b,Le.NAVIGATION_ABORTED|Le.NAVIGATION_DUPLICATED)&&!k.delta&&k.type===si.pop&&r.go(-1,!1)}).catch(Fs),Promise.reject()):(k.delta&&r.go(-k.delta,!1),ie(m,Q,d))).then(m=>{m=m||F(Q,d,!1),m&&(k.delta&&!$t(m,Le.NAVIGATION_CANCELLED)?r.go(-k.delta,!1):k.type===si.pop&&$t(m,Le.NAVIGATION_ABORTED|Le.NAVIGATION_DUPLICATED)&&r.go(-1,!1)),q(Q,d,m)}).catch(Fs)}))}let de=xs(),le=xs(),X;function ie(C,L,k){ue(C);const Q=le.list();return Q.length?Q.forEach(re=>re(C,L,k)):console.error(C),Promise.reject(C)}function ve(){return X&&l.value!==on?Promise.resolve():new Promise((C,L)=>{de.add([C,L])})}function ue(C){return X||(X=!C,se(),de.list().forEach(([L,k])=>C?k(C):L()),de.reset()),C}function De(C,L,k,Q){const{scrollBehavior:re}=e;if(!Gn||!re)return Promise.resolve();const d=!k&&Vy(rl(C.fullPath,0))||(Q||!k)&&history.state&&history.state.scroll||null;return Hn().then(()=>re(C,L,d)).then(m=>m&&Hy(m)).catch(m=>ie(m,C,L))}const ke=C=>r.go(C);let Oe;const Ve=new Set,R={currentRoute:l,listening:!0,addRoute:p,removeRoute:x,clearRoutes:t.clearRoutes,hasRoute:w,getRoutes:g,resolve:E,options:e,push:v,replace:D,go:ke,back:()=>ke(-1),forward:()=>ke(1),beforeEach:o.add,beforeResolve:i.add,afterEach:a.add,onError:le.add,isReady:ve,install(C){C.component("RouterLink",y0),C.component("RouterView",_0),C.config.globalProperties.$router=R,Object.defineProperty(C.config.globalProperties,"$route",{enumerable:!0,get:()=>Ke(l)}),Gn&&!Oe&&l.value===on&&(Oe=!0,v(r.location).catch(Q=>{}));const L={};for(const Q in on)Object.defineProperty(L,Q,{get:()=>l.value[Q],enumerable:!0});C.provide(oo,R),C.provide(Fi,Zl(L)),C.provide(oi,l);const k=C.unmount;Ve.add(C),C.unmount=function(){Ve.delete(C),Ve.size<1&&(u=on,W&&W(),W=null,l.value=on,Oe=!1,X=!1),k()}}};function ae(C){return C.reduce((L,k)=>L.then(()=>S(k)),Promise.resolve())}return R}function Z0(){return xt(oo)}function ev(e){return xt(Fi)}const E0=[{path:"/login",name:"login",component:()=>bt(()=>import("./LoginView-BTX9oEgY.js"),__vite__mapDeps([0,1,2,3,4])),meta:{public:!0}},{path:"/",component:()=>bt(()=>import("./AppLayout-BrbiIY_d.js"),[]),children:[{path:"",name:"dashboard",component:()=>bt(()=>import("./DashboardView-C9SpkquZ.js"),__vite__mapDeps([5,6,4,2,7,8,1]))},{path:"calendar",name:"calendar",component:()=>bt(()=>import("./CalendarView-SX7Koh5E.js"),__vite__mapDeps([9,6,2,1,10,11,3,12,13,14]))},{path:"planner",name:"planner",component:()=>bt(()=>import("./PlannerView-CskuH3RG.js"),__vite__mapDeps([15,10,11,1,2,3,12,13]))},{path:"projects",name:"projects",component:()=>bt(()=>import("./ProjectsView-CZF7uexl.js"),__vite__mapDeps([16,6,4,2,8]))},{path:"projects/:id",name:"project-detail",component:()=>bt(()=>import("./ProjectDetailView-BJap0IQ0.js"),__vite__mapDeps([17,6,4,2,7]))},{path:"live",name:"live",component:()=>bt(()=>import("./LiveView-BsPW_Vxj.js"),__vite__mapDeps([18,4,2,1]))},{path:"reports",name:"reports",component:()=>bt(()=>import("./ReportsView-EBcs_rl2.js"),__vite__mapDeps([19,4,2,13,1,20]))},{path:"keys",name:"keys",component:()=>bt(()=>import("./KeysView-BJjLTbGZ.js"),__vite__mapDeps([21,22,4,2,1,11,3]))},{path:"settings",name:"settings",component:()=>bt(()=>import("./SettingsView-CDMmQA_8.js"),__vite__mapDeps([23,12,4,2,7,3,1]))},{path:"admin",name:"admin",component:()=>bt(()=>import("./AdminView-BMl1f4sR.js"),__vite__mapDeps([24,22,4,2,13])),meta:{adminOnly:!0}}]},{path:"/:pathMatch(.*)*",redirect:"/"}],Mi=x0({history:e0("/cc-dashboard/"),routes:E0});Mi.beforeEach((e,t,n)=>{const s=so();if(e.meta.public){n();return}if(!s.isAuthenticated){n({name:"login",query:{redirect:e.fullPath}});return}if(e.meta.adminOnly&&!s.isAdmin){n({name:"dashboard"});return}n()});const io=vh(py),S0=_h();io.use(S0);io.use(Mi);io.use(lp);const yl=so();qg(()=>yl.getToken(),()=>{yl.logout(),Mi.push({name:"login"})});io.mount("#app");export{bn as A,Rh as B,O0 as C,Ls as D,_i as E,Ae as F,A0 as G,N0 as K,$d as T,dy as _,J as a,R0 as b,ce as c,Vn as d,Te as e,Z0 as f,ev as g,Ra as h,Ke as i,st as j,Vs as k,ts as l,ge as m,Ut as n,ee as o,dt as p,Xf as q,fe as r,_t as s,Ct as t,so as u,wn as v,fn as w,Us as x,Df as y,dh as z}; diff --git a/src/static/assets/index-jWLq2uh_.css b/src/static/assets/index-jWLq2uh_.css new file mode 100644 index 0000000..895daff --- /dev/null +++ b/src/static/assets/index-jWLq2uh_.css @@ -0,0 +1 @@ +@import"https://api.fontshare.com/v2/css?f[]=satoshi@700,500,400&display=swap";@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap";.slide-up-enter-active[data-v-ccefe5eb],.slide-up-leave-active[data-v-ccefe5eb]{transition:all .25s cubic-bezier(.34,1.56,.64,1)}.slide-up-enter-from[data-v-ccefe5eb],.slide-up-leave-to[data-v-ccefe5eb]{opacity:0;transform:translateY(20px) scale(.95)}.prose[data-v-ccefe5eb] li{margin:.125rem 0}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 226 49% 8%;--foreground: 220 40% 92%;--card: 220 44% 10%;--card-foreground: 220 40% 92%;--popover: 220 44% 12%;--popover-foreground: 220 40% 92%;--primary: 200 100% 67%;--primary-foreground: 226 49% 8%;--secondary: 220 30% 14%;--secondary-foreground: 220 20% 75%;--muted: 220 30% 12%;--muted-foreground: 220 12% 52%;--accent: 220 30% 14%;--accent-foreground: 220 40% 92%;--destructive: 0 72% 51%;--destructive-foreground: 220 40% 98%;--border: 220 28% 17%;--input: 220 28% 17%;--ring: 200 100% 67%;--radius: .625rem;--success: 158 64% 52%;--warning: 38 92% 60%}.dark{--background: 226 49% 8%;--foreground: 220 40% 92%;--card: 220 44% 10%;--card-foreground: 220 40% 92%;--popover: 220 44% 12%;--popover-foreground: 220 40% 92%;--primary: 200 100% 67%;--primary-foreground: 226 49% 8%;--secondary: 220 30% 14%;--secondary-foreground: 220 20% 75%;--muted: 220 30% 12%;--muted-foreground: 220 12% 52%;--accent: 220 30% 14%;--accent-foreground: 220 40% 92%;--destructive: 0 72% 51%;--destructive-foreground: 220 40% 98%;--border: 220 28% 17%;--input: 220 28% 17%;--ring: 200 100% 67%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Satoshi,Inter,system-ui,-apple-system,sans-serif;font-feature-settings:"rlig" 1,"calt" 1;-webkit-font-smoothing:antialiased}.tabular-nums,[data-value],.kpi-value{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-variant-numeric:tabular-nums}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#252e41;border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:#374562}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-right-1{right:-.25rem}.-right-4{right:-1rem}.-top-1{top:-.25rem}.-top-4{top:-1rem}.bottom-0{bottom:0}.bottom-6{bottom:1.5rem}.left-0{left:0}.right-0{right:0}.right-2{right:.5rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-24{max-height:6rem}.max-h-\[600px\]{max-height:600px}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[380px\]{width:380px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.max-w-2xl{max-width:42rem}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[160px\]{max-width:160px}.max-w-\[200px\]{max-width:200px}.max-w-\[80\%\]{max-width:80%}.max-w-\[90\%\]{max-width:90%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.cursor-s-resize{cursor:s-resize}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-px{gap:1px}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:.75rem}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-tl-sm{border-top-left-radius:calc(var(--radius) - 4px)}.rounded-tr-sm{border-top-right-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-500\/30{border-color:#f59e0b4d}.border-border{border-color:hsl(var(--border))}.border-border\/20{border-color:hsl(var(--border) / .2)}.border-border\/30{border-color:hsl(var(--border) / .3)}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-border\/60{border-color:hsl(var(--border) / .6)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-emerald-500\/30{border-color:#10b9814d}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-primary\/20{border-color:hsl(var(--primary) / .2)}.bg-\[hsl\(220_44\%_8\%\)\]{--tw-bg-opacity: 1;background-color:hsl(220 44% 8% / var(--tw-bg-opacity, 1))}.bg-\[hsl\(var\(--success\)\)\]{background-color:hsl(var(--success))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-400\/10{background-color:#fbbf241a}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/20{background-color:#f59e0b33}.bg-background{background-color:hsl(var(--background))}.bg-black\/60{background-color:#0009}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-card\/95{background-color:hsl(var(--card) / .95)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-destructive\/90{background-color:hsl(var(--destructive) / .9)}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/20{background-color:#10b98133}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-primary\/15{background-color:hsl(var(--primary) / .15)}.bg-primary\/20{background-color:hsl(var(--primary) / .2)}.bg-primary\/40{background-color:hsl(var(--primary) / .4)}.bg-primary\/5{background-color:hsl(var(--primary) / .05)}.bg-primary\/70{background-color:hsl(var(--primary) / .7)}.bg-primary\/90{background-color:hsl(var(--primary) / .9)}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-900\/40{background-color:#7f1d1d66}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/80{background-color:hsl(var(--secondary) / .8)}.bg-white\/60{background-color:#fff9}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pt-0{padding-top:0}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-\[0\.1em\]{letter-spacing:.1em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-widest{letter-spacing:.1em}.text-\[hsl\(var\(--success\)\)\]{color:hsl(var(--success))}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/30{color:hsl(var(--muted-foreground) / .3)}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/80{color:hsl(var(--primary) / .8)}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(107 114 128 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(107 114 128 / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-border{--tw-ring-color: hsl(var(--border))}.ring-primary\/15{--tw-ring-color: hsl(var(--primary) / .15)}.ring-primary\/20{--tw-ring-color: hsl(var(--primary) / .2)}.ring-primary\/25{--tw-ring-color: hsl(var(--primary) / .25)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.panel-glow{box-shadow:0 0 0 1px hsl(var(--border)),0 4px 24px -4px #05080f99}.panel-glow-hover:hover{box-shadow:0 0 0 1px #57c7ff2e,0 8px 32px -4px #57c7ff14}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:border-0:last-child{border-width:0px}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-amber-400:hover{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary) / .5)}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-amber-300:hover{--tw-bg-opacity: 1;background-color:rgb(252 211 77 / var(--tw-bg-opacity, 1))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-emerald-500\/20:hover{background-color:#10b98133}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary:hover{background-color:hsl(var(--primary))}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-red-500\/20:hover{background-color:#ef444433}.hover\:bg-red-900\/60:hover{background-color:#7f1d1d99}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-amber-400:hover{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-amber-400:focus{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-muted-foreground{color:hsl(var(--muted-foreground))}.group:hover .group-hover\:opacity-100{opacity:1}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}@media (min-width: 640px){.sm\:block{display:block}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 768px){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:relative{position:relative}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}} diff --git a/src/static/assets/index-vw6q8aQU.css b/src/static/assets/index-vw6q8aQU.css deleted file mode 100644 index 71abdb1..0000000 --- a/src/static/assets/index-vw6q8aQU.css +++ /dev/null @@ -1 +0,0 @@ -.slide-up-enter-active[data-v-ccefe5eb],.slide-up-leave-active[data-v-ccefe5eb]{transition:all .25s cubic-bezier(.34,1.56,.64,1)}.slide-up-enter-from[data-v-ccefe5eb],.slide-up-leave-to[data-v-ccefe5eb]{opacity:0;transform:translateY(20px) scale(.95)}.prose[data-v-ccefe5eb] li{margin:.125rem 0}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--primary: 262.1 83.3% 57.8%;--primary-foreground: 210 20% 98%;--secondary: 220 14.3% 95.9%;--secondary-foreground: 220.9 39.3% 11%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--border: 220 13% 91%;--input: 220 13% 91%;--ring: 262.1 83.3% 57.8%;--radius: .5rem}.dark{--background: 224 71.4% 4.1%;--foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--popover: 215 27.9% 10%;--popover-foreground: 210 20% 98%;--primary: 263.4 70% 50.4%;--primary-foreground: 210 20% 98%;--secondary: 215 27.9% 16.9%;--secondary-foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--ring: 263.4 70% 50.4%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-feature-settings:"rlig" 1,"calt" 1}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{border-radius:9999px;background-color:hsl(var(--border))}::-webkit-scrollbar-thumb:hover{background-color:hsl(var(--muted-foreground))}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-right-1{right:-.25rem}.-right-2{right:-.5rem}.-right-6{right:-1.5rem}.-top-1{top:-.25rem}.-top-2{top:-.5rem}.-top-6{top:-1.5rem}.bottom-0{bottom:0}.bottom-6{bottom:1.5rem}.left-0{left:0}.right-0{right:0}.right-2{right:.5rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-24{max-height:6rem}.max-h-\[600px\]{max-height:600px}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[380px\]{width:380px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.max-w-2xl{max-width:42rem}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[160px\]{max-width:160px}.max-w-\[200px\]{max-width:200px}.max-w-\[80\%\]{max-width:80%}.max-w-\[90\%\]{max-width:90%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.cursor-s-resize{cursor:s-resize}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-px{gap:1px}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:.75rem}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-tl-sm{border-top-left-radius:calc(var(--radius) - 4px)}.rounded-tr-sm{border-top-right-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/30{border-color:#f59e0b4d}.border-border{border-color:hsl(var(--border))}.border-border\/20{border-color:hsl(var(--border) / .2)}.border-border\/30{border-color:hsl(var(--border) / .3)}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-emerald-500\/30{border-color:#10b9814d}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-slate-800{--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-400\/10{background-color:#fbbf241a}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/20{background-color:#f59e0b33}.bg-background{background-color:hsl(var(--background))}.bg-black\/60{background-color:#0009}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-card\/95{background-color:hsl(var(--card) / .95)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-destructive\/90{background-color:hsl(var(--destructive) / .9)}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/20{background-color:#10b98133}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-primary\/30{background-color:hsl(var(--primary) / .3)}.bg-primary\/5{background-color:hsl(var(--primary) / .05)}.bg-primary\/70{background-color:hsl(var(--primary) / .7)}.bg-primary\/90{background-color:hsl(var(--primary) / .9)}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-900\/40{background-color:#7f1d1d66}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/80{background-color:hsl(var(--secondary) / .8)}.bg-white\/60{background-color:#fff9}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-amber-400{--tw-gradient-from: #fbbf24 var(--tw-gradient-from-position);--tw-gradient-to: rgb(251 191 36 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-amber-500\/20{--tw-gradient-from: rgb(245 158 11 / .2) var(--tw-gradient-from-position);--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-slate-900{--tw-gradient-from: #0f172a var(--tw-gradient-from-position);--tw-gradient-to: rgb(15 23 42 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-slate-900{--tw-gradient-to: rgb(15 23 42 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #0f172a var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-amber-600{--tw-gradient-to: #d97706 var(--tw-gradient-to-position)}.to-amber-600\/10{--tw-gradient-to: rgb(217 119 6 / .1) var(--tw-gradient-to-position)}.to-slate-950{--tw-gradient-to: #020617 var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pt-0{padding-top:0}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-widest{letter-spacing:.1em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(107 114 128 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(107 114 128 / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-amber-900\/30{--tw-shadow-color: rgb(120 53 15 / .3);--tw-shadow: var(--tw-shadow-colored)}.outline{outline-style:solid}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-primary\/20{--tw-ring-color: hsl(var(--primary) / .2)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:border-0:last-child{border-width:0px}.hover\:-translate-y-px:hover{--tw-translate-y: -1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-amber-400:hover{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary) / .5)}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-amber-300:hover{--tw-bg-opacity: 1;background-color:rgb(252 211 77 / var(--tw-bg-opacity, 1))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-emerald-500\/20:hover{background-color:#10b98133}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary:hover{background-color:hsl(var(--primary))}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-red-500\/20:hover{background-color:#ef444433}.hover\:bg-red-900\/60:hover{background-color:#7f1d1d99}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-slate-800\/50:hover{background-color:#1e293b80}.hover\:bg-slate-800\/60:hover{background-color:#1e293b99}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-amber-400:hover{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-slate-100:hover{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-amber-400:focus{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:opacity-100{opacity:1}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}@media (min-width: 640px){.sm\:block{display:block}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 768px){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:relative{position:relative}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}} diff --git a/src/static/assets/utils-B1YxgOQw.js b/src/static/assets/utils-DuVQys2y.js similarity index 99% rename from src/static/assets/utils-B1YxgOQw.js rename to src/static/assets/utils-DuVQys2y.js index 16237cc..51be978 100644 --- a/src/static/assets/utils-B1YxgOQw.js +++ b/src/static/assets/utils-DuVQys2y.js @@ -1 +1 @@ -import{d as se,o as ie,c as le,p as ae,a as Z}from"./index-CO3lBHVT.js";const Fe=se({__name:"Spinner",props:{size:{},class:{}},setup(e){return(r,t)=>(ie(),le("svg",{class:ae(["animate-spin text-current",e.size==="sm"?"h-3 w-3":e.size==="lg"?"h-6 w-6":"h-4 w-4",r.$props.class]),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[...t[0]||(t[0]=[Z("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),Z("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])],2))}});function Q(e){var r,t,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(r=0;r{const r=ue(e),{conflictingClassGroups:t,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:a=>{const s=a.split(O);return s[0]===""&&s.length!==1&&s.shift(),ee(s,r)||pe(a)},getConflictingClassGroupIds:(a,s)=>{const u=t[a]||[];return s&&o[a]?[...u,...o[a]]:u}}},ee=(e,r)=>{var a;if(e.length===0)return r.classGroupId;const t=e[0],o=r.nextPart.get(t),i=o?ee(e.slice(1),o):void 0;if(i)return i;if(r.validators.length===0)return;const n=e.join(O);return(a=r.validators.find(({validator:s})=>s(n)))==null?void 0:a.classGroupId},D=/^\[(.+)\]$/,pe=e=>{if(D.test(e)){const r=D.exec(e)[1],t=r==null?void 0:r.substring(0,r.indexOf(":"));if(t)return"arbitrary.."+t}},ue=e=>{const{theme:r,prefix:t}=e,o={nextPart:new Map,validators:[]};return ge(Object.entries(e.classGroups),t).forEach(([n,a])=>{_(a,o,n,r)}),o},_=(e,r,t,o)=>{e.forEach(i=>{if(typeof i=="string"){const n=i===""?r:K(r,i);n.classGroupId=t;return}if(typeof i=="function"){if(be(i)){_(i(o),r,t,o);return}r.validators.push({validator:i,classGroupId:t});return}Object.entries(i).forEach(([n,a])=>{_(a,K(r,n),t,o)})})},K=(e,r)=>{let t=e;return r.split(O).forEach(o=>{t.nextPart.has(o)||t.nextPart.set(o,{nextPart:new Map,validators:[]}),t=t.nextPart.get(o)}),t},be=e=>e.isThemeGetter,ge=(e,r)=>r?e.map(([t,o])=>{const i=o.map(n=>typeof n=="string"?r+n:typeof n=="object"?Object.fromEntries(Object.entries(n).map(([a,s])=>[r+a,s])):n);return[t,i]}):e,fe=e=>{if(e<1)return{get:()=>{},set:()=>{}};let r=0,t=new Map,o=new Map;const i=(n,a)=>{t.set(n,a),r++,r>e&&(r=0,o=t,t=new Map)};return{get(n){let a=t.get(n);if(a!==void 0)return a;if((a=o.get(n))!==void 0)return i(n,a),a},set(n,a){t.has(n)?t.set(n,a):i(n,a)}}},re="!",me=e=>{const{separator:r,experimentalParseClassName:t}=e,o=r.length===1,i=r[0],n=r.length,a=s=>{const u=[];let g=0,m=0,y;for(let p=0;pm?y-m:void 0;return{modifiers:u,hasImportantModifier:v,baseClassName:w,maybePostfixModifierPosition:b}};return t?s=>t({className:s,parseClassName:a}):a},he=e=>{if(e.length<=1)return e;const r=[];let t=[];return e.forEach(o=>{o[0]==="["?(r.push(...t.sort(),o),t=[]):t.push(o)}),r.push(...t.sort()),r},ye=e=>({cache:fe(e.cacheSize),parseClassName:me(e),...de(e)}),xe=/\s+/,we=(e,r)=>{const{parseClassName:t,getClassGroupId:o,getConflictingClassGroupIds:i}=r,n=[],a=e.trim().split(xe);let s="";for(let u=a.length-1;u>=0;u-=1){const g=a[u],{modifiers:m,hasImportantModifier:y,baseClassName:x,maybePostfixModifierPosition:v}=t(g);let w=!!v,b=o(w?x.substring(0,v):x);if(!b){if(!w){s=g+(s.length>0?" "+s:s);continue}if(b=o(x),!b){s=g+(s.length>0?" "+s:s);continue}w=!1}const p=he(m).join(":"),f=y?p+re:p,h=f+b;if(n.includes(h))continue;n.push(h);const R=i(b,w);for(let A=0;A0?" "+s:s)}return s};function ve(){let e=0,r,t,o="";for(;e{if(typeof e=="string")return e;let r,t="";for(let o=0;oy(m),e());return t=ye(g),o=t.cache.get,i=t.cache.set,n=s,s(u)}function s(u){const g=o(u);if(g)return g;const m=we(u,t);return i(u,m),m}return function(){return n(ve.apply(null,arguments))}}const c=e=>{const r=t=>t[e]||[];return r.isThemeGetter=!0,r},oe=/^\[(?:([a-z-]+):)?(.+)\]$/i,Ce=/^\d+\/\d+$/,ze=new Set(["px","full","screen"]),Se=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Ae=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Me=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Ge=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Re=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,C=e=>M(e)||ze.has(e)||Ce.test(e),z=e=>G(e,"length",Le),M=e=>!!e&&!Number.isNaN(Number(e)),B=e=>G(e,"number",M),P=e=>!!e&&Number.isInteger(Number(e)),Ie=e=>e.endsWith("%")&&M(e.slice(0,-1)),l=e=>oe.test(e),S=e=>Se.test(e),Pe=new Set(["length","size","percentage"]),je=e=>G(e,Pe,ne),Ee=e=>G(e,"position",ne),Ne=new Set(["image","url"]),Te=e=>G(e,Ne,We),$e=e=>G(e,"",Ve),j=()=>!0,G=(e,r,t)=>{const o=oe.exec(e);return o?o[1]?typeof r=="string"?o[1]===r:r.has(o[1]):t(o[2]):!1},Le=e=>Ae.test(e)&&!Me.test(e),ne=()=>!1,Ve=e=>Ge.test(e),We=e=>Re.test(e),Be=()=>{const e=c("colors"),r=c("spacing"),t=c("blur"),o=c("brightness"),i=c("borderColor"),n=c("borderRadius"),a=c("borderSpacing"),s=c("borderWidth"),u=c("contrast"),g=c("grayscale"),m=c("hueRotate"),y=c("invert"),x=c("gap"),v=c("gradientColorStops"),w=c("gradientColorStopPositions"),b=c("inset"),p=c("margin"),f=c("opacity"),h=c("padding"),R=c("saturate"),A=c("scale"),E=c("sepia"),F=c("skew"),U=c("space"),q=c("translate"),$=()=>["auto","contain","none"],L=()=>["auto","hidden","clip","visible","scroll"],V=()=>["auto",l,r],d=()=>[l,r],H=()=>["",C,z],N=()=>["auto",M,l],J=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],T=()=>["solid","dashed","dotted","double","none"],X=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],W=()=>["start","end","center","between","around","evenly","stretch"],I=()=>["","0",l],Y=()=>["auto","avoid","all","avoid-page","page","left","right","column"],k=()=>[M,l];return{cacheSize:500,separator:":",theme:{colors:[j],spacing:[C,z],blur:["none","",S,l],brightness:k(),borderColor:[e],borderRadius:["none","","full",S,l],borderSpacing:d(),borderWidth:H(),contrast:k(),grayscale:I(),hueRotate:k(),invert:I(),gap:d(),gradientColorStops:[e],gradientColorStopPositions:[Ie,z],inset:V(),margin:V(),opacity:k(),padding:d(),saturate:k(),scale:k(),sepia:I(),skew:k(),space:d(),translate:d()},classGroups:{aspect:[{aspect:["auto","square","video",l]}],container:["container"],columns:[{columns:[S]}],"break-after":[{"break-after":Y()}],"break-before":[{"break-before":Y()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...J(),l]}],overflow:[{overflow:L()}],"overflow-x":[{"overflow-x":L()}],"overflow-y":[{"overflow-y":L()}],overscroll:[{overscroll:$()}],"overscroll-x":[{"overscroll-x":$()}],"overscroll-y":[{"overscroll-y":$()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[b]}],"inset-x":[{"inset-x":[b]}],"inset-y":[{"inset-y":[b]}],start:[{start:[b]}],end:[{end:[b]}],top:[{top:[b]}],right:[{right:[b]}],bottom:[{bottom:[b]}],left:[{left:[b]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",P,l]}],basis:[{basis:V()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",l]}],grow:[{grow:I()}],shrink:[{shrink:I()}],order:[{order:["first","last","none",P,l]}],"grid-cols":[{"grid-cols":[j]}],"col-start-end":[{col:["auto",{span:["full",P,l]},l]}],"col-start":[{"col-start":N()}],"col-end":[{"col-end":N()}],"grid-rows":[{"grid-rows":[j]}],"row-start-end":[{row:["auto",{span:[P,l]},l]}],"row-start":[{"row-start":N()}],"row-end":[{"row-end":N()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",l]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",l]}],gap:[{gap:[x]}],"gap-x":[{"gap-x":[x]}],"gap-y":[{"gap-y":[x]}],"justify-content":[{justify:["normal",...W()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...W(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...W(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[h]}],px:[{px:[h]}],py:[{py:[h]}],ps:[{ps:[h]}],pe:[{pe:[h]}],pt:[{pt:[h]}],pr:[{pr:[h]}],pb:[{pb:[h]}],pl:[{pl:[h]}],m:[{m:[p]}],mx:[{mx:[p]}],my:[{my:[p]}],ms:[{ms:[p]}],me:[{me:[p]}],mt:[{mt:[p]}],mr:[{mr:[p]}],mb:[{mb:[p]}],ml:[{ml:[p]}],"space-x":[{"space-x":[U]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[U]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",l,r]}],"min-w":[{"min-w":[l,r,"min","max","fit"]}],"max-w":[{"max-w":[l,r,"none","full","min","max","fit","prose",{screen:[S]},S]}],h:[{h:[l,r,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[l,r,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[l,r,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[l,r,"auto","min","max","fit"]}],"font-size":[{text:["base",S,z]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",B]}],"font-family":[{font:[j]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",l]}],"line-clamp":[{"line-clamp":["none",M,B]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",C,l]}],"list-image":[{"list-image":["none",l]}],"list-style-type":[{list:["none","disc","decimal",l]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[f]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[f]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...T(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",C,z]}],"underline-offset":[{"underline-offset":["auto",C,l]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:d()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",l]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",l]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[f]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...J(),Ee]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",je]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Te]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[w]}],"gradient-via-pos":[{via:[w]}],"gradient-to-pos":[{to:[w]}],"gradient-from":[{from:[v]}],"gradient-via":[{via:[v]}],"gradient-to":[{to:[v]}],rounded:[{rounded:[n]}],"rounded-s":[{"rounded-s":[n]}],"rounded-e":[{"rounded-e":[n]}],"rounded-t":[{"rounded-t":[n]}],"rounded-r":[{"rounded-r":[n]}],"rounded-b":[{"rounded-b":[n]}],"rounded-l":[{"rounded-l":[n]}],"rounded-ss":[{"rounded-ss":[n]}],"rounded-se":[{"rounded-se":[n]}],"rounded-ee":[{"rounded-ee":[n]}],"rounded-es":[{"rounded-es":[n]}],"rounded-tl":[{"rounded-tl":[n]}],"rounded-tr":[{"rounded-tr":[n]}],"rounded-br":[{"rounded-br":[n]}],"rounded-bl":[{"rounded-bl":[n]}],"border-w":[{border:[s]}],"border-w-x":[{"border-x":[s]}],"border-w-y":[{"border-y":[s]}],"border-w-s":[{"border-s":[s]}],"border-w-e":[{"border-e":[s]}],"border-w-t":[{"border-t":[s]}],"border-w-r":[{"border-r":[s]}],"border-w-b":[{"border-b":[s]}],"border-w-l":[{"border-l":[s]}],"border-opacity":[{"border-opacity":[f]}],"border-style":[{border:[...T(),"hidden"]}],"divide-x":[{"divide-x":[s]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[s]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[f]}],"divide-style":[{divide:T()}],"border-color":[{border:[i]}],"border-color-x":[{"border-x":[i]}],"border-color-y":[{"border-y":[i]}],"border-color-s":[{"border-s":[i]}],"border-color-e":[{"border-e":[i]}],"border-color-t":[{"border-t":[i]}],"border-color-r":[{"border-r":[i]}],"border-color-b":[{"border-b":[i]}],"border-color-l":[{"border-l":[i]}],"divide-color":[{divide:[i]}],"outline-style":[{outline:["",...T()]}],"outline-offset":[{"outline-offset":[C,l]}],"outline-w":[{outline:[C,z]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:H()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[f]}],"ring-offset-w":[{"ring-offset":[C,z]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",S,$e]}],"shadow-color":[{shadow:[j]}],opacity:[{opacity:[f]}],"mix-blend":[{"mix-blend":[...X(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":X()}],filter:[{filter:["","none"]}],blur:[{blur:[t]}],brightness:[{brightness:[o]}],contrast:[{contrast:[u]}],"drop-shadow":[{"drop-shadow":["","none",S,l]}],grayscale:[{grayscale:[g]}],"hue-rotate":[{"hue-rotate":[m]}],invert:[{invert:[y]}],saturate:[{saturate:[R]}],sepia:[{sepia:[E]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[t]}],"backdrop-brightness":[{"backdrop-brightness":[o]}],"backdrop-contrast":[{"backdrop-contrast":[u]}],"backdrop-grayscale":[{"backdrop-grayscale":[g]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[m]}],"backdrop-invert":[{"backdrop-invert":[y]}],"backdrop-opacity":[{"backdrop-opacity":[f]}],"backdrop-saturate":[{"backdrop-saturate":[R]}],"backdrop-sepia":[{"backdrop-sepia":[E]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[a]}],"border-spacing-x":[{"border-spacing-x":[a]}],"border-spacing-y":[{"border-spacing-y":[a]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",l]}],duration:[{duration:k()}],ease:[{ease:["linear","in","out","in-out",l]}],delay:[{delay:k()}],animate:[{animate:["none","spin","ping","pulse","bounce",l]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[A]}],"scale-x":[{"scale-x":[A]}],"scale-y":[{"scale-y":[A]}],rotate:[{rotate:[P,l]}],"translate-x":[{"translate-x":[q]}],"translate-y":[{"translate-y":[q]}],"skew-x":[{"skew-x":[F]}],"skew-y":[{"skew-y":[F]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",l]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",l]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":d()}],"scroll-mx":[{"scroll-mx":d()}],"scroll-my":[{"scroll-my":d()}],"scroll-ms":[{"scroll-ms":d()}],"scroll-me":[{"scroll-me":d()}],"scroll-mt":[{"scroll-mt":d()}],"scroll-mr":[{"scroll-mr":d()}],"scroll-mb":[{"scroll-mb":d()}],"scroll-ml":[{"scroll-ml":d()}],"scroll-p":[{"scroll-p":d()}],"scroll-px":[{"scroll-px":d()}],"scroll-py":[{"scroll-py":d()}],"scroll-ps":[{"scroll-ps":d()}],"scroll-pe":[{"scroll-pe":d()}],"scroll-pt":[{"scroll-pt":d()}],"scroll-pr":[{"scroll-pr":d()}],"scroll-pb":[{"scroll-pb":d()}],"scroll-pl":[{"scroll-pl":d()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",l]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[C,z,B]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},_e=ke(Be);function Ue(...e){return _e(ce(e))}function qe(e){const r=Math.floor(e),t=Math.round((e-r)*60);return r===0?`${t}m`:t===0?`${r}h`:`${r}h ${t}m`}function He(e){return new Date(e).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Je(e){return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Xe(e){const r=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${r}-${t}-${o}`}export{Fe as _,He as a,Je as b,Ue as c,qe as f,Xe as i}; +import{d as se,o as ie,c as le,p as ae,a as Z}from"./index-B9hhyP-T.js";const Fe=se({__name:"Spinner",props:{size:{},class:{}},setup(e){return(r,t)=>(ie(),le("svg",{class:ae(["animate-spin text-current",e.size==="sm"?"h-3 w-3":e.size==="lg"?"h-6 w-6":"h-4 w-4",r.$props.class]),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[...t[0]||(t[0]=[Z("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),Z("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])],2))}});function Q(e){var r,t,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(r=0;r{const r=ue(e),{conflictingClassGroups:t,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:a=>{const s=a.split(O);return s[0]===""&&s.length!==1&&s.shift(),ee(s,r)||pe(a)},getConflictingClassGroupIds:(a,s)=>{const u=t[a]||[];return s&&o[a]?[...u,...o[a]]:u}}},ee=(e,r)=>{var a;if(e.length===0)return r.classGroupId;const t=e[0],o=r.nextPart.get(t),i=o?ee(e.slice(1),o):void 0;if(i)return i;if(r.validators.length===0)return;const n=e.join(O);return(a=r.validators.find(({validator:s})=>s(n)))==null?void 0:a.classGroupId},D=/^\[(.+)\]$/,pe=e=>{if(D.test(e)){const r=D.exec(e)[1],t=r==null?void 0:r.substring(0,r.indexOf(":"));if(t)return"arbitrary.."+t}},ue=e=>{const{theme:r,prefix:t}=e,o={nextPart:new Map,validators:[]};return ge(Object.entries(e.classGroups),t).forEach(([n,a])=>{_(a,o,n,r)}),o},_=(e,r,t,o)=>{e.forEach(i=>{if(typeof i=="string"){const n=i===""?r:K(r,i);n.classGroupId=t;return}if(typeof i=="function"){if(be(i)){_(i(o),r,t,o);return}r.validators.push({validator:i,classGroupId:t});return}Object.entries(i).forEach(([n,a])=>{_(a,K(r,n),t,o)})})},K=(e,r)=>{let t=e;return r.split(O).forEach(o=>{t.nextPart.has(o)||t.nextPart.set(o,{nextPart:new Map,validators:[]}),t=t.nextPart.get(o)}),t},be=e=>e.isThemeGetter,ge=(e,r)=>r?e.map(([t,o])=>{const i=o.map(n=>typeof n=="string"?r+n:typeof n=="object"?Object.fromEntries(Object.entries(n).map(([a,s])=>[r+a,s])):n);return[t,i]}):e,fe=e=>{if(e<1)return{get:()=>{},set:()=>{}};let r=0,t=new Map,o=new Map;const i=(n,a)=>{t.set(n,a),r++,r>e&&(r=0,o=t,t=new Map)};return{get(n){let a=t.get(n);if(a!==void 0)return a;if((a=o.get(n))!==void 0)return i(n,a),a},set(n,a){t.has(n)?t.set(n,a):i(n,a)}}},re="!",me=e=>{const{separator:r,experimentalParseClassName:t}=e,o=r.length===1,i=r[0],n=r.length,a=s=>{const u=[];let g=0,m=0,y;for(let p=0;pm?y-m:void 0;return{modifiers:u,hasImportantModifier:v,baseClassName:w,maybePostfixModifierPosition:b}};return t?s=>t({className:s,parseClassName:a}):a},he=e=>{if(e.length<=1)return e;const r=[];let t=[];return e.forEach(o=>{o[0]==="["?(r.push(...t.sort(),o),t=[]):t.push(o)}),r.push(...t.sort()),r},ye=e=>({cache:fe(e.cacheSize),parseClassName:me(e),...de(e)}),xe=/\s+/,we=(e,r)=>{const{parseClassName:t,getClassGroupId:o,getConflictingClassGroupIds:i}=r,n=[],a=e.trim().split(xe);let s="";for(let u=a.length-1;u>=0;u-=1){const g=a[u],{modifiers:m,hasImportantModifier:y,baseClassName:x,maybePostfixModifierPosition:v}=t(g);let w=!!v,b=o(w?x.substring(0,v):x);if(!b){if(!w){s=g+(s.length>0?" "+s:s);continue}if(b=o(x),!b){s=g+(s.length>0?" "+s:s);continue}w=!1}const p=he(m).join(":"),f=y?p+re:p,h=f+b;if(n.includes(h))continue;n.push(h);const R=i(b,w);for(let A=0;A0?" "+s:s)}return s};function ve(){let e=0,r,t,o="";for(;e{if(typeof e=="string")return e;let r,t="";for(let o=0;oy(m),e());return t=ye(g),o=t.cache.get,i=t.cache.set,n=s,s(u)}function s(u){const g=o(u);if(g)return g;const m=we(u,t);return i(u,m),m}return function(){return n(ve.apply(null,arguments))}}const c=e=>{const r=t=>t[e]||[];return r.isThemeGetter=!0,r},oe=/^\[(?:([a-z-]+):)?(.+)\]$/i,Ce=/^\d+\/\d+$/,ze=new Set(["px","full","screen"]),Se=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Ae=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Me=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Ge=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Re=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,C=e=>M(e)||ze.has(e)||Ce.test(e),z=e=>G(e,"length",Le),M=e=>!!e&&!Number.isNaN(Number(e)),B=e=>G(e,"number",M),P=e=>!!e&&Number.isInteger(Number(e)),Ie=e=>e.endsWith("%")&&M(e.slice(0,-1)),l=e=>oe.test(e),S=e=>Se.test(e),Pe=new Set(["length","size","percentage"]),je=e=>G(e,Pe,ne),Ee=e=>G(e,"position",ne),Ne=new Set(["image","url"]),Te=e=>G(e,Ne,We),$e=e=>G(e,"",Ve),j=()=>!0,G=(e,r,t)=>{const o=oe.exec(e);return o?o[1]?typeof r=="string"?o[1]===r:r.has(o[1]):t(o[2]):!1},Le=e=>Ae.test(e)&&!Me.test(e),ne=()=>!1,Ve=e=>Ge.test(e),We=e=>Re.test(e),Be=()=>{const e=c("colors"),r=c("spacing"),t=c("blur"),o=c("brightness"),i=c("borderColor"),n=c("borderRadius"),a=c("borderSpacing"),s=c("borderWidth"),u=c("contrast"),g=c("grayscale"),m=c("hueRotate"),y=c("invert"),x=c("gap"),v=c("gradientColorStops"),w=c("gradientColorStopPositions"),b=c("inset"),p=c("margin"),f=c("opacity"),h=c("padding"),R=c("saturate"),A=c("scale"),E=c("sepia"),F=c("skew"),U=c("space"),q=c("translate"),$=()=>["auto","contain","none"],L=()=>["auto","hidden","clip","visible","scroll"],V=()=>["auto",l,r],d=()=>[l,r],H=()=>["",C,z],N=()=>["auto",M,l],J=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],T=()=>["solid","dashed","dotted","double","none"],X=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],W=()=>["start","end","center","between","around","evenly","stretch"],I=()=>["","0",l],Y=()=>["auto","avoid","all","avoid-page","page","left","right","column"],k=()=>[M,l];return{cacheSize:500,separator:":",theme:{colors:[j],spacing:[C,z],blur:["none","",S,l],brightness:k(),borderColor:[e],borderRadius:["none","","full",S,l],borderSpacing:d(),borderWidth:H(),contrast:k(),grayscale:I(),hueRotate:k(),invert:I(),gap:d(),gradientColorStops:[e],gradientColorStopPositions:[Ie,z],inset:V(),margin:V(),opacity:k(),padding:d(),saturate:k(),scale:k(),sepia:I(),skew:k(),space:d(),translate:d()},classGroups:{aspect:[{aspect:["auto","square","video",l]}],container:["container"],columns:[{columns:[S]}],"break-after":[{"break-after":Y()}],"break-before":[{"break-before":Y()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...J(),l]}],overflow:[{overflow:L()}],"overflow-x":[{"overflow-x":L()}],"overflow-y":[{"overflow-y":L()}],overscroll:[{overscroll:$()}],"overscroll-x":[{"overscroll-x":$()}],"overscroll-y":[{"overscroll-y":$()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[b]}],"inset-x":[{"inset-x":[b]}],"inset-y":[{"inset-y":[b]}],start:[{start:[b]}],end:[{end:[b]}],top:[{top:[b]}],right:[{right:[b]}],bottom:[{bottom:[b]}],left:[{left:[b]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",P,l]}],basis:[{basis:V()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",l]}],grow:[{grow:I()}],shrink:[{shrink:I()}],order:[{order:["first","last","none",P,l]}],"grid-cols":[{"grid-cols":[j]}],"col-start-end":[{col:["auto",{span:["full",P,l]},l]}],"col-start":[{"col-start":N()}],"col-end":[{"col-end":N()}],"grid-rows":[{"grid-rows":[j]}],"row-start-end":[{row:["auto",{span:[P,l]},l]}],"row-start":[{"row-start":N()}],"row-end":[{"row-end":N()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",l]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",l]}],gap:[{gap:[x]}],"gap-x":[{"gap-x":[x]}],"gap-y":[{"gap-y":[x]}],"justify-content":[{justify:["normal",...W()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...W(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...W(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[h]}],px:[{px:[h]}],py:[{py:[h]}],ps:[{ps:[h]}],pe:[{pe:[h]}],pt:[{pt:[h]}],pr:[{pr:[h]}],pb:[{pb:[h]}],pl:[{pl:[h]}],m:[{m:[p]}],mx:[{mx:[p]}],my:[{my:[p]}],ms:[{ms:[p]}],me:[{me:[p]}],mt:[{mt:[p]}],mr:[{mr:[p]}],mb:[{mb:[p]}],ml:[{ml:[p]}],"space-x":[{"space-x":[U]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[U]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",l,r]}],"min-w":[{"min-w":[l,r,"min","max","fit"]}],"max-w":[{"max-w":[l,r,"none","full","min","max","fit","prose",{screen:[S]},S]}],h:[{h:[l,r,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[l,r,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[l,r,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[l,r,"auto","min","max","fit"]}],"font-size":[{text:["base",S,z]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",B]}],"font-family":[{font:[j]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",l]}],"line-clamp":[{"line-clamp":["none",M,B]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",C,l]}],"list-image":[{"list-image":["none",l]}],"list-style-type":[{list:["none","disc","decimal",l]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[f]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[f]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...T(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",C,z]}],"underline-offset":[{"underline-offset":["auto",C,l]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:d()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",l]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",l]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[f]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...J(),Ee]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",je]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Te]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[w]}],"gradient-via-pos":[{via:[w]}],"gradient-to-pos":[{to:[w]}],"gradient-from":[{from:[v]}],"gradient-via":[{via:[v]}],"gradient-to":[{to:[v]}],rounded:[{rounded:[n]}],"rounded-s":[{"rounded-s":[n]}],"rounded-e":[{"rounded-e":[n]}],"rounded-t":[{"rounded-t":[n]}],"rounded-r":[{"rounded-r":[n]}],"rounded-b":[{"rounded-b":[n]}],"rounded-l":[{"rounded-l":[n]}],"rounded-ss":[{"rounded-ss":[n]}],"rounded-se":[{"rounded-se":[n]}],"rounded-ee":[{"rounded-ee":[n]}],"rounded-es":[{"rounded-es":[n]}],"rounded-tl":[{"rounded-tl":[n]}],"rounded-tr":[{"rounded-tr":[n]}],"rounded-br":[{"rounded-br":[n]}],"rounded-bl":[{"rounded-bl":[n]}],"border-w":[{border:[s]}],"border-w-x":[{"border-x":[s]}],"border-w-y":[{"border-y":[s]}],"border-w-s":[{"border-s":[s]}],"border-w-e":[{"border-e":[s]}],"border-w-t":[{"border-t":[s]}],"border-w-r":[{"border-r":[s]}],"border-w-b":[{"border-b":[s]}],"border-w-l":[{"border-l":[s]}],"border-opacity":[{"border-opacity":[f]}],"border-style":[{border:[...T(),"hidden"]}],"divide-x":[{"divide-x":[s]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[s]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[f]}],"divide-style":[{divide:T()}],"border-color":[{border:[i]}],"border-color-x":[{"border-x":[i]}],"border-color-y":[{"border-y":[i]}],"border-color-s":[{"border-s":[i]}],"border-color-e":[{"border-e":[i]}],"border-color-t":[{"border-t":[i]}],"border-color-r":[{"border-r":[i]}],"border-color-b":[{"border-b":[i]}],"border-color-l":[{"border-l":[i]}],"divide-color":[{divide:[i]}],"outline-style":[{outline:["",...T()]}],"outline-offset":[{"outline-offset":[C,l]}],"outline-w":[{outline:[C,z]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:H()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[f]}],"ring-offset-w":[{"ring-offset":[C,z]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",S,$e]}],"shadow-color":[{shadow:[j]}],opacity:[{opacity:[f]}],"mix-blend":[{"mix-blend":[...X(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":X()}],filter:[{filter:["","none"]}],blur:[{blur:[t]}],brightness:[{brightness:[o]}],contrast:[{contrast:[u]}],"drop-shadow":[{"drop-shadow":["","none",S,l]}],grayscale:[{grayscale:[g]}],"hue-rotate":[{"hue-rotate":[m]}],invert:[{invert:[y]}],saturate:[{saturate:[R]}],sepia:[{sepia:[E]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[t]}],"backdrop-brightness":[{"backdrop-brightness":[o]}],"backdrop-contrast":[{"backdrop-contrast":[u]}],"backdrop-grayscale":[{"backdrop-grayscale":[g]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[m]}],"backdrop-invert":[{"backdrop-invert":[y]}],"backdrop-opacity":[{"backdrop-opacity":[f]}],"backdrop-saturate":[{"backdrop-saturate":[R]}],"backdrop-sepia":[{"backdrop-sepia":[E]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[a]}],"border-spacing-x":[{"border-spacing-x":[a]}],"border-spacing-y":[{"border-spacing-y":[a]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",l]}],duration:[{duration:k()}],ease:[{ease:["linear","in","out","in-out",l]}],delay:[{delay:k()}],animate:[{animate:["none","spin","ping","pulse","bounce",l]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[A]}],"scale-x":[{"scale-x":[A]}],"scale-y":[{"scale-y":[A]}],rotate:[{rotate:[P,l]}],"translate-x":[{"translate-x":[q]}],"translate-y":[{"translate-y":[q]}],"skew-x":[{"skew-x":[F]}],"skew-y":[{"skew-y":[F]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",l]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",l]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":d()}],"scroll-mx":[{"scroll-mx":d()}],"scroll-my":[{"scroll-my":d()}],"scroll-ms":[{"scroll-ms":d()}],"scroll-me":[{"scroll-me":d()}],"scroll-mt":[{"scroll-mt":d()}],"scroll-mr":[{"scroll-mr":d()}],"scroll-mb":[{"scroll-mb":d()}],"scroll-ml":[{"scroll-ml":d()}],"scroll-p":[{"scroll-p":d()}],"scroll-px":[{"scroll-px":d()}],"scroll-py":[{"scroll-py":d()}],"scroll-ps":[{"scroll-ps":d()}],"scroll-pe":[{"scroll-pe":d()}],"scroll-pt":[{"scroll-pt":d()}],"scroll-pr":[{"scroll-pr":d()}],"scroll-pb":[{"scroll-pb":d()}],"scroll-pl":[{"scroll-pl":d()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",l]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[C,z,B]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},_e=ke(Be);function Ue(...e){return _e(ce(e))}function qe(e){const r=Math.floor(e),t=Math.round((e-r)*60);return r===0?`${t}m`:t===0?`${r}h`:`${r}h ${t}m`}function He(e){return new Date(e).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Je(e){return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function Xe(e){const r=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${r}-${t}-${o}`}export{Fe as _,He as a,Je as b,Ue as c,qe as f,Xe as i}; diff --git a/src/static/index.html b/src/static/index.html index 79b607e..7d6f448 100644 --- a/src/static/index.html +++ b/src/static/index.html @@ -5,8 +5,8 @@ CC Dashboard - - + +
diff --git a/web/src/components/dashboard/KpiCard.vue b/web/src/components/dashboard/KpiCard.vue index f2766a8..cddc034 100644 --- a/web/src/components/dashboard/KpiCard.vue +++ b/web/src/components/dashboard/KpiCard.vue @@ -1,4 +1,5 @@ diff --git a/web/src/components/shared/Sidebar.vue b/web/src/components/shared/Sidebar.vue index 7c3b08c..8abaec9 100644 --- a/web/src/components/shared/Sidebar.vue +++ b/web/src/components/shared/Sidebar.vue @@ -43,19 +43,19 @@ const userInitials = computed(() => {