storebound/apps/desktop/src/ui/illustrations.tsx
CRT ae2ffd8dbf Phosphor icons and the real store marks
Desktop icons move from lucide to Phosphor (@phosphor-icons/react, per-icon imports, regular weight; fill for the
active nav item, notices and rating stars). The site's icons and the fixture art use Phosphor's own files from
@phosphor-icons/core. App Store and Google Play are shown with their marks from simple-icons (CC0 data), vendored
unchanged by tools/site-icons.ts and rendered as a mask in the neutral text colour next to the store's name; the
trademark note is in docs/desktop.md and the site footer. lucide-react and lucide-static removed. The
no-hand-written-SVG guard allows only the vendored files (byte-equal to their packages) and per-icon Phosphor
imports. Site stylesheet ?v= bumped.
2026-10-11 09:00:46 +08:00

46 lines
2.2 KiB
TypeScript

// Empty state art: a Phosphor icon (@phosphor-icons/react, MIT) on a soft tile with an optional small badge icon, in
// the theme's tokens (styles.css .illo), the empty-state style of Linear and Vercel. No drawn artwork. Decorative.
import { ChatTextIcon } from '@phosphor-icons/react/dist/csr/ChatText';
import { CheckIcon } from '@phosphor-icons/react/dist/csr/Check';
import { CloudArrowDownIcon } from '@phosphor-icons/react/dist/csr/CloudArrowDown';
import { CubeIcon } from '@phosphor-icons/react/dist/csr/Cube';
import { DeviceMobileIcon } from '@phosphor-icons/react/dist/csr/DeviceMobile';
import { FileTextIcon } from '@phosphor-icons/react/dist/csr/FileText';
import { KeyIcon } from '@phosphor-icons/react/dist/csr/Key';
import { PackageIcon } from '@phosphor-icons/react/dist/csr/Package';
import { PaperPlaneTiltIcon } from '@phosphor-icons/react/dist/csr/PaperPlaneTilt';
import { PlusIcon } from '@phosphor-icons/react/dist/csr/Plus';
import { PulseIcon } from '@phosphor-icons/react/dist/csr/Pulse';
import { QuestionIcon } from '@phosphor-icons/react/dist/csr/Question';
import { ShieldCheckIcon } from '@phosphor-icons/react/dist/csr/ShieldCheck';
import { StarIcon } from '@phosphor-icons/react/dist/csr/Star';
import { WrenchIcon } from '@phosphor-icons/react/dist/csr/Wrench';
import type { Icon as PhosphorIcon } from '@phosphor-icons/react/lib';
export type IlloName = 'apps' | 'cloud' | 'reviews' | 'shield' | 'key' | 'plane' | 'pulse' | 'catalog' | 'text' | 'tools' | 'unknown';
const ART: Record<IlloName, [PhosphorIcon, PhosphorIcon?]> = {
apps: [DeviceMobileIcon, PlusIcon],
cloud: [CloudArrowDownIcon],
reviews: [ChatTextIcon, StarIcon],
shield: [ShieldCheckIcon],
key: [KeyIcon],
plane: [PaperPlaneTiltIcon],
pulse: [PulseIcon],
catalog: [PackageIcon, CheckIcon],
text: [FileTextIcon, CheckIcon],
tools: [CubeIcon, WrenchIcon],
unknown: [QuestionIcon],
};
export function Illo({ name }: { name: IlloName }) {
const [Main, Badge] = ART[name] ?? ART.unknown;
return (
<div className="illo" aria-hidden="true" data-illo={name}>
<span className="illo-tile">
<Main weight="regular" />
{Badge && <span className="illo-badge"><Badge weight="bold" /></span>}
</span>
</div>
);
}