Version Packages - #1312
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
🚀 Deploy PreviewsUpdated 2026-07-14 03:40 UTC
|
ngrok-mantle-release-bot
Bot
force-pushed
the
changeset-release/main
branch
3 times, most recently
from
July 14, 2026 02:32
cf14029 to
b21b00c
Compare
ngrok-mantle-release-bot
Bot
force-pushed
the
changeset-release/main
branch
from
July 14, 2026 03:38
b21b00c to
076d717
Compare
cody-dot-js
approved these changes
Jul 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@ngrok/mantle@0.78.0
Minor Changes
#1313
2f5ddc9Thanks @cody-dot-js! - AddBreadcrumb, hierarchy-path navigation at@ngrok/mantle/breadcrumbfollowing the WAI-ARIA APG breadcrumb pattern: six compound parts —Breadcrumb.Root(a<nav>landmark labeled"Breadcrumb"by default, overridable viaaria-labelfor localization or multiple trails),Breadcrumb.List(an<ol>whose order conveys the hierarchy),Breadcrumb.Item(<li>crumbs),Breadcrumb.Link(a router-agnostic<a>that composes onto framework links like react-router'sLinkviaasChild),Breadcrumb.Page(a<span>witharia-current="page"marking the current, non-link crumb), andBreadcrumb.Separator(arole="presentation"+aria-hiddendivider defaulting to a caret icon, replaceable with custom children like a slash). Every part supportsasChild. Documented at https://mantle.ngrok.com/components/navigation/breadcrumb. Purely additive — no changes to existing components.#1313
2f5ddc9Thanks @cody-dot-js! - AddCenteredLayout— mantle's first published layout primitive, at@ngrok/mantle/centered-layoutand documented at https://mantle.ngrok.com/layouts/centered-layout. It is a viewport-filling centered page flow for sign-in, sign-up, onboarding, 404, checkout, and other focused full-page states, consolidating the centered "auth shell" duplicated across ngrok's dashboard and login apps. Four parts:CenteredLayout.Root(themin-h-fullflex frame),CenteredLayout.Header(an optional semantic<header>utility strip for account chips and close buttons — mergesticky top-0 z-10viaclassNameto pin it to the window while the page scrolls),CenteredLayout.Body(the growing centered region — by convention the fully-styled brand mark is its first child, and the primary content follows as composed JSX; there is deliberately noLogoorContentpart because they would own nothing), andCenteredLayout.Footer(a pinned semantic<footer>utility strip outside the centered region). Landmark semantics stay compositional: when the layout owns the document, compose mantle'sMaindirectly inBodyand pair aSkipToMainLinkas the first child ofRoot. It owns structure only — app state never enters it; links, brand marks, and landmarks arrive as composed JSX. New export, purely additive: no impact on existing consumers.#1313
2f5ddc9Thanks @cody-dot-js! - AddThemeSwitcherandThemeDropdownMenuRadioGroupat@ngrok/mantle/theme-switcher— the canonical picker UI over mantle's theme system (ThemeProvider+useTheme).ThemeSwitcheris a compact standalone picker: a ghostIconButtontrigger (overridableappearanceand accessiblelabelprops) with an SSR-safe icon — aSkeletonuntil hydration, thenAutoThemeIconmatching the applied theme — that opens aDropdownMenuof the five themes.ThemeDropdownMenuRadioGroupis the five-themeDropdownMenu.RadioGroupit hosts, embeddable in any existing menu (e.g. an account-menuThemesubmenu) so long as it renders inside aDropdownMenu.ContentorDropdownMenu.SubContent. Documented at https://mantle.ngrok.com/components/forms/theme-switcher. This consolidates the near-identical theme-switcher copies across ngrok's apps (dashboard, login, docs site) onto one shipped, tested component.Patch Changes
#1313
2f5ddc9Thanks @cody-dot-js! - Docs-only: correctBreadcrumb.Separator's JSDoc to describe the actual default children — the size-3.5Icon-wrapped caret — after the sizing rework.#1315
f9445f5Thanks @cody-dot-js! - Add a unifiedsizeprop to the button family:Buttongainssize(xs | sm | md | lg | xl, defaultmd) andIconButton's existing scale grows to match (lgandxljoinxs | sm | md). The scale is shared — the same size name always renders the same box height on both components (xs24px,sm28px,md36px,lg40px,xl48px) — and the newButtonSizetype is exported from@ngrok/mantle/button.SplitButton.Rootalso acceptssizeand drives both of its halves through context, so the primary action and menu trigger always share one height;SplitButton.PrimaryActiondeliberately does not acceptsize.Buttonsizehas no effect whenappearance="link"(link buttons inherit surrounding typography and have no box to size) anddata-sizeis not emitted for link buttons.IconButtonnow always emitsdata-size(previously omitted whensizewas not passed);Buttonemitsdata-sizetoo, andSplitButton.Root's wrapper div gains adata-sizeattribute. Only the box scales — typography and icon glyph size are the same at every size. Purely additive: the defaultmdrenders exactly whatButtonrendered before. Seedecisions/2026-07-13-button-size-and-intent-api.md.#1288
9d988f2Thanks @dependabot! - Bump runtime dependencies:@ariakit/reactto 0.4.32,@tanstack/react-virtualto 3.14.6, and the Radix UI primitives to their latest patch releases (react-dialog1.1.19,react-dropdown-menu2.1.20,react-hover-card1.1.19,react-popover1.1.19,react-progress1.1.12,react-select2.3.3,react-slider1.4.3,react-switch1.3.3,react-tabs1.1.17,react-tooltip1.2.12). Thetailwindcsspeer range floor moves from ^4.3.1 to ^4.3.2.#1310
21c8e35Thanks @cody-dot-js! - Update every JSDoc@seelink to the reorganized docs URLs. Component docs now live atmantle.ngrok.com/components/<category>/<name>(e.g./components/actions/button); the old flat URLs permanently redirect, so previously published links keep working. Also fixes a handful of@seelinks that pointed at pages that never existed (/components/progress,/components/theme-provider,/components/button-group,/components/calendar). No runtime changes.#1288
9d988f2Thanks @dependabot! -MultiSelect.Contentno longer applies Ariakit's body scroll lock when its trigger lives inside a mantle modal (Dialog,Sheet,AlertDialog) — the modal already locks body scroll. Starting with@ariakit/react0.4.30, the redundant lock snapshotted the body's inline style (including the modal's transientpointer-events: none) and re-applied that stale snapshot on the animation frame after unmount, permanently freezing the page after closing a modal that contained an opened multi-select. Consumers can still override via thepreventBodyScrollprop.#1310
21c8e35Thanks @cody-dot-js! - Fix incorrect RadioGroup JSDoc@exampleblocks: the change handler isonChange(Headless UI), notonValueChange; the namespace object is not renderable (<RadioGroup.Root>, not<RadioGroup>); andRadioGroup.ButtonGrouprenders the radio group itself, so the examples no longer nest it insideRadioGroup.Root— that composition binds the buttons to an inner, uncontrolled group and silently ignores outervalue/onChangeprops. Documentation only, no runtime changes.#1313
2f5ddc9Thanks @cody-dot-js! -Slotnow concatenatesdata-slotvalues in DOM order instead of letting the child clobber the composing parent's: the parent part's slot chain comes first, then the child's own (e.g.data-slot="breadcrumb-item breadcrumb-page"). Parts that join their incomingdata-slotprop with their own slot name (Breadcrumb and CenteredLayout do, more to follow) accumulate the full chain through arbitrarily deepasChildcomposition.@ngrok/mantle-server-syntax-highlighter@1.1.7
Patch Changes
9d988f2Thanks @dependabot! - Bump runtime dependencies:shikito 4.3.1 andoxc-parserto 0.139.0.@ngrok/mantle-vite-plugins@1.0.17
Patch Changes
#1288
9d988f2Thanks @dependabot! - Raise the optionalvitepeer range floor from ^8.0.16 to ^8.1.4 to match the workspace's Vite version.#1313
2f5ddc9Thanks @cody-dot-js! - Addbreadcrumb,centered-layout, andtheme-switchertoMANTLE_COMPONENT_NAMESsomantleTwSourcePluginrecognizes imports of the new@ngrok/mantlesubpaths and emits their@sourcedirectives — without this, apps importing the new components would silently get no Tailwind classes for them.Updated dependencies [
9d988f2]: