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. Contents and Page Map lead to each feature. 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 obligations, a question in a thread among them (such as the gallery thread about a pasted image), and updates whose reply failed and need sending again. Each is answered where it asks: a widget's own controls, or a reply in its thread.

  • 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 Leaf's panel at the window's foot: the On me mark beside Threads counts what is on you.
  • Press it, or g then Shift+M: the On view opens above the panel's row on On me, with a tab for the agent's list, such as On Claude, each tab counting its list. What left each list stands under it as Done: answered obligations under On me, sent replies and ended to-dos under the agent's. Press Enter on a row: it goes where m would.
  • Find the sample picnic booking among the obligations. Its row takes you to the request, where a pick answers it and pressing it again 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 obligation record

The map's obligation 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.

Inline hints outside a question

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 Keyboard shortcuts in the leaf's menu 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

Leaf's controls stand in one panel hovering over the foot of the page. In the window below, press the panel's leaf for the menu, and its field to comment. Choose Fold to the leaf in the menu, then press the leaf to unfold it: the mark stays visible and travels with the panel's outline. Press . twice quickly to reverse it in flight. With reduced motion, both take their final place at once.

The leaf's menu also holds Versions, Keyboard shortcuts (?), and under Navigate All pages when another Leaf page is live; Page Map is g then Shift+P. The empty comment field reports the current keyboard walk or a useful command result where it would show the agent's status.

On a local server, choose Copy link in the leaf's menu, then open the link in a fresh browser profile. The link keeps the current address and passage and includes the access key even after a reload. The row states that the key grants access to every Leaf page served by the same machine. Sample windows and the public website omit Copy link.

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.

Changing text keeps its space

Cycle the short status messages. The following text stays in place because data-room reserves their width from first paint.

Ready Following text

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 (the group is closed, so it offers only its two routes, with no field for another), 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. Clicking the words, or the pencil on the box’s edge, which shows while the pointer is over the box, opens the exact source; the check saves it, and the cross or Escape discards the unsaved edit. The box keeps its size while editing, and these controls stay when annotations are hidden. Copy, beside them, 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.

Delivered means the saved edit entered an agent turn. The receipt follows that edit through delivery and response. The panel's status 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 Dictate or Send beside its text. Other responses opens a picker for Suggest and reactions without moving the field; an agent reply has its own corner control for reactions.

  • Select words below and press Other responses, press E, or focus the comment field and press Tab: the same picker opens. Press Escape to close it and return to the field.
  • 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: settled answers in context

The meeting point is decided. Open Settled: At reception to inspect the alternatives, then close it. The spacious cards return to one disclosure line, leaving no empty card space before Permission.

Where should the sample group meet?

At the door Wait outside the building. At reception Meet inside, beside the welcome desk.

User workflows: permission and interface comments

lf-ask · lf-options

Permission for a stated action

Choose Book the shelter, then press it again to reopen the request. Other questions can stay unanswered. The pick stays through unrelated page edits until its author explicitly restates the request.

Book the covered picnic shelter?

Reserve the park's covered shelter for the sample group's Saturday lunch.

Leave it unbooked Book the shelter

Comment on the page: start a page thread from Leaf's panel

The panel's comment field starts a thread about the whole page.

  • Click the field, or press c with nothing selected: the status gives way to “Comment on the page” and the caret stands in the field.
  • Write a sentence and send it: the new thread is in Threads, whose count goes up by one, and the caret stays in the field for the next comment.
  • Press Escape or click elsewhere: the field keeps what you wrote for the next time you come back to it.
  • Open a thread in Threads: the same field now replies to it, and closing the thread gives the field back to the page.

Dictate a comment

In a browser with speech recognition, every empty comment or reply box offers a microphone where Send will stand. The panel's comment field, 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” under Annotations in the leaf's menu, tap “Street map”, and tap the ✕ at the end of the panel's row 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” under Annotations in the leaf's menu; the undo button on the drawing's comment box takes back a stroke, and the ✕ at the panel's row's end leaves the mode.

Capture area: attach part of the page

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

  • Open Annotations in the leaf's menu, choose “Capture area”, and drag a rectangle around this paragraph or a nearby widget. Lifting the drag attaches the image to an anchored comment, where you can add words, remove the image with its ✕, or send it alone.
  • Capture again and tap or click without dragging: nothing attaches, and capture waits for a drag.
  • Capture by keyboard instead: arrow keys move the rectangle, Shift with an arrow resizes it, and Enter attaches it.
  • Press Escape, or the ✕ at the end of the panel's row, while capturing: 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 the window's top.

  • Select some words in this paragraph, or focus the heading above, and scroll until it sits lower on screen. Press g and z, or under a finger choose Align current item at top under Navigate in the leaf's menu: its reading block moves to the window's top, and your focus and selection stay.
  • Try it on a focused question: its heading aligns. Try it on a focused thread in Threads: its card aligns inside the view. 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 under a finger choose Restore selection under Navigate in the leaf's menu: 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 under a finger choose Resume writing under Navigate in the leaf's menu: 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.

lf-options · lf-board · lf-card

One answer in its section and on a board: the card stands where the pick puts it

Each proposal is answered beside its case, and the board's cards show those answers. Pick Next for the flask, and its card moves to Next; drag the stove's card to Drop, or grab it and press the arrows, and its section's pick follows. Undo takes either gesture back in both places.

Replace the sample camp stove

The old stove takes ten minutes to boil a litre.

Next Later Drop

Pack a second sample flask

One flask ran dry on the last long walk.

Next Later Drop
Second flask New stove

Threads in the panel

Choose a view to open its thread in this practice page's Leaf panel. The controls, messages, search, and unread state are live. Reset restores the seeded discussion after trying a reply or changing a thread.

Sample width

Click a Sample width choice, then use Tab and the arrow keys: the keyboard cue encloses the label, while pointer selection keeps the native radio mark. Text-entry fields retain their focus cue.

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 list.
  • Read Threads down: the open threads, an unread one marked with a dot and a drafted one saying Draft, then the resolved ones under Resolved. Search the threads' words with the find button beside the tabs. The panel’s main field changes to “Search threads”; closing search brings back the unfinished comment.
  • Look at a row: its title leads, and a thread waiting on you says so. Ordinary open threads carry no extra status label.
  • Open a short thread: Reply follows its last message. In a long one, Reply stays visible while you scroll.
  • Resolve an inline thread: its state changes immediately while its space folds away into Resolved. Open Threads during the fold to read it under Resolved immediately, or Undo to restore the open thread.
  • 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 question 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.
  • Once you answer the channel question, compare the package's lists with Leaf's On view: both show the same outcome.
  • 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, open Threads, and open that thread under Resolved: the editor stays closed until Reopen recovers the words.

A message waiting on me

Open Full view, then On me, and reply to the environment question: the question leaves On me. Its entry opens the page thread. Reset restores the question.

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 “Saving…” 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; a page comment's words return to the panel's comment field.
  • On a touch screen, select words and tap the panel's field, which quotes them: the comment field opens on them and the native selection menu closes.

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 Discard instead: the message stays as it was and your words are dropped. Words a reload interrupts wait as an "unsaved edit". Saving, Escape, and Discard 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. Type - First and press Shift+Enter: the empty next item already shows a bullet. Move left into its marker to reveal and edit the Markdown source. 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. 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 “Your turn” under the label. The image question still needs an answer even though the agent added a later progress message. In Threads, “Your turn” still says so. Open the control and reply: the control turns blue as the thread comes back to the agent. The same reading fills 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 Leaf's panel, open the thread under “Resolved”, 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 disappear when their answer arrives, including while it streams. Choose “Progress messages” in the practice page: the completed checks leave no disclosure or gap above the answer. 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 each unread message says New beside its time until it has been shown whole.

  • Use “Next unread” at the head of a thread opened in the panel, 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. “Your turn” still identifies an outstanding question after you read it.

Callouts carry emphasis; disclosures hold support

Compare the tinted conclusion with its plain supporting detail in either color scheme. Open the disclosure by click, tap, or Tab and Enter: its chevron identifies the disclosure, and the conclusion keeps the tint. 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.

The user's observed view

Resize this window, change its color scheme, or open another tab. The authoring agent reads each document's viewport, visible reading regions, revision, freshness, and passive geometry checks under user_views in leaf page state. The measurements leave the layout decision with the author.

Changes in place

Coming back after the agent has revised the page, a notice says how much changed since the version you last saw. Press v to mark those changes, or what changed since the latest version when you've seen them all, or open Versions (g V) and press Compare beside an earlier one. Each block changed since then has a green bar beside it and a Change entry; h and Shift+h step through them, o hides them with the other annotations, and v again takes them off. A revision that lands while you watch flashes. While the agent is On it for a comment, an accent bar stands beside the comment's block until it answers.

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

A question around its figure: options laid across

This question holds a chart and ends in one list of titled options marked across. 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-ask · lf-options · lf-option

Options that hold their pictures: each drawing over its own pick

Each option below holds the drawing of what choosing it gives, today's in the option that keeps it. The cards read down, so each drawing keeps the size it was drawn at, and stand apart, so no drawing runs into the next option's title.

Should the sample queue group its tickets by owner?

Group by owner A heading over each owner's tickets.
Two owner headings, each over two ticket rows Ana Ben
Keep one list Tickets in arrival order, as today.
Three ticket rows in one list

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, with the chosen outcome on its own line. Rows sharing a group sit under that group's heading. The lf-tally above it counts the queue's obligations 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 obligation, whose row carries an open mark.
  • Choose Fix, then Escalate to engineering: the row keeps its name and summary while the outcome changes on its own line. Undo restores Fix without moving the rows; undo again restores the open mark and tally.
  • Narrow the window below the set's 36rem: the list becomes a row above the item, with each group's name before its first row. The chosen outcome remains below the summary; unusually long answers ellipsize.

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. Escalate to engineering Send the certificate failure and logs.

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: “Saved” means the server recorded it, “Up next” that a later turn will handle it, “Delivered” that a turn accepted it, and “On it” or “Replying” that its answer is in progress. “Stopped” and “Gone quiet” 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 through a long message and into the next: its author's name stays visible, and words fade beneath its lower edge as it moves away. At the start the upper fade disappears; at the end the lower one does. 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 “Discard” 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 obligations, 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 face as a pin, one corner left square to point at its target. 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 Annotations in the leaf's menu 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 obligation.

Quiet status pins without a rail. This sample starts with a recorded card move. The small upward arrow beside “Print the workshop map” says “Saved” on hover: the move was recorded, with nothing for you to answer. After two minutes undelivered, it becomes “Haven't seen it yet”; Reset starts a fresh example. Up next, Delivered, and On it 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 metric 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 a 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. Native blocks accept the grammar's short language labels, such as sh and js; both examples should show syntax colors.

leaf page check ./proposal --render
leaf page stamp ./proposal --text "Ready for review"
const source = referencedElement(card, "for");
const api = widgetController(source);
// Read the source widget's current selection.
const ids = api.read().state.choose.value;

The marked return value keeps its annotation while the whole block shows Python syntax colors. Line wrappers and the empty link target stay in place too.

def load(path):
    data = read(path)
    return data
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 · lf-toc

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. Click a neighbouring tab: its view opens immediately while the underline travels for 160 ms. Arrow-key selection and reduced motion switch instantly; the focus frame never travels.
  • 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.

An index for each topic

Switch between Prepare and Operate: each index lists only that topic's headings. In this narrow window, the index starts open below the tabs. Follow “Save a snapshot” to reveal its closed details. Choose Full view on a wide screen: the same contents sits in the left margin as a reading map, with labels on hover or focus. Narrow the window to bring the index back below the tabs.

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.

lf-parts · lf-part

Parts: a page of parts with Layouts of their own

A page whose parts want different Layouts, here a workspace to try and a column to read, lists them down its left under the page's title. The window below is such a page.

  • Choose Notes, then Try: the column and the workspace each take the room beside the list, which stays put.
  • Narrow the window to a phone's width: the title scrolls away and the list becomes a row that sticks over the part.

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 Leaf panel floats at the window's foot, 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 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. Slider starts the comparison; drag its divider to compare the same location. Choose Pair to see both run lists at the same scale, and click either image to open its original. Resize the window to inspect the paired layout. Pixels shows the changed pixels; the … menu holds its color key, the scale choices and Outline changes, which marks regions in Pair and Slider. Compare Fit with 100%: scrolling either image in Pair at 100% moves both to the same location. In Slider, a fully hidden image's label loses its shading. An outline preserves the image's colors inside each border. The controls stay in place across views and scales. Tab reaches the chosen view and each other control, and the arrow keys choose the next view.

This pair is one picture twice. The comparison reports identical images in every view.

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. The window below is such a page. Open its 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 panes, each takes its content's height and the page scrolls, and on a phone they stack.

Authenticated HTTP

Read /items from the host's example connection. A host grants its HTTPS origin and credential with leaf connection bind; this page has no grant by default. Pressing Read reports the missing grant, or displays the upstream status and text once connected. Each read consumes one request from its allowance; the result is not saved.

No HTTP read requested.

The GitHub discoveries page composes this capability with LLM generation. Its queries and editorial logic belong to the page; its saved stories work without a connection.

LLM generation

Press Generate to ask the host's model for a five-word headline about a library opening on Sundays. The response appears below with the model's name. A page without an active Codex, Claude Code or Pi claim reports that a claim is required. Each press can incur model usage; the result is not saved.

No generation requested.

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, then Tab into Preview and scroll through the code example: the focus border stays at the viewport's edges. Reloading keeps your selected view; a new source value updates both views.

lf-text-document

A quoted passage

The rule below is written into the page, not bound to a source. Preview reads it rendered; Source shows its exact Markdown. Select words in the preview and comment on them.

Add a line under Unreleased for every change a user can see, and name the flag or command it touches, such as --config.

Add a line under **Unreleased** for every change a user can see, and name the
flag or command it touches, such as `--config`.

lf-text-document

A document from a widget

Press Update document to publish a new release note. Preview and Source read the same output; updating it keeps your selected view.

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. “Saved”, “Delivered”, and “On it” 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 panel to open the list, open its conversation, then put the view away with its Close button or Escape.

Interactive sample on this page

These choices use this page's state and Undo.

Standard delivery Express delivery

A sample created by a page module

Press Create sample, choose a delivery, then use Undo in the sample. Remove sample releases its temporary history; creating it again starts fresh. This fixture supplies fixed source and makes no model request.