From 0f60ab69657677d24d5890cfcf774d062cff4490 Mon Sep 17 00:00:00 2001 From: Korbs Date: Thu, 20 Mar 2025 18:33:29 -0400 Subject: [PATCH] :rocket: Init --- .env.sample | 3 + .gitignore | 24 ++++++++ astro.config.mjs | 11 ++++ package.json | 16 ++++++ public/favicon.svg | 9 +++ public/logo.png | Bin 0 -> 11178 bytes src/actions/index.ts | 33 +++++++++++ src/pages/index.astro | 130 ++++++++++++++++++++++++++++++++++++++++++ tsconfig.json | 5 ++ 9 files changed, 231 insertions(+) create mode 100644 .env.sample create mode 100644 .gitignore create mode 100644 astro.config.mjs create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 public/logo.png create mode 100644 src/actions/index.ts create mode 100644 src/pages/index.astro create mode 100644 tsconfig.json diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..c2d0201 --- /dev/null +++ b/.env.sample @@ -0,0 +1,3 @@ +SEND_TO="smithers@example.org" +SEND_FROM="Astro Test " +RESEND_API_KEY="re_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..016b59e --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# build output +dist/ + +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..0dfb101 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,11 @@ +// @ts-check +import { defineConfig } from 'astro/config'; + +import node from '@astrojs/node'; + +export default defineConfig({ + output: 'server', + adapter: node({ + mode: 'standalone' + }) +}); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..9d38770 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "form-while", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/node": "^9.1.3", + "astro": "^5.5.3", + "resend": "^4.1.2" + } +} \ No newline at end of file diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..f157bd1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,9 @@ + + + + diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..26dd79fbc6d1814594b2c3989ae4d12159066952 GIT binary patch literal 11178 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 IM6N<$f?4ND;Q#;t literal 0 HcmV?d00001 diff --git a/src/actions/index.ts b/src/actions/index.ts new file mode 100644 index 0000000..a172525 --- /dev/null +++ b/src/actions/index.ts @@ -0,0 +1,33 @@ +import { ActionError, defineAction } from 'astro:actions' +import { z } from 'astro:schema' +import { Resend } from 'resend' + +const resend = new Resend(import.meta.env.RESEND_API_KEY) + +export const server = { + send: defineAction({ + input: z.object({ + email: z.string(), + name: z.string(), + message: z.string() + }), + accept: 'form', + handler: async (input, redirect) => { + const { data, error } = await resend.emails.send({ + from: import.meta.env.SEND_FROM, + to: [import.meta.env.SEND_TO], + subject: `From ${input.name} - ${input.email}`, + html: `${input.message}
From ${input.name} - ${input.email}` + }) + + if (error) { + throw new ActionError({ + code: 'BAD_REQUEST', + message: error.message + }) + } + + return data + } + }) +} \ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..14436f9 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,130 @@ +--- +import { actions } from "astro:actions" +--- + + + + + + + + +
+ +
+

Contact Us

+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ +
+
+
+
+
+

© 2025 Company Name LLC

+
+ + + + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +}