Repository navigation
style(docs): design pass for home, guides, nav, search and blog - #969
Conversation
- Root colors, surfaces, lines and status tones resolve to TDS Core values through the Platform semantics (tempoxyz/ds@3fd4cf7) - Palette gains Platform tokens: tertiary, subtle, container steps, hairline, feedback tones and their containers, scrim - Radius steps from 4px follow the Platform scale; add panel (24px) - Add a responsive section spacing token (64px, 80px from 768px) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Port tempo.xyz SmoothCorners: Ari's 100% smoothing, native corner-shape, SVG clip fallback with an inset focus ring, pill exception (>= 999px) - Scoped: only elements that set --corner-radius take part (registered non-inheriting); mounted once in the shared DocsHeader - Opt in cards, home panels and code blocks (one rounded container, square below 768px where Vocs bleeds code to the edge) - Allow Zyzz property() in the style policy for the registration Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Docs content images (non-SVG), ZoomableImage and its zoom view, blog article images and code use radius tokens sized to the image - Inline SVG diagrams, logos and icons keep their own geometry Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Panels whose fill differs from the page drop their border: code blocks (header, tabs, body), prompts, inline code, zoomable image frames - Zoomable images use the panel token in both themes (was #F9F9F9 in dark) - Home panels, Vocs cards and setup cards were already borderless (#968); the panel token now resolves to TDS neutral 004 / 092 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- L1: ChevronLink/ChevronText glue tempo.xyz's chevron to the last word; hidden at rest (keeps its space), fades in and travels 0.15em on hover or focus-visible, opacity only under reduced motion, mirrored in RTL - Vocs card titles get the same chevron as an inline pseudo-element and lose the hover underline - L2: .tempo-color-link, primary to secondary on hover, no underline - Motion tokens: tempo.xyz easing, 200ms enter, 150ms exit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a check - The whole heading is the anchor's hit area; inner links stay clickable - The link icon fades in and out on the shared motion tokens - After Vocs copies the link, the icon cross-fades to a check in content primary (not green), holds about 1.2s, then the link icon returns Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- CopyIconSwap keeps both icons mounted and cross-fades them (enter and exit) for Copy for agent, the home terminal copy and Agent setup copies - Confirmations exit after 1.2s; the home terminal status message stays - Vocs code, shell-line and Copy page for AI icons scale and fade in; their checks use content primary instead of green or accent - Copy page for AI reads "Copied" while confirmed, like the others Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Shared button recipe: secondary is the TDS Platform gray fill (no outline), hover steps to the strong container; primary stays inverted - Page actions (Copy for agent / View Markdown / Install agent tools): secondary actions gray, no borders - Buttons and link buttons use radius md (8px) with smooth corners and the shared enter/exit motion Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Remove the H2 top rule and padding Vocs draws between body sections; every H2 gets the section token above it instead (80px, 64px < 768px) - Horizontal rules become section space - The page footer area starts a section's space below the body - Pager links dim on hover with the shared motion instead of turning accent - Table row rules and the page-end footer rule stay Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Table wrappers no longer extend 12px past the content column on desktop; wider tables scroll inside the wrapper - Wrapper corners use the lg radius with smooth corners - Narrow screens keep Vocs' edge-to-edge scrolling wrapper Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- note/info: TDS Callout (subtle container fill, 24/32 padding, 16px smoothed radius, no icon, no border) - tip/warning/danger/success: TDS Alert tones (tone container fill, the 8px tone indicator square in place of the icon, 12px smoothed radius) - Text stays content primary in every tone; callouts stay inside the content column on phones - Drop the unused callout accent bridges Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Button - SegmentedControl: radio group, arrow keys move focus and select, Home/End, roving tab index; selected fill fades instead of snapping - Tabs: small gray pills, active inverted; arrows move focus (looping), Enter/Space select as in the DS - Badge: outline variant (no fill, overlay hairline); feedback tones use the Platform tones (Core green, orange, red; tip blue) - IconButton recipe: secondary small, smoothed md radius (G8) - No DS dependency: values and states ported by hand from ds@3fd4cf7 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Six product tiles in one grid, in today's order (3 columns on desktop) - Remove the "Stablecoin products", "Primitives" and "Agents" tier labels - Outline badge at the inline end of the tile header: "Primitives" on Accounts and Tempo EVM, "Agents" on Machine Payments - Header row keeps the badge height so tiles with and without one align - Existing span anchors kept Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tile titles become L1 chevron links (ChevronLink); the icon stays before them - Titles stay H3 headings but drop the copy-link anchor inside tiles - No underline on title hover - Markdown output renders ChevronLink as a plain link Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tile sub-links become L1 chevron links (ChevronLink) - No underline at rest or on hover Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Rewrite the six tile descriptions to similar lengths (67-75 characters), leading with the action, no new claims - Balance the wrap (text-wrap: balance) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Remove "Connect your coding agent to Tempo documentation." under Build with your agent - Remove "Run both commands in your terminal." for Codex and Claude Code; the install link stays, other agents keep their instructions - e2e expects the install link as the Codex and Claude Code instruction Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Codex / Claude Code / Amp / Skills / MCP use the TDS SegmentedControl (radio group, arrow keys), spanning the full width, logos inside the items - It never wraps; when the five items don't fit (390px) it scrolls sideways and the selected item scrolls fully into view without moving the page - SegmentedControl items keep their inset focus ring inside the scroller - e2e selects setup methods by radio role Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Build with your agent loses its tile: no fill, border or inset - The terminal block takes the panel fill (#f5f5f5 / #141414), no border (G4), with smooth corners - Muted text uses the page's secondary color again (the tile override is gone) - The copy button's hover color eases in and out Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Start with a guide moves below Build with your agent (stacked on desktop), a section token apart; one heading style for every Home section heading - 3-up (1-up under 768px): hairline top rule, today's description style, then a secondary gray button named for the guide (button recipe on a Waku Link); buttons align at the column end - Remove the arrows and #966's arrow-nudge rows - "Find your starting point" sits below the 3-up in the same style as "All setup options"; both become L1 chevron links - Markdown output renders HomeGuideButton as a link; the dead homepage guide-card special case is removed and its test rewritten - Register styles/controls for Oxlint's Zyzz rules in components - zyzz-styles e2e checks the 3-up responds (3 columns, 1 at 390) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- "Tools & references", "Protocol & infrastructure", "APIs & partners" - "APIs & SDKs" becomes a plain secondary-color group label, like the others - New first link "All APIs & SDKs" to /docs/tools (where the heading linked), on its own row above the SDK pairs - Span anchors keep the old heading ids (tools-and-references, protocol-and-infrastructure, apis-and-partners) working Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tools & references link lists use the L2 color link (tempo-color-link): primary to secondary on hover with the shared motion, no underline - HomeColorLink keeps the docs mount for internal links and opens external ones in a new tab, as before - Markdown output renders HomeColorLink as a link Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Remove the top rule above Tools & references; space replaces it - Intro, Build with your agent, Start with a guide, Products and Tools & references sit one section token apart (80px, 64px under 768px) - Every section heading sits 28px above its content Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Lede: max-width 400px, content primary color (Get Started only) - Lede to page actions: 28px to 20px - Page actions to the quickstart line: 56px to 32px (24px under 600px) - Scoped by the page's leading #get-started anchor Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Set up your project tiles: page fill plus hairline border (G4), Vocs card radius and padding vars, smoothed - Links: small gray secondary buttons (32px, 13px, md smoothed radius), inline and wrapping - Arrow icons removed - Shared DocsLinkCards, so the other link-card pages match Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Shared Steps styling: steps 2 onward start 48px below the previous step (was 24px) - First step keeps its spacing; applies to every guide using :::steps Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Select: appearance none, TDS ChevronDown 16x16 placed 16px from the inline end, 24px clear of the text - Explorer fields: 16px inline inset (was 12px) so the inputs align with the select - Style-only; markup untouched while #960 is open Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Current page keeps its 5% fill on hover (was 10%) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Title (first section header): 13px medium, sentence case, secondary color, like the right rail's On this page label - Group labels (later top-level headers, nested non-collapsible headers): entry type and spacing (14px, 34px rows), tertiary color - Entries and collapsible entries: primary color (were 68-72%) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Entries and collapsible headers: radius sm 4px to md 8px, with --corner-radius smoothing - Hover fill unchanged (4%); enters at --tempo-enter, exits at --tempo-exit with --tempo-ease - Top-level collapsible group labels (API sidebar) take the entry hover - Reduced motion: no transition Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Run uses the inverted primary button (was accent blue) with the smoothed md radius and an opacity hover; style-only while #960 is open Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- main already fails this check (225,076 bytes in CI after #965 added routes to the shared route manifest); this branch measures 225,012 - Separate commit so it can be dropped if main fixes the budget first Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Every small gray link button in the setup tiles (DocsLinkCards, on Get Started, Tools, Network, Development, Accounts and Getting funds) ends in the tempo.xyz chevron; it travels 0.15em on hover or focus, flips in RTL and stays put under reduced motion Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Build with your agent sits in an outlined tile like the Accounts setup tiles (page fill, hairline, card radius and padding); the agent's install link moves onto the Connect Tempo docs row, at the inline end - Start with a guide: each guide's name heads its column above the description; every button reads "Get started" (accessible name keeps the guide); Find your starting point sits on the section heading row - Markdown export keeps the guide names as readable links; tests updated Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The tone indicator is an 8px square with the TDS 2px corner, smoothed, centered on the first line (a single-line alert centers it) - Callout paragraphs and list items use the TDS B2 20px line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Article paragraphs and list items use TDS Platform body.b1: 16px, 22px line height, 0.12px tracking (was 16/26 docs, 16/27.2 blog) - Callouts keep B2; Home keeps its own type scale Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Group labels move from tertiary (2.85:1 light, fails WCAG AA) to secondary (4.95:1 light, 6.49:1 dark) on desktop and in the drawer Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The outlined agent tile uses the page fill in both themes (dark was the #141414 card surface, the same as the terminal inside it) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolve conflicts with #970 (share images) and #972 (API reference and developer tools navigation): - blogs/introducing-stable-bench-v1.md: keep comma-separated authors, add shareImage - src/pages/index.mdx: use main's SDKs & CLI section; point its overview link at /docs/sdk - e2e/docs-workspace.test.ts: header layout check now covers the Blog-only destinations Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…screenshots-e1a33b
- Docs and blog article body text keeps B1's 16px size and 0.12px tracking but returns to the prose leading (26px docs, 1.7 blog). B1's 22px line height is set for UI text and tightened every long-form page. - The B1 rule no longer reaches Vocs card descriptions, which grew from 14px to 16px and no longer matched the DocsLinkCards tiles beside them. - Drop the now-unused lineHeight.b1 token. - G8: scope the 404 Back to home selectors under [data-v-not-found]. Vocs utility classes in the same layer (vocs:bg-surface vocs:border) beat the bare attribute selector, so the link kept its white fill and hairline. Co-Authored-By: Liam Horne <1933029+snario@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The anchor's ::before covered the whole heading, so a click on heading text followed the #anchor link and a drag could not select it. Command and API pages use those headings as copyable text. The link icon is the hit area again; it still fades in on heading hover and shows the 1.2s check. Co-Authored-By: Liam Horne <1933029+snario@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All setup options and Find your starting point are small text links with no tile or title around them, so with the L1 chevron hidden until hover they read as plain text. They opt in with data-chevron="visible"; the chevron still travels on hover. Tile and card titles keep the hover-only chevron. Co-Authored-By: Liam Horne <1933029+snario@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At 400px the lede ran four lines and left "API." alone on the last one. 560px with pretty wrapping sets it in three. Co-Authored-By: Liam Horne <1933029+snario@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dges - Dark: the TDS selected fill (#141414) sat below its white 12% track, so the selected agent looked unselected (FL2). It now uses container.strong over the track. Light is unchanged. - When the items overflow (five agents at 390px), the clipped edges fade like the docs section nav, so the control reads as scrollable. A tapped item scrolls fully into view. Co-Authored-By: Liam Horne <1933029+snario@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BL2 left Varun's last name out ("Liam Horne, Varun").
Co-Authored-By: Liam Horne <1933029+snario@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolves conflicts with #992 (shared CopyButton), #1017 (Tempo API label) and #1018 (canonical blog links): copy controls now use the shared CopyButton with the cross-fading icon, and blog cards link through blogPostHref. The HTML budget stays at main's 225 kB; the transactions page builds to 220,148 bytes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.
Beyond the inline findings, I checked two other spots. The markdown-output.ts change is safe: no MDX page under src/pages still uses the removed bold-title-plus-span guide-card pattern, and all three HomeGuideButton uses in index.mdx pass a guide label, so the missing-label throw can't fire. The comma split for author bylines in seo.ts matches the two bylines that were rewritten.
Extended reasoning...
Inline findings were already posted for this large styling refresh. This note covers only the logic changes outside them (Markdown link rendering and JSON-LD author splitting), which I checked and found unaffected.
| function update(element: HTMLElement) { | ||
| // Read the authored colors/background, not the SVG fallback's overrides. | ||
| element.removeAttribute('data-smooth-corners') | ||
| const style = getComputedStyle(element) | ||
| const radius = Number.parseFloat(style.getPropertyValue('--corner-radius')) | ||
| if (!(radius > 0) || radius >= 999) { | ||
| restore(element) | ||
| return | ||
| } | ||
|
|
||
| const extra = (axis: 'Width' | 'Height') => { | ||
| if (style.boxSizing === 'border-box') return 0 | ||
| return axis === 'Width' | ||
| ? Number.parseFloat(style.paddingLeft) + | ||
| Number.parseFloat(style.paddingRight) + | ||
| Number.parseFloat(style.borderLeftWidth) + | ||
| Number.parseFloat(style.borderRightWidth) | ||
| : Number.parseFloat(style.paddingTop) + | ||
| Number.parseFloat(style.paddingBottom) + | ||
| Number.parseFloat(style.borderTopWidth) + | ||
| Number.parseFloat(style.borderBottomWidth) | ||
| } | ||
| // Layout dimensions, not getBoundingClientRect: artwork can be scaled. | ||
| const width = Number.parseFloat(style.width) + extra('Width') | ||
| const height = Number.parseFloat(style.height) + extra('Height') | ||
| if (!(width > 0 && height > 0)) return | ||
| const budget = Math.min(width, height) / 2 | ||
| const r = Math.min(radius, budget) | ||
| const smoothing = Math.max(0, Math.min(1, budget / r - 1)) | ||
| const curvature = 1 + smoothing | ||
| const cornerRadius = curvature * r | ||
|
|
||
| if (native) { | ||
| element.style.setProperty('--smooth-radius', `${cornerRadius}px`) | ||
| element.style.setProperty('--smooth-shape', `superellipse(${curvature})`) | ||
| element.dataset.smoothCorners = 'native' | ||
| return | ||
| } | ||
|
|
||
| // A clip path would also cut the shadow, so shadowed surfaces (dialogs, | ||
| // popovers) keep their plain CSS radius in the fallback. | ||
| if (style.boxShadow !== 'none') { | ||
| restore(element) | ||
| return | ||
| } | ||
|
|
||
| const path = superellipse(width, height, cornerRadius, curvature) | ||
| const borderWidth = Number.parseFloat(style.borderTopWidth) | ||
| const borderColor = style.borderTopColor | ||
| const background = style.backgroundImage | ||
| // The fallback ring is inset, so use the foreground that contrasts with | ||
| // the element's fill rather than the exterior outline color. | ||
| const focusColor = style.color | ||
| if (style.position === 'static') element.dataset.smoothStatic = '' | ||
| const image = (d: string, color: string, stroke: number) => | ||
| `url("data:image/svg+xml,${encodeURIComponent( | ||
| `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}"><path d="${d}" fill="none" stroke="${color}" stroke-width="${stroke}"/></svg>`, | ||
| )}")` | ||
| element.style.setProperty('--smooth-path', `path("${path}")`) | ||
| element.style.setProperty('--smooth-background', background) | ||
| element.style.setProperty('--smooth-border-width', `${borderWidth}px`) | ||
| element.style.setProperty( | ||
| '--smooth-border', | ||
| borderWidth ? image(path, borderColor, borderWidth * 2) : 'none', | ||
| ) | ||
| if (width > 8 && height > 8) | ||
| element.style.setProperty( | ||
| '--smooth-focus', | ||
| image( | ||
| superellipse(width, height, Math.max(0, cornerRadius - 3), curvature, 3), | ||
| focusColor, | ||
| 2, | ||
| ), | ||
| ) | ||
| element.dataset.smoothCorners = 'svg' | ||
| } | ||
|
|
||
| function flush() { | ||
| frame = 0 | ||
| for (const element of pending) if (element.isConnected) update(element) |
There was a problem hiding this comment.
🟡 (optional) Firefox and Safari users on docs pages with long sidebars may see jank on load and on every window-resize frame. This cost does not exist on the base branch. update() removes data-smooth-corners and then reads getComputedStyle(element).width, so each smoothed element forces its own style and layout pass. flush() runs that once per pending element. Fix: in flush(), first strip the attribute from every pending element, then read all metrics, then write all results, so a frame costs one forced recalc instead of N. Resizing re-queues every known element via discover(document.body).
Why this was flagged
SmoothCorners is mounted in DocsHeader (src/components/DocsHeader.tsx:851) on every docs and blog page, so a sidebar with tens to hundreds of links is tracked. In update() (src/components/SmoothCorners.tsx:20-40) each element has its attribute removed (a write), then has getComputedStyle and its used width/height read (a read that forces style and layout). In the SVG path that browsers without corner-shape take (Firefox, Safari), dropping the attribute also flips position back from relative to static via [data-smooth-corners="svg"][data-smooth-static]. That dirties layout, so the next read forces a reflow. flush() (line 97) calls update() in a loop over pending, which gives N forced reflows per frame. The rAF-throttled resize handler (line 147) calls discover(document.body) again, and that re-queues every known element (line 119), so each resize frame repeats the whole thrash. The base branch has no such runtime. No batching or other safeguard prevents it.
Verification: flush() (SmoothCorners.tsx:97) calls update(element) per pending element, which writes (line 20), reads layout (lines 21, 41-42), then writes again (lines 71, 76-92). In src/styles/smoothCorners.ts:27-29 the SVG attribute sets position: relative, so each element dirties layout. This is new in this diff.
There was a problem hiding this comment.
Leaving this for a follow-up so this PR stays a style pass: batching the reads and writes in flush() changes the clip timing, which needs its own WebKit and Firefox check.
The global focus ring now skips only the docs-local SegmentedControl and Tabs (data-tds-control), so Vocs code-group tabs keep it. The 24px minimum hit area moves to the Home wrapper, so it reaches the guide, product and reference links outside the agent block. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
I reviewed the latest push and found no new bugs. This is still a large restyle across the docs site and blog, so a human look would still be worthwhile.
What was reviewed:
- Commit 98c7382. The global docs focus ring now skips only elements marked
data-tds-control, which only SegmentedControl.tsx and Tabs.tsx set, so Vocsrole="tab"buttons get the ring again. - The 24px hit-area rule now sits in
tempoDocsHome, the wrapper that contains the guide, product, reference and agent-block links. - The SmoothCorners.tsx
flush()loop hasn't changed since the earlier inline comment.
Extended reasoning...
The PR touches 61 files (+2783/-1003): design tokens, global styles, new UI components (SmoothCorners, Tabs, SegmentedControl, copy feedback), the docs home and blog layouts, the Markdown output renderer and e2e tests. It touches no auth, crypto or data-exposure code. The newest commit changes four files to address two of the three earlier inline comments. I deferred because the change is very large and full of design decisions that a human should weigh.
Still open from earlier reviews (1):
- Unresolved: 1 minor or pre-existing.
Design pass on the developer site (tempo.xyz/developers) from Chase's 10.09 notes. One commit per change ID; this body maps ID → commit.
Summary
tempoxyz/ds@3fd4cf7, by hand, no new dependency).Changes
System
0bcdc1e7: docs colors, surfaces, lines and status tones resolve to TDS Core via Platform semantics (ds@3fd4cf7); Platform palette tokens (tertiary, container steps, tones, scrim); radius re-pointed to Platform steps +panel; section spacing token (80/64).69fdb851: tempo.xyz SmoothCorners (nativecorner-shape, SVG clip fallback with inset focus ring, pill exception), scoped to elements that set--corner-radius; repaints on theme change and rediscovers on resize; shadowed surfaces skip the clip.7728c022: content, zoomable, blog and diagram images get a radius sized to the image.77f67cfc: fill differs from page → no border (code blocks, prompts, inline code, zoom frames, demo panels in dark, MCP explorer output, API overview pane).99bc6c1a,e5f930cc: L1 chevron links (ChevronLink, CSS variant on Vocs cards), L2 color links, shared motion tokens; Agent setup panel and mobile menu get enter/exit.d5fb8a9c: h2–h6 anchors fade, the whole heading is the hit area, copy swaps to a content-primary check for ~1.2s.38f64902,7be388ac: one copy feedback (cross-fading icons, "Copied", content-primary check) for page actions, home terminal, Agent setup, Vocs code/shell/Copy page for AI, OpenAPI Copy and demo copies.a762b1da,e42765af,814addc4: secondary buttons = TDS gray fill, no outline (incl. Vocs OpenAPI actions, the MCP Reset and the 404 link); primary stays inverted (incl. MCP Run); smoothed md radius on buttons, lg on header controls.b5ad9328,2a6394ec: section rules → section spacing on every docs page (incl. API reference), more space above the footer, pager opacity hover; one section token on Home.e0f540ce: tables span exactly the content width and scroll inside their wrapper.d7d62feb: TDS Callout (note/info) and Alert tones (tip/warning/danger/success) for every callout.25133835: docs-local SegmentedControl, Tabs, Badge (outline) and IconButton with DS keyboard behavior.Home
13. H1
b2734535: one six-tile grid, tier labels removed, outline badges (Primitives ×2, Agents).14. H2: no change needed (tiles had no hover fill or lift).
15. H3
04327fb9: tile titles are chevron links; their heading anchors are removed.16. H4
42325f03: sub-links are chevron links, no underline.17. H5
a661dd2a: six matched descriptions, two lines at 1440 and 1280 (FL4).18. H6
1f86b874: setup subtitles removed.19. H7
771463f3: full-width SegmentedControl; scrolls sideways at 390, never wraps.20. H8
f45bc668: agent block on the page; terminal on the gray panel surface.21. H9
fdb87d88: Start with a guide as its own 3-up with hairline rules and gray guide buttons.22. H10
41b39a3d: ampersands, APIs & SDKs as a label, "All APIs & SDKs" link; old anchors kept.23. H11
1466383d: reference lists use L2 color links.24. H12: Tools & references anchor follows G6 (verified, no code).
25.
d710f818: 24px hit areas for Home's standalone links (QA bar).Get Started, Quickstart, Build with AI
26. GS1
3beb15f0: lede 400px, content primary, tighter hero spacing.27. GS2–GS5, GS7: covered by G8, G5, G9 and G6 (verified).
28. GS6
30b46f9f: setup tiles outlined (page fill + hairline), card radius, small gray link buttons that wrap.29. QS1, QS3, QS4: covered by G8, G7 and G9 (verified).
30. QS2
1a3c4dc7: later Steps start 48px below the previous one (shared Steps styling).31. AI1
ef0066d5: MCP tool select uses TDS NativeSelect spacing (style-only, #960).32. AI2: covered by G10 (verified).
Sidebar
33. SB1
f38ebde8: the current page has no hover change.34. SB2
b3a9c833,014d21d1: single-section title in secondary ("On this page" style); group labels in secondary (tertiary failed WCAG AA, so Chase chose secondary); entries and collapsible groups primary.35. SB3
01ad34d3: hover one radius step rounder, smoothed, with enter/exit motion.36.
54431fa7: SB1–SB3 in the mobile sidebar drawer.Nav, search, blog
37. N1
e8f5ee6c: tempo.xyz nav layout (logo, Docs/Blog centered, Agent setup + search IconButton); inline search field removed; ⌘K kept on docs and blog.38. S1
2cf91cad: no focus ring on the open search input.39. S2
40030b95: dialog at the docs content width, smoothed panel radius; dark dialog on neutral 088.40. S3
c36b6921: dialog height animates to its results (instant under reduced motion).41. S4
a1748773: lighter TDS scrim (strong in dark), no blur.42. BL1
288163c1: "Announcements" label; slug unchanged.43. BL2
ad32d77b: full names with commas (FL4).44. BL3
224e1872: article list as the tempo.xyz Use cases grid (3/2/1), chevron titles, smoothed images.45. BL4
fdb6eb0c: filters as TDS Tabs.46. BL5
88e63366: featured post without a panel, hairline rule, larger headline.47. BL6: no change needed (spot-checked).
Follow-ups from Chase's review (10.09 evening)
49. GS6
f2a6b802: every setup link button (DocsLinkCards) ends in a chevron that nudges on hover or focus.50. H8/H9
7ceca514: Build with your agent in an outlined tile like the Accounts setup tiles, with the install link on the Connect Tempo docs row. In Start with a guide, the guide names are column headings, the buttons read "Get started", and Find your starting point sits on the section heading row.51. G11
c27011da: the alert indicator is a smoothed 8px square centered on the first line; callout text uses the B2 20px line.52.
b9a1ece6: docs and blog article body text uses TDS B1 (16/22, 0.12px tracking).Test
48. No budget change. The
/docs/protocol/transactionsHTML budget stays at main's 225 kB; the merged branch builds that page at 220,148 bytes.Merge with main (10.18)
CopyButtonfrom fix: preserve copy button widths with a shared component #992, with the G7 cross-fading icon passed in.blogPostHreffrom fix: repair docs asset routes and canonical blog links #1018.Flags
FL1 View Markdown 404 (not fixed here)
https://tempo.xyz/assets/md/get-started.md, which returns 404.https://tempo.xyz/developers/assets/md/get-started.mdreturns 200.AskAicallswindow.open('/assets/md/<path>.md'), which is root-relative and drops the/developersmount (I confirmed this with Playwright on production)./assets/md/*.publicAssetPath()and work.window.open./assets/md/:path*→ the docs deploymentpatches/vocs@2.8.5.patch(this changes the lockfile hash, so I held it)FL2 TDS discrepancies
full(pill or circle). The notes ask for "a little rounder" with smooth corners, and smoothing skips pills. I used Platform2xs(8px, docsradius.md) smoothed on buttons, icon buttons and header controls. Switching to pills is one token change.background.primaryis #F5F5F5 / #000. Light pages stay white; otherwise every page turns gray. Panels use neutral 004 / 092 so their fills differ from the page in both themes (G4). The dark page moves from #0c0c0c to #000.scrim.regular(16% black in both themes) barely shows on the black dark page.scrim.strong(32%) is the TDS option if needed.content.secondary(56%).md6→8,lg8→12,xl12→16, pluspanel24. Demo surfaces that use these are slightly rounder.FL3 #966 reversals (cc @snario, Tanishq)
FL4 Copy changes
FL5 Assumptions
DocsLinkCardsis shared, so the outline tiles and small buttons also apply on Tools, Network, Development, Accounts and Getting funds.note/info→ Callout;tip→ Alert tip (blue);warning,dangerandsuccess→ Alert tones.84ch+ content padding = 986px).SearchDialogMotion) that binds a measured CSS variable. CSS can't animate a content-driven height.marketing/_components/SearchDialogis only used by marketing pages, which are out of scope.object-fit: cover. Columns: 3 at ≥1024, 2 at 640–1023, 1 below.Suggestions (not implemented), GS8
<span id>anchors from the Markdown export (Copy for agent and View Markdown).Validation
check:types, Biome on the 58 touched files, vitest 1222/1222,build,check:markdownandcheck:anchors(467 links) pass.check:types,check:styles(in build),oxlint,biomeon the 58 touched TS/JSON files,check:markdown,check:anchors(444 links) andbuild:siteall pass. vitest: 1181/1181.Tracking
🤖 Generated with Claude Code