packages/carto-tokens/CHANGELOG.md.
0.4.7
Patch Changes
-
#3064
3e36538Thanks @rollsroyc3! - [Tokens] Addtext.highlight.backgroundFallback, a solid stand-in fortext.highlight.background(web’s gradient) on React Native, Swift, and Kotlin, which cannot render it. [Text] ConsumebackgroundFallbackfor thehighlightedprop’s background instead of a hardcodedrgba(188, 226, 234, 0.4)literal.
0.4.6
Minor Changes
-
#2932
5a21d98Thanks @pbuckingham-st! - [Tokens] Add a web-onlygradient$typefor linear gradient tokens -
#2932
5a21d98Thanks @pbuckingham-st! - [DiffValue, Text, TruncatedText] Change the suggested-change highlight fill to a blue-to-cyan gradient
Patch Changes
- #2922
65336abThanks @ericag1985! - [Tokens] Remove unused Button elevation and zero-width border tokens now that both kits are flat and borderless
0.4.5
Minor Changes
- #2862
dc20f1dThanks @rollsroyc3! - [Button] Add thelargesize and thedanger-secondaryvariant to the React Native kit, with thecritical-subduedsemantic intents behind them.
0.4.4
Minor Changes
- #2828
24c1d47Thanks @w-a-t-s-o-n! - [Tokens] Add a mobile theme overlay so React Native, Swift, and Kotlin can override token values independently of web, fully roundbutton.radius, and emitradius.containedon Swift and Kotlin.
0.4.3
Patch Changes
- #2799
64cea5cThanks @w-a-t-s-o-n! - [Tokens] Align checkbox selected fill with primary button blue (color.blue.600)
0.4.2
Minor Changes
- #2729
84ff49aThanks @jpex! - [Suggestion] Restyle the chip surface to match Card — standard fill, 1px standard border, and hover-only ambient elevation
0.4.1
Patch Changes
-
#2669
21efe99Thanks @w-a-t-s-o-n! - Fix two latent build-pipeline bugs found during review.normalizeFlatTokens’schainsAppearancepropagation was a single forward sweep over the token array instead of a fixed point, so a same-tier transitive alias chain of three or more hops could fail to propagate depending on declaration order. The only consumer, the Kotlin emitter, uses this flag to pick a token’s declared type — a false negative would emit avalwhose declared type doesn’t match the value it points to, which doesn’t compile. Separately,emitReactNativeFileinlined semantic-to-semantic self-referencing aliases to avoid a self-referentialconstinitializer, but never applied the same guard to component-to-component aliases — an alias between two component tokens would generate aconstthat references itself inside its own initializer, throwing aReferenceErrorat module load. Neither bug is triggered by any token currently insrc/, so this release’s generated output is unchanged. Both are correctness fixes to the pipeline itself, each covered by a new regression test. -
#2669
21efe99Thanks @w-a-t-s-o-n! - Publish@servicetitan/carto-tokensfrom the Hammer monorepo. The package moved here as a fresh import from the carto repo at8dc7f861, at the same 0.4.0 it was last published from carto. Token values, exports, and the--carto-*variable namespace are all unchanged — this is a change of publishing origin, not of anything a consumer imports. A patch is therefore the honest bump: the next release exists only so Hammer’s pipeline can take over from carto’s, and consumers upgrading from 0.4.0 get identical output.
0.4.0
Major Changes
-
#288
aa78524Thanks @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 tomainbut 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
debb29fThanks @ericag1985! - [tooltip] Restyle the tooltip surface to the new Carto design — a blue 900 background and an 8px corner radius
0.3.0
Major Changes
- #246
ced2173Thanks @ericag1985! - [Tokens] Renamefont.family.satoshiprimitive tofont.family.sofia(now["Sofia Pro", "system-ui", "sans-serif"]); consumers referencingprimitive.font.family.satoshidirectly must switch toprimitive.font.family.sofia
Minor Changes
- #246
ced2173Thanks @ericag1985! - [Tokens] Addcomponent.suggestion.backgroundandcomponent.tabbedLayout.tab.background(resting/hover, aliasing the same subtle wash asbutton.secondary); repointcomponent.userMessage.bubble.backgroundto the same wash
Patch Changes
-
#246
ced2173Thanks @ericag1985! - [Button] Updatebutton.primaryandbutton.secondarycomponent tokens for new visual treatment -
#246
ced2173Thanks @ericag1985! - [Tokens] Remove unusedcard.elevation.resting; addcard.border.colorandcard.border.width -
#246
ced2173Thanks @ericag1985! - [Tokens] Updatetypography.fontFamily.expressiveto resolve to Sofia Pro and consolidate alltext.headline.*(regular/substantial/major/hero)fontWeightaliases totypography.weight.emphatic(Bold), matching the Sofia Pro Bold-only headline treatment -
#246
ced2173Thanks @ericag1985! - [Tokens] Addtext.highlight.backgroundcomponent token, aliasingbackground.color.informative-subdued.resting
0.2.4
Minor Changes
- #236
15a46a4Thanks @ericag1985! - [Tokens] Addcomponent.button.toggle.selectedtokens for ButtonToggle’s resting, hover, and pressed selected state
0.2.3
Minor Changes
-
#174
78d6ae5Thanks @w-a-t-s-o-n! - [Tokens] Add semantic component tokens for GuidanceCard spacing, reason callout, and actions -
#171
6c6b726Thanks @tounsoo! - Add a React Native token output target.@servicetitan/carto-tokens/react-nativeexportslightanddarktheme bundles (each withprimitive/semantic/componenttiers) as plainas constobjects, plus aCartoThemetype. Dimensions are unitless numbers, alpha is baked into#rrggbbaa, shadows areboxShadowstrings, and appearance is pre-resolved into the two bundles — select viauseColorScheme().
Patch Changes
- #174
78d6ae5Thanks @w-a-t-s-o-n! - [Tokens] Add semantic tokens for presentational table surfaces, borders, and cell spacing
0.2.2
Minor Changes
-
#180
4ef1ee7Thanks @w-a-t-s-o-n! - [Checkbox] Add component tokens -
#181
49af511Thanks @w-a-t-s-o-n! - [Tokens] AdddiffValuecomponent tokens. -
#179
6a85b82Thanks @w-a-t-s-o-n! - [Tokens] Addtext.highlightcomponent tokens for suggested-change surface styling.
Patch Changes
-
#145
4fc2468Thanks @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 fasterfeedbackduration (100ms, down from 200ms), panel and overlay transitions use theemphasisduration with directionalenter/exiteasing, and easing curves shift to the semantic motion values. Animation timings and curves change as a result. [Tokens] Retarget thebottom-sheetanddialogfocus-ringtransition.durationfrommotion.duration.transitiontomotion.duration.feedback(200ms to 100ms). -
#185
b9aed02Thanks @tounsoo! - [Tokens] AddagentThinking.gapandagentThinking.foregroundcomponent tokens -
#190
ab27e8cThanks @ericag1985! - [Button] Button label text now renders in medium weight (Inter Medium).
0.2.1
Minor Changes
-
#160
8d837f1Thanks @tounsoo! - Citation now renders a 1px solid white hairline border. Adds a newcitation.border.colorcomponent token that aliases primitive neutral 0 (white) directly, so the border stays white in both light and dark appearances. -
#162
d6044e5Thanks @tounsoo! - Tokenize PromptInput and the AgentPrompt header foreground.- carto-tokens — adds
agentPrompt.header.foreground(aliasesforeground.color.standard) and a newprompt-input.tokens.jsonwithpromptInput.font(composite typography),promptInput.foreground,promptInput.placeholder.foreground, andpromptInput.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 directsemantic.*references). All values are unchanged, so there is no visual change.
- carto-tokens — adds
Patch Changes
-
#138
cb8458dThanks @tounsoo! - [Tokens] Replace Style Dictionary with a native build pipeline. Token output is byte-for-byte identical, so there is no consumer-facing change. -
#163
fd6c97eThanks @tounsoo! - [Tokens] Authorfont.family.*as ordered DTCG font stacks (arrays). Web joins the stack into a CSSfont-familylist (output unchanged), while Figma, Swift, and Kotlin now take the primary family only instead of the full comma-separated string.
0.2.0
Major Changes
-
#125
42b5ac6Thanks @tounsoo! - [Tokens] Group the semantic motion tokens under a singlemotionnamespace. Theduration,scale, andeasingsemantic groups are consolidated into onemotion.tokens.jsonand nested asmotion.duration.*,motion.scale.*, andmotion.easing.*. Their previous top-level names collided conceptually with the primitiveduration/scaleramps and implied generic, non-motion use; grouping them undermotionmatches the existing semantic-naming convention (size→spacing,color→background) and frees the top-levelduration/scalenamespaces for future non-motion intents. BREAKING: consumers must migrateduration.*→motion.duration.*,scale.*→motion.scale.*, andeasing.*→motion.easing.*. Web:--ct-duration-*/--ct-scale-*/--ct-easing-*become--ct-motion-duration-*/--ct-motion-scale-*/--ct-motion-easing-*. Swift/Kotlin:Semantic.{Duration,Scale,Easing}move underSemantic.Motion.{Duration,Scale,Easing}. The primitiveduration/scaleramps are unchanged.
Minor Changes
-
#123
c8b8b28Thanks @tounsoo! - [Tokens] AddagentPrompt.*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 semanticopacity.disabled(0.6) token.AgentPromptnow consumes these via thecomponent.agentPrompt.*proxy instead of reaching intosemantic.*directly. As part of this:- Option rows are now proper interactive surfaces: their background uses
background.color.subtle.{resting,hover,pressed}(replacing the prior translucentrgba(4,4,4,…)fills) with the pairedforeground.color.on.subtletext color. - The disabled-dim opacity is now the shared
opacity.disabledtoken; the option rows shift from0.5to the system0.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.
- Option rows are now proper interactive surfaces: their background uses
-
#139
ca506f0Thanks @tounsoo! - [Tokens] AddartifactCard.*component tokens for the ArtifactCard surface —foreground(the title/description/arrow color, aliasingforeground.color.standard),gap(the horizontal rhythm between the lead cluster and the trailing arrow, and between the icon and text, aliasingspacing.base), andtext.gap(the title↔description lockup, aliasingspacing.micro).ArtifactCardnow consumes these via thecomponent.artifactCard.*proxy instead of reaching intosemantic.*/primitive.*directly. No visual change: the title↔description gap was already 4px (primitive.size["100"]), now expressed as the matchingspacing.microintent. -
#126
d5c6c81Thanks @tounsoo! - [Tokens] Add thebottomSheetcomponent 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}, andfocus.ring.transition.{duration,easing}(aliasingmotion.duration.transition/motion.easing.transition— the everyday color-shift motion intent;excludePlatforms: figma).handle.grip.backgroundis 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]BottomSheetnow consumes itscomponent.bottomSheet.*tokens instead of inline semantic/primitive literals. Visual changes adopted from the token mappings: top corners use the large-containerradius.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-shippedfocus.*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 consumessemantic.scrim.color(no visual change). The body focus-ring fade now consumesfocus.ring.transition.{duration,easing}(200ms/cubic-bezier(0.4, 0, 0.2, 1)); its easing adopts themotion.easing.transitioncurve, shifting from the kit’s inline[0,0,0.4,1]— making BottomSheet the first consumer of the motion tokens. -
#108
011c6eaThanks @tounsoo! - [Tokens] Add per-variantbutton.<variant>.border.widthtokens (secondary→size.25/ 1px,primary/ghost/danger→size.0) so the borderless variants gain border capability without changing their current footprint.Button’ssecondaryvariant now consumes its width token directly — replacing the prior hard-coded1pxliteral — and subtracts it from the padding so the bordered variant keeps the same outer size as the borderless ones (which stay atborder-width: 0). -
#135
c00c7d5Thanks @tounsoo! - [Tokens] Add thecardcomponent 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.*}), andcard.focus.ring.{color,width,offset}({focus.*}). No visual change — these formalize the valuesCardalready uses (resting + hover elevation now route through theshadow.ambientfamily). [React Kit]Card.css.tsnow consumescomponent.card.*instead of reaching intosemantic.*directly. The disabled state consumessemantic.opacity.disabled, and the in-place transition consumessemantic.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 inlinedcubic-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). -
#128
df50037Thanks @tounsoo! - [Citation] Addcitationcomponent tokens aliasing the semantic tier: background (restingsubtle, hoverinformative-subdued), foreground (restingstandard, hoverinformative), compositefonttypography,gap, inlinepadding,radius, and thefocus.ring(color/width/offset). Light/dark inherits from the semantic aliases. -
#137
ec0c239Thanks @tounsoo! - [Tokens] Add thedialogcomponent 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}, andfocus.ring.transition.{duration,easing}(aliasingmotion.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.coloraliases{border.color.subtle}(neutral.30, #f6f6f6, from Figma’s #e6e6e6);surface.radiusaliases{radius.generous}(24px, from Figma’s 12px) to match BottomSheet’s panel radius.surface.elevationaliases{shadow.floating.resting}(the shared transient-surface intent; blur follows the semantic token).surface.border.widthis{size.25}(1px). [React Kit]Dialognow consumes itscomponent.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 consumesfocus.ring.transition.{duration,easing}(200ms/cubic-bezier(0.4, 0, 0.2, 1)); its easing adopts themotion.easing.transitioncurve, shifting from the prior inline[0,0,0.4,1]to match BottomSheet + Button. The fixed360pxsurface width stays an intentional raw literal (no semantic intent, no matching size primitive);zIndex: 1000is kept raw on purpose (Carto has no layering token scale yet); the shared modal backdrop continues to consumesemantic.scrim.color. -
#110
71b7210Thanks @tounsoo! - [Tokens] Add a globalfocussemantic category —focus.width({size.75}, the new 3px primitive rung),focus.offset({size.50}, 2px), andfocus.color({border.color.accent}) — so every focus ring shares one system-wide treatment.button.focus.ring.{color,width,offset}now aliasfocus.*(no visual change: still#0265dc, 3px, 2px offset), and the newsize.75= 3px primitive backs the ring width. [React Kit]Dialog(body scroll region) andPromptBar(disclaimer link) now consume the globalsemantic.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. -
#129
b1a78a4Thanks @tounsoo! - [Tokens] Addlinkcomponent tokens that alias the semantic tier:link.foreground.resting({foreground.color.standard}) andlink.foreground.hover({foreground.color.informative}) for the link’s text color,link.radius({radius.trim}) for the focus-ring corner, andlink.icon.gap({spacing.micro}) for the trailing external-link icon’s lockup.Link’s recipe now consumes these tokens in place of the rawsemantic.*/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 (matchingButton). -
#134
c083c3cThanks @tounsoo! - [Tokens] Addmenu.*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-subduedis promoted from a scalar to a stateful group —resting(blue.50),hover(blue.100),pressed(blue.200).foreground.color.on.informative-subduedis 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.restingleaf with no value change (background.color.informative-subdued→.resting).Menunow consumes these via thecomponent.menu.*proxy instead of reaching intosemantic.*/primitive.*directly. As part of this:- The popover surface uses
radius.moderate(16px) and the option rows useradius.trim(12px), matching the Figma bindings (semantic/radius/moderateon the container,semantic/radius/trimon the options). - The disabled-dim opacity is now the shared
opacity.disabledtoken (replacing a hard-coded0.6). - The selected option surfaces/text alias
background.color.informative-subdued.{resting,hover,pressed}andforeground.color.on.informative-subdued.{resting,hover,pressed}(no morecolor.blue.*primitive interims). - The unselected option uses the
ghostsurface intent —background.color.ghost.{resting,hover,pressed}— paired withforeground.color.on.ghosttext (neutral.800, a deliberate shift from Figma’sforeground/color/default#040404, which has no carto equivalent).
43:290): popover background/elevation/radius, option spacing/typography, the selected-state surfaces/text, and the 180/360px width mechanics all match. The newinformative-subdued/on.informative-subduedhover values (blue.100 #cce3ff, blue.700 #1d4ca3) equal Figma’sprimary-subdued-hover/primary-hover. The unselected option’s hover/press tints intentionally use the translucentghostintent (neutral.400 @ 0.08/0.16) rather than Figma’s opaquestandard.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. -
#127
07e28caThanks @tounsoo! - [Tokens] Add a@servicetitan/carto-tokens/motionexport: raw, JS-native values for themotion.*token namespace, intended for Framer Motion (motion) and other JS consumers that can’t use CSS custom properties. The vanilla-extract output exposes motion tokens only as CSS variables (cubic-bezier(...)strings,mstime literals), which Motion’s JS API rejects — itseaseprop wants a[x1, y1, x2, y2]tuple and itsdurationprop wants a unitless number in seconds. The new module exportseasing(cubic-bezier control-point tuples, typed asCubicBezier),duration(numbers in seconds, e.g.200ms→0.2), andscale(unitless multipliers), plus a combinedmotionobject. Values are generated from the same token source as the CSS variables, so the two surfaces stay in sync. -
#136
5bf6962Thanks @tounsoo! - [Tokens] Addshadow.ambient— a new low rung on the elevation scale for a subtle interactive affordance. Unlike the directionalraised/floatingshadows,ambientis 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, andfloatingare unchanged (same values and Figma variable IDs), so existing consumers are unaffected. [React Kit]Cardnow consumessemantic.shadow.ambient.{resting,hover}for its resting and hover elevation, replacing the inline custom ambient shadow (the resting value is identical, resolving the long-standingTODO(carto-tokens)) and the priorraised.restinghover (12% → ambient 8%, a softer hover lift). -
#104
11a4c84Thanks @AdamLantz! - [Tokens] AddappShellcomponent tokens:appShell.region.backgroundandappShell.handle.background.hover/appShell.handle.background.pressedfor the resize handle.
Patch Changes
- #112
5604d96Thanks @tounsoo! - [Tokens] Fix the Android (Compose) build failing to compile the generatedCartoTokens.kt. Theeasingcategory emits an enclosingobject Easingwhose name shadowed the unqualifiedEasingtype annotation, so everycubicBezierleaf failed withInitializer type mismatch: expected 'Easing', actual 'CubicBezierEasing'. The Kotlin generator now imports the Compose type aliased asComposeEasing(mirroring the existingComposeColorpattern) and uses it forcubicBezierleaf types.
0.1.2
Minor Changes
-
#59
2b25a96Thanks @tounsoo! - [Tokens] Addbuttoncomponent tokens (primary/secondary/ghostbackgrounds, foregrounds, elevation;font,gap,padding,radius, andfocus) and wireButtonto consume them via thecomponentproxy instead of hard-coded primitives. The button’s icon size consumes the existingicon.size.largetoken directly (no redundantbutton.iconalias) -
#85
69c049cThanks @tounsoo! - [Tokens] Addbutton.dangercomponent tokens (background,foreground,elevation) aliasing the critical semantic surface, and wire theButtondangervariant to consume them via thecomponentproxy instead of readingsemantic.*critical tokens directly -
#77
987b206Thanks @tounsoo! - [Tokens] Add theborder.color.accentsemantic intent (brand-interactive outline for focus rings, active navigation, and selected controls) and restructure the button’s focus tokens into abutton.focus.ringgroup (color→border.color.accent, pluswidthandoffset).Buttonnow consumesbutton.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
fdcc420Thanks @tounsoo! - [PromptBar] AddpromptBarcomponent 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 consumescomponent.promptBar.*instead of referencingsemantic/primitivedirectly. Values map 1:1 from the prior references except the attachment-tile background, which adoptsbackground.color.subtle.resting(neutral.30 → neutral.50) and now follows light/dark. -
#102
3bcff52Thanks @tounsoo! - [Tokens] Adddurationsemantic category — motion durations chosen by the significance of the moment. Five static leaves aliasing the duration primitives:duration.instant({duration.0}),duration.feedback({duration.100}),duration.transition({duration.200}),duration.emphasis({duration.300}),duration.cinematic({duration.400}). Mode-agnostic (no light/dark) andexcludePlatforms: ["figma"], mirroring the primitive tier. -
#106
8cad2e0Thanks @tounsoo! - [Tokens] Addeasingsemantic category — five intent-named cubic-bezier curves (enter,exit,transition,loop,emphasis) that name the character of acceleration across a motion, chosen by behavior rather than a hardcoded bezier. Introduces a newcubicBezier$typewith web (cubic-bezier(...)), Swift ((CGFloat, CGFloat, CGFloat, CGFloat)tuple), and Kotlin (ComposeCubicBezierEasing) transforms. Static, no light/dark,excludePlatforms: ["figma"](Figma has no easing variable type). -
#82
7d8d6b3Thanks @tounsoo! - [Tokens] Adddurationprimitive tokens (0,100,200,300,400ms) for motion timing. Each platform emits its idiomatic form: web emits a CSS<time>literal with the unit always present (100ms, and0mssince CSS requires a unit on zero times), Swift emits seconds as aTimeInterval(100ms→0.1, matchingAnimation(duration:)), and Kotlin emits raw milliseconds as anInt(100ms→100, for Composetween(durationMillis:)) -
#87
9b3dfa8Thanks @tounsoo! - [Tokens] Addborder.color.prominentsemantic token (color.neutral.700) for the maximum-emphasis structural boundary on the single most critical bounded element in a view -
#107
36c2afeThanks @tounsoo! - [Tokens] Addscalesemantic category — transform-scale intents for motion, expressing how far an element departs from its resting size (scale.1000= 1.0). Six staticnumberleaves named by moment:feedback(default press,{scale.950}),feedback-pronounced({scale.900}),enter-quiet({scale.800}),enter(default entrance,{scale.600}),enter-pronounced({scale.500}), andexit({scale.950}). Adds the supportingscaleprimitive scale (scale.100–scale.1000). Both tiers exclude the Figma platform, matchingduration(no bindable scale/transform property in Figma). -
#76
03a0e99Thanks @tounsoo! - [Tokens] Addscrimsemantic color token — a dim layer for blocking overlays (modal, drawer, dialog) that obscures and de-emphasizes content behind the foreground surface. Single static leafscrim.color({color.neutral.800}@ 0.6), dark mirrors light. -
#65
1dd0874Thanks @tounsoo! - [Tokens] Addtooltip.radius,tooltip.padding.inline,tooltip.padding.block, and atooltip.fonttypography composite, and repointtooltip.foreground/tooltip.backgroundto theprominentsemantic intents (foreground.color.on.prominentandbackground.color.prominent.resting) in place of rawcolor.neutralprimitives.Tooltipnow sources its surface (color, radius, padding) and typography from these tokens via thecomponentproxy instead of hard-coded primitives, and renders its content in a plain<span>carryingtooltip.fontrather than a nested<Text>. -
#74
3935c98Thanks @tounsoo! - [Tokens] AdduserMessageandmessageToolbarcomponent tokens, and shiftbackground.color.subtle(resting/hover/pressed) one neutral step darker
Patch Changes
-
#101
9c85f60Thanks @tounsoo! - [Figma sync] Stop silently dropping new token types from validate/sync — onlyexcludePlatforms: ["figma"]opts out; duration primitives explicitly figma-excluded. -
#62
57c6646Thanks @tounsoo! - [Tokens] Fix Compose shadow literal colors emitting unresolvedColor(...)references — they now useComposeColorto match the aliased import in the generated Kotlin file -
#59
2b25a96Thanks @tounsoo! - [Tokens] Fix color tokens withalpha< 1 dropping their transparency in the vanilla-extract output — they now emitrgba()instead of an opaquehex
0.1.1
Minor Changes
- #31
69ef424Thanks @tounsoo! - [Text, Tokens] Convert text tokens to DTCG typography composites; fix broken font-family in Swift build;Textnow spreads composite values for font-family, weight, and line-height
Patch Changes
-
#40
63bee23Thanks @tounsoo! - [Tokens] Sync DTCG$descriptionto Figma variable descriptions -
#43
9b77ac3Thanks @tounsoo! - [Tokens] Fix composite shadow tokens emitting as[object Object]in Swift and Kotlin
0.1.0
Minor Changes
- a3b08e5: [Tokens] Add
components.icon.size.{small,medium,large,xlarge}tokens - 16bc697: [Text, Tokens] Add
components.text.*tokens for headline / body / eyebrow variants - d0ec6be: [Tokens] Add Figma sync pipeline (
figma:validate,figma:sync,figma:auth) - 0638cef: [Tokens] Add initial Style Dictionary pipeline for vanilla-extract, Swift, and Gradle
- c676116: [Tokens] Restructure Swift and Kotlin exports to mirror source token paths (breaking for mobile consumers)
- b6292cc: [Tokens] Add
tooltip.foregroundandtooltip.backgroundcolor tokens - 48de98e: [Tokens] Align
sizeandradiusprimitive scales to 100s notation (values unchanged) - 8178a7d: [Tokens] Add semantic token layer (background, foreground, border, radius, shadow, spacing, typography) with unified
{ref, alpha}color shape - 1c2ea19: [Tokens] Singularize vanilla-extract tier names (
primitives/components→primitive/component; deprecated aliases remain for one release) - 128f12e: [Tokens] Add font and stroke-style primitives, rebase radius to 4px steps, extend Figma sync coverage, and add
preservePxForWebextension - 974616f: [Tokens] Split vanilla-extract output into three tier-scoped
createThemelayers with alias-preserving CSS variables (breaking: removed aggregatetokensexport and single-callcartoThemeClass)
Patch Changes
- 2578aea: [Tokens] Publish Android
com.servicetitan:carto-tokensto Azure DevOps Maven feed on release - b6292cc: [Tokens] Conform tooltip and text component tokens to component-token authoring conventions
- 5aa7870: [Tokens] Add GitHub Action for Figma sync (validate on PR, dry-run on main, manual sync with Slack notification)
- 04c22a3: [Tokens] Make Figma variable scopes explicit at the group level for base, color, button, and background token files
- 2e9073b: [Tokens] Fix Figma sync idempotency by normalizing
FONT_STYLE↔FONT_WEIGHTin scope diff