Release notes for @ngrok/mantle, generated from the package's CHANGELOG.md via changesets. The same content is available as plain markdown at /changelog.md for agent and tooling consumption.
See also the npm version history and the GitHub releases.
acd0c55 Thanks @cody-dot-js! - Add OtpInput, a compound component for capturing one-time passcodes (OTP). Built on top of input-otp, it renders a single hidden input that handles paste, autofill, and IME correctly while displaying each character in its own styled slot. Composes as OtpInput.Root > OtpInput.Group > OtpInput.Slot with optional OtpInput.Separator between groups. Re-exports the REGEXP_ONLY_DIGITS, REGEXP_ONLY_CHARS, and REGEXP_ONLY_DIGITS_AND_CHARS pattern helpers for restricting accepted characters.#1166 4f35862 Thanks @cody-dot-js! - Significantly expand JSDoc coverage across the package to improve agentic and IntelliSense-driven discovery. Every index.ts barrel now ships a @see link to its docs page. All hooks (useCallbackRef, useCopyToClipboard, useDebouncedCallback, useIsomorphicLayoutEffect, useMatchesMediaQuery, usePrefersReducedMotion, useRandomStableId, useScrollBehavior, useUndoRedo) now document @param, @returns, and at least one @example. Compound components (Dialog, Sheet, AlertDialog, Tooltip, Popover, HoverCard, Select, Combobox, MultiSelect, DataTable) gained "when to use vs alternatives" guidance on their top-level namespace JSDoc, full-tree @example blocks across sub-components, and explicit notes on required setup (TooltipProvider mount, useReactTable instance for DataTable.Root, etc.). Also removes the empty "./date-picker" export from package.json (it had no implementation and was never importable). No runtime behavior changes.
#1161 913acb6 Thanks @cody-dot-js! - Expand JSDoc coverage on Skeleton, Badge, Code, Kbd, MediaObject, Anchor, Flag, Label, PasswordInput, and the top-level DataTable (full layout examples — sortable+filterable+paginated, sticky action column, and clickable-row-with-Link). All follow the same template as the flagship components: a one-line summary, a "When to use / When not to use" block, accessibility notes where relevant, and @examples with imports. No runtime behavior changes — IntelliSense surfaces more guidance for both human contributors and AI agents using the library.
#1155 0f0b607 Thanks @dependabot! - Update tailwindcss and @tailwindcss/vite to 4.2.4.
#1152 01b04f4 Thanks @forzalupo! - Clean up CodeBlock copy button placement and wrapper sizing so it aligns consistently within the code block.
#1160 60d8c53 Thanks @cody-dot-js! - DataTable.Row now auto-applies cursor-pointer when an onClick handler is provided, so consumers no longer need to add it manually. Pass a different cursor-* class via className (for example, cursor-wait) to override.
#1160 60d8c53 Thanks @cody-dot-js! - Fix useComposedRefs returning a thunk (() => (node) => void) instead of a ref callback, which meant the composed ref never actually received the DOM node. The hook now returns a stable ref callback that reads the latest refs via an internal ref box, so passed refs stay up-to-date without causing ref thrashing on every render.
#1160 60d8c53 Thanks @cody-dot-js! - Breaking: useCopyToClipboard now returns the async copy function directly instead of a [state, copyFn] tuple. The internal useState that tracked the last copied value has been removed, eliminating an extra render per successful copy.
1// Before2const [, copyToClipboard] = useCopyToClipboard();3 4// After5const copyToClipboard = useCopyToClipboard();#1148 6085190 Thanks @cody-dot-js! - Add missing data-slot attributes across the component library so every exported component and compound sub-part exposes a stable data-slot="<name>" (or data-slot="<name>-<part>") styling hook. Also adds asChild support (via Slot) to Empty.Root, Empty.Actions, Code, and ButtonGroup.
Components updated include (non-exhaustive): Main, SkipToMainLink, Empty, CodeBlock, Tabs, TextArea, Toast/Toaster, Separator, HorizontalSeparatorGroup, Sheet, Skeleton, Switch, Table, Label, MediaObject, Popover, RadioGroup, Select, Flag, HoverCard, Icon, SvgOnly, Input/PasswordInput, Kbd, DescriptionList, Dialog, DropdownMenu, DataTable, MetaKey, CursorPagination, ProgressBar, and ProgressDonut. HoverCard.Trigger, Dialog.Trigger/Dialog.Close, and DropdownMenu.Trigger are now thin wrappers around their underlying Radix primitives so they can carry a data-slot attribute.
Note: ProgressBar's existing data-slot values were renamed to follow the compound-component naming convention — data-slot="progress" → data-slot="progress-bar" and data-slot="progress-indicator" → data-slot="progress-bar-indicator". Consumers styling against those specific values will need to update their selectors.
#1150 e623364 Thanks @cody-dot-js! - Anchors (<a> elements, including those rendered by the Anchor component) that are descendants of Alert.Root now inherit the alert's variant text color (e.g. text-warning-700 inside a warning alert) and are underlined at all times — not just on hover. This keeps inline links visually coherent with the surrounding alert copy while still marking them as links.
Visual change: consumers that currently render links inside Alert.Root will see those links shift from the default text-accent-600 to the alert's priority color, and the underline will be persistent rather than hover-only.
#1150 e623364 Thanks @cody-dot-js! - Add "when to use" guidance and WAI-ARIA cross-references to the Tooltip, Popover, and HoverCard compound-namespace JSDoc so editor hover tips surface the correct component for each use case.
#1147 5e3aca7 Thanks @cody-dot-js! - Add SkipToMainLink and Main components for accessible "skip to main content" navigation. SkipToMainLink is a visually-hidden-until-focused link that uses the browser History API directly, so it works in any framework (React Router, Next.js, plain HTML). Main renders a focusable <main id="main" tabIndex={-1}> landmark designed to pair with it.
Also registers a new z-max utility (backed by --z-index-max: 2147483647, i.e. int32 max) so consumers can stack elements above any other z-index layer.
4d35209 Thanks @forzalupo! - Internal: switch === undefined / !== undefined checks to == null / != null for consistency with the project's nullish-equality style. No behavior change.545a09d Thanks @dependabot! - Bump @ariakit/react from 0.4.25 to 0.4.26#1141 f82feb8 Thanks @cody-dot-js! - Add a Composition section to every compound component doc page showing the structural tree of its parts (ASCII art). Rename existing asChild-style Composition sections on Badge, Button, IconButton, Separator, and SplitButton to Polymorphism. Rename the Input children-composition section to Child Elements and the Dialog tooltip section to Combining with a Tooltip to avoid colliding with the new Composition name.
Add the same ASCII composition tree as a @example Composition block to the top-level namespace JSDoc of every compound component (Accordion, Alert, AlertDialog, Card, CodeBlock, Combobox, Command, CursorPagination, DataTable, DescriptionList, Dialog, DropdownMenu, Empty, HoverCard, MediaObject, MultiSelect, Popover, ProgressBar, ProgressDonut, RadioGroup, Select, Sheet, SplitButton, Table, Tabs, Toast, Tooltip) so consumers and LLMs see the full structural shape at a glance in IDE IntelliSense.
#1141 f82feb8 Thanks @cody-dot-js! - Expand JSDoc coverage across CodeBlock, Command, Dialog, Empty, Popover, Select, and Sheet compound components and their sub-parts for improved IntelliSense and documentation.
#1141 f82feb8 Thanks @cody-dot-js! - Fix several code fence metastring parsing bugs in mantleCodeRehypePlugin:
mantleShowLineNumbers, mantleCollapsible, and mantleDisableCopy are now stringified on HAST <pre> properties. Previously, boolean false values were dropped during HAST→JSX compilation, causing showLineNumbers=false fence meta to be silently ignored (the rendered <pre> ended up with data-mantle-line-numbers="true" and no left padding).collapsible=true, collapsible=false, and collapsible="true" in fence meta are no longer silently dropped. The collapsible key now accepts the same bare-flag, key-value, and quoted-value forms as disableCopy.title="first" title="second"), getMetaValue now returns the last value, matching parseMetastring semantics. Previously it returned the first.tokenizeMetastring now splits on tabs, newlines, and carriage returns in addition to spaces. Previously only literal spaces were treated as token separators, so meta like title="Foo"\tcollapsible was lexed as a single token.3f06774 Thanks @cody-dot-js! - Add new Empty compound component for rendering empty states. Includes Empty.Root, Empty.Icon, Empty.Title, Empty.Description, and Empty.Actions sub-components.5bde2bb Thanks @cody-dot-js! - Fix InputContainer focus ring flicker by preventing mousedown default on non-input children. Use flushSync in PasswordInput to animate the eye icon inline in the click handler after React commits the new icon to the DOM. Remove pointer-events-none from validation feedback icons.c0ea674 Thanks @cody-dot-js! - Fix Input focus ring showing as black when clicking the PasswordInput visibility toggle by using focus-within for both ring size and color. Add a blink animation to the PasswordInput eye icon toggle that respects prefers-reduced-motion.#1130 8c7866b Thanks @cody-dot-js! - fix(table): switch to border-separate for continuous sticky column indicator
Replaced border-collapse with border-separate border-spacing-0 on Table.Element and moved row dividers from group-level borders (divide-y on <thead>/<tbody>/<tfoot>) to cell-level borders. This prevents table cells from clipping overflow content, allowing the StickyColIndicator shadow strip to extend across row boundaries and render as one continuous vertical line instead of per-row segments with visible gaps.
Also changed overscroll-none to overscroll-x-none on the table scroll container so vertical page scrolling is no longer blocked when hovering over a table.
#1122 327d46c Thanks @cody-dot-js! - Fix table horizontal scroll masking, improve scroll perf, and add DataTable.ActionHeader.
Table.Root: Split into outer wrapper (border, rounded corners, background) and inner scroll container (scroll-fade-x mask, overflow-x: auto, overflow-y: clip, overscroll-behavior: none). Tables only scroll horizontally and no longer bounce.DataTable.ActionCell / DataTable.ActionHeader).DataTable.ActionCell: Replaced per-cell box-shadow with bg-inherit and a StickyColIndicator child span (1px divider + soft leftward gradient). Tracks the row's background including hover state.DataTable.ActionHeader (new): Sticky <th> that pairs with DataTable.ActionCell so the pinned action column aligns across header and body rows during horizontal scroll.useHorizontalOverflowObserver: Now tracks scrolledToStart, coalesces rapid-fire scroll/resize/mutation events via requestAnimationFrame, and uses useLayoutEffect so corrections apply before the browser paints.See migrations/data-table-action-header-migration.md for migration guidance.
0c20cf7 Thanks @cody-dot-js! - Default showLineNumbers to true in mantleCode() and highlightWithMantleShiki() so code blocks show line numbers by default. Single-line shell snippets (bash, sh, shell) default to false since line numbers add noise to one-liners like install commands.5b0be5a Thanks @cody-dot-js! - no-op patch to verify publish CI#1114 d46e3b3 Thanks @forzalupo! - Improve contrast in code block syntax highlighting
#1112 ad24f11 Thanks @cody-dot-js! - Add README documentation for npm packages, switch to ES2025 preset
ab6da43 Thanks @forzalupo! - Mantle theme updates: updates the functional colors, and modifies the color treatments across various components. It also adds font smoothing globally, while retaining the "auto" setting for Family, for a perceived higher weight.#1099 4a81875 Thanks @cody-dot-js! - Bump dependencies: @ariakit/react to 0.4.24, browserslist to 4.28.2, tailwindcss peer to ^4.2.2
#1082 383d538 Thanks @dependabot! - Update ariakit and headlessui
#1104 2be1db1 Thanks @forzalupo! - Polish component styles: soften card/popover/dialog hover backgrounds with color-mix(), update SplitButton menu item icon placement and gap, use bg-active-menu-item in Command palette, reduce table header height, improve Combobox item icon sizing, and flatten DataTable ActionCell layout.
#1106 41ce842 Thanks @forzalupo! - Themed code block with granular syntax highlighting: richer Shiki token color palette, semantic background tokens (bg-card/bg-base), redesigned copy button using IconButton, and subtler tab trigger styling. Server highlighter adds fine-grained token scope mappings for types, variables, operators, attributes, properties, and escape characters.
f27c01f Thanks @cody-dot-js! - CodeBlock: replace PrismJS with Shiki for build-time syntax highlighting, removing Shiki/Prism from the browser bundle#1089 36e5921 Thanks @cody-dot-js! - Tabs: use fade mask instead of shadow for horizontal overflow
#1089 36e5921 Thanks @cody-dot-js! - fix(tabs): correct border width and focus ring clipping in horizontal classic tabs
#1089 36e5921 Thanks @cody-dot-js! - fix(tabs): remove bottom border from horizontal classic tab list
#1088 54743f1 Thanks @forzalupo! - MultiSelect: polish styling
#1071 c32a7d2 Thanks @dependabot! - Bundle prismjs into the code-block dist output to fix ReferenceError: Prism is not defined with Vite 8 / Rollup 4. Previously, prismjs component files (plain IIFEs with no module.exports) were left as external imports, and Rollup had no visibility into their implicit dependency on the prismjs main module — causing it to evaluate a component before window.Prism was set. Bundling prismjs directly resolves the ordering issue transparently for all consuming apps.
#1086 537de55 Thanks @cody-dot-js! - Add horizontal overflow scrolling to Tabs.List with scroll-position-aware edge shadows. When the tab list overflows its container it scrolls horizontally; fade shadows appear on whichever sides have hidden content and disappear when you reach an edge or when there is no overflow. Keyboard arrow-key navigation smoothly scrolls the focused trigger into view. Scroll bounce is disabled on the list.
#1076 582bec9 Thanks @cody-dot-js! - Add --spacing-em (1em) theme token for font-relative sizing utilities like size-em, w-em, h-em
#1076 582bec9 Thanks @cody-dot-js! - Add default width="2.61em" height="1em" to NgrokWordmarkIcon and width="1em" height="1em" to NgrokLettermarkIcon so they render at font size without requiring explicit sizing classes
284aaa9 Thanks @cody-dot-js! - Update NgrokLettermarkIcon dimensions5dcc9be Thanks @cody-dot-js! - Rename NgrokIcon to NgrokWordmarkIcon and add new NgrokLettermarkIcon1b0e722 Thanks @dependabot! - Bump @ariakit/react dependency.#1064 24ffd25 Thanks @cody-dot-js! - Decompose Command.Dialog into a Root/Trigger/Content namespace.
Breaking change: Command.Dialog is now a compound namespace instead of a monolithic component. Migrate existing usage:
- <Command.Dialog open={open} onOpenChange={setOpen}>
- <Command.Input placeholder="..." />
- <Command.List>...</Command.List>
- </Command.Dialog>
+ <Command.Dialog.Root open={open} onOpenChange={setOpen}>
+ <Command.Dialog.Content>
+ <Command.Input placeholder="..." />
+ <Command.List>...</Command.List>
+ </Command.Dialog.Content>
+ </Command.Dialog.Root>
The new Command.Dialog.Trigger sub-component allows opening the dialog from a button without managing open state manually:
1<Command.Dialog.Root>2 <Command.Dialog.Trigger asChild>3 <Button type="button">Open Command Palette</Button>4 </Command.Dialog.Trigger>5 <Command.Dialog.Content>6 <Command.Input placeholder="Type a command or search..." />7 <Command.List>...</Command.List>8 </Command.Dialog.Content>9</Command.Dialog.Root>Also fixes two bugs:
Command.Dialog now correctly closes on Escape key press.Command.Separator now automatically hides when all adjacent groups are filtered out.930e5fb Thanks @cody-dot-js! - Export fixMediaScriptContent from @ngrok/mantle/theme. This function returns the raw JavaScript string for the inline <script> that fixes theme stylesheet media attributes — useful for legacy Go services and other non-React servers that need to inline it directly into SSR HTML.714c79e Thanks @cody-dot-js! - fix(use-copy-to-clipboard): remove unnecessary async wrapper, guarantee polyfill DOM cleanup#1048 ca1ce98 Thanks @cody-dot-js! - fix(code-block): restore syntax highlight token styles to mantle.css
The .token.* styles were moved out of mantle.css into a colocated
syntax-highlight.css imported as a side-effect in code-block.tsx.
However, tsdown extracts CSS imports into a sidecar file without emitting
a corresponding import in the bundled JS, so consuming apps never loaded
the styles. Moved the token styles back into mantle.css where they are
reliably included.
#1038 00fda43 Thanks @cody-dot-js! - Breaking: MantleStylesheets is renamed to MantleStyleSheets (and MantleStylesheetsProps → MantleStyleSheetsProps).
The component no longer imports CSS ?url paths internally. Instead, pass the browser-accessible CSS URLs as required props using the new mantleStyleSheetUrls helper, which collects the three Vite ?url imports into a spreadable object:
1// Before2import { MantleStylesheets } from "@ngrok/mantle/theme";3<MantleStylesheets nonce={nonce} ssrCookie={ssrCookie} />;4 5// After6import darkCssUrl from "@ngrok/mantle/mantle-dark.css?url";7import darkHighContrastCssUrl from "@ngrok/mantle/mantle-dark-high-contrast.css?url";8import lightHighContrastCssUrl from "@ngrok/mantle/mantle-light-high-contrast.css?url";9import { mantleStyleSheetUrls, MantleStyleSheets } from "@ngrok/mantle/theme";10 11const themeUrls = mantleStyleSheetUrls({12 darkCssUrl,13 lightHighContrastCssUrl,14 darkHighContrastCssUrl,15});16 17<MantleStyleSheets {...themeUrls} nonce={nonce} ssrCookie={ssrCookie} />;This fixes a build error (Unknown file extension ".css") in apps using React Router's SSR build, where ?url imports inside node_modules are not transformed by Vite.
When forceTheme is set to a non-light theme, only the link tag for that theme is rendered — the others are omitted to avoid unnecessary network requests. forceTheme="light" renders no link tags since light is the base theme with no dedicated lazy stylesheet.
#1036 1521814 Thanks @cody-dot-js! - Move syntax highlight token styles into the code-block component
The .token.* CSS rules for syntax highlighting were previously included unconditionally in mantle.css, adding to the critical CSS payload for all pages even those with no code blocks.
These styles are now colocated in packages/mantle/src/components/code-block/syntax-highlight.css and imported as a side-effect from code-block.tsx. Vite bundles them as a CSS chunk associated with the code-block module — apps that never import @ngrok/mantle/code-block no longer pay the cost, and apps that do get the styles automatically.
#1036 1521814 Thanks @cody-dot-js! - Add MantleStylesheets component and split dark/high-contrast themes into separate CSS files
New: MantleStylesheets
A new component exported from @ngrok/mantle/theme that renders <link rel="stylesheet"> tags for the dark, light-high-contrast, and dark-high-contrast theme CSS files. Each stylesheet is gated behind a media attribute matching its OS preference, making it non-render-blocking for users whose OS does not match.
Place it in <head>, immediately after <PreventWrongThemeFlashScript>:
1<head>2 <PreventWrongThemeFlashScript nonce={nonce} />3 <MantleStylesheets nonce={nonce} ssrCookie={loaderData?.ssrCookie} />4</head>Props:
forceTheme?: ResolvedTheme — force a specific theme's stylesheet to media="all" unconditionally (e.g. for a dark-only app)ssrCookie?: string — pass the extracted theme cookie (via extractThemeCookie) so the server renders the correct media attribute directly in SSR HTML, eliminating FOUC for users with a manually-selected non-system themenonce?: string — CSP nonce for the inline fix scriptAn inline <script> is rendered after the <link> tags. It runs synchronously before first paint and corrects any media attributes based on html[data-applied-theme] set by PreventWrongThemeFlashScript, covering cases where ssrCookie is not provided. On the client, a MutationObserver watches html[data-applied-theme] to keep media attributes in sync as the user changes their theme.
New CSS exports
Three new CSS files are now exported from @ngrok/mantle:
@ngrok/mantle/mantle-dark.css — dark theme custom properties@ngrok/mantle/mantle-light-high-contrast.css — light high-contrast theme custom properties@ngrok/mantle/mantle-dark-high-contrast.css — dark high-contrast theme custom propertiesThese files contain only CSS custom property blocks and do not need to be added to your app's @import chain — MantleStylesheets handles loading them via <link> tags. mantle.css continues to hold the light theme and all Tailwind directives and must remain in your CSS @import chain as before.
#1036 1521814 Thanks @cody-dot-js! - Add @ngrok/mantle-vite-plugins package and source-all.css, optimize mantle.css
New: @ngrok/mantle-vite-plugins
A new package that exports mantleSourcePlugin — a Vite plugin that writes targeted Tailwind @source directives into your global CSS file for only the @ngrok/mantle components your app actually imports. Scans .ts, .tsx, .js, .jsx, .mdx, and .md files. Uses a disk-write approach (required because @tailwindcss/vite reads CSS from disk at startup before Vite's transform pipeline runs).
New: @ngrok/mantle/source-all.css
A zero-configuration alternative to mantleSourcePlugin. Import it alongside mantle.css to tell Tailwind to scan all mantle component dist files:
1@import "@ngrok/mantle/mantle.css";2@import "@ngrok/mantle/source-all.css";Use this for apps that import most or all mantle components. Use mantleSourcePlugin for apps that import a subset and want the smallest possible CSS output.
mantle.css optimizations
@source "../dist" — source scanning is now opt-in via source-all.css or mantleSourcePlugin--color-gray-* in light/dark themes using var(--color-neutral-*) aliasesneutral-50–neutral-900, all red-* shades) that were identical to Tailwind v4 defaults--background-color-base, etc.) from @theme {} to @theme inline {} to stop generating unused utility classes like bg-background-color-base949ec0f Thanks @cody-dot-js! - Update font-display policy for core fonts: roobert and jetbrains-mono (normal) use swap, italic faces (jetbrains-mono-italic, family-italic) use optional, family-regular stays fallback.#1032 b9a04cc Thanks @cody-dot-js! - Add preloadFontLink(name: CoreFontName): string — returns an HTTP Link header value that preloads a single core font. Sending preload hints as response headers lets the browser start fetching fonts before it parses any HTML, improving LCP on mobile.
Remove MantleThemeHeadContent and PreloadCoreFonts.
Migration: use PreventWrongThemeFlashScript in <head> and preloadFontLink in your HTTP response headers. For apps without header control, use individual PreloadFont elements instead.
1// entry.server.tsx — send font preloads as HTTP Link headers2import { assetsCdnOrigin, preloadFontLink } from "@ngrok/mantle/theme";3 4responseHeaders.set(5 "Link",6 [7 `<${assetsCdnOrigin}>; rel=preconnect; crossorigin`,8 preloadFontLink("roobert"),9 preloadFontLink("jetbrains-mono"),10 preloadFontLink("family-regular"),11 ].join(", "),12);1// root.tsx — only the FOUC script in <head>2import { PreventWrongThemeFlashScript } from "@ngrok/mantle/theme";3 4<head>5 <PreventWrongThemeFlashScript nonce={nonce} />6</head>;1// Non-SSR fallback — no header control2import { PreloadFont, PreventWrongThemeFlashScript } from "@ngrok/mantle/theme";3 4<head>5 <PreventWrongThemeFlashScript nonce={nonce} />6 <PreloadFont name="roobert" />7 <PreloadFont name="jetbrains-mono" />8 <PreloadFont name="family-regular" />9</head>;2b740bb Thanks @cody-dot-js! - export PreventWrongThemeFlashScript0dac608 Thanks @cody-dot-js! - Improve code block utility performance by speeding up indentation normalization and fmtCode, adding LRU caching for repeated syntax highlighting, and replacing linear language/indentation lookups with set membership checks. Also normalize CRLF input correctly, rename the indentation normalizer to normalize-indentation, and guard line-number expansion against excessively large ranges.
#1028 11f4575 Thanks @cody-dot-js! - add individual PreloadFont component, preload a core font by name
#1023 bc1bc6c Thanks @cody-dot-js! - multi-select.tsx
Escape at the multi-select trigger leveldialog/primitive.tsx
onInteractOutside / onPointerDownOutside prompt-protectionpreventCloseOnNestedPopupEscape(...)aria-expanded="true" + aria-controlsdialog.tsx
onInteractOutside / onPointerDownOutside wrapperssheet.tsx
onInteractOutside / onPointerDownOutside wrappersalert-dialog.tsx
onInteractOutside / onPointerDownOutside wrappers#1004 b04e08f Thanks @dependabot! - Update dependencies: tailwind, ariakit, react-day-picker
#1021 aab7d30 Thanks @cody-dot-js! - Swap from tsup to tsdown (6.2x speedup)
#1022 df6d158 Thanks @cody-dot-js! - Fix MultiSelect.Content inside modal Sheet, Dialog, and AlertDialog containers so it works with the default modal behavior without requiring modal={false}.
612171b Thanks @cody-dot-js! - Add MultiSelect component#1000 56a5245 Thanks @cody-dot-js! - Add @ngrok/mantle/utils export and new useInView hook.
Breaking changes:
@ngrok/mantle/compose-refs is removed. Import composeRefs from @ngrok/mantle/utils and useComposedRefs from @ngrok/mantle/hooks instead.@ngrok/mantle/utils/sorting is removed. Import sorting utilities from @ngrok/mantle/utils instead.New exports at @ngrok/mantle/utils:
inView(element, onStart, options) — framework-agnostic IntersectionObserver helper that calls onStart when an element enters the viewport. If onStart returns a function, it is called when the element leaves. Returns a cleanup function that disconnects the observer.composeRefs and useComposedRefs — moved from @ngrok/mantle/compose-refs.@ngrok/mantle/utils/sorting.New hook at @ngrok/mantle/hooks:
useInView(ref, options) — React hook that returns true when the referenced element is visible in the viewport. Supports root, margin, amount, once, and initial options.#1001 922a053 Thanks @cody-dot-js! - Address review feedback from PR #1000.
inView: call observer.unobserve(element) before observer.disconnect() in the cleanup function for cleaner teardown.useInView: restore intentional omission of isInView from useEffect deps (matching the upstream motion implementation); replace the bare eslint-disable comment with an explanation of why including isInView would cause the observer to restart on every visibility change.tsup.config.ts: exclude compose-refs and sorting from individual build entries since they are now consolidated into the ./utils export.hooks.mdx: fix missing forwardRef import in the useComposedRefs code example.hooks.mdx: remove inView from the hooks page; it now has a dedicated page under the new Utils section.hooks.mdx: add a live interactive demo for useInView.major (breaking changes) and clarify useComposedRefs migration path to @ngrok/mantle/hooks.use-in-view.test.tsx test coverage for the useInView hook.cx, color, inView, composeRefs, and sorting.#1002 f6e8271 Thanks @cody-dot-js! - Add optional icon prop to Alert.DismissIconButton.
The dismiss button now accepts an icon prop (ReactNode) to render a custom icon in place of the default X icon.
#999 4ebf12b Thanks @dependabot! - Bump tsconfig target/lib to ES2023
#994 c4d9812 Thanks @dependabot! - Bump up min version of tailwind
#990 16c731a Thanks @cody-dot-js! - update to tailwind 4.2.0
#988 7e59d87 Thanks @cody-dot-js! - Update dropdown, select, and combobox menu item styling
ce626cc Thanks @cody-dot-js! - Slider: Add color prop to customize the range fill color (defaults to "bg-accent-500"), and showTicks prop to render tick marks at each step interval. Also adds --color-card-border and --color-card-border-muted semantic color tokens.#980 c2735ed Thanks @dependabot! - Fix accessibility and linting issues in Input and RadioGroup.InputSandbox: replace aria-disabled/aria-invalid CSS hooks on wrapper divs with data-disabled, add role="none" to presentational wrapper divs
#984 b3a32ec Thanks @cody-dot-js! - Change font-display from swap to fallback in all @font-face declarations to eliminate layout shift (font bounce) while still downloading and caching fonts for subsequent loads
#981 e43df1c Thanks @cody-dot-js! - Bump up Slider thumb shadow to shadow-md (from shadow-sm)
#980 c2735ed Thanks @dependabot! - Update tailwind-merge
#974 623935c Thanks @cody-dot-js! - Remove AutoScrollToHash component and useAutoScrollToHash hook. This also removes react-router as a peer dependency of @ngrok/mantle. If you were using AutoScrollToHash, move the implementation into your app directly.
#973 a8ff1c9 Thanks @cody-dot-js! - Add NgrokIcon to Icons
#979 68cc794 Thanks @cody-dot-js! - Add new Slider component, supports single, range, and multiple use cases
#971 5781aae Thanks @cody-dot-js! - Fix doc block links
#978 286fab3 Thanks @cody-dot-js! - Fix jerky accordion close animation. Moved spacing from padding-top on the animated container to margin-top on the first child so it collapses smoothly with the height animation.
#974 623935c Thanks @cody-dot-js! - Add explicit generic type parameters to isValidElement calls in Button and Slot for React 19 type compatibility. React 19 changed ReactElement.props from any to unknown, requiring explicit type annotations to access props safely. This change is fully backwards compatible with React 18.
#978 286fab3 Thanks @cody-dot-js! - Fix CodeBlock.CopyButton timeout lifecycle handling by clearing pending timers on unmount and before scheduling a new copy-state reset.
#975 d9a7206 Thanks @cody-dot-js! - Fix theme flash on hydration by reading the theme cookie during SSR. useInitialHtmlThemeProps now accepts an optional ssrCookie string so the server can render the correct theme class, eliminating the mismatch between server HTML and the inline script.
#969 76e1afd Thanks @cody-dot-js! - Fix useIsBelowBreakpoint performance regression during window resize. The subscribe and getSnapshot functions passed to useSyncExternalStore were recreated on every render, causing listener teardown/re-attach churn on each frame. They are now cached per breakpoint for referential stability.
#969 76e1afd Thanks @cody-dot-js! - Restore all @custom-variant definitions in mantle.css that were accidentally removed. This includes theme variants (light, dark, high-contrast, dark-high-contrast), aria/data attribute variants, hover media query variants (hover-hover, hover-none), and the where variant.
d26aee3 Thanks @cody-dot-js! - Fix mantle.css exports#963 1a68417 Thanks @cody-dot-js! - Add "info" as a first-class semantic color (mirrors "accent")
#965 fd7e2eb Thanks @cody-dot-js! - Add new SplitButton component
#963 1a68417 Thanks @cody-dot-js! - Fix Anchor component target types to delegate to React's built-in types
#963 1a68417 Thanks @cody-dot-js! - Fix mantle.css theme syntax
#963 1a68417 Thanks @cody-dot-js! - Apply font-sans to components for consistent typography
#962 030099b Thanks @dependabot! - Update react-day-picker
141490d Thanks @cody-dot-js! - fix return type of $cssPropertiesbf79ae2 Thanks @cody-dot-js! - DescriptionList styling fixes#954 7235e48 Thanks @randseay! - Add DescriptionList component.
This component is a semantic wrapper for <dl>, <dt>, and <dd> elements. It allows for a more accessible and semantic way to display label/value pairs.
e095088 Thanks @cody-dot-js! - Add CssProperties, $cssProperties type and helper for supporting typechecking of react CSSProperties AND custom css properties (--foo-bar)d2922d2 Thanks @cody-dot-js! - DataTable.HeaderSortButton: remove scaling when activeb03ef99 Thanks @aaronshekey! - Add 2xs breakpoint (360px)#912 d6c1f46 Thanks @aaronshekey! - Create fluid typography. Kill references to Inter.
#902 da31911 Thanks @dependabot! - Update runtime dependencies: @ariakit/react, react-day-picker
#914 e704a7d Thanks @cody-dot-js! - Update dependencies: react-day-picker and @ariakit/react
#914 e704a7d Thanks @cody-dot-js! - Toast: support keeping toasts open until manually dismissed by passing duration_ms <= 0 or Number.POSITIVE_INFINITY
#902 da31911 Thanks @dependabot! - Switch to node-24 as LTS
5174f39 Thanks @cody-dot-js! - Button, IconButton: scale w/ transition ease-out#896 b58edd7 Thanks @cody-dot-js! - Add Slot component with automatic className merging
Introduces a new @ngrok/mantle/slot component that wraps Radix UI's Slot with automatic Tailwind CSS className merging using cx. All internal components now use the Mantle Slot instead of importing directly from Radix UI, providing consistent className merge behavior across the design system where child classes take priority over parent classes.
0507080 Thanks @cody-dot-js! - Button, IconButton: add data-appearance, data-priority to DOMeeca62d Thanks @cody-dot-js! - Fix tooltip jsdoc urls#885 918bdd9 Thanks @cody-dot-js! - Promote Tooltip component out of preview
The Tooltip component has been promoted from preview to stable. This includes:
/components/preview/tooltip to /components/tooltip@source "../src" to mantle.css#878 9ecfcd4 Thanks @dependabot! - Update dependencies; bump min version of tailwind
#883 e3d39ef Thanks @cody-dot-js! - move mantle.css to src/ and improve HMR
mantle.css from packages/mantle/assets/ to packages/mantle/src/ to enable proper hot module reload during developmentmantle.css package export to use source conditions (@ngrok/mantle/source → src/mantle.css, default → dist/mantle.css), matching the pattern used for component exportsmantle.css to dist/ directory for production builds8a66858 Thanks @acrobat130! - enable an appearance prop on the tabs root component that allows the user to specify pill-style tabsf8170b9 Thanks @dependabot! - Update dependencies; add static white, static black, and ff00ff as colors61b3eee Thanks @cody-dot-js! - Update Kbd bg colore38e79a Thanks @cody-dot-js! - Add Kbd component and documentation page for keyboard shortcutsaa7f600 Thanks @cody-dot-js! - Add filter and shouldFilter props to Command.Dialog for custom filtering behavior#858 df04845 Thanks @cody-dot-js! - fix: restore text-size-inherit utility
Re-added text-size-inherit font-size utility that was accidentally removed in v0.57.3. This utility allows components to inherit font-size from their parent element.
Note: This utility is named text-size-inherit (not text-inherit) to avoid conflicts with Tailwind's standard text-inherit utility which controls color inheritance.
Changes:
--text-size-inherit: inherit; to @theme inline blocktext-size-inherit to font-size class group in cx helper's tailwind-merge config#856 20c2da9 Thanks @cody-dot-js! - fix: enable text-mono font-size overrides with cx helper
Extended the cx helper's tailwind-merge configuration to recognize text-mono as a font-size class. This allows users to properly override the monospace font size in Table.Cell and CodeBlock components using standard Tailwind font-size utilities like text-base, text-xl, etc.
Before:
1<Table.Cell className="text-base">INV001</Table.Cell>2// Both text-mono and text-base were present in className3// text-mono took precedence → 13px font-sizeAfter:
1<Table.Cell className="text-base">INV001</Table.Cell>2// tailwind-merge properly removes text-mono3// text-base takes effect → 16px font-sizeTechnical Details:
text-mono to the font-size class group in extendTailwindMerge config#854 8819cb0 Thanks @cody-dot-js! - fix: convert text-size-mono to text-mono for proper tailwind-merge support
Changed the custom @utility text-size-mono to a proper Tailwind theme fontSize extension --font-size-mono, which generates the text-mono utility class. This allows text-mono to be properly overridden by other font-size utilities like text-base or text-xl when using the cx helper.
Breaking Change: Users need to replace text-size-mono with text-mono in their code.
Before:
1<Table.Cell className="text-size-mono">...</Table.Cell>After:
1<Table.Cell className="text-base">...</Table.Cell> // text-base now properly overrides the default text-mono#852 d5cbefb Thanks @cody-dot-js! - Command: export MetaKey component for platform-aware keyboard shortcuts
Extract MetaKey as a reusable SSR-safe component that displays the appropriate modifier key (⌘ for macOS/iOS, Ctrl for others) in keyboard shortcut hints.
a83221a Thanks @cody-dot-js! - Remove EuclidSquare bold/semibold; export new theme font helper components0bdcaba Thanks @cody-dot-js! - IconButton: add in sr-only label as inner children when using asChild6d60f2e Thanks @cody-dot-js! - Table: set overscroll-x-none on Table.Root#834 235593b Thanks @dependabot! - Update ariakit and react-day-picker
#837 ba79d27 Thanks @cody-dot-js! - Theme: improve cookie parsing and reduce risk of FOUC, hydration issues
5cdda38 Thanks @cody-dot-js! - AutoScrollToHash + useAutoScrollToHash: switch to context provider, allow for programmatic scrollToHash()48ce32d Thanks @cody-dot-js! - Add react-router to peer dependencies of mantle, document AutoScrollToHash peerDep on react-routerd9dfa70 Thanks @cody-dot-js! - Export AutoScrollToHash, useAutoScrollToHash, and useScrollBehavior05ca536 Thanks @dependabot! - Update dependencies#813 30580b7 Thanks @dependabot! - Bump tw-animate-css
#815 dd1eb1f Thanks @cody-dot-js! - Add visibilitychange handler for ThemeProvider
8005c93 Thanks @cody-dot-js! - Theme: fix cross-tab theme sync when the cookie changes1f943b7 Thanks @cody-dot-js! - remove microtask in FOUC scriptc1162a4 Thanks @cody-dot-js! - Switch from localStorage to cookie for theme preference storage primitive9286f3a Thanks @cody-dot-js! - Rename theme-provider export to theme#803 165981f Thanks @dependabot! - Update react day picker dependency
#801 47ecff2 Thanks @aaronshekey! - Add the xs breakpoint to the breakpoint component
a5a1b91 Thanks @cody-dot-js! - Dialog Overlay Primitive: add data-overlay attribute to Overlay primitive#790 2806bb4 Thanks @cody-dot-js! - Combobox: fix scrolling presentation in content
#790 2806bb4 Thanks @cody-dot-js! - Combobox: bump up spacing between input and content
#789 df7b954 Thanks @dependabot! - bump headlessui version
#777 a484cab Thanks @cody-dot-js! - Button: remove the need for inner span
#779 37f40bd Thanks @cody-dot-js! - Button, IconButton: add active:scale-[0.97]
#775 3519c45 Thanks @cody-dot-js! - anchor: fix ring class on focus-visible
#773 17dcb26 Thanks @dependabot! - update tailwindcss min peer dep
9f55e0e Thanks @cody-dot-js! - Alert: when appearance="banner", also remove the top border#767 10899b2 Thanks @dependabot! - Update tw-animate-css
#768 b8cd5d3 Thanks @cody-dot-js! - Alert: add appearance prop to support "banner" alerts
fe24bbb Thanks @cody-dot-js! - Card: fix how we render borders between Card.Header, Card.Body, and Card.Footer9b8ea0b Thanks @melanieseltzer! - ProgressDonut: add indeterminateRotationSpeed prop to control spin speed. Fix default animation-duration-[15s] so it no longer overrides consumer-provided animation-duration-* classes.be2c37a Thanks @cody-dot-js! - Combobox: fix ItemValue data-user-value bolding#748 2e7509c Thanks @cody-dot-js! - add useIsBelowBreakpoint hook, improve performance of breakpoint hooks
#745 9611901 Thanks @cody-dot-js! - Rename InlineCode to Code
#746 639eed2 Thanks @cody-dot-js! - Add useIsHydrated hook
#746 639eed2 Thanks @cody-dot-js! - Add useBreakpoint hook
#746 639eed2 Thanks @cody-dot-js! - Add BrowserOnly component
#743 9e2621c Thanks @cody-dot-js! - Switch Alert, Dialog, and AlertDialog Description components to render a div instead of a p by default
#746 639eed2 Thanks @cody-dot-js! - Update hooks documentation for useMatchesMediaQuery and useCopyToClipboard
bbfd6d4 Thanks @cody-dot-js! - Accordion: fix export object for compound component definition55565dc Thanks @dependabot! - Update react-day-picker and tw-animate-csscd19eb1 Thanks @cody-dot-js! - DropdownMenu: support tooltips on disabled dropdown menu itemse61565f Thanks @cody-dot-js! - DataTable: remove DataTable.Rows convenience component; instead prefer to map over rows directly521d59f Thanks @dependabot! - Update dependencies961e157 Thanks @cody-dot-js! - DataTable: support passing fn as child to DataTable.Rows#719 7cab99c Thanks @cody-dot-js! - Toast: for toast message, use font-body instead of font-sans
#721 31c6ec0 Thanks @cody-dot-js! - DataTable: export cell component too
#717 024cf70 Thanks @cody-dot-js! - Colors: fix dark mode swap of white and black as semantic colors
#717 024cf70 Thanks @cody-dot-js! - replace remaining hsl() usages with oklch() and --color-* css vars
6507acf Thanks @cody-dot-js! - Fix missing production dependency for tw-animate-csse0846f8 Thanks @aaronshekey! - Migrate mantle to Tailwind v43f531c5 Thanks @cody-dot-js! - Update ariakit (combobox improvements)a3b49ab Thanks @cody-dot-js! - Implement composite named exports82f26dc Thanks @cody-dot-js! - Add nonce prop to MantleThemeHeadContent, update doc blocks0b342d7 Thanks @dependabot! - Update headlessui and sonner dependencies#678 c303597 Thanks @cody-dot-js! - Add explicit displayNames to all mantle components
#680 7b6b15a Thanks @cody-dot-js! - add missing intellisense jsdocs to all mantle components
4a65a5a Thanks @cody-dot-js! - Add ProgressBar componentbc3e6ac Thanks @cody-dot-js! - remove zod as a peerDependency of mantle1cfccd6 Thanks @cody-dot-js! - Sprinkle use client everywhere2fddd06 Thanks @cody-dot-js! - Change peerDependencies for react and react-dom#642 1bb8fdd Thanks @dependabot! - update dependencies
#651 57d5b60 Thanks @dependabot! - Update dependencies
#659 1d43071 Thanks @cody-dot-js! - Fix mantle react, react-dom peer dependencies range
#658 ad402db Thanks @melanieseltzer! - Fix bug where setValueOnClick prop was destructured (to set a default) but then never passed along and used (so the consumer could never override it).
148dd76 Thanks @aaronshekey! - Fix breakpoint configuration to allow for arbitrary breakpointbaa2d7f Thanks @cody-dot-js! - RadioIndicator: add shrink-0 so the indicator does not shrink in flex contexts#633 0632cca Thanks @cody-dot-js! - SelectItem: allow for icon slot
#633 0632cca Thanks @cody-dot-js! - Icons: export AutoThemeIcon and ThemeIcon
#631 2d18988 Thanks @dependabot! - Update dependencies
#609 fc8b793 Thanks @dependabot! - Update dependencies
c76d1bd Thanks @aaronshekey! - Add AlertDismissIconButton to Alert componentc72c6e1 Thanks @aaronshekey! - Table edge case refinements and a sans serif font on tooltips by default264dc1b Thanks @dependabot! - Update dependencies; use named *Icon imports from phosphor26cdffa Thanks @cody-dot-js! - Revert phosphor update2cf4f4c Thanks @cody-dot-js! - Update phosphor icons to new suffix Icon imports2eb2764 Thanks @cody-dot-js! - RadioButton: don't highlight border on hover when checked AND disabled#559 9da7027 Thanks @cody-dot-js! - tsconfig: improve tsconfigs and remove unused imports/vars
#551 fceb2ef Thanks @cody-dot-js! - Table: improve component design and styling
#576 ce359c0 Thanks @dependabot! - update dependencies
#568 3d9c378 Thanks @dependabot! - update dependencies
#544 cc043a7 Thanks @cody-dot-js! - DataTable: fix react key errors in DataTableHead and DataTableRow
#546 44cc9b9 Thanks @cody-dot-js! - DataTable: fix hover styles, add DataTableActionCell
#546 44cc9b9 Thanks @cody-dot-js! - Tailwind Preset: fix content glob, should point to dist folder now
#538 1c2f1af Thanks @cody-dot-js! - DataTable: add most of the remaining core components
#536 585624a Thanks @cody-dot-js! - DataTable: export both DataTableHeaderSortButton and DataTableHeader, decouple behavior to make it fully customizable
8211d3b Thanks @cody-dot-js! - Tailwind Preset: replace 'text-mono' with 'text-size-mono' (so it doesn't clash with tw-merge text-* color classes)#533 8211d3b Thanks @cody-dot-js! - DataTable: add tests to helper methods, render example on docs site
#533 8211d3b Thanks @cody-dot-js! - Toast: change class from .mantle-prompt to .overlay-prompt, improve compat w/ legacy ui components
#533 8211d3b Thanks @cody-dot-js! - Table: fix/improve styling
#533 8211d3b Thanks @cody-dot-js! - Update dependencies
#525 bf41174 Thanks @cody-dot-js! - Add custom mantle icons exports (Sort, TrafficPolicyFile) and sorting helper functions, types
#527 f702d8a Thanks @cody-dot-js! - DataTable: add DataTableHeader component, which supports column sorting by default (if enabled on the column)
#527 f702d8a Thanks @cody-dot-js! - Table: improve documentation and fix markup, exports to match html spec 1:1; improve styling and include horizontal overflow detection
#524 38ac3db Thanks @dependabot! - Update dependencies
#527 f702d8a Thanks @cody-dot-js! - Table: Improve Table component docs
#515 eb03234 Thanks @cody-dot-js! - PopoverContent: add preferredWidth prop, use that instead of explicit width
#515 eb03234 Thanks @cody-dot-js! - Calendar: add min-w-min to months container (prevent overflow in nav)
#513 052f571 Thanks @cody-dot-js! - AlertDialogContent, DialogContent: add preferredWidth prop
#510 7dcc1e0 Thanks @dependabot! - Update dependencies
a669615 Thanks @cody-dot-js! - CodeBlock: add support for setting the indentation used (tabs vs spaces), fallback to detecting what the given language prefers or spaces if none#500 275f8d1 Thanks @dependabot! - update dependencies
#501 a669615 Thanks @cody-dot-js! - CodeBlock: improve documentation and intellisense
#497 b5526a0 Thanks @cody-dot-js! - AlertDialog: improve intellisense and docs, support asChild
#496 8d88570 Thanks @cody-dot-js! - Flag: improve intellisense
#496 8d88570 Thanks @cody-dot-js! - Icon: update docs and intellisense
#496 8d88570 Thanks @cody-dot-js! - Label: update docs and intellisense
#496 8d88570 Thanks @cody-dot-js! - MediaObject: update docs and intellisense, add asChild support
#494 c4961ac Thanks @cody-dot-js! - Card: improve docs and intellisense, support asChild on all sub-components
#496 8d88570 Thanks @cody-dot-js! - Badge: improve intellisense
#493 410bc33 Thanks @melanieseltzer! - Combobox: fix intellisense on ComboboxItemValue
#496 8d88570 Thanks @cody-dot-js! - Skeleton: update docs and intellisense, add asChild support
97538d9 Thanks @cody-dot-js! - Anchor: add support for icons and their placement, improve docs and intellisense1c47edc Thanks @cody-dot-js! - CodeBlock: fix unescaped inner html on initial render#486 671867c Thanks @cody-dot-js! - Switch: improve intellisense and docs, fix readOnly prop
#483 247bbc4 Thanks @cody-dot-js! - Separator, ProgressDonut: improve docs and intellisense
#485 13d21f3 Thanks @cody-dot-js! - Checkbox: improve intellisense and docs
#478 1b8857b Thanks @cody-dot-js! - Add SandboxedOnClick component
#477 de42d20 Thanks @cody-dot-js! - SheetContent: add preferredWidth prop, remove side: "top" and "bottom" options
#469 d879af8 Thanks @dependabot! - Update dependencies, add dependabot config, clean up scripts
#479 e775e11 Thanks @cody-dot-js! - PopoverContent: prevent click events from bubbling out of the PopoverContent container
#480 c87c906 Thanks @cody-dot-js! - TextArea: improve docs and intellisense
1556c80 Thanks @dependabot! - Update dependencies#464 b55338e Thanks @dependabot! - Update dependencies
#466 a708b7f Thanks @cody-dot-js! - Sheet: improve inline intellisense and docsite documentation
2e9f116 Thanks @cody-dot-js! - Checkbox: remove zodCheckbox exporte62f0ef Thanks @cody-dot-js! - Select: improve component docs, add inline intellisense examples w/ links, make content width default to "trigger"494430c Thanks @dependabot! - update prism to fix security vulnerability2ed9953 Thanks @cody-dot-js! - Alert: improve doc site entry and intellisense for each component; remove unused default priority and make priority required; add AlertIcon component2ddbdab Thanks @cody-dot-js! - ProgressDonut: properly fix the render AND hydration issuef76dc0e Thanks @cody-dot-js! - ProgressDonut: fix hydration error, add examples in intellisense00de431 Thanks @cody-dot-js! - CodeBlock: fix alignment of absolutely positioned copy button944e9a6 Thanks @cody-dot-js! - Add combobox component8d47922 Thanks @cody-dot-js! - Flags: add GB alias for UK flag63ce798 Thanks @cody-dot-js! - Flags: rename Flags type to CountryCode, export countryCodes list and isCountryCode type predicate fn#443 46087c5 Thanks @cody-dot-js! - Flag: add border radius and inset transparent black border
#441 2867bdf Thanks @cody-dot-js! - Prep for react 19: swap react-19-deprecated ElementRef type for ComponentRef type
1523118 Thanks @cody-dot-js! - Add Flag component0aac02a Thanks @cody-dot-js! - AlertDialog: actually export AlertDialogClose4744706 Thanks @cody-dot-js! - AlertDialog: export AlertDialogClose7358307 Thanks @cody-dot-js! - DropdownMenuRadioItem: only take up space for the checkmark when an item is checked#430 ec4e2e4 Thanks @cody-dot-js! - button: fix underline on group-hover bug of bug
#427 7b9ef0b Thanks @cody-dot-js! - Update dependencies
#425 0dad7df Thanks @dependabot! - update dependencies
e87acd6 Thanks @cody-dot-js! - types: export parseBooleanishd78b2ce Thanks @melanieseltzer! - Make the className arg on anchorClassNames optional298b175 Thanks @cody-dot-js! - CodeBlock: adjust styles, add defensive css (for docs)4275988 Thanks @cody-dot-js! - mantle.css: improve matching for css vars on rootd42bb6f Thanks @cody-dot-js! - SelectItem: improve styling to fix hover bg color on selected items in docs use case88727bd Thanks @cody-dot-js! - CodeBlock: add CodeBlockIcon component and fix some styling#408 0868adb Thanks @melanieseltzer! - Revamp the readme and contributing guide
#410 de54a95 Thanks @cody-dot-js! - add fade-in keyframes to tailwind preset
1d83e1d Thanks @cody-dot-js! - Slack post will work this time for real i promise u 🦐595e6c1 Thanks @cody-dot-js! - Fixing the post to slack webhook on mantle releasecf2d8c2 Thanks @cody-dot-js! - Debugging changesets release#399 cbeec74 Thanks @cody-dot-js! - Update patch dependencies of radix component packages https://github.com/ngrok-oss/mantle/pull/396
Improve code quality (suggestions from trialing biomejs) https://github.com/ngrok-oss/mantle/pull/398
For historical release notes prior to v0.19.3, please consult https://github.com/ngrok-oss/mantle/releases