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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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 |
---|---|---|---|
| 2.0rem | 2.25rem | Hero titles, banners |
| 1.75rem | 2.0rem | Page titles, large sections |
| 1.5rem | 1.75rem | Section headers |
| 1.25rem | 1.5rem | Modals, cards |
| 1.0rem | 1.25rem | Components, labels |
| 0.875rem | 1.25rem | UI elements |
| 0.75rem | 1.0rem | Fine print, microcopy |
Body Text
Token | Font Size | Line Height | Paragraph Spacing |
---|---|---|---|
| 1.0rem | 1.5rem | 1rem |
| 0.875rem | 1.25rem | 0.75rem |
| 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 |
---|---|---|---|
| 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.