Skip to main content
Releases of @servicetitan/anvil2 2.x. For current releases, see @servicetitan/anvil2. Source: packages/anvil2/CHANGELOG.md.

2.9.3

Patch Changes

  • #2283 2097a58 Thanks @pbuckingham-st! - BETA [DataTable] Add isActivatable / activeRowIds row-state API, readOnlyRowIds, and 3.0 row + editable-cell hover/active visuals
  • #2275 d4e992c Thanks @pbuckingham-st! - BETA [DataTable] Size the loading spacer to the previous body height so the table doesn’t stutter on quick loads.
  • #2275 d4e992c Thanks @pbuckingham-st! - BETA [DataTable] Fix long unbroken strings overflowing cells and widening the table grid.
  • #2275 d4e992c Thanks @pbuckingham-st! - BETA [DataTable] Fix non-pinned content bleeding past pinned column and pagination edges during horizontal scroll.
  • #2275 d4e992c Thanks @pbuckingham-st! - BETA [DataTable] Fix spurious horizontal scroll when focus lands on an interactive element inside a pinned column cell.
  • #2275 d4e992c Thanks @pbuckingham-st! - BETA [DataTable] Lower row virtualization threshold to 50 and add forceVirtualization for smaller but complex tables.
  • #2275 d7e3ed5 Thanks @pbuckingham-st! - [Tooltip] Fix tooltip content inheriting text alignment from its trigger’s container.

2.9.1

Patch Changes

  • #2244 935b5d4 Thanks @helenvholmes! - [Icons] Add unsorted icon for DataTable unsort hover state
  • #2239 9cd0e5a Thanks @pbuckingham-st! - BETA [DataTable] Add defaultWidth column property. When provided, it sets the preferred starting width for a column — the basis for auto-growing toward maxWidth and the floor that the table won’t auto-shrink below (it scrolls horizontally instead). Manual resize via the column handle is still bounded by minWidth, so users can drag a column below defaultWidth. Falls back to minWidth when not specified.
  • #2239 9cd0e5a Thanks @pbuckingham-st! - BETA [DataTable] Fix asymmetric-looking padding when classic (always-visible) scrollbars are enabled.
  • #2239 9cd0e5a Thanks @pbuckingham-st! - BETA [DataTable] Add row virtualization above 100 rows plus a suite of per-cell rendering optimizations.
  • #2239 9cd0e5a Thanks @pbuckingham-st! - BETA [DataTable] Fix pinned columns rendering with a visible gap on initial load.
  • #2239 9cd0e5a Thanks @pbuckingham-st! - [Pagination] Fix page number buttons clipping and visually overlapping when page numbers exceed 3 digits.

2.9.0

Minor Changes

Patch Changes

2.8.0

Minor Changes

  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [Skeleton] Add ai prop to Skeleton.Text, Skeleton.Circle, Skeleton.Pill, and Skeleton.Rectangle to apply blue gradient colors for AI content loading states
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [Switch] Add labelAiMark prop for displaying AI-powered field indicators next to the switch label
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [Alert, Text, toast] Add aiMark prop or toast option for displaying the AI mark inline with titles
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [Chip] Add aiMark prop to display an AI mark icon
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [Button] Add aiMark prop to include animated AI icon
  • #2168 f8d56e0 Thanks @ericag1985! - [FieldLabel, TextField, NumberField, Textarea, RadioGroup, CheckboxGroup, DateFieldSingle, DateFieldRange, DateFieldYearless, TimeField] Add hideLabel prop to visually hide labels while keeping them accessible, and add inline markdown support (**bold**, *italic*, ***bold italic***, ==highlight==, `code`) in label strings
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [AiMark] Add AiMark component for displaying animated AI mark with optional tooltip or popover
  • #2186 75f1cf1 Thanks @ericag1985! - [SelectCard] Add value and defaultValue props to SelectCard.Group for controlled and uncontrolled group-level selection state
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [usePrefersReducedMotion] Add usePrefersReducedMotion hook for detecting the user’s reduced motion system preference
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [DateFieldRange, DateFieldSingle, DateFieldYearless, DaysOfTheWeek, NumberField, SelectTrigger, Textarea, TextField, TimeField] Add aiMark via labelProps for AI-powered field indicators
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [FieldLabel] Add aiMark prop for displaying AI-powered field indicators with optional tooltip or popover context
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [Types] Export AiMarkBooleanProps, AiMarkCollapsePadding, AiMarkWithTooltipOrPopoverProps, AiMarkWithTooltipOrPopoverConfig, and AiMarkProps types
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [Checkbox.Group, DateFieldYearlessRange, Radio.Group, SelectCard.Group] Add aiMark via legendProps on the group legend for AI-powered field indicators

Patch Changes

  • #2184 0814ff2 Thanks @AdamLantz! - BETA [MultiSelectField] Add getChipProps callback to customize chip appearance per selected option
  • #2166 5cef90f Thanks @rgdelato! - BETA [DataTable] Add background gradient for edit cell icon
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - BETA [MultiSelectField, SelectField] Add labelAiMark prop for displaying AI-powered field indicators
  • #2202 1f3828b Thanks @pbuckingham-st! - [Page] Memoize context value to prevent unnecessary re-renders of consumers
  • #2156 c27d4df Thanks @rgdelato! - BETA [DataTable] Add caching for loadPageData
  • #2168 f8d56e0 Thanks @ericag1985! - BETA [SelectField, MultiSelectField] Remove labelNode prop; use inline markdown in the label string instead
  • #1883 6042a60 Thanks @w-a-t-s-o-n! - [Icons] Update ai_mark_gradient icon with dark mode color support using light-dark()

2.7.1

Patch Changes

  • #2164 42c9c93 Thanks @rgdelato! - BETA [DataTable] Sort full dataset before paginating instead of only the current page. Add sorting parameter to loadPageData for server-side sort support. Reset page to 0 when sort changes.
  • #2126 a097abc Thanks @AdamLantz! - BETA [DataTable] Rework select and multiselect editable column types; add select-async and multiselect-async. This change increases parity with the SelectMenu and MultiSelectMenu interfaces.
  • #2173 14bf4ce Thanks @ericag1985! - [DateFieldSingle, DateFieldRange] Fix calendar day cells not being keyboard accessible — ArrowDown from the toolbar now moves focus into the day grid
  • #2130 d48dd6e Thanks @rgdelato! - [Page] Fix Page.Content visible virtual scrollbar on Windows
  • #2174 bd401c6 Thanks @w-a-t-s-o-n! - [Overflow.Text] Fix ellipsis not appearing in some cases when children has no spaces

2.7.0

Minor Changes

Patch Changes

2.6.1

Patch Changes

  • #2112 d4f1f36 Thanks @AdamLantz! - BETA [SelectMenu, MultiSelectMenu] Add new components for attaching robust selection menus to any trigger element
  • #2123 d2e9c25 Thanks @rgdelato! - BETA [DataTable] Add warning states
  • #2129 3a16bc1 Thanks @ericag1985! - [Listbox, DateFieldSingle, DateFieldRange, DateFieldYearless, ToolbarSelect] Replace existing popover with new internal popover and clean up manual focus work BETA [FilterButton, ToolbarSelect] Replace existing popover with new internal popover and clean up manual focus work

2.6.0

Minor Changes

  • #2124 37cdb76 Thanks @ericag1985! - [FieldLabel, TextField, Textarea, NumberField, DateFieldSingle, DateFieldRange, DateFieldYearless, DateFieldYearlessRange, CheckboxGroup, RadioGroup, SelectTrigger, Combobox] Fix moreInfo tooltip accessibility — tooltip now opens from a keyboard-accessible button trigger instead of on input focus; Deprecate moreInfoOpen prop on FieldLabel.
  • #2127 ee81c08 Thanks @helenvholmes! - [Icon] Add icon resize_window_alt

Patch Changes

  • #2119 d1eb0c9 Thanks @rgdelato! - [useBreakpoint] Bugfix for calculation being affected by browser zoom

2.5.1

Patch Changes

2.5.0

Minor Changes

  • #2094 a919352 Thanks @helenvholmes! - [Icons] Add ai_chat, ai_edit, ai_form, ai_mic, and ai_search custom ST icons
  • #2059 2deba8e Thanks @w-a-t-s-o-n! - [List] Add List component for ordered and unordered lists with List.Item, variant, and size props

2.4.0

Minor Changes

  • #2082 9736150 Thanks @ericag1985! - [Tab] Add index and onIndexChange props for controlled state
  • #2080 0a7d8c7 Thanks @stadevosyan! - [Pagination] Add itemsPerPageLabel prop to customize the label displayed before the items-per-page selector (defaults to “Rows per page”)

Patch Changes

  • #2076 623398f Thanks @AdamLantz! - BETA [DataTable] Add boolean edit mode for inline editing of boolean cell values
  • #2084 edae603 Thanks @rgdelato! - [DataTable] Add disableExpandAll and disableSelectAll props
  • #2082 9736150 Thanks @ericag1985! - [Tab] Fix aria-label and aria-labelledby on Tab.List not reaching the role="tablist" element
  • #2076 623398f Thanks @AdamLantz! - BETA [DataTable] Remove boolean value support from "text" edit mode in favor of the new "boolean" edit mode

2.3.0

Minor Changes

Patch Changes

  • #2060 8e4cea6 Thanks @rgdelato! - [DataTable] Add emptyState prop
  • #2012 656c287 Thanks @AdamLantz! - BETA [SelectField, MultiSelectField] Add disableSearch prop which will remove text entry, allowing the components to function as select only.
  • #2060 8e4cea6 Thanks @rgdelato! - [Illustrations] Add new @servicetitan/anvil2-illustrations package
  • #1872 f64e906 Thanks @claude! - [SelectCard] Fix checked and defaultChecked state when used in SelectCard.Group

2.2.0

Minor Changes

  • #2051 e0ca085 Thanks @AdamLantz! - [DateFieldSingle, DateFieldRange] Add timezone prop to control the calendar’s “Today” button, initial display month, and show a disambiguation message when the timezone differs from the user’s locale

Patch Changes

  • #2039 7decf90 Thanks @rgdelato! - [Tokens] Bugfix for using @servicetitan/anvil2/token/ files in SCSS
  • #2045 22d8c3e Thanks @AdamLantz! - BETA [SelectField, MultiSelectField] Add invalidate() method to imperative handle and fix SelectFieldSync/MultiSelectFieldSync not updating when options prop changes
  • #2053 3da2bf9 Thanks @AdamLantz! - [FieldMessage] Update status icon assets
  • #2048 c5dab06 Thanks @rgdelato! - [Popover, Tooltip] Bugfix for unintentionally inheriting CSS font-weight from parent
  • #2015 79ab1db Thanks @konradszczerba! - [Combobox, ComboboxSelect] Fix groupSorter prop passthrough
  • #2040 24d0da0 Thanks @rgdelato! - [SelectField, MultiSelectField] Bugfix for options with disabled property

2.1.0

Minor Changes

  • #1910 a3f4962 Thanks @hbartlett-st! - [DaysOfTheWeek] Add error prop accepting string | string[] and warning prop accepting string | string[]. Deprecate errorMessage and errorAriaLive
  • #1910 a3f4962 Thanks @hbartlett-st! - [FieldMessage] Add error and warning props accepting string | string[], support multiple messages, make hints persistent, hardcode aria-live values. Deprecate errorMessage, errorAriaLive, and ReactElement usage for error/warning
  • #1910 a3f4962 Thanks @hbartlett-st! - [TextField, NumberField, Textarea, DateFieldYearless, DateFieldYearlessRange, ProgressBar, CheckboxGroup, RadioGroup] Widen error prop to accept string | string[], add warning prop accepting string | string[], deprecate errorAriaLive and passing ReactElement to error

Patch Changes

  • #1910 a3f4962 Thanks @hbartlett-st! - BETA [SelectField, MultiSelectField] Widen error prop to accept string | string[], add warning prop accepting string | string[], deprecate errorAriaLive and passing ReactElement to error
  • #1997 51e2b40 Thanks @AdamLantz! - BETA [MultiSelectField] Add selectFiltered prop to select/deselect options matching the current search term. Select All and Select Filtered are mutually exclusive: Select All is shown when the search input is empty, Select Filtered is shown when a search term is active. Also adds sticky positioning with a floating shadow for bulk action items (Select All / Select Filtered).
  • #2004 ce5c420 Thanks @ericag1985! - BETA [Toolbar.Filters] Fix multi-select filters to call onFilterChange on each selection in uncontrolled mode instead of only on popover close
  • #2009 5a2092d Thanks @AdamLantz! - BETA [SelectFieldSync, MultiSelectFieldSync] Fix default filter to preserve original option order when match quality is equal
  • #1975 cee79b8 Thanks @AdamLantz! - [Toast] Fix stacking position calculation when batch-firing multiple toasts
  • #1976 ac35fc7 Thanks @AdamLantz! - BETA [DataTable] Remove number value support from "text" edit mode in favor of the new "number" edit mode
  • #2005 b3ba2a2 Thanks @AdamLantz! - BETA [SelectField, MultiSelectField] Add chips, avatar, and icon support to option content for rich option rendering
  • #1976 ac35fc7 Thanks @AdamLantz! - BETA [DataTable] Add "number" editable cell mode with formatting, min/max constraints, and keyboard increment/decrement support
  • #2006 fb6afdd Thanks @ericag1985! - [Stepper] Add support for initializing in the completed state via defaultIndex
  • #2010 9401a15 Thanks @AdamLantz! - BETA [SelectField, MultiSelectField] Add virtualize prop for conditional list virtualization
  • #1985 51c1a9e Thanks @rgdelato! - [DataTable] Add row param to Table column renderCell
  • #1997 51e2b40 Thanks @AdamLantz! - BETA [MultiSelectField] Fix an issue where search term would be cleared after making a selection

2.0.4

Patch Changes

  • #1971 c1546dc Thanks @AdamLantz! - [DateFieldSingle, DateFieldRange] Fix typed date shifting by a day in non-UTC timezones
  • #1973 860d2c7 Thanks @AdamLantz! - [Calendar] Fix month and year dropdown selecting wrong month/year when defaultTimeZone is west of the user’s local timezone

2.0.3

Patch Changes

  • #1942 e1b9b15 Thanks @AdamLantz! - BETA [SelectField, MultiSelectField] Add option grouping via option-level group property and component-level groupToString prop. Additional support for groupSorter prop implemented for eager-loaded fields
  • #1952 e11fee7 Thanks @AdamLantz! - [Toast] Fix uncleaned timers in ToastStack that could fire after unmount, causing ReferenceError in test environments
  • #1956 b518b2f Thanks @pbuckingham-st! - BETA [DataTable] Add className to component.
  • #1942 e1b9b15 Thanks @AdamLantz! - BETA [SelectField, MultiSelectField] Fix search result cache skipping entries when a search returns zero options
  • #1957 74edbd8 Thanks @pbuckingham-st! - [DndSort] Drop zone registers correctly for the first drop.
  • #1909 8547db6 Thanks @rgdelato! - Bump peerDependencies versions of React to ^18 || ^19
  • #1938 0c495a3 Thanks @AdamLantz! - BETA [DataTable] Add type and editConfig properties to column helper
  • #1942 e1b9b15 Thanks @AdamLantz! - BETA [SelectField, MultiSelectField] Add pinned prop for displaying labeled pinned option sections with async loading, searchReactive, and cacheSize configuration

2.0.2

Patch Changes

  • #1902 e66f0a0 Thanks @omarmeky! - [Popover] Fix unnecessary child remounting on reopen
  • #1905 0257c91 Thanks @AdamLantz! - BETA [DataTable] Update default date format presets to short for dateFormatter, dateTimeFormatter, and yearlessDateFormatter

2.0.1

Patch Changes

  • #1834 621d4e0 Thanks @AdamLantz! - BETA [DataTable] Fix inability to move between editable cells via click (i.e. no longer requires multiple clicks)
  • #1854 bb399a2 Thanks @Diveafall! - BETA [DataTable]: Add imperative refresh() method via ref for programmatic data refetch
  • #1834 621d4e0 Thanks @AdamLantz! - BETA [DataTable] Fix excessive re-renders caused by unchanged data when an editable cell was interacted with
  • #1873 70c1726 Thanks @AdamLantz! - BETA [DataTable]: Remove background prop and add border styling for container distinction
  • #1890 bc4e3a2 Thanks @AdamLantz! - BETA [DataTable] Fix chipsFormatter to consistently wrap chips in both string and object array modes; also prevent duplicate keys error
  • #1897 20011dc Thanks @ericag1985! - [Combobox] Fix inputValue not syncing with controlled selectedItem when selection is canceled
  • #1890 bc4e3a2 Thanks @AdamLantz! - BETA [DataTable] Fix currencyFormatter and percentFormatter to correctly format 0 values instead of returning null
  • #1844 5f673dc Thanks @AdamLantz! - BETA [DataTable] Add support for cell-level and row-level errors
  • #1834 621d4e0 Thanks @AdamLantz! - [Menu] Fix issue where trigger element was refocused after a different interactive element was clicked
  • #1834 621d4e0 Thanks @AdamLantz! - BETA [DataTable] Remove requestAnimationFrame-based workarounds for focus management
  • #1890 bc4e3a2 Thanks @AdamLantz! - BETA [DataTable] Add booleanFormatter, numberFormatter, dateFormatter, timeFormatter, dateTimeFormatter, and yearlessDateFormatter utilities for formatting table cells with i18n support
  • #1877 df8258b Thanks @AdamLantz! - [NumberField] Fix input starting with a decimal point (e.g., “.5”) by automatically prepending “0” to produce valid values (e.g., “0.5”)
  • #1895 323e75b Thanks @w-a-t-s-o-n! - [Pagination] Add white background to items per page dropdown menu
  • #1834 621d4e0 Thanks @AdamLantz! - BETA [DataTable] Fix entire DataTable re-rendering when traversing between cells
  • #1895 323e75b Thanks @w-a-t-s-o-n! - BETA [DataTable] Add rowsPerPageOptions and onRowsPerPageChange props to enable rows per page selection in pagination
  • #1857 a71c558 Thanks @rgdelato! - [Page] Update Page.Header title to support inline edit
  • #1834 621d4e0 Thanks @AdamLantz! - [Menu] No longer refocuses trigger element when deprecated open prop changes
  • #1834 621d4e0 Thanks @AdamLantz! - BETA [DataTable] Fix cells appearing behind footer when navigating via keyboard
  • #1877 df8258b Thanks @AdamLantz! - [NumberField] Fix inability to type trailing decimal zeros (e.g., “1.0”, “1.00”) in controlled mode when minimumFractionDigits is not set
  • #1834 621d4e0 Thanks @AdamLantz! - BETA [DataTable] Introduce tighter types when editMode is used on columns (e.g. a number column should not have editMode of "multiselect")

2.0.0

Major Changes

  • #1837 3c638be Thanks @pbuckingham-st!
    • [Breadcrumbs] The export of BreadcrumbsElement has been removed.
    • [Calendar] The deprecated unavailableDates has been removed. Use unavailable.dates instead.
    • [Checkbox] The export of CheckboxGroup has been removed. Use Checkbox.Group instead.
    • [Checkbox] The event parameter of the onChange prop is required.
    • [Chip] small Chip only allows either onChange or onClose.
    • [Combobox] The component now requires the html popover API.
    • [Combobox.SelectTrigger] The deprecated openMoreInfo has been removed. Use moreInfoOpen instead.
    • [DateField] The deprecated component has been removed. Please use DateFieldSingle or DateFieldRange instead.
    • [Details] The exports of DetailsSummary and DetailsContent have been removed. Use Details.Summary and Details.Content instead.
    • [Dialog] The exports of DialogContent, DialogHeader, DialogFooter, and DialogCancelButton have been removed. Use Dialog.Content, Dialog.Header, Dialog.Footer, and Dialog.CancelButton instead.
    • [Dialog] The deprecated onOpen and onOpenChange have been removed. Use onOpenAnimationStart, onOpenAnimationComplete, and onClose instead.
    • [Drawer] The deprecated onOpen has been removed. Use onOpenAnimationStart and onOpenAnimationComplete instead.
    • [FieldLabel] The deprecated openMoreInfo has been removed. Use moreInfoOpen instead.
    • [Flex] The deprecated flexShrink has been removed. Use shrink instead.
    • [Icons] Certain icons have been updated for consistent naming.
      • gnav_dial_pad_filled.svg -> gnav_dial_pad_active.svg
      • gnav_dial_pad_outline.svg -> gnav_dial_pad_inactive.svg
      • gnav_dial_pad_inactive_outline.svg -> gnav_dial_pad_disabled.svg
      • gnav_home_filled.svg -> gnav_home_active.svg
      • gnav_home_outline.svg -> gnav_home_inactive.svg
      • gnav_legacy_search_filled.svg -> gnav_legacy_search_active.svg
      • gnav_legacy_search_outline.svg -> gnav_legacy_search_inactive.svg
    • [Link] The deprecated quiet prop has been removed. Use ghost instead.
    • [LinkButton] The deprecated quiet prop has been removed. Use ghost instead.
    • [ListView.Option] The event parameter of the onChange prop is required.
    • [Menu] The component now requires the html popover API.
    • [Menu] The deprecated root has been removed. This prop has no functionality, so it can be safely removed.
    • [Popover] The exports of PopoverButton, PopoverClose, PopoverContent, and PopoverTrigger have been removed. Use Popover.Button, Popover.Close, Popover.Content, and Popover.Trigger instead.
    • [Popover] The deprecated onOpenChange has been removed. Use onOpenAnimationStart, onOpenAnimationComplete, and onClose instead.
    • [Popover] The deprecated onOutsidePress has been removed. Use onClickOutside instead.
    • [Popover] The deprecated disableFocusLock has been removed. Use modal instead.
    • [Popover] The deprecated root has been removed. This prop has no functionality, so it can be safely removed.
    • [Popover] The component now requires the html popover API.
    • [Popover.Trigger] The data-state attribute passed in the children render function has been replaced with aria-expanded.
    • [Radio] The export of RadioGroup has been removed. Use Radio.Group instead.
    • [Radio] The event parameter of the onChange prop is required.
    • [Radio.Group] The legend prop is required.
    • [SelectCard] The export of SelectCardElement has been removed.
    • [SelectCard] The export of SelectCardGroup has been removed. Use SelectCard.Group instead.
    • [SelectTrigger] The deprecated openMoreInfo has been removed. Use moreInfoOpen instead.
    • [SideNav] The exports of SideNavLink, SideNavGroup, and SideNavCollapsible have been removed. Use SideNav.Link, SideNav.Group, and SideNav.Collapsible instead.
    • [Textarea] The errorAriaLive prop no longer accepts a boolean. Use "off", "assertive", or "polite" instead.
    • [Textarea] The event parameter of the onChange prop is required.
    • [Textarea] The deprecated openMoreInfo has been removed. Use moreInfoOpen instead.
    • [Toaster] The deprecated duration has been removed. The duration can be set on individual toasts.
    • [Toaster] The deprecated forceRender has been removed.
    • [Toolbar] The export of ToolbarElement has been removed.
    • [Toolbar] The exports of ToolbarButton, ToolbarButtonToggle, ToolbarButtonLink, and ToolbarSelect have been removed. Use Toolbar.Button, Toolbar.ButtonToggle, Toolbar.ButtonLink, and Toolbar.Select instead.
    • [Toolbar.Button] The onClick prop is required.
    • [Tooltip] The deprecated root has been removed. This prop has no functionality, so it can be safely removed.
    • [Tooltip] The component now requires the html popover API.
Last modified on November 2, 2026