Skip to content

Releases

Version history for both Specs packages. Each release follows Semantic Versioning.

[0.24.0] - 2026-06-05

Introduces the transformer pipeline’s schema foundation. Config.transformers (a flat TransformEntry[]) replaces the old two-level config.transform.transformers wrapper, and a new workspace.schema.json provides IDE validation for specs.config.yaml. Config.processing.states adds a concept-keyed map that classifies Figma variant props as browser-driven or consumer-controlled states, enabling the css transformer to emit semantic CSS selectors and the contract transformer to omit browser-driven props from Props interfaces.

Added

  • TransformEntry type (ADR-053){ name: string; [option: string]: unknown }. Describes a single transformer entry in config.transformers. Transformer-specific options sit inline alongside name.

  • workspace.schema.json (ADR-054) — New top-level JSON schema file for the workspace config file (specs.config.yaml). Defines the full workspace shape including dataDirectory, outputDirectory, sources, output, author, and the config block (which embeds the component Config schema). Config.transformers is defined here rather than in the component schema, keeping transform configuration CLI-only and out of the per-component spec.

  • Config.transformersTransformEntry[] directly on Config — Replaces the two-level config.transform.transformers shape. The wrapper object is gone; config.transformers is the array. Absence means CLI defaults apply.

  • VariantStateEntry type (ADR-055) — classifies a Figma variant prop as a semantic state concept; fields: prop (string, required), value (string, optional — the Figma enum value activating the concept; defaults to "true" for boolean props), contract ('omit' | 'keep', optional — overrides the concept’s canonical default)

  • Config.processing.statesRecord<string, VariantStateEntry> — concept-keyed map (key = concept name, e.g. hover, disabled); classifies variant props for deterministic use by CSS and contract transformers; absence means all props emit as data-* attribute selectors and all props are retained in contracts

Changed

  • Config.transform removed; replaced by Config.transformers — The intermediate TransformConfig wrapper object is eliminated. transform.transformers collapses to transformers directly on Config/ResolvedConfig.

Removed

[0.23.0] - Unreleased

Added

Changed

Removed

[0.22.0] - 2026-05-23

Introduces the composition and slot-content model across ADRs 042, 046–052. Composition is a named registry entry with a top-level anatomy + elements + layout triplet and an optional slotContent map of bundled SlotContent fills. SlotContentRef ({ $slotContent }) is the universal pointer for all slot fills — component-scoped examples, intra-composition bundled fills, and cross-composition references all resolve to anatomy + elements + layout. PropConfigurations widens to accept PropBinding and SlotContentRef; InstanceExample.propConfigurations widens to accept SlotContentRef (not PropBinding). Children widens to SlotBinding for slot-bound containers. Config gains the examples-detection settings and output gates (ADR-050).

Added

  • SlotContent{ anatomy, elements, layout }; the anonymous structural triplet used as a named slot fill. Carries no metadata; identity lives at the key where it is stored (ADR-046)
  • Composition{ title?, description?, anatomy, elements, layout, slotContent?: Record<string, SlotContent> }; a named registry entry whose top-level triplet is the primary content. Optional slotContent bundles named fills alongside it for authoring convenience (ADR-042, ADR-046)
  • CompositionsRecord<string, Composition>; registry alias for external composition files
  • SlotContentRef{ $slotContent: string }; universal JSON Pointer reference for slot fills. Resolves to a Composition entry (top-level triplet), a Composition.slotContent entry, or a Component.slotContentExamples entry — all yield anatomy + elements + layout (ADR-046)
  • Component.slotContentExamplesRecord<string, SlotContent>; named slot-content examples per component, referenceable by SlotContentRef from SlotBinding.examples and from Element.propConfigurations slot-prop entries. specs-from-figma de-duplicates entries by structural equality across variants and slots (ADR-047)
  • SlotBinding — extends PropBinding with optional examples?: SlotContentRef[]; used in Element.children for slot-bound containers. Each examples[i] points to a slot-content entry; emitters currently write a single entry at index 0 — Figma’s authoring default for the slot layer. Non-contractual reference material; code consumers handle missing slots through component logic and ignore it (ADR-047)
  • Component.instanceExamples — typed as InstanceExamples (Record<string, InstanceExample>); named documented usages per component (ADR-048)
  • InstanceExample{ title?, propConfigurations?: Record<string, string | number | boolean | SlotContentRef> }; scalar props set directly, slot props filled via SlotContentRef. PropBinding not accepted — documented configurations are not live bindings (ADR-048)
  • Config.processing.instanceExamples{ scope?: 'PAGE' | 'FILE', match?: string[], exclude?: string[], parentNames?: string[] }; instance-example detection settings, mirroring processing.subcomponents. scope is PAGE | FILE (NESTED is inapplicable); match is an optional secondary name filter (the primary relevance test is structural identity — the candidate is an instance of the component being generated — so absence accepts every in-scope instance, subject to exclude/parentNames); parentNames filters candidates by immediate-parent frame/section name. Absence of the block is the off-switch — its presence enables both detection and output (no separate include flag), like processing.subcomponents. Pro-gated. Added to ResolvedConfig (with scope required, match optional) (ADR-050)
  • Config.include.defaultSlotContentboolean output gate, default false; added to ResolvedConfig (required) and DEFAULT_CONFIG. Pro-gated — ignored on the free tier (ADR-050)
  • Config.format.tokens — adds FIGMA_SYNTAX_WEB, FIGMA_SYNTAX_IOS, FIGMA_SYNTAX_ANDROID profiles emitting per-platform Figma code syntax, falling back to TOKEN (ADR-051)

Changed

  • Children — widened from string[] | PropBinding to string[] | SlotBinding; existing { $binding } values still validate because SlotBinding is a structural superset of PropBinding (ADR-047)
  • PropConfigurations — value union widened from string | number | boolean to string | number | boolean | PropBinding | SlotContentRef; enables scalar prop pass-through (PropBinding) and slot-prop fills (SlotContentRef). InstanceExample.propConfigurations widens separately and does not accept PropBinding (ADR-049)
  • PropConfigurations.$nested — added reserved key typed as NestedPropConfiguration[] ({ path: string[] } plus the prop-config payload, keyed value PropConfigurationValue); path-addressed configurations of nested descendant instances, where path is a list of instanceOf element keys to the configured descendant and the terminal instance owns the filled slot/prop. Deep slot fills reuse SlotContentRef — no new payload, no Element change. InstanceExample.propConfigurations does not gain $nested (ADR-052)

Removed

[0.21.0] - 2026-05-22

Extends Config.format.tokens with per-platform Figma code syntax profiles. The new FIGMA_SYNTAX_WEB, FIGMA_SYNTAX_IOS, and FIGMA_SYNTAX_ANDROID options emit the platform-specific code syntax authored on Figma variables, falling back to the resolved TOKEN reference when no syntax is defined.

Added

  • Config.format.tokens — adds FIGMA_SYNTAX_WEB, FIGMA_SYNTAX_IOS, FIGMA_SYNTAX_ANDROID profiles emitting per-platform Figma code syntax, falling back to TOKEN

[0.20.0] - 2026-05-06

Adds configurable color output format (Config.format.color) supporting nine format options from hex strings to structured DTCG Color objects. Renames ColorValue to ColorObject for specificity and widens ColorStyle, Shadow.color, and GradientStop.color to accept formatted color strings alongside structured objects and token references.

Added

  • Config.format.color — typed as ColorFormat ('HEX' | 'HEXA' | 'RGB' | 'RGBA' | 'HSLA' | 'HSB' | 'OKLCH' | 'OKLAB' | 'OBJECT'); controls color value output format; defaults to HEX

Changed

  • ColorObject — renamed from ColorValue for specificity; the type represents a DTCG Color §4.1 structured object, not a generic “color value”
  • ColorStyle — widened to string | ColorObject | TokenReference | GradientValue | null; the string arm supports formatted color strings when Config.format.color is non-OBJECT
  • Shadow.color — widened to string | ColorObject | TokenReference; same string arm rationale as ColorStyle
  • GradientStop.color — widened to string | ColorObject | TokenReference; same string arm rationale as ColorStyle

[0.19.0] - 2026-04-28

Replaces Figma-raw x, y, and layoutPositioning with constraint-based positioning properties. position replaces layoutPositioning as a strict Position enum. Directional offsets (top, bottom, start, end, centerHorizontalOffset, centerVerticalOffset) replace x/y with anchor semantics derived from Figma constraints. See the Layout Positioning guide for constraint mapping rules and platform usage examples.

Added

  • Styles.position — typed as Position ('AUTO' | 'ABSOLUTE') or null; structural property, not token-bindable (replaces layoutPositioning)
  • Styles.top — typed as PositionOffset (number | string | null); block-start offset from vertical MIN, STRETCH, or SCALE constraint
  • Styles.bottom — typed as PositionOffset; block-end offset from vertical MAX or STRETCH constraint
  • Styles.start — typed as PositionOffset; inline-start offset from horizontal MIN, STRETCH, or SCALE constraint
  • Styles.end — typed as PositionOffset; inline-end offset from horizontal MAX or STRETCH constraint
  • Styles.centerHorizontalOffset — typed as PositionOffset; horizontal offset from center (CENTER constraint)
  • Styles.centerVerticalOffset — typed as PositionOffset; vertical offset from center (CENTER constraint)

Removed

  • Styles.x — replaced by Styles.start, Styles.end, or Styles.centerHorizontalOffset depending on constraint
  • Styles.y — replaced by Styles.top, Styles.bottom, or Styles.centerVerticalOffset depending on constraint
  • Styles.layoutPositioning — replaced by Styles.position

Migration

  • Styles.xStyles.start / Styles.end / Styles.centerHorizontalOffset: determine which property to read based on the node’s horizontal constraint; SCALE values are percentage strings (e.g. "25%")
  • Styles.yStyles.top / Styles.bottom / Styles.centerVerticalOffset: same constraint-based mapping for the vertical axis
  • Styles.layoutPositioningStyles.position: rename and narrow type — replace generic Style handling with exhaustive match on 'AUTO' | 'ABSOLUTE'

[0.18.0] - 2026-04-24

Replaces Figma-native layout property names with semantic equivalents for auto-layout alignment and wrapping. Introduces a bi-axial itemSpacing model that consolidates counterAxisSpacing into a single property, and narrows layoutMode from a generic Style to a strict enum. Five renamed alignment/wrap fields use plain-language names (mainAxisAlignment, crossAxisAlignment, wrapAlignment, wrap) instead of Figma axis terminology. The documentation site was considerably rearchitected with updated content and navigation.

Added

  • Styles.itemSpacing — widened from Style to Style | ItemSpacing (scalar when uniform, ItemSpacing object with horizontal/vertical when axes differ)
  • Styles.wrap — boolean toggle for auto-layout wrapping (replaces layoutWrap)
  • Styles.wrapAlignment — typed as WrapAlignment ('START' | 'SPACE_BETWEEN') or null; structural property, not token-bindable (replaces counterAxisAlignContent)
  • Styles.mainAxisAlignment — typed as MainAxisAlignment ('START' | 'END' | 'CENTER' | 'SPACE_BETWEEN') or null; structural property, not token-bindable (replaces primaryAxisAlignItems)
  • Styles.crossAxisAlignment — typed as CrossAxisAlignment ('START' | 'END' | 'CENTER' | 'STRETCH' | 'BASELINE') or null; structural property, not token-bindable (replaces counterAxisAlignItems)

Changed

  • Styles.layoutMode — narrowed from Style to LayoutMode ('NONE' | 'HORIZONTAL' | 'VERTICAL') or null; enum constraint, no TokenReference

Removed

  • Styles.counterAxisSpacing — consolidated into Styles.itemSpacing bi-axial model
  • Styles.layoutWrap — replaced by Styles.wrap
  • Styles.counterAxisAlignContent — replaced by Styles.wrapAlignment
  • Styles.primaryAxisAlignItems — replaced by Styles.mainAxisAlignment
  • Styles.counterAxisAlignItems — replaced by Styles.crossAxisAlignment

Migration

  • Styles.counterAxisSpacingStyles.itemSpacing.vertical: read the vertical sub-field of the ItemSpacing object when axes differ; scalar itemSpacing applies uniformly
  • Styles.layoutModeLayoutMode | null: replace generic Style handling with exhaustive match on 'NONE' | 'HORIZONTAL' | 'VERTICAL'
  • Styles.layoutWrapStyles.wrap: rename only; same boolean semantics
  • Styles.counterAxisAlignContentStyles.wrapAlignment: rename and remap values — 'AUTO''START', 'SPACE_BETWEEN''SPACE_BETWEEN'
  • Styles.primaryAxisAlignItemsStyles.mainAxisAlignment: rename and narrow type — replace generic Style handling with exhaustive match on 'START' | 'END' | 'CENTER' | 'SPACE_BETWEEN'; remap Figma values 'MIN''START', 'MAX''END'
  • Styles.counterAxisAlignItemsStyles.crossAxisAlignment: rename and narrow type — replace generic Style handling with exhaustive match on 'START' | 'END' | 'CENTER' | 'STRETCH' | 'BASELINE'; remap Figma values 'MIN''START', 'MAX''END'

[0.17.0] - 2026-04-13

Introduces ResolvedConfig as the fully-resolved counterpart to Config, where every property with a default is guaranteed present. Config properties with defaults are now optional, making input configs more tolerant of omissions. Removes the unused Variant.name and Variant.baseline fields.

Added

  • ResolvedConfig — fully-resolved config type where every property with a default is required; only true feature toggles (subcomponents, glyphNamePattern, codeOnlyPropsPattern) remain optional

Changed

  • Config — all properties with defaults are now optional (input type tolerant of omissions):
    • processing.variantDepth — optional; defaults to 9999
    • processing.details — optional; defaults to LAYERED
    • format.output — optional; defaults to JSON
    • format.keys — optional; defaults to SAFE
    • format.layout — optional; defaults to LAYOUT
  • ResolvedConfig — all properties with defaults are required (post-merge guarantee):
    • processing.slotConstraints — required (default false)
    • processing.inferNumberProps — required (default false)
    • format.tokens — required (default TOKEN)
    • include.invalidVariants — required (default false)
    • include.invalidCombinations — required (default true)
    • include.emptyVariants — required (default false)
    • subcomponents.scope — required when subcomponents is present (default NESTED)
  • DEFAULT_CONFIG — typed as ResolvedConfig; now explicitly includes slotConstraints: false, inferNumberProps: false; removed subcomponents (feature toggle — off by default, matching the Figma plugin)

Removed

  • Variant.name — unused optional label; variant identity is fully described by configuration
  • Variant.baseline — never populated in output; baseline determination is an internal processing concern

Migration

  • Variant.name → removed: delete any references; use Variant.configuration to identify variants
  • Variant.baseline → removed: delete any references; no replacement needed (field was never populated)

[0.16.0] - 2026-04-05

Adds Config.include.emptyVariants for controlling inclusion of layered variants with no elements. Makes invalidVariants and invalidCombinations optional with sensible defaults, and removes the unused variantNames field.

Added

  • Config.include.emptyVariants — optional boolean to control inclusion of layered variants that contain no elements; defaults to false

Changed

  • Config.include.invalidVariants — now optional; defaults to false when absent
  • Config.include.invalidCombinations — now optional; defaults to true when absent

Removed

  • Config.include.variantNames — unused field removed from the API

Migration

  • Config.include.variantNames → removed: delete any references to this field from config construction code; regenerate cached specs to remove the field from serialized output

[0.15.0] - 2026-03-25

Adds structured subcomponent discovery via a new Config.processing.subcomponents object with scope, match, and exclude settings, replacing the flat subcomponentNamePattern string. Introduces SubcomponentRef for referencing subcomponent definitions and widens instanceOf on both AnatomyElement and Element to accept it. Corrects Typography field types for leadingTrim, fontFamily, and fontStyle to match actual Figma API values.

Added

  • SubcomponentRef — reference to a subcomponent definition via { $ref: "#/subcomponents/{key}" }
  • AnatomyElement.instanceOf — widened to accept string | SubcomponentRef
  • Element.instanceOf — widened to accept string | PropBinding | SubcomponentRef
  • Config.processing.subcomponents — optional nested object grouping subcomponent discovery settings: scope, match, and exclude. Absence means no subcomponent detection
  • Config.processing.subcomponents.scope — optional enum (NESTED | PAGE) controlling where the transformer searches for subcomponents
  • Config.processing.subcomponents.match — required array of {C}/{S} template patterns defining which assets are subcomponents
  • Config.processing.subcomponents.exclude — optional array of {C}/{S} template patterns defining which matched assets to exclude

Changed

  • Typography.leadingTrim — corrected from number | 'mixed' | TokenReference to 'NONE' | 'CAP_HEIGHT' | 'mixed' per Figma API
  • Typography.fontFamily — corrected from string | number | 'mixed' to string | 'mixed' | TokenReference; removed impossible number, added TokenReference for variable-bound fonts
  • Typography.fontStyle — corrected from string | number | 'mixed' to string | 'mixed' | TokenReference; removed impossible number, added TokenReference for variable-bound fonts

Removed

  • Config.processing.subcomponentNamePattern — replaced by Config.processing.subcomponents.match
  • Config.include.subcomponents — subcomponent inclusion is now implied by the presence of match patterns

Migration

  • Config.processing.subcomponentNamePatternConfig.processing.subcomponents.match: wrap the single pattern string in a one-element array
  • Config.include.subcomponents → removed: remove the field; subcomponents are included when processing.subcomponents is defined with match patterns. Omit processing.subcomponents entirely to disable detection

[0.14.0] - 2026-03-18

Introduces code-only props support with FigmaCodeOnlySource provenance metadata and a configurable container-layer naming pattern, plus a new NumberProp type for numeric property values. Adds DTCG-aligned $extensions for platform-specific metadata across all prop types, replacing the prior x-platform convention on BooleanProp. Expands SlotProp with minItems, maxItems, and anyOf constraints consolidatable via the new slotConstraints processing flag.

Added

  • FigmaCodeOnlySource — provenance metadata for props extracted from a Figma code-only container layer (kind, layer, instanceOf?)
  • FigmaPropExtension.source — optional FigmaCodeOnlySource on the Figma extension, present only for code-only props
  • Config.processing.codeOnlyPropsPattern — optional naming pattern for detecting the code-only props container layer
  • Config.processing.inferNumberProps — opt-in flag to infer NumberProp from TEXT code-only props
  • NumberProp — numeric property type for number-valued component props
  • AnyPropNumberProp added as a fifth union member (type: 'number')
  • FigmaPropExtension — Figma-specific metadata for prop definitions (native prop type)
  • PropExtensions — DTCG §5.2.3 platform-specific extensions container, keyed by reverse-domain notation
  • BooleanProp.$extensions — optional platform metadata on boolean props
  • StringProp.$extensions — optional platform metadata on string props
  • EnumProp.$extensions — optional platform metadata on enum props
  • SlotProp.$extensions — optional platform metadata on slot props
  • SlotProp.minItems — minimum number of items the slot accepts
  • SlotProp.maxItems — maximum number of items the slot accepts
  • SlotProp.anyOf — component type names permitted in the slot
  • Config.processing.slotConstraints — opt-in flag to consolidate slot constraint code-only props into slot properties

Changed

  • BooleanPropx-platform replaced by $extensions to align with DTCG convention used on TokenReference

[0.13.0] - 2026-03-13

Added

  • Metadata.schema.latest — optional stable URL pointing to the latest schema on main for discovery
  • Metadata.generator.license — optional resolved license state: status and level nested inside generator
  • Styles.fillColor — glyph fill color for GLYPH element type
  • StringProp.examples — sample values demonstrating typical content for string props
  • Element.content — unified content for text strings and glyph names
  • SlotProp.nullable — optional flag indicating the slot prop accepts null
  • Conditional — conditional binding with if/condition/then/else for derived values
  • ConditionExpression — declarative condition pairing an operation (string) with args
  • ConditionArgs — condition arguments: value (PropBinding) and optional compareTo

Changed

  • SlotProp.default — now optional; omitted when no meaningful default exists
  • ColorStyleValue — accepts bare hex strings (e.g. #666E74) matching the existing ColorStyle type
  • BooleanProp, StringProp, EnumProp, SlotProp — allow $-prefixed metadata fields via patternProperties
  • Metadata.schema.url — clarified as versioned schema URL pinned to a git tag
  • ElementType'icon' renamed to 'glyph' to distinguish raw visual assets from composed Icon components
  • Config.processing.iconNamePatternConfig.processing.glyphNamePattern — glyph detection pattern
  • StringProp.default — now optional; use examples for demo content
  • StringProp.default — widened to string | null for nullable props
  • SlotProp.default — widened to string | null for nullable slot props
  • BindingKey'text' replaced by 'content'

Removed

  • TextProp — merged into StringProp
  • IconProp — merged into StringProp
  • Element.text — use Element.content instead

Migration

  • TextProp / IconPropStringProp: replace all type imports and references with StringProp; the shape is identical
  • Element.textElement.content: read element content from content instead of text; applies to both text strings and glyph names
  • ElementType 'icon''glyph': update all references to the 'icon' literal in element type checks
  • Config.processing.iconNamePatternConfig.processing.glyphNamePattern: update config objects and any code referencing this field

[0.12.0] - 2026-03-05

Added

  • ElementTypeRef — reference to an external element type definition via $ref URI
  • Config.processing.iconNamePattern — optional naming pattern for detecting icon content assets
  • Sides — per-side composite object with logical directions: top, end, bottom, start
  • Corners — per-corner composite object with logical directions: topStart, topEnd, bottomEnd, bottomStart
  • Styles.padding — scalar when uniform, Sides object when per-side values differ

Changed

  • AnatomyElement.type — widened from string to string | ElementTypeRef
  • Styles.strokeWeight — accepts Style | Sides instead of Style; scalar when uniform, Sides object when per-side values differ
  • Styles.cornerRadius — accepts Style | Corners instead of Style; scalar when uniform, Corners object when per-corner values differ

Removed

  • Styles.paddingLeft — use Styles.padding with Sides.start instead
  • Styles.paddingRight — use Styles.padding with Sides.end instead
  • Styles.paddingTop — use Styles.padding with Sides.top instead
  • Styles.paddingBottom — use Styles.padding with Sides.bottom instead
  • Styles.strokeTopWeight — use Styles.strokeWeight with Sides.top instead
  • Styles.strokeBottomWeight — use Styles.strokeWeight with Sides.bottom instead
  • Styles.strokeLeftWeight — use Styles.strokeWeight with Sides.start instead
  • Styles.strokeRightWeight — use Styles.strokeWeight with Sides.end instead
  • Styles.topLeftRadius — use Styles.cornerRadius with Corners.topStart instead
  • Styles.topRightRadius — use Styles.cornerRadius with Corners.topEnd instead
  • Styles.bottomLeftRadius — use Styles.cornerRadius with Corners.bottomStart instead
  • Styles.bottomRightRadius — use Styles.cornerRadius with Corners.bottomEnd instead

Migration

  • Styles.paddingLeft / paddingRight / paddingTop / paddingBottomStyles.padding: when all sides are equal, read padding as a number; when sides differ, read padding as a Sides object with top, end, bottom, start using logical directions (start = left in LTR)
  • Styles.strokeTopWeight / strokeBottomWeight / strokeLeftWeight / strokeRightWeightStyles.strokeWeight: same scalar-or-Sides pattern; individual per-side stroke weights now live under Sides.top, Sides.end, Sides.bottom, Sides.start
  • Styles.topLeftRadius / topRightRadius / bottomLeftRadius / bottomRightRadiusStyles.cornerRadius: same scalar-or-Corners pattern; per-corner values use Corners.topStart, Corners.topEnd, Corners.bottomEnd, Corners.bottomStart

[0.11.0] - 2026-03-04

Added

  • PropBinding — component-prop binding type; discriminated by $binding key; replaces ReferenceValue
  • TokenReference — unified DTCG-aligned token reference; replaces VariableStyle and FigmaStyle; $token and $type are the complete platform-facing API
  • TokenReference.$token — DTCG dot-separated token path, usable directly as a DTCG alias
  • TokenReference.$type — DTCG token type discriminator: color, dimension, string, number, boolean, shadow, gradient, typography, effects
  • TokenReference.$extensions["com.figma"] — optional Figma extraction metadata: id, name, collectionName, rawValue
  • Styles.typography — composite typography; value is TokenReference, Typography, or omitted
  • Typography — 13 optional inline text properties: fontSize, fontFamily, fontStyle, lineHeight, letterSpacing, textCase, textDecoration, paragraphIndent, paragraphSpacing, leadingTrim, listSpacing, hangingPunctuation, hangingList
  • Styles.aspectRatio — aspect ratio constraint; AspectRatioValue pair or null when unconstrained
  • AspectRatioValue — required x (numerator) and y (denominator) number fields
  • AspectRatioStyle — type alias AspectRatioValue | null
  • Config.format.tokens — token reference serialization profile; five options: TOKEN (default, $token + $type), TOKEN_NAME (dot-delimited path string only), TOKEN_FIGMA_EXTENSIONS ($token + $type + $extensions["com.figma"]), FIGMA_NAME (slash-delimited path string only), CUSTOM (same as TOKEN, signals custom post-processing)
  • Metadata.license? — optional { status: string; description: string } field
  • styles.textColor — style key for text colour
  • styles.cornerSmoothing — style key for corner smoothing (Figma squircle factor)
  • styles.effects — style key replacing effectStyleId; TokenReference or inline Effects
  • Shadow — fields: visible, inset?, offsetX, offsetY, blur, spread, color
  • Blur — fields: visible, radius
  • Effects — fields: shadows?, layerBlur?, backgroundBlur?
  • GradientStop — fields: position (0–1), color
  • GradientCenter — fields: x, y (0–1)
  • LinearGradient — discriminated by type: 'LINEAR'; fields: angle, stops
  • RadialGradient — discriminated by type: 'RADIAL'; fields: center, stops
  • AngularGradient — discriminated by type: 'ANGULAR'; fields: center, stops
  • GradientValue — discriminated union LinearGradient | RadialGradient | AngularGradient

Changed

  • Element.instanceOf — accepts string | PropBinding; bound form is { $binding: "#/props/..." }
  • Element.text — accepts string | PropBinding; bound form is { $binding: "#/props/..." }
  • StylePropBinding replaces ReferenceValue; TokenReference replaces VariableStyle and FigmaStyle
  • Config.formatvariables, simplifyVariables, and simplifyStyles replaced by single tokens field; token output shape is now controlled entirely by the tokens profile
  • Styles.backgroundColor — narrowed to ColorStyle; inline gradients representable
  • Styles.textColor — narrowed to ColorStyle; inline gradients representable
  • Styles.strokes — narrowed to ColorStyle; inline gradients representable
  • styles.fills renamed to styles.backgroundColor

Removed

  • Config.format.variables — removed; use Config.format.tokens instead
  • Config.format.simplifyVariables — removed; use Config.format.tokens profile instead
  • Config.format.simplifyStyles — removed; use Config.format.tokens profile instead
  • ReferenceValue — removed; use PropBinding instead
  • isReferenceValue — removed; no replacement; prop-binding guards are upstream consumer responsibility
  • VariableStyle — removed; use TokenReference instead
  • FigmaStyle — removed; use TokenReference instead
  • Styles.fontSize — removed; use typography.fontSize instead
  • Styles.fontFamily — removed; use typography.fontFamily instead
  • Styles.fontStyle — removed; use typography.fontStyle instead
  • Styles.lineHeight — removed; use typography.lineHeight instead
  • Styles.letterSpacing — removed; use typography.letterSpacing instead
  • Styles.textCase — removed; use typography.textCase instead
  • Styles.textDecoration — removed; use typography.textDecoration instead
  • Styles.paragraphIndent — removed; use typography.paragraphIndent instead
  • Styles.paragraphSpacing — removed; use typography.paragraphSpacing instead
  • Styles.leadingTrim — removed; use typography.leadingTrim instead
  • Styles.listSpacing — removed; use typography.listSpacing instead
  • Styles.hangingPunctuation — removed; use typography.hangingPunctuation instead
  • Styles.hangingList — removed; use typography.hangingList instead
  • Styles.textStyleId — removed; use typography with a TokenReference instead
  • styles.effectStyleId — removed with no deprecation period; consumers must migrate to styles.effects

Migration

  • config.format.variables / simplifyVariables / simplifyStylesconfig.format.tokens: set tokens to a profile — TOKEN (default) for $token + $type; TOKEN_NAME for dot-delimited string; TOKEN_FIGMA_EXTENSIONS for full object with Figma metadata; FIGMA_NAME for slash-delimited string; CUSTOM for custom post-processing
  • Element.instanceOfElement.instanceOf: replace { $ref: "#/props/..." } with { $binding: "#/props/..." }; update any isReferenceValue guards to narrow against $binding directly
  • Element.textElement.text: same key rename from $ref to $binding
  • Styles.visibleStyles.visible: same key rename from $ref to $binding
  • VariableStyleTokenReference: replace { id, variableName, collectionName } with { $token: "<Collection>.<name>", $type: "<type>", $extensions: { "com.figma": { id, name, collectionName } } }; read token path from $token and token category from $type
  • FigmaStyleTokenReference: replace { id, name } with { $token: "<dot.path>", $type: "typography" | "effects" | ... } and move the Figma UUID to $extensions["com.figma"].id
  • Styles.<typographyProperty>Styles.typography.<property>: all 14 flat typography properties replaced with single composite typography field; when typography is a TokenReference, read $token for the style path; when typography is a Typography object, read individual fields
  • fillsbackgroundColor: any consumer reading component.styles.fills must update to component.styles.backgroundColor
  • effectStyleIdeffects: any consumer reading styles.effectStyleId must update to styles.effects; when effects is a TokenReference, read $token and $type; when effects is an Effects, read from shadows, layerBlur, or backgroundBlur by role

[0.9.0] - 2026-02-12

Added

  • DEFAULT_CONFIG - Default configuration constant for transformer setup
    • Provides sensible defaults for all Config fields
    • Ensures consistent behavior across CLI, MCP, and Plugin environments
    • Co-located with Config type definition for easy maintenance

[0.10.0] - 2026-02-16

Added

  • Runtime JS build - Compile TypeScript types to dist/index.js for ESM consumers
    • Enables ESM runtime imports without loading .ts files
    • Keeps type definitions in types/ for TypeScript tooling

[0.8.0] - 2026-02-10

Added

  • TypeScript type definitions (types/ package): Complete type definitions for all schema entities
    • Core types: Component, Anatomy, Props, Variant, Metadata, Config, Styles, Element, Layout
    • Property types with proper discriminators: BooleanProp, TextProp, IconProp, EnumProp, SlotProp
    • Style types supporting all 59 properties with specific value types
    • Reference value types for prop bindings and style references

Changed

  • Component.metadata - Now optional to support components without full metadata
  • Variant.layout - Changed from single LayoutNode to array of LayoutNode for proper hierarchical representation
  • Props type values - TextProp, IconProp, and EnumProp now use type: 'string' with discriminators (matching schema)
  • Style properties - Changed from generic Record<string, Style> to specific Partial interface with all 59 style properties
  • VariableStyle - Now includes all properties from schema: id (required), rawValue, name, variableName, collectionName, collectionId (all optional)
  • FigmaStyle - Simplified to match schema: id (required), name (optional)

Fixed

  • SlotProp.default - Now accepts both null and string types
  • TextProp/IconProp nullable - Made nullable field optional (was incorrectly required)
  • Metadata.source - Added missing nodeType field with enum: COMPONENT | COMPONENT_SET | FRAME
  • Metadata.config - Added complete Config definition with processing, format, and include options
  • StyleKey type - Expanded from incomplete list to all 59 valid style properties matching schema

[0.7.0]

Changed

  • Added distinct anatomy types for line, ellipse, star, polygon and rectange, all which were previously vector
  • Removed autodetecion of icon assets based on isAsset plugin since this function is unavailable in the REST API

[0.6.0] - 2026-01-27

Added

  • Styles schema: New styles.schema.json providing complete validation for style properties

    • Defines 60+ style properties (fills, opacity, cornerRadius, fontSize, etc.)
    • Type-specific validation for each property based on Style processor classes
    • Supports all style value types: primitives, variables, Figma styles, and prop bindings
    • Documents which value shapes depend on config.format settings (simplifyVariables, simplifyStyles)
  • Style value types: Precise type definitions for style property values

    • NumberStyleValue: number | VariableStyle | null
    • BooleanStyleValue: boolean | VariableStyle | null
    • BooleanBindableStyleValue: boolean | VariableStyle | ReferenceValue | null (for visible only)
    • ColorStyleValue: string | VariableStyle | FigmaStyle | null
    • StringStyleValue: string | VariableStyle | null
    • MixedNumberStyleValue: number | “mixed” | VariableStyle | null
    • MixedStringStyleValue: string | VariableStyle | null
    • StrokeStyleValue: number | “mixed” | VariableStyle | null
    • CornerStyleValue: number | “mixed” | VariableStyle | null
    • FontStyleValue: string | number | “mixed” | null
    • LineHeightStyleValue: string | number | VariableStyle | null
    • StyleIdValue: string | FigmaStyle | null
  • Styles reference documentation: New reference/styles.yaml providing human-readable documentation

    • Maps style properties to their applicable element types (COMPONENT, FRAME, TEXT, etc.)
    • Documents style processing categories from RAW_STYLES_LOOKUP
    • Lists all 60+ style properties with descriptions and value types
    • Generated from StyleKeys.ts and RawStyles.ts constants

Changed

  • VariableStyle definition: Removed internal-only rawValue property

    • Only includes properties emitted by Style.data(): id, name, variableName, collectionName, collectionId
    • rawValue is used internally for rendering but never serialized
  • FigmaStyle definition: Improved descriptions

    • Documents simplified vs full object output based on config.format.simplifyStyles
  • Styles property: Now references styles.schema.json#/definitions/Styles

    • Replaces generic additionalProperties: Style with precise property-level validation
    • Each style property validates against its specific value type union

[0.5.0] - 2025-12-29

Added

  • Instance of attribute: Added optional instanceOf property to element definitions

    • Indicates the component or component set name that an instance element references
    • Only present for instance elements (Figma INSTANCE nodes)
    • Shows ComponentSet name for variant instances, or Component name for standalone instances
    • Also added to anatomy element definitions
  • Text property: Added optional text property to element definitions

    • Contains the text content for text elements
    • Can be a string value or a ReferenceValue when bound to a text prop
  • Unified property bindings: Property bindings now appear as $ref values on their natural properties

    • children can now be a ReferenceValue (for slot content bindings)
    • instanceOf can now be a ReferenceValue (for instance swap bindings)
    • visible style can now be a ReferenceValue (for boolean prop bindings)
    • text can be a ReferenceValue (for text prop bindings)
    • Added ReferenceValue definition with $ref JSON pointer to props

Removed

  • propBindings section: Removed separate propBindings property from elements
    • Bindings are now represented directly on their target properties using $ref

[0.4.0] - 2025-12-27

Added

  • Layout structure: Added optional layout property to variant definitions that provides hierarchical element structure as a nested tree
    • Layout represents element nesting relationships in a recursive format
    • Leaf nodes are strings (element names)
    • Parent nodes are objects with element name as key and children array as value
    • Example: { "parentElement": ["childA", { "childB": ["grandchild"] }] }

Changed

  • Schema now supports both structure representations:
    • New: layout at variant level (hierarchical tree)
    • Existing: parent and children properties in each element (maintained for backward compatibility)

Deprecated

  • included property has been removed from element definitions
    • Element inclusion is now determined by presence in the layout tree
    • Elements not present in layout are considered excluded from that variant

[0.3.0] - Previous release