PageSourceSearch

https://proteinos.com/assets/Projects-DbKq9Fzx.js

js proteinos.com collected 2026-10-02 11:51:28 UTC 2,843 bytes, 1 lines download raw bytes

1import{j as e}from"./vendor-markdown-C-I3nZWo.js";import{r as l}from"./vendor-charts-DphG3eWF.js";import{X as u,s as d,r as p,L as x}from"./index-DFoQxP2Z.js";import{u as f}from"./useProjectData-Dpb42ke7.js";import{N as n}from"./NewProjectDialog-Dwxc-S22.js";import{f as c}from"./projectNumber-DAYbT0NU.js";import{E as j}from"./empty-state-y59dDvCN.js";import{g,K as h}from"./vendor-icons-DptrxPFP.js";import{f as b}from"./vendor-date-DwvsUr7l.js";import"./vendor-office-CYA1a3lH.js";import"./vendor-query-Csct0vqx.js";import"./vendor-radix-DiGlQgnh.js";import"./vendor-supabase-C6T5JIOu.js";import"./vendor-analytics-4JMxWFgu.js";import"./vendor-forms-Crpao7PO.js";import"./textarea-DyjusVvx.js";import"./generatePrompts-BePk4jDA.js";const T=()=>{const{projects:t,loading:s,refresh:a}=f(),i=u();return l.useEffect(()=>{if(s||t.length>0)return;let r=!1;return(async()=>{const[o,m]=await Promise.all([d.from("debriefs").select("id",{count:"exact",head:!0}),d.from("question_credits").select("id",{count:"exact",head:!0})]);r||(o.count??0)===0&&(m.count??0)===0&&i("/welcome",{replace:!0})})(),()=>{r=!0}},[s,t.length,i]),e.jsx(p,{children:e.jsx("div",{className:"contents",children:e.jsxs("div",{className:"contents",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between ",children:[e.jsx("h3",{className:"font-redaction italic text-2xl md:text-3xl text-foreground leading-none",children:"Projects"}),e.jsx(n,{onCreated:a})]}),e.jsx("hr",{className:"mb-6 border-border"}),e.jsx("div",{className:"",children:s?e.jsx("div",{className:"grid gap-3 md:grid-cols-2",children:Array.from({length:4}).map((r,o)=>e.jsx("div",{className:"h-24 rounded-lg border border-border bg-card animate-pulse"},o))}):t.length===0?e.jsx(j,{icon:g,title:"No projects yet",description:"Create your first project to start building project-specific knowledge, personas, and prompts.",action:e.jsx(n,{onCreated:a})}):e.jsx("div",{className:"grid gap-3 md:grid-cols-2",children:t.map(r=>e.jsxs(x,{to:`/projects/${r.slug??r.id}`,className:"group rounded-lg border border-border bg-card p-4 transition-colors hover:border-foreground
1/30 hover:bg-muted/30",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[c(r.project_number)&&e.jsx("p",{className:"text-xs font-mono text-muted-foreground",children:c(r.project_number)}),e.jsx("h4",{className:"font-medium leading-tight",children:r.name})]}),e.jsx(h,{className:"h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-0.5"})]}),r.description&&e.jsx("p",{className:"mt-1 line-clamp-2 text-sm text-muted-foreground",children:r.description}),e.jsxs("p",{className:"mt-3 text-xs text-muted-foreground/60",children:["Updated ",b(new Date(r.updated_at),{addSuffix:!0})]})]},r.id))})})]})})})};export{T as default};

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