From bbbaf75a6f231475a7b50be7eaadd141d9264215 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Thu, 1 Oct 2026 13:43:11 -0300 Subject: The landing shows each thing once, lists what is in pardes, and the guide opens on an annotated pane The window shelf drops terminals-are-panes (`landing = false` in clips.toml; the casts show it) and keeps the PDF, image, make, diff and 9P clips. Captions say what happens: the live-text cast renames a variable, runs make and lands on the error; the 9P clip is a shell under 9ns where the session is a directory. Casts stack one per row at the page's width, each showing a frame of itself until it plays. Under the lead, a row of linked chips names what is in pardes: terminals, PDFs, images, language servers, diff review, scripting, themes. Install says how long the first build takes (62 s from a clean cache on 16 cores, measured with the dependencies already fetched), and `project` in style.typ has a `download` slot (url, sha256, arch) install.typ shows once a binary exists. #annotated draws a screenshot with numbered pins and their labels as text beside it; the guide opens with one of the orchard theme's shot: the workspace tag, a column's tag, a pane's tag, the box, the body and the scrollbar, before its glossary. Co-Authored-By: Claude Opus 5.5 --- docs/typ/cheatsheet-a4.pdf | 6 +++--- docs/typ/guide.typ | 11 ++++++++++- docs/typ/install.typ | 8 +++++++- docs/typ/style.typ | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 5 deletions(-) (limited to 'docs/typ') diff --git a/docs/typ/cheatsheet-a4.pdf b/docs/typ/cheatsheet-a4.pdf index 9ef291b9..d33db316 100644 --- a/docs/typ/cheatsheet-a4.pdf +++ b/docs/typ/cheatsheet-a4.pdf @@ -1575,12 +1575,12 @@ x endstream endobj 426 0 obj -<> +<> endobj 427 0 obj <> stream -Typst 0.15.1en2026-10-01T13:31:31-03:002026-10-01T13:31:31-03:001application/pdfIcrvJ+JD6aLZ3AQsDl9daw==IcrvJ+JD6aLZ3AQsDl9daw==proof1.7 +Typst 0.15.1en2026-10-01T13:45:38-03:002026-10-01T13:45:38-03:001application/pdfWg9IHgE89UC5Ijb2EbcBRQ==Wg9IHgE89UC5Ijb2EbcBRQ==proof1.7 endstream endobj 428 0 obj @@ -2018,7 +2018,7 @@ xref 0000109208 00000 n 0000110281 00000 n trailer -<> +<> startxref 110468 %%EOF \ No newline at end of file diff --git a/docs/typ/guide.typ b/docs/typ/guide.typ index e2b9ae77..1505afbc 100644 --- a/docs/typ/guide.typ +++ b/docs/typ/guide.typ @@ -1,7 +1,7 @@ // The guide: pardes day to day, the path a newcomer reads once. Edge cases // live in the reference, the pager and the language servers in setup, the // keys on the cheatsheet. -#import "style.typ": key, keys, btn, chord, word, tag, addr, file, cmd, doc, pairs, glossary +#import "style.typ": key, keys, btn, chord, word, tag, addr, file, cmd, doc, pairs, glossary, annotated pardes reads the text on its screen as things to do, with two builtins. #word("Look") (right-click) on `src/bar.c:12` opens that line; on a URL, @@ -11,6 +11,15 @@ screen is columns of panes, each a tag (a line of words) over a file, a terminal, a PDF or an image. The keys are helix's, and every session is a virtual filesystem, served over 9P, for scripts. +#annotated("/docs/site/media/themes/orchard.png", (640, 513), + ([the workspace tag: words for the whole session], 330, 11), + ([a column's tag], 400, 34), + ([a pane's tag: its path, then its words], 560, 58), + ([the box: the pane's mode, and the handle to drag it], 8, 58), + ([the body: here a file, below it a terminal], 500, 128), + ([the scrollbar: how much of the body is in view], 8, 160), +) + #glossary("Words you'll see", , [tag], [the line of words over a pane, a column or the screen; every word in it can be clicked], [the pane with the keyboard], [where your keys go; one pane at a time], diff --git a/docs/typ/install.typ b/docs/typ/install.typ index f4fc7fd3..f54cda46 100644 --- a/docs/typ/install.typ +++ b/docs/typ/install.typ @@ -6,7 +6,13 @@ #let first = project.mirrors.first() #cmd("git clone " + first.clone + " && cd pardes") -With Zig 0.16 (the build fetches everything else): +#if project.download != none [ + A static #raw(project.download.arch) binary: #link(project.download.url)[#raw(project.download.url.split("/").last())] + (sha256 #raw(project.download.sha256)). Or build it: +] + +With Zig 0.16 (the build fetches everything else; once that is +downloaded, a first build from a clean cache took 62 seconds on 16 cores): #cmd("# pardes, in a terminal\nzig build -Dplatform=tty --prefix ~/.local") #cmd("# pardes-gui, its own window\nzig build -Dplatform=gui --prefix ~/.local") Then run `pardes` or `pardes FILE`. diff --git a/docs/typ/style.typ b/docs/typ/style.typ index 2f63f3b2..c96b5e39 100644 --- a/docs/typ/style.typ +++ b/docs/typ/style.typ @@ -308,6 +308,9 @@ (name: "git.0x4200.cafe", web: "https://git.0x4200.cafe/pardes", clone: "https://git.0x4200.cafe/pardes.git"), ), license: "ISC", + // a built binary to download, when there is one: + // (url: "...", sha256: "...", arch: "x86_64-linux") + download: none, ) /// A glossary: like #pairs, under its own heading. On paper the heading @@ -514,3 +517,40 @@ )).flatten())) } } + +/// A screenshot with numbered pins on it and their labels as text beside +/// it, so the labels read, search and translate as text. `src` is from +/// the repository root (the site serves it from the same path under +/// docs/site/); `size` is its pixel (width, height); each pin is (label, +/// x, y) in pixels of that image. +#let annotated(src, size, ..pins) = { + let (w, h) = size + let pins = pins.pos() + context if html-out() { + let web = src.trim("/docs/site/", at: start) + html.elem("figure", attrs: (class: "annotated"), { + html.elem("div", attrs: (class: "frame"), { + html.elem("img", attrs: (src: web, alt: "", width: str(w), height: str(h))) + for (i, (label, x, y)) in pins.enumerate() { + html.elem("span", attrs: (class: "pin", "aria-hidden": "true", + style: "left:" + str(calc.round(100 * x / w, digits: 2)) + "%;top:" + str(calc.round(100 * y / h, digits: 2)) + "%"), str(i + 1)) + } + }) + html.elem("ol", attrs: (class: "pins"), for (label, x, y) in pins { html.elem("li", label) }) + }) + } else { + let width = 11cm + let k = width / w + let pin(n) = box(width: 1.25em, height: 1.25em, radius: 50%, fill: palette.mouse, + align(center + horizon, text(size: 0.75em, weight: "bold", fill: white, str(n)))) + block(breakable: false, grid(columns: (width, 1fr), column-gutter: 1.2em, align: horizon, + box(width: width, height: h * k, { + place(top + left, image(src, width: width)) + for (i, (label, x, y)) in pins.enumerate() { + place(top + left, dx: x * k - 0.625em, dy: y * k - 0.625em, pin(i + 1)) + } + }), + enum(..pins.map(p => p.at(0)), spacing: 0.7em), + )) + } +} -- cgit v1.3