Skip to main content
Current version: 0.2.5. Source: packages/anvil2-rn/CHANGELOG.md.

0.2.5

Patch Changes

  • #3000 2b10cd1 Thanks @rollsroyc3! - [Card] Remove the border, matching the current design spec, reversing its layout impact (auto-sized Card shrinks, fixed-size Card regains the padding)

0.2.4

Patch Changes

  • #3045 e71cb3a Thanks @rollsroyc3! - [ActionLog] An untitled step no longer renders a blank title line: its description takes the marker’s line, as on web, and its details toggle is named by its position (“Show details for step 3”)
  • #3064 3e36538 Thanks @rollsroyc3! - [Tokens] Add text.highlight.backgroundFallback, a solid stand-in for text.highlight.background (web’s gradient) on React Native, Swift, and Kotlin, which cannot render it. [Text] Consume backgroundFallback for the highlighted prop’s background instead of a hardcoded rgba(188, 226, 234, 0.4) literal.
  • #3060 6155a3f Thanks @rollsroyc3! - [AgentThinking] A long label wraps within the indicator’s container and truncates after two lines, instead of running past the screen edge
  • Updated dependencies [3e36538]:
    • @servicetitan/carto-tokens@0.4.7
    • @servicetitan/anvil2-icons@0.1.10

0.2.3

Minor Changes

  • #2997 37d5944 Thanks @rollsroyc3! - [MarkdownTable, MarkdownTableCell, MarkdownTableHeaderCell, MarkdownTableRow] Add components for rendering markdown-sourced tables
  • #2992 cd90d00 Thanks @rollsroyc3! - [VoiceModeFab] Add isUserTalking, an orange presence glow for the caller

Patch Changes

  • #2992 cd90d00 Thanks @rollsroyc3! - [VoiceModeFab] Fix the collapsed circle’s waveform glyph to blue200
  • Updated dependencies [60a7a12]:
    • @servicetitan/anvil2-icons@0.1.9

0.2.2

Patch Changes

  • Updated dependencies [5a21d98, 5a21d98, 65336ab]:
    • @servicetitan/carto-tokens@0.4.6
    • @servicetitan/anvil2-icons@0.1.8

0.2.1

Minor Changes

  • #2897 b628c84 Thanks @rollsroyc3! - [VoiceModeFab] Add status to the expanded strip — the leading indicator now reflects talking, thinking or listening. The strip’s waveform moves to a 16pt box in primitive/color/blue/200 to match design’s .Talking Indicator, so callers that omit status will see it smaller and blue rather than 20pt and inverse.

Patch Changes

  • #2899 ad50448 Thanks @rollsroyc3! - [PromptBar] Match the heights design draws — promptBar.padding is the horizontal inset, paired with condensed vertically, and the inline controls are 48 with the voice row’s exit at 64. Every row built on the bar’s surface loses 16pt: the text bar and the voice-mode row land at 64, and the listening and transcribing rows at 56, since their controls are unchanged.
  • #2902 56a0758 Thanks @rollsroyc3! - [Button, ButtonToggle] Fix Button/ButtonToggle rendering a drop shadow and secondary drawing a 1px border in every state, matching the web kit’s flat, borderless look; secondary is now 2pt narrower and shorter since its border no longer adds to the box.
  • #2897 b628c84 Thanks @rollsroyc3! - [VoiceModeFab] Fade the presence halo on turn changes and pulse it while isAgentSpeaking, instead of snapping it on and off.

0.2.0

Major Changes

  • #2868 0347522 Thanks @rollsroyc3! - [PromptBar] Withhold the send action at rest, show it disabled once the editor is focused, and enable it on a draft.

Minor Changes

  • #2862 dc20f1d Thanks @rollsroyc3! - [Button] Add the large size and the danger-secondary variant to the React Native kit, with the critical-subdued semantic intents behind them.
  • #2866 8410327 Thanks @rollsroyc3! - [VoiceModeFab] Add isAgentSpeaking — the presence glow now marks Atlas holding the floor rather than the call being open.

Patch Changes

  • #2860 b6d7c34 Thanks @rollsroyc3! - [VoiceModeFab] Restore the spec’d red.700 stop glyph and alias foreground.color.critical for the muted-mic tint.
  • #2866 8410327 Thanks @rollsroyc3! - [VoiceModeFab] Let the host align the expanded strip — it no longer pins its own alignSelf.
  • Updated dependencies [dc20f1d]:
    • @servicetitan/carto-tokens@0.4.5
    • @servicetitan/anvil2-icons@0.1.7

0.1.10

Minor Changes

  • #2848 fcd48c7 Thanks @rollsroyc3! - [PromptBar] Add isVoiceModeActive to collapse the bar to a single exit-to-typing control during a live voice conversation.
  • #2847 48560b1 Thanks @rollsroyc3! - [VoiceModeFab] Add the floating voice-mode control — an idle circle, an active circle with a presence glow, and an expanded strip with mic-mute, stop, and collapse.

Patch Changes

  • Updated dependencies [6e236a2]:
    • @servicetitan/anvil2-icons@0.1.6

0.1.9

Minor Changes

  • #2826 cba0245 Thanks @rollsroyc3! - [AgentMessage] Add showToolbar to omit the timestamp + action row for a host with no copy/feedback surface of its own. Defaults to true, matching current behavior.

Patch Changes

  • #2828 24c1d47 Thanks @w-a-t-s-o-n! - [Button] Use fully rounded corners at every size.
  • Updated dependencies [24c1d47]:
    • @servicetitan/carto-tokens@0.4.4
    • @servicetitan/anvil2-icons@0.1.5

0.1.8

Minor Changes

  • #2803 f655a8d Thanks @rollsroyc3! - [Checkbox] Add a React Native checkbox, porting the AI Kit web component’s API (isSelected / defaultSelected / isIndeterminate / isDisabled, and the labelled vs aria-label/aria-labelledby union).

Patch Changes

  • #2807 d1ecabc Thanks @rollsroyc3! - [ActionLog, PromptBar] Stop the decorative ActivityIndicator from being announced as a second, unnamed progress indicator beside the labelled status.
  • #2794 49857b1 Thanks @rollsroyc3! - [MessageToolbar] Size the action buttons 40x40 for touch and tighten their grouping
  • Updated dependencies [64cea5c]:
    • @servicetitan/carto-tokens@0.4.3
    • @servicetitan/anvil2-icons@0.1.4

0.1.7

Patch Changes

  • #2783 5848c75 Thanks @rollsroyc3! - [MessageToolbar] Order assistant actions before the timestamp, matching the web kit

0.1.6

Patch Changes

  • #2729 84ff49a Thanks @jpex! - [Suggestion] Restyle the chip surface to match Card — standard fill, 1px standard border, and hover-only ambient elevation
  • Updated dependencies [84ff49a]:
    • @servicetitan/carto-tokens@0.4.2
    • @servicetitan/anvil2-icons@0.1.3

0.1.5

Patch Changes

  • Updated dependencies [2ef0653]:
    • @servicetitan/anvil2-icons@0.1.2

0.1.4

Minor Changes

  • #2711 4b85324 Thanks @ericag1985! - [Icons] Consume @servicetitan/anvil2-icons/react-native for the shared allowlist

Patch Changes

  • Updated dependencies [4b85324, 4b85324]:
    • @servicetitan/anvil2-icons@0.1.1

0.1.3

Patch Changes

0.1.2

Minor Changes

  • #2669 21efe99 Thanks @w-a-t-s-o-n! - Publish Carto’s React Native component kit from the Hammer monorepo as @servicetitan/anvil2-rn. Formerly @servicetitan/carto-rn-kit.

Patch Changes

  • Updated dependencies [21efe99, 21efe99]:
    • @servicetitan/carto-tokens@0.4.1

0.1.1

Minor Changes

  • #297 396df2d Thanks @rollsroyc3! - [BottomSheet] Drag the handle down to dismiss. The grip is now an interactive control: dragging it down past a quarter of the sheet’s height, or on a fast downward flick, dismisses; a shorter drag settles back open. The drag drives the same enter/exit value, so the surface slides and the scrim fades together. Only active when isDismissable; the handle stays hidden from assistive tech (a drag can’t be performed there — the header X, or the scrim when it’s hidden, remains the dismiss affordance). This is drag-to-dismiss, still not drag-to-resize detents.
  • #290 08d85da Thanks @rollsroyc3! - [BottomSheet] Add a React Native bottom sheet — a bottom-anchored modal surface with a drag handle, header (title + optional subheader + close), and a scrolling body region. Mirrors the web sheet’s configuration-first API (title, subheader, content, trigger, showCloseButton, isDismissable, controlled/uncontrolled open state) and Dialog’s motion. Drag-to-resize detents are not included in this version.
  • #296 6bb7888 Thanks @rollsroyc3! - [ButtonToggle] Add a React Native toggle button — a persistent on/off control (bold/italic toolbar buttons, view-mode switches) built on Button’s own secondary visual system plus an informative selected treatment, matching the web kit’s border-reservation trick so toggling selection never resizes the button. Selection is controlled (isSelected/onChange) or uncontrolled (defaultSelected/onChange), same split as the web kit’s ToggleButton. Uses RN’s dedicated accessibilityRole="togglebutton" + accessibilityState.checked, since plain "button" has no ARIA-legal state for a toggle’s value and RN’s AccessibilityState has no pressed key.

0.1.0

Major Changes

  • #288 aa78524 Thanks @w-a-t-s-o-n! - Do not use the previous version in this package’s changelog. For packages versioned in #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.
  • #283 debb29f Thanks @ericag1985! - [Dependencies] Raise the react-native peer floor to 0.81, matching Expo SDK 54 — the version whose default architecture resolves the percentage transforms the chart tooltip positions itself with

Minor Changes

  • #283 debb29f Thanks @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 finger, say. Also exports the TooltipCaretDirection and TooltipSurfaceProps types

Patch Changes

  • Updated dependencies [aa78524, debb29f]:
    • @servicetitan/carto-tokens@0.4.0

0.0.10

Minor Changes

  • #280 334c709 Thanks @rollsroyc3! - [Dialog] Animate open/close — the scrim fades and the surface slides up from spacing.expansive while fading in, on the layer-entry motion tokens (emphasis in, transition out), matching the web Dialog. Honors the OS “Reduce motion” setting (instant), and defers the Modal’s unmount so the exit actually plays. Built on react-native-reanimated (already a peer dependency of the kit).
  • #281 3746762 Thanks @rollsroyc3! - [Disclosure] Animate the chevron rotation (0°↔180°) on expand/collapse instead of snapping, on the semantic.motion.transition curve — matching the web Disclosure’s transition: transform. Uses built-in RN Animated (native driver, no new dependency) and snaps under the OS “Reduce motion” setting. Visible in ActionLog, which composes Disclosure.
  • #279 e74b382 Thanks @rollsroyc3! - [PromptBar] Animate the inline↔stacked reflow with react-native-reanimated Layout Animations — the RN counterpart to the web PromptBar’s Framer layout transition. Every persistent element (bar, editor, controls) shares one token-driven curve (semantic.motion.duration.transition + easing.transition) so the bar expands as a single linked motion, and it honors the OS “Reduce motion” setting. Adds react-native-reanimated (>=3.16.0 <5) as a peer dependency (install + native rebuild + add react-native-reanimated/plugin last in your babel plugins).
  • #278 ad1fd44 Thanks @rollsroyc3! - [PromptBar] Render the listening state as a live scrolling audio waveform instead of a flat level-meter fill. The bars floor at a resting pill (so the row reads as “listening” at silence), scale symmetrically from center off audioLevel, and scroll left as new levels arrive — mirroring the web kit’s internal Waveform. Built on RN’s built-in Animated (no react-native-reanimated dependency); under the OS “reduce motion” setting the scroll stops but the bars stay responsive to the live level. Purely visual — the meter track announces the listening status via its listeningLabel + a polite live region (the misleading progressbar role, which exposed no value, is dropped).

0.0.9

Minor Changes

  • #272 4330d0c Thanks @rollsroyc3! - [PromptBar] Add label-override props for every voice/send control. sendLabel (default "Send"), stopLabel (default "Stop"), startVoiceLabel (default "Start voice input"), acceptVoiceLabel (default "Accept voice input"), and cancelVoiceLabel (default "Cancel voice input") mirror the existing listeningLabel/transcribingLabel pattern — the kit has no i18n layer of its own, so a localized host now has an override for every accessible name PromptBar renders, not just two of them. Found while an early adopter’s chat input (with translated en/es/fr labels) swapped onto PromptBar and lost localization on these five controls.
  • #275 7c06845 Thanks @rollsroyc3! - [PromptBar] Reflow to a stacked layout on any draft, matching the web PromptInput. An empty editor stays a compact inline row ([text] [mic] [send]); with content, the editor moves onto its own row above a right-aligned [mic] [send] row. Driven by value — no new prop, no API change. Note: the bar is taller once there’s a draft (its height was already dynamic; this adds a step at the first character), so account for it in any fixed-offset / KeyboardAvoidingView positioning. The transition is not yet animated (LayoutAnimation is unreliable under Fabric; a reanimated-based follow-up is tracked).

0.0.8

Minor Changes

  • #270 a2655d6 Thanks @rollsroyc3! - [PromptBar] Add voice-capture states. onStartVoice already surfaced a mic; the host can now drive a controlled voiceState ("idle" | "listening" | "transcribing") so the bar renders the full voice flow, not just the mic. "listening" swaps the editor for a discard / live level-meter (audioLevel) / accept row (onCancelVoice / onAcceptVoice); "transcribing" shows a busy row with the interim transcript. Still transport-agnostic — the host owns the recorder/STT. This unblocks consumers whose chat input drives on-device speech-to-text from adopting PromptBar without regressing voice. Both user-facing strings are overridable for localization: transcribingLabel (default "Transcribing…" — the interim-transcript fallback and the row’s accessible label) and listeningLabel (default "Recording" — the polite live-region status announced while capturing).

Patch Changes

  • #269 5dcb3fc Thanks @rollsroyc3! - [Card] Render the card border token. ANV-5318 flattened Card to a bordered, no-shadow surface and the component.card.border token was added, but Card.styles.ts never applied it — so the card had no edge and was invisible on a same-color background (its fill is the standard neutral background). The border is now drawn in every state. Upgrade note: borderWidth participates in RN layout, so this is a visual and layout change — the card grows by 2 × border.width (or its content box shrinks by the same), and any consumer who wrapped Card in their own bordered surface to work around the missing edge will now see a double border. If that’s you, remove your own wrapper.

0.0.7

Minor Changes

  • #252 6656ed9 Thanks @rollsroyc3! - [AgentMessage, UserMessage, Card, ActionLog] Adopt the CartoTelemetryProvider telemetry seam. Each gains an optional analyticsId; when it’s set and a provider is mounted, the component emits a CartoInteractionEvent before its own handler runs — AgentMessage/UserMessage toolbar actions emit press with meta.action (copy | like | dislike | retry), Card’s button variant emits press, and ActionLog emits toggle for its steps and per-step-details disclosures with meta.section (steps | details), meta.expanded, and — for details — meta.stepId identifying which step was toggled. Adds toggle to CartoInteractionType and AgentMessage / UserMessage / Card / ActionLog to CartoInteractionComponent. Fully back-compatible: untagged, or with no provider, these components emit nothing and pay zero cost.

0.0.6

Minor Changes

  • #249 4db26fb Thanks @rollsroyc3! - [Card] Add Card component — a static or button-interactive surface. Content flows through the content prop (a bare string is wrapped in Text for you), with a padding scale (snug | base | relaxed, default base). Passing onPress + label makes the whole card a button, optionally isDisabled.
  • #247 afa28d2 Thanks @jonathanackerson! - [Button, CartoTelemetryProvider, Dialog, PromptBar, SuggestionList] Add an opt-in telemetry seam. Wrap an app (or subtree) in the new CartoTelemetryProvider with an onInteraction handler and instrumented components emit a semantic CartoInteractionEvent (component + type + optional structural meta) on each interaction — no per-component handler wrapping. The context value is stable for the provider’s lifetime (the handler is read through a ref), so an inline onInteraction never re-renders instrumented consumers. A new optional analyticsId prop tags an instance and threads through Button (press), SuggestionList (select, meta.index), PromptBar (submit, meta.length), and Dialog (press for the confirm action; dismiss for the X, cancel, or scrim); a component emits only when tagged and a provider is mounted, so Carto’s own internal chrome stays silent. Fully back-compatible: with no provider, components emit nothing and pay zero cost. Privacy: meta carries structural values only (an index, a length) — never typed text or user content. Also exports the CartoInteractionComponent, CartoInteractionEvent, CartoInteractionHandler, CartoInteractionMeta, and CartoInteractionType types.
  • #249 4db26fb Thanks @rollsroyc3! - [ActionLog] Add ActionLog component — a collapsible vertical timeline of agent steps. Steps are supplied as a typed steps array (id, title, optional description, status, and details), each rendering a status marker (not-started | in-progress | success | error) and an optional per-step details disclosure. Expansion is uncontrolled by default (defaultExpanded) or controllable via expanded + onExpandedChange.

Patch Changes

0.0.5

Patch Changes

  • Updated dependencies [15a46a4]:
    • @servicetitan/carto-tokens@0.2.4

0.0.4

Minor Changes

  • #226 875b0c5 Thanks @rollsroyc3! - [MessageToolbar] Fill the selected feedback thumb so the chosen state reads visually (parity with the web filled-thumb variant). lucide ships no filled thumb glyph, so the outline glyph is filled with the ghost Button’s resting foreground — the same color it paints the icon stroke — yielding a clean solid thumb; the unselected thumb stays outline. The accessible label (“Remove like”/“Remove dislike”) still conveys the state. Surfaces through AgentMessage (currentFeedback).
  • #227 f05b9eb Thanks @rollsroyc3! - [PromptBar] Add a React Native chat prompt bar — the text-first slice of the web PromptBar: a controlled, auto-growing editor (value/onChange, grows to maxRows then scrolls) with a send action (onSend, gated by canSend which defaults to any non-whitespace draft) and an optional fine-print disclaimer. When a response is streaming in (isSending), sending is withheld; wire onStop too and the send button becomes a Stop that cancels the in-flight response. Wire onStartVoice to surface a mic button that hands voice capture off to the host (the kit owns no recorder/STT); the mic is withheld while disabled or isSending. Controls are vertically centered so a single line of text sits level with the buttons. Prop names mirror the web component so attachments / the transcription waveform can be added later without reshaping the API; send is button-driven (Enter inserts a newline on mobile keyboards).

0.0.3

Minor Changes

  • #223 dbdc1fd Thanks @rollsroyc3! - [Text] Add bounded color (semantic foreground role) and align props. RN has no CSS color inheritance like the web Text, so color (standard | subtle | informative | critical | inverse, mapped to semantic.foreground.color) is the constrained way to pick a non-default foreground without a raw style; align (start | center | end) covers multi-line alignment.

0.0.2

Minor Changes

  • #221 63b6e32 Thanks @rollsroyc3! - [AgentThinking] Add a React Native agent thinking indicator (animated Atlas logo + optional status label)
  • #213 d0df353 Thanks @rollsroyc3! - [AtlasLogo] Add a React Native Atlas logo component
  • #218 a28f694 Thanks @rollsroyc3! - [Dialog] Add a React Native modal dialog component
  • #219 43acfc6 Thanks @rollsroyc3! - [UserMessage, AgentMessage] Add React Native chat message components with a shared message toolbar (copy + retry / copy + feedback)
  • #214 477e0dc Thanks @rollsroyc3! - [Suggestion] Add React Native Suggestion and SuggestionList components
  • #220 9295949 Thanks @rollsroyc3! - [Text] Add a React Native typographic Text component (headline / body / eyebrow)

0.0.1

Minor Changes

  • #203 b4a6c06 Thanks @ericag1985! - Add CartoThemeProvider + useCartoTheme and drive component styling from @servicetitan/carto-tokens’ React Native light/dark bundles — Button now renders real token values (colors, spacing, radius, typography, elevation) instead of placeholders.
  • #201 36f3b3e Thanks @ericag1985! - [Button] Add the initial @servicetitan/anvil2-rn React Native component kit with a Button component (primary, secondary, ghost, danger variants; medium, small, xsmall sizes; icon and icon-only support).

Patch Changes

Last modified on November 2, 2026