((Yx-jg;HUEA2%KcFQ
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
O!Z9xPL74vs|M@?3c8Hw-
literal 0
HcmV?d00001
diff --git a/apps/react-email-starter/emails/acceptance-email.tsx b/apps/react-email-starter/emails/acceptance-email.tsx
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/react-email-starter/emails/notion-magic-link.tsx b/apps/react-email-starter/emails/notion-magic-link.tsx
new file mode 100644
index 000000000..3442f4f03
--- /dev/null
+++ b/apps/react-email-starter/emails/notion-magic-link.tsx
@@ -0,0 +1,149 @@
+import {
+ Body,
+ Container,
+ Head,
+ Heading,
+ Html,
+ Img,
+ Link,
+ Preview,
+ Text,
+} from '@react-email/components';
+
+interface NotionMagicLinkEmailProps {
+ loginCode?: string;
+}
+
+const baseUrl = process.env.VERCEL_URL
+ ? `https://${process.env.VERCEL_URL}`
+ : '';
+
+export const NotionMagicLinkEmail = ({
+ loginCode,
+}: NotionMagicLinkEmailProps) => (
+
+
+ Log in with this magic link
+
+
+ Login
+
+ Click here to log in with this magic link
+
+
+ Or, copy and paste this temporary login code:
+
+ {loginCode}
+
+ If you didn't try to login, you can safely ignore this email.
+
+
+ Hint: You can set a permanent password in Settings & members → My
+ account.
+
+
+
+
+ Notion.so
+
+ , the all-in-one-workspace
+
+ for your notes, tasks, wikis, and databases.
+
+
+
+
+);
+
+NotionMagicLinkEmail.PreviewProps = {
+ loginCode: 'sparo-ndigo-amurt-secan',
+} as NotionMagicLinkEmailProps;
+
+export default NotionMagicLinkEmail;
+
+const main = {
+ backgroundColor: '#ffffff',
+};
+
+const container = {
+ paddingLeft: '12px',
+ paddingRight: '12px',
+ margin: '0 auto',
+};
+
+const h1 = {
+ color: '#333',
+ fontFamily:
+ "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif",
+ fontSize: '24px',
+ fontWeight: 'bold',
+ margin: '40px 0',
+ padding: '0',
+};
+
+const link = {
+ color: '#2754C5',
+ fontFamily:
+ "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif",
+ fontSize: '14px',
+ textDecoration: 'underline',
+};
+
+const text = {
+ color: '#333',
+ fontFamily:
+ "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif",
+ fontSize: '14px',
+ margin: '24px 0',
+};
+
+const footer = {
+ color: '#898989',
+ fontFamily:
+ "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif",
+ fontSize: '12px',
+ lineHeight: '22px',
+ marginTop: '12px',
+ marginBottom: '24px',
+};
+
+const code = {
+ display: 'inline-block',
+ padding: '16px 4.5%',
+ width: '90.5%',
+ backgroundColor: '#f4f4f4',
+ borderRadius: '5px',
+ border: '1px solid #eee',
+ color: '#333',
+};
diff --git a/apps/react-email-starter/emails/static/notion-logo.png b/apps/react-email-starter/emails/static/notion-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..57cddee9b737055f418bd95f126093204bb09e3f
GIT binary patch
literal 1929
zcmV;42X^?0P)hmX
z+?la#F$UPeFocWj!A>VJ$i_%Io=9I`NJdtFt_Ztqq}li>{sjSA#zgT>*+a+D*CSz2
zo8V-a`#^*c37{HJHteNjyeeMl8k=m)vT=x&0Fx5W>np}R=|co~%ElBkF@n#MA)j8jkR*I=aKiH3a_e>Qx-l3VxCQ+!437_eqQi@6wMPggqDTZ
zoy#VO2l>R6Nca{N36lspxU)HLi9xpdA`-h6#mXv6!d<4Z+S>)3@ijQBc(
zl?wuJIA8W;F;ka~GgQj43+34L61A1E!zY}#aN_(nC_lL`H)B*|6d7l%F?fjm1*Vdq
zjR>Gh!UI7xm}rc1sqxO3F_Yz>Z34)$@T=r|{R-X*G@JXIHYK1;7EmR)lfVCQhWUsa
zAVB0e#}ovKqUCK95FlLRZIxqnrPQA37pC$mXKk7=g8*hw4RI)_X6hJ^>e}X_iUR>^
z8ZXrt(|4redIw!2fNF>?8jo_WCZP}@75bNIj0tqG3i#BL1mfxg>|p%33GfqBA2$I2
z5C8xH01yBG0f0#R05M>q9IH#$sw^Dk{rv|JARKTb@`o~}grA29(7^Lfy|*y`S^lDi
zl*m{Kqg}(e2LX;JnS0mw6QR`<{Cz#&So51lx5UQh*RufuJ{vl*5Ei)(FNEGU!I;qN
zdAr=|t6)N`0&G5ge9PRv=O7hQ^j9{%vXebJ%|DY#-E5256_M_&+2CkSONrY?N;DH6Cl!q#`-z;_2q^-rq!1}*{bLK-ol5}-;1T4|nkscX
zH32xmmMnsI8$bfev4}wmKmffIfB+F=)O8sE0jf#C5Cnh}fB+F=BKiX$0Hgo}h!uk_
zN&yHExfH}ifEA=5ZUX#Zbj!Z(L4Ytp^~&1Lyyh-80_?N#NZ1<~fB@lP$!L~Zb)qVW
zwF;OKeNOOF5Gw(A1fY7_CTJ;$xesv1Xdb!J6
z1!x7+^#+El+9uE-fQM2rC;BYcPZxmzHL+rJPvrz91t37=QUC&cfR}_+ZQ@{_E&>5Q
zW69{A$bA9D@mjV!=yf;881q%=$Jn+5%RhxJM
z0>s@LfCL0A1#=J}Zmd{`_b>thB9{UXpc;5d_y_{TjU{X0#f>0<|55+~L=4I{F$fSS
zDBHwd5?~7(YkLE;E)!q}8*9P)0-LT9AccM7=?$Efgt!TS*G$T_ixB=m2`GLXVhb
z1lV`2++pu~4B1$n6SNeZY08~0^}qQ_-REq)vG>gzmhAmLebY7k+*uyGNPrN^9q!Tp
z)c8Ga_=OJT8$2LOM2BUTBJCpt6CwRaerCd*A$1a&sa2^hu+
zdebFgbA|;ZK42gc>#5B$uq+>#iOg~UJ6H+nL&eat#`neXsP6nz>>Zrv18ald=|_@`
z4Ne%dUy!g(+P=sh;b-x-X4U<4cp3TC<8V6C81q8onLZ=U#ua4*kn@32MHchPd$LeT
zs9sj&RhJsi>^io#B0%m5F9v$VBf(=yB3a~BV~uA5dhj03#ufo`k4rGmUgAi4zgRlS
zpKSb%`SuQ6a{q1XWE3}zFzCj#ZMNn404Cqoub#`xlB5RZ9z4L
z>V2wrl6qfk1ju^?_l%}(T4ao^#yh?8z8DE0Cx;VFa@cwA0|4jvPk;dc68z~C(;byw
P00000NkvXXu0mjfWmII?
literal 0
HcmV?d00001
diff --git a/apps/react-email-starter/package.json b/apps/react-email-starter/package.json
new file mode 100644
index 000000000..566b88ba3
--- /dev/null
+++ b/apps/react-email-starter/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "react-email-starter",
+ "version": "1.1.0",
+ "private": true,
+ "scripts": {
+ "build": "email build",
+ "dev": "email dev",
+ "export": "email export"
+ },
+ "dependencies": {
+ "@react-email/components": "0.0.38",
+ "react-dom": "^19.0.0",
+ "react": "^19.0.0"
+ },
+ "devDependencies": {
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
+ "react-email": "4.0.11"
+ }
+}
diff --git a/apps/react-email-starter/readme.md b/apps/react-email-starter/readme.md
new file mode 100644
index 000000000..fc875bfa3
--- /dev/null
+++ b/apps/react-email-starter/readme.md
@@ -0,0 +1,27 @@
+# React Email Starter
+
+A live preview right in your browser so you don't need to keep sending real emails during development.
+
+## Getting Started
+
+First, install the dependencies:
+
+```sh
+npm install
+# or
+yarn
+```
+
+Then, run the development server:
+
+```sh
+npm run dev
+# or
+yarn dev
+```
+
+Open [localhost:3000](http://localhost:3000) with your browser to see the result.
+
+## License
+
+MIT License
diff --git a/apps/react-email-starter/tsconfig.json b/apps/react-email-starter/tsconfig.json
new file mode 100644
index 000000000..3cbef65b8
--- /dev/null
+++ b/apps/react-email-starter/tsconfig.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "composite": false,
+ "jsx": "react-jsx",
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "strictNullChecks": true
+ },
+ "include": ["**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules", ".react-email"]
+}
From cb39a7a99dba22a5f4202b011dafb73e1e7a12d7 Mon Sep 17 00:00:00 2001
From: Lewin Bobda <116130662+Lewin-B@users.noreply.github.com>
Date: Thu, 8 May 2025 23:52:54 -0400
Subject: [PATCH 03/15] Email templates starter
---
.../bun.lockb | Bin
.../emails/acceptance-email.tsx | 68 ++++
.../emails/assets/congrats-box.tsx | 34 ++
apps/email-templates/emails/assets/hero.tsx | 308 ++++++++++++++++++
.../email-templates/emails/assets/kh-logo.tsx | 167 ++++++++++
.../emails/notion-magic-link.tsx | 0
.../emails/static/notion-logo.png | Bin
.../package.json | 0
.../readme.md | 0
.../tsconfig.json | 0
.../emails/acceptance-email.tsx | 0
11 files changed, 577 insertions(+)
rename apps/{react-email-starter => email-templates}/bun.lockb (100%)
create mode 100644 apps/email-templates/emails/acceptance-email.tsx
create mode 100644 apps/email-templates/emails/assets/congrats-box.tsx
create mode 100644 apps/email-templates/emails/assets/hero.tsx
create mode 100644 apps/email-templates/emails/assets/kh-logo.tsx
rename apps/{react-email-starter => email-templates}/emails/notion-magic-link.tsx (100%)
rename apps/{react-email-starter => email-templates}/emails/static/notion-logo.png (100%)
rename apps/{react-email-starter => email-templates}/package.json (100%)
rename apps/{react-email-starter => email-templates}/readme.md (100%)
rename apps/{react-email-starter => email-templates}/tsconfig.json (100%)
delete mode 100644 apps/react-email-starter/emails/acceptance-email.tsx
diff --git a/apps/react-email-starter/bun.lockb b/apps/email-templates/bun.lockb
similarity index 100%
rename from apps/react-email-starter/bun.lockb
rename to apps/email-templates/bun.lockb
diff --git a/apps/email-templates/emails/acceptance-email.tsx b/apps/email-templates/emails/acceptance-email.tsx
new file mode 100644
index 000000000..45269b123
--- /dev/null
+++ b/apps/email-templates/emails/acceptance-email.tsx
@@ -0,0 +1,68 @@
+import {
+ Body,
+ Container,
+ Head,
+ Html,
+ Img,
+ Preview,
+ Section,
+ Tailwind,
+ Text,
+} from "@react-email/components";
+
+import CongratsBox from "./assets/congrats-box";
+import Hero from "./assets/hero";
+import KhLogo from "./assets/kh-logo";
+
+interface AcceptanceEmailProps {
+ name: string;
+}
+
+export const AcceptanceEmail = ({ name }: AcceptanceEmailProps) => {
+ const previewText = `Congrats ${name}! Your spot at KnightHacks is secured 🎉`;
+
+ return (
+
+
+
+
+ {previewText}
+
+
+
+
+
+
+
+
+
+ Congrats,
+
+ Katherina
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default AcceptanceEmail;
diff --git a/apps/email-templates/emails/assets/congrats-box.tsx b/apps/email-templates/emails/assets/congrats-box.tsx
new file mode 100644
index 000000000..61629c6f9
--- /dev/null
+++ b/apps/email-templates/emails/assets/congrats-box.tsx
@@ -0,0 +1,34 @@
+import { SVGProps } from "react";
+
+const SvgIcon = (props: SVGProps) => (
+
+);
+
+export default SvgIcon;
diff --git a/apps/email-templates/emails/assets/hero.tsx b/apps/email-templates/emails/assets/hero.tsx
new file mode 100644
index 000000000..2068e22da
--- /dev/null
+++ b/apps/email-templates/emails/assets/hero.tsx
@@ -0,0 +1,308 @@
+import { SVGProps } from "react";
+
+const Hero = (props: SVGProps) => (
+
+);
+export default Hero;
diff --git a/apps/email-templates/emails/assets/kh-logo.tsx b/apps/email-templates/emails/assets/kh-logo.tsx
new file mode 100644
index 000000000..fa2d080d1
--- /dev/null
+++ b/apps/email-templates/emails/assets/kh-logo.tsx
@@ -0,0 +1,167 @@
+import { SVGProps } from "react";
+
+const KhLogo = (props: SVGProps) => (
+
+);
+
+export default KhLogo;
diff --git a/apps/react-email-starter/emails/notion-magic-link.tsx b/apps/email-templates/emails/notion-magic-link.tsx
similarity index 100%
rename from apps/react-email-starter/emails/notion-magic-link.tsx
rename to apps/email-templates/emails/notion-magic-link.tsx
diff --git a/apps/react-email-starter/emails/static/notion-logo.png b/apps/email-templates/emails/static/notion-logo.png
similarity index 100%
rename from apps/react-email-starter/emails/static/notion-logo.png
rename to apps/email-templates/emails/static/notion-logo.png
diff --git a/apps/react-email-starter/package.json b/apps/email-templates/package.json
similarity index 100%
rename from apps/react-email-starter/package.json
rename to apps/email-templates/package.json
diff --git a/apps/react-email-starter/readme.md b/apps/email-templates/readme.md
similarity index 100%
rename from apps/react-email-starter/readme.md
rename to apps/email-templates/readme.md
diff --git a/apps/react-email-starter/tsconfig.json b/apps/email-templates/tsconfig.json
similarity index 100%
rename from apps/react-email-starter/tsconfig.json
rename to apps/email-templates/tsconfig.json
diff --git a/apps/react-email-starter/emails/acceptance-email.tsx b/apps/react-email-starter/emails/acceptance-email.tsx
deleted file mode 100644
index e69de29bb..000000000
From a03281ba98536c095edfa41c745f01d334f63181 Mon Sep 17 00:00:00 2001
From: Lewin Bobda <116130662+Lewin-B@users.noreply.github.com>
Date: Fri, 9 May 2025 13:34:33 -0400
Subject: [PATCH 04/15] Finish confirmation section
---
.../emails/acceptance-email.tsx | 29 ++++++++++++++----
.../emails/assets/confirm-box.tsx | 29 ++++++++++++++++++
.../emails/assets/confirm-button.tsx | 30 +++++++++++++++++++
.../emails/assets/next-steps-divider.tsx | 27 +++++++++++++++++
4 files changed, 109 insertions(+), 6 deletions(-)
create mode 100644 apps/email-templates/emails/assets/confirm-box.tsx
create mode 100644 apps/email-templates/emails/assets/confirm-button.tsx
create mode 100644 apps/email-templates/emails/assets/next-steps-divider.tsx
diff --git a/apps/email-templates/emails/acceptance-email.tsx b/apps/email-templates/emails/acceptance-email.tsx
index 45269b123..f6e8b9556 100644
--- a/apps/email-templates/emails/acceptance-email.tsx
+++ b/apps/email-templates/emails/acceptance-email.tsx
@@ -3,16 +3,17 @@ import {
Container,
Head,
Html,
- Img,
Preview,
Section,
Tailwind,
Text,
} from "@react-email/components";
+import ConfirmBox from "./assets/confirm-box";
+import ConfirmButton from "./assets/confirm-button";
import CongratsBox from "./assets/congrats-box";
import Hero from "./assets/hero";
-import KhLogo from "./assets/kh-logo";
+import NextSteps from "./assets/next-steps-divider";
interface AcceptanceEmailProps {
name: string;
@@ -39,10 +40,6 @@ export const AcceptanceEmail = ({ name }: AcceptanceEmailProps) => {
{previewText}
-
-
@@ -58,6 +55,26 @@ export const AcceptanceEmail = ({ name }: AcceptanceEmailProps) => {
+
+
+
+
+
+ 1. CONFIRM YOUR SPOT!
+
+
+ (Spots are filling up quickly—confirm ASAP!)
+
+
+
+
diff --git a/apps/email-templates/emails/assets/confirm-box.tsx b/apps/email-templates/emails/assets/confirm-box.tsx
new file mode 100644
index 000000000..3c1f20789
--- /dev/null
+++ b/apps/email-templates/emails/assets/confirm-box.tsx
@@ -0,0 +1,29 @@
+import { SVGProps } from "react";
+
+const ConfirmButton = (props: SVGProps
) => (
+
+);
+
+export default ConfirmButton;
diff --git a/apps/email-templates/emails/assets/confirm-button.tsx b/apps/email-templates/emails/assets/confirm-button.tsx
new file mode 100644
index 000000000..5f7d8aeca
--- /dev/null
+++ b/apps/email-templates/emails/assets/confirm-button.tsx
@@ -0,0 +1,30 @@
+import { SVGProps } from "react";
+
+const ConfirmButton = (props: SVGProps) => (
+
+);
+
+export default ConfirmButton;
diff --git a/apps/email-templates/emails/assets/next-steps-divider.tsx b/apps/email-templates/emails/assets/next-steps-divider.tsx
new file mode 100644
index 000000000..c49226509
--- /dev/null
+++ b/apps/email-templates/emails/assets/next-steps-divider.tsx
@@ -0,0 +1,27 @@
+import * as React from "react";
+import { SVGProps } from "react";
+
+const NextSteps = (props: SVGProps) => (
+
+);
+
+export default NextSteps;
From 7a42cec037d718d89592d3ddc11ddc1400ee23bb Mon Sep 17 00:00:00 2001
From: Lewin Bobda <116130662+Lewin-B@users.noreply.github.com>
Date: Fri, 9 May 2025 14:34:36 -0400
Subject: [PATCH 05/15] Discord and graphics section
---
.../emails/acceptance-email.tsx | 50 +++++++++++++++++--
.../emails/assets/discord-box.tsx | 29 +++++++++++
.../emails/assets/discord-button.tsx | 26 ++++++++++
.../emails/assets/graphics-box.tsx | 29 +++++++++++
.../emails/assets/graphics-button.tsx | 31 ++++++++++++
.../emails/assets/guide-button.tsx | 46 +++++++++++++++++
.../emails/assets/resources-divider.tsx | 26 ++++++++++
.../emails/assets/website-button.tsx | 46 +++++++++++++++++
8 files changed, 280 insertions(+), 3 deletions(-)
create mode 100644 apps/email-templates/emails/assets/discord-box.tsx
create mode 100644 apps/email-templates/emails/assets/discord-button.tsx
create mode 100644 apps/email-templates/emails/assets/graphics-box.tsx
create mode 100644 apps/email-templates/emails/assets/graphics-button.tsx
create mode 100644 apps/email-templates/emails/assets/guide-button.tsx
create mode 100644 apps/email-templates/emails/assets/resources-divider.tsx
create mode 100644 apps/email-templates/emails/assets/website-button.tsx
diff --git a/apps/email-templates/emails/acceptance-email.tsx b/apps/email-templates/emails/acceptance-email.tsx
index f6e8b9556..7dd40d905 100644
--- a/apps/email-templates/emails/acceptance-email.tsx
+++ b/apps/email-templates/emails/acceptance-email.tsx
@@ -12,8 +12,13 @@ import {
import ConfirmBox from "./assets/confirm-box";
import ConfirmButton from "./assets/confirm-button";
import CongratsBox from "./assets/congrats-box";
+import DiscordBox from "./assets/discord-box";
+import DiscordButton from "./assets/discord-button";
+import GraphicsBox from "./assets/graphics-box";
+import GraphicsButton from "./assets/graphics-button";
import Hero from "./assets/hero";
import NextSteps from "./assets/next-steps-divider";
+import ResourcesDivider from "./assets/resources-divider";
interface AcceptanceEmailProps {
name: string;
@@ -60,12 +65,13 @@ export const AcceptanceEmail = ({ name }: AcceptanceEmailProps) => {
-
+
- 1. CONFIRM YOUR SPOT!
+ 1. CONFIRM YOUR{" "}
+ SPOT!
- (Spots are filling up quickly—confirm ASAP!)
+ (Spots are filling up quickly confirm ASAP!)
@@ -75,6 +81,44 @@ export const AcceptanceEmail = ({ name }: AcceptanceEmailProps) => {
+
+
+
+ 2. JOIN OUR{" "}
+ DISCORD!
+
+
+ (Required by October 23rd)
+
+
+
+
+
+
+
+ 3. SPREAD THE
+
+
+ EXCITEMENT!
+
+
+
+
+
+
+
diff --git a/apps/email-templates/emails/assets/discord-box.tsx b/apps/email-templates/emails/assets/discord-box.tsx
new file mode 100644
index 000000000..2b3fc7bd9
--- /dev/null
+++ b/apps/email-templates/emails/assets/discord-box.tsx
@@ -0,0 +1,29 @@
+import { SVGProps } from "react";
+
+const DiscordBox = (props: SVGProps) => (
+
+);
+
+export default DiscordBox;
diff --git a/apps/email-templates/emails/assets/discord-button.tsx b/apps/email-templates/emails/assets/discord-button.tsx
new file mode 100644
index 000000000..6970c7d4b
--- /dev/null
+++ b/apps/email-templates/emails/assets/discord-button.tsx
@@ -0,0 +1,26 @@
+import { SVGProps } from "react";
+
+const DiscordButton = (props: SVGProps) => (
+
+);
+
+export default DiscordButton;
diff --git a/apps/email-templates/emails/assets/graphics-box.tsx b/apps/email-templates/emails/assets/graphics-box.tsx
new file mode 100644
index 000000000..7b22f9613
--- /dev/null
+++ b/apps/email-templates/emails/assets/graphics-box.tsx
@@ -0,0 +1,29 @@
+import { SVGProps } from "react";
+
+const GraphicsBox = (props: SVGProps) => (
+
+);
+
+export default GraphicsBox;
diff --git a/apps/email-templates/emails/assets/graphics-button.tsx b/apps/email-templates/emails/assets/graphics-button.tsx
new file mode 100644
index 000000000..22057beb6
--- /dev/null
+++ b/apps/email-templates/emails/assets/graphics-button.tsx
@@ -0,0 +1,31 @@
+import { SVGProps } from "react";
+
+const GraphicsButton = (props: SVGProps) => (
+
+);
+
+export default GraphicsButton;
diff --git a/apps/email-templates/emails/assets/guide-button.tsx b/apps/email-templates/emails/assets/guide-button.tsx
new file mode 100644
index 000000000..48dc22fd7
--- /dev/null
+++ b/apps/email-templates/emails/assets/guide-button.tsx
@@ -0,0 +1,46 @@
+import { SVGProps } from "react";
+
+const GuideButton = (props: SVGProps) => (
+
+);
+
+export default GuideButton;
diff --git a/apps/email-templates/emails/assets/resources-divider.tsx b/apps/email-templates/emails/assets/resources-divider.tsx
new file mode 100644
index 000000000..1702450d6
--- /dev/null
+++ b/apps/email-templates/emails/assets/resources-divider.tsx
@@ -0,0 +1,26 @@
+import { SVGProps } from "react";
+
+const ResourcesDivider = (props: SVGProps) => (
+
+);
+
+export default ResourcesDivider;
diff --git a/apps/email-templates/emails/assets/website-button.tsx b/apps/email-templates/emails/assets/website-button.tsx
new file mode 100644
index 000000000..73ee86b77
--- /dev/null
+++ b/apps/email-templates/emails/assets/website-button.tsx
@@ -0,0 +1,46 @@
+import { SVGProps } from "react";
+
+const WebsiteButton = (props: SVGProps) => (
+
+);
+
+export default WebsiteButton;
From 1980c9e410a29abaf17bcb78dedf1365f29f1a41 Mon Sep 17 00:00:00 2001
From: Lewin Bobda <116130662+Lewin-B@users.noreply.github.com>
Date: Fri, 9 May 2025 15:06:08 -0400
Subject: [PATCH 06/15] Contact Section
---
.../emails/acceptance-email.tsx | 18 ++++++++++
.../email-templates/emails/assets/contact.tsx | 35 +++++++++++++++++++
.../emails/assets/guide-button.tsx | 1 -
packages/api/src/routers/email.ts | 6 ++--
4 files changed, 56 insertions(+), 4 deletions(-)
create mode 100644 apps/email-templates/emails/assets/contact.tsx
diff --git a/apps/email-templates/emails/acceptance-email.tsx b/apps/email-templates/emails/acceptance-email.tsx
index 7dd40d905..ebc61dcf2 100644
--- a/apps/email-templates/emails/acceptance-email.tsx
+++ b/apps/email-templates/emails/acceptance-email.tsx
@@ -12,13 +12,16 @@ import {
import ConfirmBox from "./assets/confirm-box";
import ConfirmButton from "./assets/confirm-button";
import CongratsBox from "./assets/congrats-box";
+import Contact from "./assets/contact";
import DiscordBox from "./assets/discord-box";
import DiscordButton from "./assets/discord-button";
import GraphicsBox from "./assets/graphics-box";
import GraphicsButton from "./assets/graphics-button";
+import GuideButton from "./assets/guide-button";
import Hero from "./assets/hero";
import NextSteps from "./assets/next-steps-divider";
import ResourcesDivider from "./assets/resources-divider";
+import WebsiteButton from "./assets/website-button";
interface AcceptanceEmailProps {
name: string;
@@ -119,6 +122,21 @@ export const AcceptanceEmail = ({ name }: AcceptanceEmailProps) => {
+
+