> For the complete documentation index, see [llms.txt](https://beamline.gitbook.io/beamline-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://beamline.gitbook.io/beamline-docs/changelog.md).

# Changelog

What changed in each Beamline release, newest first: new parts, fixes, speed and motion work. Latest: 0.2.0-rc.39, 2026-10-13.

> The original of this page is on beamline.io: [beamline.io/changelog](https://beamline.io/changelog).

## 0.2.0-rc.39 — 13 October 2026

* Tables can retain every field as labelled records in narrow containers; comparison tables keep a bounded horizontal scroller. Foundation controls and cookie details use the same Table.
* Slider values and endpoint labels fit narrow rooms, with the current value available on the shared tooltip.
* Optional interface sounds have revised cues, bounded repeat playback, per-provider volume and cancellation, and explicit playback results.
* Cookie consent awaits asynchronous persistence before saving, keeps failed choices available to retry, and fits the viewport's safe area.
* Public demos have bounded phone previews and an expanded view that preserves their state. Mobile story sections and the closing light band use responsive compositions.
* Page content leads the public library and documentation. Short related context, React installation, customization, commercial use and referral-credit information follow it.

## 0.2.0-rc.38 — 13 October 2026

* **Personal access, shared app work.** One purchase gives one person access to their Beamline account, MCP server, installs, updates and full library. Team invitations and shared access are removed. Teammates, contractors and clients may use, edit, build and ship the installed code in that app without a Beamline account; they need their own licence to use the MCP server or library, or take Beamline parts into other apps. Commercial use, lifetime updates and the $49 launch price are unchanged. Existing buyer grants remain usable.
* **Your account, in one place.** A customer cabinet brings together setup, agent activity, code and updates, billing, referrals and account settings. You can export your data or delete your account; a failed cleanup keeps the sign-in available for retry.
* **A clearer checkout.** Card and PayPal payments use Paddle's inline checkout with tax added on top. Crypto checkout names the coin and network and explains the wallet handoff. The acknowledgement follows the buyer's declared billing country.
* **Feedback and measurement.** Customers can report problems from the site and see issue updates. The owner has feedback, attribution and e-mail views. Consent choices control measurement; visitor-specific consent pages are private and are not shared-cacheable. Provider delivery depends on configured connections.
* **Pictures for coding agents.** Element previews can show the real component states in either theme, alongside text guidance. Free accounts can record interest in paid elements without gaining access to their source.
* **Clearer package notices.** Compiled units carry the free sample's MIT notice alongside the complete system's personal-access licence.
* Calendar's month and year arrows now receive pointer clicks without covering the central month/year picker.

## 0.2.0-rc.37 — 12 October 2026

* **A clearer first visit.** The home and Connect pages open with a short introduction; the full product facts close the page. Library pages arrive with their first view rendered, use shaped loading placeholders, and reveal examples as their code arrives.
* **Lighter site pages.** Home, connect and account load their own code separately from the library. Public HTML supports conditional revalidation, and library links prefetch on intent.
* **Pictures in the website demos.** Preview photos and portraits stay on the website; customer kits keep their existing procedural demo media. The new Proofdesk and Scribeline case studies link to their live demos, with before/after pictures and scoped measurements.
* **Stable first paint.** Radio cards, tabs, segmented controls and fill-width sparklines draw their selected state or initial shape before measurement. Unattended looping previews rest and wake on input; finite image arrivals and countdowns finish. Product activity remains enabled by default.
* AppShell now supplies a main landmark in contained mode and keeps its contained header out of the page banner landmarks. Use `mainAs="div"` inside a page that already owns main; gallery examples retain the gallery landmark. PromptBar exposes its textarea as a multiline textbox with linked list autocomplete and a named suggestion region, preserving suggestion keyboard controls and announcements. No prop signatures or visual styling changed.
* AgentRuns keeps the running count in its translated header, and StatusDashboard names the service in each history chart's accessible label. ModelPlayground's empty-response text displays its apostrophe correctly.
* RunTrace reuses localized icons between clock ticks; changing the language still updates their labels and preserves the selected step.

## 0.2.0-rc.36 — 12 October 2026

* **One list vocabulary.** Table record mode and record-list screens now share DataGrid's server props, retained rows, stable-ID selection and explicit retry. Paging helpers are shared. Existing rc.33 calls remain supported. Upgrade names: `Pagination.total` → `rowCount`; `onLoadOlder`/`onLoadMore` → `onEndReached`; `hasOlder` → `hasMore`; CRM `scope` → `filters.scope`; MarketScreener `screen` → `filters.screen`; inbox/team/console `view` → `filters.view`; ChangelogFeed `filter` → `filters.tags` (including corresponding default/change forms). KnowledgeBase/SupportConsole scalar `selected` → `openSource`/`openConversation`, while array `selected` is bulk selection. AgentRuns execution `onRetry(id)` → `onRetryRun(id)`; `onRetry()` is the load retry. AuditLog preserves its old structured filter callback; `manual`, `filters` or `defaultFilters` opts into the shared field map. Old spellings warn only in development. [Server recipe](https://beamline.io/docs/data-integration#one-server-list-recipe) · [migration details](https://beamline.io/docs/upgrade#unreleased-shared-list-state).
* **Translate the whole interface.** Built-in labels, validation, accessible names and announcements now use each component’s message dictionary, including the new list layouts. Locale changes preserve editing drafts and selection; cancellation progress follows the app’s messages.
* **More package-manager choices.** Installation checks cover Bun and Yarn alongside npm and pnpm, including source and registry installs and supported Next.js and Vite setups.
* **LightBand rests on a quiet page.** Its live and painted renderers stop their time-based motion after settling, then wake on scroll, pointer movement or resize. The band keeps its resting pose.

## 0.2.0-rc.35 — 12 October 2026

* **Page titles wear the look's display face.** PageHeader titles (and every other title that merges `font-display` with `font-title`) now take the look's own heading face, weight and width: Metal's wide Archivo, Pop's Gabarito, Ink's serif. Before, the two classes cancelled out and titles fell back to the body face in every look.
* **Hero size is a style parameter.** `displayScale` (UIRoot prop, `style parameter <file> displayScale 1.3`, the studio's **Hero size** slider) scales `.text-display`, the one headline a screen leads with, and nothing else; it travels with a custom style.
* **ProductTour fits tall elements and phones.** A stop on an element taller than the window brings its top into view, not its middle, with the card beside or over the part below. On a phone the card docks to the top edge when the element sits where a bottom sheet would cover it, and a long step scrolls inside the sheet.
* **Glass dialogs read clearly.** Glass overlays carry a denser tint, so text on a dialog, menu or sheet keeps 4.5:1 over anything behind it in dark and light, and the page behind a Glass modal frosts; the rim light, the lens at the edge and the frost setting are unchanged.
* **Look cards you can tell apart.** In the library's style panel each card now draws its look in its own brand, with its title face and weight and five bars in its chart grammar (Metal's lamps, Mono's dot matrix, Ink's hatching), and Glass over colour, so all nine read apart at card size in dark, with nothing moving at rest.
* **The style panel opens at MacBook width.** It opens by default from 1440 px, including 1512 px, while remembering your own choice. The narrower rail keeps every look name legible; category pages put the product facts after the examples.
* **Attribution is more explicit.** Source metadata and notices include the reviewed upstream credits and bundled helper licenses.

## 0.2.0-rc.34 — 11 October 2026

* **Every Beamline file can live in your repo.** The full-source command, agent skill and MCP install the selected components, shared runtime, looks and fonts as source. The app can build and run without Beamline packages or requests to beamline.io. Managed base-file upgrades preserve customer edits and report conflicts. The install guide includes a first-app walkthrough.
* **Server-owned tables.** DataGrid supports server pages and infinite loading, retains rows during pending and failed requests, keeps selection by row ID, and exposes explicit retry. The fetch, React Query and SWR examples cancel superseded requests in the app.
* **Locale and messages belong to your app.** UIRoot provides a scoped locale and message dictionary; shared number/date formatting follows that locale. Shared runtime messages accept app overrides; complete component-family copy coverage follows in rc.36.
* **Settings starts with a complete workspace.** Profile, appearance, notifications, members, billing and API keys have clearer grouping. Saves, retries and photo edits retain their drafts; narrow appearance cards keep the preview, label and selection mark visible.
* **Read and review documents in place.** DocumentViewer renders PDFs with lazy-loaded PDF.js, page navigation, selection and annotations. DocumentReview connects review decisions and their pending/refused states to the app's handlers, preventing overlapping decisions.
* **Choose a style beside the example.** The library and local studio share a panel for looks, brand, theme, density, motion and custom styles. It starts as a compact rail below 1600 px, remembers an explicit choice, and opens as a sheet on small screens. Example canvases expose consistent controls and shareable choices.
* **Inspect the running app with your agent.** `audit --open` adds browser observations and screenshot paths to source checks. Hosted connect includes the same source-audit helper, and an app installed entirely as source is recognized without requiring unused Beamline packages.
* **More reliable editing and navigation.** Controlled calendar pickers retain keyboard entry, document page classes reach their intended wrapper, and a refused workflow publish preserves the paused state and the latest draft. RTL, accessibility and screen recovery corrections accompany the API changes below.
* **Consistent prop names without removing existing inputs.** Visual treatments, pixel dimensions and positive visibility now have descriptive names; old names remain deprecated aliases with one development-only warning. Tree selection uses `selected/defaultSelected/onSelectedChange`; text and date fields share `onValueChange`. [The migration table](https://beamline.io/docs/upgrade#conventional-prop-names-with-compatible-aliases) lists every rename and the retained scoped-default keys.
* **State can be owned by the app or the component.** Added the missing control/default/callback pairs to Accordion, Calendar, OtpInput, InlineEdit, ColorPicker, Timeline, Item, ThemeSwitch, SignaturePad, Pagination, OrderBook and Watchlist, plus the affected analytics, CRM, sales, trading, settings and sign-in screens. Native text-field events remain supported, rejected saves keep their drafts, and Alert preserves legacy dismissal behavior.
* **Props explain their behavior.** Public props and exported data/slot members now describe their purpose and defaults where ownership allowed changes. RadioCards forwards its ref, StepForm root classes win, and shortcut keycaps honor the requested platform. The gallery/catalog extraction retains deprecation advice and explicit refs.
* **Copyable field examples.** ChipGroup, RadioCards, RadioGroup, SegmentedControl and Slider usage examples now include imports, typed state and their complete component.
* **Unknown data stays unknown.** BarChart, PieChart, RadialChart, BarList, PriceChart, KnowledgeBase, Portfolio, Billing and AllocationEditor no longer turn missing measurements into misleading totals, zero volume or whole-total shares.
* **Agent rules serve the screen, not the audit.** The guidance now leads with one principle: the simplest screen that does the user's job wins. Control choice follows the screen's density: a dense business form takes compact controls (Input, Select, SegmentedControl, NumberField in two or three columns), onboarding or a decision with descriptions takes RadioCards and the step-form block, a long list a Select or Combobox. A generic Input, Select or Card needs a few words in `BEAMLINE.md`, not an argument. "Use the block" became "start from the block when it matches the job; take its parts when it doesn't", with examples, and layout classes on any element are named as fine.
* **The audit says FIX or CONSIDER.** FIX is a defect the user would meet: a browser's stock control inside the look, an unpainted page, tokens set to literal colours, another kit's parts, emoji as icons. CONSIDER is a more specific element that may fit better (a Select with three options, a number Input, a step flow without StepForm, hex colours, unused packages, no `BEAMLINE.md`); the agent takes it or declines it in one line. An app with only CONSIDERs is clean and exits 0. The JSON summary adds `consider` (`warn` stays as its earlier name).
* **Less repeated formatting work.** Prices and timestamps reuse locale-aware formatters across rows while retaining each app root’s locale. Source and browser distributions also carry the expanded third-party notices.

## 0.2.0-rc.33 — 11 October 2026

* **The complete stylesheet builds in an existing app.** Shared component styles are included once, in the same order. Repeated dependency imports could previously exhaust the app builder's memory.
* **Selection, drafts and phone actions keep their meaning.** A tree's branch selection skips disabled leaves; a pivot table can group without row fields; Escape closes a tour from its highlighted control; an unknown funnel step stays unknown. Sending a message keeps the next draft and prevents a second send while the first is pending. Free image cropping drags smoothly, and the inbox's phone bulk actions retain their accessible names.
* **Settings instead of functions, and the gaps apps kept hitting.** `UIRoot theme="system"` follows the device live, and `ThemeScript` (`@beamline/runtime/theme-script`) sets the theme before the first paint under a strict Content-Security-Policy (pass the nonce, or allow `themeScriptHash()`). MetricCard and UsageMeter take `formatOptions`, `locale`, `prefix` and `suffix`, so a server component can set currency or units without passing a function. FileDropzone shows a picture for image files, and `renderList` (or `listPlacement="none"`) lets you draw the files yourself. Stepper steps can be `failed` or `blocked` and carry a `meta` line; Plan steps carry their id and the running one is `aria-current`. NumberField takes a `placeholder` and a `suggested` value that waits until Enter or Use takes it. CopyButton takes `copiedLabel`. A Button whose label changes is read by its new label at once.
* **Four new elements for AI products and accounts.** ModelPicker chooses a model with what sets each apart in plain sight (context, speed, price, what it can do, a detail beside the list) and is now PromptBar's model menu. PromptSuggestions offers starter prompts or follow-ups that fly into the composer when chosen (the voice agent's suggestions use it). ShareDialog invites people by name or email with a role, changes or removes access with undo, and sets who the link opens for. CookieConsent asks once, with Reject all as easy as Accept all, keeps the choice per category and honours Global Privacy Control.
* **Three new trading elements.** OptionsChain lays calls and puts around the strikes with the money shaded and the spot drawn between strikes; choosing bids and asks builds legs and adds up the net. PnlCalendar shows a month of results day by day, tinted by size with ▲/▼, week totals at the side and unrecorded days hatched. SwapForm swaps one token for another with a live quote that refreshes, impact, minimum received, slippage and a review before signing. New market types: `OptionQuote`, `OptionStrike`, `OptionExpiry`, `OptionLeg` and `inTheMoney` in `lib/market`.
* **Card field, image cropper and run trace.** CardField takes a payment card in one field, names its network as it is typed, checks it, moves focus on by itself and says what is wrong in words. ImageCropper frames a picture before it is saved (square, round, wide or free; drag, pinch, wheel, keys; rotate) and `cropImage` turns it into a file. RunTrace shows an agent run as a waterfall of its steps with retries, tokens and cost, live while it runs.
* **Inbox list, live cursors, call grid and answer compare.** InboxList triages conversations in place: day groups, unread, stars, labels, a bulk bar, keys and swipes, Undo where a row was. LiveCursors shows colleagues' pointers, selections and short messages over any shared surface, gliding between realtime updates. CallGrid lays out the people on a video call (largest tiles, or a stage and a strip) with a ring that follows the voice. AnswerCompare puts two answers side by side for a verdict with reasons, blind if you like.
* **Recurrence and availability editors; your words on the order ticket.** RecurrenceEditor sets how something repeats (every n days, weeks, months or years, weekdays, the second Tuesday, until a date or n times), says it back in a sentence, lists the next dates and gives an RRULE. AvailabilityRuleEditor sets bookable hours per weekday with several ranges, copy to other days, a time zone and date exceptions, with a week strip and overlaps said in words. OrderTicket takes `labels` (Long and Short, Amount, your own button and result lines).
* **Editable source sits beside shadcn/ui without changing it.** The source theme no longer redefines the Tailwind names your app already has (`text-sm`, `font-medium`, `leading-tight`, `rounded-md`, `shadow-sm`, `font-sans`) for the whole page: outside a Beamline root they keep your app's values, inside one they read Beamline's tokens. An existing shadcn Button keeps its width, size, weight and line height (it grew from 14 to 16 px text before).
* **TextReveal works on server-rendered pages and for screen readers.** Its words are in the page's HTML and show before any script; a headline already in view when the page comes alive stays put, one further down still rises when it is reached. A TextReveal rendered as a paragraph is read as its sentence (it was read as an empty paragraph), and the headline now has the heading face, weight and balanced lines it was meant to have; a size you pass changes only the size.
* **Breadcrumb levels are easier to tap.** On a touch screen each level has a 44 px tall target, and a tapped level no longer keeps its hover colour.
* **Avatar initials read clearly on every fill.** They keep their colour tint but mix it into black or white, whichever their circle reads better against, so initials stay at 5.5:1 or more in every look, also on a brand-coloured sidebar (they fell to 3.5:1 there).
* **RichTextEditor to-dos are easier to tick on a phone** (a 24 px box around the same check), and code numbers are a touch darker on light looks so they keep 4.5:1.
* **Lifetime updates, for everyone who has bought Beamline, including earlier buyers.** Your purchase now includes new versions of the complete system for as long as we publish it, in place of a year. We decide what each version contains; separate add-on packs may be sold separately. Every version you receive stays licensed to you, even if publication ends. Nothing to do: it applies to your account as it is.
* **A fix-or-refund promise.** If a part you bought doesn't work as described, tell us: we will fix it or refund you. The voluntary 30-day refund before your team's first install of a paid element stays as it was.
* **The licence is final.** `LICENSE.md` (version 1.0) replaces the draft and says what beamline.io/licence and the terms of sale say: no seats, your whole team including contractors, any number of your own and your clients' apps, commercial ones included; no reselling Beamline as a kit and no publishing its source on its own.
* **$49 launch price, one payment.** The site no longer shows a struck-through reference price.
* **The name is Beamline UI** wherever it stands alone: page titles, headings, the licence and the listings.
* **Who makes Beamline.** beamline.io/about now names its maker, Danylo Pravda, in Kyiv, and beamline.io/tested lists the checks behind each release with their dates and numbers. Counts on the site are now rounded down from the catalog ("180+ components and screens") so they never overstate it.
* **Dark and light are both complete in every look.** The docs no longer call light secondary; dark stays the default.
* **Tested in Firefox and WebKit too.** On 10 October every library page opened in Firefox 155 and WebKit 26.6 at desktop and phone width; beamline.io/tested has the numbers and the issues still open. Real Safari on Mac and iPhone is not tested yet.
* **Beside shadcn/ui, say which way.** The docs now say plainly that the compiled packages, inside their own `UIRoot`, leave an existing shadcn/ui app's controls as they are, while editable source shares your app's Tailwind theme.
* **Crypto checkout is for buyers outside the EU, EEA and UK.** There, pay by card or PayPal through Paddle.
* **A halftone picture no longer traps a scrolling thumb.** HalftoneDots took every touch for itself, so a thumb that landed on it (a 320 px square is most of a phone's width) could not scroll the page, and each attempt set off a ripple. The page now scrolls through it as through any picture; on touch a tap sends the ripple, and a scroll or a swipe does not. A mouse press still ripples at once and the dots still lean from a hovering pointer.
* **Readable labels on every AllocationEditor colour.** A segment's label chose white or black by a lightness estimate that put white on mid blues and teals, below the 4.5:1 that small text needs (3.6–4.4 in seven looks). It now chooses by the colour's luminance, as the contrast rule measures it, so every series and tone reads 4.5:1 or better in every look.
* **A dialog opens out of its button exactly.** On a page with a scrollbar that takes room (most desktop browsers on Windows and Linux), a Dialog, AlertDialog or CommandMenu that grows out of the button that opened it started half a scrollbar to the side, because the page's scroll lock widened the page after the start was measured. There the start is now placed after the lock, still before the first frame is drawn.
* **Hold to talk holds on a phone.** A VoiceButton in hold mode lost the recording when the thumb holding it drifted a little: the drift started a page scroll, which cancels the press, so a 24 px drift ended a hold after a second. The button now keeps the finger while it is held (and a long press calls up no system callout); the recording lasts from press to lift with the thumb moving up to 60 px. Toggle mode and the mouse are unchanged.
* **Four things that moved on their own now hold still.** A TextShimmer with `elapsed` holds the room its time needs from the start of the work, so the time fades in at two seconds, and goes from 9s to 10s, without pushing what stands beside the line (it moved a Stop button 13 px); the room widens only when the time changes shape (59s → 1m 00s, and at ten minutes), and then it eases. A SlotText that loses places (1,284 → 488) narrows them away as its reels turn, from the moment the value changes, instead of dropping them after the roll had landed (the number snapped 10 px). Every chart's "View as table" button is there while the chart loads, disabled, so the legend beside it no longer slides 22 px when the data lands; the analytics dashboard holds its chart's "per day" line with a placeholder the same way. And when ImportMapping cannot check values, each mapped row keeps its check line, now "Not checked", instead of losing it, so the rows below stop jumping up 34 px.
* **A trade's value on a phone.** In a narrow TradesTape the Value column folds and its reading was reached only by pointing, which a finger cannot do: the header flashed the print for the instant of the touch and cleared it. A tap on a print now holds it: the header reads its side, value and time and keeps reading that print as new ones push it down, until it is tapped again or the finger touches anywhere else. In a narrow tape the header now leaves out the size, which the row already shows, instead of the value, which it does not.
* **Anything that moves on its own can be stopped, by anyone.** One shared hold, `useHold` (built on `useTap`, a touch tap that a scroll or a swipe never counts as), for the parts that move by themselves: the pointer over them, keyboard focus in them, or on touch a tap, which holds until the next tap; a tap that chooses something inside (a ticker symbol, the announcement's link) holds it until you touch somewhere else, so what you chose does not run away. TickerTape takes it: a running tape whose symbols are not buttons is now one tab stop, where a keyboard could not stop it before, and a tap holds it on a phone. LogoCarousel, Carousel's autoplay, Matrix's scrolling text (a tap now holds it on touch) and AnnouncementBar use the same hold. A screen reader no longer hears "black up-pointing triangle" before every change: the ▲/▼ beside a signed percent is drawn, not read (TickerTape, PriceTicker, Watchlist, PriceChart), and the OrderBook's last price, which carries no sign, says "Up" or "Down".
* **Small parts, a second look.** Pointing at a PriceTicker brings the 24h move in money beside the percent ("−687.5"), the shared reveal: laid out at rest so nothing moves, always shown on touch. A LiveWaveform on a live microphone that hears nothing for four seconds says "No sound from this microphone" over its flat line (the same shape as Muted, and in its spoken name); the first sound clears it. An ImageCompare nudges its divider once the first time it comes into view, so a person sees it can be moved; never after a touch, never under reduced motion, and `hint={false}` turns it off. A live Matrix meter holds each column's peak a moment as a dimmer dot, then lets it fall a row at a time, like a studio meter. A turning LogoCarousel can be held still by everyone (WCAG 2.2.2): while it turns it is one tab stop and focus holds it, and on touch a tap holds it until the next tap.
* **A sequence reads as a sequence.** Kbd takes `"then"` between keys: `["g", "then", "a"]` draws G then A, seen and spoken, where it used to look exactly like G and A held together; a CommandMenu shortcut written with a space ("G A") now draws that way too. With `live`, a finished step stays inked and a line under the next "then" runs out over the second and a half the next key has; a wrong key or the time running out starts over, and a letter typed into a field is typing, not a shortcut. A TextShimmer that has run stays a status, so a screen reader hears the end once, with how long it took ("Read 14 sources, took 12 seconds"); its time used to be hidden from screen readers altogether.
* **Twelve new screens for data and operations work**, each a block composed from the library's own parts, with its data and actions through props, loading, empty, failed and partial states, and every action shown at once and put back with the reason when your API refuses it: `sales-dashboard` (quota against pace, the forecast call, a leaderboard that scopes the page), `product-analytics` (funnel steps that are their own bars, a cohort from the people lost, retention, events), `status-dashboard` (services, latency against the SLO, incident updates), `helpdesk-inbox` (a virtualised ticket queue with SLA clocks, the conversation, notes), `invoices` (receivables by status, the invoice as its document), `orders-admin` (what to fulfil, fulfil with tracking, refund items), `contact-profile` (a person's record, deals and activity), `file-manager` (folders, grid or list, upload, preview, share), `projects` (a portfolio by health and each project's overview and updates), `report-builder` (metrics, breakdown, filters and chart, saved as a report), `project-board` (a sprint on the kanban board, Done only through review) and `team-calendar` (people's and shared calendars, schedule, move and cancel).

## 0.2.0-rc.32 — 10 October 2026

* **The library reads properly on a phone.** Pages scroll as the page itself (Safari's bars collapse and a tap on the status bar returns to the top) under a top bar with the mark, search and the appearance sheet; the menu closes with a tap beside it or Escape. An element's title and description take the whole width with "Use with my agent" below them, and Usage & props stays inside the screen: spec rows stack, long types wrap and the props table scrolls in its own box.
* **ImportMapping fits a box that narrows.** Its column list no longer keeps the width its rows had in the wide layout, so a window or panel narrowed to phone width stacks the pairs inside the screen instead of scrolling sideways.
* **Every element answers to the room it is given, not the window.** Cards, charts, tables, lists, forms, the trading panels, the agent parts and the blocks are size containers now: put one in a sidebar, a split pane, a dashboard tile or a phone and it lays itself out for that room — less room folds the least important parts first (into "+N", a tooltip, a shorter form, fewer ticks) and keeps their order; more room adds what was folded and separates what a narrow layout joins (a wide order book adds a Value column; a narrow positions table joins size, entry and liquidation under the symbol instead of scrolling sideways). Changes keep their path: values roll, rows slide, selections travel, panels ease to their new height, and nothing jumps when a layout changes at a step. Secondary details (a row's actions, a copy button, a timestamp) wait for hover or focus and are always shown on touch; set `data-reveal="always"` on your root to show them all. New shared parts for your own components: `useFit` (a row that folds into "+N" by room), `useContentHeight`, `useHeightMorph`, and the `.reveal` / `.reveal-host` utilities. Nothing to change in your code; the defaults that a careful eye will notice are listed below.
* **Defaults that changed.**
  * Two elements are retired. BillingToggle is now an option of SegmentedControl: give an option a `note` ("−20%") and an `activeNote` ("Saving 20%") and it turns into the saving while chosen. Advertisement is removed (a rotating sponsor slot belongs on a content site; AnnouncementBar carries news inside a product). The catalog has 189 entries; the old library addresses lead to SegmentedControl and to the Display category, and an agent asking for either id is told what replaced it. Copies already in your app keep working (UPGRADE.md, "To 0.2.0-rc.32").
  * A quick-filter ChipGroup folds into "+N" after two lines (`lines={false}` keeps every chip); MultiSelect fits as many chips as its field holds instead of always three (`maxVisible` is now an optional cap).
  * Card is a size container: its padding steps with its width, under 20rem the status sits under the title, from 42rem media moves beside the body (`layout="stack"` keeps it on top). A card left content-sized in a flex row takes `min(16rem, 100%)` instead of its content's width; charts do the same.
  * Line and area charts 560 px wide or more name each series at its end (`endLabels="none"` turns this off); legends fold into "+N" in a narrow header; pie, radial and waffle `size` is now the largest diameter and `size="fill"` fills the room; most charts take `height="fill"`.
  * Price chart, depth chart and funding countdown are now a Tab stop each (keyboard reading); the market heatmap and the sankey chart are one Tab stop with arrow keys instead of one per tile or node.
  * The watchlist keeps a sorted order while prices tick (it re-sorts when you sort or star); ticker tape holds still when every symbol fits, and its `speed` is now pixels per second.
  * Button never grows past its container (a long label ends in "…"), and is icon-only only with `iconOnly` or no text at all among its children; DateRangePicker fills its column (no 240 px minimum); InputDissolve has no 360 px cap.
  * AgentWorkspace shows New task and Search threads only when you pass `onNewTask` / `onSearchThreads`.
  * Fields and navigation fold by room too: TagInput keeps its tags to one line at rest and folds the rest into "+N" (focus brings them back; `lines={false}` shows every tag); SegmentedControl folds to compact, then icons, then a scrolling row, and as a form field to a select; Tabs fold the tabs a row cannot hold into a More menu instead of scrolling sideways (the chosen tab stays); Breadcrumb folds by room instead of by count, the levels nearest the top first; AppShell shows its sidebar as a rail under 56rem and as a drawer over the page under 35rem of its own width (`fold={false}` keeps it open); Sidebar in a layout under 40rem keeps its rail and opens over the page.
* **New, when you want them.** Table columns fold into the name line by room (`<TableHead fold="md">` with `<TableFold at="md">`); RadioGroup `orientation="auto"` (a row while every option fits); Form `layout="split"` (labels beside controls when wide); Popover `sheet` (a bottom sheet on a phone); CommandMenu `loading` and `onQueryChange` for server results; LogoCarousel `columns="fit"`; Matrix `cols="fill"`; MetricCard `trendLabels`; Progress `showRemaining`; Spinner `delay` (quick work never flashes it); SplitButton `choices`; Card `revealAction` and `interactive`; Bezel `interactive`.
* **Fixes found on the way.** The pagination, avatar, orb, glow, rich-text editor and price chart no longer spill a narrow room; the video's failure no longer collides with its controls; swipe actions no longer overlap their labels; the market heatmap is one Tab stop instead of 34; a click that does not focus its button (Safari) still returns focus to the opener when a menu or dialog closes; sidebar tones and signature inks come from tokens, so a rebrand reaches them; a side sheet as wide as a phone closes on a swipe toward its edge.
* **After a second look.** PriceTicker shows a stale feed as stale (the price steps back to the secondary ink beside its "Stale" chip, which fades in) and eases its 24h chip when the sign turns; live prices still never move. Pagination keeps its page numbers whenever they fit (five pages show at 360 px again); Breadcrumb keeps the levels nearest the page when it folds (`useFit` takes `from: "end"`); PhoneInput gives no "incomplete" verdict while the country picker is open, only when focus leaves the field; a SegmentedControl folded to icons names each segment in the system Tooltip.
* **A pressed toggle you can see.** Every look now draws a pressed rim, a hairline inside a pressed toggle's well (`--m-pressed-rim`), over the well's own edge: against an unpressed toggle it reads at 3.3–9.8:1 in all nine looks, dark and light, where six dark and seven light looks were under 3:1 (Prism 1.6:1). ToggleGroup and the OrderTicket's share buttons use it. `useMediaQuery` keeps one MediaQueryList per query, so a part that renders often (a playing AudioPlayer, 30 times a second) no longer asks the browser for hundreds of media queries a second; the player's play and pause glyphs are made once. An ApprovalCard settled by keyboard moves focus onto its settled line in the same commit as the fold; it used to land a frame later, with focus on the page in between.
* **Words before icons.** A SegmentedControl whose segments carry icons now drops the icons before the words (a `words` fold between compact and icons), so a five-state switch keeps its labels down to about 340 px. Timeline facts given as "a · b" wrap between themselves and never leave a dot at a line's end. A wrapped CodeBlock fold keeps `maxLines` rows in view rather than lines. SearchField makes a one-key `shortcut` ("/") work by itself, as CommandMenu and VoiceButton already do. A narrow CommandMenu keeps its run and close hints; MicSelector's buttons wrap together; a RadioCards price stays on one line. LogoCarousel's rise now runs in the browser's compositor with its fade and blur, so a turning wall asks the page for about two frames a second instead of twelve.
* **One "+N" everywhere.** Every row that folds (ChipGroup, TagInput, MultiSelect, FilterToolbar, Citations, the PromptBar's sources) ends in the same part: an outlined count at the row's height that names what it holds in a tooltip on hover or focus, rolls when the room changes how many fold, and, where it is a button, says what it will show. A folded row of items collapses with "Show fewer". The toast's dismiss and the DataGrid's column pin wait for attention like every other detail, so they show on touch and under `data-reveal="always"`. On a touch screen every menu and list row (DropdownMenu, ContextMenu, Menubar, Select, Combobox) is 44 px tall, the token `--pui-control-height-touch`; a mouse keeps the dense row. Icon buttons in CodeBlock, FileDiff, DataGrid, Sidebar, RichTextEditor and the charts' frame name themselves in the system Tooltip, which also opens on keyboard focus, instead of the browser's own title box.
* **Beamline works with the shadcn CLI.** `npx shadcn@latest add @beamline/<element>` (or a free element by its address, with no setup) puts the element's source in `src/ui/beamline`, installs the free base from beamline.io and writes the style imports into your stylesheet; shadcn's search and MCP server list every element. A paid element takes your key (account page, "Keys for shadcn"). Each element's Code tab and code page have a shadcn line. See "With the shadcn CLI" in the install guide.

## 0.2.0-rc.31 — 10 October 2026

* **The light band is drawn live.** `LightBand` now turns slowly in depth like a ribbon while it is on screen, its spectrum drifts, and both answer the scroll: the turn deepens and travels with the page, the colours lean the way the page moves, and a pulse of light runs along the band, then everything settles back to the slow turn. Its paths, colours and light are the painted band's. It is WebGL, drawn only on screen and only as often as it changes; at rest it turns for 15 seconds after the page last moved, then holds still and draws nothing, so an idle page costs less than the painted band did. `live={false}` keeps the painted band, and so do pages without WebGL, light pages and reduced motion (still, as before). No change is needed in your code.
* **Charts take the look.** Every chart now draws in the look's language, not only its colours: axis labels in the look's label face (Geist Mono in Prism, engraved capitals in Metal and Blueprint, typewriter in Ink), its grid, zero line and tick marks, its cursor, and its marks. Prism's bars are columns of light with a lit value edge, Soft's stand in a faint column of the brand, Glass's are clearing rods, Metal's are banks of lamps (rings and gauges too), Mono draws a dot matrix (dot cells, block bars, ticked rings), Ink hatches its bars under a pen line, Blueprint drafts them under a ruled value line with square nodes on lines, Pop sets big dots on a bold baseline. Colour and size still carry the data; a stack is one bar. Nothing to change in your code: switch the look and the charts follow.
* **Code without an agent.** On beamline.io the library marks the 27 free elements (a "Free" tag, and an All · Free switch under the search), and a free element's Code tab now shows its source with one terminal line that installs it, no account: `npx … add <element> --install --release …` copies the source and what it uses into `src/ui/beamline` (the app needs Tailwind v4). A paid element's Code tab lists its files and sizes and the price; once your team has Beamline, beamline.io/code/ gives the same line (source or ready-built package, through a 30-minute link) and shows the source. Opening a paid element's source there counts as your team's first install, like installing it.
* **Glass works like iOS 27's Liquid Glass.** Controls, menus, popovers and dialogs now bend what is behind them at their rim, like the edge of thick glass (Chrome, Edge and other Chromium browsers; Safari and Firefox keep the frost), and every glass edge is lit by two crescents of light that the pointer moves. Controls are capsules. A press lights the glass from the point pressed and the button swells toward the pointer; a held slider or switch knob turns into a clear lens over its track. One setting, `--pui-glass-frost` from 0 (clear) to 1 (heavy frost), 0.5 by default, moves every glass part at once, like iOS 27's slider; frost is mostly a tint, so text on glass reads over anything. Cards frost but do not bend, as in iOS, which also keeps scrolling as fast as before. Call Glass's runtime `setup()` (see Install) for the bend and the press light; without it Glass still renders, frosted. Reduced transparency and increased contrast turn the frost up. Other looks are unchanged.
* **Prism's charts are drawn in the light band's own colours.** Series 1–7 are now blue, teal, red, amber, deep blue, coral and sky — the band's hues in its order — instead of a full spectrum with green, yellow, violet and pink. Neighbouring series sit further apart for colour-blind readers (the old green sat too close to teal and amber), and every series keeps 3:1 against the card in dark and light. Other looks are unchanged. Series 3 was green and is now red: a chart that used it to mean "good" should use the status colours instead.
* **Prism's edge flare is bolder.** When the pointer arrives at a card (with edge light on), the split light along its edge now shows in near-full colour, runs further along the edge and draws the line a little thicker while it lasts; more arrivals flare and each holds a moment longer. It still comes only on arrival and fades. Other looks are unchanged.
* **The bottom sheet gives focus back the moment it closes.** Escape, Close, the scrim or a flick now return focus to what opened the sheet at once; it used to wait for the slide to finish (longer on a slow phone) and passed through the page on the way. The sheet still slides away, and takes no taps or focus while it goes. In import mapping on a phone, a column you decide under a filter no longer disappears when its sheet closes.
* **The rich-text editor keeps up with fast typing.** Typing quickly after a heading, list or quote could stop the page with "Maximum update depth exceeded", because each keystroke left one more render queued behind it. An editor whose `onHistoryChange` sets state no longer re-renders without end after the first edit (about 90 times a second, even idle). Each keystroke now renders the editor once and leaves nothing queued.
* **New rows hold still while live data ticks.** Lists that slide their items into place (positions table, watchlist, tag input, multi-select, filter toolbar, breadcrumb, attachments, comment thread) read an update that landed while an item was still growing in as a move, so the item slid off and back: a new position's row and its Close button jumped about 80 px on the first price ticks after the buy. Items now slide only when the layout really moved them.
* **Import mapping holds still while it checks a choice again.** Choosing how dates are read, or what happens to values that can't convert, keeps focus on that choice; it used to drop to the top of the page while the values were checked again. The last answer's example rows stay where they were, dimmed and marked busy (`aria-busy`), until the new answer replaces them; after a reading is chosen, placeholders hold the room its example rows and the "values that can't convert" options will take. Nothing below moves when the answer lands.

## 0.2.0-rc.30 — 8 October 2026

* **Loading keeps the page still.** Metric card, bar list, tracker, category bar and timeline take `loading`: each draws placeholders in its own loaded shape, at its real height, so nothing below moves when the data lands. The analytics dashboard uses them (its loading view was 12–174 px shorter per panel). New in the skeleton family: `SkeletonLine`, one line of text that has not arrived, and `SkeletonGroup` now holds shapes at any depth. Placeholders stop for reduced motion in CSS, so a part that only shows them stays small (about 3.5 KB less per part than reading the look's motion).
* **Streamed answers stop hopping.** A word no longer drops to the next line and back as the next word arrives (paragraphs that stream wrap greedily; the even rag stays for answers that load finished), a table lands whole instead of re-sizing its columns row by row, and cited text no longer jumps a line as each word lands.
* **Small moves now glide.** Reasoning steps grow into place instead of pushing the content below by a row, and its chevron glides as "Searching… 3s" becomes "Searched the web". The price chart's "Loading… 2s" pill eases to its new width; the ticker holds its arrow's place before the first move, so the change badge stays put.
* **Text keeps its size while the font loads.** Until Geist and Inter arrive, text is set in a stand-in matched to their width at each weight (regular, medium, semibold) and to their height, so lines keep their breaks and controls their width when the real face lands. The gallery and beamline.io also ask for Geist with the page itself, so on a slow first visit it is there before the charts draw (no control moved in Bench's slow-4G pass). In your own app, preload the look's Latin font file (`next/font` does this for you).
* Import mapping keeps its status line after the check ("45 of 48 rows will be imported"), so the columns below stay put; the market heatmap's hover card opens under a tile at the top of the screen instead of above it.
* **Light bands answer the scroll.** Each band moves at its own depth as its section passes (`rise` sinks and turns as the hero leaves, `arc` swings in behind the plan, `horizon` grows up from its edge), and a pulse of light runs along it while the page moves. The compositor runs it; nothing runs at rest or under reduced motion. `scroll={false}` keeps the slow turn alone.
* **Sign-in holds an auth service's bot check.** `SignIn` takes `challenge`: the check (Clerk's Turnstile box, for one) renders in the card under Continue, stays across steps and takes no room until it asks; a box wider than a phone's card stays centred.
* Agents: the MCP server's instructions, the AGENTS.md/CLAUDE.md block and the skill that `beamline-connect` writes now say the same five steps, in order, and how to sign in.
* **The kit's finder takes the names you see in code.** `find.mjs --id FormField` (and the local MCP server's `beamline_component`) resolve `FormField → form`, `ColorPicker → color-picker`, `@beamline/data-grid → data-grid`; the hosted MCP has done this since rc.29.

## 0.2.0-rc.29 — 8 October 2026

* **List highlights are back from the first moment.** Since rc.25 the command menu opened with no row lit until you typed; the plate that marks the active row now places itself as the list appears. Select and Time picker's hover plate, which never followed the pointer in a production build, now does.
* **A wide data grid fills its width.** When the columns are narrower than the grid, the widest text column (a name, a client) takes the room instead of an empty band at the end; `columns[].grow` picks another column or keeps one fixed.
* **FormField outside a Form says so.** Instead of react-hook-form's "cannot destructure control of null", it tells you it must sit inside `<Form form={useForm(…)}>`, and what to use for a single field.
* **The audit no longer calls a needed part unused.** A part another part depends on (the sidebar inside `app-shell`) is not flagged for removal.
* Guide: keep Prism unless you ask for another look or your app must match an identity it has. The Next.js notes add the two rules a new app's Cache Components enforce on your own code (read today's date after mount; `usePathname` inside `<Suspense>`) and how `AppShell` and `PageHeader` items navigate client-side.

## 0.2.0-rc.28 — 8 October 2026

* **Fewer renders where a part's element arrives late.** A part whose measured element appears a moment after it (the treemap's plot, inside its frame) keeps its scope's timing and colours until then instead of dropping them and rendering twice; chips in a tag input animate with timing read at their own row. Treemap mounts with 21–74 % fewer renders, tag input with one commit fewer.

## 0.2.0-rc.27 — 8 October 2026

* **One licence for your whole team.** The licence has no seats: everyone who works on your apps, employees and contractors alike, uses Beamline under the one licence you bought (`LICENSE.md`, draft 0.2). Nothing else changes: any number of your own and your clients' apps, commercial ones included; the parts may not be resold as a kit.

## 0.2.0-rc.26 — 8 October 2026

* **Chart axes fit their labels on a slow connection.** Value labels measured before the look's font arrived kept the fallback font's width, so the axis came out a few pixels narrow and its widest label ran past the edge. Labels are measured again when a font finishes loading.

## 0.2.0-rc.25 — 8 October 2026

Faster everywhere, measured with our speed engine. Apart from the heatmap and category-bar fixes below, nothing changes how a part looks or moves.

* **Parts render once when they appear.** Buttons, selects, charts, grids and every other part that reads the look's timing or colours used to render two or three times on arrival while they measured the page. They now start from the values already read in their scope and check them together with every other part in one pass: a screen of buttons renders 58 % less on mount, a data grid 20 % less, charts and selects one or two commits fewer.
* **Switching theme no longer re-renders the page.** Parts that only read their defaults, the motion choice or the row density stay still; parts that draw with the theme's colours (charts, canvases) read again and only those whose values changed render. A data-grid page went from about 2,900 renders per switch to about 300.
* **Charts animate with half the updates.** The axis-label measure no longer forces style work on every frame of a change.
* **A loading activity heatmap is one part, not 2,700.** Its placeholder cells share one visibility and motion check (new `SkeletonGroup` in `skeleton`); mounting costs 60 % less, and the cells now have the plot's own square shape.
* **Category bar labels never overlap.** A boundary too close to its neighbour (99 next to 100 over a 1 % segment) hides; the two ends always show and the legend still names every share.
* **File diffs are 2.7× faster** on a 400-line file, with exactly the same result.
* For your own components: `useScopeMotion()`, `useScopeDensity()` and `useScopeChanges()` read one part of the scope without rendering for the rest; `useResolvedAppearance(ref, { …, typography: false })` skips the host's type when you only need timing or colours.

## 0.2.0-rc.24 — 7 October 2026

* **Settings inside your page end at their last field.** With `navigation="none"` the block no longer keeps empty room for its save bar; the bar takes its place when there is something to save.
* Guide: an app already on an older Beamline release adds `--upgrade` to the install line to move to the new one.

## 0.2.0-rc.23 — 7 October 2026

* **A loading data grid holds its height.** Since rc.21 a grid with a few rows fits them; while loading it showed its skeleton rows at their own height and grew when the data landed. Loading or empty now keep the full `height`.
* **Settings inside your page flow with it.** With `navigation="none"` the block is as tall as its form and the page scrolls, so the save bar floats at the bottom of the window while you edit.

## 0.2.0-rc.22 — 7 October 2026

* **Settings inside your own page.** With `navigation="none"` the settings block sits flush in the page that hosts it: your background, your left edge, your heading. The profile section speaks plainly ("Your name and how to reach you") instead of a team product's words, and `timeZones={[]}` leaves the time zone out.
* **The audit no longer miscounts option lists built at runtime.** A Select fed `[...new Set(currencies)]`, or a list named like one in another file, is no longer reported as "Select with 1 options"; a list spread from a named one (`[ALL, ...options(GOALS)]`) is counted in full.
* Guide: the `analytics-dashboard` block is for a SaaS's own metrics, other homes compose metric cards, a chart and a bar list; filters you show outside a data grid share its state instead of adding a second set.

## 0.2.0-rc.21 — 7 October 2026

* **Fields line up in a row.** A field next to a taller one (its neighbour has help text or an error) keeps its box at the control's height instead of stretching with the row.
* **A data grid's `height` is a ceiling.** A few rows take only their own height; the grid scrolls once its rows pass the height. An empty grid keeps the full height for its message.
* **A required field's name is its label's words.** Inputs, text areas, number, phone, password, select, combobox, segmented control and radio cards announce "required" once, from the control, so `getByLabel("Email", { exact: true })` finds the field. Pickers that open from a button still say it in the label.
* **The phone field shows the country's code, not a flag.** "GB +44" in the look's label type: flags are emoji, and Windows does not draw them.
* **Step form on a phone:** the answers stay under the card, the step list no longer repeats the card's own progress.
* Guide: a form of several screens is the `step-form` block, which is the form element itself (answers in `useState`, each step's `validate`); `form` is for one screen. Its example shows each answer as the person saw it.

## 0.2.0-rc.20 — 7 October 2026

* **Prism has its own material: cut crystal in a dark room.** Parts are drawn by their edges, which catch light from the top left and fade along them; fields are channels cut in, their lower lip lit; cards are slabs lit at the top-left edge over a deep shadow. Corners are crisper, motion rigid and quick, icons finer (1.5), type is Geist throughout with Geist Mono labels and the highlighted word in an Instrument Serif italic. Colour appears only where attention is: one line of split light under the main action while it is pointed at, along the bottom of the field being written in, under the chosen tab, and along a card's edge near the pointer (with edge light on).
* **Prism's split light depends on the angle, like a real prism.** It lives inside the glass: along the main action's bottom edge (with a faint wash rising into its face), along the bottom of the field being written in, under the chosen tab. It comes in long runs of colour with gaps, never one even gradient. Each button has its own angle, the pointer turns it across the face, each press lands on a new part of the spectrum, and a change of word or colour (Save → Saved) sweeps a soft band of split light across once. A field's line lights from the centre out and drifts while focus stays; the tab's line sweeps as it travels; a card's edge flares only as the pointer arrives, each flare its own shape. Still at rest; never under reduced motion.
* **No emoji in the interface.** The audit (and the Claude Code Stop hook with it) makes an emoji in a button, heading, tab or empty state a FIX and names the lucide-react icon to use; a chat's reactions are content and pass.
* **A look brings its own typefaces.** Installing a look installs its fonts (Prism: Geist, Geist Mono, Instrument Serif), so an app shows the look's type without asking; a face loads only where text uses it.

## 0.2.0-rc.19 — 7 October 2026

The complete system contains 190 catalog entries and nine looks. This candidate gives Beamline a default look of its own.

* **Prism, the new default look.** A black page, neutral glass whose facing edges catch white light, and a white main action with near-black words (ink-black on white in light). Colour appears only as light: two faint, far-off corners of the page, amber and blue, and the charts, which keep a natural spectrum whatever the brand. Set `brand` and the main action, focus ring, the agent's orb and the working glow take your colour instead. Installs, new styles and a `UIRoot` with no preset now start from Prism; your app keeps the look it installed.
* **A look's own colour now reaches your app.** `UIRoot` used to apply the blue accent whenever none was asked for, so a look's own default brand never showed under it (Pop's tomato included). Leave `accent` unset to get the look's own; set it, or `brand`, to choose.
* **Light band** (`light-band`): a slow band of split light behind a section, for a hero (`rise`), the plan you sell (`arc`) or a closing call to action (`horizon`). Painted once, it barely moves and only while on screen, and stays still under reduced motion.
* **The free sample's two looks are Prism and Metal.**
* Agents: the Claude Code Stop hook also sends back a screen the session rebuilt only from another component kit.

## 0.2.0-rc.8 – rc.18 — 6 and 7 October 2026

Candidates made while coding agents built real apps with Beamline; each change answers something an agent got wrong. The complete system grew to 189 entries (190 with rc.19's Light band).

* **Choice controls show their label like every field** (rc.15). Segmented control, chip group and radio cards show their label unless `hideLabel`; a view switch or a quick filter passes `hideLabel`. Upgrading changes screens that relied on the hidden label (see UPGRADE.md).
* **Dates.** The calendar's month title opens the years, then the months, so a date of birth is three picks; date pickers take `openTo="years"`, and `minDate`/`maxDate` take `"today"`, read in the browser (rc.10, rc.18). Date and time fields also take `onValueChange`.
* **Next.js.** Beamline builds and prerenders in a stock `create-next-app` project: parts that read the clock read it in the browser only, and the installer names `app/layout.tsx`, the stylesheet import and the `UIRoot` line, with `className="look-page"` so the page itself is painted (rc.11, rc.16).
* **The audit** (`audit.mjs`, and the Claude Code Stop hook) also catches an unlayered CSS reset that strips every part's padding, inline option lists, Tailwind classes with no Tailwind, another kit's parts beside Beamline's, a dark root with nothing painting the page, a look installed but not shown, Checkbox and Switch given `onChange`, and packages installed but unused; the Stop hook sends an agent back when it changed the UI without installing Beamline (rc.12–rc.17).
* **For agents.** The skill reaches every agent that opens the app; MCP answers come in parts small enough to read; the notes say the tools are tool calls, not shell commands; Step form carries a complete typed example (rc.10–18).
* **Install.** When nothing was installed the installer says so plainly and how to fix it; an upgrade removes the earlier release's archives (rc.18).

## 0.2.0-rc.7 — local pre-release candidate, 6 October 2026

The complete system still contains 188 catalog entries, eight looks and eight reference screens. This candidate is about agents: an agent pointed at Beamline now uses the whole system instead of text fields and dropdowns.

* **Agents read the whole menu first.** `CAPABILITIES.md` (in the kit, and from `find.mjs --capabilities`) shows how to choose an element for each kind of data and screen, how to set looks, motion and density, and every element in one line with what to use instead. It ends with the steps to follow.
* **Agents map every field before coding** and keep the table in your app's `BEAMLINE.md`; Input, Select and Card are fallbacks that need a reason.
* **Real API at hand.** `find.mjs --id` prints the import line, required props, every typed prop, the shapes props take, the parts you can style and working examples.
* **A check after building.** `audit.mjs` names native controls, Inputs typed as numbers or dates, Selects with two to five options, hand-made steppers, hand-repainted colours and packages installed but unused.
* **Connect an app once.** `connect.mjs --app <app>` gives every agent that later opens the app the skill, the `beamline` MCP server (Claude Code, Cursor and any MCP client), a Cursor rule and a short block in `AGENTS.md` and `CLAUDE.md`.
* **Choice controls work as form fields.** Segmented control, radio group, radio cards and chip group show their label, help and error like every field, and Slider takes help and an error.
* In the gallery, "Use with my agent" is one button per page with two steps: connect once, copy a short prompt.

## 0.2.0-rc.6 — local pre-release candidate, 6 October 2026

The complete system still contains 188 catalog entries, eight looks and eight reference screens. This candidate changes chart colours only.

* **Every chart colour is readable on its card.** With each look's default brand, chart series 1–7 now keep at least 3:1 contrast against the card in light and dark, in every look (the WCAG level for graphics). In light, the shared palette's amber and green are a step deeper, Pop's lemon prints as gold, and Ink alternates its tints (64 % ink or more) with deep ink so neighbouring series stay apart. Ink's seventh series is now a tone of the ink instead of the shared palette's green; its dark series 3 is a little lighter. Dark colours in the other looks are unchanged. A custom brand's own colour stays exactly as you set it.

## 0.2.0-rc.5 — local pre-release candidate, 5 October 2026

The complete system still contains 188 catalog entries, eight looks and eight reference screens. This candidate carries the owner's decisions on the outside-agent trial (D1–D7 in the spec).

* **Charts draw their own SVG.** Area, line, bar and composed charts no longer use recharts: one shared cartesian layer draws them, with the same geometry (axes, ticks, paths, bars and labels match the earlier drawing on every chart page) and d3-shape's curves as the only chart dependency. Changing stacking, hiding a series or new data now morphs the marks to their new shape; a settled chart does no work, and reduced motion shows every end state at once. The chart engine's 146 KB (gzip) that followed a chart onto the page is gone.
* **Chart colours follow the brand.** Series 2–7 keep their distance in hue from series 1, so a warm brand no longer lands on the amber series. With each look's default brand the colours are unchanged; Pop keeps its named sticker colours and Ink its spot-derived ones whatever the brand.
* **Install state at the app root.** A compiled install keeps its records and archives in the app's `.beamline/` instead of `src/ui/beamline/.beamline/`; an rc.4 app moves on its next `install` (see UPGRADE). Commit the root `.beamline/` with the app. Editable-source state keeps only what recovery and merges need (6.2 MB → 1.7 MB after an upgrade in the trial).
* **Size guards.** The outside-agent trial now fails when its app's first-load JavaScript, CSS or dependency count grows more than 10 % over the figures recorded for this release.
* **Unchanged by decision:** Button keeps Motion behind its deferred features (D2); internal units stay separate packages (D6); foundation stays one stylesheet — a Badge-only app reaches 67 % of it, under the 40 % split rule (D7).

## 0.2.0-rc.4 — local pre-release candidate, 5 October 2026

The complete system still contains 188 catalog entries, eight looks and eight reference screens. This candidate fixes what an outside agent hit building a screen from rc.3, and carries the morph grammar.

* **Installing touches less of the app.** `package.json` lists only what you chose (components, looks, fonts, effects, runtime, foundation); the units they use resolve through `overrides` (npm) or pnpm overrides, registry packages come with the units, and React keeps your range (an rc.3-style install of 16 entries went from 76 entries to 23). An existing rc.3 app is rewritten the same way on its next install. In an npm workspace member the Beamline units are listed directly, because npm applies overrides only at the workspace root.
* **One stylesheet.** Compiled installs write `src/styles/beamline/beamline.css` (fonts, foundation, looks, your custom style, components); import it once. Separate per-component imports brought foundation in again for each: the trial screen's CSS went from 329 KB to 205 KB.
* **Looks add up.** `--preset glass` adds Glass to the recorded looks instead of replacing them, works without entry ids once something is installed, and `remove --preset glass` takes one away (refused while the app still imports it).
* **`style add` leaves an app that builds.** It replaces the root's `preset`, `brand` and other props the appearance sets (and reports them) instead of adding a duplicate spread, and drops a look import that becomes unused. `style set` refuses a token the base look does not declare and names the closest ones.
* **The finder answers every entry, briefly.** Charts, video and the rich-text editor no longer crash `find.mjs --id`; an installed lookup prints three lines before the answer instead of \~21 KB of hashes (`--verbose` keeps them), and `--help` works. Installed packages carry only their own catalog entries and no build-input hashes.
* **Readable CLI output.** Commands print a short summary; `--json` prints JSON only.
* **Landmarks and headings.** App shell's page area is a `main` landmark (a `div` when `contained`, or `mainAs`); Page header tabs that switch pages render a `nav` with `aria-current` instead of tabs pointing at missing panels (`tabsMode`); Card and MetricCard take `headingLevel`.
* **Reduced motion keeps restrained fades** (`--pui-fade-in`/`--pui-fade-out`): dialogs, popovers, menus, Button's label and loader and Skeleton fade; movement stays off; `none` removes the fades too.
* **Lighter first load.** Button and Skeleton load Motion's animation features after the first paint with the same motion; the area, bar, line and composed charts load their chart engine on mount, sharing one chunk.
* DataGrid columns take `aggregateFormat` for the footer figure. INSTALL shows a full-page root (`look-page`).
* **Morph grammar.** A selection travels instead of switching off and on: tab, segmented, sidebar, tree, pagination, radio and calendar indicators move as one solid shaped by the look; overlays, dialogs and the command menu open out of what was pressed and close back into it; task and plan status is one ring that closes into its mark; bars keep their last change in view; a trade fill and a CRM stage move trace to the figures they changed. Each look states how its surfaces move (`--m-morph-*`). The voice orb is an aperture.

## 0.2.0-rc.3 — local pre-release candidate, 4 October 2026

The complete system still contains 188 catalog entries, eight looks and eight reference screens.

* **Combobox groups and a phone sheet.** Options can carry a `group`: the unsearched list shows a heading where the group changes (arrow keys skip it); searching ranks flat and names each row's group. A several-word search matches across label, keywords and description ("billing city"). Below 640 px the list opens as a bottom sheet with its search inside, clear of the on-screen keyboard, and focus returns to the field; `sheetTitle` names the sheet. MultiSelect and other searchable lists get the headings too.
* **ImportMapping** groups nested destination fields under their path, opens choosers as sheets on phones, keeps keyboard focus when a bulk action or Retry finishes its work, and adds one status follow-up once a new choice's checks answer. Its large-schema demo now suggests 47 fields with 2 genuine conflicts.
* **DataGrid** takes caller-owned filters and search: `filters` / `defaultFilters` / `onFiltersChange` and `query` / `defaultQuery` / `onQueryChange`. Uncontrolled use is unchanged.
* **Renewals** filters owners with the grid's own chip, so "Show it" clears only that filter and keeps a search; a labelled static scene compares the screen's plan pane with the conventional filtered list on the same four accounts.
* AllocationEditor type, radii and limit glow read foundation tokens; the radial chart's unfilled track is visible on dark cards.

## 0.2.0-rc.2 — local pre-release candidate, 3 October 2026

The complete system contains 188 catalog entries, eight looks and eight reference screens.

* **Packaged layouts now match the gallery.** Each compiled unit carries its own utilities, so a later unit's plain rule (`.hidden`) used to override an earlier unit's breakpoint (`@3xl:flex`). Breakpoint and container utilities now outrank plain ones regardless of import order, without outranking state variants or host styles. The agent workspace no longer collapses into one narrow column in a browser beside an editor.
* **Right-to-left layouts survive production builds.** Minifiers rewrite `:dir(rtl)` into language lists that miss `dir="rtl"` pages; shipped CSS now selects on the `dir` attribute, so mirrored strips, sliders and panels follow the reading direction after `vite build` as they do in development.
* **Agent workspace** keeps a readable conversation at every width: artifacts sit beside it from 1152 px of container and open from the header below that; threads open from the header on phones; artifacts open on the first tab with content.
* **New: AllocationEditor** (forms) — parts of a fixed whole edited as named zero-sum transfers, with locks, limits, caller rules, named unallocated/over amounts and a save that waits for your handler.
* **New: ImportMapping** (data) — map file columns to one record type, accept suggestions explicitly, resolve ambiguous dates, preview with lineage, import with per-row outcomes and retry only failed rows.
* **New reference screen: Renewals** (F01) — an exact plan snapshot, acknowledged tasks only, owner conflicts that keep successful peers, and a retry of unresolved items only, on a labelled in-memory demo service.
* DataGrid: per-column `currency`, `selectionLabel`, `located` row and `onViewChange`; footer sums of 10,000 or more read compact so they fit. Button keeps a caller's `aria-disabled` focusable and inert. NumberField no longer reads digit-less text as 0. Controls resolve their motion and colour values without a forced style recalculation each.

## 0.2.0-rc.1 — local pre-release candidate, 3 October 2026

The complete system contains 186 catalog entries, eight looks and seven reference screens. Individual selections come from the same source graph; the release manifest gives the exact delivered contents.

* Compiled components, runtime, foundation, selected looks, fonts and helpers are separate canonical packages. Compiled consumers need no host Tailwind. Editable source shares the same runtime and supports selective retrieval, recorded baselines, conflicts and recoverable upgrades.
* Managed appearance scopes share their settings with stable portals and actual DOM/canvas hosts. Typed public parts, native root styles/refs and data-only design defaults cover the catalog. Drafts, selections and existing editor/feed/voice resources retain their ownership through appearance changes.
* Foundation parameters and custom styles can be edited, validated, exported and applied through the matching CLI and optional local studio. Saved preview choices include the exact example, release, appearance, viewport and scenario.
* The free profile sample saves in browser storage, rejects an empty required name, retains a rejected save and supports an optional empty job title. The two richer examples export actual local PNGs with partial-failure retry, and save a scoped evidence investigation with explicit version comparison.
* Asynchronous controls preserve failed drafts and caller-owned state. CRM keeps hidden selections in bulk operations and restores deleted rows without replacing intervening edits. Unpriced and absent observations remain explicit rather than becoming invented zero values.
* The installer supports npm and pnpm, including a workspace app with a separate UI package. The exercised Next App Router subset uses Button, Dialog, Table, pure helpers and explicit CSS. See `LIMITATIONS.md` for exact versions and boundaries.

Migration details are in `UPGRADE.md`. In particular, field `style` targets its visual wrapper while native-input styling uses the documented part; components preserve their native ref targets. The removed legacy MetalFx is not restored. Metal remains a token-based look.

Liquid Gooey's plain mirrored Items honor managed speed/reduction and settle offscreen. Its optional advanced upstream physics modes retain the documented policy/visibility limitation. Browser/provider integrations, external customer outcomes and public sales are not implied by these local checks.

This is an evaluation candidate under the existing draft licence. No price, support promise or public redistribution right is activated by this changelog.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://beamline.gitbook.io/beamline-docs/changelog.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
