┌─ ASTRO ────────────────────────────────────────────────────────────────────┐
│ --- │
│ import ArticleLayout from "../layouts/ArticleLayout/ArticleLayout.astro"; │
│ import TopHeader from "../components/TopHeader/TopHeader.astro"; │
│ import Frame from "../components/Frame/Frame.astro"; │
│ import Pre from "../components/Pre/Pre.astro"; │
│ import Button from "../components/Button/Button.astro"; │
│ import TextField from "../components/TextField/TextField.astro"; │
│ import Checkbox from "../components/Checkbox/Checkbox.astro"; │
│ import Radio from "../components/Radio/Radio.astro"; │
│ import Select from "../components/Select/Select.astro"; │
│ import FormFrame from "../components/FormFrame/FormFrame.astro"; │
│ import type { Field } from "../components/FormFrame/FormFrame"; │
│ import Tree from "../components/Tree/Tree.astro"; │
│ import type { TreeNode } from "../components/Tree/Tree"; │
│ import Progress from "../components/Progress/Progress.astro"; │
│ import Spinner from "../components/Spinner/Spinner.astro"; │
│ import Status from "../components/Status/Status.astro"; │
│ import TableOfContents from "../components/TableOfContents/TableOfContents.astro"; │
│ import Accordion from "../components/Accordion/Accordion.astro"; │
│ import Tabs from "../components/Tabs/Tabs.astro"; │
│ import Breadcrumbs from "../components/Breadcrumbs/Breadcrumbs.astro"; │
│ import Timeline from "../components/Timeline/Timeline.astro"; │
│ import type { TimelineEntry } from "../components/Timeline/Timeline"; │
│ import Kbd from "../components/Kbd/Kbd.astro"; │
│ import Gauge from "../components/Gauge/Gauge.astro"; │
│ import Sparkline from "../components/Sparkline/Sparkline.astro"; │
│ import BarChart from "../components/BarChart/BarChart.astro"; │
│ import BigNumber from "../components/BigNumber/BigNumber.astro"; │
│ import Panel from "../components/Panel/Panel.astro"; │
│ import KeyValue from "../components/KeyValue/KeyValue.astro"; │
│ import Banner from "../components/Banner/Banner.astro"; │
│ import Steps from "../components/Steps/Steps.astro"; │
│ import Calendar from "../components/Calendar/Calendar.astro"; │
│ import Pagination from "../components/Pagination/Pagination.astro"; │
│ import Switch from "../components/Switch/Switch.astro"; │
│ import NumberStepper from "../components/NumberStepper/NumberStepper.astro"; │
│ import Dialog from "../components/Dialog/Dialog.astro"; │
│ import Menu from "../components/Menu/Menu.astro"; │
│ import Tooltip from "../components/Tooltip/Tooltip.astro"; │
│ import Slider from "../components/Slider/Slider.astro"; │
│ import Diff from "../components/Diff/Diff.astro"; │
│ import { rule, ruleD, row2, pad } from "../lib/ascii"; │
│ │
│ const section = (title: string, right: string) => (w: number) => │
│ [row2(title, right, w), ruleD(w)].join("\n"); │
│ │
│ const LABEL_W = 12; │
│ │
│ const REPORT_FIELDS: Field[] = [ │
│ { kind: "text", label: "CALLSIGN", name: "callsign", cells: 26 }, │
│ { kind: "text", label: "FREQUENCY", name: "frequency", cells: 26 }, │
│ { kind: "select", label: "CHANNEL", name: "channel", options: ["ALPHA", "BRAVO", │
│ "OOKNET-9"], cells: 20, value: "ALPHA" }, │
│ { kind: "gap" }, │
│ { kind: "radios", label: "PRIORITY", name: "priority", options: ["ROUTINE", "URG │
│ ENT", "FLASH"], value: "ROUTINE" }, │
│ { kind: "gap" }, │
│ { kind: "checkbox", label: "ENCRYPT TRANSMISSION", name: "encrypt", checked: tru │
│ e }, │
│ { kind: "checkbox", label: "NOTIFY ON REPLY", name: "notify" }, │
│ { kind: "gap" }, │
│ { kind: "textarea", label: "MESSAGE", name: "message", rows: 4 }, │
│ { kind: "gap" }, │
│ { kind: "buttons", buttons: [{ label: "TRANSMIT", variant: "primary" }, { label: │
│ "CLEAR", type: "reset" }] }, │
│ ]; │
│ │
│ const DEMO_HEADINGS = [ │
│ { depth: 1, slug: "buttons", text: "Buttons" }, │
│ { depth: 1, slug: "text-fields", text: "Text fields" }, │
│ { depth: 1, slug: "toggles", text: "Toggles" }, │
│ { depth: 2, slug: "checkboxes", text: "Checkboxes" }, │
│ { depth: 2, slug: "radios", text: "Radios" }, │
│ { depth: 1, slug: "form-frame", text: "Form frame" }, │
│ ]; │
│ │
│ const HISTORY: TimelineEntry[] = [ │
│ { date: "2026-07-16", title: "FILED /WEBSITE", desc: "style sheet - exercises ev │
│ ery pipeline construct", href: "/docs/ooknet-org/style-sheet/" }, │
│ { date: "2026-04-27", title: "FILED /AI", desc: "using ai to troubleshoot and re │
│ solve issues", href: "/notes/ai/using-ai-to-troubleshoot/" }, │
│ { date: "2026-04-25", title: "FILED /KB", href: "/kb/windows/collect-data-tss/" │
│ }, │
│ { date: "2026-04-19", title: "FILED /GRAPHS", desc: "entropy bounds in sparse gr │
│ aphs", href: "/notes/graphs/entropy-bounds/" }, │
│ ]; │
│ │
│ const FILED_TREE: TreeNode[] = [ │
│ { │
│ label: "/NOTES", │
│ children: [ │
│ { label: "AI", children: [{ label: "USING AI TO TROUBLESHOOT", href: "/notes │
│ /ai/using-ai-to-troubleshoot/" }] }, │
│ { label: "GRAPHS", children: [{ label: "ENTROPY BOUNDS", href: "/notes/graph │
│ s/entropy-bounds/" }] }, │
│ ], │
│ }, │
│ { │
│ label: "/KB", │
│ children: [{ label: "WINDOWS", children: [{ label: "COLLECT DATA (TSS)", href: │
│ "/kb/windows/collect-data-tss/" }] }], │
│ }, │
│ ]; │
│ --- │
│ <ArticleLayout title="OOKNET KB - Components" │
│ description="The OOKNET ASCII component library - every frame, chart, and contro │
│ l the design system ships, demonstrated live."> │
│ <TopHeader /> │
│ <Frame build={(w) => [row2("COMPONENT INDEX", "DESIGN SYSTEM v0.1", w), ruleD(w) │
│ ].join("\n")} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BUTTONS", "Button.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Button label="SUBMIT" variant="primary" />{" "}<Button label="CANCEL" />{ │
│ " "}<Button label="DISABLED" disabled />{" "}<Button label="INDEX" href="/" /></ │
│ Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TEXT FIELDS", "TextField.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("CALLSIGN", LABEL_W)}<TextField name="demo-callsign" cells={20} /></Pr │
│ e> │
│ <Pre>{pad("PASSPHRASE", LABEL_W)}<TextField name="demo-passphrase" cells={20} ty │
│ pe="password" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TOGGLES", "Checkbox.astro / Radio.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Checkbox label="ENCRYPT TRANSMISSION" name="demo-encrypt" checked /></Pre> │
│ <Pre><Checkbox label="NOTIFY ON REPLY" name="demo-notify" /></Pre> │
│ <Pre><Checkbox label="DISABLED OPTION" name="demo-disabled" disabled /></Pre> │
│ <Pre>{" "}</Pre> │
│ <Pre><Radio label="ROUTINE" name="demo-priority" value="routine" checked /></Pre │
│ > │
│ <Pre><Radio label="URGENT" name="demo-priority" value="urgent" /></Pre> │
│ <Pre><Radio label="FLASH" name="demo-priority" value="flash" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("SELECT", "Select.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("CHANNEL", LABEL_W)}<Select name="demo-channel" cells={20} options={[" │
│ ALPHA", "BRAVO", "OOKNET-9"]} value="ALPHA" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("FORM FRAME", "FormFrame.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <FormFrame title="FIELD REPORT" fields={REPORT_FIELDS} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Status variant="ok" message="TRANSMISSION QUEUED" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TREE", "Tree.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Tree nodes={FILED_TREE} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("PROGRESS", "Progress.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("REINDEX", LABEL_W)}<Progress value={57} /></Pre> │
│ <Pre>{pad("UPLINK", LABEL_W)}<Progress value={100} /></Pre> │
│ <Pre>{pad("DECAY", LABEL_W)}<Progress value={8} /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("STATUS", "Status.astro / Spinner.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Status variant="ok" message="TRANSMISSION QUEUED" /></Pre> │
│ <Pre><Status variant="error" message="FREQUENCY OUT OF BAND" /></Pre> │
│ <Pre><Status variant="pending" message="AWAITING PEER CHECK" /></Pre> │
│ <Pre><Spinner />{" SYNCING INDEX"}</Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TABLE OF CONTENTS", "TableOfContents.astro")} /> │
│ <TableOfContents headings={DEMO_HEADINGS} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("ACCORDION", "Accordion.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Accordion label="APPENDIX A - CELL MEASUREMENTS"> │
│ <p>Cascadia Mono "0" advance at 13px: 7.617px. IBM Plex Mono drifts on box-dra │
│ wing glyphs, which is why it never draws frames.</p> │
│ </Accordion> │
│ <Accordion label="APPENDIX B - DROPPED GLYPH SETS"> │
│ <p>Heavy box-drawing (U+250F etc.) fell back to a wider face and bent every bo │
│ rder it touched. Dropped from the grid.</p> │
│ </Accordion> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TIMELINE", "Timeline.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Timeline entries={HISTORY} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("GAUGE", "Gauge.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("SIGNAL", LABEL_W)}<Gauge value={47} threshold={70} /></Pre> │
│ <Pre>{pad("BUFFER", LABEL_W)}<Gauge value={85} threshold={70} /></Pre> │
│ <Pre>{pad("DECAY", LABEL_W)}<Gauge value={8} /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("SPARKLINE", "Sparkline.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("UPLINK", LABEL_W)}<Sparkline values={[3, 5, 9, 4, 6, 12, 8, 7, 11, 14 │
│ , 9, 6]} />{" 14 PEAK"}</Pre> │
│ <Pre>{pad("NOISE", LABEL_W)}<Sparkline values={[2, 2, 3, 2, 2, 2, 4, 3, 2, 2, 3, │
│ 2]} />{" 4 PEAK"}</Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BAR CHART", "BarChart.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <BarChart items={[ │
│ { label: "NORTH", value: 42 }, │
│ { label: "EAST", value: 17 }, │
│ { label: "SOUTH", value: 29 }, │
│ { label: "WEST", value: 8 }, │
│ ]} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BIG NUMBER", "BigNumber.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <BigNumber value="14,230" label="KHZ - PRIMARY RELAY FREQUENCY" /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("PANEL", "Panel.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Panel title="RELAY LOG"> │
│ <Pre>{pad("LAST SWEEP", LABEL_W)}<Sparkline values={[3, 5, 9, 4, 6, 12, 8, 7]} │
│ /></Pre> │
│ <Pre>{pad("SIGNAL", LABEL_W)}<Gauge value={47} threshold={70} /></Pre> │
│ </Panel> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("KEY VALUE", "KeyValue.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <KeyValue entries={[ │
│ ["STATION", "OOKNET-9"], │
│ ["FREQUENCY", "14.230 MHZ"], │
│ ["REMARKS", "relay via the northern repeater when the direct path fades below │
│ threshold"], │
│ ]} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BANNER", "Banner.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Banner variant="notice" message="scheduled maintenance window sunday 02:00-04:0 │
│ 0 UTC" /> │
│ <Banner variant="warning" message="frequency drift detected on channel bravo - r │
│ ecalibrate before transmitting" /> │
│ <Banner variant="error" message="uplink lost" /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("STEPS", "Steps.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Steps steps={["DRAFT", "PEER CHECK", "PUBLISH"]} current={1} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("CALENDAR", "Calendar.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Calendar year={2026} month={7} marks={[16, 17]} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("PAGINATION", "Pagination.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pagination current={6} total={20} href={(n) => `/?page=${n}`} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("KBD", "Kbd.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{"press "}<Kbd keys={["/"]} />{" to search, "}<Kbd keys={["CTRL", "K"]} />{ │
│ " for the palette"}</Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TABS", "Tabs.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Tabs labels={["NIX", "NPM", "MANUAL"]}> │
│ <Fragment slot="tab-0"> │
│ <Pre>{"$ nix develop"}</Pre> │
│ <Pre>{"$ npm run dev"}</Pre> │
│ </Fragment> │
│ <Fragment slot="tab-1"> │
│ <Pre>{"$ npm install"}</Pre> │
│ <Pre>{"$ npm run dev"}</Pre> │
│ </Fragment> │
│ <Fragment slot="tab-2"> │
│ <Pre>{"clone the repo and bring your own node >= 22.12"}</Pre> │
│ </Fragment> │
│ </Tabs> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BREADCRUMBS", "Breadcrumbs.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Breadcrumbs filed="/INFO/GRAPH/ENTROPY/BOUND" /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("DIFF", "Diff.astro")} /> │
│ <Diff code={`@@ -1,3 +1,4 @@\n export function pad(s: unknown, n: number): strin │
│ g {\n- return String(s).padEnd(n);\n+ const str = String(s ?? "");\n+ return st │
│ r + " ".repeat(Math.max(0, n - len(str)));\n }`} /> │
│ │
│ <Frame build={section("MENU", "Menu.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Menu label="ACTIONS" items={[ │
│ { label: "COPY LINK" }, │
│ { label: "DOWNLOAD .MD" }, │
│ { label: "VIEW SOURCE", href: "https://github.com/" }, │
│ { label: "REPORT DRIFT" }, │
│ ]} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{" "}</Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TOOLTIP", "Tooltip.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{"frame font "}<Tooltip text="Cascadia Mono - every glyph measured against │
│ the 0 advance before joining the grid" />{" threshold "}<Tooltip text="the gauge │
│ flips its status word here" label="i" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("SLIDER", "Slider.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("SQUELCH", LABEL_W)}<Slider name="demo-squelch" value={35} cells={24} │
│ /></Pre> │
│ <Pre>{pad("GAIN", LABEL_W)}<Slider name="demo-gain" value={70} min={0} max={100} │
│ step={5} cells={24} /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("SWITCH", "Switch.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Switch label="AUTO-ACK INCOMING" name="demo-autoack" checked /></Pre> │
│ <Pre><Switch label="BEACON MODE" name="demo-beacon" /></Pre> │
│ <Pre><Switch label="DISABLED RELAY" name="demo-relay" disabled /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("NUMBER STEPPER", "NumberStepper.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("POWER (W)", LABEL_W)}<NumberStepper name="demo-power" value={25} min= │
│ {0} max={100} step={5} /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("DIALOG", "Dialog.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><span data-dialog-open="demo-dialog"><Button label="OPEN TRANSMISSION LOG" │
│ variant="primary" /></span></Pre> │
│ <Dialog id="demo-dialog" title="TRANSMISSION LOG"> │
│ <Pre>{"2026-07-17 09:41 N0 ACK RECEIVED"}</Pre> │
│ <Pre>{"2026-07-17 09:38 BEACON SENT ON BRAVO"}</Pre> │
│ <Pre>{"2026-07-17 09:12 CHANNEL SCAN COMPLETE"}</Pre> │
│ </Dialog> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TOAST", "Toast.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><span id="toast-ok"><Button label="QUEUE" variant="primary" /></span>{" "} │
│ <span id="toast-error"><Button label="JAM" /></span>{" "}<span id="toast-pending" │
│ ><Button label="HOLD" /></span></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={(w) => rule(w)} /> │
│ </ArticleLayout> │
│ │
│ <script> │
│ import type { StatusVariant } from "../components/Status/Status"; │
│ │
│ const wire = (id: string, message: string, variant: StatusVariant) => │
│ document.querySelector(`#${id} .btn`)?.addEventListener("click", () => window. │
│ ooknetToast?.(message, variant)); │
│ │
│ wire("toast-ok", "TRANSMISSION QUEUED", "ok"); │
│ wire("toast-error", "FREQUENCY OUT OF BAND", "error"); │
│ wire("toast-pending", "AWAITING PEER CHECK", "pending"); │
│ </script> │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ ASTRO ──────────────────────────────┐
│ --- │
│ import ArticleLayout from "../layouts/Articl │
│ eLayout/ArticleLayout.astro"; │
│ import TopHeader from "../components/TopHead │
│ er/TopHeader.astro"; │
│ import Frame from "../components/Frame/Frame │
│ .astro"; │
│ import Pre from "../components/Pre/Pre.astro │
│ "; │
│ import Button from "../components/Button/But │
│ ton.astro"; │
│ import TextField from "../components/TextFie │
│ ld/TextField.astro"; │
│ import Checkbox from "../components/Checkbox │
│ /Checkbox.astro"; │
│ import Radio from "../components/Radio/Radio │
│ .astro"; │
│ import Select from "../components/Select/Sel │
│ ect.astro"; │
│ import FormFrame from "../components/FormFra │
│ me/FormFrame.astro"; │
│ import type { Field } from "../components/Fo │
│ rmFrame/FormFrame"; │
│ import Tree from "../components/Tree/Tree.as │
│ tro"; │
│ import type { TreeNode } from "../components │
│ /Tree/Tree"; │
│ import Progress from "../components/Progress │
│ /Progress.astro"; │
│ import Spinner from "../components/Spinner/S │
│ pinner.astro"; │
│ import Status from "../components/Status/Sta │
│ tus.astro"; │
│ import TableOfContents from "../components/T │
│ ableOfContents/TableOfContents.astro"; │
│ import Accordion from "../components/Accordi │
│ on/Accordion.astro"; │
│ import Tabs from "../components/Tabs/Tabs.as │
│ tro"; │
│ import Breadcrumbs from "../components/Bread │
│ crumbs/Breadcrumbs.astro"; │
│ import Timeline from "../components/Timeline │
│ /Timeline.astro"; │
│ import type { TimelineEntry } from "../compo │
│ nents/Timeline/Timeline"; │
│ import Kbd from "../components/Kbd/Kbd.astro │
│ "; │
│ import Gauge from "../components/Gauge/Gauge │
│ .astro"; │
│ import Sparkline from "../components/Sparkli │
│ ne/Sparkline.astro"; │
│ import BarChart from "../components/BarChart │
│ /BarChart.astro"; │
│ import BigNumber from "../components/BigNumb │
│ er/BigNumber.astro"; │
│ import Panel from "../components/Panel/Panel │
│ .astro"; │
│ import KeyValue from "../components/KeyValue │
│ /KeyValue.astro"; │
│ import Banner from "../components/Banner/Ban │
│ ner.astro"; │
│ import Steps from "../components/Steps/Steps │
│ .astro"; │
│ import Calendar from "../components/Calendar │
│ /Calendar.astro"; │
│ import Pagination from "../components/Pagina │
│ tion/Pagination.astro"; │
│ import Switch from "../components/Switch/Swi │
│ tch.astro"; │
│ import NumberStepper from "../components/Num │
│ berStepper/NumberStepper.astro"; │
│ import Dialog from "../components/Dialog/Dia │
│ log.astro"; │
│ import Menu from "../components/Menu/Menu.as │
│ tro"; │
│ import Tooltip from "../components/Tooltip/T │
│ ooltip.astro"; │
│ import Slider from "../components/Slider/Sli │
│ der.astro"; │
│ import Diff from "../components/Diff/Diff.as │
│ tro"; │
│ import { rule, ruleD, row2, pad } from "../l │
│ ib/ascii"; │
│ │
│ const section = (title: string, right: strin │
│ g) => (w: number) => │
│ [row2(title, right, w), ruleD(w)].join("\n │
│ "); │
│ │
│ const LABEL_W = 12; │
│ │
│ const REPORT_FIELDS: Field[] = [ │
│ { kind: "text", label: "CALLSIGN", name: " │
│ callsign", cells: 26 }, │
│ { kind: "text", label: "FREQUENCY", name: │
│ "frequency", cells: 26 }, │
│ { kind: "select", label: "CHANNEL", name: │
│ "channel", options: ["ALPHA", "BRAVO", "OOKN │
│ ET-9"], cells: 20, value: "ALPHA" }, │
│ { kind: "gap" }, │
│ { kind: "radios", label: "PRIORITY", name: │
│ "priority", options: ["ROUTINE", "URGENT", │
│ "FLASH"], value: "ROUTINE" }, │
│ { kind: "gap" }, │
│ { kind: "checkbox", label: "ENCRYPT TRANSM │
│ ISSION", name: "encrypt", checked: true }, │
│ { kind: "checkbox", label: "NOTIFY ON REPL │
│ Y", name: "notify" }, │
│ { kind: "gap" }, │
│ { kind: "textarea", label: "MESSAGE", name │
│ : "message", rows: 4 }, │
│ { kind: "gap" }, │
│ { kind: "buttons", buttons: [{ label: "TRA │
│ NSMIT", variant: "primary" }, { label: "CLEA │
│ R", type: "reset" }] }, │
│ ]; │
│ │
│ const DEMO_HEADINGS = [ │
│ { depth: 1, slug: "buttons", text: "Button │
│ s" }, │
│ { depth: 1, slug: "text-fields", text: "Te │
│ xt fields" }, │
│ { depth: 1, slug: "toggles", text: "Toggle │
│ s" }, │
│ { depth: 2, slug: "checkboxes", text: "Che │
│ ckboxes" }, │
│ { depth: 2, slug: "radios", text: "Radios" │
│ }, │
│ { depth: 1, slug: "form-frame", text: "For │
│ m frame" }, │
│ ]; │
│ │
│ const HISTORY: TimelineEntry[] = [ │
│ { date: "2026-07-16", title: "FILED /WEBSI │
│ TE", desc: "style sheet - exercises every pi │
│ peline construct", href: "/docs/ooknet-org/s │
│ tyle-sheet/" }, │
│ { date: "2026-04-27", title: "FILED /AI", │
│ desc: "using ai to troubleshoot and resolve │
│ issues", href: "/notes/ai/using-ai-to-troubl │
│ eshoot/" }, │
│ { date: "2026-04-25", title: "FILED /KB", │
│ href: "/kb/windows/collect-data-tss/" }, │
│ { date: "2026-04-19", title: "FILED /GRAPH │
│ S", desc: "entropy bounds in sparse graphs", │
│ href: "/notes/graphs/entropy-bounds/" }, │
│ ]; │
│ │
│ const FILED_TREE: TreeNode[] = [ │
│ { │
│ label: "/NOTES", │
│ children: [ │
│ { label: "AI", children: [{ label: "US │
│ ING AI TO TROUBLESHOOT", href: "/notes/ai/us │
│ ing-ai-to-troubleshoot/" }] }, │
│ { label: "GRAPHS", children: [{ label: │
│ "ENTROPY BOUNDS", href: "/notes/graphs/entr │
│ opy-bounds/" }] }, │
│ ], │
│ }, │
│ { │
│ label: "/KB", │
│ children: [{ label: "WINDOWS", children: │
│ [{ label: "COLLECT DATA (TSS)", href: "/kb/ │
│ windows/collect-data-tss/" }] }], │
│ }, │
│ ]; │
│ --- │
│ <ArticleLayout title="OOKNET KB - Components │
│ " │
│ description="The OOKNET ASCII component li │
│ brary - every frame, chart, and control the │
│ design system ships, demonstrated live."> │
│ <TopHeader /> │
│ <Frame build={(w) => [row2("COMPONENT INDE │
│ X", "DESIGN SYSTEM v0.1", w), ruleD(w)].join │
│ ("\n")} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BUTTONS", "Button.a │
│ stro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Button label="SUBMIT" variant="prima │
│ ry" />{" "}<Button label="CANCEL" />{" "}< │
│ Button label="DISABLED" disabled />{" "}<Bu │
│ tton label="INDEX" href="/" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TEXT FIELDS", "Text │
│ Field.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("CALLSIGN", LABEL_W)}<TextField │
│ name="demo-callsign" cells={20} /></Pre> │
│ <Pre>{pad("PASSPHRASE", LABEL_W)}<TextFiel │
│ d name="demo-passphrase" cells={20} type="pa │
│ ssword" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TOGGLES", "Checkbox │
│ .astro / Radio.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Checkbox label="ENCRYPT TRANSMISSION │
│ " name="demo-encrypt" checked /></Pre> │
│ <Pre><Checkbox label="NOTIFY ON REPLY" nam │
│ e="demo-notify" /></Pre> │
│ <Pre><Checkbox label="DISABLED OPTION" nam │
│ e="demo-disabled" disabled /></Pre> │
│ <Pre>{" "}</Pre> │
│ <Pre><Radio label="ROUTINE" name="demo-pri │
│ ority" value="routine" checked /></Pre> │
│ <Pre><Radio label="URGENT" name="demo-prio │
│ rity" value="urgent" /></Pre> │
│ <Pre><Radio label="FLASH" name="demo-prior │
│ ity" value="flash" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("SELECT", "Select.as │
│ tro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("CHANNEL", LABEL_W)}<Select name │
│ ="demo-channel" cells={20} options={["ALPHA" │
│ , "BRAVO", "OOKNET-9"]} value="ALPHA" /></Pr │
│ e> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("FORM FRAME", "FormF │
│ rame.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <FormFrame title="FIELD REPORT" fields={RE │
│ PORT_FIELDS} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Status variant="ok" message="TRANSMI │
│ SSION QUEUED" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TREE", "Tree.astro" │
│ )} /> │
│ <Pre>{" "}</Pre> │
│ <Tree nodes={FILED_TREE} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("PROGRESS", "Progres │
│ s.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("REINDEX", LABEL_W)}<Progress va │
│ lue={57} /></Pre> │
│ <Pre>{pad("UPLINK", LABEL_W)}<Progress val │
│ ue={100} /></Pre> │
│ <Pre>{pad("DECAY", LABEL_W)}<Progress valu │
│ e={8} /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("STATUS", "Status.as │
│ tro / Spinner.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Status variant="ok" message="TRANSMI │
│ SSION QUEUED" /></Pre> │
│ <Pre><Status variant="error" message="FREQ │
│ UENCY OUT OF BAND" /></Pre> │
│ <Pre><Status variant="pending" message="AW │
│ AITING PEER CHECK" /></Pre> │
│ <Pre><Spinner />{" SYNCING INDEX"}</Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TABLE OF CONTENTS", │
│ "TableOfContents.astro")} /> │
│ <TableOfContents headings={DEMO_HEADINGS} │
│ /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("ACCORDION", "Accord │
│ ion.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Accordion label="APPENDIX A - CELL MEASUR │
│ EMENTS"> │
│ <p>Cascadia Mono "0" advance at 13px: 7. │
│ 617px. IBM Plex Mono drifts on box-drawing g │
│ lyphs, which is why it never draws frames.</ │
│ p> │
│ </Accordion> │
│ <Accordion label="APPENDIX B - DROPPED GLY │
│ PH SETS"> │
│ <p>Heavy box-drawing (U+250F etc.) fell │
│ back to a wider face and bent every border i │
│ t touched. Dropped from the grid.</p> │
│ </Accordion> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TIMELINE", "Timelin │
│ e.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Timeline entries={HISTORY} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("GAUGE", "Gauge.astr │
│ o")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("SIGNAL", LABEL_W)}<Gauge value= │
│ {47} threshold={70} /></Pre> │
│ <Pre>{pad("BUFFER", LABEL_W)}<Gauge value= │
│ {85} threshold={70} /></Pre> │
│ <Pre>{pad("DECAY", LABEL_W)}<Gauge value={ │
│ 8} /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("SPARKLINE", "Sparkl │
│ ine.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("UPLINK", LABEL_W)}<Sparkline va │
│ lues={[3, 5, 9, 4, 6, 12, 8, 7, 11, 14, 9, 6 │
│ ]} />{" 14 PEAK"}</Pre> │
│ <Pre>{pad("NOISE", LABEL_W)}<Sparkline val │
│ ues={[2, 2, 3, 2, 2, 2, 4, 3, 2, 2, 3, 2]} / │
│ >{" 4 PEAK"}</Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BAR CHART", "BarCha │
│ rt.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <BarChart items={[ │
│ { label: "NORTH", value: 42 }, │
│ { label: "EAST", value: 17 }, │
│ { label: "SOUTH", value: 29 }, │
│ { label: "WEST", value: 8 }, │
│ ]} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BIG NUMBER", "BigNu │
│ mber.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <BigNumber value="14,230" label="KHZ - PRI │
│ MARY RELAY FREQUENCY" /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("PANEL", "Panel.astr │
│ o")} /> │
│ <Pre>{" "}</Pre> │
│ <Panel title="RELAY LOG"> │
│ <Pre>{pad("LAST SWEEP", LABEL_W)}<Sparkl │
│ ine values={[3, 5, 9, 4, 6, 12, 8, 7]} /></P │
│ re> │
│ <Pre>{pad("SIGNAL", LABEL_W)}<Gauge valu │
│ e={47} threshold={70} /></Pre> │
│ </Panel> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("KEY VALUE", "KeyVal │
│ ue.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <KeyValue entries={[ │
│ ["STATION", "OOKNET-9"], │
│ ["FREQUENCY", "14.230 MHZ"], │
│ ["REMARKS", "relay via the northern repe │
│ ater when the direct path fades below thresh │
│ old"], │
│ ]} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BANNER", "Banner.as │
│ tro")} /> │
│ <Pre>{" "}</Pre> │
│ <Banner variant="notice" message="schedule │
│ d maintenance window sunday 02:00-04:00 UTC" │
│ /> │
│ <Banner variant="warning" message="frequen │
│ cy drift detected on channel bravo - recalib │
│ rate before transmitting" /> │
│ <Banner variant="error" message="uplink lo │
│ st" /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("STEPS", "Steps.astr │
│ o")} /> │
│ <Pre>{" "}</Pre> │
│ <Steps steps={["DRAFT", "PEER CHECK", "PUB │
│ LISH"]} current={1} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("CALENDAR", "Calenda │
│ r.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Calendar year={2026} month={7} marks={[16 │
│ , 17]} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("PAGINATION", "Pagin │
│ ation.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pagination current={6} total={20} href={( │
│ n) => `/?page=${n}`} /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("KBD", "Kbd.astro")} │
│ /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{"press "}<Kbd keys={["/"]} />{" to s │
│ earch, "}<Kbd keys={["CTRL", "K"]} />{" for │
│ the palette"}</Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TABS", "Tabs.astro" │
│ )} /> │
│ <Pre>{" "}</Pre> │
│ <Tabs labels={["NIX", "NPM", "MANUAL"]}> │
│ <Fragment slot="tab-0"> │
│ <Pre>{"$ nix develop"}</Pre> │
│ <Pre>{"$ npm run dev"}</Pre> │
│ </Fragment> │
│ <Fragment slot="tab-1"> │
│ <Pre>{"$ npm install"}</Pre> │
│ <Pre>{"$ npm run dev"}</Pre> │
│ </Fragment> │
│ <Fragment slot="tab-2"> │
│ <Pre>{"clone the repo and bring your o │
│ wn node >= 22.12"}</Pre> │
│ </Fragment> │
│ </Tabs> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("BREADCRUMBS", "Brea │
│ dcrumbs.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Breadcrumbs filed="/INFO/GRAPH/ENTROPY/BO │
│ UND" /> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("DIFF", "Diff.astro" │
│ )} /> │
│ <Diff code={`@@ -1,3 +1,4 @@\n export func │
│ tion pad(s: unknown, n: number): string {\n- │
│ return String(s).padEnd(n);\n+ const str │
│ = String(s ?? "");\n+ return str + " ".repe │
│ at(Math.max(0, n - len(str)));\n }`} /> │
│ │
│ <Frame build={section("MENU", "Menu.astro" │
│ )} /> │
│ <Pre>{" "}</Pre> │
│ <Menu label="ACTIONS" items={[ │
│ { label: "COPY LINK" }, │
│ { label: "DOWNLOAD .MD" }, │
│ { label: "VIEW SOURCE", href: "https://g │
│ ithub.com/" }, │
│ { label: "REPORT DRIFT" }, │
│ ]} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{" "}</Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TOOLTIP", "Tooltip. │
│ astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{"frame font "}<Tooltip text="Cascadi │
│ a Mono - every glyph measured against the 0 │
│ advance before joining the grid" />{" thre │
│ shold "}<Tooltip text="the gauge flips its s │
│ tatus word here" label="i" /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("SLIDER", "Slider.as │
│ tro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("SQUELCH", LABEL_W)}<Slider name │
│ ="demo-squelch" value={35} cells={24} /></Pr │
│ e> │
│ <Pre>{pad("GAIN", LABEL_W)}<Slider name="d │
│ emo-gain" value={70} min={0} max={100} step= │
│ {5} cells={24} /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("SWITCH", "Switch.as │
│ tro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><Switch label="AUTO-ACK INCOMING" nam │
│ e="demo-autoack" checked /></Pre> │
│ <Pre><Switch label="BEACON MODE" name="dem │
│ o-beacon" /></Pre> │
│ <Pre><Switch label="DISABLED RELAY" name=" │
│ demo-relay" disabled /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("NUMBER STEPPER", "N │
│ umberStepper.astro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre>{pad("POWER (W)", LABEL_W)}<NumberSte │
│ pper name="demo-power" value={25} min={0} ma │
│ x={100} step={5} /></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("DIALOG", "Dialog.as │
│ tro")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><span data-dialog-open="demo-dialog"> │
│ <Button label="OPEN TRANSMISSION LOG" varian │
│ t="primary" /></span></Pre> │
│ <Dialog id="demo-dialog" title="TRANSMISSI │
│ ON LOG"> │
│ <Pre>{"2026-07-17 09:41 N0 ACK RECEIVED │
│ "}</Pre> │
│ <Pre>{"2026-07-17 09:38 BEACON SENT ON │
│ BRAVO"}</Pre> │
│ <Pre>{"2026-07-17 09:12 CHANNEL SCAN CO │
│ MPLETE"}</Pre> │
│ </Dialog> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={section("TOAST", "Toast.astr │
│ o")} /> │
│ <Pre>{" "}</Pre> │
│ <Pre><span id="toast-ok"><Button label="QU │
│ EUE" variant="primary" /></span>{" "}<span │
│ id="toast-error"><Button label="JAM" /></spa │
│ n>{" "}<span id="toast-pending"><Button lab │
│ el="HOLD" /></span></Pre> │
│ <Pre>{" "}</Pre> │
│ │
│ <Frame build={(w) => rule(w)} /> │
│ </ArticleLayout> │
│ │
│ <script> │
│ import type { StatusVariant } from "../com │
│ ponents/Status/Status"; │
│ │
│ const wire = (id: string, message: string, │
│ variant: StatusVariant) => │
│ document.querySelector(`#${id} .btn`)?.a │
│ ddEventListener("click", () => window.ooknet │
│ Toast?.(message, variant)); │
│ │
│ wire("toast-ok", "TRANSMISSION QUEUED", "o │
│ k"); │
│ wire("toast-error", "FREQUENCY OUT OF BAND │
│ ", "error"); │
│ wire("toast-pending", "AWAITING PEER CHECK │
│ ", "pending"); │
│ </script> │
└──────────────────────────────────────────────┘