Giter Club home page Giter Club logo

Comments (6)

michaeltaranto avatar michaeltaranto commented on May 27, 2024 5

@apkoponen I caught up with @jesstelford and feel that the issues i found previously may no longer be a problem.

Planning to include fontSize support, just working on getting the package published and initial documentation first.

from capsize.

michaeltaranto avatar michaeltaranto commented on May 27, 2024 3

Thanks to @jesstelford for helping out, this is live on the site now 👏

from capsize.

jesstelford avatar jesstelford commented on May 27, 2024 2

I did a bit of hacking on this and landed here which lets you do what I wanted above.

NOTE: This may get out of date with Capsize very quickly, so I wouldn't rely on it for anything in production. It's just a proof of concept.

// Modified from https://github.com/seek-oss/capsize/blob/47ad276443609559096f4d95d45de387f97a037b/packages/capsize/src/index.ts

const preventCollapse = 1;

module.exports = function capsize({
  leading,
  gap,
  capHeight,
  fontSize,
  fontMetrics,
}) {
  if (typeof leading !== 'undefined' && typeof gap !== 'undefined') {
    throw new Error(
      'Only a single line height style can be provided. Please pass either `gap` OR `leading`.'
    );
  }

  if (typeof capHeight !== 'undefined' && typeof fontSize !== 'undefined') {
    throw new Error('Please pass either `capHeight` OR `fontSize`, not both.');
  }

  const capHeightScale = fontMetrics.capHeight / fontMetrics.unitsPerEm;

  let specifiedFontSize;
  let specifiedCapHeight;

  if (typeof fontSize !== 'undefined') {
    specifiedFontSize = fontSize;
    specifiedCapHeight = fontSize * capHeightScale;
  } else {
    specifiedFontSize = capHeight / capHeightScale;
    specifiedCapHeight = capHeight;
  }

  const specifiedLineHeight =
    typeof gap !== 'undefined' ? specifiedCapHeight + gap : leading;

  return createCss({
    specifiedLineHeight,
    fontSize: specifiedFontSize,
    fontMetrics,
  });
};

function createCss({ specifiedLineHeight, fontSize, fontMetrics }) {
  const capHeightScale = fontMetrics.capHeight / fontMetrics.unitsPerEm;
  const toScale = (value) => value / fontSize;

  const absoluteDescent = Math.abs(fontMetrics.descent);
  const descentScale = absoluteDescent / fontMetrics.unitsPerEm;
  const ascentScale = fontMetrics.ascent / fontMetrics.unitsPerEm;
  const contentArea = fontMetrics.ascent + absoluteDescent;
  const lineHeight = contentArea + fontMetrics.lineGap;
  const lineHeightScale = lineHeight / fontMetrics.unitsPerEm;
  const lineHeightNormal = lineHeightScale * fontSize;

  const hasSpecifiedLineHeight = typeof specifiedLineHeight !== 'undefined';

  const specifiedLineHeightOffset =
    hasSpecifiedLineHeight && typeof specifiedLineHeight === 'number'
      ? (lineHeightNormal - specifiedLineHeight) / 2
      : 0;

  const leadingTrim = (value) =>
    value - toScale(specifiedLineHeightOffset) + toScale(preventCollapse);

  return {
    fontSize: `${fontSize}px`,
    ...(hasSpecifiedLineHeight && { lineHeight: `${specifiedLineHeight}px` }),
    paddingTop: `${preventCollapse}px`,
    paddingBottom: `${preventCollapse}px`,
    ':before': {
      content: "''",
      marginTop: `-${leadingTrim(ascentScale - capHeightScale)}em`,
      display: 'block',
      height: 0,
    },
    ':after': {
      content: "''",
      marginBottom: `-${leadingTrim(descentScale)}em`,
      display: 'block',
      height: 0,
    },
  };
}

from capsize.

apkoponen avatar apkoponen commented on May 27, 2024 1

I'm transitioning tailwind-baseline (https://github.com/apkoponen/tailwind-baseline) to capsize and would love this too!

@michaeltaranto mentioned here https://twitter.com/michaeltaranto/status/1280820444275208192 that "it [font-size based calculations] introduces other problems that might not be obvious." Are these issues addressed in @jesstelford's code above or is there something I should be aware of?

from capsize.

apkoponen avatar apkoponen commented on May 27, 2024 1

from capsize.

jan-dh avatar jan-dh commented on May 27, 2024

Would love a font-size based slider

from capsize.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.