diff --git a/apps/web/www/index.html b/apps/web/www/index.html
index 2f0d3a8..20d8eec 100644
--- a/apps/web/www/index.html
+++ b/apps/web/www/index.html
@@ -4,9 +4,9 @@
-
+
{/* Navbar Container */}
{/* Enable pointer events on Navbar itself while keeping wrapper pointer-events-none so we can interact with background */}
@@ -14,7 +14,7 @@ export const RootLayout: React.FC = () => {
{/* Page Content */}
-
+
diff --git a/apps/web/www/src/components/shared/footer.tsx b/apps/web/www/src/components/shared/footer.tsx
new file mode 100644
index 0000000..91cdabc
--- /dev/null
+++ b/apps/web/www/src/components/shared/footer.tsx
@@ -0,0 +1,110 @@
+import {
+ Grid2X2Plus,
+} from 'lucide-react';
+import mildstack from '@/assets/logos/mildstack-logo-full-white.png';
+
+export function Footer() {
+ const year = new Date().getFullYear();
+
+ const website = [
+ {
+ title: 'Home',
+ href: '#',
+ },
+ {
+ title: 'Features',
+ href: '#',
+ },
+ {
+ title: 'Services',
+ href: '#',
+ },
+ {
+ title: 'Docs',
+ href: '#',
+ }
+ ];
+
+ const resources = [
+ {
+ title: 'Blog',
+ href: '#',
+ },
+ {
+ title: 'Help Center',
+ href: '#',
+ },
+ {
+ title: 'Contact Support',
+ href: '#',
+ },
+ {
+ title: 'Community',
+ href: '#',
+ },
+ {
+ title: 'Security',
+ href: '#',
+ },
+ ];
+
+ const socialLinks = [
+ {
+ icon:
,
+ link: 'https://github.com/michasdev/mildstack',
+ },
+ ];
+ return (
+
+
+
+
+
+
+
+
+
+ Mildstack: Run AWS services locally. Free, lightweight, and open-source.
+
+ The definitive LocalStack alternative.
+
+
+
+
+
+ Resources
+
+
+ {website.map(({ href, title }, i) => (
+
+ {title}
+
+ ))}
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/web/www/src/components/shared/navbar.tsx b/apps/web/www/src/components/shared/navbar.tsx
index 2caf721..9997a2d 100644
--- a/apps/web/www/src/components/shared/navbar.tsx
+++ b/apps/web/www/src/components/shared/navbar.tsx
@@ -3,7 +3,7 @@ import { motion, AnimatePresence, useScroll, useMotionValueEvent } from 'motion/
import { Star, Download, Menu, X } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils';
-import logoFullWhite from '@/assets/logos/mildstack-logo-full-white.svg'
+import logoFullWhite from '@/assets/logos/mildstack-logo-full-white.png'
const NAV_LINKS = [
{ label: 'Home', variant: 'outline' },
@@ -85,7 +85,7 @@ export const Navbar: React.FC = () => {
transition={{ duration: 0.5 }}
className={cn(
"px-4 backdrop-blur-3xl rounded-full py-4 flex justify-between items-center transition-all duration-300",
- scrolled ? 'bg-background/80 border border-white/10 shadow-2xl shadow-white/5' : 'bg-background/50'
+ scrolled ? 'bg-background/80 border shadow-2xl shadow-white/5' : 'bg-background/50'
)}
>
diff --git a/apps/web/www/src/components/ui/button.tsx b/apps/web/www/src/components/ui/button.tsx
index 66bbb89..3d74df3 100644
--- a/apps/web/www/src/components/ui/button.tsx
+++ b/apps/web/www/src/components/ui/button.tsx
@@ -8,7 +8,7 @@ import { cn } from "@/lib/utils";
import { Spinner } from "@/components/ui/spinner";
export const buttonVariants = cva(
- "relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-lg border font-medium text-base outline-none transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 data-loading:select-none data-loading:text-transparent sm:text-sm [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0",
+ "relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-lg border font-medium text-base outline-none transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 data-loading:select-none data-loading:text-transparent sm:text-sm [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0",
{
defaultVariants: {
size: "default",
@@ -23,11 +23,11 @@ export const buttonVariants = cva(
"icon-xl":
"size-11 sm:size-10 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5",
"icon-xs":
- "size-7 rounded-md before:rounded-[calc(var(--radius-md)-1px)] sm:size-6 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5",
+ "size-7 rounded-md before:rounded-[inherit] sm:size-6 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5",
lg: "h-10 px-[calc(--spacing(3.5)-1px)] sm:h-9",
sm: "h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:h-7",
xl: "h-11 px-[calc(--spacing(4)-1px)] text-lg sm:h-10 sm:text-base [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5",
- xs: "h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[calc(var(--radius-md)-1px)] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5",
+ xs: "h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[inherit] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5",
},
variant: {
default:
diff --git a/apps/web/www/src/features/home/components/call-to-action.tsx b/apps/web/www/src/features/home/components/call-to-action.tsx
index 8fe0a43..5d79a19 100644
--- a/apps/web/www/src/features/home/components/call-to-action.tsx
+++ b/apps/web/www/src/features/home/components/call-to-action.tsx
@@ -3,7 +3,7 @@ import { Button } from "@/components/ui/button";
export function CallToAction() {
return (
-
+
{
return (
<>
-
+
+
>
)
}
diff --git a/apps/web/www/src/features/home/sections/hero/hero.tsx b/apps/web/www/src/features/home/sections/hero/hero.tsx
index e51083f..61ab893 100644
--- a/apps/web/www/src/features/home/sections/hero/hero.tsx
+++ b/apps/web/www/src/features/home/sections/hero/hero.tsx
@@ -318,7 +318,7 @@ export const HeroSection: React.FC = () => {
variants={itemVariants}
className="text-center text-gray-400 mb-9 max-w-2xl leading-relaxed font-light"
>
- High-performance and lightweight local AWS emulator for
S3 ,
DynamoDB ,
SQS , and more. Includes an intuitive
Desktop App to manage and browse your local cloud resources from a single place.
+ High-performance and lightweight local AWS emulator for
S3 ,
DynamoDB ,
SQS , and more. Includes an intuitive
Desktop App to manage and browse your local cloud resources from a single place. No docker required!