@react-email/preview-server 4.2.5 → 4.2.7

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 (39) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +7 -7
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/_not-found/page.js +1 -1
  6. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/page.js +1 -1
  9. package/.next/server/app/page.js.nft.json +1 -1
  10. package/.next/server/app/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/preview/[...slug]/page.js +166 -143
  12. package/.next/server/app/preview/[...slug]/page.js.nft.json +1 -1
  13. package/.next/server/app/preview/[...slug]/page_client-reference-manifest.js +1 -1
  14. package/.next/server/chunks/12.js +1 -1
  15. package/.next/server/chunks/{37.js → 157.js} +5 -5
  16. package/.next/server/chunks/565.js +1 -0
  17. package/.next/server/pages/500.html +1 -1
  18. package/.next/server/server-reference-manifest.js +1 -1
  19. package/.next/server/server-reference-manifest.json +1 -1
  20. package/.next/static/chunks/{713-505889a7a160009b.js → 713-5291130b4d871493.js} +1 -1
  21. package/.next/static/chunks/824-ee56559d9c878713.js +1 -0
  22. package/.next/static/chunks/app/{layout-c150aaa970ce097a.js → layout-388382080183ddd8.js} +1 -1
  23. package/.next/static/chunks/app/{page-410b4634696dec1b.js → page-0f5269be22bf1b39.js} +1 -1
  24. package/.next/static/chunks/app/preview/[...slug]/page-10339d2e14bc15dc.js +1 -0
  25. package/.next/trace +28 -28
  26. package/CHANGELOG.md +12 -0
  27. package/package.json +3 -3
  28. package/src/actions/render-email-by-path.tsx +17 -9
  29. package/src/app/preview/[...slug]/page.tsx +2 -2
  30. package/src/app/preview/[...slug]/preview.tsx +1 -1
  31. package/src/components/toolbar/checking-results.tsx +3 -3
  32. package/src/components/toolbar.tsx +6 -6
  33. package/src/utils/__snapshots__/get-email-component.spec.ts.snap +151 -128
  34. package/src/utils/constants.ts +3 -1
  35. package/.next/server/chunks/894.js +0 -1
  36. package/.next/static/chunks/251-988548d3856d975a.js +0 -1
  37. package/.next/static/chunks/app/preview/[...slug]/page-7ecc2002daee7da3.js +0 -1
  38. /package/.next/static/{Nnvq__KH7K-JssDF-_qWF → dr3qqzvlj3qJTPOuUIRnm}/_buildManifest.js +0 -0
  39. /package/.next/static/{Nnvq__KH7K-JssDF-_qWF → dr3qqzvlj3qJTPOuUIRnm}/_ssgManifest.js +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @react-email/preview-server
2
2
 
3
+ ## 4.2.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 6997a9e: fix broken file tree animation on built preview server
8
+
9
+ ## 4.2.6
10
+
11
+ ### Patch Changes
12
+
13
+ - d3cc64d: use unformmated markup to send emails, and to render into the iframe
14
+
3
15
  ## 4.2.5
4
16
 
5
17
  ## 4.2.4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-email/preview-server",
3
- "version": "4.2.5",
3
+ "version": "4.2.7",
4
4
  "description": "A live preview of your emails right in your browser.",
5
5
  "main": "./index.mjs",
6
6
  "dependencies": {
@@ -25,7 +25,7 @@
25
25
  "chalk": "4.1.2",
26
26
  "clsx": "2.1.1",
27
27
  "esbuild": "0.25.0",
28
- "framer-motion": "12.7.5",
28
+ "framer-motion": "12.23.12",
29
29
  "json5": "2.2.3",
30
30
  "log-symbols": "4.1.0",
31
31
  "module-punycode": "npm:punycode@2.3.1",
@@ -61,7 +61,7 @@
61
61
  "postcss": "8.5.3",
62
62
  "tailwindcss": "3.4.0",
63
63
  "typescript": "5.8.3",
64
- "@react-email/components": "0.3.2"
64
+ "@react-email/components": "0.4.0"
65
65
  },
66
66
  "license": "MIT",
67
67
  "repository": {
@@ -17,6 +17,7 @@ import { registerSpinnerAutostopping } from '../utils/register-spinner-autostopp
17
17
  import type { ErrorObject } from '../utils/types/error-object';
18
18
 
19
19
  export interface RenderedEmailMetadata {
20
+ prettyMarkup: string;
20
21
  markup: string;
21
22
  /**
22
23
  * HTML markup with `data-source-file` and `data-source-line` attributes pointing to the original
@@ -85,15 +86,21 @@ export const renderEmailByPath = async (
85
86
  const EmailComponent = Email as React.FC;
86
87
  try {
87
88
  const element = createElement(EmailComponent, previewProps);
88
- const markupWithReferences = await renderWithReferences(element, {
89
- pretty: true,
90
- });
91
- const markup = await render(element, {
92
- pretty: true,
93
- });
94
- const plainText = await render(element, {
95
- plainText: true,
96
- });
89
+ const [markupWithReferences, prettyMarkup, markup, plainText] =
90
+ await Promise.all([
91
+ renderWithReferences(element, {
92
+ pretty: true,
93
+ }),
94
+ render(element, {
95
+ pretty: true,
96
+ }),
97
+ render(element, {
98
+ pretty: false,
99
+ }),
100
+ render(element, {
101
+ plainText: true,
102
+ }),
103
+ ]);
97
104
 
98
105
  const reactMarkup = await fs.promises.readFile(emailPath, 'utf-8');
99
106
 
@@ -112,6 +119,7 @@ export const renderEmailByPath = async (
112
119
  });
113
120
 
114
121
  const renderingResult: RenderedEmailMetadata = {
122
+ prettyMarkup,
115
123
  // This ensures that no null byte character ends up in the rendered
116
124
  // markup making users suspect of any issues. These null byte characters
117
125
  // only seem to happen with React 18, as it has no similar incident with React 19.
@@ -71,7 +71,7 @@ This is most likely not an issue with the preview server. Maybe there was a typo
71
71
  });
72
72
  }
73
73
  const lintingSources = getLintingSources(
74
- serverEmailRenderingResult.markup,
74
+ serverEmailRenderingResult.prettyMarkup,
75
75
  '',
76
76
  );
77
77
  lintingRows = [];
@@ -103,7 +103,7 @@ This is most likely not an issue with the preview server. Maybe there was a typo
103
103
  method: 'POST',
104
104
  headers: { 'Content-Type': 'application/json' },
105
105
  body: JSON.stringify({
106
- html: serverEmailRenderingResult.markup,
106
+ html: serverEmailRenderingResult.prettyMarkup,
107
107
  plainText: serverEmailRenderingResult.plainText,
108
108
  }),
109
109
  });
@@ -191,7 +191,7 @@ const Preview = ({ emailTitle, className, ...props }: PreviewProps) => {
191
191
  },
192
192
  {
193
193
  language: 'markup',
194
- content: renderedEmailMetadata.markup,
194
+ content: renderedEmailMetadata.prettyMarkup,
195
195
  },
196
196
  {
197
197
  language: 'markdown',
@@ -1,5 +1,5 @@
1
1
  import * as Collapsible from '@radix-ui/react-collapsible';
2
- import { AnimatePresence, motion } from 'framer-motion';
2
+ import { AnimatePresence, motion, type Variants } from 'framer-motion';
3
3
  import type { ComponentProps } from 'react';
4
4
  import { cn } from '../../utils';
5
5
 
@@ -80,7 +80,7 @@ type ResultProps = {
80
80
  status: ResultStatus;
81
81
  } & ComponentProps<typeof motion.li>;
82
82
 
83
- const resultAnimation = {
83
+ const resultAnimation: Variants = {
84
84
  hidden: { opacity: 0, y: 10 },
85
85
  visible: {
86
86
  opacity: 1,
@@ -110,7 +110,7 @@ export const Result = ({ children, status, ...rest }: ResultProps) => {
110
110
  );
111
111
  };
112
112
 
113
- const titleStatusAnimation = {
113
+ const titleStatusAnimation: Variants = {
114
114
  hidden: { opacity: 0, y: 5 },
115
115
  visible: {
116
116
  opacity: 1,
@@ -41,13 +41,13 @@ const ToolbarInner = ({
41
41
  serverSpamCheckingResult,
42
42
  serverCompatibilityResults,
43
43
 
44
- markup,
44
+ prettyMarkup,
45
45
  reactMarkup,
46
46
  plainText,
47
47
  emailPath,
48
48
  emailSlug,
49
49
  }: ToolbarProps & {
50
- markup: string;
50
+ prettyMarkup: string;
51
51
  reactMarkup: string;
52
52
  plainText: string;
53
53
  emailSlug: string;
@@ -75,7 +75,7 @@ const ToolbarInner = ({
75
75
  );
76
76
  const [spamCheckingResult, { load: loadSpamChecking, loading: spamLoading }] =
77
77
  useSpamAssassin({
78
- markup,
78
+ markup: prettyMarkup,
79
79
  plainText,
80
80
 
81
81
  initialResult: serverSpamCheckingResult ?? cachedSpamCheckingResult,
@@ -85,7 +85,7 @@ const ToolbarInner = ({
85
85
  LintingRow[]
86
86
  >(`linter-${emailSlug.replaceAll('/', '-')}`);
87
87
  const [lintingRows, { load: loadLinting, loading: lintLoading }] = useLinter({
88
- markup,
88
+ markup: prettyMarkup,
89
89
 
90
90
  initialRows: serverLintingRows ?? cachedLintingRows,
91
91
  });
@@ -336,13 +336,13 @@ export const Toolbar = ({
336
336
  React.use(PreviewContext)!;
337
337
 
338
338
  if (renderedEmailMetadata === undefined) return null;
339
- const { markup, plainText, reactMarkup } = renderedEmailMetadata;
339
+ const { prettyMarkup, plainText, reactMarkup } = renderedEmailMetadata;
340
340
 
341
341
  return (
342
342
  <ToolbarInner
343
343
  emailPath={emailPath}
344
344
  emailSlug={emailSlug}
345
- markup={markup}
345
+ prettyMarkup={prettyMarkup}
346
346
  reactMarkup={reactMarkup}
347
347
  plainText={plainText}
348
348
  serverLintingRows={serverLintingRows}
@@ -14,25 +14,25 @@ exports[`getEmailComponent() > with a demo email template 1`] = `
14
14
  </head>
15
15
  <body
16
16
  style='margin-left:auto;margin-right:auto;margin-top:auto;margin-bottom:auto;background-color:rgb(255,255,255);padding-left:8px;padding-right:8px;font-family:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'>
17
- <div
18
- style="display:none;overflow:hidden;line-height:1px;opacity:0;max-height:0;max-width:0"
19
- data-skip-in-text="true">
20
- Join Alan on Vercel
21
- <div>
22
-  ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏
23
- </div>
24
- </div>
25
17
  <table
26
- align="center"
27
- width="100%"
28
18
  border="0"
19
+ width="100%"
29
20
  cellpadding="0"
30
21
  cellspacing="0"
31
22
  role="presentation"
32
- style="margin-left:auto;margin-right:auto;margin-top:40px;margin-bottom:40px;max-width:465px;border-radius:0.25rem;border-width:1px;border-color:rgb(234,234,234);border-style:solid;padding:20px">
23
+ align="center">
33
24
  <tbody>
34
- <tr style="width:100%">
35
- <td>
25
+ <tr>
26
+ <td
27
+ style='margin-left:auto;margin-right:auto;margin-top:auto;margin-bottom:auto;background-color:rgb(255,255,255);padding-left:8px;padding-right:8px;font-family:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'>
28
+ <div
29
+ style="display:none;overflow:hidden;line-height:1px;opacity:0;max-height:0;max-width:0"
30
+ data-skip-in-text="true">
31
+ Join Alan on Vercel
32
+ <div>
33
+  ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏
34
+ </div>
35
+ </div>
36
36
  <table
37
37
  align="center"
38
38
  width="100%"
@@ -40,48 +40,9 @@ exports[`getEmailComponent() > with a demo email template 1`] = `
40
40
  cellpadding="0"
41
41
  cellspacing="0"
42
42
  role="presentation"
43
- style="margin-top:32px">
43
+ style="margin-left:auto;margin-right:auto;margin-top:40px;margin-bottom:40px;max-width:465px;border-radius:0.25rem;border-width:1px;border-color:rgb(234,234,234);border-style:solid;padding:20px">
44
44
  <tbody>
45
- <tr>
46
- <td>
47
- <img
48
- alt="Vercel Logo"
49
- height="37"
50
- src="/static/vercel-logo.png"
51
- style="margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;display:block;outline:none;border:none;text-decoration:none"
52
- width="40" />
53
- </td>
54
- </tr>
55
- </tbody>
56
- </table>
57
- <h1
58
- style="margin-left:0;margin-right:0;margin-top:30px;margin-bottom:30px;padding:0;text-align:center;font-weight:400;font-size:24px;color:rgb(0,0,0)">
59
- Join <strong>Enigma</strong> on <strong>Vercel</strong>
60
- </h1>
61
- <p
62
- style="font-size:14px;color:rgb(0,0,0);line-height:24px;margin-top:16px;margin-bottom:16px">
63
- Hello
64
- <!-- -->alanturing<!-- -->,
65
- </p>
66
- <p
67
- style="font-size:14px;color:rgb(0,0,0);line-height:24px;margin-top:16px;margin-bottom:16px">
68
- <strong>Alan</strong> (<a
69
- href="mailto:alan.turing@example.com"
70
- style="color:rgb(37,99,235);text-decoration-line:none"
71
- target="_blank"
72
- >alan.turing@example.com</a
73
- >) has invited you to the <strong>Enigma</strong> team on<!-- -->
74
- <strong>Vercel</strong>.
75
- </p>
76
- <table
77
- align="center"
78
- width="100%"
79
- border="0"
80
- cellpadding="0"
81
- cellspacing="0"
82
- role="presentation">
83
- <tbody>
84
- <tr>
45
+ <tr style="width:100%">
85
46
  <td>
86
47
  <table
87
48
  align="center"
@@ -89,91 +50,153 @@ exports[`getEmailComponent() > with a demo email template 1`] = `
89
50
  border="0"
90
51
  cellpadding="0"
91
52
  cellspacing="0"
92
- role="presentation">
93
- <tbody style="width:100%">
94
- <tr style="width:100%">
95
- <td align="right" data-id="__react-email-column">
53
+ role="presentation"
54
+ style="margin-top:32px">
55
+ <tbody>
56
+ <tr>
57
+ <td>
96
58
  <img
97
- alt="alanturing&#x27;s profile picture"
98
- height="64"
99
- src="/static/vercel-user.png"
100
- style="border-radius:9999px;display:block;outline:none;border:none;text-decoration:none"
101
- width="64" />
59
+ alt="Vercel Logo"
60
+ height="37"
61
+ src="/static/vercel-logo.png"
62
+ style="margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;display:block;outline:none;border:none;text-decoration:none"
63
+ width="40" />
102
64
  </td>
103
- <td align="center" data-id="__react-email-column">
104
- <img
105
- alt="Arrow indicating invitation"
106
- height="9"
107
- src="/static/vercel-arrow.png"
108
- style="display:block;outline:none;border:none;text-decoration:none"
109
- width="12" />
65
+ </tr>
66
+ </tbody>
67
+ </table>
68
+ <h1
69
+ style="margin-left:0;margin-right:0;margin-top:30px;margin-bottom:30px;padding:0;text-align:center;font-weight:400;font-size:24px;color:rgb(0,0,0)">
70
+ Join <strong>Enigma</strong> on <strong>Vercel</strong>
71
+ </h1>
72
+ <p
73
+ style="font-size:14px;color:rgb(0,0,0);line-height:24px;margin-top:16px;margin-bottom:16px">
74
+ Hello
75
+ <!-- -->alanturing<!-- -->,
76
+ </p>
77
+ <p
78
+ style="font-size:14px;color:rgb(0,0,0);line-height:24px;margin-top:16px;margin-bottom:16px">
79
+ <strong>Alan</strong> (<a
80
+ href="mailto:alan.turing@example.com"
81
+ style="color:rgb(37,99,235);text-decoration-line:none"
82
+ target="_blank"
83
+ >alan.turing@example.com</a
84
+ >) has invited you to the <strong>Enigma</strong> team on<!-- -->
85
+ <strong>Vercel</strong>.
86
+ </p>
87
+ <table
88
+ align="center"
89
+ width="100%"
90
+ border="0"
91
+ cellpadding="0"
92
+ cellspacing="0"
93
+ role="presentation">
94
+ <tbody>
95
+ <tr>
96
+ <td>
97
+ <table
98
+ align="center"
99
+ width="100%"
100
+ border="0"
101
+ cellpadding="0"
102
+ cellspacing="0"
103
+ role="presentation">
104
+ <tbody style="width:100%">
105
+ <tr style="width:100%">
106
+ <td
107
+ align="right"
108
+ data-id="__react-email-column">
109
+ <img
110
+ alt="alanturing&#x27;s profile picture"
111
+ height="64"
112
+ src="/static/vercel-user.png"
113
+ style="border-radius:9999px;display:block;outline:none;border:none;text-decoration:none"
114
+ width="64" />
115
+ </td>
116
+ <td
117
+ align="center"
118
+ data-id="__react-email-column">
119
+ <img
120
+ alt="Arrow indicating invitation"
121
+ height="9"
122
+ src="/static/vercel-arrow.png"
123
+ style="display:block;outline:none;border:none;text-decoration:none"
124
+ width="12" />
125
+ </td>
126
+ <td
127
+ align="left"
128
+ data-id="__react-email-column">
129
+ <img
130
+ alt="Enigma team logo"
131
+ height="64"
132
+ src="/static/vercel-team.png"
133
+ style="border-radius:9999px;display:block;outline:none;border:none;text-decoration:none"
134
+ width="64" />
135
+ </td>
136
+ </tr>
137
+ </tbody>
138
+ </table>
110
139
  </td>
111
- <td align="left" data-id="__react-email-column">
112
- <img
113
- alt="Enigma team logo"
114
- height="64"
115
- src="/static/vercel-team.png"
116
- style="border-radius:9999px;display:block;outline:none;border:none;text-decoration:none"
117
- width="64" />
140
+ </tr>
141
+ </tbody>
142
+ </table>
143
+ <table
144
+ align="center"
145
+ width="100%"
146
+ border="0"
147
+ cellpadding="0"
148
+ cellspacing="0"
149
+ role="presentation"
150
+ style="margin-top:32px;margin-bottom:32px;text-align:center">
151
+ <tbody>
152
+ <tr>
153
+ <td>
154
+ <a
155
+ href="https://vercel.com"
156
+ style="border-radius:0.25rem;background-color:rgb(0,0,0);padding-left:20px;padding-right:20px;padding-top:12px;padding-bottom:12px;text-align:center;font-weight:600;font-size:12px;color:rgb(255,255,255);text-decoration-line:none;line-height:100%;text-decoration:none;display:inline-block;max-width:100%;mso-padding-alt:0px"
157
+ target="_blank"
158
+ ><span
159
+ ><!--[if mso]><i style="mso-font-width:500%;mso-text-raise:18" hidden>&#8202;&#8202;</i><![endif]--></span
160
+ ><span
161
+ style="max-width:100%;display:inline-block;line-height:120%;mso-padding-alt:0px;mso-text-raise:9px"
162
+ >Join the team</span
163
+ ><span
164
+ ><!--[if mso]><i style="mso-font-width:500%" hidden>&#8202;&#8202;&#8203;</i><![endif]--></span
165
+ ></a
166
+ >
118
167
  </td>
119
168
  </tr>
120
169
  </tbody>
121
170
  </table>
171
+ <p
172
+ style="font-size:14px;color:rgb(0,0,0);line-height:24px;margin-top:16px;margin-bottom:16px">
173
+ or copy and paste this URL into your browser:<!-- -->
174
+ <a
175
+ href="https://vercel.com"
176
+ style="color:rgb(37,99,235);text-decoration-line:none"
177
+ target="_blank"
178
+ >https://vercel.com</a
179
+ >
180
+ </p>
181
+ <hr
182
+ style="margin-left:0;margin-right:0;margin-top:26px;margin-bottom:26px;width:100%;border-width:1px;border-color:rgb(234,234,234);border-style:solid;border:none;border-top:1px solid #eaeaea" />
183
+ <p
184
+ style="color:rgb(102,102,102);font-size:12px;line-height:24px;margin-top:16px;margin-bottom:16px">
185
+ This invitation was intended for<!-- -->
186
+ <span style="color:rgb(0,0,0)">alanturing</span>. This
187
+ invite was sent from
188
+ <span style="color:rgb(0,0,0)">204.13.186.218</span>
189
+ <!-- -->located in<!-- -->
190
+ <span style="color:rgb(0,0,0)">São Paulo, Brazil</span>.
191
+ If you were not expecting this invitation, you can ignore
192
+ this email. If you are concerned about your account&#x27;s
193
+ safety, please reply to this email to get in touch with
194
+ us.
195
+ </p>
122
196
  </td>
123
197
  </tr>
124
198
  </tbody>
125
199
  </table>
126
- <table
127
- align="center"
128
- width="100%"
129
- border="0"
130
- cellpadding="0"
131
- cellspacing="0"
132
- role="presentation"
133
- style="margin-top:32px;margin-bottom:32px;text-align:center">
134
- <tbody>
135
- <tr>
136
- <td>
137
- <a
138
- href="https://vercel.com"
139
- style="border-radius:0.25rem;background-color:rgb(0,0,0);padding-left:20px;padding-right:20px;padding-top:12px;padding-bottom:12px;text-align:center;font-weight:600;font-size:12px;color:rgb(255,255,255);text-decoration-line:none;line-height:100%;text-decoration:none;display:inline-block;max-width:100%;mso-padding-alt:0px"
140
- target="_blank"
141
- ><span
142
- ><!--[if mso]><i style="mso-font-width:500%;mso-text-raise:18" hidden>&#8202;&#8202;</i><![endif]--></span
143
- ><span
144
- style="max-width:100%;display:inline-block;line-height:120%;mso-padding-alt:0px;mso-text-raise:9px"
145
- >Join the team</span
146
- ><span
147
- ><!--[if mso]><i style="mso-font-width:500%" hidden>&#8202;&#8202;&#8203;</i><![endif]--></span
148
- ></a
149
- >
150
- </td>
151
- </tr>
152
- </tbody>
153
- </table>
154
- <p
155
- style="font-size:14px;color:rgb(0,0,0);line-height:24px;margin-top:16px;margin-bottom:16px">
156
- or copy and paste this URL into your browser:<!-- -->
157
- <a
158
- href="https://vercel.com"
159
- style="color:rgb(37,99,235);text-decoration-line:none"
160
- target="_blank"
161
- >https://vercel.com</a
162
- >
163
- </p>
164
- <hr
165
- style="margin-left:0;margin-right:0;margin-top:26px;margin-bottom:26px;width:100%;border-width:1px;border-color:rgb(234,234,234);border-style:solid;border:none;border-top:1px solid #eaeaea" />
166
- <p
167
- style="color:rgb(102,102,102);font-size:12px;line-height:24px;margin-top:16px;margin-bottom:16px">
168
- This invitation was intended for<!-- -->
169
- <span style="color:rgb(0,0,0)">alanturing</span>. This invite was
170
- sent from <span style="color:rgb(0,0,0)">204.13.186.218</span>
171
- <!-- -->located in<!-- -->
172
- <span style="color:rgb(0,0,0)">São Paulo, Brazil</span>. If you
173
- were not expecting this invitation, you can ignore this email. If
174
- you are concerned about your account&#x27;s safety, please reply
175
- to this email to get in touch with us.
176
- </p>
177
200
  </td>
178
201
  </tr>
179
202
  </tbody>
@@ -1,4 +1,6 @@
1
- export const tabTransition = {
1
+ import type { Transition } from 'framer-motion';
2
+
3
+ export const tabTransition: Transition = {
2
4
  type: 'spring',
3
5
  stiffness: 2000,
4
6
  damping: 80,
@@ -1 +0,0 @@
1
- exports.id=894,exports.ids=[894],exports.modules={19233:()=>{},26376:(a,b,c)=>{Promise.resolve().then(c.bind(c,30928))},26778:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(51956);let e=async a=>[{type:"image/x-icon",sizes:"16x16",url:(0,d.fillMetadataSegment)(".",await a.params,"favicon.ico")+""}]},30928:(a,b,c)=>{"use strict";c.d(b,{EmailsProvider:()=>l,J:()=>k});var d=c(92805),e=c(68928),f=c(23705);let g=(0,f.createServerReference)("7f4ea949a5b95c3d1eb43bc8bc8058a730a29a1629",f.callServer,void 0,f.findSourceMapURL,"getEmailsDirectoryMetadataAction");var h=c(58366),i=c(59833);let j=(0,e.createContext)(void 0),k=()=>{let a=(0,e.useContext)(j);if(void 0===a)throw Error("Cannot call `useEmail()` outside of an EmailsContext provider!");return a},l=a=>{let[b,c]=(0,e.useState)(a.initialEmailsDirectoryMetadata);return h.Hf||h.m4||(0,i.a)(async()=>{let b=await g(a.initialEmailsDirectoryMetadata.absolutePath);if(b)c(b);else throw Error("Hot reloading: unable to find the emails directory to update the sidebar")}),(0,d.jsx)(j.Provider,{value:{emailsDirectoryMetadata:b},children:a.children})}},37261:(a,b,c)=>{"use strict";c.d(b,{EmailsProvider:()=>e});var d=c(65863);(0,d.registerClientReference)(function(){throw Error("Attempted to call useEmails() from the server but useEmails is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/actions-runner/_work/react-email/react-email/packages/preview-server/src/contexts/emails.tsx","useEmails");let e=(0,d.registerClientReference)(function(){throw Error("Attempted to call EmailsProvider() from the server but EmailsProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/actions-runner/_work/react-email/react-email/packages/preview-server/src/contexts/emails.tsx","EmailsProvider")},39528:(a,b,c)=>{Promise.resolve().then(c.bind(c,37261))},42192:(a,b,c)=>{"use strict";c.d(b,{Hf:()=>g,Z8:()=>f,m4:()=>h,n_:()=>e,w5:()=>d}),process.env.EMAILS_DIR_RELATIVE_PATH;let d=process.env.USER_PROJECT_LOCATION,e=process.env.PREVIEW_SERVER_LOCATION,f=process.env.EMAILS_DIR_ABSOLUTE_PATH,g="true"===process.env.NEXT_PUBLIC_IS_BUILDING,h="true"===process.env.NEXT_PUBLIC_IS_PREVIEW_DEVELOPMENT},44713:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,99141,23)),Promise.resolve().then(c.t.bind(c,26812,23)),Promise.resolve().then(c.t.bind(c,3378,23)),Promise.resolve().then(c.t.bind(c,21381,23)),Promise.resolve().then(c.t.bind(c,54209,23)),Promise.resolve().then(c.t.bind(c,39801,23)),Promise.resolve().then(c.t.bind(c,72241,23)),Promise.resolve().then(c.t.bind(c,17443,23)),Promise.resolve().then(c.bind(c,8897))},46263:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>n,dynamic:()=>m,metadata:()=>l});var d=c(89815);c(19233);var e=c(37261),f=c(95455),g=c(42192),h=c(97964),i=c.n(h),j=c(94455),k=c.n(j);let l={title:"React Email"},m="force-dynamic",n=async({children:a})=>{let b=await (0,f.getEmailsDirectoryMetadata)(g.Z8);if(void 0===b)throw Error(`Could not find the emails directory specified under ${g.Z8}!`);return(0,d.jsx)("html",{className:`${i().variable} ${k().variable} font-sans`,lang:"en",children:(0,d.jsx)("body",{className:"relative h-screen bg-black text-slate-11 leading-loose selection:bg-cyan-5 selection:text-cyan-12",children:(0,d.jsx)("div",{className:"bg-gradient-to-t from-slate-3 flex flex-col",children:(0,d.jsx)(e.EmailsProvider,{initialEmailsDirectoryMetadata:b,children:a})})})})}},58366:(a,b,c)=>{"use strict";c.d(b,{Hf:()=>d,m4:()=>e}),process.env.EMAILS_DIR_RELATIVE_PATH,process.env.USER_PROJECT_LOCATION,process.env.PREVIEW_SERVER_LOCATION,process.env.EMAILS_DIR_ABSOLUTE_PATH;let d="true"===process.env.NEXT_PUBLIC_IS_BUILDING,e="true"===process.env.NEXT_PUBLIC_IS_PREVIEW_DEVELOPMENT},59833:(a,b,c)=>{"use strict";c.d(b,{a:()=>f});var d=c(68928),e=c(40745);let f=a=>{let b=(0,d.useRef)(null);(0,d.useEffect)(()=>{b.current||(b.current=(0,e.io)());let c=b.current;return c.on("reload",b=>{console.debug("Reloading..."),a(b)}),()=>{c.off()}},[a])}},61064:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"7f4ea949a5b95c3d1eb43bc8bc8058a730a29a1629":()=>l});var d=c(24901);c(47185);var e=c(73024),f=c.n(e),g=c(76760),h=c.n(g);let i=async a=>{let b;try{b=await f().promises.open(a,"r")}catch(a){return console.warn(a),!1}if((await b.stat()).isDirectory())return await b.close(),!1;let{ext:c}=h().parse(a);if(![".js",".tsx",".jsx"].includes(c))return await b.close(),!1;let d=await b.readFile("utf8");await b.close();let e=/\bexport\s+default\b/gm.test(d),g=/\bmodule\.exports\s*=/gm.test(d),i=/\bexport\s+\{[^}]*\bdefault\b[^}]*\}/gm.test(d);return e||g||i},j=async(a,b=!1,c=!1,d=a)=>{if(!f().existsSync(a))return;let e=await f().promises.readdir(a,{withFileTypes:!0}),g=await Promise.all(e.map(b=>i(h().join(a,b.name)))),k=e.filter((a,b)=>g[b]).map(a=>b?a.name:a.name.replace(h().extname(a.name),"")),l=await Promise.all(e.filter(a=>a.isDirectory()&&!a.name.startsWith("_")&&"static"!==a.name).map(c=>j(h().join(a,c.name),b,!0,d))),m={absolutePath:a,relativePath:h().relative(d,a),directoryName:a.split(h().sep).pop(),emailFilenames:k,subDirectories:l};return c?(a=>{let b=a;for(;0===b.emailFilenames.length&&1===b.subDirectories.length;){let a=b.subDirectories[0];b={...a,directoryName:h().join(b.directoryName,a.directoryName)}}return b})(m):m};var k=c(86153);let l=async(a,b=!1,c=!1,d=a)=>j(a,b,c,d);(0,k.D)([l]),(0,d.A)(l,"7f4ea949a5b95c3d1eb43bc8bc8058a730a29a1629",null)},72112:()=>{},79561:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,94955,23)),Promise.resolve().then(c.t.bind(c,93642,23)),Promise.resolve().then(c.t.bind(c,35500,23)),Promise.resolve().then(c.t.bind(c,29651,23)),Promise.resolve().then(c.t.bind(c,41699,23)),Promise.resolve().then(c.t.bind(c,44843,23)),Promise.resolve().then(c.t.bind(c,18779,23)),Promise.resolve().then(c.t.bind(c,71741,23)),Promise.resolve().then(c.t.bind(c,35059,23))},92665:()=>{},95455:(a,b,c)=>{"use strict";c.r(b),c.d(b,{getEmailsDirectoryMetadata:()=>i});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f);let h=async a=>{let b;try{b=await e().promises.open(a,"r")}catch(a){return console.warn(a),!1}if((await b.stat()).isDirectory())return await b.close(),!1;let{ext:c}=g().parse(a);if(![".js",".tsx",".jsx"].includes(c))return await b.close(),!1;let d=await b.readFile("utf8");await b.close();let f=/\bexport\s+default\b/gm.test(d),h=/\bmodule\.exports\s*=/gm.test(d),i=/\bexport\s+\{[^}]*\bdefault\b[^}]*\}/gm.test(d);return f||h||i},i=async(a,b=!1,c=!1,d=a)=>{if(!e().existsSync(a))return;let f=await e().promises.readdir(a,{withFileTypes:!0}),j=await Promise.all(f.map(b=>h(g().join(a,b.name)))),k=f.filter((a,b)=>j[b]).map(a=>b?a.name:a.name.replace(g().extname(a.name),"")),l=await Promise.all(f.filter(a=>a.isDirectory()&&!a.name.startsWith("_")&&"static"!==a.name).map(c=>i(g().join(a,c.name),b,!0,d))),m={absolutePath:a,relativePath:g().relative(d,a),directoryName:a.split(g().sep).pop(),emailFilenames:k,subDirectories:l};return c?(a=>{let b=a;for(;0===b.emailFilenames.length&&1===b.subDirectories.length;){let a=b.subDirectories[0];b={...a,directoryName:g().join(b.directoryName,a.directoryName)}}return b})(m):m}}};