holy moly thats a lotta damage

This commit is contained in:
2026-05-25 22:10:19 -04:00
parent c01c1a5636
commit b62ab77fbe
47 changed files with 1444 additions and 129 deletions

View File

@@ -11,13 +11,13 @@ interface Testimonial {
const testimonials: Testimonial[] = [
{
quote:
"ShieldAI caught a credential leak before it became a disaster. Essential tool for anyone concerned about their digital identity.",
"Kordant caught a credential leak before it became a disaster. Essential tool for anyone concerned about their digital identity.",
author: "Sarah Chen",
role: "Security Engineer",
},
{
quote:
"I sleep better knowing ShieldAI is monitoring my personal information 24/7.",
"I sleep better knowing Kordant is monitoring my personal information 24/7.",
author: "Marcus Johnson",
role: "Freelance Developer",
},
@@ -52,7 +52,7 @@ export default function AuthLayout(props: AuthLayoutProps) {
<div class="hidden md:flex flex-col justify-center gap-6 flex-1 p-8 lg:p-12">
<div>
<h1 class="text-3xl lg:text-4xl font-bold text-gradient-primary">
ShieldAI
Kordant
</h1>
<p class="text-lg text-[var(--color-text-secondary)] mt-2">
AI-Powered Identity Protection

View File

@@ -9,20 +9,32 @@ export default function SocialAuthButtons(props: SocialAuthButtonsProps) {
<button
type="button"
onClick={props.onGoogleSignIn}
class="flex items-center justify-center gap-3 w-full px-4 py-2.5 border border-[var(--color-border)] rounded-lg text-sm font-medium text-[var(--color-text-primary)] bg-white hover:bg-[var(--color-bg-secondary)] transition-colors cursor-pointer"
class="flex items-center justify-center gap-3 w-full px-4 py-2.5 border border-(--color-border) rounded-lg text-sm font-medium text-black dark:text-white bg-white hover:bg-bg-secondary transition-colors cursor-pointer dark:bg-black"
>
<svg class="h-5 w-5" viewBox="0 0 24 24" fill="currentColor">
<path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z" fill="#4285F4" />
<path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853" />
<path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05" />
<path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335" />
<path
d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z"
fill="#4285F4"
/>
<path
d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
fill="#34A853"
/>
<path
d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
fill="#FBBC05"
/>
<path
d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
fill="#EA4335"
/>
</svg>
Continue with Google
</button>
<button
type="button"
onClick={props.onAppleSignIn}
class="flex items-center justify-center gap-3 w-full px-4 py-2.5 border border-[var(--color-border)] rounded-lg text-sm font-medium text-white bg-black hover:bg-gray-900 transition-colors cursor-pointer"
class="flex items-center justify-center gap-3 w-full px-4 py-2.5 border border-(--color-border) rounded-lg text-sm font-medium text-white bg-black hover:bg-gray-900 transition-colors cursor-pointer"
>
<svg class="h-5 w-5" viewBox="0 0 24 24" fill="currentColor">
<path d="M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.6 5.98.52 7.13-.62 1.28-1.4 2.55-2.57 3.08Zm-3.12-15.2c.03-1.14.44-2.23 1.07-3.03.82-.98 2.11-1.63 3.32-1.59.06 1.24-.4 2.45-1.12 3.3-.77.9-1.98 1.52-3.27 1.32Z" />

View File

@@ -119,13 +119,13 @@ describe("AuthLayout", () => {
expect(document.body.textContent).toContain("Form content");
});
it("renders ShieldAI branding", () => {
it("renders Kordant branding", () => {
mount(() => (
<AuthLayout>
<p>Content</p>
</AuthLayout>
));
expect(document.body.textContent).toContain("ShieldAI");
expect(document.body.textContent).toContain("Kordant");
});
it("renders gradient-card wrapper", () => {
@@ -143,7 +143,7 @@ describe("AuthLayout", () => {
<p>Content</p>
</AuthLayout>
));
expect(document.body.textContent).toContain("ShieldAI");
expect(document.body.textContent).toContain("Kordant");
expect(document.body.textContent).toContain("AI-Powered Identity Protection");
});
});

View File

@@ -109,7 +109,7 @@ export default function Sidebar(props: SidebarProps) {
</linearGradient>
</defs>
</svg>
<span class="text-lg font-bold text-[var(--color-text-primary)]">ShieldAI</span>
<span class="text-lg font-bold text-[var(--color-text-primary)]">Kordant</span>
</A>
</div>
<nav class="p-4 space-y-1">

View File

@@ -16,7 +16,7 @@ export default function CTABannerSection(props: CTABannerSectionProps) {
Ready to protect your identity?
</h2>
<p class="text-lg text-[var(--color-text-secondary)] max-w-2xl mx-auto mb-10">
Join thousands of users who trust ShieldAI to keep their digital
Join thousands of users who trust Kordant to keep their digital
identity safe from emerging threats.
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center">

View File

@@ -68,7 +68,7 @@ export default function HeroSection(props: HeroSectionProps) {
</h1>
<p class="text-xl md:text-2xl text-text-secondary max-w-2xl mb-10 leading-relaxed">
Threat actors are using AI in multifaceted attacks. ShieldAI evens
Threat actors are using AI in multifaceted attacks. Kordant evens
the playing field using advanced AI to monitor, detect, and prevent
identity threats in real-time.
</p>

View File

@@ -186,20 +186,20 @@ function ValueCard(props: ValueCardProps) {
);
}
interface WhyShieldAISectionProps {
interface WhyKordantSectionProps {
class?: string;
}
export default function WhyShieldAISection(props: WhyShieldAISectionProps) {
export default function WhyKordantSection(props: WhyKordantSectionProps) {
return (
<section
id="why-shieldai"
id="why-kordant"
class={cn("py-20 md:py-28 scroll-mt-16", props.class)}
>
<PageContainer py="py-8">
<div class="text-center mb-16">
<h2 class="text-3xl md:text-4xl lg:text-5xl font-bold text-[var(--color-text-primary)] mb-4">
Why ShieldAI
Why Kordant
</h2>
<p class="text-lg text-[var(--color-text-secondary)] max-w-2xl mx-auto">
Built on cutting-edge technology with your privacy at the core

View File

@@ -40,7 +40,7 @@ describe("HeroSection", () => {
it("renders the subheadline", () => {
mount(() => <HeroSection />);
expect(document.body.textContent).toContain("ShieldAI uses advanced AI");
expect(document.body.textContent).toContain("Kordant uses advanced AI");
});
it("renders the Get Started CTA", () => {

View File

@@ -3,5 +3,5 @@ export { default as HeroSection } from "./HeroSection";
export { default as HowItWorksSection } from "./HowItWorksSection";
export { default as FeaturesGridSection } from "./FeaturesGridSection";
export { default as ForUsersSection } from "./ForUsersSection";
export { default as WhyShieldAISection } from "./WhyShieldAISection";
export { default as WhyKordantSection } from "./WhyKordantSection";
export { default as CTABannerSection } from "./CTABannerSection";

View File

@@ -16,7 +16,7 @@ vi.mock("@solidjs/router", () => ({
import HowItWorksSection from "./HowItWorksSection";
import FeaturesGridSection from "./FeaturesGridSection";
import ForUsersSection from "./ForUsersSection";
import WhyShieldAISection from "./WhyShieldAISection";
import WhyKordantSection from "./WhyKordantSection";
import CTABannerSection from "./CTABannerSection";
function mount(comp: () => JSX.Element): HTMLDivElement {
@@ -226,28 +226,28 @@ describe("ForUsersSection", () => {
});
});
describe("WhyShieldAISection", () => {
describe("WhyKordantSection", () => {
it("renders the section heading", () => {
mount(() => <WhyShieldAISection />);
expect(document.body.textContent).toContain("Why ShieldAI");
mount(() => <WhyKordantSection />);
expect(document.body.textContent).toContain("Why Kordant");
});
it("renders the section subheading", () => {
mount(() => <WhyShieldAISection />);
mount(() => <WhyKordantSection />);
expect(document.body.textContent).toContain(
"Built on cutting-edge technology",
);
});
it("renders all 3 value prop cards", () => {
mount(() => <WhyShieldAISection />);
mount(() => <WhyKordantSection />);
expect(document.body.textContent).toContain("Proactive, Not Reactive");
expect(document.body.textContent).toContain("AI-Powered Detection");
expect(document.body.textContent).toContain("Privacy First");
});
it("renders value prop descriptions", () => {
mount(() => <WhyShieldAISection />);
mount(() => <WhyKordantSection />);
expect(document.body.textContent).toContain(
"detect threats before they cause damage",
);
@@ -258,7 +258,7 @@ describe("WhyShieldAISection", () => {
});
it("renders bullet items for each card", () => {
mount(() => <WhyShieldAISection />);
mount(() => <WhyKordantSection />);
expect(document.body.textContent).toContain(
"Real-time dark web scanning",
);
@@ -269,25 +269,25 @@ describe("WhyShieldAISection", () => {
});
it("renders 3 Card components", () => {
mount(() => <WhyShieldAISection />);
mount(() => <WhyKordantSection />);
const cards = document.querySelectorAll(".gradient-card");
expect(cards.length).toBe(3);
});
it("has the anchor ID for smooth scrolling", () => {
mount(() => <WhyShieldAISection />);
const section = document.querySelector('#why-shieldai');
mount(() => <WhyKordantSection />);
const section = document.querySelector('#why-kordant');
expect(section).toBeTruthy();
});
it("applies custom class prop", () => {
mount(() => <WhyShieldAISection class="custom-why" />);
mount(() => <WhyKordantSection class="custom-why" />);
const section = document.querySelector("section.custom-why");
expect(section).toBeTruthy();
});
it("uses three-column grid on desktop", () => {
mount(() => <WhyShieldAISection />);
mount(() => <WhyKordantSection />);
const grid = document.querySelector(".grid-cols-1");
expect(grid).toBeTruthy();
expect(grid!.className).toContain("md:grid-cols-3");

View File

@@ -10,7 +10,7 @@ interface AppShellProps {
}
export default function AppShell(props: AppShellProps) {
const title = () => props.title ?? "ShieldAI";
const title = () => props.title ?? "Kordant";
onMount(() => {
const onRouteChange = () => {

View File

@@ -116,7 +116,7 @@ export default function Footer() {
<div class="flex items-center gap-2 mb-4">
<ShieldLogo />
<span class="text-lg font-bold text-[var(--color-text-primary)]">
ShieldAI
Kordant
</span>
</div>
<p class="text-sm text-[var(--color-text-secondary)] max-w-xs">
@@ -169,7 +169,7 @@ export default function Footer() {
<div class="mt-12 pt-8 border-t border-[var(--color-border)] flex flex-col sm:flex-row items-center justify-between gap-4">
<p class="text-sm text-[var(--color-text-tertiary)]">
{"\u00A9"} {new Date().getFullYear()} ShieldAI. All rights reserved.
{"\u00A9"} {new Date().getFullYear()} Kordant. All rights reserved.
</p>
<div class="flex items-center gap-6">
<A

View File

@@ -196,7 +196,7 @@ export default function Navbar() {
<A href="/" class="flex items-center gap-2">
<ShieldLogo />
<span class="text-lg font-bold text-[var(--color-text-primary)]">
ShieldAI
Kordant
</span>
</A>