Skip to main content
Current version: 3.17.0. Source: packages/anvil2/CHANGELOG.md. Older releases: v2.x, v1.x, v0.x.

3.17.0

Minor Changes

  • #2817 d6533f5 Thanks @cursor! - [prefersReducedMotion, useReducedMotion] Add prefersReducedMotion util and re-export Motion useReducedMotion
  • #3076 37a1f04 Thanks @lgutin! - [DrillDown] Add actions prop to DrillDown.Header for an overflow menu matching Drawer.Header, and export the DrillDownHeaderAction type. Header actions render in Drawer and Page.Panel hosts only; inside a Dialog they are ignored with a development warning, since Dialog.Header has no overflow menu.

Patch Changes

  • #3104 67eb494 Thanks @pbuckingham-st! - [Tab] Fix TabList throwing “Maximum update depth exceeded” when tabs that fill the list are near the overflow width and a render changes the list’s width.
  • #3076 37a1f04 Thanks @lgutin! - [DrillDown] Fix DrillDown.Header Close persisting after onClose is removed or the DrillDown unmounts
  • #3100 814f8ef Thanks @SimonyanGrno! - BETA [DataTable] Add bulkActions prop for a bulk action bar that replaces the filter bar and toolbar while rows are selected, and clearSelection on DataTableRef
  • #2934 4e7f12a Thanks @cursor! - [Exports] Stop shipping Storybook-only CSS bundles in the published package
  • #3123 70228d8 Thanks @hbartlett-st! - BETA [DataTable] Add a controlled Edit Columns drawer for order, visibility, and left pinning.
  • #3109 aa7ac68 Thanks @hbartlett-st! - [DataTable (beta)] Add a filter bar and toolbar actions above the table
    • filters (DataTableFilters) renders a FilterBar. items takes the filter definitions; filters marked drawerOnly appear only in the filter drawer
    • filters.onChange receives the updated filters and returns a paginated table to its first page. DataTable does not filter rows itself, so apply the filters to data or to your loadPageData request
    • filters.controlled defers inline filters that support an Apply step; filters without one still commit immediately, and the drawer always batches changes
    • tools (DataTableTools) takes actions, a list of toolbar button props (DataTableToolbarAction) rendered to the right of the filter bar
    • filters.size and tools.size set the size of the filter bar and toolbar controls. Both default to medium
  • #3131 31ce9ee Thanks @hbartlett-st! - BETA [DataTable] Add a rowAdd prop that renders an Add row button in a toolbar below the table and calls onAddRow. Set emptyState.includeAddRow to repeat the button in the empty state.
  • #3103 2839b4e Thanks @subham-ttan! - [ListView] Fix crash when an option is dynamically disabled, and keep keyboard focus on a valid row
  • #2963 f05ead9 Thanks @helenvholmes! - [Icons] Add gnav_messages_active and gnav_messages_inactive ST icons
  • Updated dependencies [11017d0]:
    • @servicetitan/hammer-token@3.6.1

3.16.1

Patch Changes

  • #2986 7e32bbb Thanks @cursor! - [Combobox, MultiSelectField, SelectField, TreeSelectField] Fix mouse focus ring on select triggers and stop caret focus outline from rotating when the menu opens
  • #3073 c3fad15 Thanks @subham-ttan! - [SelectField] Fix the combobox search input: reopening after a selection now selects the label (so typing replaces it instead of garbling it), and the cursor no longer jumps to the end while editing search text

3.16.0

Minor Changes

  • #3031 f378747 Thanks @AdamLantz! - [Pagination] Add itemRangeFormatter prop to customize the item-range text

Patch Changes

  • #3036 0c93d69 Thanks @w-a-t-s-o-n! - [Dependencies] Use caret ranges for all dependencies to avoid version conflicts in consuming apps
  • #2916 c88993f Thanks @Diveafall! - [MultiSelectField, MultiSelectMenu, SelectField, SelectMenu] Fix Load more closing the options popover, auto-load the next page on scroll for lazy lists, and stop duplicate page requests with virtualize
  • #2880 c773b39 Thanks @lgutin! - [ProgressBar] Update success and error indicators to use the shared Status Icon
  • #3062 9b9af1f Thanks @w-a-t-s-o-n! - BETA [FilterBar] Fix an update loop when typing quickly in the search field

3.15.2

Patch Changes

3.15.1

Patch Changes

  • #2980 fa95ee2 Thanks @AdamLantz! - BETA [FilterBar] Add a Clear action to numericRange filters
  • #2980 fa95ee2 Thanks @AdamLantz! - BETA [FilterBar] Fix Enter on Clear or Cancel applying the draft in a controlled filter popover
  • #3001 6593fa3 Thanks @subham-ttan! - [Details] Fix Summary chevron sitting vertically misaligned against the label text in Sofia Pro
  • #2983 1a0360f Thanks @AdamLantz! - [Stepper] Fix incoming panel blinking empty at the end of the step fade

3.15.0

Minor Changes

  • #2984 1a54b6c Thanks @AdamLantz! - [Icons] Add new global nav icons: gnav_analytics_active, gnav_analytics_inactive

3.14.1

Patch Changes

  • Updated dependencies [c8daeed]:
    • @servicetitan/hammer-token@3.6.0

3.14.0

Minor Changes

  • #2941 1bce68a Thanks @pbuckingham-st! - [Icons] Add gnav_automations_active, gnav_automations_inactive, gnav_command_center_active, and gnav_command_center_inactive global nav icons

Patch Changes

  • Updated dependencies [e5a2083]:
    • @servicetitan/hammer-token@3.5.0

3.13.7

Patch Changes

  • #2923 97cec27 Thanks @jarizast! - [DateFieldYearless, DateFieldYearlessRange] Fix the first month or day click in the picker being discarded and closing the popover
  • #2929 2b2c7d5 Thanks @ericag1985! - [Chip] Fix custom colors defaulting to the system color scheme when theme mode is unset
  • #2929 2b2c7d5 Thanks @ericag1985! - [Avatar] Fix custom colors defaulting to the system color scheme when theme mode is unset
  • #2926 cfcb71d Thanks @ericag1985! - [Calendar] Fix bounded month navigation closing containing popovers
  • #2929 2b2c7d5 Thanks @ericag1985! - BETA [DataTable] Fix empty-state artwork defaulting to the system color scheme when theme mode is unset
  • #2920 82dee43 Thanks @pbuckingham-st! - [AnvilProvider] Fix anvil2 body class being stripped by one MFE scope’s unmount while another scope’s AnvilProvider is still mounted

3.13.6

Patch Changes

  • #2869 3accfab Thanks @pbuckingham-st! - [MultiSelectField, SelectField] Fix React 18 unknown-property warning for the HTML popovertarget attribute without reintroducing the React 19 casing warning

3.13.5

Patch Changes

  • #2894 a2f07c5 Thanks @pbuckingham-st! - BETA [SavedFiltersButton] Fix Edit Saved Filters reopening a stale preset edit form instead of the preset list
  • Updated dependencies [dc68e22]:
    • @servicetitan/hammer-token@3.4.1

3.13.4

Patch Changes

  • #2844 a32f02b Thanks @tounsoo! - BETA [DataTable] Fix emptyState.svg not rendering forwardRef illustration components

3.13.3

Patch Changes

  • #2820 10234f8 Thanks @w-a-t-s-o-n! - BETA [FilterBar] Add customRange.minDate, customRange.maxDate, and customRange.unavailable to dateList filters
  • Updated dependencies [5043512]:
    • @servicetitan/hammer-token@3.4.0

3.13.2

Patch Changes

  • #2429 4e0d6fd Thanks @cursor! - [Menu] Fix nested menus ignoring the trigger render prop
  • #2684 af3ab2d Thanks @cursor! - [FilterBar] Fix selected trigger hover/active colors and count badge contrast
  • #2813 fa356f3 Thanks @hbartlett-st! - BETA [Page] Replace Page.Content virtual scrolling with a native, keyboard-operable overflow-y: auto container on the shared main wrapper at lg+ — breaking for consumers relying on document-level scroll or the internal virtual-scroll-container class.

3.13.1

Patch Changes

  • #2773 19423e4 Thanks @helenvholmes! - [usePrefersColorScheme] Fix mode staying "light" until the system color scheme changes
  • #2744 988aa23 Thanks @AdamLantz! - [MultiSelectField, MultiSelectFieldSync] Fix onSelectedOptionsChange re-firing after selection when the parent writes a new array of the same ids
  • #2796 b4d6cf1 Thanks @w-a-t-s-o-n! - [Popover, ThemeProvider] Fix custom theme tokens being reset to core defaults on top-layer popovers, menus, tooltips, and toasts
  • #2775 37b86ca Thanks @lgutin! - BETA [DataTable] Fix table content and pinned columns misaligning with the container edge by removing padding-inline from the scroll container so content stays flush and sticky offsets are correct. Paginated tables no longer show a stray horizontal scrollbar and trailing empty space when their columns already fit
  • #2745 73447c9 Thanks @TitanBob! - [Toaster] Fix a document-wide MutationObserver staying connected after a toast auto-closes, and scan MFE shadow roots once per mutation batch instead of once per root
  • #2781 44c29ae Thanks @hbartlett-st! - BETA [Page] Add new Page beta export with Page.Panel.Header, Page.Panel.Content, and Page.Panel.Footer with Drawer-like sticky header, scrollable content, and optional sticky footer; padding now lives on those slots instead of Page.Panel; Drilldown should be direct sibling of Page.Panel rather than nested within Page.Panel.Content
  • #2745 73447c9 Thanks @TitanBob! - [Dialog, Drawer, Toaster] Fix closing one of two open dialogs un-hiding the page toaster behind the other dialog, and stop toast.dismiss() re-rendering toast consumers when no toast is open
  • #2791 4df4ff8 Thanks @lgutin! - BETA [DataTable] Migrate row and cell error/warning indicators to the standard status-specific icon set (filled circular glyphs), rendered at the dense small (12px) size for consistency with Alert, FieldMessage, and Toast. The warning cell outline now uses the border-color-warning token so it matches the Alert warning border.

3.13.0

Minor Changes

  • #2746 ec6d604 Thanks @Diveafall! - [Page] Add items to Page.Header actions.primary for a primary action that opens a menu

Patch Changes

  • #2762 dc83d43 Thanks @tounsoo! - [Menu, Page] Fix the Page Header more menu staying open after focus leaves the trigger

3.12.2

Patch Changes

  • #2754 55684fd Thanks @AdamLantz! - [TimeField] Fix input shrinking when a value is entered
  • #2715 10fe003 Thanks @Diveafall! - BETA [DataTable] Cap the loading spacer’s first-load height so a large rowsPerPage no longer reserves a viewport-sized empty area

3.12.1

Patch Changes

  • #2725 a9e5a1d Thanks @AdamLantz! - [MultiSelectFieldSync, MultiSelectMenuSync, SelectFieldSync, SelectMenuSync] Fix loader flashing when options is a new array with the same contents
  • #2739 4ee2c39 Thanks @AdamLantz! - [Toaster] Fix a centered black square from native popover user-agent styles when a toast is visible

3.12.0

Minor Changes

  • #2710 68dcc25 Thanks @AdamLantz! - [StepperBase] Add a controllable stepper primitive with per-step state for status-in-sequence flows

3.11.1

Patch Changes

3.11.0

Minor Changes

  • #2630 e89d590 Thanks @w-a-t-s-o-n! - [Exports] Add @servicetitan/anvil2/themes subpath exporting carto theme overrides
  • #2641 450049b Thanks @Diveafall! - Add a noMargin prop to Text for the headline variant. Headlines ship a bottom margin so they space correctly above following content, which offsets them when they are aligned against a sibling such as a Chip. Setting noMargin removes that margin so the headline’s layout box hugs the text. The prop is a type error on the body and eyebrow variants, which already have no margins.
  • #2630 e89d590 Thanks @w-a-t-s-o-n! - [ThemeProvider, Tokens] Enable border-radius and typography CSS variables to cascade from ThemeProvider

Patch Changes

  • #2572 04ca3d0 Thanks @karpoff-titan! - [MultiSelectField, SelectField] Make option.id type generic so consumers can use string or number ids without casting
  • Updated dependencies [e89d590]:
    • @servicetitan/hammer-token@3.3.0

3.10.1

Patch Changes

  • #2697 f4a1979 Thanks @AdamLantz! - [MultiSelectField, SelectField, SelectTrigger] Fix disabled fields still opening from wrapper or caret clicks
  • #2679 8276098 Thanks @AdamLantz! - [MultiSelectField, MultiSelectFieldSync] Fix clear button vertical alignment when disableSearch is set
  • #2679 8276098 Thanks @AdamLantz! - [MultiSelectField, MultiSelectFieldSync] When singleRow, reduce search input min-width so chips are not forced into premature +N collapse
  • #2679 8276098 Thanks @AdamLantz! - [MultiSelectField, MultiSelectFieldSync] Fix singleRow chip overflow so it remeasures when the field width changes
  • #2678 9f573d2 Thanks @AdamLantz! - [DrillDown] Align Content layout with Drawer.Content so children can shrink within the host width
  • #2679 8276098 Thanks @AdamLantz! - BETA [TreeSelectField, TreeSelectFieldSync] When singleRow, reduce search input min-width so chips are not forced into premature +N collapse
  • #2679 8276098 Thanks @AdamLantz! - BETA [TreeSelectField, TreeSelectFieldSync] Fix singleRow chip overflow so it remeasures when the field width changes

3.10.0

Minor Changes

  • #2433 c927b6d Thanks @AdamLantz! - [Combobox, DateFieldRange, DateFieldSingle, DateFieldYearless, DateFieldYearlessRange, MultiSelectField, MultiSelectMenu, Pagination, SelectField, SelectMenu, Toolbar] Add internally-managed data-anv-part attributes to interactive sub-elements for e2e test targeting, and forward consumer data-* attributes onto the public root or trigger/input surface
  • #2671 b263157 Thanks @w-a-t-s-o-n! - These version bumps clear npm version numbers reserved after a security-related unpublish. Consumers must upgrade to the new versions. Do not pin to unpublished or reserved numbers. Higher versions that still appear in the npm packument time field but are missing from installable versions must not be used — they return 404 and reject republish.
  • #2672 3a2d620 Thanks @pbuckingham-st! - [DrillDown] Add an interactive prop to suspend a screen’s focus trap while it stays mounted and visible, for cases where a consumer opens an independent Dialog/Drawer on top of it

Patch Changes

  • #2433 c927b6d Thanks @AdamLantz! - BETA [DataTable, FilterBar, SavedFiltersButton, Toolbar, TreeSelectField, TreeSelectFieldSync, TreeSelectMenu, TreeSelectMenuSync] Add internally-managed data-anv-part attributes to interactive sub-elements for e2e test targeting, and forward consumer data-* attributes onto the public root or trigger surface
  • #2643 0a1fa99 Thanks @Diveafall! - [MultiSelectField, TreeSelectField] Fix selected disabled options so their chips omit the close control, and clear/backspace skip locked selections
  • #2672 3a2d620 Thanks @pbuckingham-st! - BETA [SavedFiltersButton] Fix the Custom Range dialog for a dateList filter being unresponsive to all clicks (day selection, Cancel, and the header close button) when opened while editing a saved filter
  • #2667 a7f1232 Thanks @tounsoo! - [Page] Fix Page.Sidebar locking page scroll and showing the wrong chevron below the lg breakpoint
  • #2673 3ae742e Thanks @tounsoo! - BETA [FilterBar] Fix dateList filter replacing its own label with the selected option’s label on the trigger button. The filter label is now retained and the selection appended, e.g. Start Date: Last 7 Days (Aug 6 – Aug 11, 2026), matching the other filter types. The drawer field is unchanged.
  • Updated dependencies [b263157]:
    • @servicetitan/hammer-token@3.2.0
    • @servicetitan/hammer-icon@1.3.0

3.9.0

Minor Changes

  • #2606 664e8cc Thanks @cursor! - [Calendar] Deprecate focusedDate in favor of defaultFocusedDate. focusedDate never reliably controlled the initial view.

Patch Changes

  • #2532 2a87e99 Thanks @cursor! - [Tab] Fix overflow scroll buttons covering tabs and scroll the tab list on click
  • #2607 79b0364 Thanks @AdamLantz! - [Combobox, DateFieldRange, DateFieldSingle, DateFieldYearless, DateFieldYearlessRange, MultiSelectField, SelectField, TimeField] Close attached menus when becoming disabled
  • #2607 79b0364 Thanks @AdamLantz! - BETA [TreeSelectField] Close attached menus when becoming disabled
  • #2524 fc611b6 Thanks @w-a-t-s-o-n! - [Flex, Grid] Fix font-family inheritance to respect parent typography context
  • #2620 786cb51 Thanks @joefiorini! - BETA [TreeSelectMenu, TreeSelectField] Fix dragging the tree panel’s scrollbar closing the popover mid-drag. The panel wasn’t a focusable click target, so a scrollbar-thumb drag blurred the search field to nothing and OptionsPopover treated it as an outside interaction. The panel now gets tabIndex={-1}, matching MultiSelectMenu’s scroller.

3.8.0

Minor Changes

Patch Changes

  • #2535 b3a79db Thanks @w-a-t-s-o-n! - [DateFieldYearless, DateFieldYearlessRange] Fix month dropdown labels shifting by one month in timezones east of UTC
  • #2555 6377024 Thanks @w-a-t-s-o-n! - [SelectField] Fix clear button vertical alignment for disableSearch across sizes

3.7.1

Patch Changes

  • #2516 7dc385a Thanks @AdamLantz! - BETA [MultiSelectField, MultiSelectMenu] Fix Select All checkbox not updating in confirmation mode

3.7.0

Minor Changes

  • #2503 16bb0b2 Thanks @AdamLantz! - [MultiSelectField, MultiSelectMenu, SelectField, SelectMenu] Allow addItemLabel callbacks to return null/undefined to hide the add-new button for the current search text (for example, until a well-formed email is typed)

3.6.0

Minor Changes

  • #2495 3cf8f42 Thanks @tounsoo! - BETA [RichTextEditor] Added markdown support (contentType="markdown" to parse value/defaultValue as markdown, onMarkdownChange to emit markdown on every update) via TipTap’s official @tiptap/markdown extension, which is BETA upstream — known limitations are single-child-per-cell tables and possible loss of HTML comments on round-trip. BETA [RichTextEditor] Added an extensions prop to inject custom TipTap extensions (e.g. a custom node type); an extension sharing a built-in’s name overrides it. BETA [RichTextEditor] Restricted the default Image extension’s src to http:/https: only, closing off tracking-pixel hosts and non-http(s) schemes previously allowed unrestricted. This is a behavior change for existing allowMedia consumers relying on other schemes — pass the new isAllowedImageSrc prop to opt back in.

Patch Changes

  • #2467 6540bd5 Thanks @tounsoo! - [Listbox] Fix TypeScript error when passing an array to selected in controlled multiselect mode with items prop. Fix controlled mode updating internal state on click and keyboard selection instead of deferring to the selected prop.
  • #2496 a48f5ad Thanks @w-a-t-s-o-n! - [Icon] Fix SVG gradient ID collisions when multiple gradient icons render on the same page
  • #2487 f492511 Thanks @tounsoo! - [Dialog] Fix nested Dialog inheriting an ancestor dialog’s --a2-mod-dialog-max-width, causing it to render at the wrong max-width instead of its own size default
  • #2500 775a836 Thanks @jarizast! - BETA [DataTable] Fix the ascending → descending → none sort cycle collapsing to a single state for nullable columns under server-side (async) sorting by pinning sortDescFirst to false when manualSorting is enabled

3.5.0

Minor Changes

  • #2490 386ffa2 Thanks @AdamLantz! - [MultiSelectField, MultiSelectMenu] Support a function for selectAll / selectFiltered checkState so the bulk-action checkbox can reflect the current selection (e.g. checked when all are selected, indeterminate when some are). The function receives the current selection (the confirmation draft when confirmation is enabled, otherwise the committed value). This also enables per-cell Select All state for DataTable’s multiselect-async editable cells, where the column-level config is shared across cells.

Patch Changes

  • #2494 b975af7 Thanks @tounsoo! - BETA [InteractiveCard] Merge a ref passed via wrapperProps with the component’s forwarded ref, so consumers can access the wrapper element even when using wrapperProps.ref.
  • #2482 673fe8f Thanks @AdamLantz! - Calendar: fix the month and year pickers closing popover hosts (e.g. FilterBar’s date-range filter) when a month or year is selected. The picker cards are label-based and not natively focusable, so a mousedown could blur focus to document.body and trigger the popover’s focus-out close before the selection applied. The cards now cancel their default mousedown to preserve focus, matching the existing footer-button behavior.
  • #2493 2f30cf0 Thanks @jarizast! - [DataTable] Fix column sort occasionally triggering after column resize
  • #2494 b975af7 Thanks @tounsoo! - [SideNav] Fix a crash when rendering SideNavProvider during server-side rendering (e.g. Next.js SSR), where window is not defined.
  • #2486 202f32e Thanks @AdamLantz! - BETA [FilterBar] Add minDate, maxDate, and unavailable support to date and dateRange filters so consumers can restrict which dates are selectable in both the toolbar popover and the drawer. Typing a value outside those constraints is still allowed but now surfaces an error message on the field, with an optional getErrorMessage callback to override the default copy.
  • #2489 d8a1fcc Thanks @AdamLantz! - BETA [FilterBar] Fix the calendar overlapping the Clear / Apply / Cancel footer when the popover is height-constrained. The popover body now scrolls its content instead of letting it spill over the fixed footer.
  • #2488 01df630 Thanks @pbuckingham-st! - [AnvilProvider] cssUtils is deprecated and no longer loads stylesheets — import the CSS utility stylesheets you need directly instead.
  • #2475 d90ef2a Thanks @tounsoo! - BETA [FilterBar] Add search filter type for a pinned, always-visible search field
  • #2494 b975af7 Thanks @tounsoo! - [MultiSelectField, SelectField] Fix a React console warning caused by passing the popovertarget attribute in lowercase instead of the camelCase popoverTarget prop React expects.

3.4.2

Patch Changes

  • #2473 07b379d Thanks @w-a-t-s-o-n! - [AnvilProvider] Fix cssUtils prop not loading styles due to incorrect import paths in published package
  • #2469 7d8fda9 Thanks @tounsoo! - [PageHeader] Fix icon and className not forwarded to Menu.Item in secondary actions overflow menu

3.4.1

Patch Changes

  • #2448 e53dab6 Thanks @tounsoo! - [Button] Fix focus ring appearing on mouse click by restricting it to :focus-visible
  • #2458 d35066d Thanks @w-a-t-s-o-n! - BETA [FilterBar] Add excludeDefaultOptions prop to dateList filters for omitting built-in default options
  • #2448 e53dab6 Thanks @tounsoo! - [Popover] On a keyboard close (e.g. Escape), focus now returns to the trigger with a visible focus ring, matching :focus-visible semantics; pointer closes restore focus without a ring. Applies to both the stable Popover and the beta popover.
  • #2459 c398449 Thanks @hbartlett-st! - BETA [DataTable] Fix server-paginated tables getting stuck in a perpetual loading state by memoizing the controlled sorting reference

3.4.0

Minor Changes

  • #2437 7eaf679 Thanks @jsphstls! - Overflow: add a contentRef prop that forwards a ref to the scrollable content element (the inner element with overflow: auto). The component’s own ref still points at the outer wrapper, which does not scroll, so use contentRef when an integration must target the actual scroller — e.g. a virtualizer’s getScrollElement, an IntersectionObserver sentinel, or programmatic scrolling.

Patch Changes

  • #2447 b49ded5 Thanks @w-a-t-s-o-n! - [Icons, AiMark] Fix gradient SVG ID collisions when multiple AI mark icons render on the same page

3.3.0

Minor Changes

  • #2428 9eb595b Thanks @w-a-t-s-o-n! - [Combobox] Deprecate in favor of SelectField and MultiSelectField
  • #2423 e536233 Thanks @w-a-t-s-o-n! - [AnvilProvider] Add cssUtils prop to automatically load CSS utility stylesheets
  • #2428 9eb595b Thanks @w-a-t-s-o-n! - [MultiSelectField, MultiSelectMenu, SelectField, SelectMenu] Promote select components from beta to the stable package export; retain deprecated beta re-exports until Anvil2 4.0

Patch Changes

  • #2435 e975960 Thanks @cursor! - [Combobox] Hide dropdown caret when disablePopover is true
  • #2419 daaa703 Thanks @cursor! - BETA [DataTable] Fix header, footer, and pagination z-index leaking outside the table container

3.2.0

Minor Changes

  • #2386 efd6121 Thanks @hbartlett-st! - [NumberField, TextField] Add isHighlighted prop that applies a subdued primary background to draw attention to the field

Patch Changes

  • #2386 efd6121 Thanks @hbartlett-st! - BETA [MultiSelectField, SelectField] Add isHighlighted prop that applies a subdued primary background to draw attention to the field
  • #2415 58eb789 Thanks @w-a-t-s-o-n! - [Details] Fix incorrect content padding when Details components are nested
  • #2413 1c606c5 Thanks @AdamLantz! - BETA [TreeSelectField] Add getChipProps callback to customize chip props (color, icon, avatar, etc.) per selected option
  • #2386 efd6121 Thanks @hbartlett-st! - BETA [TypeaheadTextField] Add new component for text input with inline suggestions shown in a popover

3.1.0

Minor Changes

  • #2407 5e46d4f Thanks @pbuckingham-st! - BETA [DataTable] Add onClickRow prop, called with the clicked row’s id when a row is clicked or activated with Enter

Patch Changes

  • #2378 f13b003 Thanks @pbuckingham-st! - [Page] Fix “Maximum update depth exceeded” crash when resizing a page with Page.Content.
  • #2372 f8e27ae Thanks @hbartlett-st! - BETA [chipsFormatter] When truncateChips: true:
    • Hovering the +N overflow chip now shows a tooltip listing every hidden chip label.
    • Truncation is computed in a hidden off-screen measurement cell, so the visible cell only ever paints the final state. Filtering or re-rendering with new chip sets no longer flickers while widths are calculated.
    • The hidden measurement cell no longer extends the table’s scroll area. It previously contributed its full single-row width to the scroll container’s overflow region, letting the table scroll well past its real columns.
  • Updated dependencies [2c042ed]:
    • @servicetitan/hammer-token@3.1.0

3.0.9

Patch Changes

  • #2391 168c5ce Thanks @w-a-t-s-o-n! - [Divider] Fix horizontal spacing values for half and 1 to match size tokens
  • #2376 48c651d Thanks @rgdelato! - BETA [DataTable] Remove row active state
  • #2376 48c651d Thanks @rgdelato! - BETA [DataTable] Add row hover state
  • #2400 bd7c4c5 Thanks @pbuckingham-st! - BETA [FilterBar] Defer mounting date filter popover content until the popover is open, avoiding unnecessary rendering of the date picker before it is shown
  • #2394 7401759 Thanks @ericag1985! - BETA [DataTable] Hide footer and pagination when the table is empty
  • #2385 a0223e7 Thanks @rgdelato! - BETA [DataTable] Allow custom editable cells to accept null and undefined values
  • #2402 ba729d3 Thanks @hbartlett-st! - BETA [htmlFormatter, markdownFormatter] Add support for strikethrough (~~, s/strike/del) and headings (# through ### , h1/h2/h3). htmlFormatter now renders underline (u), font size (span), and text alignment (text-align on p/h1-h3) as plain text, preserving their content instead of dropping it.
  • #2295 16ac423 Thanks @rgdelato! - BETA [DataTable] Add drag and resize functionality to overflow/editable surface

3.0.8

Patch Changes

  • #2382 e8a385d Thanks @pbuckingham-st! - [Popover, Tooltip, Toast, OptionsPopover] Apply the anvil2 theme scope (.anvil2 + theme-core) to portaled top-layer (popover) content so popovers, tooltips, toasts, and option popovers keep anvil2 styling and tokens instead of rendering unstyled when they escape the theme provider. [Combobox] Wrap custom Combobox.Empty content in the same .empty container as the built-in empty state so consumer-provided messages get consistent padding and alignment.
  • #2271 ca16764 Thanks @AdamLantz! - BETA [TreeSelectField] Add component for hierarchical tree selection with async loading, cascading selection, virtualization, search, and keyboard navigation
  • #2373 9752e52 Thanks @hbartlett-st! - BETA [FilterBar] Fix numericRange popover closing between keystrokes in uncontrolled mode (controlledFiltering={false}), which made multi-digit bounds impossible to enter.
  • #2373 9752e52 Thanks @hbartlett-st! - BETA [FilterBar] Add textInput filter type — a TextField with optional placeholder, maxLength, and showCounter (requires a concrete maxLength). Long values are ellipsised in the closed-button label.
  • #2379 6c75215 Thanks @AdamLantz! - BETA [FilterBar] Add tree and asyncTree filter types for hierarchical selection.
  • #2355 e9de657 Thanks @rgdelato! - BETA [DataTable] Revert stricter type for DataTableRowData
  • #2271 ca16764 Thanks @AdamLantz! - BETA [TreeSelectMenu] Add component for hierarchical tree selection attached to a custom trigger element, with async loading, client-side filtering via TreeSelectMenuSync, cascading selection, virtualization, search, and keyboard navigation.
  • #2379 6c75215 Thanks @AdamLantz! - BETA [TreeSelectMenu] Add confirmation and clear props, mirroring MultiSelectMenu.

3.0.7

Patch Changes

  • #2365 0d8b5ac Thanks @AdamLantz! - BETA [MultiSelectMenu, MultiSelectMenuSync, SelectMenu, SelectMenuSync] Add clear config prop that renders a Clear button in the menu footer; presence of the prop enables the button, omit to suppress
  • #2365 0d8b5ac Thanks @AdamLantz! - BETA [FilterBar] Add a Clear button to filter popover footers. Always on for singleSelect, asyncSelect, multiSelect, asyncMultiSelect, date, dateRange, and dateList. Clear commits an empty value immediately and closes the menu.
  • #2370 7b75a84 Thanks @AdamLantz! - BETA [FilterBar] Align the custom, date, dateRange, and dateList filter popover shell with the menu-based filter types. Popover sizing rules, padding, and the footer actions now match selection filters, eliminating visual drift.
  • #2350 ebd6b58 Thanks @ericag1985! - BETA [FilterBar] Add drawerOnly flag to keep a filter exclusively in the drawer; the “All Filters” button now only appears when a filter is unreachable from the toolbar
  • #2367 4719b63 Thanks @hbartlett-st! - BETA [FilterBar/FilterDrawer] Add numericRange filter type with min/max NumberField inputs, optional currency/percentage decorator mode, minValue/maxValue clamping, and inclusiveBounds for toggling between ≥/≤ and >/< bound semantics.
  • #2364 f2f294d Thanks @AdamLantz! - BETA [FilterBar] Add asyncSelect and asyncMultiSelect filter types, supporting the full feature set of the SelectMenu and MultiSelectMenu components, respectively.
  • #2364 f2f294d Thanks @AdamLantz! - BETA [FilterBar]: Breaking rework of singleSelect / multiSelect filter types to align with SelectMenuSync and MultiSelectMenuSync APIs. Field renames (items → options, selectedItem → selectedOption, selectedItems → selectedOptions); the Item generic is removed (use the SelectMenuOption shape with extra for custom metadata); hasSearch / onSearch / onSearchClear / searchValue are removed — client-side filtering is automatic via match-sorter, override with the new filter prop. See the migration guide.
  • #2352 ef51a6e Thanks @ericag1985! - BETA [FilterBar] Remove the overflow prop; FilterBar always wraps. Shift the drawer-only collapse breakpoint from 768px to 640px. Add disableCollapse prop to keep filters inline at every container width. The id prop on FilterToggleButton now lands on the rendered <button> element.
  • #2317 28f1bf2 Thanks @rgdelato! - BETA [DataTable] Add cursor-style pagination support
  • #2366 4a60780 Thanks @AdamLantz! - BETA [SavedFiltersButton] Add new standalone beta component for managing saved filter presets. Designed to compose with FilterBar.
  • #2363 b2cc770 Thanks @AdamLantz! - BETA [MultiSelectMenu, MultiSelectMenuSync] Add opt-in confirmation prop. When enabled, the menu buffers selection as a draft and only commits on Apply. MultiSelectMenu and MultiSelectField also accept a new compute variant of selectAll / selectFiltered that integrates bulk actions with the confirmation draft and supports async resolution (the menu shows a loading state while the returned promise is pending); the existing onClick shape still works for the non-confirmation case.
  • #2353 e5e7ae3 Thanks @rgdelato! - [Combobox, ComboboxSelect] Bugfix for performance issues with a large number of selected items
  • #2358 1d17553 Thanks @AdamLantz! - BETA [MultiSelectField] Fix incorrect box-shadow appearing above input field

3.0.6

Patch Changes

  • #2346 9a175d8 Thanks @ericag1985! - BETA [SelectField] Fix disableSearch trigger height and padding to match the input-based trigger
  • #2343 8158aaa Thanks @ericag1985! - [Checkbox, Radio] Add cursor: pointer to label
  • #2346 9a175d8 Thanks @ericag1985! - BETA [FilterBar] Add dateList filter type for picking from a list of date buckets
  • #2344 436a99b Thanks @pbuckingham-st! - [DaysOfTheWeek] Fix clipped focus ring on day buttons
  • #2337 f8a1179 Thanks @ericag1985! - [Dialog] Fix scrollbar overlapping rounded corners by moving scrolling to an inner element inset from the container edges
  • #2338 13c5fec Thanks @tounsoo! - [Icons] Update 13 custom ServiceTitan icon SVGs to union vectors and remove stale fill/clip-path attributes so they render correctly with the Icon color prop
  • #2343 8158aaa Thanks @ericag1985! - [Tooltip] Remove position: absolute !important that broke scrolling on positioned ancestors

3.0.5

Patch Changes

  • #2336 0277423 Thanks @w-a-t-s-o-n! - BETA [FilterBar] Update filter drawer combobox SearchField and SelectTrigger to use medium size instead of small
  • #2313 13093b7 Thanks @AdamLantz! - BETA [MultiSelectField, MultiSelectMenu, SelectField, SelectMenu] Add addItemLabel and onAddNewItem props to render a persistent “Add new item” affordance below the option list.
  • #2324 e4a8d56 Thanks @pbuckingham-st! - [AnvilProvider] Fix unstyled Anvil2 components inside Anvil1 takeovers (Modal, Dialog, Drawer) by mirroring the .anvil2 class onto document.body.

3.0.4

Patch Changes

  • #2297 75aafc5 Thanks @ericag1985! - BETA [DataTable] Fix keyboard a11y for cells with actionable elements
  • #2298 8d8529b Thanks @w-a-t-s-o-n! - BETA [MultiSelectField, SelectField] Fix input box-shadow and dropdown outline leaks after reset() mixin no longer applies all: unset
  • #2274 8786d1a Thanks @rgdelato! - Bump versions of TypeScript to ^6.0.3
  • #2298 8d8529b Thanks @w-a-t-s-o-n! - [Components] Remove blanket all: unset from the shared SCSS reset() mixin used across component surfaces.
  • #2298 8d8529b Thanks @w-a-t-s-o-n! - [Breadcrumbs, Link] Fix focus and hover styles for links.
  • #2299 3be5f1a Thanks @ericag1985! - BETA [RichTextEditor] Stabilize drag-handle callbacks so the drag plugin no longer re-registers on every render, which was closing the mention popover when allowDragDrop and allowMention were both enabled in controlled mode
  • #2299 3be5f1a Thanks @ericag1985! - BETA [RichTextEditor] Set font-family on the editor body so content uses the Anvil2 paragraph font instead of the user-agent default
  • #2280 f7fe2ca Thanks @rgdelato! - BETA [DataTable] Add overflow option to display full cell contents
  • #2298 8d8529b Thanks @w-a-t-s-o-n! - [Button, List, ListView, Menu, Overflow, Popover, SideNav, Stepper, Switch, Tab, Text, TextField, Tooltip] Fix UA style leaks (input shadow, outline, line-height, text-align, popover positioning, heading bidi) after reset() mixin no longer applies all: unset
  • #2298 8d8529b Thanks @w-a-t-s-o-n! - [Breadcrumbs] Update breadcrumb.link.foreground.color to foreground.color.default
  • Updated dependencies [8786d1a, 8d8529b]:
    • @servicetitan/hammer-token@3.0.2

3.0.3

Patch Changes

  • #2291 2f03aa4 Thanks @AdamLantz! - BETA [SelectField, MultiSelectField] Add moreInfo prop for displaying a tooltip next to the label
  • #2296 5dfc370 Thanks @rgdelato! - BETA [DataTable] Update chipsFormatter to default to "small" Chips
  • #2306 c47f10b Thanks @AdamLantz! - [NumberField] Fix readOnly allowing value changes via Arrow keys, PageUp/PageDown, and Home/End.

3.0.2

Patch Changes

  • #2289 9d9c1c3 Thanks @w-a-t-s-o-n! - [CSS Utils] Scope published a2-* stylesheet rules under .anvil2 using the css-utils-anvil2-scope plugin in the root postcss.config.js, run from build:css-utils after copy-css-utils, so utilities match Anvil2 component specificity inside AnvilProvider.
  • #2201 c0e4ae6 Thanks @rgdelato! - BETA [DataTable] Add custom editable cell type
  • #2165 f40924e Thanks @sasuntitan! - BETA [RichTextEditor] Add new RichTextEditor component for authoring formatted rich text content
  • #2285 a05cb7f Thanks @ericag1985! - BETA [InteractiveCard] Fix click handling so nested form controls (Switch, TextField, contenteditable, etc.) receive their own clicks instead of triggering the card action
  • Updated dependencies [9d9c1c3]:
    • @servicetitan/hammer-token@3.0.1

3.0.1

Patch Changes

  • #2277 e7f4ecc Thanks @pbuckingham-st! - Stop emitting the @layer starter, reset, base, state, application; ordering statement in component CSS so strict minifiers (e.g. lightningcss) accept the emitted stylesheets.
  • #2265 4c802ea Thanks @ericag1985! - [Avatar, Dialog, Drawer, Text] Fix undefined appearing as a DOM class name when size="medium" and no .medium CSS class exists
  • #2263 04d03fe Thanks @AdamLantz! - [Utilities] Add a handful of missing css-utils
  • #2203 3b48e37 Thanks @pbuckingham-st! - BETA [FilterBar] Extract Toolbar.Filters into standalone FilterBar component with independent associatedContent, size, and overflow props. Remove Toolbar.Filters compound export. Filter types (Filter, BooleanFilter, etc.) are now exported from FilterBar instead of Toolbar.

3.0.0

Major Changes

Patch Changes

  • #1899 6ea319a Thanks @tounsoo! - [AiMark] Migrate CSS to 3.0 patterns (remove @layer wrapping and adopt .anvil2 specificity scoping).
  • #1899 6ea319a Thanks @tounsoo! - [FieldLabel][Switch] Position AI Mark on the far right of the container in label-row headings (CheckboxGroup, RadioGroup, SelectCardGroup via FieldLabel) and Switch.
  • #1899 6ea319a Thanks @tounsoo! - [Alert] Fix content padding.
  • #1899 6ea319a Thanks @tounsoo! - [Alert] Fix status icon size and vertical alignment with title.
  • #1899 6ea319a Thanks @tounsoo! - [Breadcrumbs, Button, ButtonCompound, ButtonToggle, ThemeProvider] Update styles to use new design tokens
  • #1899 6ea319a Thanks @tounsoo! - [EditCard, FieldLabel, FieldMessage, Icon, Link, ListView, Listbox, Menu, Overflow, Page, Pagination, Popover, ProgressBar, Radio, SearchField, SegmentedControl, SelectCard, SideNav, Skeleton, Spinner, Stepper, Switch, Tab, Text, TextField, Textarea, Toast, Toolbar, Tooltip]: Apply component tokens to SCSS files.
  • #1899 6ea319a Thanks @tounsoo! - [Tokens] Add Avatar component design tokens and migrate SCSS to use token variables.
  • #1899 6ea319a Thanks @tounsoo! - [Checkbox] Restore indeterminate icon precedence so the indeterminate state renders its icon regardless of the checked value.
  • #1899 6ea319a Thanks @tounsoo! - [Combobox, MultiSelectField] Fix group layout regression in option lists.
  • #1899 6ea319a Thanks @tounsoo! - [Tokens] Add Announcement component design tokens, missing foreground tokens for success, and migrate SCSS to use token variables.
  • #1899 6ea319a Thanks @tounsoo! - BETA [InteractiveCard] Migrate to 3.0 patterns (unwrap @layer blocks) and expose a new --a2-mod-interactive-card-action-background-color custom property for background overrides.
  • #1899 6ea319a Thanks @tounsoo! - [Tokens][Menu] Add menu.item hover and active state tokens (foreground.color-hover, foreground.color-active, background.color-active) and wire them through Menu styles.
  • #1899 6ea319a Thanks @tounsoo! - [Tokens] Add Badge component design tokens and migrate SCSS to use token variables.
  • #1899 6ea319a Thanks @tounsoo! - [SelectCard, YearSelector, Calendar, Page] Restore focus-ring and layout regressions dropped during rc-3.0.0 merges: SelectCard inner Checkbox/Radio className wiring, YearSelector focus ring via SelectCard’s focus-label mechanism, Calendar .cell:focus-visible ring on tabindex=-1 cells, and Page content-wrapper { grid-area: content; } so PageContent’s virtual-scroll ResizeObserver does not inflate the grid row
  • #1899 6ea319a Thanks @tounsoo! - BETA [Select] Fix option text color.
  • #1899 6ea319a Thanks @tounsoo! - [SelectMenu] Repair popover styling regressions (border, shadow, and highlighted row background).
  • #1899 6ea319a Thanks @tounsoo! - [Tokens][SideNav] Restructure SideNav tokens and update SideNav styles to match. Consumers referencing the prior SideNav token names must migrate to the new shape
  • #1899 6ea319a Thanks @tounsoo! - [Details, Dialog, Divider, Dnd, Drawer, DrillDown] Update styles to use new component tokens
  • #1899 6ea319a Thanks @tounsoo! - [Tokens][Switch] Restructure Switch tokens (new hierarchy and shadow token scoping) and update Switch styles to match. Consumers referencing the prior Switch token names must migrate to the new shape
  • #1899 6ea319a Thanks @tounsoo! - [Tokens] Consolidate TextField, Textarea, and SearchField tokens into a single text-field token set. search-field.tokens.json and textarea.tokens.json are removed; their tokens are merged into text-field.tokens.json with a flattened hierarchy and renames (e.g. background-color-strong → background-color-disabled). Consumers of the prior per-component token names must migrate
  • #1899 6ea319a Thanks @tounsoo! - [Text] Remove letter-spacing from the headline variant (all sizes).
  • #1899 6ea319a Thanks @tounsoo! - [Toast] Rename --a2-local-toaster-stack-padding CSS custom property to --a2-mod-toaster-stack-padding to align with the --a2-mod-* convention for component-local overrides.
  • #1899 6ea319a Thanks @tounsoo! - [Button] Apply disabled opacity via design token. [Calendar] Refactor styles to use design tokens and --a2-mod-* custom properties. [Card] Update styles to use design tokens. [Checkbox] Update styles to use design tokens. [Chip] Update styles to use design tokens. [Combobox] Update styles to use design tokens. [Icon] Rename custom properties from --a2-local-icon-* to --a2-mod-icon-*.
  • #1899 6ea319a Thanks @tounsoo! - [Tokens] Add Alert component design tokens and migrate SCSS to use token variables.
  • Updated dependencies [6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a, 6ea319a]:
    • @servicetitan/hammer-token@3.0.0
Last modified on November 2, 2026