@depup/react-email 5.2.10-depup.0 → 6.9.0-depup.1
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.
- package/CHANGELOG.md +313 -0
- package/README.md +11 -10
- package/changes.json +21 -17
- package/dev/CHANGELOG.md +2 -0
- package/dev/index.js +1 -1
- package/dev/package.json +1 -1
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cli/index.mjs +7801 -0
- package/dist/components/body/body.cjs +39 -0
- package/dist/components/body/body.d.cts +7 -0
- package/dist/components/body/body.d.mts +7 -0
- package/dist/components/body/body.mjs +37 -0
- package/dist/components/body/index.d.cts +1 -0
- package/dist/components/body/index.d.mts +1 -0
- package/dist/components/body/margin-properties.cjs +30 -0
- package/dist/components/body/margin-properties.mjs +29 -0
- package/dist/components/button/button.cjs +64 -0
- package/dist/components/button/button.d.cts +13 -0
- package/dist/components/button/button.d.mts +13 -0
- package/dist/components/button/button.mjs +62 -0
- package/dist/components/button/index.d.cts +1 -0
- package/dist/components/button/index.d.mts +1 -0
- package/dist/components/button/utils/parse-padding.cjs +90 -0
- package/dist/components/button/utils/parse-padding.mjs +90 -0
- package/dist/components/button/utils/px-to-pt.cjs +4 -0
- package/dist/components/button/utils/px-to-pt.mjs +4 -0
- package/dist/components/code-block/code-block.cjs +79 -0
- package/dist/components/code-block/code-block.d.cts +20 -0
- package/dist/components/code-block/code-block.d.mts +20 -0
- package/dist/components/code-block/code-block.mjs +77 -0
- package/dist/components/code-block/index.d.cts +3 -0
- package/dist/components/code-block/index.d.mts +3 -0
- package/dist/components/code-block/languages-available.d.cts +4 -0
- package/dist/components/code-block/languages-available.d.mts +4 -0
- package/dist/components/code-block/prism.cjs +14564 -0
- package/dist/components/code-block/prism.mjs +14562 -0
- package/dist/components/code-block/themes.cjs +2578 -0
- package/dist/components/code-block/themes.d.cts +4877 -0
- package/dist/components/code-block/themes.d.mts +4877 -0
- package/dist/components/code-block/themes.mjs +2541 -0
- package/dist/components/code-inline/code-inline.cjs +43 -0
- package/dist/components/code-inline/code-inline.d.cts +12 -0
- package/dist/components/code-inline/code-inline.d.mts +12 -0
- package/dist/components/code-inline/code-inline.mjs +41 -0
- package/dist/components/code-inline/index.d.cts +1 -0
- package/dist/components/code-inline/index.d.mts +1 -0
- package/dist/components/column/column.cjs +19 -0
- package/dist/components/column/column.d.cts +7 -0
- package/dist/components/column/column.d.mts +7 -0
- package/dist/components/column/column.mjs +17 -0
- package/dist/components/column/index.d.cts +1 -0
- package/dist/components/column/index.d.mts +1 -0
- package/dist/components/container/container.cjs +42 -0
- package/dist/components/container/container.d.cts +7 -0
- package/dist/components/container/container.d.mts +7 -0
- package/dist/components/container/container.mjs +40 -0
- package/dist/components/container/index.d.cts +1 -0
- package/dist/components/container/index.d.mts +1 -0
- package/dist/components/element-marker.cjs +8 -0
- package/dist/components/element-marker.mjs +7 -0
- package/dist/components/font/font.cjs +22 -0
- package/dist/components/font/font.d.cts +26 -0
- package/dist/components/font/font.d.mts +26 -0
- package/dist/components/font/font.mjs +21 -0
- package/dist/components/font/index.d.cts +1 -0
- package/dist/components/font/index.d.mts +1 -0
- package/dist/components/head/head.cjs +20 -0
- package/dist/components/head/head.d.cts +7 -0
- package/dist/components/head/head.d.mts +7 -0
- package/dist/components/head/head.mjs +18 -0
- package/dist/components/head/index.d.cts +1 -0
- package/dist/components/head/index.d.mts +1 -0
- package/dist/components/heading/heading.cjs +30 -0
- package/dist/components/heading/heading.d.cts +22 -0
- package/dist/components/heading/heading.d.mts +22 -0
- package/dist/components/heading/heading.mjs +28 -0
- package/dist/components/heading/index.d.cts +1 -0
- package/dist/components/heading/index.d.mts +1 -0
- package/dist/components/heading/utils/as.d.cts +16 -0
- package/dist/components/heading/utils/as.d.mts +16 -0
- package/dist/components/heading/utils/spaces.cjs +24 -0
- package/dist/components/heading/utils/spaces.d.cts +14 -0
- package/dist/components/heading/utils/spaces.d.mts +14 -0
- package/dist/components/heading/utils/spaces.mjs +24 -0
- package/dist/components/hr/hr.cjs +21 -0
- package/dist/components/hr/hr.d.cts +7 -0
- package/dist/components/hr/hr.d.mts +7 -0
- package/dist/components/hr/hr.mjs +19 -0
- package/dist/components/hr/index.d.cts +1 -0
- package/dist/components/hr/index.d.mts +1 -0
- package/dist/components/html/html.cjs +15 -0
- package/dist/components/html/html.d.cts +7 -0
- package/dist/components/html/html.d.mts +7 -0
- package/dist/components/html/html.mjs +13 -0
- package/dist/components/html/index.d.cts +1 -0
- package/dist/components/html/index.d.mts +1 -0
- package/dist/components/img/img.cjs +25 -0
- package/dist/components/img/img.d.cts +7 -0
- package/dist/components/img/img.d.mts +7 -0
- package/dist/components/img/img.mjs +23 -0
- package/dist/components/img/index.d.cts +1 -0
- package/dist/components/img/index.d.mts +1 -0
- package/dist/components/index.d.cts +24 -0
- package/dist/components/index.d.mts +24 -0
- package/dist/components/link/index.d.cts +1 -0
- package/dist/components/link/index.d.mts +1 -0
- package/dist/components/link/link.cjs +21 -0
- package/dist/components/link/link.d.cts +7 -0
- package/dist/components/link/link.d.mts +7 -0
- package/dist/components/link/link.mjs +19 -0
- package/dist/components/markdown/index.d.cts +1 -0
- package/dist/components/markdown/index.d.mts +1 -0
- package/dist/components/markdown/markdown.cjs +101 -0
- package/dist/components/markdown/markdown.d.cts +16 -0
- package/dist/components/markdown/markdown.d.mts +16 -0
- package/dist/components/markdown/markdown.mjs +99 -0
- package/dist/components/markdown/styles.cjs +92 -0
- package/dist/components/markdown/styles.d.cts +31 -0
- package/dist/components/markdown/styles.d.mts +31 -0
- package/dist/components/markdown/styles.mjs +92 -0
- package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.cjs +60 -0
- package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.mjs +60 -0
- package/dist/components/preview/index.d.cts +1 -0
- package/dist/components/preview/index.d.mts +1 -0
- package/dist/components/preview/preview.cjs +34 -0
- package/dist/components/preview/preview.d.cts +21 -0
- package/dist/components/preview/preview.d.mts +21 -0
- package/dist/components/preview/preview.mjs +31 -0
- package/dist/components/row/index.d.cts +1 -0
- package/dist/components/row/index.d.mts +1 -0
- package/dist/components/row/row.cjs +30 -0
- package/dist/components/row/row.d.cts +11 -0
- package/dist/components/row/row.d.mts +11 -0
- package/dist/components/row/row.mjs +28 -0
- package/dist/components/section/index.d.cts +1 -0
- package/dist/components/section/index.d.mts +1 -0
- package/dist/components/section/section.cjs +36 -0
- package/dist/components/section/section.d.cts +7 -0
- package/dist/components/section/section.d.mts +7 -0
- package/dist/components/section/section.mjs +34 -0
- package/dist/components/tailwind/hooks/use-suspended-promise.cjs +15 -0
- package/dist/components/tailwind/hooks/use-suspended-promise.mjs +15 -0
- package/dist/components/tailwind/index.d.cts +4 -0
- package/dist/components/tailwind/index.d.mts +4 -0
- package/dist/components/tailwind/inline-styles.cjs +11 -0
- package/dist/components/tailwind/inline-styles.d.cts +6 -0
- package/dist/components/tailwind/inline-styles.d.mts +6 -0
- package/dist/components/tailwind/inline-styles.mjs +11 -0
- package/dist/components/tailwind/sanitize-stylesheet.cjs +11 -0
- package/dist/components/tailwind/sanitize-stylesheet.d.cts +6 -0
- package/dist/components/tailwind/sanitize-stylesheet.d.mts +6 -0
- package/dist/components/tailwind/sanitize-stylesheet.mjs +11 -0
- package/dist/components/tailwind/tailwind.cjs +120 -0
- package/dist/components/tailwind/tailwind.d.cts +25 -0
- package/dist/components/tailwind/tailwind.d.mts +25 -0
- package/dist/components/tailwind/tailwind.mjs +117 -0
- package/dist/components/tailwind/utils/compatibility/get-react-property.cjs +10 -0
- package/dist/components/tailwind/utils/compatibility/get-react-property.mjs +10 -0
- package/dist/components/tailwind/utils/compatibility/sanitize-class-name.cjs +26 -0
- package/dist/components/tailwind/utils/compatibility/sanitize-class-name.mjs +26 -0
- package/dist/components/tailwind/utils/css/downlevel-for-email-clients.cjs +126 -0
- package/dist/components/tailwind/utils/css/downlevel-for-email-clients.mjs +125 -0
- package/dist/components/tailwind/utils/css/extract-rules-per-class.cjs +45 -0
- package/dist/components/tailwind/utils/css/extract-rules-per-class.mjs +44 -0
- package/dist/components/tailwind/utils/css/get-custom-properties.cjs +35 -0
- package/dist/components/tailwind/utils/css/get-custom-properties.mjs +34 -0
- package/dist/components/tailwind/utils/css/is-part-inlinable.cjs +10 -0
- package/dist/components/tailwind/utils/css/is-part-inlinable.mjs +9 -0
- package/dist/components/tailwind/utils/css/is-rule-inlinable.cjs +10 -0
- package/dist/components/tailwind/utils/css/is-rule-inlinable.mjs +9 -0
- package/dist/components/tailwind/utils/css/make-inline-styles-for.cjs +52 -0
- package/dist/components/tailwind/utils/css/make-inline-styles-for.mjs +51 -0
- package/dist/components/tailwind/utils/css/resolve-all-css-variables.cjs +89 -0
- package/dist/components/tailwind/utils/css/resolve-all-css-variables.mjs +88 -0
- package/dist/components/tailwind/utils/css/resolve-calc-expressions.cjs +92 -0
- package/dist/components/tailwind/utils/css/resolve-calc-expressions.mjs +91 -0
- package/dist/components/tailwind/utils/css/sanitize-declarations.cjs +310 -0
- package/dist/components/tailwind/utils/css/sanitize-declarations.mjs +309 -0
- package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.cjs +46 -0
- package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.mjs +45 -0
- package/dist/components/tailwind/utils/css/split-mixed-rule.cjs +41 -0
- package/dist/components/tailwind/utils/css/split-mixed-rule.mjs +40 -0
- package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.cjs +52 -0
- package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.mjs +51 -0
- package/dist/components/tailwind/utils/css/unwrap-value.cjs +7 -0
- package/dist/components/tailwind/utils/css/unwrap-value.mjs +7 -0
- package/dist/components/tailwind/utils/react/is-component.cjs +7 -0
- package/dist/components/tailwind/utils/react/is-component.mjs +7 -0
- package/dist/components/tailwind/utils/react/map-react-tree.cjs +32 -0
- package/dist/components/tailwind/utils/react/map-react-tree.mjs +30 -0
- package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.cjs +37 -0
- package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.mjs +35 -0
- package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.cjs +77 -0
- package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.cts +19 -0
- package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.mts +19 -0
- package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.mjs +76 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.cjs +901 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.mjs +901 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.cjs +398 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.mjs +398 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.cjs +467 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.mjs +467 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.cjs +6 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.mjs +6 -0
- package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.cjs +6 -0
- package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.mjs +6 -0
- package/dist/components/text/index.d.cts +1 -0
- package/dist/components/text/index.d.mts +1 -0
- package/dist/components/text/text.cjs +43 -0
- package/dist/components/text/text.d.cts +7 -0
- package/dist/components/text/text.d.mts +7 -0
- package/dist/components/text/text.mjs +41 -0
- package/dist/components/text/utils/compute-margins.cjs +62 -0
- package/dist/components/text/utils/compute-margins.mjs +62 -0
- package/dist/index.cjs +95 -0
- package/dist/index.d.cts +26 -0
- package/dist/index.d.mts +26 -0
- package/dist/index.mjs +25 -7326
- package/package.json +64 -32
- package/src/components/body/__snapshots__/body.spec.tsx.snap +23 -0
- package/src/components/body/body.spec.tsx +78 -0
- package/src/components/body/body.tsx +62 -0
- package/src/components/body/index.ts +1 -0
- package/src/components/body/margin-properties.ts +27 -0
- package/src/components/button/button.spec.tsx +53 -0
- package/src/components/button/button.tsx +114 -0
- package/src/components/button/index.ts +1 -0
- package/src/components/button/utils/parse-padding.ts +137 -0
- package/src/components/button/utils/px-to-pt.ts +4 -0
- package/src/components/button/utils/utils.spec.ts +153 -0
- package/src/components/code-block/code-block.tsx +136 -0
- package/src/components/code-block/index.ts +3 -0
- package/src/components/code-block/languages-available.ts +402 -0
- package/src/components/code-block/prism.ts +15618 -0
- package/src/components/code-block/themes.ts +4929 -0
- package/src/components/code-inline/code-inline.tsx +60 -0
- package/src/components/code-inline/index.ts +1 -0
- package/src/components/column/column.spec.tsx +28 -0
- package/src/components/column/column.tsx +17 -0
- package/src/components/column/index.ts +1 -0
- package/src/components/container/container.spec.tsx +33 -0
- package/src/components/container/container.tsx +59 -0
- package/src/components/container/index.ts +1 -0
- package/src/components/element-marker.ts +5 -0
- package/src/components/font/font.spec.tsx +63 -0
- package/src/components/font/font.tsx +76 -0
- package/src/components/font/index.ts +1 -0
- package/src/components/head/head.spec.tsx +34 -0
- package/src/components/head/head.tsx +15 -0
- package/src/components/head/index.ts +1 -0
- package/src/components/heading/heading.spec.tsx +32 -0
- package/src/components/heading/heading.tsx +31 -0
- package/src/components/heading/index.ts +1 -0
- package/src/components/heading/utils/as.ts +26 -0
- package/src/components/heading/utils/spaces.ts +64 -0
- package/src/components/heading/utils/utils.spec.ts +70 -0
- package/src/components/hr/hr.spec.tsx +22 -0
- package/src/components/hr/hr.tsx +23 -0
- package/src/components/hr/index.ts +1 -0
- package/src/components/html/html.spec.tsx +26 -0
- package/src/components/html/html.tsx +13 -0
- package/src/components/html/index.ts +1 -0
- package/src/components/img/img.spec.tsx +30 -0
- package/src/components/img/img.tsx +27 -0
- package/src/components/img/index.ts +1 -0
- package/src/components/index.ts +19 -0
- package/src/components/link/index.ts +1 -0
- package/src/components/link/link.spec.tsx +37 -0
- package/src/components/link/link.tsx +24 -0
- package/src/components/markdown/index.ts +1 -0
- package/src/components/markdown/markdown.spec.tsx +221 -0
- package/src/components/markdown/markdown.tsx +239 -0
- package/src/components/markdown/styles.ts +130 -0
- package/src/components/markdown/utils/parse-css-in-js-to-inline-css.spec.ts +42 -0
- package/src/components/markdown/utils/parse-css-in-js-to-inline-css.ts +73 -0
- package/src/components/preview/index.ts +1 -0
- package/src/components/preview/preview.spec.tsx +49 -0
- package/src/components/preview/preview.tsx +56 -0
- package/src/components/row/index.ts +1 -0
- package/src/components/row/row.spec.tsx +28 -0
- package/src/components/row/row.tsx +33 -0
- package/src/components/section/index.ts +1 -0
- package/src/components/section/section.spec.tsx +58 -0
- package/src/components/section/section.tsx +59 -0
- package/src/components/tailwind/e2e/integrations.spec.ts +44 -0
- package/src/components/tailwind/e2e/nextjs/README.md +9 -0
- package/src/components/tailwind/e2e/nextjs/emails/vercel-invite-user.tsx +151 -0
- package/src/components/tailwind/e2e/nextjs/next.config.mjs +6 -0
- package/src/components/tailwind/e2e/nextjs/package.json +24 -0
- package/src/components/tailwind/e2e/nextjs/src/app/favicon.ico +0 -0
- package/src/components/tailwind/e2e/nextjs/src/app/layout.tsx +23 -0
- package/src/components/tailwind/e2e/nextjs/src/app/page.tsx +7 -0
- package/src/components/tailwind/e2e/nextjs/tsconfig.json +27 -0
- package/src/components/tailwind/e2e/vite/README.md +9 -0
- package/src/components/tailwind/e2e/vite/emails/vercel-invite-user.tsx +151 -0
- package/src/components/tailwind/e2e/vite/index.html +13 -0
- package/src/components/tailwind/e2e/vite/package.json +25 -0
- package/src/components/tailwind/e2e/vite/public/vite.svg +1 -0
- package/src/components/tailwind/e2e/vite/src/App.tsx +10 -0
- package/src/components/tailwind/e2e/vite/src/main.tsx +9 -0
- package/src/components/tailwind/e2e/vite/src/vite-env.d.ts +1 -0
- package/src/components/tailwind/e2e/vite/tsconfig.json +25 -0
- package/src/components/tailwind/e2e/vite/tsconfig.node.json +11 -0
- package/src/components/tailwind/e2e/vite/vite.config.ts +7 -0
- package/src/components/tailwind/hooks/use-suspended-promise.ts +34 -0
- package/src/components/tailwind/hooks/use-suspensed-promise.spec.ts +263 -0
- package/src/components/tailwind/index.ts +4 -0
- package/src/components/tailwind/inline-styles.spec.ts +49 -0
- package/src/components/tailwind/inline-styles.ts +21 -0
- package/src/components/tailwind/sanitize-stylesheet.ts +10 -0
- package/src/components/tailwind/tailwind.spec.tsx +1390 -0
- package/src/components/tailwind/tailwind.tsx +178 -0
- package/src/components/tailwind/utils/__snapshots__/quick-safe-render-to-string.spec.tsx.snap +3 -0
- package/src/components/tailwind/utils/compatibility/escape-class-name.spec.ts +17 -0
- package/src/components/tailwind/utils/compatibility/escape-class-name.ts +18 -0
- package/src/components/tailwind/utils/compatibility/get-react-property.ts +15 -0
- package/src/components/tailwind/utils/compatibility/sanitize-class-name.spec.ts +7 -0
- package/src/components/tailwind/utils/compatibility/sanitize-class-name.ts +36 -0
- package/src/components/tailwind/utils/compatibility/unescape-class.ts +3 -0
- package/src/components/tailwind/utils/css/__snapshots__/extract-rules-matching-classes.spec.ts.snap +23 -0
- package/src/components/tailwind/utils/css/__snapshots__/remove-rule-duplicates-from-root.spec.ts.snap +3 -0
- package/src/components/tailwind/utils/css/__snapshots__/sanitize-non-inlinable-classes.spec.ts.snap +7 -0
- package/src/components/tailwind/utils/css/downlevel-for-email-clients.spec.ts +119 -0
- package/src/components/tailwind/utils/css/downlevel-for-email-clients.ts +244 -0
- package/src/components/tailwind/utils/css/extract-rules-per-class.spec.ts +232 -0
- package/src/components/tailwind/utils/css/extract-rules-per-class.ts +76 -0
- package/src/components/tailwind/utils/css/get-custom-properties.ts +49 -0
- package/src/components/tailwind/utils/css/is-part-inlinable.ts +15 -0
- package/src/components/tailwind/utils/css/is-rule-inlinable.ts +15 -0
- package/src/components/tailwind/utils/css/make-inline-styles-for.spec.ts +124 -0
- package/src/components/tailwind/utils/css/make-inline-styles-for.ts +73 -0
- package/src/components/tailwind/utils/css/resolve-all-css-variables.spec.ts +296 -0
- package/src/components/tailwind/utils/css/resolve-all-css-variables.ts +236 -0
- package/src/components/tailwind/utils/css/resolve-calc-expressions.spec.ts +36 -0
- package/src/components/tailwind/utils/css/resolve-calc-expressions.ts +147 -0
- package/src/components/tailwind/utils/css/sanitize-declarations.spec.ts +491 -0
- package/src/components/tailwind/utils/css/sanitize-declarations.ts +443 -0
- package/src/components/tailwind/utils/css/sanitize-non-inlinable-rules.spec.ts +72 -0
- package/src/components/tailwind/utils/css/sanitize-non-inlinable-rules.ts +48 -0
- package/src/components/tailwind/utils/css/split-mixed-rule.ts +68 -0
- package/src/components/tailwind/utils/css/strip-empty-tailwind-vars.spec.ts +128 -0
- package/src/components/tailwind/utils/css/strip-empty-tailwind-vars.ts +70 -0
- package/src/components/tailwind/utils/css/unwrap-value.ts +9 -0
- package/src/components/tailwind/utils/react/is-component.ts +12 -0
- package/src/components/tailwind/utils/react/map-react-tree.spec.tsx +58 -0
- package/src/components/tailwind/utils/react/map-react-tree.ts +58 -0
- package/src/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.ts +61 -0
- package/src/components/tailwind/utils/tailwindcss/setup-tailwind.spec.ts +25 -0
- package/src/components/tailwind/utils/tailwindcss/setup-tailwind.ts +121 -0
- package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.ts +900 -0
- package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.ts +397 -0
- package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.ts +466 -0
- package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.ts +5 -0
- package/src/components/tailwind/utils/text/from-dash-case-to-camel-case.ts +3 -0
- package/src/components/text/index.ts +1 -0
- package/src/components/text/text.spec.tsx +35 -0
- package/src/components/text/text.tsx +50 -0
- package/src/components/text/utils/compute-margins.spec.ts +67 -0
- package/src/components/text/utils/compute-margins.ts +102 -0
- package/src/index.ts +2 -110
- package/tsconfig.json +9 -4
- package/tsdown.config.ts +51 -6
- package/vitest.config.ts +1 -0
- package/vitest.e2e.config.ts +17 -0
- package/src/commands/build.ts +0 -269
- package/src/commands/dev.ts +0 -27
- package/src/commands/export.ts +0 -204
- package/src/commands/resend/reset.ts +0 -8
- package/src/commands/resend/setup.ts +0 -29
- package/src/commands/start.ts +0 -38
- package/src/utils/conf.ts +0 -9
- package/src/utils/esbuild/escape-string-for-regex.ts +0 -3
- package/src/utils/esbuild/renderring-utilities-exporter.ts +0 -63
- package/src/utils/get-emails-directory-metadata.spec.ts +0 -82
- package/src/utils/get-emails-directory-metadata.ts +0 -140
- package/src/utils/get-preview-server-location.ts +0 -50
- package/src/utils/index.ts +0 -2
- package/src/utils/packageJson.ts +0 -4
- package/src/utils/preview/get-env-variables-for-preview-app.ts +0 -20
- package/src/utils/preview/hot-reloading/create-dependency-graph.spec.ts +0 -226
- package/src/utils/preview/hot-reloading/create-dependency-graph.ts +0 -343
- package/src/utils/preview/hot-reloading/get-imported-modules.spec.ts +0 -151
- package/src/utils/preview/hot-reloading/get-imported-modules.ts +0 -49
- package/src/utils/preview/hot-reloading/resolve-path-aliases.spec.ts +0 -11
- package/src/utils/preview/hot-reloading/resolve-path-aliases.ts +0 -32
- package/src/utils/preview/hot-reloading/setup-hot-reloading.ts +0 -121
- package/src/utils/preview/hot-reloading/test/dependency-graph/inner/data-to-import.json +0 -1
- package/src/utils/preview/hot-reloading/test/dependency-graph/inner/file-a.ts +0 -5
- package/src/utils/preview/hot-reloading/test/dependency-graph/inner/file-b.ts +0 -5
- package/src/utils/preview/hot-reloading/test/dependency-graph/inner/general-importing-file.ts +0 -9
- package/src/utils/preview/hot-reloading/test/dependency-graph/inner/outer-dependency.ts +0 -3
- package/src/utils/preview/hot-reloading/test/dependency-graph/inner/path-aliases.ts +0 -1
- package/src/utils/preview/hot-reloading/test/dependency-graph/outer.ts +0 -5
- package/src/utils/preview/hot-reloading/test/some-file.ts +0 -0
- package/src/utils/preview/hot-reloading/test/tsconfig.json +0 -8
- package/src/utils/preview/index.ts +0 -2
- package/src/utils/preview/serve-static-file.ts +0 -51
- package/src/utils/preview/start-dev-server.ts +0 -252
- package/src/utils/register-spinner-autostopping.ts +0 -28
- package/src/utils/style-text.ts +0 -11
- package/src/utils/tree.spec.ts +0 -29
- package/src/utils/tree.ts +0 -76
- package/src/utils/types/hot-reload-change.ts +0 -6
- package/src/utils/types/hot-reload-event.ts +0 -3
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { List, generate, parse, walk } from "css-tree/dist/csstree.esm";
|
|
2
|
+
//#region src/components/tailwind/utils/css/sanitize-declarations.ts
|
|
3
|
+
function rgbNode(r, g, b, alpha) {
|
|
4
|
+
const children = new List();
|
|
5
|
+
children.appendData({
|
|
6
|
+
type: "Number",
|
|
7
|
+
value: r.toFixed(0)
|
|
8
|
+
});
|
|
9
|
+
children.appendData({
|
|
10
|
+
type: "Operator",
|
|
11
|
+
value: ","
|
|
12
|
+
});
|
|
13
|
+
children.appendData({
|
|
14
|
+
type: "Number",
|
|
15
|
+
value: g.toFixed(0)
|
|
16
|
+
});
|
|
17
|
+
children.appendData({
|
|
18
|
+
type: "Operator",
|
|
19
|
+
value: ","
|
|
20
|
+
});
|
|
21
|
+
children.appendData({
|
|
22
|
+
type: "Number",
|
|
23
|
+
value: b.toFixed(0)
|
|
24
|
+
});
|
|
25
|
+
if (alpha !== 1 && alpha !== void 0) {
|
|
26
|
+
children.appendData({
|
|
27
|
+
type: "Operator",
|
|
28
|
+
value: ","
|
|
29
|
+
});
|
|
30
|
+
children.appendData({
|
|
31
|
+
type: "Number",
|
|
32
|
+
value: alpha.toString()
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
type: "Function",
|
|
37
|
+
name: "rgb",
|
|
38
|
+
children
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const LAB_TO_LMS = {
|
|
42
|
+
l: [.3963377773761749, .2158037573099136],
|
|
43
|
+
m: [-.1055613458156586, -.0638541728258133],
|
|
44
|
+
s: [-.0894841775298119, -1.2914855480194092]
|
|
45
|
+
};
|
|
46
|
+
const LSM_TO_RGB = {
|
|
47
|
+
r: [
|
|
48
|
+
4.076741636075958,
|
|
49
|
+
-3.307711539258063,
|
|
50
|
+
.2309699031821043
|
|
51
|
+
],
|
|
52
|
+
g: [
|
|
53
|
+
-1.2684379732850315,
|
|
54
|
+
2.609757349287688,
|
|
55
|
+
-.341319376002657
|
|
56
|
+
],
|
|
57
|
+
b: [
|
|
58
|
+
-.0041960761386756,
|
|
59
|
+
-.7034186179359362,
|
|
60
|
+
1.7076146940746117
|
|
61
|
+
]
|
|
62
|
+
};
|
|
63
|
+
function lrgbToRgb(input) {
|
|
64
|
+
const absoluteNumber = Math.abs(input);
|
|
65
|
+
const sign = input < 0 ? -1 : 1;
|
|
66
|
+
if (absoluteNumber > .0031308) return sign * (absoluteNumber ** (1 / 2.4) * 1.055 - .055);
|
|
67
|
+
return input * 12.92;
|
|
68
|
+
}
|
|
69
|
+
function clamp(value, min, max) {
|
|
70
|
+
return Math.min(Math.max(value, min), max);
|
|
71
|
+
}
|
|
72
|
+
function oklchToOklab(oklch) {
|
|
73
|
+
return {
|
|
74
|
+
l: oklch.l,
|
|
75
|
+
a: oklch.c * Math.cos(oklch.h / 180 * Math.PI),
|
|
76
|
+
b: oklch.c * Math.sin(oklch.h / 180 * Math.PI)
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** Convert oklab to RGB */
|
|
80
|
+
function oklchToRgb(oklch) {
|
|
81
|
+
const oklab = oklchToOklab(oklch);
|
|
82
|
+
const l = (oklab.l + LAB_TO_LMS.l[0] * oklab.a + LAB_TO_LMS.l[1] * oklab.b) ** 3;
|
|
83
|
+
const m = (oklab.l + LAB_TO_LMS.m[0] * oklab.a + LAB_TO_LMS.m[1] * oklab.b) ** 3;
|
|
84
|
+
const s = (oklab.l + LAB_TO_LMS.s[0] * oklab.a + LAB_TO_LMS.s[1] * oklab.b) ** 3;
|
|
85
|
+
const r = 255 * lrgbToRgb(LSM_TO_RGB.r[0] * l + LSM_TO_RGB.r[1] * m + LSM_TO_RGB.r[2] * s);
|
|
86
|
+
const g = 255 * lrgbToRgb(LSM_TO_RGB.g[0] * l + LSM_TO_RGB.g[1] * m + LSM_TO_RGB.g[2] * s);
|
|
87
|
+
const b = 255 * lrgbToRgb(LSM_TO_RGB.b[0] * l + LSM_TO_RGB.b[1] * m + LSM_TO_RGB.b[2] * s);
|
|
88
|
+
return {
|
|
89
|
+
r: clamp(r, 0, 255),
|
|
90
|
+
g: clamp(g, 0, 255),
|
|
91
|
+
b: clamp(b, 0, 255)
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function separteShorthandDeclaration(shorthandToReplace, [start, end]) {
|
|
95
|
+
shorthandToReplace.property = start;
|
|
96
|
+
const values = shorthandToReplace.value.type === "Value" ? shorthandToReplace.value.children.toArray().filter((child) => child.type !== "Operator" && child.type !== "WhiteSpace") : [shorthandToReplace.value];
|
|
97
|
+
let endValue = shorthandToReplace.value;
|
|
98
|
+
if (values.length === 2) {
|
|
99
|
+
endValue = {
|
|
100
|
+
type: "Value",
|
|
101
|
+
children: new List().fromArray([values[1]])
|
|
102
|
+
};
|
|
103
|
+
shorthandToReplace.value = {
|
|
104
|
+
type: "Value",
|
|
105
|
+
children: new List().fromArray([values[0]])
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
type: "Declaration",
|
|
110
|
+
property: end,
|
|
111
|
+
value: endValue,
|
|
112
|
+
important: shorthandToReplace.important
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Meant to do all the things necessary, in a per-declaration basis, to have the best email client
|
|
117
|
+
* support possible.
|
|
118
|
+
*
|
|
119
|
+
* Here's the transformations it does so far:
|
|
120
|
+
* - convert all `rgb` with space-based syntax into a comma based one;
|
|
121
|
+
* - convert all `oklch` values into `rgb`;
|
|
122
|
+
* - convert all hex values into `rgb`;
|
|
123
|
+
* - convert `padding-inline` into `padding-left` and `padding-right`;
|
|
124
|
+
* - convert `padding-block` into `padding-top` and `padding-bottom`;
|
|
125
|
+
* - convert `margin-inline` into `margin-left` and `margin-right`;
|
|
126
|
+
* - convert `margin-block` into `margin-top` and `margin-bottom`.
|
|
127
|
+
*/
|
|
128
|
+
function sanitizeDeclarations(nodeContainingDeclarations) {
|
|
129
|
+
walk(nodeContainingDeclarations, {
|
|
130
|
+
visit: "Declaration",
|
|
131
|
+
enter(declaration, item, list) {
|
|
132
|
+
if (declaration.value.type === "Raw") declaration.value = parse(declaration.value.value, { context: "value" });
|
|
133
|
+
if (/border-(?:[a-z]+-){0,2}radius\s*:\s*calc\s*\(\s*infinity\s*\*\s*1px\s*\)/i.test(generate(declaration))) declaration.value = parse("9999px", { context: "value" });
|
|
134
|
+
walk(declaration, {
|
|
135
|
+
visit: "Function",
|
|
136
|
+
enter(func, funcParentListItem) {
|
|
137
|
+
const children = func.children.toArray();
|
|
138
|
+
if (func.name === "oklch") {
|
|
139
|
+
let l;
|
|
140
|
+
let c;
|
|
141
|
+
let h;
|
|
142
|
+
let a;
|
|
143
|
+
for (const child of children) {
|
|
144
|
+
if (child.type === "Number") {
|
|
145
|
+
if (l === void 0) {
|
|
146
|
+
l = Number.parseFloat(child.value);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (c === void 0) {
|
|
150
|
+
c = Number.parseFloat(child.value);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (h === void 0) {
|
|
154
|
+
h = Number.parseFloat(child.value);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (a === void 0) {
|
|
158
|
+
a = Number.parseFloat(child.value);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (child.type === "Dimension" && child.unit === "deg") {
|
|
163
|
+
if (h === void 0) {
|
|
164
|
+
h = Number.parseFloat(child.value);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (child.type === "Percentage") {
|
|
169
|
+
if (l === void 0) {
|
|
170
|
+
l = Number.parseFloat(child.value) / 100;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (a === void 0) a = Number.parseFloat(child.value) / 100;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (l === void 0 || c === void 0 || h === void 0) throw new Error("Could not determine the parameters of an oklch() function.", { cause: declaration });
|
|
177
|
+
const rgb = oklchToRgb({
|
|
178
|
+
l,
|
|
179
|
+
c,
|
|
180
|
+
h
|
|
181
|
+
});
|
|
182
|
+
funcParentListItem.data = rgbNode(rgb.r, rgb.g, rgb.b, a);
|
|
183
|
+
}
|
|
184
|
+
if (func.name === "rgb" || func.name === "rgba") {
|
|
185
|
+
let r;
|
|
186
|
+
let g;
|
|
187
|
+
let b;
|
|
188
|
+
let a;
|
|
189
|
+
for (const child of children) {
|
|
190
|
+
if (child.type === "Number") {
|
|
191
|
+
if (r === void 0) {
|
|
192
|
+
r = Number.parseFloat(child.value);
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (g === void 0) {
|
|
196
|
+
g = Number.parseFloat(child.value);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (b === void 0) {
|
|
200
|
+
b = Number.parseFloat(child.value);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (a === void 0) {
|
|
204
|
+
a = Number.parseFloat(child.value);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (child.type === "Percentage") {
|
|
209
|
+
if (r === void 0) {
|
|
210
|
+
r = Number.parseFloat(child.value) * 255 / 100;
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (g === void 0) {
|
|
214
|
+
g = Number.parseFloat(child.value) * 255 / 100;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (b === void 0) {
|
|
218
|
+
b = Number.parseFloat(child.value) * 255 / 100;
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (a === void 0) a = Number.parseFloat(child.value) / 100;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (r === void 0 || g === void 0 || b === void 0) throw new Error("Could not determine the parameters of an rgb() function.", { cause: declaration });
|
|
225
|
+
if (a === void 0 || a === 1) funcParentListItem.data = rgbNode(r, g, b);
|
|
226
|
+
else funcParentListItem.data = rgbNode(r, g, b, a);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
walk(declaration, {
|
|
231
|
+
visit: "Hash",
|
|
232
|
+
enter(hash, hashParentListItem) {
|
|
233
|
+
const hex = hash.value.trim();
|
|
234
|
+
if (hex.length === 3) {
|
|
235
|
+
hashParentListItem.data = rgbNode(Number.parseInt(hex.charAt(0) + hex.charAt(0), 16), Number.parseInt(hex.charAt(1) + hex.charAt(1), 16), Number.parseInt(hex.charAt(2) + hex.charAt(2), 16));
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (hex.length === 4) {
|
|
239
|
+
hashParentListItem.data = rgbNode(Number.parseInt(hex.charAt(0) + hex.charAt(0), 16), Number.parseInt(hex.charAt(1) + hex.charAt(1), 16), Number.parseInt(hex.charAt(2) + hex.charAt(2), 16), Number.parseInt(hex.charAt(3) + hex.charAt(3), 16) / 255);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (hex.length === 5) {
|
|
243
|
+
hashParentListItem.data = rgbNode(Number.parseInt(hex.slice(0, 2), 16), Number.parseInt(hex.charAt(2) + hex.charAt(2), 16), Number.parseInt(hex.charAt(3) + hex.charAt(3), 16), Number.parseInt(hex.charAt(4) + hex.charAt(4), 16) / 255);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (hex.length === 6) {
|
|
247
|
+
hashParentListItem.data = rgbNode(Number.parseInt(hex.slice(0, 2), 16), Number.parseInt(hex.slice(2, 4), 16), Number.parseInt(hex.slice(4, 6), 16));
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (hex.length === 7) {
|
|
251
|
+
hashParentListItem.data = rgbNode(Number.parseInt(hex.slice(0, 2), 16), Number.parseInt(hex.slice(2, 4), 16), Number.parseInt(hex.slice(4, 6), 16), Number.parseInt(hex.charAt(6) + hex.charAt(6), 16) / 255);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
hashParentListItem.data = rgbNode(Number.parseInt(hex.slice(0, 2), 16), Number.parseInt(hex.slice(2, 4), 16), Number.parseInt(hex.slice(4, 6), 16), Number.parseInt(hex.slice(6, 8), 16) / 255);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
walk(declaration, {
|
|
258
|
+
visit: "Function",
|
|
259
|
+
enter(func, parentListItem) {
|
|
260
|
+
if (func.name === "color-mix") {
|
|
261
|
+
const children = func.children.toArray();
|
|
262
|
+
const color = children[3];
|
|
263
|
+
const opacity = children[4];
|
|
264
|
+
if (func.children.last?.type === "Identifier" && func.children.last.name === "transparent" && color?.type === "Function" && color?.name === "rgb" && opacity) {
|
|
265
|
+
if (opacity.type === "Percentage") {
|
|
266
|
+
const alpha = Number.parseFloat(opacity.value) / 100;
|
|
267
|
+
if (alpha < 1) {
|
|
268
|
+
color.children.appendData({
|
|
269
|
+
type: "Operator",
|
|
270
|
+
value: ","
|
|
271
|
+
});
|
|
272
|
+
color.children.appendData({
|
|
273
|
+
type: "Number",
|
|
274
|
+
value: alpha.toString()
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
} else {
|
|
278
|
+
color.children.appendData({
|
|
279
|
+
type: "Operator",
|
|
280
|
+
value: ","
|
|
281
|
+
});
|
|
282
|
+
color.children.appendData(opacity);
|
|
283
|
+
}
|
|
284
|
+
parentListItem.data = color;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
if (declaration.property === "padding-inline") {
|
|
290
|
+
const paddingRight = separteShorthandDeclaration(declaration, ["padding-left", "padding-right"]);
|
|
291
|
+
list.insertData(paddingRight, item);
|
|
292
|
+
}
|
|
293
|
+
if (declaration.property === "padding-block") {
|
|
294
|
+
const paddingBottom = separteShorthandDeclaration(declaration, ["padding-top", "padding-bottom"]);
|
|
295
|
+
list.insertData(paddingBottom, item);
|
|
296
|
+
}
|
|
297
|
+
if (declaration.property === "margin-inline") {
|
|
298
|
+
const marginRight = separteShorthandDeclaration(declaration, ["margin-left", "margin-right"]);
|
|
299
|
+
list.insertData(marginRight, item);
|
|
300
|
+
}
|
|
301
|
+
if (declaration.property === "margin-block") {
|
|
302
|
+
const paddingBottom = separteShorthandDeclaration(declaration, ["margin-top", "margin-bottom"]);
|
|
303
|
+
list.insertData(paddingBottom, item);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
//#endregion
|
|
309
|
+
export { sanitizeDeclarations };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require("../../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_is_rule_inlinable = require("./is-rule-inlinable.cjs");
|
|
3
|
+
const require_strip_empty_tailwind_vars = require("./strip-empty-tailwind-vars.cjs");
|
|
4
|
+
const require_sanitize_class_name = require("../compatibility/sanitize-class-name.cjs");
|
|
5
|
+
let css_tree = require("css-tree");
|
|
6
|
+
//#region src/components/tailwind/utils/css/sanitize-non-inlinable-rules.ts
|
|
7
|
+
/**
|
|
8
|
+
* This function goes through a few steps to ensure the best email client support and
|
|
9
|
+
* to ensure that media queries and pseudo classes are applied correctly alongside
|
|
10
|
+
* the inline styles.
|
|
11
|
+
*
|
|
12
|
+
* What it does:
|
|
13
|
+
* 1. Converts all declarations in all rules into important ones
|
|
14
|
+
* 2. Sanitizes class selectors of all non-inlinable rules
|
|
15
|
+
* 3. Removes --tw-* custom property declarations — by this point all CSS
|
|
16
|
+
* variables have been resolved, so these are dead weight in email HTML.
|
|
17
|
+
* 4. Strips empty-fallback var(--tw-*,) refs that Tailwind v4 emits for
|
|
18
|
+
* variant-stacking idioms (filter, font-variant-numeric, etc.) — email
|
|
19
|
+
* clients can't resolve CSS custom properties reliably, so any --tw-*
|
|
20
|
+
* left as a bare empty-fallback ref would reach the client broken.
|
|
21
|
+
*/
|
|
22
|
+
function sanitizeNonInlinableRules(node) {
|
|
23
|
+
(0, css_tree.walk)(node, {
|
|
24
|
+
visit: "Rule",
|
|
25
|
+
enter(rule) {
|
|
26
|
+
if (!require_is_rule_inlinable.isRuleInlinable(rule)) {
|
|
27
|
+
(0, css_tree.walk)(rule.prelude, (node) => {
|
|
28
|
+
if (node.type === "ClassSelector") node.name = require_sanitize_class_name.sanitizeClassName(css_tree.string.decode(node.name));
|
|
29
|
+
});
|
|
30
|
+
(0, css_tree.walk)(rule, {
|
|
31
|
+
visit: "Declaration",
|
|
32
|
+
enter(declaration, item, list) {
|
|
33
|
+
if (declaration.property.startsWith("--tw-")) {
|
|
34
|
+
list.remove(item);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
declaration.important = true;
|
|
38
|
+
require_strip_empty_tailwind_vars.stripEmptyTailwindVars(declaration.value);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
exports.sanitizeNonInlinableRules = sanitizeNonInlinableRules;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isRuleInlinable } from "./is-rule-inlinable.mjs";
|
|
2
|
+
import { stripEmptyTailwindVars } from "./strip-empty-tailwind-vars.mjs";
|
|
3
|
+
import { sanitizeClassName } from "../compatibility/sanitize-class-name.mjs";
|
|
4
|
+
import { string, walk } from "css-tree/dist/csstree.esm";
|
|
5
|
+
//#region src/components/tailwind/utils/css/sanitize-non-inlinable-rules.ts
|
|
6
|
+
/**
|
|
7
|
+
* This function goes through a few steps to ensure the best email client support and
|
|
8
|
+
* to ensure that media queries and pseudo classes are applied correctly alongside
|
|
9
|
+
* the inline styles.
|
|
10
|
+
*
|
|
11
|
+
* What it does:
|
|
12
|
+
* 1. Converts all declarations in all rules into important ones
|
|
13
|
+
* 2. Sanitizes class selectors of all non-inlinable rules
|
|
14
|
+
* 3. Removes --tw-* custom property declarations — by this point all CSS
|
|
15
|
+
* variables have been resolved, so these are dead weight in email HTML.
|
|
16
|
+
* 4. Strips empty-fallback var(--tw-*,) refs that Tailwind v4 emits for
|
|
17
|
+
* variant-stacking idioms (filter, font-variant-numeric, etc.) — email
|
|
18
|
+
* clients can't resolve CSS custom properties reliably, so any --tw-*
|
|
19
|
+
* left as a bare empty-fallback ref would reach the client broken.
|
|
20
|
+
*/
|
|
21
|
+
function sanitizeNonInlinableRules(node) {
|
|
22
|
+
walk(node, {
|
|
23
|
+
visit: "Rule",
|
|
24
|
+
enter(rule) {
|
|
25
|
+
if (!isRuleInlinable(rule)) {
|
|
26
|
+
walk(rule.prelude, (node) => {
|
|
27
|
+
if (node.type === "ClassSelector") node.name = sanitizeClassName(string.decode(node.name));
|
|
28
|
+
});
|
|
29
|
+
walk(rule, {
|
|
30
|
+
visit: "Declaration",
|
|
31
|
+
enter(declaration, item, list) {
|
|
32
|
+
if (declaration.property.startsWith("--tw-")) {
|
|
33
|
+
list.remove(item);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
declaration.important = true;
|
|
37
|
+
stripEmptyTailwindVars(declaration.value);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
export { sanitizeNonInlinableRules };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require("../../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_is_part_inlinable = require("./is-part-inlinable.cjs");
|
|
3
|
+
let css_tree = require("css-tree");
|
|
4
|
+
//#region src/components/tailwind/utils/css/split-mixed-rule.ts
|
|
5
|
+
/**
|
|
6
|
+
* Split a rule into inlinable and non-inlinable parts. Caller must only pass rules
|
|
7
|
+
* for which isRuleInlinable(rule) is false. Returns clones so the original stylesheet is never mutated.
|
|
8
|
+
*
|
|
9
|
+
* @returns inlinablePart: rule with only inlinable block children, or null if none.
|
|
10
|
+
* nonInlinablePart: rule with only non-inlinable block children, or null if none.
|
|
11
|
+
*/
|
|
12
|
+
function splitMixedRule(rule) {
|
|
13
|
+
if (rule.prelude !== null && (0, css_tree.find)(rule.prelude, (node) => node.type === "PseudoClassSelector" || node.type === "PseudoElementSelector") !== null) return {
|
|
14
|
+
inlinablePart: null,
|
|
15
|
+
nonInlinablePart: (0, css_tree.clone)(rule)
|
|
16
|
+
};
|
|
17
|
+
const ruleCloneInlinable = (0, css_tree.clone)(rule);
|
|
18
|
+
const ruleCloneNonInlinable = (0, css_tree.clone)(rule);
|
|
19
|
+
const inlinableParts = [];
|
|
20
|
+
const nonInlinableParts = [];
|
|
21
|
+
for (const part of ruleCloneInlinable.block.children.toArray()) if (require_is_part_inlinable.isPartInlinable(part)) inlinableParts.push(part);
|
|
22
|
+
else nonInlinableParts.push(part);
|
|
23
|
+
return {
|
|
24
|
+
inlinablePart: inlinableParts.length > 0 ? {
|
|
25
|
+
...ruleCloneInlinable,
|
|
26
|
+
block: {
|
|
27
|
+
type: "Block",
|
|
28
|
+
children: new css_tree.List().fromArray(inlinableParts)
|
|
29
|
+
}
|
|
30
|
+
} : null,
|
|
31
|
+
nonInlinablePart: nonInlinableParts.length > 0 ? {
|
|
32
|
+
...ruleCloneNonInlinable,
|
|
33
|
+
block: {
|
|
34
|
+
type: "Block",
|
|
35
|
+
children: new css_tree.List().fromArray(nonInlinableParts)
|
|
36
|
+
}
|
|
37
|
+
} : null
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
exports.splitMixedRule = splitMixedRule;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { isPartInlinable } from "./is-part-inlinable.mjs";
|
|
2
|
+
import { List, clone, find } from "css-tree/dist/csstree.esm";
|
|
3
|
+
//#region src/components/tailwind/utils/css/split-mixed-rule.ts
|
|
4
|
+
/**
|
|
5
|
+
* Split a rule into inlinable and non-inlinable parts. Caller must only pass rules
|
|
6
|
+
* for which isRuleInlinable(rule) is false. Returns clones so the original stylesheet is never mutated.
|
|
7
|
+
*
|
|
8
|
+
* @returns inlinablePart: rule with only inlinable block children, or null if none.
|
|
9
|
+
* nonInlinablePart: rule with only non-inlinable block children, or null if none.
|
|
10
|
+
*/
|
|
11
|
+
function splitMixedRule(rule) {
|
|
12
|
+
if (rule.prelude !== null && find(rule.prelude, (node) => node.type === "PseudoClassSelector" || node.type === "PseudoElementSelector") !== null) return {
|
|
13
|
+
inlinablePart: null,
|
|
14
|
+
nonInlinablePart: clone(rule)
|
|
15
|
+
};
|
|
16
|
+
const ruleCloneInlinable = clone(rule);
|
|
17
|
+
const ruleCloneNonInlinable = clone(rule);
|
|
18
|
+
const inlinableParts = [];
|
|
19
|
+
const nonInlinableParts = [];
|
|
20
|
+
for (const part of ruleCloneInlinable.block.children.toArray()) if (isPartInlinable(part)) inlinableParts.push(part);
|
|
21
|
+
else nonInlinableParts.push(part);
|
|
22
|
+
return {
|
|
23
|
+
inlinablePart: inlinableParts.length > 0 ? {
|
|
24
|
+
...ruleCloneInlinable,
|
|
25
|
+
block: {
|
|
26
|
+
type: "Block",
|
|
27
|
+
children: new List().fromArray(inlinableParts)
|
|
28
|
+
}
|
|
29
|
+
} : null,
|
|
30
|
+
nonInlinablePart: nonInlinableParts.length > 0 ? {
|
|
31
|
+
...ruleCloneNonInlinable,
|
|
32
|
+
block: {
|
|
33
|
+
type: "Block",
|
|
34
|
+
children: new List().fromArray(nonInlinableParts)
|
|
35
|
+
}
|
|
36
|
+
} : null
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { splitMixedRule };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require("../../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let css_tree = require("css-tree");
|
|
3
|
+
//#region src/components/tailwind/utils/css/strip-empty-tailwind-vars.ts
|
|
4
|
+
/**
|
|
5
|
+
* Tailwind v4 emits variant-stacking idioms like
|
|
6
|
+
* font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) tabular-nums var(--tw-numeric-fraction,)
|
|
7
|
+
* filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-invert,) ...
|
|
8
|
+
* where each var() has an empty fallback so missing variants collapse to nothing.
|
|
9
|
+
* Tailwind deliberately leaves these variant vars undefined until used, so they
|
|
10
|
+
* stay in the output here and produce unresolvable custom properties in email HTML
|
|
11
|
+
* (no email client supports CSS custom properties reliably). Per the CSS spec
|
|
12
|
+
* (https://www.w3.org/TR/css-variables-1/#using-variables) an empty fallback means
|
|
13
|
+
* "use empty string if the variable is undefined", which is exactly what we want.
|
|
14
|
+
*
|
|
15
|
+
* Scoped to the `--tw-` prefix so any user-authored empty-fallback var() refs
|
|
16
|
+
* are left untouched.
|
|
17
|
+
*
|
|
18
|
+
* Uses post-order traversal so an outer var(--tw-X, var(--tw-Y,)) collapses
|
|
19
|
+
* correctly after the inner var() has been removed.
|
|
20
|
+
*/
|
|
21
|
+
function stripEmptyTailwindVars(node) {
|
|
22
|
+
(0, css_tree.walk)(node, {
|
|
23
|
+
visit: "Function",
|
|
24
|
+
leave(func, funcItem, funcList) {
|
|
25
|
+
if (func.name !== "var") return;
|
|
26
|
+
let variableName;
|
|
27
|
+
(0, css_tree.walk)(func, {
|
|
28
|
+
visit: "Identifier",
|
|
29
|
+
enter(identifier) {
|
|
30
|
+
variableName = identifier.name;
|
|
31
|
+
return this.break;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
if (!variableName?.startsWith("--tw-")) return;
|
|
35
|
+
let sawComma = false;
|
|
36
|
+
let hasFallbackContent = false;
|
|
37
|
+
func.children.forEach((child) => {
|
|
38
|
+
if (!sawComma) {
|
|
39
|
+
if (child.type === "Operator" && child.value === ",") sawComma = true;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
let childValue = (0, css_tree.generate)(child).trim();
|
|
43
|
+
if (child.type === "Raw") childValue = childValue.replaceAll(/var\(--tw-[^,()]+,\s*\)/g, "").trim();
|
|
44
|
+
if (childValue.length > 0) hasFallbackContent = true;
|
|
45
|
+
});
|
|
46
|
+
if (!sawComma || hasFallbackContent) return;
|
|
47
|
+
funcList.remove(funcItem);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
exports.stripEmptyTailwindVars = stripEmptyTailwindVars;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { generate, walk } from "css-tree/dist/csstree.esm";
|
|
2
|
+
//#region src/components/tailwind/utils/css/strip-empty-tailwind-vars.ts
|
|
3
|
+
/**
|
|
4
|
+
* Tailwind v4 emits variant-stacking idioms like
|
|
5
|
+
* font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) tabular-nums var(--tw-numeric-fraction,)
|
|
6
|
+
* filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-invert,) ...
|
|
7
|
+
* where each var() has an empty fallback so missing variants collapse to nothing.
|
|
8
|
+
* Tailwind deliberately leaves these variant vars undefined until used, so they
|
|
9
|
+
* stay in the output here and produce unresolvable custom properties in email HTML
|
|
10
|
+
* (no email client supports CSS custom properties reliably). Per the CSS spec
|
|
11
|
+
* (https://www.w3.org/TR/css-variables-1/#using-variables) an empty fallback means
|
|
12
|
+
* "use empty string if the variable is undefined", which is exactly what we want.
|
|
13
|
+
*
|
|
14
|
+
* Scoped to the `--tw-` prefix so any user-authored empty-fallback var() refs
|
|
15
|
+
* are left untouched.
|
|
16
|
+
*
|
|
17
|
+
* Uses post-order traversal so an outer var(--tw-X, var(--tw-Y,)) collapses
|
|
18
|
+
* correctly after the inner var() has been removed.
|
|
19
|
+
*/
|
|
20
|
+
function stripEmptyTailwindVars(node) {
|
|
21
|
+
walk(node, {
|
|
22
|
+
visit: "Function",
|
|
23
|
+
leave(func, funcItem, funcList) {
|
|
24
|
+
if (func.name !== "var") return;
|
|
25
|
+
let variableName;
|
|
26
|
+
walk(func, {
|
|
27
|
+
visit: "Identifier",
|
|
28
|
+
enter(identifier) {
|
|
29
|
+
variableName = identifier.name;
|
|
30
|
+
return this.break;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
if (!variableName?.startsWith("--tw-")) return;
|
|
34
|
+
let sawComma = false;
|
|
35
|
+
let hasFallbackContent = false;
|
|
36
|
+
func.children.forEach((child) => {
|
|
37
|
+
if (!sawComma) {
|
|
38
|
+
if (child.type === "Operator" && child.value === ",") sawComma = true;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let childValue = generate(child).trim();
|
|
42
|
+
if (child.type === "Raw") childValue = childValue.replaceAll(/var\(--tw-[^,()]+,\s*\)/g, "").trim();
|
|
43
|
+
if (childValue.length > 0) hasFallbackContent = true;
|
|
44
|
+
});
|
|
45
|
+
if (!sawComma || hasFallbackContent) return;
|
|
46
|
+
funcList.remove(funcItem);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { stripEmptyTailwindVars };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const require_element_marker = require("../../../element-marker.cjs");
|
|
2
|
+
//#region src/components/tailwind/utils/react/is-component.ts
|
|
3
|
+
const isComponent = (element) => {
|
|
4
|
+
return (typeof element.type === "function" || element.type.render !== void 0) && !(require_element_marker.elementMarker in element.type);
|
|
5
|
+
};
|
|
6
|
+
//#endregion
|
|
7
|
+
exports.isComponent = isComponent;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { elementMarker } from "../../../element-marker.mjs";
|
|
2
|
+
//#region src/components/tailwind/utils/react/is-component.ts
|
|
3
|
+
const isComponent = (element) => {
|
|
4
|
+
return (typeof element.type === "function" || element.type.render !== void 0) && !(elementMarker in element.type);
|
|
5
|
+
};
|
|
6
|
+
//#endregion
|
|
7
|
+
export { isComponent };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const require_runtime = require("../../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_is_component = require("./is-component.cjs");
|
|
3
|
+
let react = require("react");
|
|
4
|
+
react = require_runtime.__toESM(react, 1);
|
|
5
|
+
//#region src/components/tailwind/utils/react/map-react-tree.ts
|
|
6
|
+
/**
|
|
7
|
+
* A function made for deep mapping a React tree from a node, even through its components.
|
|
8
|
+
* For all the components it finds, it renders them by directly calling them. This has a few issues
|
|
9
|
+
* with hooks, and the only solution is `renderAsync` here, which will probably be done in the future.
|
|
10
|
+
*
|
|
11
|
+
* @param process - The callback that will be called every time a new element has been reached.
|
|
12
|
+
*
|
|
13
|
+
* For components, this is going to be called, most of the time, two times. This is because the best
|
|
14
|
+
* approach is to process *both* before rendering the components (i.e. on the props.children of a component element)
|
|
15
|
+
* and after rendering them because the children themselves might have been modified in the component's
|
|
16
|
+
* rendering.
|
|
17
|
+
*/
|
|
18
|
+
function mapReactTree(value, process) {
|
|
19
|
+
const mapped = react.default.Children.map(value, (node) => {
|
|
20
|
+
if (react.default.isValidElement(node)) {
|
|
21
|
+
const newProps = { ...node.props };
|
|
22
|
+
if (node.props.children && !require_is_component.isComponent(node)) newProps.children = mapReactTree(node.props.children, process);
|
|
23
|
+
const processed = process(react.default.cloneElement(node, newProps, newProps.children));
|
|
24
|
+
if (react.default.isValidElement(processed) && require_is_component.isComponent(processed)) return mapReactTree((typeof processed.type === "object" ? processed.type.render : processed.type)(processed.props), process);
|
|
25
|
+
return processed;
|
|
26
|
+
}
|
|
27
|
+
return process(node);
|
|
28
|
+
});
|
|
29
|
+
return mapped && mapped.length === 1 ? mapped[0] : mapped;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
exports.mapReactTree = mapReactTree;
|