Typography

01 Section Title [H2]

01 Section Title [H2]

01 Section Title [H2]

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

02 Section Title [H2]

02 Section Title [H2]

02 Section Title [H2]

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

03 Section Title [H2]

03 Section Title [H2]

03 Section Title [H2]

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

04 Section Title [H2]

04 Section Title [H2]

04 Section Title [H2]

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

05 Section Title [H2]

05 Section Title [H2]

05 Section Title [H2]

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Index Design System

Typography is more than just text on a screen—it’s a foundational element of how users experience a product. At Untitled, I’ve built a typographic system that scales with intention, adapts fluidly to context, and communicates with clarity. It’s responsive, expressive, and grounded in design principles that prioritize legibility, rhythm, and consistency.

In today’s multi-device world, typography has to do more than look good. It needs to feel intuitive, guide the eye, and respond intelligently to screen size, user preferences, and content hierarchy. That’s the core thinking behind how I approach type.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Principles Behind My Typography System

My typographic foundation was designed with three core goals in mind:

  • Scalability: Whether a user is on a small mobile screen or a large monitor, the typography should adjust effortlessly—preserving structure, hierarchy, and comfort.

  • Legibility: Every choice, from font size to line height, is driven by readability and clarity.

  • Consistency through fluidity: By blending modular scales with dynamic calculations, I ensure consistency across breakpoints—without feeling rigid or formulaic.

Typography should not constrain design—it should elevate it. That’s why I embraced both fluid scaling and a token-based architecture that integrates seamlessly across design tools and codebases.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Modular Scale: Minor Third + Perfect Fourth

To build a sense of rhythm across viewports, I designed the type system using modular scales—specifically:

  • Mobile: I use a minor third scale (1.2) to keep type sizes compact, efficient, and tightly structured. It’s ideal for mobile UIs, where vertical space is limited and readability must remain high.

  • Tablet and Desktop: I apply a perfect fourth scale (1.333). This creates a more generous, elegant rhythm that allows for better visual hierarchy and longer reading comfort on larger screens.

By combining both scales, I can tailor the typographic rhythm based on context—without fragmenting the system.

Dynamic Root Font Size (Fluid :root Scaling)

One of the most significant enhancements I implemented is dynamic root font sizing. Rather than defining a static font-size (like 16px) in the html or :root element, I calculate it in real-time based on the viewport's width and height:

:root {
  font-size: calc(0.625vw + 0.625vh);
}

This formula blends the viewport width (vw) and height (vh) to create a responsive base font size, allowing every rem-based value in the system to scale with the screen.

Why this matters:

  • It removes the need for hard breakpoints for typography.

  • The entire type system scales organically, preserving hierarchy.

  • Users who adjust their default browser settings still experience a consistent, harmonious interface.

  • It unlocks true fluid type across all devices.

This also plays nicely with component padding, spacing, and layout since everything in my system is rem-based.

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Dynamic Root Font Size

Instead of a fixed html { font-size }, I calculate it on the fly based on screen dimensions using this JavaScript snippet:

<script>
  (function() {
    const BREAKPOINTS = [
      { width:  480, height:  667 },
      { width:  768, height: 1024 },
      { width: 1024, height:  768 },
      { width: 1280, height:  800 },
      { width: 1536, height:  864 },
      { width: 1920, height: 1080 }
    ];
    const INCREMENT = 0.0125;
    const BASE_FONT = 16;

    function getBreakpoint() {
      const w = window.innerWidth;
      return BREAKPOINTS.find(bp => w <= bp.width) || BREAKPOINTS[BREAKPOINTS.length - 1];
    }

    function getFontRatio() {
      const { width: bpW, height: bpH } = getBreakpoint();
      const hRatio = window.innerWidth / bpW;
      const vRatio = window.innerHeight / bpH;
      const rawRatio = Math.min(hRatio, vRatio);
      const steps = Math.round(rawRatio / INCREMENT);
      return steps * INCREMENT;
    }

    function updateViewportUnits() {
      const ratio = getFontRatio();
      const root = document.documentElement;
      const scaledFs = ratio * BASE_FONT;

      root.style.setProperty('font-size', `${scaledFs}px`);
      root.style.setProperty('--ra', `${ratio}px`);
      root.style.setProperty('--vh', `${window.innerHeight * 0.01}px`);
      root.style.setProperty('--vw', `${window.innerWidth * 0.01}px`);
      root.style.transition = "var(--sp)";
    }

    updateViewportUnits();
    let resizeId;
    window.addEventListener('resize', () => {
      if (resizeId) cancelAnimationFrame(resizeId);
      resizeId = requestAnimationFrame(updateViewportUnits);
    });
  })();
</script>

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.

Math Breakdown

  • Device: 1440×900

  • Closest Breakpoint: 1536×864

  • Horizontal ratio: 1440 / 1536 = 0.9375

  • Vertical ratio: 900 / 864 = 1.0417

  • Chosen ratio: 0.9375

  • Rounded to nearest 0.0125: 0.9375

  • Scaled font-size: 0.9375 × 16px = 15px

Now all 1rem values = 15px, scaling your design smoothly across devices.

Typography Tokens and Usage

Headings

Token

Font Size

Line Height

Usage

font.heading.xxlarge

2.0rem

2.25rem

Hero titles, banners

font.heading.xlarge

1.75rem

2.0rem

Page titles, large sections

font.heading.large

1.5rem

1.75rem

Section headers

font.heading.medium

1.25rem

1.5rem

Modals, cards

font.heading.small

1.0rem

1.25rem

Components, labels

font.heading.xsmall

0.875rem

1.25rem

UI elements

font.heading.xxsmall

0.75rem

1.0rem

Fine print, microcopy

Body Text

Token

Font Size

Line Height

Paragraph Spacing

font.body.large

1.0rem

1.5rem

1rem

font.body.medium

0.875rem

1.25rem

0.75rem

font.body.small

0.75rem

1.0rem

0.5rem

Font Weights:

  • Regular (400): Default paragraph content

  • Medium (500): For inline text next to icons

  • Bold (700): Use sparingly for emphasis

Code Styles

Token

Font Size

Line Height

Usage

font.code

12px

20px

Code blocks/snippets

Inline code inherits the font size of its container but retains formatting.

Benefits

  • Fully Fluid: All sizes adjust automatically without breakpoints.

  • Rem-Based: Components, spacing, and layout scale in sync.

  • Accessible: Honors user font preferences and zoom levels.

  • Consistent: Text feels balanced across all devices.

Typography should guide users quietly and confidently. This system blends timeless principles (like modular scales) with modern techniques (like dynamic rem sizing) to create a fluid, scalable, and accessible typographic experience.

Whether you're designing a single-page microsite or a complex application interface, this type system is built to grow with you—visually, functionally, and technically.