import type { ReactNode } from "react" /** * Story-only icons. **Nothing here ships.** * * The library deliberately owns no icon set — `IconButton`, * `EmptyState`, `Badge`, and `MediaTile` all take a `ReactNode`, and * lucide (ISC) is the fleet recommendation — but the boards still * have to show *something*, and what they show should be what an app * will actually pass: an inline SVG inheriting `currentColor`. * * They are hand-drawn rather than copied, and they exist for a second * reason worth writing down: **this sandbox's headless Chromium has * no font covering `⚙`, `↶`, `▨`, or `⚠`** — every one of those * measures blank, so a glyph-only board screenshots as an empty box * and a reviewer cannot tell a missing font from a broken component. * `IconButton`'s `RawGlyph` story keeps one glyph on purpose, because * a raw glyph is what plex-channels renders today and the point of * that story is that it gets a *name* regardless. */ /** * `aria-hidden` is repeated on every `` below rather than living * here, because Biome's `noSvgWithoutTitle` cannot see through a * spread — and a rule that fires on correct code gets switched off, * which would then miss the icon that really is unlabelled. Every * icon in this file is decoration beside a real name. */ const iconProps = { className: "size-[1.15em] shrink-0", fill: "none", focusable: false, stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.75, viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", } as const export const SettingsIcon = (): ReactNode => ( ) /** * The back-arrow seven repos spell as a literal `←`, drawn instead — * so the `TextLink` boards screenshot as an arrow rather than as the * blank box that character measures in this Chromium. */ export const ArrowLeftIcon = (): ReactNode => ( ) export const ArrowRightIcon = (): ReactNode => ( ) /** The `↗` an app puts after an external link, drawn. */ export const ExternalIcon = (): ReactNode => ( ) export const UndoIcon = (): ReactNode => ( ) export const RedoIcon = (): ReactNode => ( ) export const PlayIcon = (): ReactNode => ( ) export const InboxIcon = (): ReactNode => ( ) export const SearchIcon = (): ReactNode => ( ) export const AlertIcon = (): ReactNode => ( ) export const ImageOffIcon = (): ReactNode => ( ) export const SunIcon = (): ReactNode => ( ) export const MoonIcon = (): ReactNode => ( ) export const MonitorIcon = (): ReactNode => ( ) export const DotIcon = (): ReactNode => ( ) /** * The overflow glyph — three dots, the ⋮ every header in the fleet * draws as a **character**. Drawn rather than typed, because * `⋮` renders as nothing where the font lacks it: this sandbox's * chromium, the kiosk image, the ePaper build * ([decision](../../../docs/decisions/2026-07-29-ship-no-icons-and-no-symbol-glyphs.md)). * It lives here, in the stories, because the library ships no icons. */ export const MoreIcon = (): ReactNode => ( ) /** * The three-line "open the nav" glyph, for `NavBar`'s collapsed * trigger. U+2630 TRIGRAM FOR HEAVEN — the character a repo reaches * for instead — measures blank in this sandbox's chromium, exactly * like the three-dot glyph above. */ export const MenuIcon = (): ReactNode => ( ) /** * The markdown toolbar's nine, plus the bar's own overflow above. * * They are here rather than in the editor's story file because the * two editors — the textarea one and the CodeMirror one — take the * same `icons` bag and both boards want it. `MARKDOWN_ICONS` below * is the whole bag, so a story passes one object instead of nine * props and cannot demonstrate a half-iconed bar by accident. */ export const BoldIcon = (): ReactNode => ( ) export const ItalicIcon = (): ReactNode => ( ) export const HeadingIcon = (): ReactNode => ( ) export const BulletedListIcon = (): ReactNode => ( ) export const TaskListIcon = (): ReactNode => ( ) export const NumberedListIcon = (): ReactNode => ( ) /** * Two quote marks, not an indented bar. An indent bar is what the * *result* looks like; the marks are what the button does. * * Filled, and closed rather than an open stroke. The stroked * version of this shape drew as a pair of `s` characters at * `size-[1.15em]` — a curve that reads as a letter is worse than * no icon, because the eye stops to read it. */ export const QuoteIcon = (): ReactNode => ( ) export const CodeIcon = (): ReactNode => ( ) export const LinkIcon = (): ReactNode => ( ) export const ImageIcon = (): ReactNode => ( ) /** * The whole `MarkdownEditorIcons` bag, ready to spread into either * editor's `icons` prop. */ export const MARKDOWN_ICONS = { bold: , bulletedList: , code: , heading: , image: , italic: , link: , numberedList: , overflow: , quote: , taskList: , }