Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions docs/src/app/[...slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import fs from "node:fs/promises";
import path from "node:path";
import remarkCallout from "@r4ai/remark-callout";
import matter from "gray-matter";
import { notFound } from "next/navigation";
import { MDXRemote } from "next-mdx-remote/rsc";
import remarkGfm from "remark-gfm";
import remarkFrontmatter from "remark-frontmatter";
import remarkCallout from "@r4ai/remark-callout";
import rehypeHighlight from "rehype-highlight";
import remarkFrontmatter from "remark-frontmatter";
import remarkGfm from "remark-gfm";
import { Sidebar } from "@/components/Sidebar";

const CONTENT = path.join(process.cwd(), "content");
Expand All @@ -22,7 +22,9 @@ async function load(slug: string[]) {

export default async function DocPage({
params,
}: { params: Promise<{ slug: string[] }> }) {
}: {
params: Promise<{ slug: string[] }>;
}) {
const { slug } = await params;
const doc = await load(slug);
if (!doc) notFound();
Expand Down
217 changes: 184 additions & 33 deletions docs/src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@
--callout-caution: #f85149;
}

* { box-sizing: border-box; }
* {
box-sizing: border-box;
}

html, body {
html,
body {
margin: 0;
padding: 0;
background: var(--bg);
Expand All @@ -27,8 +30,13 @@ html, body {
-webkit-font-smoothing: antialiased;
}

a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
a {
color: var(--accent);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}

.site-header {
display: flex;
Expand All @@ -50,10 +58,18 @@ a:hover { text-decoration: underline; }
font-family: "JetBrains Mono", ui-monospace, monospace;
}

.site-header nav a { color: var(--muted); margin-left: 1.5rem; }
.site-header nav a:hover { color: var(--fg); text-decoration: none; }
.site-header nav a {
color: var(--muted);
margin-left: 1.5rem;
}
.site-header nav a:hover {
color: var(--fg);
text-decoration: none;
}

main { min-height: calc(100vh - 4rem); }
main {
min-height: calc(100vh - 4rem);
}

.docs-layout {
display: grid;
Expand All @@ -72,12 +88,26 @@ main { min-height: calc(100vh - 4rem); }
align-self: start;
}

.docs-sidebar ul { list-style: none; padding: 0; margin: 0; }
.docs-sidebar li { margin: 0.5rem 0; }
.docs-sidebar a { color: var(--muted); font-size: 0.9375rem; }
.docs-sidebar a:hover { color: var(--fg); text-decoration: none; }
.docs-sidebar ul {
list-style: none;
padding: 0;
margin: 0;
}
.docs-sidebar li {
margin: 0.5rem 0;
}
.docs-sidebar a {
color: var(--muted);
font-size: 0.9375rem;
}
.docs-sidebar a:hover {
color: var(--fg);
text-decoration: none;
}

.docs-content { max-width: 48rem; }
.docs-content {
max-width: 48rem;
}

.docs-content h1 {
font-size: 2.25rem;
Expand All @@ -93,7 +123,10 @@ main { min-height: calc(100vh - 4rem); }
border-bottom: 1px solid var(--border);
}

.docs-content h3 { font-size: 1.2rem; margin-top: 2rem; }
.docs-content h3 {
font-size: 1.2rem;
margin-top: 2rem;
}

.docs-content pre {
background: var(--surface);
Expand All @@ -115,13 +148,20 @@ main { min-height: calc(100vh - 4rem); }
border: 1px solid var(--border);
}

.docs-content table { border-collapse: collapse; width: 100%; margin: 1rem 0; }
.docs-content th, .docs-content td {
.docs-content table {
border-collapse: collapse;
width: 100%;
margin: 1rem 0;
}
.docs-content th,
.docs-content td {
border: 1px solid var(--border);
padding: 0.5rem 0.75rem;
text-align: left;
}
.docs-content th { background: var(--surface); }
.docs-content th {
background: var(--surface);
}

/* Callouts */
.docs-content [data-callout] {
Expand All @@ -132,11 +172,21 @@ main { min-height: calc(100vh - 4rem); }
border-radius: 0.375rem;
margin: 1.25rem 0;
}
.docs-content [data-callout][data-callout-type="note"] { border-left-color: var(--callout-note); }
.docs-content [data-callout][data-callout-type="tip"] { border-left-color: var(--callout-tip); }
.docs-content [data-callout][data-callout-type="important"] { border-left-color: var(--callout-important); }
.docs-content [data-callout][data-callout-type="warning"] { border-left-color: var(--callout-warning); }
.docs-content [data-callout][data-callout-type="caution"] { border-left-color: var(--callout-caution); }
.docs-content [data-callout][data-callout-type="note"] {
border-left-color: var(--callout-note);
}
.docs-content [data-callout][data-callout-type="tip"] {
border-left-color: var(--callout-tip);
}
.docs-content [data-callout][data-callout-type="important"] {
border-left-color: var(--callout-important);
}
.docs-content [data-callout][data-callout-type="warning"] {
border-left-color: var(--callout-warning);
}
.docs-content [data-callout][data-callout-type="caution"] {
border-left-color: var(--callout-caution);
}

.docs-content [data-callout-title] {
display: flex;
Expand Down Expand Up @@ -165,17 +215,118 @@ main { min-height: calc(100vh - 4rem); }
mask-position: center;
}

.docs-content [data-callout][data-callout-type="note"] { --callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'/%3E%3C/svg%3E"); }
.docs-content [data-callout][data-callout-type="tip"] { --callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z'/%3E%3C/svg%3E"); }
.docs-content [data-callout][data-callout-type="important"] { --callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'/%3E%3C/svg%3E"); }
.docs-content [data-callout][data-callout-type="warning"] { --callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'/%3E%3C/svg%3E"); }
.docs-content [data-callout][data-callout-type="caution"] { --callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .39.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.39.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'/%3E%3C/svg%3E"); }
.docs-content [data-callout][data-callout-type="note"] {
--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'/%3E%3C/svg%3E");
}
.docs-content [data-callout][data-callout-type="tip"] {
--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z'/%3E%3C/svg%3E");
}
.docs-content [data-callout][data-callout-type="important"] {
--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'/%3E%3C/svg%3E");
}
.docs-content [data-callout][data-callout-type="warning"] {
--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'/%3E%3C/svg%3E");
}
.docs-content [data-callout][data-callout-type="caution"] {
--callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .39.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.39.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'/%3E%3C/svg%3E");
}

.docs-content [data-callout][data-callout-type="note"] [data-callout-title] {
color: var(--callout-note);
}
.docs-content [data-callout][data-callout-type="tip"] [data-callout-title] {
color: var(--callout-tip);
}
.docs-content
[data-callout][data-callout-type="important"]
[data-callout-title] {
color: var(--callout-important);
}
.docs-content [data-callout][data-callout-type="warning"] [data-callout-title] {
color: var(--callout-warning);
}
.docs-content [data-callout][data-callout-type="caution"] [data-callout-title] {
color: var(--callout-caution);
}

.docs-content [data-callout][data-callout-type="note"] [data-callout-title] { color: var(--callout-note); }
.docs-content [data-callout][data-callout-type="tip"] [data-callout-title] { color: var(--callout-tip); }
.docs-content [data-callout][data-callout-type="important"] [data-callout-title] { color: var(--callout-important); }
.docs-content [data-callout][data-callout-type="warning"] [data-callout-title] { color: var(--callout-warning); }
.docs-content [data-callout][data-callout-type="caution"] [data-callout-title] { color: var(--callout-caution); }
.docs-content [data-callout-body] > :first-child {
margin-top: 0;
}
.docs-content [data-callout-body] > :last-child {
margin-bottom: 0;
}
/* --- Responsive: collapsible sidebar + mobile layout --- */
.sidebar-toggle {
display: none;
}
.docs-sidebar a[aria-current="page"] {
color: var(--fg);
font-weight: 600;
}
.docs-content {
overflow-wrap: break-word;
}

.docs-content [data-callout-body] > :first-child { margin-top: 0; }
.docs-content [data-callout-body] > :last-child { margin-bottom: 0; }
@media (max-width: 820px) {
.docs-layout {
grid-template-columns: 1fr;
gap: 1.25rem;
padding: 1.5rem 1.15rem;
}
.docs-sidebar {
position: static;
top: auto;
border-right: none;
border-bottom: 1px solid var(--border);
padding: 0 0 0.75rem;
padding-right: 0;
}
.sidebar-toggle {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 0.6rem 0.85rem;
background: var(--surface);
color: var(--fg);
border: 1px solid var(--border);
border-radius: 0.5rem;
font: inherit;
font-weight: 600;
cursor: pointer;
}
.sidebar-toggle-icon {
color: var(--muted);
font-size: 1.1rem;
line-height: 1;
}
.sidebar-nav ul {
display: none;
margin-top: 0.6rem;
}
.sidebar-nav[data-open="true"] ul {
display: block;
}
.docs-content {
max-width: 100%;
}
.docs-content h1 {
font-size: 1.8rem;
}
.docs-content h2 {
font-size: 1.3rem;
}
.docs-content pre {
font-size: 0.8rem;
}
.docs-content table {
display: block;
overflow-x: auto;
}
.site-header {
padding: 0.85rem 1.15rem;
}
.site-header nav a {
margin-left: 1rem;
}
}
8 changes: 7 additions & 1 deletion docs/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ export const metadata: Metadata = {
"Sandboxed terminal image rendering for Go. Kitty, Sixel, and half-block. Fast CGo decode via stb_image.",
};

export default function RootLayout({ children }: { children: React.ReactNode }) {
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>
Expand All @@ -25,3 +29,5 @@ export default function RootLayout({ children }: { children: React.ReactNode })
</html>
);
}

export const viewport = { width: "device-width", initialScale: 1 };
41 changes: 34 additions & 7 deletions docs/src/components/Sidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
"use client";

import Link from "next/link";
import { usePathname } from "next/navigation";
import { useState } from "react";

const SECTIONS = [
{ title: "Introduction", slug: "introduction" },
Expand All @@ -10,14 +14,37 @@ const SECTIONS = [
];

export function Sidebar() {
const [open, setOpen] = useState(false);
const pathname = usePathname();
return (
<nav>
<ul>
{SECTIONS.map((s) => (
<li key={s.slug}>
<Link href={`/${s.slug}`}>{s.title}</Link>
</li>
))}
<nav className="sidebar-nav" data-open={open}>
<button
type="button"
className="sidebar-toggle"
aria-expanded={open}
aria-controls="sidebar-list"
onClick={() => setOpen((v) => !v)}
>
<span>Documentation</span>
<span className="sidebar-toggle-icon" aria-hidden="true">
{open ? "✕" : "☰"}
</span>
</button>
<ul id="sidebar-list">
{SECTIONS.map((s) => {
const href = `/${s.slug}`;
return (
<li key={s.slug}>
<Link
href={href}
aria-current={pathname === href ? "page" : undefined}
onClick={() => setOpen(false)}
>
{s.title}
</Link>
</li>
);
})}
</ul>
</nav>
);
Expand Down
Loading