Leaf core product

Leaf core product gallery

Try Leaf chrome and the default package on one synthetic page. Optional widgets have focused working pages in the package catalog.

Choose a view below. Its contents spine and Page Map lead to each feature. The top link brings the eyebrow and heading together; the first dot sits at the spine’s origin. The title has the largest ring, section rings are smaller, and deeper headings use small dots. The current destination fills its marker. Each sample’s eyebrow names the lf-* elements it exercises.

lf-ask · lf-options · lf-option

On me: decisions and answers

An lf-ask puts a heading and context around the choice below. On me lists everything waiting on you: open asks, threads whose question is yours to answer (such as the gallery thread about a pasted image), to-dos the agent put on you, and updates whose reply failed and need sending again.

  • Press m: the page moves to the next item on you in page order, and Shift+M walks back. Where that item is in another view, it appears at once and the view's tab name briefly highlights; with reduced motion, there is no glide or highlight.
  • Look at the banner: the On me control beside Threads counts what is on you, and the agent's count, such as On Claude: 1, follows its status.
  • Press either, or g then Shift+M: the experimental On panel opens where Threads opens, on the list you pressed, with a tab for the other. What left each list is folded under it as Done: answered asks under On me, sent replies and ended to-dos under the agent's. Press Enter on a row: it goes where m would.
  • On a stamped page that asks for sign-off, find the version approval among the asks: its row leads to the banner's Approve control, approving answers it, and Undo reopens it.
  • Comment on the map question, then press m until it lands there: the discussion stays closed while you read and choose, even when Tab enters the controls. Press c to reply in that discussion, t to read it, or, under a finger, its Thread marker to open it. Answer the question and come back to it: its controls stay clear.

Which map should the sample team carry?

Street map Trail map
Inspect the ask record

The map's ask is widget:bg-choice whether or not it has an lf-ask wrapper. Choose a map, then read its current record: answer.value contains option ids, and prompt.target names the surrounding context.

A to-do on you

The agent put a to-do on you about this section with leaf task open … --on user: check that the trail map marks the shelter. Nothing on the page answers it, so it ends only when you press Done.

  • Open the On panel: the to-do waits under On me, and its row has a Done button.
  • Press m until it lands on the to-do, after the ask above, then press x, or under a finger the banner's Done: the to-do moves to On me's Done fold, and the agent is told.

Inline hints outside an ask

Tab into this sample: 1 appears beside its button. Press 1: the note gets focus, the hint disappears, and digits type normally. Leave the sample: 1 no longer focuses the note.

Quick keyboard shortcuts

Open More → Keyboard shortcuts and turn off Quick keyboard shortcuts. Letters, numbers and symbols now keep their ordinary meaning: c leaves the page alone, and the note sample above loses its 1 hint. Its button and text field still work with Tab, Enter and Space. Reload to check the preference stays off, then turn it on to restore the hints and keys.

The floating panel and the banner

Leaf's controls stand in one panel hovering over the foot of the page. Use the banner, at the foot of the leaf's menu, trades it for the banner and the bottom bar on every page, and Use the Leaf panel in the banner's More menu brings it back. A window sample shows the chrome its chrome attribute names, whichever you chose. Below, the same page in each: press the floating panel's leaf for the menu, and its field to comment.

The banner also shows Threads, the Versions menu, Page Map (g then Shift+P), Command reference (? twice), and All pages when another Leaf page is live. A quiet status line at the bottom right reports the current keyboard walk or a useful command result. It moves above the bottom-left shortcuts when room is tight.

On a local server, open More → Share and copy the link, then open it in a fresh browser profile. The link keeps the current address and passage and includes the access key even after a reload. The Share panel states that the key grants access to every Leaf page served by the same machine. Sample windows and the public website omit Share.

Follow the Resume writing sample, then use browser Back. The viewport and focus return to this link; press c to comment on the link. Forward returns to the sample.

lf-suggestion · lf-old · lf-new

Suggestions: proposed text changes

“Accept” applies the proposed text; “Reject” keeps the original. “Undo” reverses either decision.

Replace. The sample meeting starts at nine.ten. Insert. Bring a notebook. A pencil is useful too. Delete. The room is upstairs. Please arrive an hour early.

Undo a proposal while keeping its choice

Pick a route inside the proposal, accept the proposal, then use its “Undo” control. The proposal becomes undecided again; your route remains chosen. Reload to check that both decisions survive.

Keep the practice walk indoors.

Take the practice walk outside.

Which route should the walk follow?

Through the garden Along the river

lf-draft

Drafts: editable passages

Drafts render Markdown as readable prose. “Edit” opens its exact source; “Save” records it, and “Cancel” or Escape discards the unsaved edit. These controls stay in the box when annotations are hidden. Copy, at the box’s top right, copies its Markdown. Press z to undo a saved edit.

Write a different invitation here. Try a few lines to see the editor grow.

Write a **different invitation** here. Try a few lines to see the editor grow.

Picked up means the saved edit entered an agent turn. The receipt follows that edit through delivery and response. The banner describes the agent’s overall availability, including work on other parts of the page.

The sample workshop is in the blue room.

The sample workshop is in the blue room.

Reactions: short verdicts on a passage

Each reaction reaches the agent as feedback on a passage or a reply. The comment field keeps one primary action, Dictate when available or Send, so Suggest and the reactions have no mouse or touch opener there; an agent reply has its own corner control for them.

  • Select words below and press E, or focus the comment field and press Tab: Suggest and the reactions appear.
  • Press and hold a reaction: its word shows. Slide to another to read that one, then let go on the one you mean, or off the picker to choose none.
  • Press a saved passage reaction, which shows only its emoji: a separate “Remove” control appears. Press it to take the reaction back.

1 · 👍 · keep. The spare key is with reception.

2 · ❌ · change. This sample claims Tuesday follows Thursday.

3 · 🤔 · clarify. Bring the thing from the other place.

4 · ✂️ · shorten. At this point in time, we can now begin.

5 · 🔎 · support. The exercise involves a map.

6 · 🎯 · prioritize. The side entrance closes early.

lf-ask · lf-options · lf-option

Decisions: answers in context

A recorded answer stays visible in the widget that owns it; the Page Map adds no second status.

Where should the sample group meet?

At the door At reception

User workflows: approval and interface comments

Sign-off: approve a version

This gallery deliberately leaves sample asks unanswered, so Approve version remains unavailable. On a settled page it records approval for the current version; z, or “Undo” in “More page controls” on a touch screen, takes that approval back.

Comment on the page: start a page thread from the banner

The comment symbol beside Threads on the banner starts a thread about the whole page.

  • With Threads shut, press the symbol, or press c with nothing selected: a card hangs from the symbol.
  • Write a sentence and send it: the card closes and focus returns to the symbol. Threads flashes yellow with its count one higher while the panel stays shut, and the new thread is in Threads. Press c to write again.
  • Press Escape or click elsewhere: the card goes away and keeps what you wrote for the next time it opens.
  • Open Threads and press the symbol: the same card opens over the panel.
  • On a phone, find “Comment on the page” in “More page controls”.

Dictate a comment

In a browser with speech recognition, every empty comment or reply box offers a microphone where Send will stand. The page comment card, a passage's comment box, and a thread reply all use the same control.

  • Press the microphone and speak: the empty box says “Listening…”, then your words appear with the microphone lit.
  • Press the microphone again: dictation stops so you can review. Start typing instead: typing takes over at once.
  • Press Send: it submits the words shown. Press Escape instead: the box closes with its draft kept.
  • If dictation fails, the empty box names the reason and offers Retry dictation; words already heard stay editable.

Design mode: comment on the interface

Press l, then click Street map. Leaf opens a comment about lf-option · bg-choice-street without choosing the option. Press Escape to leave design mode. On a touch screen, choose “Design mode” in “More page controls”, tap “Street map”, and tap “Exit Design mode” on the banner to leave.

Draw mode: point with freehand strokes

Press w and draw across this paragraph or the space around it: the comment anchors here, because a stroke in empty space belongs to the nearest element on screen. Every further stroke joins the same drawing, wherever it starts.

  • Look at the comment box: it pictures the page beneath the drawing, beside Undo last stroke and Remove drawing. Click the drawing to inspect its frozen page context and ink; z toggles fit and native size when the image is larger than the window. Close Image preview to return to the same draft. Send the drawing alone, or add words first.
  • In the box, press ⌘Z and ⌘⇧Z: strokes and words are undone and redone in the order you made them.
  • Resize the window: where text reflows, the ink keeps its size; on a diagram, the drawing stays in the diagram's own coordinates.
  • Press Escape: the box goes away and the drawing stays on the page, dashed. Press z to take back a stroke while the box is away; the next stroke brings the box back.
  • Press Escape again: Draw mode ends and the drawing still shows. Press w and draw over this paragraph: the stroke joins the kept drawing rather than replacing it.
  • Draw over a choice control: the stroke marks the choice without selecting it. Leaf's comment box and draft editing controls stay usable while Draw mode is on.
  • On a touch screen, choose “Draw mode” in “More page controls”; “Undo stroke” and “Exit Draw mode” stand on the banner while the mode is on.

Capture area: attach part of the page

“Capture area” attaches an image of part of the page to a comment.

  • Open “More page controls”, choose “Capture area”, and drag a rectangle around this paragraph or a nearby widget. Arrow keys move the rectangle, and Shift with an arrow resizes it.
  • Choose “Attach capture” in the banner, or press Enter: the image appears in an anchored comment, where you can add words, remove the image, or send it alone.
  • Press Escape or “Cancel capture” instead: you leave without a capture.
  • Capture a scrolled pane or a diagram: the image shows its current visual state.

Align current item at top: keep reading from the same item

Align current item at top moves the block you are reading to just below the banner.

  • Select some words in this paragraph, or focus the heading above, and scroll until it sits lower on screen. Press g and z, or choose Align current item at top in More page controls: its reading block moves just below the banner, and your focus and selection stay.
  • Try it on a focused ask: its question aligns. Try it on a focused thread in Threads: its card aligns inside the panel. In a bounded reading area, the block aligns within that area's own scroller.
  • Press browser Back: there is no new stop to undo. Inside an editor, typing gz writes those letters.

Restore selection: return to the words you selected

Select a passage here, then press Escape and read somewhere else. Press g and v, or choose Restore selection in More page controls: the page reveals the passage and selects the same words with the same working end. A live revision can replace their markup; removed or ambiguous words report that the passage is unavailable. Selecting inside an editor keeps its native meaning. g then V still opens versions.

Resume writing: come back to words the box put away

Resume writing takes you back to words you put away without sending.

  • Select a few words here, press c, type a sentence without sending it, and press Escape: the box goes, the words stay, and a notice names the destination that returns to them.
  • Scroll somewhere else, then press g and i, or choose Resume writing in More: the page returns to this editor and restores the caret.
  • Send the comment, move elsewhere, and use Resume writing again: its conversation opens ready for your next reply.
  • Edit a reply or the draft block below: that editor becomes the destination. Focusing a box without editing it leaves the destination unchanged.

The revised message belongs here.

The revised message belongs here.

To carry unfinished words to another item, press s and choose the paragraph above, then type without sending. Move focus to this next item and press c: the box opens on this item with the same words. Sending attaches the comment here. A destination that already holds a draft keeps its own words and leaves the first draft available.

Keep a comment open and scroll its passage out of view: the field follows it away with its draft intact. Scroll back: the passage and editor return together, including after one large wheel jump. Try the same inside a scrolling pane, then scroll the surrounding page too. Press Escape, then g and i: the original passage, words and caret return for continued writing.

Open Threads, expand the lunch question, and leave its empty reply focused. Restamp this gallery with a prose change, then with a changed inline module: each revision arrives automatically and keeps the reply focused. Writing in it holds a revision for review instead, so leave it empty to inspect automatic arrival.

Move a comment: carry the box or card off the words it covers

A passage's comment box and a thread card both move by their edge.

  • Select a sentence here and press c. Point just outside the box's border: the pointer becomes a hand. Drag the box over the next paragraph and type: the caret stays and the box stays where you dropped it.
  • Scroll: the box travels with its passage at the spot you chose. Send: the thread card opens there.
  • Rest the pointer on the card's padding: after a beat its border lights. Drag it from there; its words, buttons and links keep their own presses, and on a touch screen a finger carries it too.
  • Resize the window, or open another thread: the surface returns to where the page would stand it.

Threads panel views

Choose a view to open the real Threads panel in this practice page. The controls, messages, filters, and unread state are live. Reset restores the seeded discussion after trying a reply or changing a thread.

Threads: anchored threads

Each thread has a short title the agent chose; open one to read its messages. With Threads closed, a thread opens inline beside its passage.

  • Press a Thread control or a marked passage: its thread opens inline. Press t for the next inline card and T for the previous one.
  • Scroll far from a commented passage and press t: the card enters with its passage as the page approaches it. Scroll away and back: the card leaves and returns with its passage.
  • With a thread focused, open Threads, including with g then T: the same thread stays focused in the panel.
  • Under “View”, choose “Open” or “Resolved”, and “Me” or the agent's name under “Waiting on”, to narrow the list, and combine “Page” or “Anchored” with “Content” or “Design”. Switch “Order” from the page's order to “Recent”: the thread with the latest message comes first under its day.
  • Look at a collapsed row: it keeps its message count, last activity, and status, and “On me” also names the action you owe.
  • Open a short thread: Reply follows its last message. In a long one, Reply stays visible while you scroll.
  • Send a reply: focus stays on the card or its title, in the floating card too. Press c to write again, or Escape to leave a floating card for its target on the page.
  • With a panel thread open and its reply box idle, have the agent add a message: it appears at once, Reply and later cards move down, and the existing messages keep their place. With an answer taller than the panel, what you were reading stays in view rather than jumping to the end.
  • While you write in a short thread, have the agent reply: the reply waits behind “new reply” until you open it.
  • Switch to another browser tab, have the agent reply, and return: held replies and the first new reply appear with the usual arrival tint, and your draft and caret stay in the same editor. If the page instead stays visible beside another focused window, new replies still wait behind the notice.

lf-conversation-workspace

Package conversation readers

This package reader shows the same conversation as Conversation, Shelf, or Feed.

  • Answer the channel ask inside its message, write a reply, and switch layouts before sending: the same draft follows the conversation.
  • Double-click your own message: you can rewrite it in any layout, Feed included.
  • Start a conversation and mark the proofreading to-do Done: the package's lists and Leaf's On panel show the same outcomes.
  • Use first-unread and question navigation: each lands in this reader.

Native HTML in replies

Open Threads in the sample. Read the checks table, then open Deploy log by click or keyboard. Both are ordinary HTML carried by the reply, without a widget wrapper.

New information. Have the agent add a message after the page opens: its status-line notice also reaches the live region without moving focus. A new question, response failure, or return to page activity uses that same line. Replies still unread when the page opens are announced once on arrival; rereading a stage change or tool activity creates no new notice.

An unfinished reply. Open a thread inline or in Threads and begin a reply.

  • Have the agent resolve the thread while the caret is in your words: the editor and caret stay put. Tab to Send and press Enter: the reply is sent and the thread reopens.
  • Have the agent resolve another thread with an unfinished reply, then Tab past Send: the editor stays visible. Return to the reply and press Escape, or press elsewhere: the reply is put away with its words kept.
  • Reopen the thread, start a reply, and press Resolve yourself: the editor closes and keeps its draft. Reload, choose Resolved under View, and open that thread: the editor stays closed until Reopen recovers the words.

A clean passage. Select some of these words, or Alt-click this paragraph, to start a comment. Type into the floating field and send it.

  • Look at the passage: the thread opens with your words already in it, before the server has answered, and becomes another Thread control here. In Threads, its collapsed row reads Generating title until the agent names it.
  • If the send takes a moment, the message's header reads “Sending” until the server records it.
  • If the server refuses the send, the words stay on this passage, where opening the comment box again finds them; the card under “Comment on the page” gets them back in place.
  • On a touch screen, select words and tap “Comment on selection” in the banner: the field opens after the native selection menu closes. To comment on the whole paragraph, open “More page controls”, choose “Select element”, then tap it; “Cancel selection” leaves the page unchanged.

A revised passage. Select “first draft” and send a comment, then select “early estimate” and send another. Keep both threads open and have the agent replace both phrases in the paragraph below. Each thread stays attached to that paragraph, without an answer being invented. Its Thread control opens the same conversation; a reply choosing new words can give it a precise passage again.

The first draft uses an early estimate for the rollout.

A passage in a wide block. Select the words in the description value below. The comment field follows the passage's inline start while standing clear of the code block. Send a comment: its thread keeps that attachment.

const command = {
  title: "Keep",
  description: "keep the active card",
};

Rewriting your own words. The thread on the line below holds a message of yours and the agent's answer.

  • Double-click your message, or press the Edit control at the end of its header: its words open for editing where they stand, nothing around the message moves, and Cancel and Save take its header. A finger always sees the Edit control; a pointer finds it on hover.
  • In the thread's empty reply box, press ↑: your latest message opens the same way. Press ↑ from the start of an open rewrite: your message before it opens.
  • Press Enter to save: the new words show at once, labelled edited, with a tooltip saying what the message said before, and the agent owes the message, as it now reads, an answer.
  • Press Escape or Cancel instead: the message stays as it was and your words are dropped. Words a reload interrupts wait as an "unsaved edit". Saving, Escape, and Cancel each put you back in the reply box.

The kickoff runs from nine to eleven.

Markdown as you type. Every box Leaf gives you to write in shows the draft the way the sent message will read. Type `code`, **bold**, *emphasis*, ~~struck~~ or [a link](https://leaf.page), or begin a line with # or >: the words take their style and the syntax steps aside until the caret enters it, so every character stays in reach. Shift+Enter starts a line and continues a list or quote, and Mod+Z undoes only what you typed. The message sends exactly what you typed.

Thread states: live before and after examples

These passages have real threads in this gallery. Open Threads to compare each row's status and compact last-activity time, then open a row to inspect its messages. The title remains in the header when the card opens. Drag the panel’s left edge inward to see the status move below a title. The first pair shows a title before and after naming.

Thread title

Open the sample thread to see a pending title highlighted across its lettering. Reset starts a fresh untitled thread. Reduced motion shows solid muted text.

Before · untitled

An untitled thread. The workshop schedule leaves lunch open. Open Threads to view it. The agent asked without naming the thread, so its row reads the question itself. A thread you open reads Generating title with a highlight sweeping across the lettering until the agent gives it a short name. With reduced motion, the text stays a solid muted color.

After · title assigned

An existing thread. The sample agenda has room for one more topic. Its speech-bubble control is green, and hovering it shows “My turn to answer” under the label. The image question still needs an answer even though the agent added a later progress message. In Threads, “My turn to answer” still says so. Open the control and reply: the control turns blue as the thread comes back to the agent. The same reading fills the panel’s “Me” filter and this target’s Page Map row.

Pasted images. That thread includes an image supplied by its companion thread log, outside this document. Click the image to inspect it in Leaf’s Image preview. Paste a screenshot into its reply box to see the thumbnail Leaf keeps in the draft without exposing image Markdown.

A before-and-after screenshot of the draft controls
Open this screenshot, zoom to 100%, and pan by dragging or with arrow keys. Fit or z returns to the whole image; Escape or Close returns to this link.

Resolved

A resolved thread. The room has a projector. Its earlier question is resolved. Open Threads in the banner, select “Resolved”, open the thread, and press its underlined “Resolved” to bring its Thread control back to the page.

Quotations after a revision

Open “Old release plan” in Threads. Its quoted passage belonged to a section the current page removed. Full quote expands the retained words here; press it again to return to the compact preview. The control stays above the words while they expand.

Summarized and unread

A summarized discussion. The workshop planning thread keeps its earlier decisions in a summary. Open it in Threads, expand the earlier messages, then collapse them from the summary's own control. The latest exchange stays below the summary, and keyboard focus can reach the disclosure.

Progress messages. The ephemeral schedule checks fold automatically when their final answer arrives, without adding a digest. Choose “Progress messages” in the practice page, then use “Show 2 progress messages” beside the answer’s timestamp with a press or Enter. Expanded progress runs have an inset border and ordinary message headers on the page’s normal background. User replies separate the groups. “Hide” returns the space to the page instead of leaving a gap above the reply box. Disclosures inside interactive replies return their room the same way. The later room check has no answer yet, so it stands as a dim working message above the reply box rather than as a reply, and counts nothing unread. Its header keeps its author and posting time visible.

Unread replies. The seeded agent replies start unread, and a blue rail marks each unread message without shifting the transcript.

  • Use “Next unread” in Threads, or press g then u: the earliest unread reply is revealed, including one covered by a summary.
  • Show a short reply in full: it leaves the count. Scroll through a long reply to read all of it. An interactive reply clears once its visible body has been shown too.
  • Reply, answer, or resolve in a thread: its current messages are marked read.
  • Look at a margin control whose thread holds unread replies: it carries the same dot as Threads. “My turn to answer” still identifies an outstanding question after you read it.

Callouts carry emphasis; disclosures hold support

Compare the filled conclusion with its unfilled supporting detail in either color scheme. Open the disclosure by click, tap, or Tab and Enter: its hairline and chevron remain, and the conclusion keeps the stronger fill. Click or Tab between the summaries: the same focus ring follows the summary that receives keyboard input.

Inspect the supporting calculation

The sample totals agree across both runs.

Inspect the comparison method

Both runs use the same input window.

The comparison is ready for review.

A stylesheet explicitly chooses control access

The ordinary page rule colors this page link, while the first pair keeps Leaf's ink. A separate stylesheet marked data-controls colors the second pair's selection marks with the accent. Pick by click, tap, or Tab and Space; Undo restores the earlier choice without changing either face.

Ordinary page stylesheet

First Second

Stylesheet with control access

First Second

The user's observed view

Resize this window, change its color scheme, or open another tab. Read the observations to inspect each document's viewport, visible reading regions, revision, freshness, and passive geometry checks. The authoring agent gets this context under user_views in leaf page state. The measurements leave the layout decision with the author. On the public site, make a decision or comment first to activate your private page, then return here.

data-width

Responsive block widths

Prose keeps the reading column inside this wide section. Individual evidence blocks can instead use the shared wide measure or all space the shell has left.

Allocation Use
Column Explanations and other continuous reading
Wide Tables, code, and comparisons with a shared cap
Available Dense evidence that benefits from every free pixel

lf-ask · lf-chart · lf-options

An ask around its figure: options laid across

This ask holds a chart and ends in one list of titled options. Under the chart the three cards stand side by side, so the question, the chart and every option fit one window; narrow the window and the cards stack.

Which trail should the sample team hike on Saturday?

The team walks at a sample pace of 300 m of climb an hour, and the last bus leaves the trailhead at 17:00.

{
  ariaLabel: "Climb by sample trail: Ridge loop 900 m, Lake path 350 m, Pass traverse 1,250 m",
  marginLeft: 100,
  x: {grid: true, label: "climb (m)"},
  y: {label: null},
  marks: [
    Plot.barX(
      [
        {trail: "Ridge loop", climb: 900},
        {trail: "Lake path", climb: 350},
        {trail: "Pass traverse", climb: 1250},
      ],
      {y: "trail", x: "climb", fill: "var(--series-1)"},
    ),
    Plot.ruleX([0]),
  ],
}

The traverse's climb takes a little over four hours on its own, which leaves no margin before the bus.

Ridge loop Three hours of climbing with views the whole way. Lake path An easy morning, back long before the bus. Pass traverse The longest day, and a tight finish.

lf-tabs · lf-tally

A queue beside the item it opens

The tab list stands left of the open item: each row shows its name and summary, and rows sharing a group sit under that group's heading. The lf-tally above it counts the queue's asks still to answer.

  • Walk the list with the up and down arrows: they pass the headings by.
  • Press Next on me in the tally: it opens the first item's ask, whose row carries an open mark.
  • Answer the ask: its row shows a check and the option you picked, and the tally says Answered. Undo puts the open mark and the count back.
  • Narrow the window below the set's 36rem: the list becomes a row above the item, each group's name before its first row, and the rows keep only the check.

00 of 00 to answerNothing to answer

What happens to ESC-4107?

SSO fails for every Northwind user since their IdP certificate rotated.

Fix Upload the new certificate. Close Ask them to roll it back.

Vela sees another customer's project names in a listing.

Charged twice for September; one charge was already refunded.

lf-margin-entry

Margin entries: every face, state, and projection

One inventory, using the production controls. A margin entry is chrome the runtime draws, named lf-margin-entry in code, not an element an author writes. The Rank and behavior samples cover every action, disclosure, status, tone, and ordering rank.

  • Read the Turn and agent workflow samples, which follow one update: “Sent” means the server recorded it, “Queued” that a later turn will handle it, “Picked up” that a turn accepted it, and “Working” or “Replying” that its answer is in progress. “Turn ended” and “Update stale” show uncertainty without claiming an interruption.
  • Compare thread colors: green marks a thread that needs an answer from you, and other threads are blue. Pickup and work add status words to the existing control; where no control remains, a status face carries the same workflow.
  • Read Face anatomy: the choice of icon or glyph, a count of related readings, and the transient label with its quieter context. User interaction compares rest, hover or focus, an open disclosure, and a selected page reading.
  • Click and Tab onto the live samples: each gives its real feedback. A control dims only while its action waits for the log to confirm it.
  • Find the Projection sample in this exhibit's margin, then open Page Map: the same contributed control appears as a full labeled row.
  • Reload: “Working” arrives with a one-time pulse.
  • Open a thread and shorten the window: its messages scroll between the header and the reply field, and the scrollbar spans the messages alone. Scroll the page to give a short conversation more room: the card expands once all its messages fit. The reply field keeps the same inset at both sides and below.

Margin entry lifecycle: act, fail, settle, and hand off

Act, fail, and settle. “Accept” or “Reject” starts as an action. The content changes immediately, and “Undo” dims while the event travels. A refused send restores the suggestion and puts “Failed” in words beside “Retry” and “Cancel”. Success leaves the changed content and an “Undo” control alone in the cluster. The same Agent workflow reports the decision until the result settles it.

The practice route uses the open courtyard.the covered terrace.

Already settled. This second sample arrives with an accepted decision in its history: meet outside.meet under the awning.

Edit and hand off. Opening the draft above replaces “Edit” with “Save” and “Cancel” controls; “Save” dims while it sends. Delivery and agent work share one workflow reading. Pickup adds its status to the draft's “Edit” control; current work adds one arrival pulse. An uncertain or ended turn loses the active treatment. Hover for the control's action and current work description.

Combine roles. Use the courtyardcovered terrace for the practice session. “Accept” and “Reject” act immediately; “Thread” and “⋯” disclose more; a reaction mark stands only while its reaction does. Delivery statuses below report what already happened without offering another press.

Rail and pins: annotations beside their targets

Leaf places threads, unanswered asks, actions, changes, and delivery or work status beside the content they concern. With enough room beside the reading column, their controls stand in the rail. Where the rail is absent, the same controls appear as pins near their targets on the page. Every annotation uses the same filled teardrop face as a pin. Its glyph and label keep their meaning: a Thread opens a conversation, Accept acts on a suggestion, and Sent reports delivery. Targets inside scrolling panes or extending into the rail also use pins. Related controls share a compact group; “More options” opens additional controls. When space is tight, a group can fold to one pin; opening it reveals its controls over the page. A workflow status can appear on an existing control, as the samples above show.

Pins sit clear of text and controls when nearby space permits. In a crowded view they can overlap content. They reserve no space, so their arrival, removal, or expansion leaves the page's layout unchanged. The schedule below extends beyond the column and carries a thread, so its Thread control already appears as a pin. Open it, or use the suggestion's “Accept” and “Reject” controls above. Narrow the window below about 960px to remove this page's rail and inspect those same controls beside their targets.

Press o to hide pins and passage marks while reading the content beneath them. Controls in the rail stay visible, and nothing on the page moves. Press it again to bring the annotations back. On a touch screen, open “More page controls” and choose “Hide annotations”, then “Show annotations”.

Action pins without a rail. This practice page has no rail. The suggestion's “Accept” and “Reject” controls appear as pins beside the proposed wording. Choose either, then use “Undo” to restore the suggestion. These annotations work without a thread or an ask.

Quiet status pins without a rail. This sample starts with a recorded card move. The small upward arrow beside “Print the workshop map” says “Sent” on hover: the move was recorded, with nothing for you to answer. After two minutes without pickup, it becomes “Waiting for pickup”; Reset starts a fresh example. Queued, Picked up, and Working follow the same placement rule. When a target already has a control, that control can carry the status instead of adding a separate pin.

Session Room Mon Tue Wed Thu Fri Sat Sun
Practice Workshop hall, east wing 9:00–11:00 9:00–11:00 — 9:00–11:00 9:00–11:00 — —
Debugging Lab 2, second floor 13:30–15:00 — 13:30–15:00 — 13:30–15:00 — —
The sample week, wider than the column.

Evidence widgets: charts and structured views

These widgets and page-owned HTML compositions use synthetic data so each has a focused example.

dl · lf-chart

Metrics and Chart: values and trends

Metrics show individual values as tiles, in a layout-tiles row, and a Chart compares the values across runs. The metric tiles and the run under them keep to the column, and the three charts take the wide width. Narrow the window: the metric tiles and the charts rewrap a column at a time, and the run's summary and log stack once they are narrower than 696px. The log holds its own height and stays on its newest line until you scroll back.

checks complete
12 change: +3
open failures
2 change: -1
sample duration
4 min
{
  ariaLabel: "Checks complete by run: baseline 4, 7, 9; candidate 5, 9, 12",
  marginBottom: 40,
  x: {label: "run", ticks: [1, 2, 3], tickFormat: "d"},
  y: {grid: true, label: "checks complete"},
  color: {legend: true, range: ["var(--series-1)", "var(--series-2)"]},
  marks: [
    Plot.lineY(
      [
        {run: 1, arm: "baseline", checks: 4},
        {run: 2, arm: "baseline", checks: 7},
        {run: 3, arm: "baseline", checks: 9},
        {run: 1, arm: "candidate", checks: 5},
        {run: 2, arm: "candidate", checks: 9},
        {run: 3, arm: "candidate", checks: 12},
      ],
      {x: "run", y: "checks", stroke: "arm", marker: true},
    ),
  ],
}
{
  ariaLabel: "Checks complete by run: first 5, second 9, third 12",
  x: {domain: ["first", "second", "third"], label: null},
  y: {grid: true, label: "checks complete"},
  marks: [
    Plot.barY(
      [{run: "first", checks: 5}, {run: "second", checks: 9}, {run: "third", checks: 12}],
      {x: "run", y: "checks", fill: "var(--series-1)"},
    ),
    Plot.ruleY([0]),
  ],
}
{
  ariaLabel: "Checks by run and outcome: first 5 passed and 3 failed, second 9 and 2, third 12 and 0",
  x: {domain: ["first", "second", "third"], label: null},
  y: {grid: true, label: "checks"},
  color: {
    legend: true,
    domain: ["passed", "failed"],
    range: ["var(--series-1)", "var(--series-2)"],
  },
  marks: [
    Plot.barY(
      [
        {run: "first", outcome: "passed", checks: 5},
        {run: "first", outcome: "failed", checks: 3},
        {run: "second", outcome: "passed", checks: 9},
        {run: "second", outcome: "failed", checks: 2},
        {run: "third", outcome: "passed", checks: 12},
        {run: "third", outcome: "failed", checks: 0},
      ],
      {x: "run", y: "checks", fill: "outcome"},
    ),
    Plot.ruleY([0]),
  ],
}

Third run

Twelve checks complete and none failed. The log beside this cell is the run's own output.

12:00:01 runner   start run=3 checks=12
12:00:04 check    schema ok
12:00:07 check    migrations ok
12:00:09 check    importer-unit ok
12:00:12 check    importer-replay ok
12:00:15 check    ledger-parity ok
12:00:18 check    api-contract ok
12:00:21 check    sdk-build ok
12:00:24 check    docs-links ok
12:00:27 check    rollback ok
12:00:30 check    shadow-diff ok
12:00:33 check    load-p95 ok
12:00:36 check    canary-guardrails ok
12:00:39 runner   done run=3 passed=12 failed=0
12:00:41 runner   report uploaded
12:00:44 runner   baseline updated
12:00:46 runner   workers released
12:00:48 runner   idle
12:01:00 watcher  heartbeat seq=0
12:01:03 watcher  heartbeat seq=3
12:01:06 watcher  heartbeat seq=6
12:01:09 watcher  heartbeat seq=9
12:01:12 watcher  heartbeat seq=12
12:01:15 watcher  heartbeat seq=15
12:01:18 watcher  heartbeat seq=18
12:01:21 watcher  heartbeat seq=21
12:01:24 watcher  heartbeat seq=24
12:01:27 watcher  heartbeat seq=27
12:01:30 watcher  heartbeat seq=30
12:01:33 watcher  heartbeat seq=33
12:01:36 watcher  heartbeat seq=36
12:01:39 watcher  heartbeat seq=39
12:01:42 watcher  heartbeat seq=42
12:01:45 watcher  heartbeat seq=45

lf-code · lf-gloss · lf-note · pre

Code, Gloss, Note, and Tree: technical evidence

Gloss explains a marked term such as walking skeleton. Hover the term, then move into its explanation; the card stays open while you read it. Code adds line numbers and Notes, and quotes an excerpt under its file's own numbers with an elided row where it skips; A native preformatted block shows file structure. Use “Copy code” on the right of either code block below, or Tab to it and press Enter. The clipboard keeps the code's whitespace and leaves out line numbers and Notes. Bash separates commands, arguments, and flags with the same syntax colors as a diff.

leaf page check ./proposal --render
leaf page stamp ./proposal --text "Ready for review"
def route(weather):
    if weather == "rain":
        return "covered terrace"
    return "courtyard"
def seat(guest):
    return guest.table
The branch exists only to make the highlighted walkthrough visible. The seating chart, loaded once.
gallery/
  index.html  +20 -1
  data.json  +2
  media/
    after.png
  recordings/
    evidence/
      rendered_first_paint_checkpoints_with_readable_path_names.json  +245 -93

The native preformatted block preserves the hierarchy and change counts; scroll horizontally to read long paths.

section · small

Compare, Variants, and Chips: parallel alternatives

Ordinary sections compare alternatives. Small labels carry their attributes.

power: noneweight: low Paper map Easy to annotate and fold.
power: dailyweight: medium Tablet map Searchable and backlit.
Route distances — numeric columns align on the right
Route Distance (km)
Courtyard loop 1.4
Riverside path 12.6
Paper on the trail

Mark the route before leaving. The map stays readable when the battery runs out.

Screen at a junction

Search the nearest stop and update the route. Carry enough power for the return journey.

ol · small · time

Milestones and Chronology: state and history

A list shows planned, active, and completed work. Another orders entries by time.

Planned work

  1. done · morning Survey the route Marked the crossings.
  2. active · afternoon · sample · route Walk the route Checking the covered section.
  3. planned · next Write the note

Observed events

  1. warning Rain started The open path became slippery.
  2. failure Path closed Standing water blocked the crossing.
  3. intervention Route changed The sample moved under cover.
  4. observation Walk resumed

lf-activity

Activity: this page's history, newest first

Press Show activity to read this page's own log: the seeded threads, reactions, user actions, and published versions. The board move near the end was taken back, so its row stays struck through and marked “undone”. Press a thread row to open its thread, or a widget row to travel to the widget. New rows wait behind the fixed control while you read; press it to reveal them.

lf-tabs · lf-tab

Tabs: saved panel selection

This embedded sample is a framed tabbed section. At the root of a page, the same tab set becomes borderless top navigation for page-scale views, as the browser test presents it.

  • Choose a tab and reload: both forms remember the selected panel.
  • Scroll while reading a panel: a horizontal tab strip stays at the top of the view, below any enclosing tabs. Switch tabs on a pinned embedded strip: the new panel opens at its start.
  • In this gallery's own views, scroll one, switch away, and switch back: a view you have not read opens below the tab strip, and a view you already read returns to its place. The strip stays put even when the next view is shorter than the window. Browser Back and Forward return to the corresponding views.
  • Narrow the window until the gallery's own tab names overflow, then page them with the edge arrows. With reduced motion, the move is immediate.

The current sample route is under review.

The earlier route crossed the courtyard.

A rollout review in a narrow column

This review keeps six sections in one compact row, with the native scrollbar hidden.

  • Use the edge arrows, or swipe the row on a touch screen: more names come into view. The arrows disappear at an edge with no more names.
  • Focus a tab and press Left or Right: the section switches. Home and End reach the first and last.
  • Narrow the window: the selected name stays visible and its section stays open.

Ship the revised search index to the internal team first, then expand after one healthy working day.

This release changes ranking and query suggestions. Saved searches keep their current filters.

Begin with the search team, continue with a small customer cohort, then open access to everyone.

Compare query latency, empty results, and user reports with the previous index before expanding access.

Return traffic to the previous index if searches become slow or relevant results disappear.

The search team owns the rollout. Support collects reports and the on-call engineer can restore the previous index.

svg.drawing

Drawing: a schematic in theme colours

Two states of a sample page drawn alike in one frame. Switch the colour scheme: every mark follows it.

A note moves from the column into the right margin Before note After note 1 96px
The sidebar stands in the margin only in a wide window; the drawing shows that case.

lf-sample · lf-shot · lf-options · lf-option

Sample and Shot: fiction and before/after images

Paper signs Nothing to charge. Display signs Easy to update.

Live sample

Enter the practice page, accept its suggestion, and add a comment. Its decisions and Threads belong to that page alone. Close any open controls and press Escape to return here. Try “Full view” to use the whole window, then “Return to page”; your choices and drafts stay. “Reset” clears the practice page.

Window sample

A practice page as a whole window: its banner keeps its status row, its bottom bar holds its shortcuts, and the frame keeps a window's height however short the page is. Press its Open threads button to see its authored conversation. Add a reply, then Reset: the original conversation returns, and this gallery gets no thread.

Recorded video and audio

Play the eight-second test pattern, then drag its native timeline to a later frame. Pause and resume with the keyboard after tabbing to the player. The recording also plays in an offline export.

Play or seek the eight-second tone with the audio player's controls. Both recordings are fixed evidence; the samples above stay interactive.

Sample labels invented content. Choose “Before” or “After” above the image, or press the Shot control or image to flip. The selected label is red for Before and green for After; a split colors both labels without selecting either. Scroll through a tall pair: the Before/After rail stays at the top of the view until the pair ends, below any page tabs. This pair carries outlines, so outlines mark each region where the two images differ, on both sides of the divider. The rail offers three views: Plain, Outlines, and Pixels. Outlines starts selected; Plain hides the outlines, while Pixels shows the after image greyed with every changed pixel painted over it: red where only Before drew something, blue where only After did, and amber where both did. Use the arrow keys to select a view, or choose it directly. Hover or focus Outlines to read the changed and moved counts, or hold it on a phone. Slide off before releasing to leave the current view selected. Clicking the pixel picture returns to the previous comparison view with its divider preserved.

The same pair without outlines offers Plain and Pixels, starting in Pixels, which shows what each image draws differently in one picture. Selecting Pixels again keeps that view open. Choose Plain, Before or After, or click the pixel picture, to see the comparison.

This pair is one picture twice. With or without outlines, the rail reads “identical”.

Captures that differ by something other than a version, such as the moments of one journey, share a table whose heads name each column's and each row's value once. Open a capture: Image preview names it by its column and its row.

Opened Documentation reviewed API changes reviewed
Release review the release review with both sections pending the release review with documentation reviewed and API changes pending the release review with both sections reviewed

Framed rows

This row draws its own frame and declares that its items keep their margins. Both paragraphs start at the same height and leave equal space below them. Narrow the window to stack them: each item keeps the same spacing when the row wraps.

Preview checks run before the release.

Delivery checks run after the release.

lf-pane

Workspace regions: panes that scroll on their own

A page whose work is a set of regions puts layout-workspace on main: the page fills the window, and each pane's body scrolls on its own under the pane's header and above its footer. This page is a column, so it bounds the same panes in a box of its own. Open the command trace: the evidence scrolls inside its pane, and the page and the decision under the follow-ups stay where they are. In a window too small to hold the box, the panes stack and the page scrolls.

Release candidate review

Changes

The candidate changes cache keys, receipts, and settlement jobs.

  • Cache migration copies active entries before cutover.
  • Receipts show refunds in the settlement currency.
  • Invalid jobs leave the shared queue for review.

The cache migration is the only change that rewrites stored data.

Evidence

Migration rehearsal

The rehearsal copied 8,412 active keys and preserved every value.

Inspect the command trace
copy --source cache-v1 --target cache-v2 --active-only
verify --source cache-v1 --target cache-v2 --compare values
switch --readers checkout-api,orders-api

Follow-ups

Verify cache expiry Confirm old keys leave after the rollback window. Sample refund receipts Compare three settlement currencies.
Is this candidate ready?
Ship this candidate Hold for another rehearsal

lf-text-document · lf-num

External data: live values and provenance

lf-text-document

Text document: a captured file

The document follows its source's current value. Its caption names the captured file and line range. The source uses the same numbered, syntax-colored presentation as a diff; selecting it copies only source.

lf-text-document

Rendered documents

Switch between the rendered release note and its exact source. Use the arrow keys on the tabs. Reloading keeps your selected view; a new source value updates both views.

lf-num

Num: provenance and stale data

This Num stores 184 ms, its run receipt, and the command that produced it. Because the source has a newer value, page check reports that the measurement is behind its source.

Version changes: comparison evidence

Open the versions menu and press “Compare” beside v1. The “Change” control appears by the edited passage and opens its text diff inline.

The sample walk follows the river to the footbridge.

lf-board · lf-column · lf-card

Board and delivery state: work and workflow state

Drag the card to “Tried”, use its grip with Enter and the arrows, or tap a destination on a phone. “Sent”, “Picked up”, and “Working” report the agent workflow. A refused send offers “Retry” and “Cancel”.

This board has more columns than the page has room for, so it scrolls sideways. Scroll it: the content fades at each edge with more beyond it, the right edge at first, both edges while crossing, and the left edge at the end. Leaf draws these fades because the browser's own scrollbar shows nothing until something scrolls it. The code block and the diagram above hold everything they have and show no fade.

Check the sample route An open to-do on this card puts a Working indicator here because the card has no other margin control to carry it. Redraw the sample legend One of the cards the edge fade stands for: scroll the board across to reach it.

To ask for a refinement, comment on the sample that shows it and say what should change. Plain experiment clicks do not request implementation work.

Inspect the page and find what to edit

Move the card, submit a draft, or add an option above. Run leaf page state PAGE against this preview's page directory. Its content keeps your exact words, selected options, and card order; source locations and edit routes distinguish authored content from user decisions and captured data. Change unrelated source wording and inspect again: those user choices survive without copying them into HTML. Add a thread id, leaf page state PAGE ID, to inspect a frozen thread.

lf-sample · lf-suggestion · lf-old · lf-new

Interactions: core input sequences to try

Each sample below is a complete Leaf page running the production components and transitions. Do what its caption asks and watch the page answer. What you do stays in that sample's own log; “Reset” starts it again, and nothing reaches this page. To move a card, drag one on the delivery board.

Accept a suggestion

Press the suggestion's Accept check (✓) above the changed words. Leaf folds away the retired wording and leaves the sentence in its settled state.

Send a comment

Select the sentence about the agenda, then press c or click the Comment field that appears. Type a comment and press Enter: the field becomes an inline thread whose controls grow around your words in their original place.

Open and close Threads

Press Threads in the sample's top bar to open the Threads panel and read its conversation, then close the panel with its × button or Escape.