diff --git a/src/assets/bakery-1.jpg b/src/assets/bakery-1.jpg new file mode 100644 index 0000000..3480a3d Binary files /dev/null and b/src/assets/bakery-1.jpg differ diff --git a/src/assets/bakery-2.jpg b/src/assets/bakery-2.jpg new file mode 100644 index 0000000..57faf30 Binary files /dev/null and b/src/assets/bakery-2.jpg differ diff --git a/src/assets/bakery-3.jpg b/src/assets/bakery-3.jpg new file mode 100644 index 0000000..a98234b Binary files /dev/null and b/src/assets/bakery-3.jpg differ diff --git a/src/assets/bakery-4.jpg b/src/assets/bakery-4.jpg new file mode 100644 index 0000000..c6d03cb Binary files /dev/null and b/src/assets/bakery-4.jpg differ diff --git a/src/assets/bakery-5.jpg b/src/assets/bakery-5.jpg new file mode 100644 index 0000000..5ca9dde Binary files /dev/null and b/src/assets/bakery-5.jpg differ diff --git a/src/assets/bakery-6.jpg b/src/assets/bakery-6.jpg new file mode 100644 index 0000000..96af592 Binary files /dev/null and b/src/assets/bakery-6.jpg differ diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..3f538ff --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,37 @@ +const Footer = () => { + return ( + + ); +}; + +export default Footer; diff --git a/src/components/GallerySection.tsx b/src/components/GallerySection.tsx new file mode 100644 index 0000000..7f0093f --- /dev/null +++ b/src/components/GallerySection.tsx @@ -0,0 +1,52 @@ +import bakery1 from "@/assets/bakery-1.jpg"; +import bakery2 from "@/assets/bakery-2.jpg"; +import bakery3 from "@/assets/bakery-3.jpg"; +import bakery4 from "@/assets/bakery-4.jpg"; +import bakery5 from "@/assets/bakery-5.jpg"; +import bakery6 from "@/assets/bakery-6.jpg"; + +const images = [ + { src: bakery1, alt: "Kanelbullar" }, + { src: bakery2, alt: "Prinsesstårta" }, + { src: bakery3, alt: "Sorterade kakor" }, + { src: bakery4, alt: "Hantverksbageri" }, + { src: bakery5, alt: "Kardemummabullar" }, + { src: bakery6, alt: "Företagsleverans" }, +]; + +const GallerySection = () => { + return ( +
+
+

+ Hantverk. Kvalitet. Leveranssäkerhet. +

+

+ Varje produkt bakas med kärlek och levereras med precision +

+ +
+ {images.map((image, index) => ( +
+ {image.alt} +
+

+ {image.alt} +

+
+ ))} +
+
+
+ ); +}; + +export default GallerySection; diff --git a/src/components/HeroSection.tsx b/src/components/HeroSection.tsx new file mode 100644 index 0000000..a6cbd5a --- /dev/null +++ b/src/components/HeroSection.tsx @@ -0,0 +1,41 @@ +const HeroSection = () => { + return ( +
+ {/* Background glow effect */} +
+ +
+

+ Lennart Svenssons Konditorivaror +

+ +

+ Kakabonnemang
+ för företag +

+ +

+ Premium konditorikakor levererade automatiskt till ert kontor. +
+ Enkel beställning. Fasta leveranser. Maximal arbetsglädje. +

+ + + Starta ert abonnemang + +
+ + {/* Scroll indicator */} +
+
+
+
+
+
+ ); +}; + +export default HeroSection; diff --git a/src/components/PlansSection.tsx b/src/components/PlansSection.tsx new file mode 100644 index 0000000..79efb42 --- /dev/null +++ b/src/components/PlansSection.tsx @@ -0,0 +1,117 @@ +import { Check } from "lucide-react"; + +const plans = [ + { + name: "Kontorsabonnemang Bas", + price: "1 990 kr", + period: "/mån", + description: "Perfekt för mindre kontor (upp till 15 personer)", + features: [ + "2 leveranser per månad", + "Premium konditorikakor", + "Fast leveransdag", + "Företagsfaktura", + ], + featured: false, + }, + { + name: "Kontorsabonnemang Pro", + price: "3 490 kr", + period: "/mån", + description: "För växande företag (15–40 personer)", + features: [ + "4 leveranser per månad", + "Utvalda sortiment", + "Prioriterad hantering", + "Fakturabetalning", + ], + featured: true, + }, + { + name: "Företagsavtal", + price: "Offert", + period: "", + description: "För stora kontor, event och kedjor", + features: [ + "Anpassad volym", + "Möjlighet till branding", + "Avtalspriser", + "Personlig kontakt", + ], + featured: false, + }, +]; + +const PlansSection = () => { + return ( +
+
+

+ Våra företagsabonnemang +

+

+ Välj det abonnemang som passar ert företag bäst +

+ +
+ {plans.map((plan, index) => ( +
+ {plan.featured && ( +
+ + Mest populär + +
+ )} + +
+

+ {plan.name} +

+
+ + {plan.price} + + {plan.period} +
+
+ +

{plan.description}

+ +
    + {plan.features.map((feature, i) => ( +
  • +
    + +
    + {feature} +
  • + ))} +
+ + + {plan.price === "Offert" ? "Kontakta oss" : "Starta abonnemang"} + +
+ ))} +
+
+
+ ); +}; + +export default PlansSection; diff --git a/src/index.css b/src/index.css index 4844bbd..000bb5f 100644 --- a/src/index.css +++ b/src/index.css @@ -2,95 +2,55 @@ @tailwind components; @tailwind utilities; -/* Definition of the design system. All colors, gradients, fonts, etc should be defined here. -All colors MUST be HSL. -*/ +/* Lennart Svenssons Konditorivaror - Premium Dark Design System */ + +@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700&family=Inter:wght@300;400;500;600;700&display=swap'); @layer base { :root { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; + --background: 0 0% 4%; + --foreground: 0 0% 98%; - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; + --card: 0 0% 8%; + --card-foreground: 0 0% 98%; - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; + --popover: 0 0% 8%; + --popover-foreground: 0 0% 98%; - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; + --primary: 24 95% 53%; + --primary-foreground: 0 0% 100%; - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; + --secondary: 0 0% 12%; + --secondary-foreground: 0 0% 98%; - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; + --muted: 0 0% 15%; + --muted-foreground: 0 0% 60%; - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; + --accent: 30 100% 50%; + --accent-foreground: 0 0% 100%; --destructive: 0 84.2% 60.2%; --destructive-foreground: 210 40% 98%; - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 222.2 84% 4.9%; + --border: 0 0% 18%; + --input: 0 0% 18%; + --ring: 24 95% 53%; - --radius: 0.5rem; + --radius: 0.75rem; - --sidebar-background: 0 0% 98%; + /* Custom tokens */ + --gradient-warm: linear-gradient(135deg, hsl(24 95% 53%) 0%, hsl(35 100% 55%) 100%); + --gradient-dark: linear-gradient(180deg, hsl(0 0% 4%) 0%, hsl(0 0% 7%) 100%); + --shadow-glow: 0 0 60px -15px hsl(24 95% 53% / 0.4); + --shadow-card: 0 25px 50px -12px hsl(0 0% 0% / 0.5); - --sidebar-foreground: 240 5.3% 26.1%; - - --sidebar-primary: 240 5.9% 10%; - - --sidebar-primary-foreground: 0 0% 98%; - - --sidebar-accent: 240 4.8% 95.9%; - - --sidebar-accent-foreground: 240 5.9% 10%; - - --sidebar-border: 220 13% 91%; - - --sidebar-ring: 217.2 91.2% 59.8%; + --font-display: 'Playfair Display', serif; + --font-body: 'Inter', sans-serif; } .dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 11.2%; - - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 212.7 26.8% 83.9%; - --sidebar-background: 240 5.9% 10%; - --sidebar-foreground: 240 4.8% 95.9%; - --sidebar-primary: 224.3 76.3% 48%; - --sidebar-primary-foreground: 0 0% 100%; - --sidebar-accent: 240 3.7% 15.9%; - --sidebar-accent-foreground: 240 4.8% 95.9%; - --sidebar-border: 240 3.7% 15.9%; - --sidebar-ring: 217.2 91.2% 59.8%; + --background: 0 0% 4%; + --foreground: 0 0% 98%; } } @@ -99,7 +59,75 @@ All colors MUST be HSL. @apply border-border; } + html { + scroll-behavior: smooth; + } + body { - @apply bg-background text-foreground; + @apply bg-background text-foreground antialiased; + font-family: var(--font-body); + } + + h1, h2, h3, h4, h5, h6 { + font-family: var(--font-display); + } +} + +@layer components { + .hero-gradient { + background: var(--gradient-dark); + } + + .text-gradient { + background: var(--gradient-warm); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + } + + .card-glow { + box-shadow: var(--shadow-card); + transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); + } + + .card-glow:hover { + box-shadow: var(--shadow-glow); + transform: translateY(-8px); + } + + .btn-primary { + background: var(--gradient-warm); + @apply text-primary-foreground font-semibold rounded-xl transition-all duration-300; + } + + .btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 10px 40px -10px hsl(24 95% 53% / 0.5); + } +} + +@layer utilities { + .animate-float { + animation: float 6s ease-in-out infinite; + } + + @keyframes float { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-10px); } + } + + .animate-fade-up { + animation: fadeUp 0.8s ease-out forwards; + } + + @keyframes fadeUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } } } diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 7130b54..f8100a9 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -1,12 +1,15 @@ -// Update this page (the content is just a fallback if you fail to update the page) +import HeroSection from "@/components/HeroSection"; +import GallerySection from "@/components/GallerySection"; +import PlansSection from "@/components/PlansSection"; +import Footer from "@/components/Footer"; const Index = () => { return ( -
-
-

Welcome to Your Blank App

-

Start building your amazing project here!

-
+
+ + + +
); }; diff --git a/tailwind.config.ts b/tailwind.config.ts index a1edb69..0b97abc 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -13,6 +13,10 @@ export default { }, }, extend: { + fontFamily: { + display: ["Playfair Display", "serif"], + body: ["Inter", "sans-serif"], + }, colors: { border: "hsl(var(--border))", input: "hsl(var(--input))", @@ -65,20 +69,12 @@ export default { }, keyframes: { "accordion-down": { - from: { - height: "0", - }, - to: { - height: "var(--radix-accordion-content-height)", - }, + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, }, "accordion-up": { - from: { - height: "var(--radix-accordion-content-height)", - }, - to: { - height: "0", - }, + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, }, }, animation: {