// 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 (
{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 });