Comments (6)
@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.
Thanks to @jesstelford for helping out, this is live on the site now 👏
from capsize.
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.
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.
from capsize.
Would love a font-size based slider
from capsize.
Related Issues (20)
- Support for variable fonts HOT 5
- Text-overflow: ellipsis is not working HOT 2
- @capsizecss/metrics missing metrics HOT 3
- TailwindCSS Plugin
- Supporting rem as fontSize and lineheight HOT 2
- Latest version of `@capsizecss/metrics` doesn't generate font files HOT 4
- createFontStack returns incorrect values for fonts with the same metrics HOT 2
- Start error HOT 2
- Getting an error when using createTextStyle HOT 2
- capsize_capsizeStyle rules not being built in Remix projects HOT 4
- @capsizecss/unpack fontkit module import error HOT 4
- Font metrics covering all available font weights HOT 3
- Doesn't tsc cleanly to javascript HOT 1
- Document that it's the hhea ascender/descender/lineGap that matter. HOT 8
- Website updated without Font Metrics HOT 11
- Please document how to use capsize with lists HOT 2
- Some combination of values don't wrap the full text height HOT 4
- `text-indent` not applied to Capsize elements HOT 1
- expose xHeight to metrics package HOT 3
- Return numeric values in precomputeValues HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from capsize.