@react-pdf/stylesheet 5.0.1 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/index.js +38 -14
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { compose, castArray } from '@react-pdf/fns';
1
+ import { compose, castArray, matchPercent } from '@react-pdf/fns';
2
2
  import parse$1 from 'postcss-value-parser/lib/parse.js';
3
3
  import parseUnit from 'postcss-value-parser/lib/unit.js';
4
4
  import hlsToHex from 'hsl-to-hex';
@@ -162,7 +162,7 @@ const processMarginSingle = expandBoxModel({
162
162
  autoSupported: true
163
163
  });
164
164
 
165
- const BORDER_SHORTHAND_REGEX = /(-?\d+(\.\d+)?(px|in|mm|cm|pt|vw|vh|px)?)\s(\S+)\s(.+)/;
165
+ const BORDER_SHORTHAND_REGEX = /(-?\d+(\.\d+)?(in|mm|cm|pt|vw|vh|px|rem)?)\s(\S+)\s(.+)/;
166
166
  const matchBorderShorthand = value => value.match(BORDER_SHORTHAND_REGEX) || [];
167
167
  const expandBorders = (key, value) => {
168
168
  const match = matchBorderShorthand(`${value}`);
@@ -420,7 +420,7 @@ const flatten = compose(mergeStyles, compact, castArray);
420
420
  * @returns {Object} parsed value
421
421
  */
422
422
  const parseValue = value => {
423
- const match = /^(-?\d*\.?\d+)(in|mm|cm|pt|vh|vw|px)?$/g.exec(value);
423
+ const match = /^(-?\d*\.?\d+)(in|mm|cm|pt|vh|vw|px|rem)?$/g.exec(value);
424
424
  return match ? {
425
425
  value: parseFloat(match[1]),
426
426
  unit: match[2] || 'pt'
@@ -439,12 +439,15 @@ const parseValue = value => {
439
439
  */
440
440
  const transformUnit = (container, value) => {
441
441
  const scalar = parseValue(value);
442
- const dpi = 72; // Removed: container.dpi || 72
443
- const mmFactor = 1 / 25.4 * dpi;
444
- const cmFactor = 1 / 2.54 * dpi;
442
+ const outputDpi = 72;
443
+ const inputDpi = container.dpi || 72;
444
+ const mmFactor = 1 / 25.4 * outputDpi;
445
+ const cmFactor = 1 / 2.54 * outputDpi;
445
446
  switch (scalar.unit) {
447
+ case 'rem':
448
+ return scalar.value * (container.remBase || 18);
446
449
  case 'in':
447
- return scalar.value * dpi;
450
+ return scalar.value * outputDpi;
448
451
  case 'mm':
449
452
  return scalar.value * mmFactor;
450
453
  case 'cm':
@@ -453,6 +456,8 @@ const transformUnit = (container, value) => {
453
456
  return scalar.value * (container.height / 100);
454
457
  case 'vw':
455
458
  return scalar.value * (container.width / 100);
459
+ case 'px':
460
+ return Math.round(scalar.value * (outputDpi / inputDpi));
456
461
  default:
457
462
  return scalar.value;
458
463
  }
@@ -642,6 +647,24 @@ const processFontWeight = value => {
642
647
  return value;
643
648
  };
644
649
 
650
+ /* eslint-disable no-restricted-globals */
651
+
652
+ const processLineHeight = (value, styles) => {
653
+ if (value === '') return value;
654
+ const {
655
+ fontSize = 18
656
+ } = styles;
657
+
658
+ // Percent values: use this number multiplied by the element's font size
659
+ const {
660
+ percent
661
+ } = matchPercent(value) || {};
662
+ if (percent) return percent * fontSize;
663
+
664
+ // Unitless values: use this number multiplied by the element's font size
665
+ return isNaN(value) ? value : value * fontSize;
666
+ };
667
+
645
668
  const matchNumber = value => typeof value === 'string' && /^-?\d*\.?\d*$/.test(value);
646
669
  const castFloat = value => {
647
670
  if (typeof value !== 'string') return value;
@@ -671,13 +694,14 @@ const transformTransformOrigin = value => offsetKeyword(value) || castFloat(valu
671
694
  const handlers = {
672
695
  transform: processTransform,
673
696
  fontWeight: processFontWeight,
697
+ lineHeight: processLineHeight,
674
698
  objectPositionX: transformObjectPosition,
675
699
  objectPositionY: transformObjectPosition,
676
700
  transformOriginX: transformTransformOrigin,
677
701
  transformOriginY: transformTransformOrigin
678
702
  };
679
- const transformStyle = (key, value, container) => {
680
- const result = handlers[key] ? handlers[key](value) : value;
703
+ const transformStyle = (key, value, styles, container) => {
704
+ const result = handlers[key] ? handlers[key](value, styles) : value;
681
705
  return transformColor(transformUnit(container, castFloat(result)));
682
706
  };
683
707
 
@@ -693,14 +717,14 @@ const transformStyle = (key, value, container) => {
693
717
  * @param {Object} container
694
718
  * @returns {Transform} transform function
695
719
  */
696
- const transform = container => style => {
697
- if (!style) return style;
698
- const propsArray = Object.keys(style);
720
+ const transform = container => styles => {
721
+ if (!styles) return styles;
722
+ const propsArray = Object.keys(styles);
699
723
  const resolvedStyle = {};
700
724
  for (let i = 0; i < propsArray.length; i += 1) {
701
725
  const key = propsArray[i];
702
- const value = style[key];
703
- const transformed = transformStyle(key, value, container);
726
+ const value = styles[key];
727
+ const transformed = transformStyle(key, value, styles, container);
704
728
  resolvedStyle[key] = transformed;
705
729
  }
706
730
  return resolvedStyle;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-pdf/stylesheet",
3
- "version": "5.0.1",
3
+ "version": "5.2.0",
4
4
  "license": "MIT",
5
5
  "description": "A styles engine for Node and the browser",
6
6
  "author": "Diego Muracciole <diegomuracciole@gmail.com>",