// kbpkg screens — Header, install command, registry list, package detail. const { Icon, Button, Badge, Tag, Avatar, Lockup, useState } = window; function Header({ view, onHome }) { const nav = ['Packages', 'Docs', 'Changelog']; return (
); } function CopyCommand({ id }) { const [copied, setCopied] = useState(false); const cmd = `kbpkg add ${id}`; const copy = () => { setCopied(true); setTimeout(() => setCopied(false), 1400); }; return (
$ {cmd}
); } function PackageRow({ pkg, onOpen }) { return (
onOpen(pkg)}>
{pkg.name} v{pkg.version}

{pkg.desc}

{pkg.tags.map(t => {t})}
{pkg.installs} {pkg.updated}
); } function Registry({ onOpen }) { const all = window.KBPKG_PACKAGES; const [q, setQ] = useState(''); const [filter, setFilter] = useState(null); const tags = [...new Set(all.flatMap(p => p.tags))].slice(0, 8); const list = all.filter(p => { const matchQ = !q || (p.name + ' ' + p.desc).toLowerCase().includes(q.toLowerCase()); const matchT = !filter || p.tags.includes(filter); return matchQ && matchT; }); return (
kbpkg registry

A package manager for me.

Git-based packages for the kBenestad apps. Install anything with one command.

setQ(e.target.value)} placeholder="Search packages…" />
setFilter(null)} active={!filter}>all {tags.map(t => setFilter(t === filter ? null : t)} active={t === filter}>{t})}
{list.length} package{list.length === 1 ? '' : 's'} sorted by recently updated
{list.map(p => )} {list.length === 0 &&
No packages match “{q}”.
}
); } function MetaRow({ icon, label, children }) { return (
{label} {children}
); } function PackagePage({ pkg, onHome, onOpen }) { const [tab, setTab] = useState('readme'); const tabs = [ { id: 'readme', label: 'Readme' }, { id: 'versions', label: `Versions` }, { id: 'deps', label: 'Dependencies' }, ]; return (
Packages{pkg.name}

{pkg.name} v{pkg.version}

{pkg.desc}

published
{tabs.map(t => )}
{tab === 'readme' && (

{pkg.name}

{pkg.readme}

Install with kbpkg add {pkg.id} and import what you need. Licensed under {pkg.license}.

)} {tab === 'versions' && (
{pkg.versions.map(([v, when], i) => (
v{v}{i === 0 && latest} {when}
))}
)} {tab === 'deps' && (
{pkg.dependencies.length === 0 &&
No dependencies — this package is self-contained.
} {pkg.dependencies.map(([d, range]) => { const dp = window.KBPKG_PACKAGES.find(p => p.id === d); return (
dp && onOpen(dp)}> {d} {range}
); })}
)}
); } Object.assign(window, { Header, Registry, PackagePage });