Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
8ac44c0
Cuts core 0.1.1 from 0.1.0
breezykermo Sep 22, 2026
2945c50
Splits the two window fills by the pointer rather than by the element
breezykermo Sep 22, 2026
2818af7
Base commit for all packages
breezykermo Sep 19, 2026
6dbec55
Names a dateless meeting after its participants, so two such meetings…
breezykermo Sep 19, 2026
867b2fc
Renames slipshow's display-id: argument to display-name:, forwarding …
breezykermo Sep 20, 2026
1d3d9f0
Renames idea-id-color to idea-name-color, and rookery-search-id-color…
breezykermo Sep 20, 2026
3fee445
Selects the anchor inside a card's permalink, and resolves its href a…
breezykermo Sep 20, 2026
e6a7147
Names the renamed idea-dir argument in slipshow's ordering example
breezykermo Sep 20, 2026
b210c9a
Runs the stabilized-package check on dev
breezykermo Sep 22, 2026
224c680
Moves the eight alpha packages to 0.1.1, and separates the search row…
breezykermo Sep 22, 2026
91921fe
Clips an overlong id or tag in a hat rather than overflowing the page
breezykermo Sep 22, 2026
85a67dd
Clips an overlong id in a WINDOW's hat, not only in a card's
breezykermo Sep 22, 2026
0ccaf9d
Previews a titleless minted note from its head wrapper instead of fal…
breezykermo Sep 24, 2026
0fa7500
Adds a horizontal footnote mode to @rookery/core, rendering footnote …
breezykermo Sep 25, 2026
4229119
Moves citations to the margin in horizontal footnote mode, alongside …
breezykermo Sep 25, 2026
658f25d
Search previews render horizontal-mode footnotes and citations vertic…
breezykermo Sep 25, 2026
55ea413
Splits a top-level idea card into a text column and a right gutter fo…
breezykermo Sep 25, 2026
9ff747d
Adds #gutter, placing a block of content at the top of the right gutt…
breezykermo Sep 25, 2026
6f7899c
Transcluded notes always render footnotes and citations vertically
breezykermo Sep 25, 2026
9c02c62
Makes horizontal footnotes a styling-only switch
breezykermo Sep 25, 2026
3f52243
Emits margin citations only on the HTML target
breezykermo Sep 25, 2026
cd00d42
Drops the search preview's client-side footnote rebuild
breezykermo Sep 25, 2026
8f4dd90
Adds a backlinks off switch to rookery's template, gating both the pe…
breezykermo Sep 25, 2026
616feea
Designs declared rookery partitions, and asks the operator to settle …
breezykermo Sep 25, 2026
c04706d
Gives minted pages a gutter and aligns blockquote notes
breezykermo Sep 25, 2026
d5bf186
Lets #idea take its page handle as an argument, so recording a note's…
breezykermo Sep 25, 2026
3ad8eca
Records the per-note registry split spike and its patch
breezykermo Sep 25, 2026
9808112
Lets all() take its claimed keys lexically via skip:, so a caller can…
breezykermo Sep 25, 2026
a9704a0
Counts ten display keys in the unit test, matching _DISPLAY-KEYS
breezykermo Sep 25, 2026
7530f4e
Keeps a minted note's head and footer in its text column, and the hat…
breezykermo Sep 25, 2026
e4917d3
Covers the gap above a pinned gutter block and themes minted page bodies
breezykermo Sep 25, 2026
3b4d37e
Separates citation and footnote margin modes
breezykermo Sep 25, 2026
4b9cba3
Adds a display-bibliography flag for an idea's own References visibility
breezykermo Sep 25, 2026
aa2a2c0
Honours display-bibliography as a group setting on #window
breezykermo Sep 25, 2026
7b6a948
Records that the per-note registry split loses on a quiet re-measure
breezykermo Sep 25, 2026
3cef416
Reverts idea margin notes to vertical below 769px
breezykermo Sep 25, 2026
1bad8a9
Excludes a window-nested page-body from the right-gutter split
breezykermo Sep 25, 2026
619905e
Shows a footnote's cited works at the end of its margin note
breezykermo Sep 25, 2026
14d1fd9
Leaves a References heading out of outlines where horizontal citation…
breezykermo Sep 26, 2026
1aed832
Defaults citations to vertical, independent of footnotes mode
breezykermo Sep 26, 2026
f92212b
Adds a failing fixture and a decision record for note-style bibliogra…
breezykermo Sep 26, 2026
2ebaac6
Records note-style bibliography convergence findings and updates reco…
breezykermo Sep 26, 2026
6a255d3
Renders note-style citations as core footnotes
breezykermo Sep 26, 2026
d1013a7
Claims a native #footnote inside an idea like rookery's own
breezykermo Sep 26, 2026
a2eaf46
Colours footnote numbers with the idea border instead of the link fill
breezykermo Sep 26, 2026
afdd30b
Aligns a minted page's head with the text column beside a floated gutter
breezykermo Sep 26, 2026
1c1b8d5
Lines up a margin note's left rule with the gutter column
breezykermo Sep 26, 2026
2814e6f
Rebuilds html.elem with its tag when promoting citations and numberin…
breezykermo Sep 26, 2026
0adcc83
Keeps a table's columns when rebuilding idea bodies for citations and…
breezykermo Sep 26, 2026
d4bd59f
Records whether a data-only registry cuts rookery's convergence passes
breezykermo Sep 26, 2026
f2f0372
Records whether rookery's settings state costs convergence passes
breezykermo Sep 26, 2026
9e22c1c
Records how few convergence passes a rookery needs with its idea grap…
breezykermo Sep 26, 2026
34ef45e
Shows date and tag pills on a window bottomed out to a link when its …
breezykermo Sep 26, 2026
40a79af
Draws the box, window and page-row left rule as a background strip
breezykermo Sep 26, 2026
91fe43e
Keeps a window's header row one height whether it is open or closed
breezykermo Sep 26, 2026
e1b17c4
Lets a label inside an idea body survive its minted page
breezykermo Sep 26, 2026
96b3eec
Makes a bottomed-out window's link row react like a folded window
breezykermo Sep 26, 2026
e6e8aa4
Adds display-filter to window
breezykermo Sep 26, 2026
e8e31b5
Wires the window filter input into @rookery/search
breezykermo Sep 26, 2026
d842a89
Ships window-filter.js with a source build of @rookery/search
breezykermo Sep 26, 2026
c60c065
Sizes page rows to match the prose around them, not the root
breezykermo Sep 26, 2026
1b3d658
Makes Backlinks page rows react like link rows
breezykermo Sep 26, 2026
be866c9
Styles the window filter like the filter panel
breezykermo Sep 26, 2026
0885c53
Makes a tag chip in a window's hat toggle its filter pill
breezykermo Sep 26, 2026
b8754a9
Keeps a citation's page number when it is promoted to a footnote
breezykermo Oct 4, 2026
bad1e4f
Renders promoted citations in a project's note-style, page numbers kept
breezykermo Oct 4, 2026
97c4ae3
Keeps a minted page's sections at the page body's text width instead …
breezykermo Oct 5, 2026
bdf6a16
Emits each idea's attaches and binds as rheo ligaments from the marrow
breezykermo Oct 7, 2026
bb70124
Rebuilds uncompiled ideas from ligaments so a narrowed compile render…
breezykermo Oct 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
287 changes: 250 additions & 37 deletions .github/workflows/check.yml

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ dated meeting notes (`meetings`), a BibTeX reader and `#citation` note
constructor (`bibtex`), an endlessly scrolling presentation over notes
(`slipshow`), a board of draggable cards for arranging notes by hand
(`pinboard`), and venues with their calls and deadlines (`cfps`). Each package
lives in `<name>/<version>/` (e.g. `search/0.1.0/`)
lives in `<name>/<version>/` (e.g. `search/0.1.1/`)
and mirrors the same layout: `typst.toml`, `src/`, and a `Justfile`, plus a
`flake.nix` where the package pins a toolchain of its own (`search` for
node/pnpm, `slipshow` likewise). Four of them (`search`, `todos`, `slipshow`,
Expand Down Expand Up @@ -137,7 +137,7 @@ packages" below) and `rheo
compile` a test project that imports it. No per-package devShell needed
either for most work: this repo's own root `flake.nix`/`.envrc` provide
`just` and `typst`, and direnv finds them by walking up from anywhere under
the repo. `search/0.1.0` and `slipshow/0.1.0` each carry their own `flake.nix`
the repo. `search/0.1.1` and `slipshow/0.1.1` each carry their own `flake.nix`
on top of that, for `node`/`pnpm` pinned to that package specifically.

## Pattern: consuming the injected `rheo-context`
Expand Down Expand Up @@ -225,7 +225,7 @@ rheo present at all.
on this machine) — readable from package scope without any `ctx:`
parameter.
- `@rookery/core` uses this pattern throughout and takes NO `ctx` parameter at
all: see `core/0.1.0/src/lib.typ`'s `_rheo-ctx()`/`_target()` helpers.
all: see `core/0.1.1/src/lib.typ`'s `_rheo-ctx()`/`_target()` helpers.

DO NOT assert or panic when rheo is absent under this pattern — that's
Pattern A's job for packages that genuinely can't function without rheo.
Expand Down
3 changes: 3 additions & 0 deletions bibtex/0.1.1/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.direnv/
build
*.pdf
55 changes: 55 additions & 0 deletions bibtex/0.1.1/Justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
default:
@echo "rookery-bibtex: pure Typst package, entrypoint is src/lib.typ directly — nothing to build"

# Unit fixture for the parser, the title/key derivations and the field view,
# plus the rendered `all()` sweep fixture. No runner for the unit half:
# `assert.eq` inside `test/units.typ` fails the compile with a line number,
# and a passing compile is the green light — the same shape `@rookery/core`
# and `@rookery/timeline` use. The rendered half (`test/sweep.typ`) compiles
# to HTML and `test/check.sh` greps what came out.
#
# `--root .` so a fixture's `#import "/src/lib.typ"` resolves against THIS
# package. `--features html` for parity with this repo's other Justfiles.
# `--format pdf` with a `/dev/null` output for `units.typ` because typst
# cannot infer a format from that path, and nothing there is rendered — only
# asserted.
#
# `sweep*.typ`'s stderr is captured and grepped for `did not converge`: a
# sweep that calls the CLAIMING `citation` from inside its own loop reads its
# own write in the same pass, and Typst's state resolution oscillates and
# gives up with exactly that warning while still exiting 0 — a silently
# incomplete bibliography on a build that only warns. `all()` is built to
# avoid it (see `src/claim.typ`), and `keywords: "existing"` reads the tag
# registry mid-sweep for the same reason (see `src/lib.typ`) — this is what
# would catch a regression in either: `typst compile` alone would not, since
# the warning does not fail the build.
#
# `sweep-all.typ`/`sweep-existing.typ` are separate documents, not two calls
# in `sweep.typ`, because a second `all()` call is a compile error — each
# needs its own `bibtex(..)` and its own vertebra.
#
# `test/large.typ` parses a field past Typst's 10,000-iteration `while`
# ceiling and a 400-entry corpus, so a parser that regresses to stepping
# character by character fails the compile rather than passing unnoticed.
test:
typst compile --features html --root . --format pdf test/units.typ /dev/null
@echo "units OK"
typst compile --features html --root . --format pdf test/large.typ /dev/null
@echo "large OK"
# `mkdir` first: unlike `rheo`, `typst compile` does not create its output
# directory and fails with "No such file or directory" on a fresh checkout,
# since `test/build/` is gitignored and never committed.
mkdir -p test/build
typst compile --features html --format html --root . test/sweep.typ test/build/sweep.html 2>test/build/sweep.stderr
cat test/build/sweep.stderr >&2
! grep -q "did not converge" test/build/sweep.stderr
typst compile --features html --format html --root . test/sweep-existing.typ test/build/sweep-existing.html 2>test/build/sweep-existing.stderr
cat test/build/sweep-existing.stderr >&2
! grep -q "did not converge" test/build/sweep-existing.stderr
typst compile --features html --format html --root . test/sweep-all.typ test/build/sweep-all.html 2>test/build/sweep-all.stderr
cat test/build/sweep-all.stderr >&2
! grep -q "did not converge" test/build/sweep-all.stderr
typst compile --features html --format html --root . test/fields.typ test/build/fields.html 2>test/build/fields.stderr
cat test/build/fields.stderr >&2
! grep -q "did not converge" test/build/fields.stderr
./test/check.sh
10 changes: 10 additions & 0 deletions bibtex/0.1.1/demo/rheo/Justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# rheo is NOT in this repo's devShell — locally it is the sibling `rheo/`
# crate, same as `@rookery/core`'s own demo (see that Justfile's header).
build:
rheo compile .

watch:
rheo watch . --html --open

clean:
rm -rf build
16 changes: 16 additions & 0 deletions bibtex/0.1.1/demo/rheo/content/entry.typ
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// The hand-written half of the bibliography: this note's body is authored,
// not swept — `index.typ`'s `all()` mints every OTHER entry with the empty
// body a swept note always gets. A hand-written `#citation` for a key always
// wins over `all()`, no matter where the two calls sit relative to each
// other.
#import "lib.typ": demo, refs

#show: demo

= A cited entry

#(refs.citation)("okafor2019")[
Cited directly, because its accounting of responsiveness as a budget spent
reframes what the rest of this bibliography treats as measured only after
the fact.
]
11 changes: 11 additions & 0 deletions bibtex/0.1.1/demo/rheo/content/index.typ
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// The rest of the bibliography, swept in one call: `all()` mints a note for
// every entry `entry.typ`'s hand-written `#citation` has not already
// claimed — see `@rookery/bibtex`'s readme, "all() — minting the rest of the
// bibliography".
#import "lib.typ": demo, refs

#show: demo

= References

#(refs.all)()
30 changes: 30 additions & 0 deletions bibtex/0.1.1/demo/rheo/content/lib.typ
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// The one place the demo is configured, applied by both vertebrae — same
// reason `@rookery/core`'s own demo does this (see its `content/lib.typ`):
// `#show: rookery` is per-FILE, so a project that wants one configuration
// wraps it once here and every vertebra applies the wrapper.
#import "@rookery/core:0.1.1": rookery
#import "@rookery/bibtex:0.1.1": bibtex

#let refs = bibtex(read("../references.bib"))

// Appended after every minted page's OWN body — `entry.typ`'s hand-written
// citation as much as every entry `index.typ`'s `all()` sweeps — so a reader
// lands on the bibliographic record regardless of which path minted the
// page. A NAMED TOP-LEVEL FUNCTION, deliberately: `idea-page-template` is
// read back from document-wide state, so an inline closure built inside
// `demo` below would be a different value per vertebra and whichever file
// happened to compile last would win.
// `id` arrives prefixed (`idea:<key>`, the default `prefix:` `#show: rookery`
// publishes) — the bare BibTeX key, which is what `refs.fields` looks up, is
// everything after the first `:`.
#let citation-page(id: none, note: (:), doc) = {
doc
if id != none {
(refs.fields)(id.split(":").last())
}
}

#let demo(doc) = {
show: rookery.with(idea-page-template: citation-page)
doc
}
38 changes: 38 additions & 0 deletions bibtex/0.1.1/demo/rheo/references.bib
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
@book{harrow2014,
title = {Assembling the Archive: Notes Toward a Practice},
shorttitle = {Assembling the Archive},
author = {Harrow, Elena},
year = {2014},
publisher = {Tidewater Press},
}

@article{okafor2019,
title = {Latency Budgets for Interactive Systems},
author = {Okafor, Chidi},
journal = {Journal of Systems Research},
volume = {12},
pages = {201--227},
year = {2019},
doi = {10.5555/jsr.2019.0012},
abstract = {Argues that a system's perceived responsiveness is a budget spent, not a property measured after the fact, and proposes a way to account for it at design time.},
}

@inproceedings{singh2021,
title = {Incremental Computation for Editable Documents},
author = {Singh, Priya and Novak, Tomas and Reyes, Marisol},
booktitle = {Proceedings of the Workshop on Live Systems},
year = {2021},
}

@book{fenwick2017,
title = {Field Notes on Distributed Consensus},
editor = {Fenwick, Dorothy},
year = {2017},
publisher = {Causeway Editions},
}

@misc{fielding2022,
title = {Notes on a Small Protocol},
author = {Fielding, Sam},
year = {2022},
}
20 changes: 20 additions & 0 deletions bibtex/0.1.1/demo/rheo/rheo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# @rookery/bibtex's in-repo demo: a small rookery whose notes come from
# `references.bib` rather than hand-authored prose — `content/index.typ`
# sweeps the whole bibliography with `all()`, `content/entry.typ` claims one
# entry by hand with `#citation` to show the override `all()` respects.
version = "0.6.2"
content_dir = "content"
formats = ["html"]

# `lib.typ` is a library, not a page: it holds the shared `#show: rookery`
# wrapper both vertebrae apply. Without this it would compile to its own
# `lib.html`.
[spine]
exclude = ["lib.typ"]

# The Typst cache's `rookery` namespace is a per-machine symlink that can
# point at a different checkout of this repo, so this reads `@rookery/*` out
# of this tree instead. See `slipshow/0.1.1/demo/rheo/rheo.toml` for the full
# argument.
[packages.rookery]
path = "../../../.."
Loading
Loading