// ============================================================
// Shared primitives — icons, logo lockup, status badges
// Lucide-style stroke icons (24px grid, currentColor)
// ============================================================
const Icon = ({ d, size = 22, sw = 1.9, fill = "none", children, style }) => (
);
const Icons = {
sun: (p) => ,
moon: (p) => ,
search: (p) => ,
chevDown:(p) => ,
camera: (p) => ,
upload: (p) => ,
pin: (p) => ,
check: (p) => ,
x: (p) => ,
refresh:(p) => ,
edit: (p) => ,
eye: (p) => ,
bell: (p) => ,
filter: (p) => ,
send: (p) => ,
arrowR: (p) => ,
layers: (p) => ,
user: (p) => ,
trash: (p) => ,
facebook:(p) => ,
xLogo: (p) => ,
instagram:(p) => ,
youtube:(p) => ,
globe: (p) => ,
home: (p) => ,
plus: (p) => ,
news: (p) => ,
chevR: (p) => ,
bookmark:(p) => ,
sliders:(p) => ,
help: (p) => ,
};
// ---------- Nambikkai logo lockup ----------
function Logo({ height = 44, stacked = false, sub = true }) {
return (

{sub && (
Ground News
v1.0 · ground intelligence
)}
);
}
// ---------- Status badge ----------
const STATUS = {
DRAFT: { c: "var(--st-draft)", fill: false },
"UNDER REVIEW": { c: "var(--st-review)", fill: true },
APPROVED: { c: "var(--st-approve)", fill: true },
HELD: { c: "var(--st-held)", fill: true },
REJECTED: { c: "var(--red)", fill: true },
PENDING: { c: "var(--st-review)", fill: false },
FLAGGED: { c: "var(--red)", fill: false },
"CHANGES REQ.": { c: "var(--st-review)", fill: true },
};
function Badge({ status, size = "md" }) {
const s = STATUS[status] || STATUS.DRAFT;
const pad = size === "sm" ? "2px 9px" : "2px 10px";
const fs = size === "sm" ? 11.5 : 12;
return (
{status}
);
}
// ---------- Category pill ----------
function Pill({ children, active, onClick, mono = true }) {
return (
);
}
Object.assign(window, { Icon, Icons, Logo, Badge, Pill, STATUS });