Skip to content
SproutAceve · v3.12.1
Get started
Overview What is your role? Getting started Install Adopting Sprout
Foundations
Brand & logos Color Typography Spacing & layout Elevation Iconography Accessibility
Components
Overview Buttons Inputs & forms Data grid Ribbon toolbar Navigation Cards Dialog Tabs Context menu
Practice
Interaction & motion Voice & content Product patterns AI patterns
People & ethics
Design principles Personas UX ethics Trust & direction Meet the makers UX Strategi
Playground
Build the systemplay Tower of tokensplay
Behind the system
How it works Why it pays Changelogv3.12 Roadmap Contribute
Behind the system

From Figma to every Aceve screen.

Sprout is one source of truth for design decisions. Here's the journey a token takes from a designer's Figma file to running code on aceve.design — and what your role is along the way.

The flow

Every token lives in five places. Hover any stage for who edits it.

Main Sprout file
Figma Enterprise library
Designer
Webhook relay
aceve.design/api/figma-webhook
Auto
sprout-tokens CI
GitLab pipeline
Engineer review
@aceve/sprout-tokens
Package Registry
Auto-versioning
Every product
React · iOS · Android · Angular
Renovate / npm update
  • Main Sprout fileDesigner publishes library → fires LIBRARY_PUBLISH webhook automatically.
  • Webhook relayVercel edge function receives the Figma event and triggers the GitLab pipeline.
  • sprout-tokens CIsync:icons + sync:figma pull the latest from Figma, then Style Dictionary builds all output formats.
  • @aceve/sprout-tokensCSS, Swift, Android XML and flat JSON published as one versioned package.
  • Every productEach framework pulls the format it needs. One token change cascades to all 30+ Aceve products.

Multi-platform output

One Figma publish produces four consumable formats via Style Dictionary.

CSS variablesWeb
var(--sprout-accent-default)
React · Angular · Vue · Next.js
Swift classiOS
SproutTokens.accentDefault
UIKit · SwiftUI · Objective-C
XML resourcesAndroid
@color/accent_default
Kotlin · Compose · Java
Flat JSONUniversal
{ "sprout-accent-default": "#447952" }
Electron · Flutter · scripts

All four formats ship in the same @aceve/sprout-tokens package. Each Aceve product imports only what its stack needs — no duplicate token definitions, no manual copy-paste between platforms.

Two repositories, one system

Sprout lives in two GitLab projects with one clear contract between them.

sprout-tokensThe source of truth

Raw design decisions — colors, spacing, radii, shadows and the icon set — synced from Figma and kept free of any app code. Every release is a version tag, and CI publishes it as the @aceve/sprout-tokens npm package to the GitLab Package Registry.

Ships as: @aceve/sprout-tokens on the Package Registry
Open sprout-tokens on GitLab
aceve-design-systemThis site

The Next.js docs site you are reading — pages, components, games and guidelines. It consumes the tokens package but never defines a token itself: if a hex code appears here, it came from the tokens repo. Every merge to main deploys to aceve.design automatically.

Ships as: aceve.design, deployed from GitLab CI
Open the docs repo on GitLab

How a token change travels

Designer publishes the library in Figma → Figma fires a LIBRARY_PUBLISH webhook → aceve.design/api/figma-webhook extracts publisher and change summary, triggers the GitLab pipeline → sync scripts pull icons and variables → Style Dictionary builds CSS, Swift, Android and JSON → sync bot opens a review MR attributed to the designer → maintainer reviews the diff and merges → npm version tags a release → package published to the registry. Product teams pick it up via npm update or Renovate.

Why the docs site vendors its copy

This site keeps a committed copy of the package in vendor/sprout-tokens instead of installing from the registry. That makes the docs build self-contained — CI needs no registry credentials, and the site always documents the exact token version it was reviewed against. When tokens release, the vendored copy is bumped in a normal MR, so the docs update is visible in a diff like any other change.

The sync pipeline in detail

Five steps from Figma click to reviewable MR — three are fully automatic.

01
Designer publishes the Figma libraryDesigner action

Clicking "Publish library" in the main Sprout file fires a LIBRARY_PUBLISH event. The payload contains who published and a full list of created, modified and deleted components, styles and variables.

02
Webhook relay validates and extractsAutomatic

aceve.design/api/figma-webhook receives the event, checks the passcode, and pulls out the publisher handle and a human-readable change summary. It then POST-triggers the GitLab pipeline with SYNC_KIND=all and those two variables attached.

03
GitLab pipeline syncs and buildsAutomatic

The sync job runs npm run sync:figma (pulls all Figma variables), npm run sync:primitive (updates colors, spacing and motion durations in primitive.json), and npm run sync:icons. Style Dictionary then compiles all four output formats (CSS, Swift, Android XML, flat JSON). The verify script runs 13 checks across every platform before anything is committed.

04
Sync bot opens a review MRAutomatic

If git diff finds changes, the bot creates a branch (all/figma-sync-{pipeline-id}), prepends a dated CHANGELOG.md entry, and opens an MR. The MR title and description include the publisher name and the change summary so reviewers know exactly what moved in Figma without opening it.

05
Maintainer reviews, merges, and tagsHuman step

A maintainer checks the diff — token values, new icons, deleted variables — and merges when satisfied. After merging, running npm version patch | minor | major and git push --follow-tags triggers the publish job, which puts the new @aceve/sprout-tokens version on the GitLab Package Registry.

Example auto-generated MROpen
chore(all): sync from Figma
all/figma-sync-372736 → mainDelete source branch
Automated sync from the main Sprout Figma file.
Published by mathias via LIBRARY_PUBLISH webhook.
Changes from Figma: ~1 component (Button) · +2 styles (shadow/md, shadow/lg)
Review the diff, merge when satisfied, then tag a new version to publish.

Tokens never land on main unreviewed. If the sync finds no changes, the pipeline exits cleanly — no empty MR is opened. The CHANGELOG.md in the tokens repo gets a new entry on every sync regardless, so the history is always complete.

Follow a token

Pick one. See the same value through five passport-stamps — Figma, JSON, CSS, JS, and a live render below.

  1. 01
    Figma Variable
    Source of truth — designer edits here
    MiniSprout / VariablesLight
    color/primary/700#447952
  2. 02
    DTCG JSON
    tokens-repo · auto-synced from Figma
    "primary": {
      "700": {
        "$value": "#447952",
        "$type": "color",
        "$description": "Primary brand. Buttons, links, active state."
      }
    }
  3. 03
    Generated CSS
    Style Dictionary build · :root + dark
    :root {
      --sprout-color-primary-700: #447952;
    }
    
    [data-theme="dark"] {
      /* flips to lime for AA contrast on dark */
      --sprout-color-primary-700: #447952;
      --sprout-accent-default: #BDD78F;
    }
  4. 04
    JS API
    @aceve/sprout-tokens · for swatch grids, charts
    import { COLORS } from '@aceve/sprout-tokens';
    
    const aceveGreen = COLORS.brand.find(
      (c) => c.token === '--sprout-color-primary-700'
    );
    // → { name: "Aceve green / 700", value: "#447952",
    //     token: "--sprout-color-primary-700",
    //     role: "Primary brand. Buttons, links, active state." }
  5. 05
    Live on aceve.design
    You're looking at it
    Reads --sprout-color-primary-700 at runtime — switching theme or bumping the tokens package updates it automatically.

Your role

The same pipeline, four different vantage points.

Why this matters

Three commitments the pipeline keeps.

01
Single source of truth.

Change one color in Figma → all 30+ Aceve products get the update the same week. No coordination meeting required.

02
No drift.

Every token is defined in one place. If you see #447952 hardcoded in a PR — that's a bug, and the linter catches it.

03
Reviewable change.

Every update ships through a PR with a diff. No surprise deploys. Every trigger is traceable in the changelog.

Where to next

Three places to dig deeper.

Read the changelogWhat landed, when, and why Browse tokensAll colors, click-to-copy Install the packagenpm, CDN, or Figma library
← PreviousTower of tokensNext →Why it pays
Sprout · Aceve Design System · v3.12.1
Figma library GitLabReleases