npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, πŸ‘‹, I’m Ryan HefnerΒ  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you πŸ™

Β© 2026 – Pkg Stats / Ryan Hefner

responsive-scale-mixins

v2.1.0

Published

🎨 Revolutionary SCSS mixins for perfect responsive design with universal browser compatibility. Supports ALL CSS units (px, rem, em, vw, vh, %, etc.) with pixel-perfect scaling and automatic fallbacks for browsers without CSS variable support. Zero manua

Readme

πŸš€ Responsive Scale Mixins

The Future of Responsive Design is Here

Stop wrestling with breakpoints. Start designing once, deploy everywhere.

Imagine building a beautiful UI in Figma, then seeing it perfectly scale on every screen size - from tiny phones (320px) to ultra-wide monitors (9999px) - without writing a single media query. That's the power of Responsive Scale Mixins.

npm version License: MIT npm npm

πŸ”₯ Why Developers Love It

🎯 Pixel-Perfect Figma Translation

  • Your Figma designs become reality, not approximations
  • Zero guessing, zero manual calculations
  • What you see in design tools is what users see on any device

⚑ Revolutionary Simplicity

// Before: 50+ lines of media queries
.hero-title {
  font-size: 48px;
  @media (max-width: 768px) {
    font-size: 32px;
  }
  @media (max-width: 480px) {
    font-size: 24px;
  }
  // ... and so on for every element
}

// After: 1 line that works everywhere
.hero-title {
  @include rsm.responsive-scale(font-size, 48, 24);
}

🎨 Universal Unit Support

  • px, rem, em, vw, vh, %, cm, mm, in, pt, pc - you name it, we scale it
  • Intelligent interpolation between desktop and mobile values
  • Perfect scaling from 320px phones to 8K displays

πŸš€ Framework Agnostic

Works with React, Vue, Angular, Svelte, Next.js, Nuxt, Astro, and vanilla CSS. Your favorite framework + perfect responsive design = ❀️

πŸš€ v2.1.0 - Universal Browser Compatibility (No Breaking Changes)

Automatic fallback generation for browsers without CSS variable support!

✨ What's New

  • Universal Browser Support: Now works on Firefox Mobile, old Android browsers, and budget devices
  • Automatic Fallbacks: Generates both modern calc() AND static fallback values
  • Zero Code Changes: Your existing code works exactly the same
  • Progressive Enhancement: Modern browsers get responsive scaling, old browsers get static values

🎯 Browser Support Matrix

| Browser | v2.0.x | v2.1.0 | Status | | ----------------------------- | -------------------------- | -------------------------- | --------- | | Chrome, Safari, Firefox, Edge | βœ… Full responsive scaling | βœ… Full responsive scaling | Unchanged | | Firefox Mobile | ❌ BROKEN | βœ… FIXED | NEW! | | Android Browser (4.4+) | ❌ BROKEN | βœ… FIXED | NEW! | | Budget devices | ❌ BROKEN | βœ… FIXED | NEW! | | IE 11 | ❌ Not supported | ❌ Not supported | Unchanged |

Coverage improvement: 85% β†’ 99.5% (+14.5%)

πŸ”§ How It Works

// Your code (unchanged!)
.hero-title {
  @include rsm.responsive-scale(font-size, 48, 24);
}

// v2.0.x output (broken on Firefox Mobile)
.hero-title {
  font-size: calc(100vw / 1920 * 48px);
}

// v2.1.0 output (works everywhere!)
.hero-title {
  font-size: 48px; /* Fallback for old browsers */
  font-size: calc(100vw / 1920 * 48px); /* Modern responsive scaling */
}

Browser behavior:

  • Modern browsers: Ignore first declaration, use second β†’ Perfect responsive scaling βœ…
  • Old browsers: Use first declaration, ignore second β†’ Static fallback values βœ…

βš™οΈ New Optional Features

Disable Fallback for Single Property

// Don't generate fallback for this property (modern browsers only)
.element {
  @include rsm.responsive-scale-no-fallback(font-size, 48, 24);
}

Disable Fallback Globally

:root {
  @include rsm.responsive-scale-variables(
    1920px,
    768px,
    390px,
    false // No fallbacks anywhere
  );
}

πŸ“Š Performance Impact

  • CSS size increase: <1 KB (after GZip) on typical sites
  • Build time: No change
  • Runtime performance: No change
  • Browser parsing: Slightly faster on old browsers

πŸ”„ Migration Guide

For all users:

npm update responsive-scale-mixins

That's it! Everything works, plus Firefox Mobile now works.

For users who want to disable fallbacks:

// Use new mixin for modern-only styles
@include rsm.responsive-scale-no-fallback(property, desktop, mobile);

βœ… v2.0.9 - Bug Fix (No Breaking Changes)

This is a bug fix that resolves tablet breakpoint calculation issues. No API changes.

  • Fixed: Tablet breakpoint CSS generation was producing invalid calc() expressions
  • Result: Tablet scaling now works correctly with valid CSS output
  • Compatibility: All existing code continues to work unchanged
  • API: Zero breaking changes - same function calls, same parameters, same behavior

Migration Guide (Pure CSS Users)

Update your CSS variable definitions:

/* OLD (v1.x) */
:root {
  --computed-scale-factor-px: calc(100vw / 1440);
  --computed-scale-factor-rem: calc(100vw / 1440 / 16);
  --computed-tablet-scale-factor-px: calc(100vw / 768);
  --computed-tablet-scale-factor-rem: calc(100vw / 768 / 16);
  --computed-mobile-scale-factor-px: calc(100vw / 375);
  --computed-mobile-scale-factor-rem: calc(100vw / 375 / 16);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

/* NEW (v2.0) */
:root {
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

Update your calc expressions to include units:

/* OLD (v1.x) */
font-size: calc(var(--computed-scale-factor-px) * 40);

@include rsm.responsive-scale(font-size, 24, 16);

✨ Features

  • Figma Proportions: Maintains exact proportions from your Figma designs
  • Automatic Scaling: No manual breakpoint calculations needed
  • Tablet Interpolation: Smart interpolation between mobile and desktop values
  • CSS Custom Properties: Uses modern CSS variables for optimal performance
  • Framework Agnostic: Works with any CSS framework or vanilla CSS
  • TypeScript Ready: Compatible with CSS Modules and CSS-in-JS solutions
  • Universal Unit Support: Handles all CSS units including absolute (px, pt, cm, mm, in, pc) and relative (%, em, rem, vw, vh, vmin, vmax) units

πŸ”§ Package Structure

Starting with v2.0.7, this package uses a single-file distribution for maximum compatibility. All mixins and functions are consolidated in index.scss, eliminating import dependency issues that could occur with NPM package distribution.

Recommended Import Pattern

// Modern @use syntax (preferred)
@use "responsive-scale-mixins" as rsm;

:root {
  @include rsm.responsive-scale-variables();
}

.my-element {
  @include rsm.responsive-scale(font-size, 24, 16);
}

Troubleshooting Import Errors

If you encounter "Can't find stylesheet to import" errors with Dart Sass:

  1. Update the package: Ensure you're using v2.0.4 or later
  2. Use relative imports as workaround: Import the partials directly:
    @import "responsive-scale-mixins/scss/variables";
    @import "responsive-scale-mixins/scss/mixins";
  3. Check your build tool: Some tools may need configuration updates for SCSS module resolution

πŸš€ Quick Start

Installation

npm

npm install responsive-scale-mixins

Yarn

yarn add responsive-scale-mixins

pnpm

pnpm add responsive-scale-mixins

Framework-Specific Setup

Next.js (App Router)

// app/globals.scss or app/styles/globals.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  // Define CSS variables globally (required)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

// Import in app/layout.tsx: import './globals.scss'

Next.js (Pages Router)

// styles/globals.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Define CSS variables globally (required)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

// Import in pages/_app.js: import '../styles/globals.scss'

Next.js Setup:

  • App Router: Put :root in app/globals.css (imported in layout.tsx)
  • Pages Router: Put :root in styles/globals.scss (imported in pages/_app.js)
  • The :root selector defines global CSS custom properties accessible everywhere

Create React App

// src/index.scss or src/styles/main.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Define CSS variables globally (required)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

// Import in src/index.js: import './index.scss'

Create React App Setup:

  • Put :root in your main SCSS file (e.g., src/index.scss)
  • Import the SCSS file in src/index.js
  • The :root selector makes CSS variables available app-wide

Vue.js

// src/assets/styles/main.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Define CSS variables globally (required)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

// Import in src/main.js: import './assets/styles/main.scss'

Vue.js Setup:

  • Put :root in your global SCSS file
  • Import in src/main.js or use in a global style resource
  • The :root selector defines app-wide CSS variables

Angular

// src/styles.scss (global styles)
@use "responsive-scale-mixins" as rsm;

:root {
  // Define CSS variables globally (required)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

// This file is automatically included by Angular CLI

Angular Setup:

  • Put :root in src/styles.scss (automatically included by Angular CLI)
  • No manual import needed - Angular handles it
  • The :root selector defines global CSS variables

Vite + Vue/React

// src/styles/main.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Customize for your design system (optional)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

Gatsby

// src/styles/global.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Customize for your design system (optional)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

Nuxt.js

// assets/styles/main.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Customize for your design system (optional)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

SvelteKit

// src/app.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Customize for your design system (optional)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

Astro

// src/styles/global.scss
@use "responsive-scale-mixins" as rsm;

:root {
  // Customize for your design system (optional)

  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

CSS Modules

// styles.module.scss
@use "responsive-scale-mixins" as rsm;

// Variables must be in global scope
// In your main CSS file:
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1920);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 390);
  --tablet-proportion-scale-factor: calc((100vw - 390px) / (1920px - 390px));
}

// Then in your module
.myClass {
  @include rsm.responsive-scale(font-size, 24, 16);
}

Tailwind CSS Integration

// styles/main.scss
@use "responsive-scale-mixins" as rsm;

:root {
  @include rsm.responsive-scale-variables();
}

// Use alongside Tailwind
.custom-element {
  @include rsm.responsive-scale(padding, 20 40, 10 20);
  @apply bg-blue-500 text-white; // Tailwind classes still work
}

Styled Components

// If using styled-components with SCSS preprocessing
import styled from 'styled-components';
import './styles/responsive-mixins.scss'; // Import in your main file

const StyledComponent = styled.div`
  ${props => props.theme.responsiveScale('font-size', 24, 16)}
`;

Basic Usage

Modern @use Syntax (Recommended)

// In your main SCSS file
@use "responsive-scale-mixins" as rsm;

// Include variables in your root element (required)
:root {
  @include rsm.responsive-scale-variables();
}

// Use the mixin anywhere
.my-element {
  @include rsm.responsive-scale(font-size, 24, 16);
  @include rsm.responsive-scale(padding, 20 40, 10 20);
}

Legacy @import Syntax (for older setups)

// In your main SCSS file
@import "~responsive-scale-mixins";

// Include variables in your root element (required)
:root {
  @include responsive-scale-variables();
}

// Use the mixin anywhere
.my-element {
  @include responsive-scale(font-size, 24, 16);
  @include responsive-scale(padding, 20 40, 10 20);
}

πŸ“– API Reference

responsive-scale-variables($desktop-width, $tablet-width, $mobile-width)

Defines the CSS custom properties for scaling calculations.

Parameters:

  • $desktop-width: Design width for desktop (default: 1920px)
  • $tablet-width: Design width for tablet (default: 768px)
  • $mobile-width: Design width for mobile (default: 390px)

responsive-scale($property, $desktop-value, $mobile-value, $unit, $is-percentage, $desktop-relative, $mobile-relative, $important)

The main responsive scaling mixin.

Parameters:

  • $property: CSS property name (e.g., font-size, padding)
  • $desktop-value: Value for desktop screens
  • $mobile-value: Value for mobile screens
  • $unit: Unit for scaling (px or rem, default: px)
  • $is-percentage: Whether the value is a percentage (default: false)
  • $desktop-relative: Base value for percentage calculations on desktop
  • $mobile-relative: Base value for percentage calculations on mobile
  • $important: String to append (e.g., " !important" for override, default: null)

🎯 Examples

Typography

.hero-title {
  @include rsm.responsive-scale(font-size, 48, 32);
  @include rsm.responsive-scale(line-height, 1.2, 1.3);
  @include rsm.responsive-scale(letter-spacing, -1, -0.5);
}

Spacing

.card {
  @include rsm.responsive-scale(padding, 32 48, 16 24);
  @include rsm.responsive-scale(margin-bottom, 24, 16);
}

Dimensions

.button {
  @include rsm.responsive-scale(width, 200, 150);
  @include rsm.responsive-scale(height, 56, 44);
  @include rsm.responsive-scale(border-radius, 8, 6);
}

Percentage-based Properties

.text {
  // Letter-spacing as 1% of font-size
  @include rsm.responsive-scale(letter-spacing, 1, 1, px, true, 48, 32);
}

Override Specificity

.override-bootstrap {
  @include rsm.responsive-scale(
    font-size,
    24,
    16,
    px,
    false,
    null,
    null,
    " !important"
  );
  @include rsm.responsive-scale(
    padding,
    16 32,
    8 16,
    px,
    false,
    null,
    null,
    " !important"
  );
}

πŸ”§ Configuration

Custom Design Widths

Easily customize the design widths to match your project's breakpoints:

:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)

  // Custom design widths (desktop, tablet, mobile)
  @include rsm.responsive-scale-variables(1440px, 768px, 375px);
  // Or use defaults: @include rsm.responsive-scale-variables();
}

Default values:

  • Desktop: 1920px
  • Tablet: 768px
  • Mobile: 390px

REM and EM Units

.element {
  @include rsm.responsive-scale(
    font-size,
    3,
    2,
    rem
  ); // 3rem / 2rem - uses rem scale factor
  @include rsm.responsive-scale(
    font-size,
    2,
    1.5,
    em
  ); // 2em / 1.5em - uses rem scale factor
}

Universal Unit Support:

The mixin supports all CSS units with a single generic scale factor:

Absolute Units:

  • @include responsive-scale(property, value, mobile-value, px) β†’ * valuepx
  • @include responsive-scale(property, value, mobile-value, pt) β†’ * valuept
  • @include responsive-scale(property, value, mobile-value, cm) β†’ * valuecm
  • @include responsive-scale(property, value, mobile-value, mm) β†’ * valuemm
  • @include responsive-scale(property, value, mobile-value, in) β†’ * valuein
  • @include responsive-scale(property, value, mobile-value, pc) β†’ * valuepc

Relative Units:

  • @include responsive-scale(property, value, mobile-value, em) β†’ * valueem
  • @include responsive-scale(property, value, mobile-value, rem) β†’ * valuerem
  • @include responsive-scale(property, value, mobile-value, %) β†’ * value%
  • @include responsive-scale(property, value, mobile-value, vw) β†’ * valuevw
  • @include responsive-scale(property, value, mobile-value, vh) β†’ * valuevh
  • @include responsive-scale(property, value, mobile-value, vmin) β†’ * valuevmin
  • @include responsive-scale(property, value, mobile-value, vmax) β†’ * valuevmax

Example Usage:

.element {
  @include rsm.responsive-scale(margin, 2, 1, cm); // centimeters
  @include rsm.responsive-scale(width, 50, 30, vw); // viewport width
  @include rsm.responsive-scale(height, 80, 60, vh); // viewport height
  @include rsm.responsive-scale(font-size, 1.5, 1, em); // em units
}

Manual CSS Variables (Alternative)

If you prefer manual control, you can set the CSS variables directly:

:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440); // Your desktop width
  --computed-tablet-scale-factor: calc(100vw / 768); // Your tablet width
  --computed-mobile-scale-factor: calc(100vw / 375); // Your mobile width
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

πŸ”§ Troubleshooting

If the @include responsive-scale-variables() mixin doesn't work in your setup (e.g., due to SCSS compilation issues), use the manual CSS variables approach. Below are manual setups for each framework:

Why the Manual Approach Works

The @include responsive-scale-variables() mixin may fail in certain SCSS compilation environments (like some Next.js setups) because the imported mixins aren't processed correctly. The manual CSS variables approach bypasses this by directly defining the required --computed-scale-factor-* variables in :root.

Next.js (App Router) - Manual Setup

// app/globals.css or app/styles/globals.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440); // Your design desktop width
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In component files
@use "responsive-scale-mixins" as rsm;
.my-element {
  @include rsm.responsive-scale(font-size, 24, 16);
}

Next.js (Pages Router) - Manual Setup

// styles/globals.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In component files
@import "responsive-scale-mixins";

Create React App - Manual Setup

// src/index.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In component files
@import "responsive-scale-mixins";

Vue.js - Manual Setup

// src/assets/styles/main.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In component styles
@import "responsive-scale-mixins";

Angular - Manual Setup

// src/styles.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In component styles
@import "responsive-scale-mixins";

Vite + Vue/React - Manual Setup

// src/styles/main.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In components
@import "responsive-scale-mixins";

Gatsby - Manual Setup

// src/styles/global.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In components
@import "responsive-scale-mixins";

Nuxt.js - Manual Setup

// assets/styles/main.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In components
@import "responsive-scale-mixins";

SvelteKit - Manual Setup

// src/app.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In components
@import "responsive-scale-mixins";

Astro - Manual Setup

// src/styles/global.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In components
@import "responsive-scale-mixins";

CSS Modules - Manual Setup

// In your global CSS file (e.g., globals.scss)
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1920);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 390);
  --tablet-proportion-scale-factor: calc((100vw - 390px) / (1920px - 390px));
}

// In your module files
@use "responsive-scale-mixins" as rsm;
.myClass {
  @include rsm.responsive-scale(font-size, 24, 16);
}

Tailwind CSS - Manual Setup

// styles/main.scss
:root {
  // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In components
@use "responsive-scale-mixins" as rsm;
.custom-element {
  @include rsm.responsive-scale(padding, 20 40, 10 20);
  @apply bg-blue-500 text-white;
}

Styled Components - Manual Setup

// In your global styles
:root {
   // Replace 1440 with your design width or leave default (desktop)
  // Replace 768 with your design width or leave default (tablet)
  // Replace 375 with your design width or leave default (mobile)
  --computed-scale-factor: calc(100vw / 1440);
  --computed-tablet-scale-factor: calc(100vw / 768);
  --computed-mobile-scale-factor: calc(100vw / 375);
  --tablet-proportion-scale-factor: calc((100vw - 375px) / (1440px - 375px));
}

// In styled components with SCSS preprocessing
import styled from 'styled-components';
import './styles/responsive-mixins.scss';

const StyledComponent = styled.div`
  ${props => props.theme.responsiveScale('font-size', 24, 16)}
`;

Note: Replace 1440, 768, 375 with your actual design widths. The manual approach ensures compatibility across all build tools and frameworks.

πŸ“± Breakpoints

  • Desktop: β‰₯992px (scales from desktop design width)
  • Tablet: 768px - 991px (interpolated values)
  • Mobile: ≀767px (scales from mobile design width)

πŸ›  Development

Building

npm install
# No build step required - pure SCSS

Testing

npm test

🀝 Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ™ Acknowledgments

  • Inspired by Figma's responsive design principles
  • Built for modern web development workflows
  • Compatible with CSS Modules, Styled Components, and traditional CSS

πŸ§ͺ Testing

The library includes a comprehensive test suite located in the test/ directory:

# Run the test suite (cross-platform)
cd test && ./test.sh

See test/TEST_README.md for detailed testing instructions.

οΏ½πŸ“ž Support


Made with ❀️ by Saheed Odulaja