@@ -431,18 +431,27 @@ figcaption { font-size: 0.875em; line-height: 1.4285714; color: var(--text-prima
431431 border-bottom: 1px solid var(--border);
432432}
433433.art-bar-title { font-size: var(--text-sm); font-weight: 500; color: var(--text-primary); margin-right: auto; }
434- /* Top-of-page controls: Copy page + prev/next chevrons on the title row. */
435- .page-actions {
436- display: flex; justify-content: flex-end; align-items: center; gap: 2px;
437- margin-bottom: -2.4rem; position: relative; z-index: 2;
434+
435+ /* Multi-page set tabs — the docs' top tab row: muted labels, the current
436+ page in primary with a 2px underline riding the row's hairline. The row
437+ scrolls horizontally (no scrollbar chrome) when the set outgrows the
438+ column, so a long set never wraps or truncates. */
439+ .page-tabs {
440+ display: flex; gap: 1.75rem;
441+ margin: 0 0 2rem;
442+ border-bottom: 1px solid var(--border);
443+ overflow-x: auto; scrollbar-width: none;
438444}
439- .pa-nav {
440- display: inline-flex; align-items: center; justify-content: center;
441- width: 30px; height: 30px; border-radius: 0.5rem;
442- color: var(--text-icon); transition: background-color 0.15s;
445+ .page-tabs::-webkit-scrollbar { display: none; }
446+ .page-tab {
447+ flex-shrink: 0; white-space: nowrap;
448+ padding: 0 0 0.65rem;
449+ font-size: var(--text-sm); color: var(--text-muted);
450+ text-decoration: none;
451+ border-bottom: 2px solid transparent; margin-bottom: -1px;
443452}
444- .pa-nav :hover { background : var(--surface-active ); opacity: 1; }
445- .pa-nav .is-disabled { opacity: 0.35; pointer-events: none ; }
453+ a.page-tab :hover { color : var(--text-body ); opacity: 1; }
454+ .page-tab .is-active { color: var(--text-primary); font-weight: 500; border-bottom-color: var(--text-primary) ; }
446455
447456/* The docs' theme toggle: 30px, rounded-lg, --text-icon, --surface-active hover. */
448457.art-theme {
@@ -474,8 +483,8 @@ figcaption { font-size: 0.875em; line-height: 1.4285714; color: var(--text-prima
474483.toc-track, .toc-thumb { display: block; }
475484.rail ol, .rail ul { list-style: none; margin: 0; padding: 0; }
476485/* Chrome links are navigation, not prose: no underline weight or hover fade. */
477- .rail a, .page-nav-card { font-weight: 400; transition: none; }
478- .rail a:hover, .page-nav-card:hover { opacity: 1; }
486+ .rail a { font-weight: 400; transition: none; }
487+ .rail a:hover { opacity: 1; }
479488
480489.rail[data-rail="toc"] { min-width: 150px; }
481490
@@ -558,7 +567,11 @@ figcaption { font-size: 0.875em; line-height: 1.4285714; color: var(--text-prima
558567 moment step bodies vary in height; a full-height rail that the opaque
559568 circles paint over is what the docs render. */
560569.steps { list-style: none; margin: 1.25rem 0; padding: 0; }
561- .step { --step-marker: 28px; position: relative; display: flex; gap: 1rem; padding-bottom: 1.75rem; }
570+ /* Explicit margin/padding resets: the prose list rules (ol > li's inline-start
571+ indent, li's vertical margins) otherwise leak in — the indent shifts the
572+ circles off the absolutely-positioned rail, and inter-item margins cut gaps
573+ into it. */
574+ .step { --step-marker: 28px; position: relative; display: flex; gap: 1rem; margin: 0; padding: 0 0 1.75rem; }
562575.step:last-child { padding-bottom: 0.25rem; }
563576/* The rail spans the whole step, dead-centered under the circle; the last
564577 step draws none, so the line ends AT the final circle. */
@@ -596,23 +609,6 @@ figcaption { font-size: 0.875em; line-height: 1.4285714; color: var(--text-prima
596609.codetab.is-active { background: var(--surface-active); color: var(--text-primary); }
597610.codetabs-head .codetabs-copy { position: static; margin-left: auto; }
598611
599- /* API method chips — sidebar entries only, the docs' reference nav. */
600-
601- /* Footer pagination — the docs' PageFooter verbatim: name + chevron on a
602- hover pill (mt-12 flex gap-2 py-3; cards flex-1 gap-1.5 rounded-lg px-3
603- py-3 text-sm --text-body, hover --surface-active; chevrons 14px
604- --text-icon; a missing side keeps its half as a spacer). */
605- .page-nav { display: flex; gap: 0.5rem; margin-top: 3rem; padding: 0.75rem 0; }
606- .page-nav-card {
607- flex: 1; display: flex; align-items: center; gap: 0.375rem; min-width: 0;
608- border-radius: 0.5rem; padding: 0.75rem;
609- font-size: var(--text-sm); font-weight: 400; color: var(--text-body);
610- text-decoration: none; transition: background-color 0.2s;
611- }
612- .page-nav-card:hover { background: var(--surface-active); opacity: 1; }
613- .page-nav-card.next { justify-content: flex-end; }
614- .page-nav-card svg { flex-shrink: 0; color: var(--text-icon); }
615- .page-nav-spacer { flex: 1; }
616612` . trim ( )
617613
618614/**
@@ -803,29 +799,6 @@ export const SIM_ARTIFACT_SHELL = `<script>
803799 }
804800 cols.append(mid, right)
805801
806- // Top-of-page controls: prev/next chevrons on the title row, wired to
807- // the same targets as the footer cards.
808- const CHEV_L = '<svg ' + ICON_ATTRS + '><path d="M13.25 3L6.25 10.25L13.25 17.5"/></svg>'
809- const CHEV_R = '<svg ' + ICON_ATTRS + '><path d="M6.25 3L13.25 10.25L6.25 17.5"/></svg>'
810- const actions = document.createElement('div')
811- actions.className = 'page-actions'
812- const prevCard = page.querySelector('.page-nav-card.prev')
813- const nextCard = page.querySelector('.page-nav-card.next')
814- if (prevCard || nextCard) {
815- const mkNav = (card, svg, label) => {
816- const a = document.createElement('a')
817- a.className = 'pa-nav'
818- a.setAttribute('aria-label', label)
819- const href = card ? card.getAttribute('href') : null
820- if (href) a.href = href
821- else a.classList.add('is-disabled')
822- a.innerHTML = svg
823- return a
824- }
825- actions.append(mkNav(prevCard, CHEV_L, 'Previous page'), mkNav(nextCard, CHEV_R, 'Next page'))
826- }
827- if (actions.childElementCount > 0) mid.insertBefore(actions, mid.firstChild)
828-
829802 // Clerk track geometry (fumadocs clerk.js): one path threading every item,
830803 // vertical through each and a cubic easing across depth changes.
831804 const lineOffset = (depth) => (depth === '2' ? 8 : 16)
0 commit comments