Framer design system: what belongs in styles, components, and DESIGN.md

In a Framer design system, give every decision one authoritative home. Keep portable intent and rules in DESIGN.md, reusable visual values in shared Framer styles, recurring behavior and structure in components, and deliberate responsive adaptations in breakpoints. Reserve page-level overrides for named exceptions. Record how those layers map to one another so an AI agent doesn't solve the same design question differently on every page.

Updated July 26, 2026

Start with Framer's documented surfaces

A design-system decision can appear in several parts of Framer. Its official AI page says the canvas can refine typography, components, breakpoints, spacing, color, effects, and layouts. The page also describes AI-authored code components and connections to external agents. Across the broader platform, design, code, collaboration, and publishing share one working environment.

Those capabilities tell you what can be edited. On their own, they don't decide where a rule should originate or what wins when two layers disagree. The responsibility and precedence model below is a working contract for teams, not a Framer-native standard.

Documented capability versus recommended governance

Framer documents editable project surfaces and agent workflows. This guide recommends an ownership matrix, handoff record, and verification sequence for governing those surfaces.

Give each decision one authoritative home

Choose the authority based on the decision's scope. A rule that should survive a change of page, agent, or implementation tool belongs in portable guidance such as DESIGN.md. Implement a reusable value inside the Framer project as a shared style. When a decision defines a recurring unit with structure or behavior, put that implementation in a component.

OwnsShould not own
DESIGN.mdPortable intent, semantic roles, layout principles, component guidance, motifs, constraints, and permitted exceptionsFramer object IDs, undocumented observations, or claims that a mapping has been tested when it hasn't
Shared stylesReusable Framer color and text values that implement named rolesOne-off page fixes or the rationale for why a role exists
ComponentsRecurring structure, variants, states, properties, and interaction behaviorGlobal values that should come from shared styles or isolated exceptions for one page
BreakpointsIntentional responsive changes to layout, sizing, visibility, and arrangementUnexplained repairs that compensate for a weak base component
Generated codeCustom behavior or rendering that Framer's visual layers do not express adequatelyA silent duplicate of token values or rules already owned elsewhere
Page-level overridesNamed, narrow exceptions with a reason and review conditionDefault styling, reusable behavior, or a convenient escape from updating the source layer
Responsibility matrix for a Framer design system

A mapping isn't a second authority. For example, DESIGN.md may specify that muted text uses a semantic foreground role. A Framer text style can implement that role under a project-specific name. The written rule owns the meaning, while the Framer style owns the local reusable value. The handoff record connects them.

Use a conflict-precedence rule

When two layers disagree, don't accept whichever one renders last. Trace the decision to its declared authority, check whether the downstream mapping is current, and classify any deviation as an approved exception or a defect.

  1. Check the authoritative decision and its scope.
  2. Check the recorded mapping to the Framer style, component, breakpoint, or code component.
  3. Check whether a narrower exception was explicitly permitted.
  4. If the authority is ambiguous, pause the change and assign it before editing more surfaces.
  5. Update the owning layer first, then update affected mappings and record the observed evidence.

Local correctness can hide system drift

A page-level override may make one screen look right while shared styles, components, and other breakpoints remain wrong. Treat it as an exception only when its scope and reason are recorded.

Copy this branch-change brief

An agent needs more than a design request. Give it a short acceptance record that names the authoritative decision, intended consumers, unchanged surfaces, and evidence required for review.

change_id: nav-muted-text
objective: Align secondary navigation text with the declared muted-text role.

source:
  authority: DESIGN.md > Color roles > Muted content
  owner: Design systems owner
  decision: Secondary navigation labels use the muted foreground role.

targets:
  framer_styles:
    - Secondary / Navigation
  components:
    - Site Header
    - Footer Navigation
  representative_pages:
    - Home
    - Pricing
  breakpoints:
    - Desktop
    - Smallest supported phone width

allowed_exceptions:
  - Active navigation item uses the primary foreground role.

must_remain_unchanged:
  - Primary navigation labels
  - Button labels
  - CMS article body text
  - Header spacing and interaction behavior

agent_context:
  include:
    - Relevant DESIGN.md color-role section
    - Target text style
    - Site Header and Footer Navigation components
    - Home and Pricing pages
  exclude:
    - Unrelated pages, CMS content, and global layout changes

evidence:
  intended_change:
    - Before and after capture for each representative page and breakpoint
  unrelated_drift:
    - Comparison of named unchanged surfaces
  unresolved:
    - Record any mapping or behavior that could not be inspected

disposition: pass | revise | block
reviewer:
reviewed_at:
Copyable record for one bounded Framer branch change

The record separates intention from observation. A target listed under framer_styles is expected to change. Its presence there isn't evidence that the mapping exists or that the result matches the source. Fill the evidence section only after inspection.

Representative pages should exercise real reuse. Choose at least one page where the target is prominent and another where it appears in a different composition. For breakpoints, cover the responsive condition most likely to change the component instead of checking every arbitrary canvas width.

Bound the agent context before editing

Framer describes project context, editable styles and assets, external-agent connections, and agent-authored changes. More context isn't automatically better. A bounded context makes it easier to see whether the agent followed the intended rule and whether unrelated work slipped into the branch.

  1. 1

    Select the source decision

    Provide the relevant DESIGN.md section or other declared authority. Don't send an entire library when only one color role or component rule is in scope.

  2. 2

    Name the Framer consumers

    Identify the shared styles, components, pages, layers, and breakpoints expected to implement the decision. Mark unknown mappings as unknown instead of guessing their names.

  3. 3

    State the non-goals

    List nearby surfaces the agent must not redesign, rename, restructure, or restyle. Include unrelated components that share the page.

  4. 4

    Define observable acceptance

    Describe what a reviewer must see on representative pages and small breakpoints. Name the unrelated surfaces that should remain unchanged.

  5. 5

    Open a bounded branch change

    Ask for the named change only. If the agent finds a missing mapping or ambiguous authority, require it to report the gap instead of inventing a new system.

Treat unknown as a valid evidence state

Unknown is more useful than an invented style name or an assumed import result. It tells the reviewer which mapping must be established before the change can pass.

Start from a complete source artifact

If your Framer handoff lacks portable roles and usage rules, inspect a public kit and its DESIGN.md before creating local mappings. Keep the Framer implementation separate from the source artifact.

Verify one controlled change on a branch

A good-looking desktop canvas is weak evidence. Review the intended change wherever it's reused, inspect a smaller breakpoint, and check named unrelated surfaces for drift. The goal is traceability, not a claim that one review certifies the whole site.

  1. 1

    Confirm the source and mapping

    Verify that the branch brief points to the current authoritative decision and intended Framer consumers. If either is missing, revise the brief before judging the rendering.

  2. 2

    Inspect the primary representative page

    Check the intended style or component on the page where its effect is easiest to see. Record what changed instead of relying on memory.

  3. 3

    Inspect another real consumer

    Open a second representative page or composition that uses the same style or component. A mismatch often reveals a detached local value or duplicated component.

  4. 4

    Check the responsive adaptation

    Inspect the smallest named breakpoint and any breakpoint where arrangement, visibility, or sizing intentionally changes. Confirm that the base rule still holds unless the brief permits an adaptation.

  5. 5

    Look for unrelated drift

    Compare the surfaces listed under must_remain_unchanged. Check the style values, component structure, layout, content, and interactions relevant to the branch scope.

  6. 6

    Assign a disposition

    Pass when the intended mappings match and no in-scope drift remains. Revise for a correctable mismatch. Block when authority is ambiguous, required evidence is unavailable, or the branch changes protected non-goals.

What a pass means

Pass means the bounded change met its declared contract on the inspected surfaces. It doesn't mean the entire Framer site is accessible, responsive, performant, or ready to publish.

Diagnose inconsistency in ownership order

When a Framer page looks inconsistent, another broad prompt often makes the evidence harder to interpret. Walk through the layers in ownership order and stop at the first unsupported or contradictory mapping.

  1. Source decision: Is the intended role or rule explicit, current, and owned?
  2. Selected context: Did the agent receive the relevant rule, targets, exceptions, and non-goals?
  3. Shared style mapping: Does the target element use the Framer style mapped to the source role?
  4. Component use: Is the page using the shared component and intended variant, or a detached copy?
  5. Breakpoint adaptation: Does a responsive override intentionally change the value or structure?
  6. Generated code: Does a code component contain a duplicated value or behavior that conflicts with the source?
  7. Page-level override: Is there a local value masking the shared implementation?

Fix the owning layer, not the first visible symptom. If a component uses the wrong shared style, correct the component mapping. If the source rule is genuinely wrong, change it through the team's normal design-system process and then update every affected consumer. Don't rewrite the source merely to legitimize an accidental local value.

Consistency check · Ad-hoc colors

The same plan card, built two ways in Ambient Sage.

Drifting system

Pricing

Starter$19/mo

Everything a small team needs to ship a branded UI.

Consistent system

Pricing

Starter$19/mo

Everything a small team needs to ship a branded UI.

What to notice: Color drift becomes visible when local values compete with mapped semantic roles.

Ambient Sage as an evidence-state example

The public Ambient Sage kit works as an example because its source facts are inspectable. Its published page provides a DESIGN.md, semantic light and dark tokens, a 31-color palette, and typography roles. Plus Jakarta Sans is used for headings and body, while JetBrains Mono fills the mono role. The kit also describes warm sage surfaces, tonal cards, and a restrained yellow accent.

Token specimen · real values

Ambient Sage

Live render

Ambient Sage's actual tokens — the same values its exports use.

Color tokensSemantic roles with HEX / HSL / CMYK

Color tokens

Ambient Sage

light · HEX · HSL · CMYK

Core

#F3F4EF

background

H 72 · C0, 0, 2, 4

#1A1C17

foreground

H 84 · C7, 0, 18, 89

#E5E6E0

card

H 70 · C0, 0, 3, 10

#ECEEE8

muted

H 80 · C1, 0, 3, 7

#D8D9D2

border

H 69 · C0, 0, 3, 15

Brand

#FEE951

primary

H 53 · C0, 8, 68, 0

#1A1C17

primary-fg

H 84 · C7, 0, 18, 89

#E5E6E0

secondary

H 70 · C0, 0, 3, 10

#F7E464

accent

H 52 · C0, 8, 60, 3

#FEE951

ring

H 53 · C0, 8, 68, 0

Semantic

#C0392B

destructive

H 6 · C0, 70, 78, 25

#FFFFFF

destructive-fg

H 0 · C0, 0, 0, 0

#2D7238

success

H 130 · C61, 0, 51, 55

#C97D12

warning

H 35 · C0, 38, 91, 21

#545651

muted-fg

H 84 · C2, 0, 6, 66

Charts

#FEE951

chart-1

H 53 · C0, 8, 68, 0

#4A8FD4

chart-2

H 210 · C65, 33, 0, 17

#6BBF8A

chart-3

H 142 · C44, 0, 28, 25

#E07498

chart-4

H 340 · C0, 48, 32, 12

#E8A24B

chart-5

H 33 · C0, 30, 68, 9

Type scaleHeading, body, and mono in the kit's fonts

Typography

Ambient Sage

Scale: compact-product

Density: balanced

Heading · Plus Jakarta Sans · 1.875rem

Sample headline

Subheading · Plus Jakarta Sans · 1.375rem

A warm-sage neutral-surface mobile kit with a single vivid yellow accent, flat tonal cards, and oversized display numerals.

Body · Plus Jakarta Sans · 1rem

Ambient Sage uses a near-white warm-sage canvas (#f3f4ef) with card panels distinguished only by a tonal shift to #e5e6e0, never by shadows or borders. A single vivid yellow (#fee951) is the only saturated color and appears sparingly at component scale as orbs, button fills, and focus rings. Primary data values render as oversized bold hero numerals with a small superscript unit. Typography is a friendly rounded geometric (Plus Jakarta Sans) with no uppercase and no tight tracking, while JetBrains Mono is reserved for hex codes and technical strings. Generous rounding and luminance-only contrast give the whole system a calm, minimal feel.

Mono · JetBrains Mono · 0.8125rem

npx shadcn add ambientsage.json

Aa

Plus Jakarta Sans · Heading

400500600700

Aa

Plus Jakarta Sans · Body

400500600700

ABCDEFGHIJKLM NOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789 & @ # % →

Radius & spacingCorner radius, elevation, and spacing steps

Tokens

Ambient Sage primitives

density: balanced

Radius scale

sm · 0.375rem
md · 0.75rem
lg · 1.25rem
xl · 1.75rem

Component radius

button
card
input

Elevation

level 1
level 2
level 3
level 4

Spacing · base 4px

1x
2x
3x
4x
6x
8x
Ambient Sage source tokens and roles. This specimen shows the kit, not a verified Framer implementation.
Ambient Sage exampleWhat remains unresolved
Available from sourceDESIGN.md, semantic light and dark tokens, typography roles, spacing guidance, motifs, and public exportsNothing in this state proves how Framer represents those decisions
Implemented in FramerA team could create named Framer styles and component mappings from the sourceActual style names, component associations, code behavior, and breakpoint adaptations remain unknown until they're implemented and recorded
Observed on pagesA reviewer could inspect representative pages and breakpoints after a bounded branch changeNo frozen test establishes import behavior, visual parity, responsive completeness, or unchanged-surface results
Keep available, implemented, and observed evidence separate

A handoff might map the kit's background role to a Framer color style, its body role to a text style using Plus Jakarta Sans, and its tonal-card guidance to a reusable card component. These are example mappings, not facts about an existing Framer project. The project owner must choose the actual names and verify the resulting pages.

No native integration or parity claim

The available evidence shows that Framer can use references such as DESIGN.md and that Ambient Sage exposes portable artifacts. It doesn't show an automatic Identity Forge import, automatic style creation, or tested parity between the kit and a Framer project.

Know what this workflow cannot certify

The responsibility map and branch record improve traceability. They don't replace specialist review or prove that the result is good. A consistent implementation can still apply a poor design decision consistently.

  • It does not certify accessibility conformance, including contrast, keyboard behavior, focus treatment, semantics, or assistive-technology support.
  • It does not prove every page, content state, locale, or viewport is responsive.
  • It does not assess generated-code quality, runtime behavior, performance, security, or maintainability outside the declared change.
  • It does not prove that a source artifact was imported automatically or reproduced with visual parity.
  • It does not authorize publication. The branch still needs the project's normal review and release process.

Keep separate evidence tracks when the risk requires them. Design-system conformance asks whether the implementation follows its declared source. Accessibility, resilience, behavior, and production readiness require their own checks.

Make one decision traceable today

Choose one existing decision that appears on more than one Framer page, such as muted navigation text or card surface color. Declare its authoritative source, record the exact Framer style or component mapping, name two representative pages and one small breakpoint, then test one bounded branch change. Expand the system only when the record is clear enough for another reviewer to reproduce.

Sources