PageSourceSearch

https://joshcohen.ai/assets/AppsIndex-DoSUttmj.js

js joshcohen.ai collected 2026-10-05 13:38:14 UTC 14,075 bytes, 1 lines download raw bytes

1import{j as e,m as N}from"./vendor-motion-CdZEEXXA.js";import{r as m}from"./vendor-helmet-CzbbIAH0.js";import{ad as _,l as f,ah as M,x as I,P as j,f as $,U as E,n as k,j as v,ab as O,q as R}from"./vendor-icons-e2CnFXzE.js";import{S as q,a}from"./index-C6ulZlhm.js";import{a as w,b as B,S as y,g as J}from"./appsData-DtBnECzQ.js";import{u as z}from"./useCommunityAppAccess-C1URJiIw.js";import{c as D,L as p}from"./vendor-react-B7aH7Fjf.js";import"./vendor-supabase-rwgBubiN.js";import"./useUserProducts-LOjtIvmr.js";const T={live:"Live","in-progress":"In progress",mock:"Preview"},V=t=>t?"bg-slate-900 text-white dark:bg-white dark:text-slate-950":"bg-slate-100 text-slate-600 hover:bg-slate-200 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700",G=t=>t==="live"?"border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-500/30 dark:bg-emerald-500/10 dark:text-emerald-300":t==="in-progress"?"border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-300":"border-slate-200 bg-slate-50 text-slate-600 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300",K=({app:t,unlocked:d,access:r})=>{const i=r.unlockingProductId===t.productId,o=t.downloadUrl||t.githubUrl||t.liveUrl;return d&&o?e.jsxs("a",{href:o,target:"_blank",rel:"noopener noreferrer",className:"inline-flex min-h-11 flex-1 items-center justify-center gap-2 rounded-lg bg-slate-900 px-4 text-sm font-bold text-white transition hover:bg-slate-800 dark:bg-white dark:text-slate-950 dark:hover:bg-slate-100",children:[e.jsx(a,{icon:E,className:"h-4 w-4"}),"Open app"]}):r.user?r.isCommunityMember?t.isSourceProject?o?e.jsxs("a",{href:o,target:"_blank",rel:"noopener noreferrer",className:"inline-flex min-h-11 flex-1 items-center justify-center gap-2 rounded-lg bg-slate-900 px-4 text-sm font-bold text-white transition hover:bg-slate-800 dark:bg-white dark:text-slate-950 dark:hover:bg-slate-100",children:[e.jsx(a,{icon:O,className:"h-4 w-4"}),"Open source"]}):e.jsxs("button",{type:"button",disabled:!0,className:"inline-flex min-h-11 flex-1 cursor-not-allowed items-center justify-center gap-2 rounded-lg border border-slate-200 px-4 text-sm font-bold text-slate-400 dark:border-slate-700",children:[e.jsx(a,{icon:v,className:"h-4 w-4"}),"Package pending"]}):e.jsxs("button",{type:"button",onClick:()=>r.unlock(t),disabled:i,className:"inline-flex min-h-11 flex-1 items-center justify-center gap-2 rounded-lg bg-slate-900 px-4 text-sm font-bold text-white transition hover:bg-slate-800 disabled:cursor-wait disabled:opacity-70 dark:bg-white dark:text-slate-950 dark:hover:bg-slate-100",children:[e.jsx(a,{icon:i?R:v,className:`h-4 w-4 ${i?"animate-spin":""}`}),"Add to downloads"]}):e.jsxs(p,{to:"/community",className:"inline-flex min-h-11 flex-1 items-center justify-center gap-2 rounded-lg bg-slate-900 px-4 text-sm font-bold text-white transition hover:bg-slate-800 dark:bg-white dark:text-slate-950 dark:hover:bg-slate-100",children:[e.jsx(a,{icon:k,className:"h-4 w-4"}),"Join community"]}):e.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:"inline-flex min-h-11 flex-1 items-center justify-center gap-2 rounded-lg bg-slate-900 px-4 text-sm font-bold text-white transition hover:bg-slate-800 dark:bg-white dark:text-slate-950 dark:hover:bg-slate-100",children:[e.jsx(a,{icon:k,className:"h-4 w-4"}),"Join community"]})},Q=({app:t,access:d})=>{const r=d.isUnlocked(t.productId),i=t.techStack.slice(0,4),o=t.techStack.length-i.length;return e.jsxs(N.article,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},className:"group flex h-full flex-col overflow-hidden rounded-2xl border border-slate-100 bg-white shadow-lg transition-all duration-300 hover:-translate-y-1 hover:shadow-2xl dark:border-slate-700 dark:bg-slate-800",children:[e.jsxs(p,{to:`/apps/${t.slug}`,className:"relative block h-48 overflow-hidden bg-slate-100 dark:bg-slate-900",children:[e.jsx("img",{src:t.image,alt:t.title,className:"h-full w-full object-cover transition-transform duration-500 group-hover:scale-105",loading:"lazy"}),e.jsx("div",{className:"absolute inset-x-0 bottom-0 h-24 bg-gradient-to-t from-slate-950/75 to-transparent","aria-hidden":"true"}),e.jsxs("div",{className:"absolute left-4 top-4 flex flex-wrap gap-2",children:[e.jsx("span",{className:`rounded-full border px-3 py-1 text-xs font-bold uppercase tracking-wider ${G(t.status)}`,children:T[t.status]||t.status}),r&&e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-emerald-500 px-3 py-1 text-xs font-bold uppercase tracking-wider text-white",children:[e.jsx(a,{icon:j,className:"h-3 w-3"}),"Ready"]})]}),e.jsxs("div",{className:"absolute bottom-4 left-4 right-4 flex items-end justify-between gap-3",children:[e.jsx("span",{className:"rounded-full bg-white/90 px-3 py-1 text-xs font-bold uppercase tracking-wider text-slate-900 backdrop-blur",children:J(t.category)}),t.price!=null&&e.jsxs("span",{className:"rounded-full bg-slate-950/85 px-3 py-1 text-sm font-bold text-white backdrop-blur",children:["$",t.price]})]})]}),e.jsxs("div",{className:"flex flex-1 flex-col p-6",children:[e.jsx(p,{to:`/apps/${t.slug}`,children:e.jsx("h2",{className:"font-serif text-xl font-bold leading-tight text-slate-900 transition group-hover:text-amber-600 dar
1k:text-white dark:group-hover:text-amber-400",children:t.title})}),e.jsx("p",{className:"mt-2 text-sm leading-6 text-slate-600 dark:text-slate-300",children:t.tagline}),e.jsx("p",{className:"mt-4 line-clamp-3 text-sm leading-6 text-slate-500 dark:text-slate-400",children:t.description}),e.jsxs("div",{className:"mt-5 flex flex-wrap gap-1.5",children:[i.map(n=>e.jsx("span",{className:"rounded border border-slate-200 bg-slate-50 px-2 py-0.5 font-mono text-[11px] text-slate-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-400",children:n},n)),o>0&&e.jsxs("span",{className:"rounded border border-slate-200 bg-slate-50 px-2 py-0.5 font-mono text-[11px] text-slate-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-400",children:["+",o," more"]})]}),e.jsx("ul",{className:"mt-5 space-y-2",children:t.features.slice(0,3).map(n=>e.jsxs("li",{className:"flex items-start gap-2 text-xs leading-5 text-slate-500 dark:text-slate-400",children:[e.jsx(a,{icon:j,className:"mt-0.5 h-3.5 w-3.5 shrink-0 text-emerald-500"}),e.jsx("span",{children:n})]},n))}),e.jsxs("div",{className:"mt-auto flex gap-2 pt-6",children:[e.jsx(K,{app:t,unlocked:r,access:d}),e.jsx(p,{to:`/apps/${t.slug}`,"aria-label":`View ${t.title}`,className:"inline-flex min-h-11 items-center justify-center rounded-lg border border-slate-200 px-3 text-slate-600 transition hover:border-slate-400 hover:bg-slate-50 hover:text-slate-900 dark:border-slate-700 dark:text-slate-300 dark:hover:border-slate-500 dark:hover:bg-slate-700 dark:hover:text-white",children:e.jsx(a,{icon:$,className:"h-4 w-4"})})]})]})]})},re=()=>{const[t,d]=D(),[r,i]=m.useState(t.get("category")||"all"),[o,n]=m.useState(""),[u,C]=m.useState("all"),[h,S]=m.useState("featured"),b=z();m.useEffect(()=>{i(t.get("category")||"all")},[t]);const L=s=>{i(s);const c=new URLSearchParams(t);s==="all"?c.delete("category"):c.set("category",s),d(c,{replace:!0})},g=m.useMemo(()=>{const s=o.trim().toLowerCase(),c=[...w].filter(l=>{const x=r==="all"||l.category===r||r==="source"&&l.isSourceProject,P=u==="all"||l.status===u,A=!s||l.title.toLowerCase().includes(s)||l.description.toLowerCase().includes(s)||l.tagline.toLowerCase().includes(s)||l.techStack.some(U=>U.toLowerCase().includes(s));return x&&P&&A});return c.sort((l,x)=>h==="name"?l.title.localeCompare(x.title):h==="live"?+(x.status==="live")-+(l.status==="live"):h==="newest"?x.version.localeCompare(l.version):Number(x.isSourceProject)-Number(l.isSourceProject)),c},[o,r,h,u]),F=w.filter(s=>b.isUnlocked(s.productId)||b.isCommunityMember&&s.isSourceProject&&(s.githubUrl||s.liveUrl)).length;return e.jsxs("div",{className:"v7-public-apps relative min-h-screen bg-slate-50 pb-24 transition-colors duration-300 dark:bg-slate-900",children:[e.jsx(q,{title:"My Apps",description:"Apps, source projects, and tools built by Joshua Cohen.",path:"/apps"}),e.jsxs("section",{className:"v7-apps-hero v7-apps-hero--image relative isolate mb-12 flex min-h-[430px] items-center overflow-hidden px-4 pb-14 pt-36 text-center sm:px-8 lg:px-12",children:[e.jsx("div",{className:"absolute inset-0 overflow-hidden","aria-hidden":"true",children:e.jsx("img",{src:"/images/apps/apps-hero-joshua-soft-focus.webp",className:"h-full w-full scale-[1.02] object-cover object-[68%_center] blur-[1px] sm:object-center",alt:"",loading:"eager",fetchPriority:"high"})}),e.jsx("div",{className:"absolute inset-0 bg-slate-950/20"}),e.jsx("div",{className:"v7-apps-hero__wash absolute inset-0"}),e.jsx("div",{className:"v7-apps-hero__shade absolute inset-0"}),e.jsxs(N.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.6},className:"relative z-10 mx-auto max-w-3xl",children:[e.jsx("span",{className:"mb-4 inline-block text-xs font-bold uppercase tracking-[0.2em] text-amber-300",children:"App Store"}),e.jsx("h1",{className:"mb-6 font-serif text-5xl font-bold !text-white md:text-7xl",children:"My Apps"}),e.jsx("p",{className:"text-xl font-light leading-relaxed !text-slate-200",children:"Browse the apps, source projects, and community tools I have built. Join the community to get member access as packages go live."})]})]}),e.jsxs("section",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",children:[e.jsx("div",{className:"mb-8",children:e.jsxs("div",{className:"relative mx-auto max-w-2xl",children:[e.jsx(a,{icon:_,className:"absolute left-4 top-1/2 h-5 w-5 -translate-y-1/2 text-slate-400"}),e.jsx("input",{type:"text",placeholder:"Search apps, source, or stack",value:o,onChange:s=>n(s.target.value),className:"w-full rounded-lg border-2 border-slate-200 bg-white py-3 pl-12 pr-4 text-slate-900 outline-none transition focus:border-slate-900 dark:border-slate-700 dark:bg-slate-800 dark:text-white dark:focus:border-white"})]})}),e.jsx("div",{className:"mb-8",children:e.jsx("div",{className:"flex items-center gap-3 overflow-x-auto pb-2",children:B.map(s=>e.jsx("button",{type:"button",onClick:()=>L(s.id),className:`whitespace-nowrap rounded-lg px-4 py-2 text-sm font-medium transition-all ${V(r===s.id)}`,children:s.label},s.id))})}),e.jsxs("div",{className:"mb-8 flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsxs("div",{className:"relative",children:[e.jsxs("select",{"aria-label":"Filter apps by status",value:u,onChange:s=>C(s.target.value),className:"cursor-pointer appearance-none rounded-lg border border-slate-300 bg-white py-2 pl-4 pr-10 text-sm font-medium text-slate-900 outline-none focus:border-slate-900 dark:border-slate-600 dar
1k:bg-slate-800 dark:text-white dark:focus:border-white",children:[e.jsx("option",{value:"all",children:"All statuses"}),e.jsx("option",{value:"live",children:"Live"}),e.jsx("option",{value:"in-progress",children:"In progress"}),e.jsx("option",{value:"mock",children:"Preview"})]}),e.jsx(a,{icon:f,className:"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-400"})]}),e.jsxs("div",{className:"inline-flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400",children:[e.jsx(a,{icon:M,className:"h-4 w-4"}),g.length," apps"]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"hidden text-sm text-slate-500 dark:text-slate-400 sm:inline",children:"Sort by"}),e.jsxs("div",{className:"relative",children:[e.jsxs("select",{"aria-label":"Sort apps",value:h,onChange:s=>S(s.target.value),className:"cursor-pointer appearance-none rounded-lg border border-slate-300 bg-white py-2 pl-4 pr-10 text-sm font-medium text-slate-900 outline-none focus:border-slate-900 dark:border-slate-600 dark:bg-slate-800 dark:text-white dark:focus:border-white",children:[e.jsx("option",{value:"featured",children:"Featured"}),e.jsx("option",{value:"live",children:"Live first"}),e.jsx("option",{value:"newest",children:"Newest"}),e.jsx("option",{value:"name",children:"Name"})]}),e.jsx(a,{icon:f,className:"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-400"})]})]})]}),b.unlockError&&e.jsx("div",{className:"mb-8 rounded-xl border border-rose-300 bg-rose-50 px-4 py-3 text-sm text-rose-800 dark:border-rose-400/30 dark:bg-rose-400/10 dark:text-rose-100",children:b.unlockError}),e.jsx("div",{className:"mb-8 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-slate-700 dark:bg-slate-800",children:e.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-center md:justify-between",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-sm font-bold text-slate-900 dark:text-white",children:[F," available to open"]}),e.jsx("p",{className:"mt-1 text-sm text-slate-500 dark:text-slate-400",children:"Community access controls downloads as app packages are attached."})]}),e.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:"inline-flex min-h-11 items-center justify-center gap-2 rounded-lg border border-slate-200 px-4 text-sm font-bold text-slate-700 transition hover:border-slate-400 hover:bg-slate-50 dark:border-slate-700 dark:text-slate-200 dark:hover:border-slate-500 dark:hover:bg-slate-700",children:["Community",e.jsx(a,{icon:I,className:"h-4 w-4"})]})]})}),e.jsx("div",{className:"grid gap-6 md:grid-cols-2 lg:grid-cols-3",children:g.map(s=>e.jsx(Q,{app:s,access:b},s.id))}),g.length===0&&e.jsxs("div",{className:"mt-12 rounded-2xl border border-dashed border-slate-300 bg-white p-10 text-center dark:border-slate-700 dark:bg-slate-800",children:[e.jsx("p",{className:"font-serif text-2xl font-bold text-slate-900 dark:text-white",children:"No apps matched that search."}),e.jsx("p",{className:"mt-2 text-sm text-slate-500 dark:text-slate-400",children:"Clear the filters and try another stack or project name."})]})]})]})};export{re 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.