> ## Documentation Index
> Fetch the complete documentation index at: https://anvil.servicetitan.com/llms.txt
> Use this file to discover all available pages before exploring further.

# @servicetitan/anvil2-ai-kit

> Release notes for @servicetitan/anvil2-ai-kit, newest first.

Current version: **0.11.11**. Source: [`packages/anvil2-ai-kit/CHANGELOG.md`](https://github.com/servicetitan/hammer/blob/main/packages/anvil2-ai-kit/CHANGELOG.md).

## 0.11.11

### Patch Changes

* [#3027](https://github.com/servicetitan/hammer/pull/3027) [`60f130a`](https://github.com/servicetitan/hammer/commit/60f130a31e8c7d2652016e428c9c08f87ef4bd16) Thanks [@ericag1985](https://github.com/ericag1985)! - \[CartoTheme] Render bold body text at the semibold weight

* [#3027](https://github.com/servicetitan/hammer/pull/3027) [`60f130a`](https://github.com/servicetitan/hammer/commit/60f130a31e8c7d2652016e428c9c08f87ef4bd16) Thanks [@ericag1985](https://github.com/ericag1985)! - \[GuidanceCard] Update the reason label to use the semibold weight token

* Updated dependencies \[]:
  * @servicetitan/anvil2-icons\@0.1.10

## 0.11.10

### Patch Changes

* Updated dependencies \[[`60a7a12`](https://github.com/servicetitan/hammer/commit/60a7a12c58bfa1ce3b9abe55d631acd470be4b40)]:
  * @servicetitan/anvil2-icons\@0.1.9

## 0.11.9

### Patch Changes

* [#2932](https://github.com/servicetitan/hammer/pull/2932) [`5a21d98`](https://github.com/servicetitan/hammer/commit/5a21d983676ac8686b864917484bc4267a6533b8) Thanks [@pbuckingham-st](https://github.com/pbuckingham-st)! - \[DiffValue, Text, TruncatedText] Change the suggested-change highlight fill to a blue-to-cyan gradient

* Updated dependencies \[]:
  * @servicetitan/anvil2-icons\@0.1.8

## 0.11.8

### Minor Changes

* [#2886](https://github.com/servicetitan/hammer/pull/2886) [`71fbcd1`](https://github.com/servicetitan/hammer/commit/71fbcd1f93dac929d64d8d3f757366c5c670ec6c) Thanks [@arnold-dad-st](https://github.com/arnold-dad-st)! - \[ChatHistory] Add a tooltip revealing the full chat title on hover when it is truncated

### Patch Changes

* Updated dependencies \[]:
  * @servicetitan/anvil2-icons\@0.1.7

## 0.11.7

### Patch Changes

* Updated dependencies \[[`6e236a2`](https://github.com/servicetitan/hammer/commit/6e236a2b55edd8f4ebbe240d78e1a3a6a3588586)]:
  * @servicetitan/anvil2-icons\@0.1.6

## 0.11.6

### Minor Changes

* [#2827](https://github.com/servicetitan/hammer/pull/2827) [`165ba0d`](https://github.com/servicetitan/hammer/commit/165ba0d390bbfc66fde4c4dddd1154c94ee1f9de) Thanks [@ericag1985](https://github.com/ericag1985)! - \[AppShell] Add drag resizing for the rail with responsive width restoration and drawer sizing

### Patch Changes

* Updated dependencies \[]:
  * @servicetitan/anvil2-icons\@0.1.5

## 0.11.5

### Patch Changes

* Updated dependencies \[]:
  * @servicetitan/anvil2-icons\@0.1.4

## 0.11.4

### Minor Changes

* [#2761](https://github.com/servicetitan/hammer/pull/2761) [`c7ad37d`](https://github.com/servicetitan/hammer/commit/c7ad37db9f5af83d46f69b381331c0709595e4bb) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Markdown] Add chat-styled GFM tables with overflow

## 0.11.3

### Patch Changes

* [#2757](https://github.com/servicetitan/hammer/pull/2757) [`74b671f`](https://github.com/servicetitan/hammer/commit/74b671fd2da885a77010aacc9983b8f6fa220a60) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[ChatLayout] Fix the "scroll to latest" button letting transcript content show through its translucent secondary fill

## 0.11.2

### Patch Changes

* [#2729](https://github.com/servicetitan/hammer/pull/2729) [`84ff49a`](https://github.com/servicetitan/hammer/commit/84ff49a85f39dfb2c43219a1d67eae5e16078a02) Thanks [@jpex](https://github.com/jpex)! - \[Suggestion] Fix bordered suggestion chips to keep a consistent 40px tap target

* [#2729](https://github.com/servicetitan/hammer/pull/2729) [`84ff49a`](https://github.com/servicetitan/hammer/commit/84ff49a85f39dfb2c43219a1d67eae5e16078a02) Thanks [@jpex](https://github.com/jpex)! - \[Suggestion] Restyle the chip surface to match Card — standard fill, 1px standard border, and hover-only ambient elevation

* [#2755](https://github.com/servicetitan/hammer/pull/2755) [`018477e`](https://github.com/servicetitan/hammer/commit/018477ea12875a422499ebed2327afcd31013109) Thanks [@arnold-dad-st](https://github.com/arnold-dad-st)! - \[TabbedLayout] Fix panel content losing its state and scroll position when switching tabs or changing layout mode

* [#2741](https://github.com/servicetitan/hammer/pull/2741) [`51b4408`](https://github.com/servicetitan/hammer/commit/51b440869c750ef2e7df1fe79894fcc6fcb8216b) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ButtonToggle] Fix toggles rendering 4px larger than the equivalent `Button`

* Updated dependencies \[]:
  * @servicetitan/anvil2-icons\@0.1.3

## 0.11.1

### Patch Changes

* Updated dependencies \[[`2ef0653`](https://github.com/servicetitan/hammer/commit/2ef06532214695ce98607caaefb9f0e51cedf3b1)]:
  * @servicetitan/anvil2-icons\@0.1.2

## 0.11.0

### Major Changes

* [#2691](https://github.com/servicetitan/hammer/pull/2691) [`4ff7ce9`](https://github.com/servicetitan/hammer/commit/4ff7ce9d0f3752afb11e583a6046eb301afe4d67) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Exports] Rename public DOM data attributes from `data-carto*` to `data-ai-kit*` (including theme, scroll-lock, and handle attributes). Update any selectors, tests, or overrides that targeted the old attribute names.

* [#2711](https://github.com/servicetitan/hammer/pull/2711) [`4b85324`](https://github.com/servicetitan/hammer/commit/4b85324222f33f6421a8d1a953f6a161a5eae57c) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Remove `@servicetitan/anvil2-ai-kit/icons`. Import from `@servicetitan/anvil2-icons` instead.

* [#2691](https://github.com/servicetitan/hammer/pull/2691) [`4ff7ce9`](https://github.com/servicetitan/hammer/commit/4ff7ce9d0f3752afb11e583a6046eb301afe4d67) Thanks [@ericag1985](https://github.com/ericag1985)! - \[AiKitIntlProvider] Rename i18n public surface from Carto to AI Kit: `CartoIntlProvider` → `AiKitIntlProvider`, `CartoIntlProviderProps` → `AiKitIntlProviderProps`, and message ids `carto.*` → `ai-kit.*`. Update imports and any `messages` overrides keyed by the old ids.

### Patch Changes

* Updated dependencies \[[`4b85324`](https://github.com/servicetitan/hammer/commit/4b85324222f33f6421a8d1a953f6a161a5eae57c), [`4b85324`](https://github.com/servicetitan/hammer/commit/4b85324222f33f6421a8d1a953f6a161a5eae57c)]:
  * @servicetitan/anvil2-icons\@0.1.1

## 0.10.0

### Major Changes

* [#2669](https://github.com/servicetitan/hammer/pull/2669) [`21efe99`](https://github.com/servicetitan/hammer/commit/21efe990377cc5b6f154d2e37286374995b71aa4) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - Publish Carto's web AI kit from the Hammer monorepo as `@servicetitan/anvil2-ai-kit`.

  Formerly `@servicetitan/carto-react-kit`.

## 0.9.0

### Major Changes

* [#288](https://github.com/servicetitan/carto/pull/288) [`aa78524`](https://github.com/servicetitan/carto/commit/aa78524fdf7519c8b290feb226afd99753993bed) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - **Do not use the previous version in this package’s changelog.** For packages versioned in [#287](https://github.com/servicetitan/carto/pull/287), that entry was merged to `main` but never successfully published (`@servicetitan/anvil2-charts-kit@0.0.2`, `@servicetitan/anvil2-rn-charts-kit@0.1.0`, `@servicetitan/anvil2-ai-kit@0.8.4`, `@servicetitan/anvil2-rn@0.0.10`). Several of those numbers (and other unpublished builds) are permanently reserved after a security-related npm unpublish and cannot be republished.

  Bump package versions past the reserved numbers. Upgrade to the versions from this release; do not pin to the removed or unpublished ones.

### Minor Changes

* [#283](https://github.com/servicetitan/carto/pull/283) [`debb29f`](https://github.com/servicetitan/carto/commit/debb29f5f711570b9666d937c523924f026f47ef) Thanks [@ericag1985](https://github.com/ericag1985)! - \[TooltipSurface] Add the tooltip pill and caret as a standalone visual, for cases where the caller already knows what to explain and where — a chart overlay labelling the point under the cursor, say. Also exports the `TooltipCaretDirection` and `TooltipSurfaceProps` types

### Patch Changes

* [#254](https://github.com/servicetitan/carto/pull/254) [`81c808a`](https://github.com/servicetitan/carto/commit/81c808a48fbfd8d5e84a2b4943570ad59a06ea7d) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[Window] Freeze chat scroll while popover/dialog overlays are open (excluding tooltips and details) so top-layer UI stays within the Window chrome

* [#284](https://github.com/servicetitan/carto/pull/284) [`f8fae3c`](https://github.com/servicetitan/carto/commit/f8fae3ce047b430135c76ff401cfb896d2c21bce) Thanks [@jessparis](https://github.com/jessparis)! - \[PromptBar] Update the default disclaimer copy to "Atlas is AI and can make mistakes."

* [#283](https://github.com/servicetitan/carto/pull/283) [`debb29f`](https://github.com/servicetitan/carto/commit/debb29f5f711570b9666d937c523924f026f47ef) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Tooltip] Restyle to the new Carto design — a blue surface with an 8px radius, and a caret that is now a rounded-tip vector rather than a sharp triangle. The caret's hook is now `data-carto="tooltip-caret"`

## 0.8.4

### Minor Changes

* [#274](https://github.com/servicetitan/carto/pull/274) [`fc7eefd`](https://github.com/servicetitan/carto/commit/fc7eefd37f83d24168daf3c6953318a6189b07e0) Thanks [@ericag1985](https://github.com/ericag1985)! - \[CartoTheme, useCartoTheme] Add `useCartoTheme` for reading the resolved `"light"`/`"dark"` appearance from the nearest `CartoTheme`, plus the `CartoThemeContextValue` type

## 0.8.3

### Patch Changes

* [#262](https://github.com/servicetitan/carto/pull/262) [`9cea437`](https://github.com/servicetitan/carto/commit/9cea4373cce849620960c6c16b58dacd000db830) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[PromptBar] Fix auto-grow when the composer is nested in `Window` so wrapped multi-line drafts expand the bar instead of clipping to one row

## 0.8.2

### Patch Changes

* [#231](https://github.com/servicetitan/carto/pull/231) [`faa01a6`](https://github.com/servicetitan/carto/commit/faa01a6873e2ceeaf766f6e726a3b617acf38ff5) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[ChatLayout] Fix short conversations not filling the available conversation region height

## 0.8.1

### Minor Changes

* [#239](https://github.com/servicetitan/carto/pull/239) [`dfa0b94`](https://github.com/servicetitan/carto/commit/dfa0b941c0b7b9b88172d9e48d4a5667d68bca65) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[AgentMediaCard, UserMediaMessage] Fix video previews resizing when playback starts — the poster no longer renders at a different size than the video it represents. The frame is now pinned to the video's real aspect ratio (read from metadata) with the poster filling it. Adds an optional `VideoMediaAttachment.aspectRatio` (a CSS `aspect-ratio` value, e.g. `"16 / 9"`) to reserve the correct frame size before the video loads for a fully shift-free preview.

### Patch Changes

* [#239](https://github.com/servicetitan/carto/pull/239) [`dfa0b94`](https://github.com/servicetitan/carto/commit/dfa0b941c0b7b9b88172d9e48d4a5667d68bca65) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[AgentMessage, UserMediaMessage, UserMessage] Pull the action toolbar up by 4px so it sits closer to the message content. The toolbar's ghost buttons reserve hit-area padding above their glyphs, which made the gap read taller than intended; a negative top offset trims that reserved space back to the intended rhythm.

## 0.8.0

### Major Changes

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Card] Remove `highlighted` prop; the gradient-glow highlight treatment is retired with no replacement. All cards now render with a 1px solid border instead of a resting-state box-shadow (hover lift is unchanged).

### Minor Changes

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Add `IconNewChat` to `@servicetitan/anvil2-ai-kit/icons`

### Patch Changes

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ActionLog] Render each step title in `body`/`regular` (Inter) as plain text instead of a `headline` (Sofia Pro) heading

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[AgentThinking] Render the label in `body`/`regular` (Inter) instead of `headline` (Sofia Pro)

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ButtonToggle] Compose Button's `secondary` recipe class for the unselected state instead of a parallel one, and remove its lingering box-shadow/border excess

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[DecorativeIcon] Update `ai` origin's gradient background to a blue.700 → blue.600 diagonal gradient with white icon color for improved contrast

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Text] Update `highlighted` treatment to a flat `blue-50` background using the new `component.text.highlight.background` token

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ArtifactCard] Fix trailing icon to render a rotated arrow instead of a chevron

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[AgentMediaCard] Compose `Card` for its surface instead of re-deriving it from raw tokens, picking up the same shadow-removed/bordered visual treatment as `Card`. The file name now renders as an accessible heading (matching `ArtifactCard`), with a new `titleLevel` prop (default `4`) to set its level

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Button] Update `secondary` variant to a borderless, no-elevation treatment; remove the resting/hover/pressed box-shadow from every variant (`primary`, `danger` included) and from the shared disabled state

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Text] Replace the Fontshare-hosted Satoshi typeface with a self-hosted Sofia Pro Bold `@font-face` (bundled from `@servicetitan/anvil-fonts`); the `headline` variant, and anything using `typography.fontFamily.expressive`, now renders in Sofia Pro Bold

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ChatHistory] Restyle the rail to a white surface with a trailing border, add an inset "Recents" label above the list, switch the "New Chat" button to a left-aligned `ghost` treatment with `IconNewChat`, and give the selected chat item an `informative-subdued` background with a rounded accent bar

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Suggestion] Update background to the same subtle wash as `Button`'s secondary variant

* [#246](https://github.com/servicetitan/carto/pull/246) [`ced2173`](https://github.com/servicetitan/carto/commit/ced2173c1cf6231d1de1c50032f40775e147eb6a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ChatLayout] Update background to `blue-grey.10` and reduce accent borders to `1px` for visual consistency. \[TabbedLayout] Reduce accent borders to `1px`; the inactive tab background now uses the same subtle wash as `Button`'s secondary variant instead of `blue-grey.10`

## 0.7.0

### Major Changes

* [#244](https://github.com/servicetitan/carto/pull/244) [`eb1344b`](https://github.com/servicetitan/carto/commit/eb1344bb06840c696e98fee852292074e677e1a9) Thanks [@ericag1985](https://github.com/ericag1985)! - \[DecorativeIcon] Rename `IconAvatar` to `DecorativeIcon` and replace `variant` (`gradient`/`plain`) with `origin` (`user`/`system`/`ai`)

### Minor Changes

* [#236](https://github.com/servicetitan/carto/pull/236) [`15a46a4`](https://github.com/servicetitan/carto/commit/15a46a4b9aa6cb1c0bccd64c478b66da53d59e45) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ButtonToggle] Add new component to toggle a button between active and inactive state

* [#245](https://github.com/servicetitan/carto/pull/245) [`c5715db`](https://github.com/servicetitan/carto/commit/c5715dbc751bc58a0cc15c8f60e431be3e0fae58) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[PromptBar] Add `isSending` and `onStop` props for stop-while-generating response cancellation

### Patch Changes

* [#238](https://github.com/servicetitan/carto/pull/238) [`83d1042`](https://github.com/servicetitan/carto/commit/83d1042d5ab9144b2059c452288a82e8cf81e261) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[Link] Fix external-link icon vertical alignment

## 0.6.0

### Major Changes

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ActionLog] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[AgentMediaCard] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[AppHeader] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[AppShell] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Button] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Card] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[CartoTheme] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ChatLayout] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Checkbox] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[DiffValue] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[GuidanceCard] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Remove `style` prop from the locked icon prop surface; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Link] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Markdown] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[UserMessage, UserMediaMessage, AgentMessage] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[PromptBar] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Suggestion, SuggestionList] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[TabbedLayout] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Text] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[TruncatedText] Remove `style` prop; use `className` instead

* [#224](https://github.com/servicetitan/carto/pull/224) [`ecd33ba`](https://github.com/servicetitan/carto/commit/ecd33ba335185d4460f4165e01c1da8fff27f763) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Window] Remove `style` prop; use `className` instead

### Minor Changes

* [#237](https://github.com/servicetitan/carto/pull/237) [`3e60ca5`](https://github.com/servicetitan/carto/commit/3e60ca5e40d284e0db366098c74e351ef92cf2b2) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Add `IconList`, `IconGrid`, `IconLock`, `IconKey`, `IconClockFading`, `IconCalendarCheck`, `IconTruck`, `IconFileText`, `IconRocket`, `IconLandmark`, `IconHandCoins`, `IconGitFork`, `IconTarget`, and `IconSquare` to `@servicetitan/anvil2-ai-kit/icons`

## 0.5.1

### Minor Changes

* [#225](https://github.com/servicetitan/carto/pull/225) [`026560f`](https://github.com/servicetitan/carto/commit/026560ff0fe4395f7b491c3c34f3f723e61bff82) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[AppShell, Window] Add `defaultRailCollapsed` and `defaultArtifactCollapsed` props so regions can start hidden on first paint without a post-mount close animation

## 0.5.0

### Major Changes

* [#216](https://github.com/servicetitan/carto/pull/216) [`fd1ad53`](https://github.com/servicetitan/carto/commit/fd1ad53e695d27b9b6670e423bae312bec330c2f) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Citation] Replace `openInNew` prop with `target`/`rel` passthrough, matching `Link`'s convention. Set `target="_blank"` to open in a new tab (the external-link icon and `rel="noopener noreferrer"` follow automatically unless a `rel` is supplied); omit `target` for same-page citations.

### Minor Changes

* [#217](https://github.com/servicetitan/carto/pull/217) [`cab0394`](https://github.com/servicetitan/carto/commit/cab0394d69f0576c21b2f42f0bb56a898ce14373) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[AgentMediaCard, IconAvatar, UserMediaMessage, Icons] Add `AgentMediaCard` and `UserMediaMessage` for chat media attachments with `showPreview`, expanded image/video previews, inline audio playback, and `IconAvatar` `plain` variant plus `IconVideo`

## 0.4.1

### Minor Changes

* [#211](https://github.com/servicetitan/carto/pull/211) [`aa1a67b`](https://github.com/servicetitan/carto/commit/aa1a67b189e1774ede1cd9520cbdbb84450b842b) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[AgentMessage] Add agent chat message component with assistant toolbar actions

* [#211](https://github.com/servicetitan/carto/pull/211) [`aa1a67b`](https://github.com/servicetitan/carto/commit/aa1a67b189e1774ede1cd9520cbdbb84450b842b) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[AgentThinking] Export inline agent thinking indicator component

### Patch Changes

* [#204](https://github.com/servicetitan/carto/pull/204) [`9c07804`](https://github.com/servicetitan/carto/commit/9c0780494930375ece72302a7a1bc188918efa8f) Thanks [@jpex](https://github.com/jpex)! - \[Button] Scale `small`/`xsmall` label type to 14px/12px, shrink labelled prefix/suffix icons to 16px, and lock a 24px content row so heights stay 48/40/32

* [#215](https://github.com/servicetitan/carto/pull/215) [`be1fb46`](https://github.com/servicetitan/carto/commit/be1fb46d61a0125172122071e6305e5ac3f48272) Thanks [@ericag1985](https://github.com/ericag1985)! - \[AppHeader] Start-align the title instead of centering it when docked in a non-fullscreen `Window`

## 0.4.0

### Major Changes

* [#194](https://github.com/servicetitan/carto/pull/194) [`38a13c0`](https://github.com/servicetitan/carto/commit/38a13c07a01362b0809321b46443c841e6db0ccf) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ChatHistory] `ChatHistoryItem` now takes a required `subtitle` (a secondary line, e.g. a timestamp) and an optional `unread` mark — `subtitle` is a breaking addition for existing items.

* [#198](https://github.com/servicetitan/carto/pull/198) [`96b404f`](https://github.com/servicetitan/carto/commit/96b404f5575ebb2264cd500fda8037ca321110b2) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Add `IconAboveGoal`, `IconBelowGoal`, `IconCircleCheck`, `IconDownload`, `IconOnTrack`, `IconPause`, and `IconPlay`, and remove `IconArrowRight`, `IconCheckedSelection`, and `IconCompletedStep` from `@servicetitan/anvil2-ai-kit/icons` — replace `IconArrowRight` with `IconArrowUp` (rotated), `IconCheckedSelection` with `IconCircleCheck`, and `IconCompletedStep` with `IconCircleCheck`.

### Minor Changes

* [#174](https://github.com/servicetitan/carto/pull/174) [`78d6ae5`](https://github.com/servicetitan/carto/commit/78d6ae5f758a8f9b86bf272e5b7d64cde62dd745) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Checkbox] Add optional `isIndeterminate` prop with a minus indicator for mixed select-all states

* [#174](https://github.com/servicetitan/carto/pull/174) [`78d6ae5`](https://github.com/servicetitan/carto/commit/78d6ae5f758a8f9b86bf272e5b7d64cde62dd745) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[GuidanceCard] Add composite component for Atlas suggested-change visuals with four lifecycle states, selectable change rows, diff display, line-item slots, and responsive action footer

* [#174](https://github.com/servicetitan/carto/pull/174) [`78d6ae5`](https://github.com/servicetitan/carto/commit/78d6ae5f758a8f9b86bf272e5b7d64cde62dd745) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Icons] Add `IconMinus` to `@servicetitan/anvil2-ai-kit/icons`

### Patch Changes

* [#198](https://github.com/servicetitan/carto/pull/198) [`96b404f`](https://github.com/servicetitan/carto/commit/96b404f5575ebb2264cd500fda8037ca321110b2) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ActionLog] Update the `success` status icon to `IconCircleCheck`.

## 0.3.5

### Minor Changes

* [#180](https://github.com/servicetitan/carto/pull/180) [`4ef1ee7`](https://github.com/servicetitan/carto/commit/4ef1ee7fa95ce6107f0a9cbed777c30acca76777) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Checkbox] Add Checkbox component.

* [#182](https://github.com/servicetitan/carto/pull/182) [`bcaeffe`](https://github.com/servicetitan/carto/commit/bcaeffec399a0e4f24c5e53ec401fca14a8e50b5) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[ChatLayout] Add component for an application shell's `chat` region — a centered, measure-capped column that stacks an optional `conversation` transcript above an optional bottom-pinned `prompt` composer. The transcript sticks to the bottom as messages arrive, stops auto-scrolling when the user scrolls up to read history, and shows a "scroll to latest" button while scrolled up; force a scroll to the latest after the user sends via `controlRef`'s `scrollToBottom()`. The transcript is a `role="log"` live region for screen-reader announcements.

* [#181](https://github.com/servicetitan/carto/pull/181) [`49af511`](https://github.com/servicetitan/carto/commit/49af5112602a581fd5cbc2f3c5ec1a367f0a4596) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[DiffValue] Add before/after diff component for suggested-change UIs.

* [#193](https://github.com/servicetitan/carto/pull/193) [`34449a0`](https://github.com/servicetitan/carto/commit/34449a06694dc0aef6ee33dd33bdea4b56b6933d) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[Suggestion, SuggestionList] Add Suggestion and SuggestionList components — tappable AI/agent suggestion chips and a wrapping group container that reports the selected suggestion via `onSelect`.

* [#179](https://github.com/servicetitan/carto/pull/179) [`6a85b82`](https://github.com/servicetitan/carto/commit/6a85b8293d826f25f7023b2daf92188067f9cc50) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Text] Add `highlighted` surface flag for suggested-change styling.

* [#179](https://github.com/servicetitan/carto/pull/179) [`6a85b82`](https://github.com/servicetitan/carto/commit/6a85b8293d826f25f7023b2daf92188067f9cc50) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[TruncatedText] Add plain-string truncation with Show more / Show less.

* [#173](https://github.com/servicetitan/carto/pull/173) [`a665dda`](https://github.com/servicetitan/carto/commit/a665dda228291e8e5fa51254e4b7dc5c0d208667) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ActionLog] Add component for rendering a collapsible vertical timeline of agent steps from a configuration-first `steps` array

### Patch Changes

* [#195](https://github.com/servicetitan/carto/pull/195) [`e7beb96`](https://github.com/servicetitan/carto/commit/e7beb96b96e6dd0d2adf638ff8c389b2605f554c) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[ChatLayout, ChatHistory, TabbedLayout, AppShell] Background color corrections across chat and layout surfaces. Tab chips gain a continuous 3px left border from the first tab through the panel content. Resize handles across AppShell and TabbedLayout now show a dynamic blue pill indicator that follows the cursor along the cross axis instead of a static background tint. TabbedLayout split panes meet at a flush 0px seam with an out-of-flow handle.

* [#178](https://github.com/servicetitan/carto/pull/178) [`b1a54ff`](https://github.com/servicetitan/carto/commit/b1a54ff453a6d4eeaa264b464893e4fad5b86952) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Icons] Fix custom Icon SVG sizing via CSS instead of width/height attributes.

* [#170](https://github.com/servicetitan/carto/pull/170) [`106b7d3`](https://github.com/servicetitan/carto/commit/106b7d39a1d372cf0bb5349a14c275743a5a5c2e) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[TabbedLayout] Fix the horizontal-split resize divider. It now tracks the cursor as you drag instead of drifting out of sync, and it responds reliably when the split opens inside a `Window`. Split-pane headings no longer show the active-tab underline, which only conveys meaning in the stacked tab strip.

* [#191](https://github.com/servicetitan/carto/pull/191) [`6fee6ce`](https://github.com/servicetitan/carto/commit/6fee6ce805d2d8b98f2c9d256073f4967bb091a4) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Menu] Fix the scrolling option list overflowing the popover's rounded corners

* [#145](https://github.com/servicetitan/carto/pull/145) [`4fc2468`](https://github.com/servicetitan/carto/commit/4fc2468112962b2afe481f8c4d2f33764322a490) Thanks [@tounsoo](https://github.com/tounsoo)! - \[AppShell, BottomSheet, Button, Card, Citation, Dialog, Link, Menu, PromptBar, TabbedLayout, UserMessage, Window] Drive motion from semantic motion tokens instead of inlined curves. Hover/press/focus acknowledgments now use the faster `feedback` duration (100ms, down from 200ms), panel and overlay transitions use the `emphasis` duration with directional `enter`/`exit` easing, and easing curves shift to the semantic motion values. Animation timings and curves change as a result.

  \[Tokens] Retarget the `bottom-sheet` and `dialog` focus-ring `transition.duration` from `motion.duration.transition` to `motion.duration.feedback` (200ms to 100ms).

* [#190](https://github.com/servicetitan/carto/pull/190) [`ab27e8c`](https://github.com/servicetitan/carto/commit/ab27e8c80431cadb0b1c1f42c17eaebf5fe88fa6) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Button] Button label text now renders in medium weight (Inter Medium).

* [#188](https://github.com/servicetitan/carto/pull/188) [`520d9dc`](https://github.com/servicetitan/carto/commit/520d9dcb658e3c3e18394bce02ac356cd6d1c2d9) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[Window] Smooth out the docked↔fullscreen morph. Maximizing then restoring a docked panel that has been dragged now animates back to where the panel actually sits instead of snapping to its default corner at the end.

## 0.3.4

### Minor Changes

* [#160](https://github.com/servicetitan/carto/pull/160) [`8d837f1`](https://github.com/servicetitan/carto/commit/8d837f16e01a56166a47db15811d0325a28e8651) Thanks [@tounsoo](https://github.com/tounsoo)! - Citation now renders a 1px solid white hairline border. Adds a new `citation.border.color` component token that aliases primitive neutral 0 (white) directly, so the border stays white in both light and dark appearances.

### Patch Changes

* [#168](https://github.com/servicetitan/carto/pull/168) [`95f9c55`](https://github.com/servicetitan/carto/commit/95f9c555c445117569b328ec1beae0fcbdafe3c3) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Card] Fix `highlighted` gradient pulse glow extending unevenly on non-square cards

* [#162](https://github.com/servicetitan/carto/pull/162) [`d6044e5`](https://github.com/servicetitan/carto/commit/d6044e5282c708b8065020f22779eabcd72c133e) Thanks [@tounsoo](https://github.com/tounsoo)! - Tokenize PromptInput and the AgentPrompt header foreground.

  * **carto-tokens** — adds `agentPrompt.header.foreground` (aliases `foreground.color.standard`) and a new `prompt-input.tokens.json` with `promptInput.font` (composite typography), `promptInput.foreground`, `promptInput.placeholder.foreground`, and `promptInput.disabled.foreground`.
  * **carto-react-kit** — wires the AgentPrompt question heading to the new header token, and routes PromptInput's text, placeholder, disabled, and typography through the new component tokens (previously raw `primitive.font.*` and direct `semantic.*` references). All values are unchanged, so there is no visual change.

* [#167](https://github.com/servicetitan/carto/pull/167) [`ece80f9`](https://github.com/servicetitan/carto/commit/ece80f96d17566632a9d6abbcf64501305264d67) Thanks [@tounsoo](https://github.com/tounsoo)! - \[PromptBar] Fix inline padding layout and use `semantic.opacity.disabled` token

## 0.3.3

### Minor Changes

* [#149](https://github.com/servicetitan/carto/pull/149) [`48247a2`](https://github.com/servicetitan/carto/commit/48247a268fa5a164aadbd57b7bd1216016ed8267) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Exports] Add `@servicetitan/anvil2-ai-kit/tokens` subpath re-exporting the Carto token proxies (`primitive`/`semantic`/`component`/`cartoThemeClass`), so consumers reference the kit's single compiled theme instead of recompiling `@servicetitan/carto-tokens`.

* [#132](https://github.com/servicetitan/carto/pull/132) [`f8ef3da`](https://github.com/servicetitan/carto/commit/f8ef3daf889141b32b426633b5ca65e5f3c3779e) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Dialog] Make `primaryAction` optional to support footerless dialogs

### Patch Changes

* [#153](https://github.com/servicetitan/carto/pull/153) [`35243f8`](https://github.com/servicetitan/carto/commit/35243f8fe5c536dd48343b001d378731cbe04e16) Thanks [@tounsoo](https://github.com/tounsoo)! - \[BottomSheet] Fix scrollable body padding so the scrollbar sits at the sheet edge and prevent the header close button from squishing

* [#154](https://github.com/servicetitan/carto/pull/154) [`2c4029f`](https://github.com/servicetitan/carto/commit/2c4029fea513cf61577622da765b4759ce1904d1) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Dialog] Fix scroll shadows spanning inset content width by splitting block and inline padding

* [#155](https://github.com/servicetitan/carto/pull/155) [`fd93c63`](https://github.com/servicetitan/carto/commit/fd93c6354e4b78dd8d0c467ead94a45cdecd94f8) Thanks [@tounsoo](https://github.com/tounsoo)! - \[TabbedLayout] Unify panel shell and body internal layout classes

## 0.3.2

### Minor Changes

* [#146](https://github.com/servicetitan/carto/pull/146) [`175ac52`](https://github.com/servicetitan/carto/commit/175ac525d5714af8511d16ec1cb38143d00675dd) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[Window] Add drag-to-move for the docked panel. The control surface now exposes `dragHandleProps` (via `controlRef` / `useAppSurface()`); spread it onto a leading `AppHeader` action to turn that action into a grip that drags the panel anywhere in the viewport, with arrow keys nudging it for keyboard users (clamped inside the viewport). The dragged position survives a maximize→restore round-trip (restore returns the panel to where it was dragged) and resets to the default corner only on close.

  \[AppHeader] `AppHeaderAction` gains an optional `dragHandleProps` field. When set, that action renders as a drag handle (carrying the move handlers and grab cursor) instead of a press button — for use with the `Window` drag handle above. Inert when there's no docked window to move, so it's safe to pass unconditionally.

  \[Window] Open and size state are now **controllable**. Pass `open` / `state` (with `onOpenChange` / `onStateChange`) to let an external owner be the single source of truth; omit them to keep the existing uncontrolled behavior seeded by `defaultOpen` / `defaultState`. The change callbacks fire on every transition — including ones the window triggers itself (a header close/maximize button, or a region intent that auto-opens) — so a controlling store hears user-driven changes and can run its own side effects. Fully backward-compatible: all new props are optional.

### Patch Changes

* [#146](https://github.com/servicetitan/carto/pull/146) [`175ac52`](https://github.com/servicetitan/carto/commit/175ac525d5714af8511d16ec1cb38143d00675dd) Thanks [@AdamLantz](https://github.com/AdamLantz)! - Fix broken type declarations on the main entry. Several public declarations re-exported types from `src/internal/`, which the build excludes from `.d.ts` emit — so the shipped declarations referenced `../../internal/…` modules that aren't in the package, and consumers hit "Cannot find module". The fix moves those types to public locations rather than shipping `internal/`:

  * The `appSurface` module (`useAppSurface`, `AppSurfaceHandle`, `ShowArtifactOptions`, `WindowDragHandleProps`, `ArtifactPresentation`) moved from `internal/appSurface/` to `components/AppShell/appSurface/`. Consumed by `AppShell`, `Window`, `AppHeader`, and `TabbedLayout`; the public re-export path (`@servicetitan/anvil2-ai-kit`) is unchanged.
  * The public Waveform types (`WaveformPreset`, `WaveformSource`) now live in `PromptBar`'s public `types.ts` (where they were already re-exported); `WaveformProps` stays internal.

  No public import paths change — these were only ever exported from the package barrel. Known follow-up (pre-existing, untouched here): the `./icons` subpath entry has the same defect (`dist/icons/*.d.ts` reference `../internal/components/Icon/*`); tracked for a separate fix.

## 0.3.1

### Minor Changes

* [#115](https://github.com/servicetitan/carto/pull/115) [`fbc44d8`](https://github.com/servicetitan/carto/commit/fbc44d89b4e39faaf21d65962709fcbcc95da367) Thanks [@pbuckingham-st](https://github.com/pbuckingham-st)! - \[AgentPrompt] Add component for the agent's inline clarifying-question prompt — `single` or `multi` select with an optional free-text "Something else…" row (shown when `onOtherChange` is wired), an optional multi-step Back/Next/Send stepper, an overridable question `headingLevel`, an always-present close button, and a resolved answer passed to `onSend`/`onNext`

* [#104](https://github.com/servicetitan/carto/pull/104) [`11a4c84`](https://github.com/servicetitan/carto/commit/11a4c84492cbfb35c8730387fbef74dff1328cf9) Thanks [@AdamLantz](https://github.com/AdamLantz)! - **AppShell**: the artifact is now presented as a modal drawer only when the shell is narrow. At/above a measured shell width of **720px the artifact is always inline** — drag-detach, the imperative `showArtifact` / `toggleArtifact`, and fit-fallout are all gated, and an artifact drawer opened below 720px **re-attaches inline** when the shell widens past it. To keep the artifact inline when it can't fit alongside the rail (720–960px), the **rail** yields to a drawer (it's the lowest-priority region and collapses first); the rail may still be a drawer at ≥ 720px. Below 720px, the artifact behaves exactly as before. This also affects the read-only `artifactPresentation` on `useAppSurface()` — it never reports `"drawer"` for the artifact at ≥ 720px.

* [#104](https://github.com/servicetitan/carto/pull/104) [`11a4c84`](https://github.com/servicetitan/carto/commit/11a4c84492cbfb35c8730387fbef74dff1328cf9) Thanks [@AdamLantz](https://github.com/AdamLantz)! - **AppShell**: when the shell widens, extra space now goes to the **artifact** first — up to the width it was opened at (its `regular` / `large` preset, or the user's last dragged width) — and only then to chat. Previously all extra space went to chat and the artifact stayed at its shrunken width. The artifact now tracks a *desired* width (set by an imperative open or a user drag) that's clamped at render rather than overwritten on resize, so shrinking the shell clamps the artifact down without losing its target and re-widening restores it. Chat still absorbs any space beyond the artifact's desired width.

* [#119](https://github.com/servicetitan/carto/pull/119) [`04e0174`](https://github.com/servicetitan/carto/commit/04e0174e3b43e4b8d8178ad05bd74911b5fbd1d3) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Add `IconAtlasLogo` — the Atlas brand mark, a fixed full-color gradient icon (it ignores the `color` override, like the Load spinner).

* [#121](https://github.com/servicetitan/carto/pull/121) [`acb1ed5`](https://github.com/servicetitan/carto/commit/acb1ed596e07d4cc76a7e642ecbc7f228c0d64cd) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ChatHistory] Add component for the conversation navigation rail — a "New Chat" button (`onNewChat`) above a single-select list of past chats (`items`, `selectedKeys` / `onSelectionChange`), with a history-less state when `items` is empty

* [#117](https://github.com/servicetitan/carto/pull/117) [`629bf5d`](https://github.com/servicetitan/carto/commit/629bf5d03ee002235219286756fc1f674a997465) Thanks [@pbuckingham-st](https://github.com/pbuckingham-st)! - \[Citation] Add component for rendering inline source citations as a pill-shaped link. Takes a required `href` and `text`; `openInNew` (default `true`) sets `target="_blank"` + `rel="noopener noreferrer"` and renders a trailing external-link icon, or set `false` for on-page anchors. The recipe consumes the new `citation` component-token tier (aliasing the semantic tier for light/dark).

* [#110](https://github.com/servicetitan/carto/pull/110) [`71b7210`](https://github.com/servicetitan/carto/commit/71b72107f82dfe67800705ef589ab6ee3ad79fe2) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add a global `focus` semantic category — `focus.width` (`{size.75}`, the new 3px primitive rung), `focus.offset` (`{size.50}`, 2px), and `focus.color` (`{border.color.accent}`) — so every focus ring shares one system-wide treatment. `button.focus.ring.{color,width,offset}` now alias `focus.*` (no visual change: still `#0265dc`, 3px, 2px offset), and the new `size.75` = 3px primitive backs the ring width.

  \[React Kit] `Dialog` (body scroll region) and `PromptBar` (disclaimer link) now consume the global `semantic.focus.*` tokens instead of inline outline literals. The Dialog ring is unchanged (3px / 2px / accent); the PromptBar disclaimer-link ring grows from 2px to the global 3px width so it matches every other focus ring.

* [#118](https://github.com/servicetitan/carto/pull/118) [`e88586e`](https://github.com/servicetitan/carto/commit/e88586e17f7c50347a8fb49abe0866edea3d3206) Thanks [@ericag1985](https://github.com/ericag1985)! - \[ArtifactCard] Add a button-surface card for AI artifacts, with a title, optional description, configurable heading level, and an `artifactType` that selects its decorative gradient-avatar icon.

* [#118](https://github.com/servicetitan/carto/pull/118) [`e88586e`](https://github.com/servicetitan/carto/commit/e88586e17f7c50347a8fb49abe0866edea3d3206) Thanks [@ericag1985](https://github.com/ericag1985)! - \[IconAvatar] Add a gradient-avatar component that frames a Carto icon at a fixed size and color, for use in cards and other surfaces.

* [#116](https://github.com/servicetitan/carto/pull/116) [`0399b0a`](https://github.com/servicetitan/carto/commit/0399b0ac9dd92ac0fee85fbf045e6c84455ea966) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Menu] Add component for action and selection menus, with a configured `items` list, `trigger` button, `placement`, and `selectionMode`

* [#114](https://github.com/servicetitan/carto/pull/114) [`59ddeb9`](https://github.com/servicetitan/carto/commit/59ddeb9a66df4df198860af73001ef82ad509b2a) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Card] Add component for static, link, and button surfaces with `padding` scale and `highlighted` treatment

* [#103](https://github.com/servicetitan/carto/pull/103) [`53f4704`](https://github.com/servicetitan/carto/commit/53f470479283b75e4b5c2db95846c81dba48733b) Thanks [@ericag1985](https://github.com/ericag1985)! - \[BottomSheet] Add bottom-anchored, full-width modal overlay with a drag- and keyboard-resizable handle (3 detents), a title/subheader/close-button header, and a scrollable body.

* [#118](https://github.com/servicetitan/carto/pull/118) [`e88586e`](https://github.com/servicetitan/carto/commit/e88586e17f7c50347a8fb49abe0866edea3d3206) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Add `IconFile`, `IconInvoice`, and `IconMessageSquareText` to `@servicetitan/anvil2-ai-kit/icons`

* [#104](https://github.com/servicetitan/carto/pull/104) [`11a4c84`](https://github.com/servicetitan/carto/commit/11a4c84492cbfb35c8730387fbef74dff1328cf9) Thanks [@AdamLantz](https://github.com/AdamLantz)! - Add **AppShell** — a fully-fluid `rail` / `chat` / `artifact` application layout (no breakpoints). A side region that can't fit inline becomes a modal drawer rather than disappearing; the artifact is one persistent panel that **morphs** between its inline track and the drawer (it also drag-resizes and drag-detaches). Region state is internal, driven imperatively via the **`AppSurfaceHandle`** (`show`/`hide`/`toggle` per region; `showArtifact({ width })` opens `"regular"` 560px or `"large"` 720px-floor) from the `controlRef` prop or the **`useAppSurface()`** hook. The same handle works in a bare shell or inside a `Window`, so a control anywhere — including a card in the chat — drives the layout the same way. Exports `AppShell`, `useAppSurface`, and the `AppShellProps` / `AppSurfaceHandle` / `ArtifactWidth` / `ShowArtifactOptions` types.

* [#104](https://github.com/servicetitan/carto/pull/104) [`11a4c84`](https://github.com/servicetitan/carto/commit/11a4c84492cbfb35c8730387fbef74dff1328cf9) Thanks [@AdamLantz](https://github.com/AdamLantz)! - Add **AppHeader** — a horizontal header bar: `leadingActions` / `trailingActions` (generic `{ icon, label, onPress }` descriptors rendered as ghost icon-only Carto `Button`s) around a centered `title` (substantial-headline scale, `<h1>` semantics, ellipsis-truncated). Renders a semantic `<header>`; drops into `AppShell`'s `header` slot (wiring its toggles via `useAppSurface`) but works standalone. Exports `AppHeader` and the `AppHeaderProps` / `AppHeaderAction` types.

* [#120](https://github.com/servicetitan/carto/pull/120) [`3e3ccc1`](https://github.com/servicetitan/carto/commit/3e3ccc1c44ce637179d399179f3f0642c913945b) Thanks [@AdamLantz](https://github.com/AdamLantz)! - Add **TabbedLayout** — a multi-pane layout for the artifact region. It shows one or more tabs as a tab strip (**stacked**) or two side-by-side / stacked panes (**vertical-split** / **horizontal-split**, drag-resizable); a single tab renders just its label heading and content. The mode picker appears at ≥ 720px and the layout falls back to stacked below that. In an artifact drawer it surfaces a close button. Exports `TabbedLayout` and the `TabbedLayoutProps` / `TabbedLayoutMode` / `TabbedLayoutTab` types.

* [#104](https://github.com/servicetitan/carto/pull/104) [`11a4c84`](https://github.com/servicetitan/carto/commit/11a4c84492cbfb35c8730387fbef74dff1328cf9) Thanks [@AdamLantz](https://github.com/AdamLantz)! - Add **Window** — chrome that hosts an `AppShell` as a fixed-position chat window (docked, bottom-right) that **grows** into a fullscreen modal and shrinks back (shared-element animation). The `header` and `chat` nodes are preserved across the transition (relocated, not remounted), so conversation state survives expand/restore. Window + shell share **one** control surface — the **`AppSurfaceHandle`** via `controlRef` or **`useAppSurface()`**: `open`/`close`/`toggle`, `maximize`/`restore`/`toggleSize`, plus the shell's region intents. Region intents auto-compose with the window, so `showArtifact()` from a docked chat **maximizes and opens the artifact in one call** — no docked/fullscreen branching for consumers. Esc / scrim-click restores to docked. Exports `Window` and the `WindowProps` / `WindowState` types.

### Patch Changes

* [#123](https://github.com/servicetitan/carto/pull/123) [`c8b8b28`](https://github.com/servicetitan/carto/commit/c8b8b28b7d8e731547aad8f588c73090975f1d9a) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add `agentPrompt.*` component tokens for the AgentPrompt surface — the card (`background`, `border.color`, `radius`, `elevation`, `padding`, `gap`), region spacing (`header.gap`, `options.gap`, `actions.gap`), the option rows (`option.background.{resting,hover,pressed}`, `option.foreground`, `option.padding`, `option.radius`, `option.selected.border.color`), the multi-select checkbox indicator (`checkbox.border.color`, `checkbox.foreground`, `checkbox.selected.background`), the step counter (`stepCount.foreground`), and the empty-answer error (`error.foreground`, `error.gap`), each aliasing the semantic tier. Also adds a semantic `opacity.disabled` (0.6) token.

  `AgentPrompt` now consumes these via the `component.agentPrompt.*` proxy instead of reaching into `semantic.*` directly. As part of this:

  * Option rows are now proper interactive surfaces: their background uses `background.color.subtle.{resting,hover,pressed}` (replacing the prior translucent `rgba(4,4,4,…)` fills) with the paired `foreground.color.on.subtle` text color.
  * The disabled-dim opacity is now the shared `opacity.disabled` token; the option rows shift from `0.5` to the system `0.6`.
  * The focus ring adopts the semantic focus tier (`focus.width` / `focus.color` / `focus.offset`), shifting the ring thickness from a hard-coded 2px to the system 3px.

* [#139](https://github.com/servicetitan/carto/pull/139) [`ca506f0`](https://github.com/servicetitan/carto/commit/ca506f07d577bceb3e2d813d2040672b9a01eadd) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add `artifactCard.*` component tokens for the ArtifactCard surface — `foreground` (the title/description/arrow color, aliasing `foreground.color.standard`), `gap` (the horizontal rhythm between the lead cluster and the trailing arrow, and between the icon and text, aliasing `spacing.base`), and `text.gap` (the title↔description lockup, aliasing `spacing.micro`).

  `ArtifactCard` now consumes these via the `component.artifactCard.*` proxy instead of reaching into `semantic.*`/`primitive.*` directly. No visual change: the title↔description gap was already 4px (`primitive.size["100"]`), now expressed as the matching `spacing.micro` intent.

* [#126](https://github.com/servicetitan/carto/pull/126) [`d5c6c81`](https://github.com/servicetitan/carto/commit/d5c6c8177f418350ac7a720694065724fc255f24) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add the `bottomSheet` component token set, aliasing the semantic tier: `surface.{background,foreground,radius,elevation}`, `padding.{inline,block.end}`, `gap`, `header.{gap,padding.inline}`, `subheader.foreground`, `handle.padding.block.{start,end}`, `handle.grip.{width,height,radius,background}`, `focus.ring.{color,width,offset}`, and `focus.ring.transition.{duration,easing}` (aliasing `motion.duration.transition` / `motion.easing.transition` — the everyday color-shift motion intent; `excludePlatforms: figma`). `handle.grip.background` is a provisional gap (primitive `{color.neutral.400}` — no foreground/handle intent matches it yet); `handle.grip.{width,height}` are intentional primitives (`{size.900}` / `{size.100}`).

  \[React Kit] `BottomSheet` now consumes its `component.bottomSheet.*` tokens instead of inline semantic/primitive literals. Visual changes adopted from the token mappings: top corners use the large-container `radius.generous` (24px, up from 12px); the surface elevation and text pair with the standard surface; the drag-handle focus-ring offset normalizes to the system 2px (was 4px); and the now-shipped `focus.*` tokens back both the grip and body focus rings. The vestigial 1px top hairline (not in the Figma spec) is removed — the drop shadow alone separates the sheet from the backdrop. The shared modal backdrop now consumes `semantic.scrim.color` (no visual change). The body focus-ring fade now consumes `focus.ring.transition.{duration,easing}` (`200ms` / `cubic-bezier(0.4, 0, 0.2, 1)`); its easing adopts the `motion.easing.transition` curve, shifting from the kit's inline `[0,0,0.4,1]` — making BottomSheet the first consumer of the motion tokens.

* [#108](https://github.com/servicetitan/carto/pull/108) [`011c6ea`](https://github.com/servicetitan/carto/commit/011c6ea4db1eda1369ddca954ff248919790f9a7) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add per-variant `button.<variant>.border.width` tokens (`secondary` → `size.25` / 1px, `primary` / `ghost` / `danger` → `size.0`) so the borderless variants gain border capability without changing their current footprint. `Button`'s `secondary` variant now consumes its width token directly — replacing the prior hard-coded `1px` literal — and subtracts it from the padding so the bordered variant keeps the same outer size as the borderless ones (which stay at `border-width: 0`).

* [#135](https://github.com/servicetitan/carto/pull/135) [`c00c7d5`](https://github.com/servicetitan/carto/commit/c00c7d50dcb0e75dfb57029c326d5ebc6f1368f4) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add the `card` component token set, aliasing the semantic tier: `card.background.{resting,hover}` (`{background.color.standard.*}`), `card.radius` (`{radius.moderate}`), `card.elevation.{resting,hover}` (`{shadow.ambient.resting}` / `{shadow.ambient.hover}`), `card.padding.{snug,base,relaxed}` (`{spacing.*}`), and `card.focus.ring.{color,width,offset}` (`{focus.*}`). No visual change — these formalize the values `Card` already uses (resting + hover elevation now route through the `shadow.ambient` family).

  \[React Kit] `Card.css.ts` now consumes `component.card.*` instead of reaching into `semantic.*` directly. The disabled state consumes `semantic.opacity.disabled`, and the in-place transition consumes `semantic.motion.duration.transition` + `semantic.motion.easing.transition` — adopting the semantic ease-in-out curve (`cubic-bezier(0.4, 0, 0.2, 1)`) in place of the prior inlined `cubic-bezier(0, 0, 0.4, 1)` (duration unchanged at 200ms). Only the highlight gradient remains inline as a flagged gap (gradients have no DTCG representation).

* [#137](https://github.com/servicetitan/carto/pull/137) [`ec0c239`](https://github.com/servicetitan/carto/commit/ec0c23959e3457677c93465f7e249f3d70c8d1eb) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add the `dialog` component token set, aliasing the semantic tier: `overlay.padding`, `surface.{background,foreground,border.color,border.width,radius,elevation}`, `padding`, `gap`, `header.gap`, `footer.gap`, `focus.ring.{color,width,offset}`, and `focus.ring.transition.{duration,easing}` (aliasing `motion.duration.transition` / `motion.easing.transition` — the everyday color-shift motion intent; `excludePlatforms: figma`). Values cross-checked against Figma (Carto Web Components, node 787:3308): width 360px, padding/gap 24px, header gap 8px, footer gap 12px, background white all match. Adopted value shifts (semantic intent over the Figma literal): `surface.border.color` aliases `{border.color.subtle}` (neutral.30, #f6f6f6, from Figma's #e6e6e6); `surface.radius` aliases `{radius.generous}` (24px, from Figma's 12px) to match BottomSheet's panel radius. `surface.elevation` aliases `{shadow.floating.resting}` (the shared transient-surface intent; blur follows the semantic token). `surface.border.width` is `{size.25}` (1px).

  \[React Kit] `Dialog` now consumes its `component.dialog.*` tokens instead of inline semantic/primitive literals. The surface foreground pairs with the standard surface (`foreground.color.on.standard`, same neutral.800 value — no visual change). The body focus-ring fade now consumes `focus.ring.transition.{duration,easing}` (`200ms` / `cubic-bezier(0.4, 0, 0.2, 1)`); its easing adopts the `motion.easing.transition` curve, shifting from the prior inline `[0,0,0.4,1]` to match BottomSheet + Button. The fixed `360px` surface width stays an intentional raw literal (no semantic intent, no matching size primitive); `zIndex: 1000` is kept raw on purpose (Carto has no layering token scale yet); the shared modal backdrop continues to consume `semantic.scrim.color`.

* [#133](https://github.com/servicetitan/carto/pull/133) [`0454f19`](https://github.com/servicetitan/carto/commit/0454f198e95eb998f5d0a9e0d92653a746cbb085) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - \[Dependencies] Move React Aria (`react-aria`, `react-aria-components`, `react-stately`) from `peerDependencies` to `dependencies` and externalize all runtime deps in the build (only `react`/`react-dom` stay peers); `carto-tokens` stays a devDependency so consumers don't need vanilla-extract.

* [#116](https://github.com/servicetitan/carto/pull/116) [`0399b0a`](https://github.com/servicetitan/carto/commit/0399b0ac9dd92ac0fee85fbf045e6c84455ea966) Thanks [@ericag1985](https://github.com/ericag1985)! - Ghost buttons now raise to the shared elevation on hover, active, and focus-visible (matching Figma), instead of staying flush.

* [#129](https://github.com/servicetitan/carto/pull/129) [`b1a78a4`](https://github.com/servicetitan/carto/commit/b1a78a4f304e6e961610fd66359c9120a469aca8) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add `link` component tokens that alias the semantic tier: `link.foreground.resting` (`{foreground.color.standard}`) and `link.foreground.hover` (`{foreground.color.informative}`) for the link's text color, `link.radius` (`{radius.trim}`) for the focus-ring corner, and `link.icon.gap` (`{spacing.micro}`) for the trailing external-link icon's lockup. `Link`'s recipe now consumes these tokens in place of the raw `semantic.*` / `primitive.*` references it used before — all value-preserving, no rendered change. The shared focus-ring (`component.button.focus.ring.*`) and the inline transition curve are unchanged: the ring is still the kit's single button-owned definition consumed directly, and motion adoption stays deferred pending the curve-shift decision (matching `Button`).

* [#134](https://github.com/servicetitan/carto/pull/134) [`c083c3c`](https://github.com/servicetitan/carto/commit/c083c3c75a1ee118b830d2fab8fcbd708aaebad7) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add `menu.*` component tokens for the Menu surface and options — the popover (`surface.background`, `surface.radius`, `surface.elevation`), the option list (`list.gap`, `list.padding`), the option rows (`option.background.{resting,hover,pressed}`, `option.foreground.resting`, `option.gap`, `option.radius`, `option.padding.{inline,block}`, `option.opacity.disabled`), the selected option (`option.selected.background.{resting,hover,pressed}`, `option.selected.foreground.{resting,hover,pressed}`), and the focus ring (`focus.ring.color`, `focus.ring.width`), each aliasing the semantic tier.

  \[Tokens] Extend the semantic tier so the Menu's selected states alias real intents instead of raw primitives:

  * `background.color.informative-subdued` is promoted from a scalar to a stateful group — `resting` (blue.50), `hover` (blue.100), `pressed` (blue.200).
  * `foreground.color.on.informative-subdued` is added — `resting` (blue.600), `hover` (blue.700), `pressed` (blue.800) — the on-color paired with the informative-subdued surface.

  `Citation`'s hover surface moves to the `.resting` leaf with no value change (`background.color.informative-subdued` → `.resting`).

  `Menu` now consumes these via the `component.menu.*` proxy instead of reaching into `semantic.*` / `primitive.*` directly. As part of this:

  * The popover surface uses `radius.moderate` (16px) and the option rows use `radius.trim` (12px), matching the Figma bindings (`semantic/radius/moderate` on the container, `semantic/radius/trim` on the options).
  * The disabled-dim opacity is now the shared `opacity.disabled` token (replacing a hard-coded `0.6`).
  * The selected option surfaces/text alias `background.color.informative-subdued.{resting,hover,pressed}` and `foreground.color.on.informative-subdued.{resting,hover,pressed}` (no more `color.blue.*` primitive interims).
  * The unselected option uses the `ghost` surface intent — `background.color.ghost.{resting,hover,pressed}` — paired with `foreground.color.on.ghost` text (neutral.800, a deliberate shift from Figma's `foreground/color/default` #040404, which has no carto equivalent).

  Cross-checked against Figma (node `43:290`): popover background/elevation/radius, option spacing/typography, the selected-state surfaces/text, and the 180/360px width mechanics all match. The new `informative-subdued` / `on.informative-subdued` hover values (blue.100 #cce3ff, blue.700 #1d4ca3) equal Figma's `primary-subdued-hover` / `primary-hover`. The unselected option's hover/press tints intentionally use the translucent `ghost` intent (neutral.400 @ 0.08/0.16) rather than Figma's opaque `standard.hover` (#f9f9f9). The option pressed/active states are kept from the RAC/anvil2 interaction model but are beyond the Figma spec, which defines only default/hover/disabled.

  Remaining gap: the popover min/max width (180/360px) stay raw literals in the recipe as no width scale exists at any tier.

* [#136](https://github.com/servicetitan/carto/pull/136) [`5bf6962`](https://github.com/servicetitan/carto/commit/5bf69621e64469542f70b2cb535390f8c83cfca0) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add `shadow.ambient` — a new low rung on the elevation scale for a subtle interactive affordance. Unlike the directional `raised`/`floating` shadows, `ambient` is a soft, diffuse shadow that sits flush to the surface with no offset (neutral.800 @ 4% resting / 8% hover, blur `{size.400}`), signalling an element is interactive without pronounced elevation. New ladder: `flush (0) → ambient (4%) → raised (12%) → floating (24%)`. `flush`, `raised`, and `floating` are unchanged (same values and Figma variable IDs), so existing consumers are unaffected.

  \[React Kit] `Card` now consumes `semantic.shadow.ambient.{resting,hover}` for its resting and hover elevation, replacing the inline custom ambient shadow (the resting value is identical, resolving the long-standing `TODO(carto-tokens)`) and the prior `raised.resting` hover (12% → ambient 8%, a softer hover lift).

* [#104](https://github.com/servicetitan/carto/pull/104) [`11a4c84`](https://github.com/servicetitan/carto/commit/11a4c84492cbfb35c8730387fbef74dff1328cf9) Thanks [@AdamLantz](https://github.com/AdamLantz)! - **AppShell / Window** accessibility and RTL fixes from review:

  * **AppShell**: dismissing the artifact drawer with Escape now stops propagation, so it no longer also collapses a surrounding fullscreen `Window`; on close it moves focus to the chat region (a programmatic focus target) instead of letting focus fall to `<body>`. The artifact scrim is marked `aria-hidden`. The resize separator no longer emits an undefined `aria-valuemax` before the shell is measured (it falls back to the artifact min). Positional styles use logical properties (`inset-inline-*`) for RTL.
  * **Window**: the docked panel is now a named `region` (using the same accessible name as the fullscreen dialog, overridable via `aria-label`) so assistive tech can locate it.

## 0.3.0

### Major Changes

* [#90](https://github.com/servicetitan/carto/pull/90) [`7a412a2`](https://github.com/servicetitan/carto/commit/7a412a25953539be4c62d86b37b391873a54e68d) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Remove `IconCircle` from `@servicetitan/anvil2-ai-kit/icons`. It is no longer part of the design. For the Status Old state, use `IconCircleSmall`.

### Minor Changes

* [#90](https://github.com/servicetitan/carto/pull/90) [`7a412a2`](https://github.com/servicetitan/carto/commit/7a412a25953539be4c62d86b37b391873a54e68d) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Add `IconArrowRight` to `@servicetitan/anvil2-ai-kit/icons`.

* [#80](https://github.com/servicetitan/carto/pull/80) [`085fa1f`](https://github.com/servicetitan/carto/commit/085fa1f149593f04038855ee801cf748d8458871) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[CartoIntlProvider] Add component for localizing Carto's built-in strings. It renders the kit's own scoped `react-intl` context so Carto strings never collide with a consuming app's setup. The provider is optional — components render English with no provider mounted. Pass `locale` to switch language and keep React Aria date/time formatting in sync, or `messages` to override individual built-in strings by Carto message ID.

* [#75](https://github.com/servicetitan/carto/pull/75) [`c7bf5c0`](https://github.com/servicetitan/carto/commit/c7bf5c01c36ca8a232cb75a7e9ae257e7561aba0) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Button] Add a `danger` variant for destructive actions — a filled, raised button on the critical/red surface, composing with all existing sizes and icon configurations.

* [#100](https://github.com/servicetitan/carto/pull/100) [`7c5244b`](https://github.com/servicetitan/carto/commit/7c5244b4ef80ba86cb6a3ad0b34ce4d6d147ff04) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Link] Add component for rendering accessible inline and standalone links.

* [#86](https://github.com/servicetitan/carto/pull/86) [`a451448`](https://github.com/servicetitan/carto/commit/a4514489b4cc55681dede92ed55277b75cd68bdb) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Dialog] Add component for modal confirmation dialogs, with `trigger`, controlled open state, and footer `primaryAction` / `secondaryAction` Buttons (including a `danger` confirm variant)

* [#90](https://github.com/servicetitan/carto/pull/90) [`7a412a2`](https://github.com/servicetitan/carto/commit/7a412a25953539be4c62d86b37b391873a54e68d) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Add `IconMenu` to `@servicetitan/anvil2-ai-kit/icons`.

* [#80](https://github.com/servicetitan/carto/pull/80) [`085fa1f`](https://github.com/servicetitan/carto/commit/085fa1f149593f04038855ee801cf748d8458871) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[PromptBar] Localize the component's built-in strings through the kit's i18n layer — the placeholder, attachment add/remove, voice, send/done/dismiss/cancel actions, and the disclaimer now resolve via `useCartoIntl`. They render in English by default (unchanged copy) and respond to `CartoIntlProvider`'s `locale` / `messages`. The `placeholder` prop still overrides as before; the attachment remove label interpolates the attachment name via ICU.

  The `disclaimer` prop now takes a single `message` string with a `<link>…</link>` placeholder marking the linked text, replacing the separate `text` + `linkLabel` fields. This keeps the wording and the link's position in the sentence as one translatable unit — a translator (or consumer) can place the link mid-sentence — rather than assuming text-then-link concatenation. `linkHref` is unchanged.

* [#69](https://github.com/servicetitan/carto/pull/69) [`75fc760`](https://github.com/servicetitan/carto/commit/75fc7602f2358a373ecc188d77596cf103f32357) Thanks [@AdamLantz](https://github.com/AdamLantz)! - \[PromptBar] Add component for composing AI prompts with text, attachments, and voice transcription.

### Patch Changes

* [#100](https://github.com/servicetitan/carto/pull/100) [`7c5244b`](https://github.com/servicetitan/carto/commit/7c5244b4ef80ba86cb6a3ad0b34ce4d6d147ff04) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Markdown] Restyle links to reuse the `Link` treatment: underlined near-black at rest, informative blue on hover, and a focus ring (replacing the flat blue style).

* [#59](https://github.com/servicetitan/carto/pull/59) [`2b25a96`](https://github.com/servicetitan/carto/commit/2b25a96b0b87e630b4ab39337e578d2d421e3548) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add `button` component tokens (`primary` / `secondary` / `ghost` backgrounds, foregrounds, elevation; `font`, `gap`, `padding`, `radius`, and `focus`) and wire `Button` to consume them via the `component` proxy instead of hard-coded primitives. The button's icon size consumes the existing `icon.size.large` token directly (no redundant `button.icon` alias)

* [#85](https://github.com/servicetitan/carto/pull/85) [`69c049c`](https://github.com/servicetitan/carto/commit/69c049c89d2c8c1adafc865a534e46c3273dee9c) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add `button.danger` component tokens (`background`, `foreground`, `elevation`) aliasing the critical semantic surface, and wire the `Button` `danger` variant to consume them via the `component` proxy instead of reading `semantic.*` critical tokens directly

* [#77](https://github.com/servicetitan/carto/pull/77) [`987b206`](https://github.com/servicetitan/carto/commit/987b206115a35dcc97f15c13c8bce6c4f232fc21) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add the `border.color.accent` semantic intent (brand-interactive outline for focus rings, active navigation, and selected controls) and restructure the button's focus tokens into a `button.focus.ring` group (`color` → `border.color.accent`, plus `width` and `offset`). `Button` now consumes `button.focus.ring.{color,width,offset}` for its focus ring instead of a primitive color alias and an inline outline width. No visual change — the ring stays `#0265dc`, 3px thick, 2px offset.

* [#83](https://github.com/servicetitan/carto/pull/83) [`fdcc420`](https://github.com/servicetitan/carto/commit/fdcc420d5336e0675ca2ec7d524f45e3c50d0970) Thanks [@tounsoo](https://github.com/tounsoo)! - \[PromptBar] Add `promptBar` component tokens and wire the recipe to consume them

  New semantic-aliasing component tokens (`promptBar.*`) cover the bar surface
  (background, border, radius, elevation, gap, padding), the attachment tile, the
  disclaimer, and the error foreground. The PromptBar recipe now consumes
  `component.promptBar.*` instead of referencing `semantic`/`primitive` directly.
  Values map 1:1 from the prior references except the attachment-tile background,
  which adopts `background.color.subtle.resting` (neutral.30 → neutral.50) and
  now follows light/dark.

* [#90](https://github.com/servicetitan/carto/pull/90) [`7a412a2`](https://github.com/servicetitan/carto/commit/7a412a25953539be4c62d86b37b391873a54e68d) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Update `IconGrip` to render Lucide `GripVertical`, the six-dot vertical drag-handle glyph.

* [#90](https://github.com/servicetitan/carto/pull/90) [`7a412a2`](https://github.com/servicetitan/carto/commit/7a412a25953539be4c62d86b37b391873a54e68d) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons] Update `IconStatusNew` to render in `currentColor` instead of a hardcoded blue, so it inherits text color like other icons.

* [#65](https://github.com/servicetitan/carto/pull/65) [`1dd0874`](https://github.com/servicetitan/carto/commit/1dd08741284eba84cf57d6ca4c40177ffaf2bd2f) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Tokens] Add `tooltip.radius`, `tooltip.padding.inline`, `tooltip.padding.block`, and a `tooltip.font` typography composite, and repoint `tooltip.foreground` / `tooltip.background` to the `prominent` semantic intents (`foreground.color.on.prominent` and `background.color.prominent.resting`) in place of raw `color.neutral` primitives. `Tooltip` now sources its surface (color, radius, padding) and typography from these tokens via the `component` proxy instead of hard-coded primitives, and renders its content in a plain `<span>` carrying `tooltip.font` rather than a nested `<Text>`.

* [#74](https://github.com/servicetitan/carto/pull/74) [`3935c98`](https://github.com/servicetitan/carto/commit/3935c982aa16bdc57bea17b2670c56ab8291a12a) Thanks [@tounsoo](https://github.com/tounsoo)! - \[UserMessage] Style against `userMessage` and `messageToolbar` component tokens instead of raw primitives

* Updated dependencies \[[`2b25a96`](https://github.com/servicetitan/carto/commit/2b25a96b0b87e630b4ab39337e578d2d421e3548), [`69c049c`](https://github.com/servicetitan/carto/commit/69c049c89d2c8c1adafc865a534e46c3273dee9c), [`987b206`](https://github.com/servicetitan/carto/commit/987b206115a35dcc97f15c13c8bce6c4f232fc21), [`fdcc420`](https://github.com/servicetitan/carto/commit/fdcc420d5336e0675ca2ec7d524f45e3c50d0970), [`3bcff52`](https://github.com/servicetitan/carto/commit/3bcff52f7880a9eb7b6e438b1e68dad893f351cc), [`8cad2e0`](https://github.com/servicetitan/carto/commit/8cad2e0f50d91a79f1ef053f2815dcb5f4fb4914), [`9c85f60`](https://github.com/servicetitan/carto/commit/9c85f60670a6b19d1f637efa9cc7186a910a149c), [`7d8d6b3`](https://github.com/servicetitan/carto/commit/7d8d6b3504c4d03734e6bdae5098d0f3d54580f6), [`57c6646`](https://github.com/servicetitan/carto/commit/57c6646a218ca773d2506a2952476d7b05509a9d), [`9b3dfa8`](https://github.com/servicetitan/carto/commit/9b3dfa8840850171c903fe3a19e033003dda0ec0), [`36c2afe`](https://github.com/servicetitan/carto/commit/36c2afe79e2e87e07211787a33a751faa1dbe962), [`03a0e99`](https://github.com/servicetitan/carto/commit/03a0e99cfc5be9499d8da000bebe62d00f014ee0), [`1dd0874`](https://github.com/servicetitan/carto/commit/1dd08741284eba84cf57d6ca4c40177ffaf2bd2f), [`3935c98`](https://github.com/servicetitan/carto/commit/3935c982aa16bdc57bea17b2670c56ab8291a12a), [`2b25a96`](https://github.com/servicetitan/carto/commit/2b25a96b0b87e630b4ab39337e578d2d421e3548)]:
  * @servicetitan/carto-tokens\@0.1.2

## 0.2.0

### Major Changes

* [#37](https://github.com/servicetitan/carto/pull/37) [`ed3dec3`](https://github.com/servicetitan/carto/commit/ed3dec39f3859470cb76e9dd3d2bc60ab9878b70) Thanks [@ericag1985](https://github.com/ericag1985)! - \[VisuallyHidden] Remove component; use `aria-label` on the interactive parent with decorative `Icon` instead

* [#49](https://github.com/servicetitan/carto/pull/49) [`45c4c42`](https://github.com/servicetitan/carto/commit/45c4c428d4db86db6350625867b6b7009e775652) Thanks [@ericag1985](https://github.com/ericag1985)! - \[UserMessage] Add an action toolbar and new props:

  * `timestamp` (required) renders the copy action and formatted send time
  * `onRetry` adds a retry action when `error` is set
  * `revealToolbarOnHover` hides the toolbar until the message is hovered or focused

### Minor Changes

* [#37](https://github.com/servicetitan/carto/pull/37) [`ed3dec3`](https://github.com/servicetitan/carto/commit/ed3dec39f3859470cb76e9dd3d2bc60ab9878b70) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Button] Add component (primary / secondary / ghost; medium / small / xsmall) with required `label`, optional `icon`, and touch promotion for `xsmall`

* [#37](https://github.com/servicetitan/carto/pull/37) [`ed3dec3`](https://github.com/servicetitan/carto/commit/ed3dec39f3859470cb76e9dd3d2bc60ab9878b70) Thanks [@ericag1985](https://github.com/ericag1985)! - \[Icons, Types] Export `IconElement` type alias for factory-created Carto icons

* [#31](https://github.com/servicetitan/carto/pull/31) [`69ef424`](https://github.com/servicetitan/carto/commit/69ef424f4c5a809dc349d382b05ec41ae36c634b) Thanks [@tounsoo](https://github.com/tounsoo)! - \[Text, Tokens] Convert text tokens to DTCG typography composites; fix broken font-family in Swift build; `Text` now spreads composite values for font-family, weight, and line-height

### Patch Changes

* Updated dependencies \[[`63bee23`](https://github.com/servicetitan/carto/commit/63bee23e0428836279b448c34b644bae209bdca8), [`9b77ac3`](https://github.com/servicetitan/carto/commit/9b77ac3fa8188d6df776b7a2ea8ccf63f87b4e3b), [`69ef424`](https://github.com/servicetitan/carto/commit/69ef424f4c5a809dc349d382b05ec41ae36c634b)]:
  * @servicetitan/carto-tokens\@0.1.1

## 0.1.0

### Minor Changes

* a3b08e5: \[Icons] Add per-icon components under the `./icons` subpath (25 Lucide-backed, 13 custom ServiceTitan icons)
* a8863c6: \[Markdown] Add component for rendering GFM markdown via a required `source` prop
* 16bc697: \[Text] Add component (headline / body / eyebrow variants) and `components.text.*` tokens
* a3b08e5: \[CartoTheme] Add container component with `appearance="auto" | "light" | "dark"`
* b6292cc: \[Tooltip] Add internal component with tooltip color tokens and MFE shadow-DOM support
* 17b11d2: \[UserMessage] Add chat bubble component for end-user-authored messages

### Patch Changes

* b6292cc: \[CartoTheme] Swap font loading to direct `rel="stylesheet"` with `font-display: optional`
* 1c2ea19: \[Tokens] Singularize vanilla-extract tier names (`primitives`/`components` → `primitive`/`component`; deprecated aliases remain for one release)
* Updated dependencies \[2578aea]
* Updated dependencies \[a3b08e5]
* Updated dependencies \[16bc697]
* Updated dependencies \[b6292cc]
* Updated dependencies \[5aa7870]
* Updated dependencies \[04c22a3]
* Updated dependencies \[d0ec6be]
* Updated dependencies \[0638cef]
* Updated dependencies \[c676116]
* Updated dependencies \[b6292cc]
* Updated dependencies \[2e9073b]
* Updated dependencies \[48de98e]
* Updated dependencies \[8178a7d]
* Updated dependencies \[1c2ea19]
* Updated dependencies \[128f12e]
* Updated dependencies \[974616f]
  * @servicetitan/carto-tokens\@0.1.0


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.