Cross-system comparison

This table normalizes the public evidence without treating unlike concepts as equivalent. “None” means no verified system-wide mechanism was found, not that the system cannot create dense layouts.

AreaAdobe SpectrumAngular MaterialSAP Fiori / UI5Salesforce LightningIBM CarbonMicrosoft Fluent 2 WebPatternFly
Explicit density modelYes: platform scaleYes: density theme dimensionYes: content densityYes: user/org UI density plus form densityNo global density; sizes and productive/expressive strategyNo verified global web density; component sizesNo global density; local compact modifiers
Number of density levels2 scales: desktop/mobile (SWC medium/large)6 theme inputs: 0 to -5; per-component clamping2: cozy/compact2 global: Comfy/Compact; form API auto/compact/comfy3–6 sizes depending on component; 2 type strategies3 typical sizes; Table has 3 differently named sizesUsually default/compact where supported; Card also display-lg
Global or component-levelDOM-subtree scale plus independent component sizeGlobal, selector-scoped, or component mixinApplication-level by guidance; ancestor/local technicallyGlobal preference plus component-specific form behaviorComponent-level/region strategyComponent-levelComponent-level
Spacing changesYes, scale-resolved layout/component tokensYes, component density token mapsYes, component dimensions and gapsYes, variable general/horizontal/vertical tokensSize classes select shared spacing/layout valuesPer-size component styles select global spacing tokensCompact modifier remaps component CSS variables
Control height changesYes: component-height seriesYes: 4px steps to component-specific floorYes: typical 44px cozy to 32px compact rows/toolbarsSome platform/components; public global docs emphasize record layout/spacing more than one universal heightYes, explicit component sizesYes: e.g. Input 24/32/40pxWhere component compact variant defines it
Typography changesYes: separate scale-resolved font rampsNo automatic change; separate theme dimensionNo: same type sizeSelectively: titles, line height, selected variable font aliasesBy productive/expressive strategy and some sizesComponent-specific: Button changes; Input/Table generally do notComponent-specific: DataList does; Table largely does not
Icon sizing changesYes: separate desktop/mobile icon setsComponent-specific; not a universal result of densityComponent-specificTouch/component-specific; no public universal mappingComponent-size-specificYes for Button/Input sizesComponent-specific
Table/list densityMultiple row-size token families within each scaleTable header/row heights shrink to scale -4Global cozy/compact row geometryDensity-aware record UI; public table resolver incompleteDataTable xs–xl = 24–64pxTable `extra-smallsmall
Touch target handlingPlacement, cursor, and touch areas separated; aims for 48pxButton has 48px invisible target only at 0/-1; removed at denser levelsCozy 44px area; visual control may be smaller; compact assumes pointer/keyboard2.75rem tappable tokens and separate touch Sass; 44px mobile guidance44px icon-target guidance; smallest visual variants can be 24px44px web/iOS and 48px Android guidance; small targets conditionalCompact guidance acknowledges readability tradeoff; target validation remains contextual
Token mechanismMode-set data → scale CSS vars → semantic/component varsSass density scale → component token maps → CSS varsDensity marker → style query → private vars → SAP theme varsPreference → alternate variable-token mapping; component SassStable foundations → component size maps/classesGlobal/alias tokens → per-size Griffel stylesGlobal semantic tokens → component compact custom-property remap
Figma mechanismExact current mechanism not publicExact Angular-to-Figma mapping not publicSeparate Cozy and Compact libraries/filesNot publicComponent variants/properties; theme modes are separateComponent properties/variants; no public density modeComponent variants/properties; theme variable modes are separate
Code mechanism`<sp-theme scale=“mediumlarge”>plus componentsize`Theme config/Sass density mixins, optionally scopedsapUiSizeCompact, data-ui5-compact-size, or ancestor density contextPlatform preference; form `density=“autocompactcomfy”`; token use
Can densities coexist?Technically yes via scoped themes and sizesYes via selector/component-scoped generated CSSTechnically yes; design guidance says never mix within one page hierarchyPartially: global preference plus form/field overrides and responsive fallbackYes, by component/regionYes, by componentYes, by component

Common architectural patterns

1. Density is rarely a raw multiplier

Spectrum has a 1.25 scale principle and Angular Material uses 4px steps, but both still publish curated component outcomes and component-specific bounds. No examined system simply multiplies every spacing, type, icon, radius, and target value by one unrestricted factor.

2. Systems separate semantic identity from geometry

A primary button remains primary while another axis determines geometry: inherited scale in Spectrum, a density token map in Angular Material, or size in Carbon and Fluent. PatternFly similarly keeps table semantics stable while adding a compact modifier. Density and semantic meaning are orthogonal in all strong examples.

3. The inheritance boundary is a governance decision

  • Spectrum permits a DOM-scoped inherited scale.
  • Angular Material can generate global, selector, or per-component density CSS.
  • SAP implements ancestor resolution but explicitly governs density at application level and prohibits mixed page hierarchies.
  • Carbon, Fluent, and PatternFly avoid a universal inherited switch, making local coexistence easy but leaving consistency to component/composition rules.

The technical ability to scope density does not imply that arbitrary mixing is sanctioned.

4. Typography has three distinct treatments

  1. Scale with geometry: Spectrum changes type and icons with platform scale.
  2. Independent axis: Angular Material and SAP keep the density change separate from typography; SAP explicitly keeps font size constant.
  3. Selective/local change: Salesforce, Carbon, Fluent, and PatternFly change type only for chosen roles, use cases, or component sizes.

This is a major architectural fault line: “compact” does not predict smaller text.

5. Touch safety is not implied by density tokens

Several systems separate visual bounds from interactive bounds, but only in defined conditions. Spectrum models separate hit areas; SAP says a visible control can be smaller than its touch area; Angular retains a 48px invisible button target at mild density but removes it when overlap would occur. WCAG 2.2 AA is 24px or sufficient spacing with exceptions, while 44px is AAA, so product guidance often exceeds the normative minimum. WCAG 2.5.8 WCAG 2.5.5

6. Data-heavy components often need their own density axis

Spectrum tables have regular/spacious row families inside each platform scale; Carbon and Fluent expose multiple table sizes; PatternFly has a compact table modifier. This prevents an application-wide choice from being the only way to tune row count, multi-line content, and action cells.

7. Figma architecture is less public than code architecture

SAP is the clearest verified design-tool example and publishes separate Cozy and Compact libraries. Carbon, Fluent, and PatternFly publicly map component configurations to variants/properties. None of the researched sources establishes that a global Figma variable mode is the inevitable counterpart of code density. For Spectrum, Angular Material, and Salesforce, exact current authoring mechanisms are not public enough to verify.

The “same component + same meaning + different context” boundary

The systems demonstrate three factual ways to preserve one governed component:

  • Inherited contextual resolution: Spectrum’s same semantic component resolves through a scale scope; Angular Material can do the same through scoped density CSS.
  • Application policy with constrained exceptions: SAP changes the same controls through application density but forbids mixing; Salesforce follows a user preference while form components and responsive rules add controlled exceptions.
  • Explicit component geometry: Carbon, Fluent, and PatternFly keep one Button/Table/List API and expose a size or compact modifier instead of a global mode.

The latter group is direct evidence that a mature system can intentionally avoid theme/mode architecture. It preserves component governance through shared code, tokens, states, and semantics while making geometry an explicit component/composition decision.

Supplemental implementation evidence

These sources add implementation specificity but are kept separate from the seven-system maturity table:

AreaUber demoSAS case studyMeridian source
Evidence typePrimary video showing Figma UIPractitioner-authored implementation accountPublic code/token source; limited adoption evidence
ModesDefault / Compact / SpaciousStandard / Compact / Comfortable; developer medium / high / lowDefault/comfortable + Compact
GranularityComponent-specific List Item variable collection inherited by frameIndependent product density dimensionAncestor/subtree scope plus component size and local Table prop
Exact public data3 List Item variables, all mode valuesType example: 14px default, 12px compact, selected locales 16px5 CSS variables with default/compact values
TypographyNot exposed in density collection shownIntended to change with 12px floor; locale overrides may winGlobal compact does not change type; local Table dense does
Separate theme axisYes, visible on frameYes, independent collection/load layerYes, separate data-theme attribute
Main implementation lessonFigma modes can carry component-semantic geometry; this does not prove one global density collectionFile precedence and locale interaction are part of the architectureInheritance, explicit size, and local overrides coexist, but interactions need normalization

Exact values and evidence limits for the three supplemental systems and Spectrum are normalized in _implementation-data.json. The token-library manifest indexes normalized extracts for all ten systems.

See all ten reports in systems/, including the three supplemental reports, and each pinned inventory or provenance record in sources/. Cross-system accessibility thresholds use W3C WCAG 2.2 Target Size (Minimum).