Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
3644ea8
Update README.md
leoMirandaa Feb 3, 2024
d7a3fc5
Update README.md
leoMirandaa Feb 3, 2024
52b10c8
fix: typo on Team Section
leoMirandaa Feb 5, 2024
6d8f63d
Update HeroCards.tsx
galvar3 Feb 9, 2024
b662330
Add MIT License
leoMirandaa Apr 13, 2024
a76c668
docs: update README.md
kirklin Apr 29, 2024
e3f210d
fix: unsafe url
kirklin Apr 29, 2024
5d31a91
Typo-fix-on-how-it-works-section
AmanKadam-16 May 2, 2024
23ee824
Merge pull request #6 from kirklin/main
leoMirandaa May 5, 2024
cf3581e
Merge pull request #5 from kirklin/patch-1
leoMirandaa May 5, 2024
57942bc
Merge pull request #7 from AmanKadam-16/main
leoMirandaa May 5, 2024
70ba242
Merge pull request #1 from galvar3/patch-1
leoMirandaa May 5, 2024
6c9740b
chore: update package.json
leoMirandaa Jun 8, 2024
8d2cea2
chore: add project description
leoMirandaa Jun 8, 2024
c857894
feat: add LinkedIn url
leoMirandaa Aug 3, 2024
655c125
fix: update dependencies
leoMirandaa Aug 3, 2024
b223539
fix: add css will-change prop to fix safari glow animation
jujoco Sep 28, 2024
476fbc7
Merge pull request #15 from jujoco/main
leoMirandaa Sep 28, 2024
61b63df
fix: move glow behind copy and cards
jujoco Oct 3, 2024
381476f
Merge pull request #17 from jujoco/main
leoMirandaa Oct 9, 2024
fedb4bc
Update placeholder text in About component
sigalmalki Jan 29, 2026
67eddf7
Update placeholder text in About component
sigalmalki Jan 29, 2026
2c2eda2
Merge pull request #1 from sigalmalki/main
avnerfr Jan 29, 2026
9037c1d
Merge pull request #1 from sigalmalki/main
avnerfr Jan 29, 2026
8550af9
many initial changes to the pages
avnerfr Jan 30, 2026
5c7de5c
many initial changes to the pages
avnerfr Jan 30, 2026
8b10e4f
many initial changes to the pages 2
avnerfr Jan 30, 2026
e7e02a4
many initial changes to the pages 2
avnerfr Jan 30, 2026
0edb818
many initial changes to the pages 3
avnerfr Jan 30, 2026
d73724d
many initial changes to the pages 3
avnerfr Jan 30, 2026
c9e754c
remove merge junk
avnerfr Jan 30, 2026
79d026e
remove merge junk
avnerfr Jan 30, 2026
a0dfb59
sigal comments
avnerfr Jan 31, 2026
2f4bd80
sigal comments
avnerfr Jan 31, 2026
517ebc0
sigal comments 2
avnerfr Feb 1, 2026
a6ee634
sigal comments 2
avnerfr Feb 1, 2026
23c1a4a
sigal comments 2
avnerfr Feb 1, 2026
26d34fb
sigal comments 2
avnerfr Feb 1, 2026
d28b9ee
sigal comments 2
avnerfr Feb 1, 2026
184b65a
sigal comments 2
avnerfr Feb 1, 2026
ac48a18
sigal comments 3
avnerfr Feb 1, 2026
5631168
sigal comments 3
avnerfr Feb 1, 2026
09f854e
sigal comments 4
avnerfr Feb 1, 2026
50a520c
sigal comments 4
avnerfr Feb 1, 2026
92167d2
moved email to AWS SES
avnerfr Feb 1, 2026
bad453d
moved email to AWS SES
avnerfr Feb 1, 2026
51c5561
removing env 2
avnerfr Feb 1, 2026
49aec15
merge applied
avnerfr Feb 1, 2026
f0e6b59
bugs on mobile
avnerfr Feb 3, 2026
58b2968
bugs on mobile 2
avnerfr Feb 3, 2026
e6878f9
bugs on mobile 2
avnerfr Feb 3, 2026
aef1b09
bugs on mobile 2
avnerfr Feb 3, 2026
38a0302
bugs on mobile 2
avnerfr Feb 3, 2026
f47a7bb
new screenshot, move from .tech to .io
avnerfr Apr 19, 2026
32575a9
new screenshot order
avnerfr Apr 19, 2026
67517bd
new screenshot order
avnerfr Apr 19, 2026
0a85029
new screenshot order
avnerfr Apr 19, 2026
8aca03e
new screenshot order
avnerfr Apr 19, 2026
8fac6be
umami connected
avnerfr Apr 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

# environment variables (do not commit real secrets)
.env
.env.local
.env.*.local

node_modules
dist
dist-ssr
Expand Down
6 changes: 6 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
MIT License

<<<<<<< HEAD
Copyright (c) 2024 Leopoldo Miranda

Permission is hereby granted, free of charge, to any person obtaining a copy
Expand All @@ -19,3 +20,8 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
=======
Copyright (c) 2026


>>>>>>> 06dca25 (many initial changes to the pages)
78 changes: 78 additions & 0 deletions api/send-demo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";

const ses = new SESClient({
region: process.env.AWS_REGION ?? "us-east-1",
credentials:
process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY
? {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
}
: undefined,
});

const FROM_EMAIL = process.env.SES_FROM_EMAIL ?? "sales@ansora.io";
const TO_EMAIL = process.env.SES_TO_EMAIL ?? "sales@ansora.io";

export default async function handler(
req: { method?: string; body?: unknown },
res: { status: (code: number) => { json: (body: object) => void }; setHeader: (name: string, value: string) => void }
) {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Content-Type");

if (req.method === "OPTIONS") {
return res.status(200).json({});
}

if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
}

// Vercel parses JSON body into req.body; raw body may be string
let body: { name?: string; email?: string; company?: string; message?: string };
try {
body =
typeof req.body === "string"
? (JSON.parse(req.body) as typeof body)
: (req.body as typeof body) ?? {};
} catch {
return res.status(400).json({ error: "Invalid JSON body" });
}

const { name, email, company, message } = body;
if (!name?.trim() || !email?.trim() || !message?.trim()) {
return res.status(400).json({ error: "Name, email, and message are required" });
}

const subject = `Book a Demo request from ${name.trim()}`;
const textBody = [
`Name: ${name.trim()}`,
`Email: ${email.trim()}`,
`Company: ${(company ?? "").trim() || "—"}`,
"",
"Message:",
message.trim(),
].join("\n");

try {
await ses.send(
new SendEmailCommand({
Source: FROM_EMAIL,
Destination: { ToAddresses: [TO_EMAIL] },
Message: {
Subject: { Data: subject, Charset: "UTF-8" },
Body: {
Text: { Data: textBody, Charset: "UTF-8" },
},
},
ReplyToAddresses: [email.trim()],
})
);
return res.status(200).json({ ok: true });
} catch (err) {
console.error("SES send error:", err);
return res.status(500).json({ error: "Failed to send email" });
}
}
26 changes: 18 additions & 8 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,27 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,400..800;1,400..800&display=swap"
rel="stylesheet"
/>
<link
rel="icon"
type="image/svg+xml"
href="./src/assets/icon.ico"
type="image/png"
href="/logo_no_background.png"
/>
<!-- href="/vite.svg" -->
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>

<!-- Primary Meta Tags -->
<title>Shadcn/React - Landing template</title>
<title>Ansora</title>
<meta
name="title"
content="Shadcn/React - Landing template"
content="Ansora"
/>
<meta
name="description"
Expand All @@ -34,7 +39,7 @@
/>
<meta
property="og:title"
content="Shadcn/React - Landing template"
content="Ansora"
/>
<meta
property="og:description"
Expand All @@ -57,7 +62,7 @@
/>
<meta
name="twitter:title"
content="Shadcn/React - Landing template"
content="Ansora"
/>
<meta
name="twitter:description"
Expand All @@ -66,7 +71,12 @@
<meta
name="twitter:image"
content="https://res.cloudinary.com/dbzv9xfjp/image/upload/v1705560686/og-images/shadc-react_gketpd.jpg"
/>
/>
<script
defer
src="https://landing-umami.vercel.app/script.js"
data-website-id="cc7b19db-5873-46cd-9c0a-66bc9de64e56"
></script>
</head>
<body>
<div id="root"></div>
Expand Down
Loading