@react-email/button
Advanced tools
+7
-1
| import * as React from 'react'; | ||
| type ButtonProps = Readonly<React.ComponentPropsWithoutRef<"a">>; | ||
| type ButtonProps = Readonly<React.ComponentPropsWithoutRef<'a'>>; | ||
| declare module 'react' { | ||
| interface CSSProperties { | ||
| msoPaddingAlt?: string | number | undefined; | ||
| msoTextRaise?: string | number | undefined; | ||
| } | ||
| } | ||
| declare const Button: React.ForwardRefExoticComponent<Readonly<Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "ref">> & React.RefAttributes<HTMLAnchorElement>>; | ||
| export { Button, type ButtonProps }; |
+7
-1
| import * as React from 'react'; | ||
| type ButtonProps = Readonly<React.ComponentPropsWithoutRef<"a">>; | ||
| type ButtonProps = Readonly<React.ComponentPropsWithoutRef<'a'>>; | ||
| declare module 'react' { | ||
| interface CSSProperties { | ||
| msoPaddingAlt?: string | number | undefined; | ||
| msoTextRaise?: string | number | undefined; | ||
| } | ||
| } | ||
| declare const Button: React.ForwardRefExoticComponent<Readonly<Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "ref">> & React.RefAttributes<HTMLAnchorElement>>; | ||
| export { Button, type ButtonProps }; |
+110
-91
@@ -60,7 +60,7 @@ "use strict"; | ||
| // src/index.ts | ||
| var src_exports = {}; | ||
| __export(src_exports, { | ||
| var index_exports = {}; | ||
| __export(index_exports, { | ||
| Button: () => Button | ||
| }); | ||
| module.exports = __toCommonJS(src_exports); | ||
| module.exports = __toCommonJS(index_exports); | ||
@@ -81,3 +81,3 @@ // src/button.tsx | ||
| if (matches && matches.length === 3) { | ||
| const numValue = parseFloat(matches[1]); | ||
| const numValue = Number.parseFloat(matches[1]); | ||
| const unit = matches[2]; | ||
@@ -97,63 +97,83 @@ switch (unit) { | ||
| } | ||
| } else { | ||
| return 0; | ||
| } | ||
| return 0; | ||
| } | ||
| function parsePadding({ | ||
| padding = "", | ||
| paddingTop, | ||
| paddingRight, | ||
| paddingBottom, | ||
| paddingLeft | ||
| }) { | ||
| let pt = 0; | ||
| let pr = 0; | ||
| let pb = 0; | ||
| let pl = 0; | ||
| if (typeof padding === "number") { | ||
| pt = padding; | ||
| pr = padding; | ||
| pb = padding; | ||
| pl = padding; | ||
| } else { | ||
| const values = padding.split(/\s+/); | ||
| switch (values.length) { | ||
| case 1: | ||
| pt = convertToPx(values[0]); | ||
| pr = convertToPx(values[0]); | ||
| pb = convertToPx(values[0]); | ||
| pl = convertToPx(values[0]); | ||
| break; | ||
| case 2: | ||
| pt = convertToPx(values[0]); | ||
| pb = convertToPx(values[0]); | ||
| pr = convertToPx(values[1]); | ||
| pl = convertToPx(values[1]); | ||
| break; | ||
| case 3: | ||
| pt = convertToPx(values[0]); | ||
| pr = convertToPx(values[1]); | ||
| pl = convertToPx(values[1]); | ||
| pb = convertToPx(values[2]); | ||
| break; | ||
| case 4: | ||
| pt = convertToPx(values[0]); | ||
| pr = convertToPx(values[1]); | ||
| pb = convertToPx(values[2]); | ||
| pl = convertToPx(values[3]); | ||
| break; | ||
| default: | ||
| break; | ||
| function parsePaddingValue(value) { | ||
| if (typeof value === "number") | ||
| return { | ||
| paddingTop: value, | ||
| paddingBottom: value, | ||
| paddingLeft: value, | ||
| paddingRight: value | ||
| }; | ||
| if (typeof value === "string") { | ||
| const values = value.toString().trim().split(/\s+/); | ||
| if (values.length === 1) { | ||
| return { | ||
| paddingTop: values[0], | ||
| paddingBottom: values[0], | ||
| paddingLeft: values[0], | ||
| paddingRight: values[0] | ||
| }; | ||
| } | ||
| if (values.length === 2) { | ||
| return { | ||
| paddingTop: values[0], | ||
| paddingRight: values[1], | ||
| paddingBottom: values[0], | ||
| paddingLeft: values[1] | ||
| }; | ||
| } | ||
| if (values.length === 3) { | ||
| return { | ||
| paddingTop: values[0], | ||
| paddingRight: values[1], | ||
| paddingBottom: values[2], | ||
| paddingLeft: values[1] | ||
| }; | ||
| } | ||
| if (values.length === 4) { | ||
| return { | ||
| paddingTop: values[0], | ||
| paddingRight: values[1], | ||
| paddingBottom: values[2], | ||
| paddingLeft: values[3] | ||
| }; | ||
| } | ||
| } | ||
| return { | ||
| pt: paddingTop ? convertToPx(paddingTop) : pt, | ||
| pr: paddingRight ? convertToPx(paddingRight) : pr, | ||
| pb: paddingBottom ? convertToPx(paddingBottom) : pb, | ||
| pl: paddingLeft ? convertToPx(paddingLeft) : pl | ||
| paddingTop: void 0, | ||
| paddingBottom: void 0, | ||
| paddingLeft: void 0, | ||
| paddingRight: void 0 | ||
| }; | ||
| } | ||
| function parsePadding(properties) { | ||
| let paddingTop; | ||
| let paddingRight; | ||
| let paddingBottom; | ||
| let paddingLeft; | ||
| for (const [key, value] of Object.entries(properties)) { | ||
| if (key === "padding") { | ||
| ({ paddingTop, paddingBottom, paddingLeft, paddingRight } = parsePaddingValue(value)); | ||
| } else if (key === "paddingTop") { | ||
| paddingTop = value; | ||
| } else if (key === "paddingRight") { | ||
| paddingRight = value; | ||
| } else if (key === "paddingBottom") { | ||
| paddingBottom = value; | ||
| } else if (key === "paddingLeft") { | ||
| paddingLeft = value; | ||
| } | ||
| } | ||
| return { | ||
| paddingTop: paddingTop ? convertToPx(paddingTop) : void 0, | ||
| paddingRight: paddingRight ? convertToPx(paddingRight) : void 0, | ||
| paddingBottom: paddingBottom ? convertToPx(paddingBottom) : void 0, | ||
| paddingLeft: paddingLeft ? convertToPx(paddingLeft) : void 0 | ||
| }; | ||
| } | ||
| // src/utils/px-to-pt.ts | ||
| var pxToPt = (px) => typeof px === "number" && !isNaN(Number(px)) ? px * 3 / 4 : null; | ||
| var pxToPt = (px) => typeof px === "number" && !Number.isNaN(Number(px)) ? px * 3 / 4 : void 0; | ||
@@ -170,3 +190,3 @@ // src/button.tsx | ||
| } | ||
| return Infinity; | ||
| return Number.POSITIVE_INFINITY; | ||
| }; | ||
@@ -181,14 +201,11 @@ while (computeRequiredFontWidth() > maxFontWidth) { | ||
| var _b = _a, { children, style, target = "_blank" } = _b, props = __objRest(_b, ["children", "style", "target"]); | ||
| var _a2, _b2, _c, _d; | ||
| const { pt, pr, pb, pl } = parsePadding({ | ||
| padding: style == null ? void 0 : style.padding, | ||
| paddingLeft: (_a2 = style == null ? void 0 : style.paddingLeft) != null ? _a2 : style == null ? void 0 : style.paddingInline, | ||
| paddingRight: (_b2 = style == null ? void 0 : style.paddingRight) != null ? _b2 : style == null ? void 0 : style.paddingInline, | ||
| paddingTop: (_c = style == null ? void 0 : style.paddingTop) != null ? _c : style == null ? void 0 : style.paddingBlock, | ||
| paddingBottom: (_d = style == null ? void 0 : style.paddingBottom) != null ? _d : style == null ? void 0 : style.paddingBlock | ||
| }); | ||
| const y = pt + pb; | ||
| const { paddingTop, paddingRight, paddingBottom, paddingLeft } = parsePadding(style != null ? style : {}); | ||
| const y = (paddingTop != null ? paddingTop : 0) + (paddingBottom != null ? paddingBottom : 0); | ||
| const textRaise = pxToPt(y); | ||
| const [plFontWidth, plSpaceCount] = computeFontWidthAndSpaceCount(pl); | ||
| const [prFontWidth, prSpaceCount] = computeFontWidthAndSpaceCount(pr); | ||
| const [plFontWidth, plSpaceCount] = computeFontWidthAndSpaceCount( | ||
| paddingLeft != null ? paddingLeft : 0 | ||
| ); | ||
| const [prFontWidth, prSpaceCount] = computeFontWidthAndSpaceCount( | ||
| paddingRight != null ? paddingRight : 0 | ||
| ); | ||
| return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)( | ||
@@ -198,3 +215,14 @@ "a", | ||
| ref, | ||
| style: buttonStyle(__spreadProps(__spreadValues({}, style), { pt, pr, pb, pl })), | ||
| style: __spreadProps(__spreadValues({ | ||
| lineHeight: "100%", | ||
| textDecoration: "none", | ||
| display: "inline-block", | ||
| maxWidth: "100%", | ||
| msoPaddingAlt: "0px" | ||
| }, style), { | ||
| paddingTop, | ||
| paddingRight, | ||
| paddingBottom, | ||
| paddingLeft | ||
| }), | ||
| target, | ||
@@ -217,6 +245,18 @@ children: [ | ||
| ), | ||
| /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: buttonTextStyle(pb), children }), | ||
| /* @__PURE__ */ (0, import_jsx_runtime.jsx)( | ||
| "span", | ||
| { | ||
| style: { | ||
| maxWidth: "100%", | ||
| display: "inline-block", | ||
| lineHeight: "120%", | ||
| msoPaddingAlt: "0px", | ||
| msoTextRaise: pxToPt(paddingBottom) | ||
| }, | ||
| children | ||
| } | ||
| ), | ||
| /* @__PURE__ */ (0, import_jsx_runtime.jsx)( | ||
| "span", | ||
| { | ||
| dangerouslySetInnerHTML: { | ||
@@ -235,23 +275,2 @@ __html: `<!--[if mso]><i style="mso-font-width:${prFontWidth * 100}%" hidden>${" ".repeat( | ||
| Button.displayName = "Button"; | ||
| var buttonStyle = (style) => { | ||
| const _a = style || {}, { pt, pr, pb, pl } = _a, rest = __objRest(_a, ["pt", "pr", "pb", "pl"]); | ||
| return __spreadProps(__spreadValues({ | ||
| lineHeight: "100%", | ||
| textDecoration: "none", | ||
| display: "inline-block", | ||
| maxWidth: "100%", | ||
| msoPaddingAlt: "0px" | ||
| }, rest), { | ||
| padding: `${pt}px ${pr}px ${pb}px ${pl}px` | ||
| }); | ||
| }; | ||
| var buttonTextStyle = (pb) => { | ||
| return { | ||
| maxWidth: "100%", | ||
| display: "inline-block", | ||
| lineHeight: "120%", | ||
| msoPaddingAlt: "0px", | ||
| msoTextRaise: pxToPt(pb || 0) | ||
| }; | ||
| }; | ||
| // Annotate the CommonJS export names for ESM import in node: | ||
@@ -258,0 +277,0 @@ 0 && (module.exports = { |
+107
-88
@@ -47,3 +47,3 @@ var __defProp = Object.defineProperty; | ||
| if (matches && matches.length === 3) { | ||
| const numValue = parseFloat(matches[1]); | ||
| const numValue = Number.parseFloat(matches[1]); | ||
| const unit = matches[2]; | ||
@@ -63,63 +63,83 @@ switch (unit) { | ||
| } | ||
| } else { | ||
| return 0; | ||
| } | ||
| return 0; | ||
| } | ||
| function parsePadding({ | ||
| padding = "", | ||
| paddingTop, | ||
| paddingRight, | ||
| paddingBottom, | ||
| paddingLeft | ||
| }) { | ||
| let pt = 0; | ||
| let pr = 0; | ||
| let pb = 0; | ||
| let pl = 0; | ||
| if (typeof padding === "number") { | ||
| pt = padding; | ||
| pr = padding; | ||
| pb = padding; | ||
| pl = padding; | ||
| } else { | ||
| const values = padding.split(/\s+/); | ||
| switch (values.length) { | ||
| case 1: | ||
| pt = convertToPx(values[0]); | ||
| pr = convertToPx(values[0]); | ||
| pb = convertToPx(values[0]); | ||
| pl = convertToPx(values[0]); | ||
| break; | ||
| case 2: | ||
| pt = convertToPx(values[0]); | ||
| pb = convertToPx(values[0]); | ||
| pr = convertToPx(values[1]); | ||
| pl = convertToPx(values[1]); | ||
| break; | ||
| case 3: | ||
| pt = convertToPx(values[0]); | ||
| pr = convertToPx(values[1]); | ||
| pl = convertToPx(values[1]); | ||
| pb = convertToPx(values[2]); | ||
| break; | ||
| case 4: | ||
| pt = convertToPx(values[0]); | ||
| pr = convertToPx(values[1]); | ||
| pb = convertToPx(values[2]); | ||
| pl = convertToPx(values[3]); | ||
| break; | ||
| default: | ||
| break; | ||
| function parsePaddingValue(value) { | ||
| if (typeof value === "number") | ||
| return { | ||
| paddingTop: value, | ||
| paddingBottom: value, | ||
| paddingLeft: value, | ||
| paddingRight: value | ||
| }; | ||
| if (typeof value === "string") { | ||
| const values = value.toString().trim().split(/\s+/); | ||
| if (values.length === 1) { | ||
| return { | ||
| paddingTop: values[0], | ||
| paddingBottom: values[0], | ||
| paddingLeft: values[0], | ||
| paddingRight: values[0] | ||
| }; | ||
| } | ||
| if (values.length === 2) { | ||
| return { | ||
| paddingTop: values[0], | ||
| paddingRight: values[1], | ||
| paddingBottom: values[0], | ||
| paddingLeft: values[1] | ||
| }; | ||
| } | ||
| if (values.length === 3) { | ||
| return { | ||
| paddingTop: values[0], | ||
| paddingRight: values[1], | ||
| paddingBottom: values[2], | ||
| paddingLeft: values[1] | ||
| }; | ||
| } | ||
| if (values.length === 4) { | ||
| return { | ||
| paddingTop: values[0], | ||
| paddingRight: values[1], | ||
| paddingBottom: values[2], | ||
| paddingLeft: values[3] | ||
| }; | ||
| } | ||
| } | ||
| return { | ||
| pt: paddingTop ? convertToPx(paddingTop) : pt, | ||
| pr: paddingRight ? convertToPx(paddingRight) : pr, | ||
| pb: paddingBottom ? convertToPx(paddingBottom) : pb, | ||
| pl: paddingLeft ? convertToPx(paddingLeft) : pl | ||
| paddingTop: void 0, | ||
| paddingBottom: void 0, | ||
| paddingLeft: void 0, | ||
| paddingRight: void 0 | ||
| }; | ||
| } | ||
| function parsePadding(properties) { | ||
| let paddingTop; | ||
| let paddingRight; | ||
| let paddingBottom; | ||
| let paddingLeft; | ||
| for (const [key, value] of Object.entries(properties)) { | ||
| if (key === "padding") { | ||
| ({ paddingTop, paddingBottom, paddingLeft, paddingRight } = parsePaddingValue(value)); | ||
| } else if (key === "paddingTop") { | ||
| paddingTop = value; | ||
| } else if (key === "paddingRight") { | ||
| paddingRight = value; | ||
| } else if (key === "paddingBottom") { | ||
| paddingBottom = value; | ||
| } else if (key === "paddingLeft") { | ||
| paddingLeft = value; | ||
| } | ||
| } | ||
| return { | ||
| paddingTop: paddingTop ? convertToPx(paddingTop) : void 0, | ||
| paddingRight: paddingRight ? convertToPx(paddingRight) : void 0, | ||
| paddingBottom: paddingBottom ? convertToPx(paddingBottom) : void 0, | ||
| paddingLeft: paddingLeft ? convertToPx(paddingLeft) : void 0 | ||
| }; | ||
| } | ||
| // src/utils/px-to-pt.ts | ||
| var pxToPt = (px) => typeof px === "number" && !isNaN(Number(px)) ? px * 3 / 4 : null; | ||
| var pxToPt = (px) => typeof px === "number" && !Number.isNaN(Number(px)) ? px * 3 / 4 : void 0; | ||
@@ -136,3 +156,3 @@ // src/button.tsx | ||
| } | ||
| return Infinity; | ||
| return Number.POSITIVE_INFINITY; | ||
| }; | ||
@@ -147,14 +167,11 @@ while (computeRequiredFontWidth() > maxFontWidth) { | ||
| var _b = _a, { children, style, target = "_blank" } = _b, props = __objRest(_b, ["children", "style", "target"]); | ||
| var _a2, _b2, _c, _d; | ||
| const { pt, pr, pb, pl } = parsePadding({ | ||
| padding: style == null ? void 0 : style.padding, | ||
| paddingLeft: (_a2 = style == null ? void 0 : style.paddingLeft) != null ? _a2 : style == null ? void 0 : style.paddingInline, | ||
| paddingRight: (_b2 = style == null ? void 0 : style.paddingRight) != null ? _b2 : style == null ? void 0 : style.paddingInline, | ||
| paddingTop: (_c = style == null ? void 0 : style.paddingTop) != null ? _c : style == null ? void 0 : style.paddingBlock, | ||
| paddingBottom: (_d = style == null ? void 0 : style.paddingBottom) != null ? _d : style == null ? void 0 : style.paddingBlock | ||
| }); | ||
| const y = pt + pb; | ||
| const { paddingTop, paddingRight, paddingBottom, paddingLeft } = parsePadding(style != null ? style : {}); | ||
| const y = (paddingTop != null ? paddingTop : 0) + (paddingBottom != null ? paddingBottom : 0); | ||
| const textRaise = pxToPt(y); | ||
| const [plFontWidth, plSpaceCount] = computeFontWidthAndSpaceCount(pl); | ||
| const [prFontWidth, prSpaceCount] = computeFontWidthAndSpaceCount(pr); | ||
| const [plFontWidth, plSpaceCount] = computeFontWidthAndSpaceCount( | ||
| paddingLeft != null ? paddingLeft : 0 | ||
| ); | ||
| const [prFontWidth, prSpaceCount] = computeFontWidthAndSpaceCount( | ||
| paddingRight != null ? paddingRight : 0 | ||
| ); | ||
| return /* @__PURE__ */ jsxs( | ||
@@ -164,3 +181,14 @@ "a", | ||
| ref, | ||
| style: buttonStyle(__spreadProps(__spreadValues({}, style), { pt, pr, pb, pl })), | ||
| style: __spreadProps(__spreadValues({ | ||
| lineHeight: "100%", | ||
| textDecoration: "none", | ||
| display: "inline-block", | ||
| maxWidth: "100%", | ||
| msoPaddingAlt: "0px" | ||
| }, style), { | ||
| paddingTop, | ||
| paddingRight, | ||
| paddingBottom, | ||
| paddingLeft | ||
| }), | ||
| target, | ||
@@ -183,6 +211,18 @@ children: [ | ||
| ), | ||
| /* @__PURE__ */ jsx("span", { style: buttonTextStyle(pb), children }), | ||
| /* @__PURE__ */ jsx( | ||
| "span", | ||
| { | ||
| style: { | ||
| maxWidth: "100%", | ||
| display: "inline-block", | ||
| lineHeight: "120%", | ||
| msoPaddingAlt: "0px", | ||
| msoTextRaise: pxToPt(paddingBottom) | ||
| }, | ||
| children | ||
| } | ||
| ), | ||
| /* @__PURE__ */ jsx( | ||
| "span", | ||
| { | ||
| dangerouslySetInnerHTML: { | ||
@@ -201,25 +241,4 @@ __html: `<!--[if mso]><i style="mso-font-width:${prFontWidth * 100}%" hidden>${" ".repeat( | ||
| Button.displayName = "Button"; | ||
| var buttonStyle = (style) => { | ||
| const _a = style || {}, { pt, pr, pb, pl } = _a, rest = __objRest(_a, ["pt", "pr", "pb", "pl"]); | ||
| return __spreadProps(__spreadValues({ | ||
| lineHeight: "100%", | ||
| textDecoration: "none", | ||
| display: "inline-block", | ||
| maxWidth: "100%", | ||
| msoPaddingAlt: "0px" | ||
| }, rest), { | ||
| padding: `${pt}px ${pr}px ${pb}px ${pl}px` | ||
| }); | ||
| }; | ||
| var buttonTextStyle = (pb) => { | ||
| return { | ||
| maxWidth: "100%", | ||
| display: "inline-block", | ||
| lineHeight: "120%", | ||
| msoPaddingAlt: "0px", | ||
| msoTextRaise: pxToPt(pb || 0) | ||
| }; | ||
| }; | ||
| export { | ||
| Button | ||
| }; |
+3
-5
| { | ||
| "name": "@react-email/button", | ||
| "version": "0.0.19", | ||
| "version": "0.1.0-canary.0", | ||
| "description": "A link that is styled to look like a button", | ||
@@ -41,5 +41,4 @@ "sideEffects": false, | ||
| "devDependencies": { | ||
| "typescript": "5.1.6", | ||
| "@react-email/render": "1.0.3", | ||
| "eslint-config-custom": "0.0.0", | ||
| "typescript": "5.8.3", | ||
| "@react-email/render": "1.1.2-canary.0", | ||
| "tsconfig": "0.0.0" | ||
@@ -54,3 +53,2 @@ }, | ||
| "dev": "tsup src/index.ts --format esm,cjs --dts --external react --watch", | ||
| "lint": "eslint .", | ||
| "test:watch": "vitest", | ||
@@ -57,0 +55,0 @@ "test": "vitest run" |
22975
4.1%3
-25%509
9.46%