Frustrationer i webudvikling
Frustration #4
Frustration #18
Frustration #1
Frustration #9
<!doctype html>
<html lang="da">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Forside</title>
</head>
<body>
<!-- <SiteHeader /> -->
<header>
<a href="/">Dreamers</a>
<nav>
<a href="/">Home</a>
<a href="/properties">Properties</a>
<a href="/about">About</a>
<a href="#testimonials">Testimonials</a>
<a href="/blog">Blog</a>
</nav>
<a href="/contact">Contact us</a>
</header>
<main>
<!-- <Hero /> -->
<section>
<h1>Find your best home to living dream</h1>
<p>Unlock a seamless home-buying or investment experience.</p>
<p>
<a href="/contact">Contact us</a>
<a href="/properties">Explore properties</a>
</p>
<img src="hero-house.jpg" alt="Modern house" />
</section>
<!-- <MissionBand /> -->
<section>
<p>Our Mission</p>
<h2>Green Foundations A New Era for Community Real Estate</h2>
<p>We go beyond transactions…</p>
</section>
<!-- <StatsRow /> -->
<section>
<ul>
<li>
<strong>1,200+</strong>
<p>Properties Sold</p>
</li>
<li>
<strong>95%</strong>
<p>Customer Satisfaction</p>
</li>
<li>
<strong>$500M+</strong>
<p>In Transactions</p>
</li>
</ul>
</section>
<!-- <ListingsSection /> -->
<section>
<h2>Unlock Your Ideal Living Space</h2>
<nav>
<button type="button">All Properties</button>
<button type="button">Family House</button>
<button type="button">Villa</button>
<button type="button">Apartment</button>
<button type="button">Mansion</button>
<button type="button">Green House</button>
</nav>
<ul>
<li>
<img src="p1.jpg" alt="Silver Birch Villa" />
<h3>Silver Birch Villa</h3>
<p>Birmingham, UK</p>
<p>$850,000</p>
</li>
<li>
<img src="p2.jpg" alt="Maple Grove Cottage" />
<h3>Maple Grove Cottage</h3>
<p>Liverpool, UK</p>
<p>$500,000</p>
</li>
<li>
<img src="p3.jpg" alt="Cedar Hill Estate" />
<h3>Cedar Hill Estate</h3>
<p>Edinburgh, UK</p>
<p>$1,200,000</p>
</li>
</ul>
</section>
<!-- <ValuePropsSection /> -->
<section>
<h2>Seamless for Simplicity Built Trusted Results</h2>
<ul>
<li>
<strong>35K</strong>
<p>Happy clients</p>
</li>
<li>
<strong>120+</strong>
<p>Partners</p>
</li>
<li>
<strong>97%</strong>
<p>Satisfaction</p>
</li>
</ul>
<img src="v1.jpg" alt="Building detail" />
<img src="v2.jpg" alt="Architecture" />
</section>
<!-- <TrendingSection /> -->
<section>
<h2>Top Trending Dreams</h2>
<ul>
<li>
<img src="t1.jpg" alt="Pine Valley Retreat" />
<p>Pine Valley Retreat</p>
</li>
<li>
<img src="t2.jpg" alt="Elm Street Apartment" />
<p>Elm Street Apartment</p>
</li>
<li>
<img src="t3.jpg" alt="Willow Creek Lodge" />
<p>Willow Creek Lodge</p>
</li>
<li>
<img src="t4.jpg" alt="Hillside Escape" />
<p>Hillside Escape</p>
</li>
</ul>
</section>
<!-- <TestimonialsSection /> -->
<section id="testimonials">
<h2>Real Stories, Real Success with Fintech.</h2>
<ul>
<li>
<p>They stay in place and deliver amazing value.</p>
<p>Martin John — Homeowner</p>
</li>
<li>
<p>The process was smooth and transparent.</p>
<p>Malika James — Contractor</p>
</li>
<li>
<p>Reliable results and good guidance.</p>
<p>Theseer Omas — Investor</p>
</li>
</ul>
</section>
<!-- <ContactCTA /> -->
<section>
<h2>Get In Touch</h2>
<a href="/contact">Get Started for Free</a>
</section>
</main>
<!-- <SiteFooter /> -->
<footer>
<p>Dreamers</p>
<h3>Our Links</h3>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/services">Services</a></li>
</ul>
<h3>Our Condition</h3>
<ul>
<li><a href="/privacy">Privacy Policy</a></li>
<li><a href="/terms">Terms</a></li>
</ul>
<h3>Follow Us</h3>
<ul>
<li><a href="https://x.com">X</a></li>
<li><a href="https://instagram.com">Instagram</a></li>
<li><a href="https://facebook.com">Facebook</a></li>
</ul>
<p>© 2026</p>
</footer>
</body>
</html>Frustration #16
<!doctype html>
<html lang="da">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Forside</title>
</head>
<body>
<!-- <SiteHeader /> -->
<header>
<a href="/">Dreamers</a>
<nav>
<a href="/">Home</a>
<a href="/properties">Properties</a>
<a href="/about">About</a>
<a href="#testimonials">Testimonials</a>
<a href="/blog">Blog</a>
</nav>
<a href="/contact">Contact us</a>
</header>
<main>
<!-- <Hero /> -->
<section>
<h1>Find your best home to living dream</h1>
<p>Unlock a seamless home-buying or investment experience.</p>
<p>
<a href="/contact">Contact us</a>
<a href="/properties">Explore properties</a>
</p>
<img src="hero-house.jpg" alt="Modern house" />
</section>
<!-- <MissionBand /> -->
<section>
<p>Our Mission</p>
<h2>Green Foundations A New Era for Community Real Estate</h2>
<p>We go beyond transactions…</p>
</section>
<!-- <StatsRow /> -->
<section>
<ul>
<li>
<strong>1,200+</strong>
<p>Properties Sold</p>
</li>
<li>
<strong>95%</strong>
<p>Customer Satisfaction</p>
</li>
<li>
<strong>$500M+</strong>
<p>In Transactions</p>
</li>
</ul>
</section>
<!-- <ListingsSection /> -->
<section>
<h2>Unlock Your Ideal Living Space</h2>
<nav>
<button type="button">All Properties</button>
<button type="button">Family House</button>
<button type="button">Villa</button>
<button type="button">Apartment</button>
<button type="button">Mansion</button>
<button type="button">Green House</button>
</nav>
<ul>
<li>
<img src="p1.jpg" alt="Silver Birch Villa" />
<h3>Silver Birch Villa</h3>
<p>Birmingham, UK</p>
<p>$850,000</p>
</li>
<li>
<img src="p2.jpg" alt="Maple Grove Cottage" />
<h3>Maple Grove Cottage</h3>
<p>Liverpool, UK</p>
<p>$500,000</p>
</li>
<li>
<img src="p3.jpg" alt="Cedar Hill Estate" />
<h3>Cedar Hill Estate</h3>
<p>Edinburgh, UK</p>
<p>$1,200,000</p>
</li>
</ul>
</section>
<!-- <ValuePropsSection /> -->
<section>
<h2>Seamless for Simplicity Built Trusted Results</h2>
<ul>
<li>
<strong>35K</strong>
<p>Happy clients</p>
</li>
<li>
<strong>120+</strong>
<p>Partners</p>
</li>
<li>
<strong>97%</strong>
<p>Satisfaction</p>
</li>
</ul>
<img src="v1.jpg" alt="Building detail" />
<img src="v2.jpg" alt="Architecture" />
</section>
<!-- <TrendingSection /> -->
<section>
<h2>Top Trending Dreams</h2>
<ul>
<li>
<img src="t1.jpg" alt="Pine Valley Retreat" />
<p>Pine Valley Retreat</p>
</li>
<li>
<img src="t2.jpg" alt="Elm Street Apartment" />
<p>Elm Street Apartment</p>
</li>
<li>
<img src="t3.jpg" alt="Willow Creek Lodge" />
<p>Willow Creek Lodge</p>
</li>
<li>
<img src="t4.jpg" alt="Hillside Escape" />
<p>Hillside Escape</p>
</li>
</ul>
</section>
<!-- <TestimonialsSection /> -->
<section id="testimonials">
<h2>Real Stories, Real Success with Fintech.</h2>
<ul>
<li>
<p>They stay in place and deliver amazing value.</p>
<p>Martin John — Homeowner</p>
</li>
<li>
<p>The process was smooth and transparent.</p>
<p>Malika James — Contractor</p>
</li>
<li>
<p>Reliable results and good guidance.</p>
<p>Theseer Omas — Investor</p>
</li>
</ul>
</section>
<!-- <ContactCTA /> -->
<section>
<h2>Get In Touch</h2>
<a href="/contact">Get Started for Free</a>
</section>
</main>
<!-- <SiteFooter /> -->
<footer>
<p>Dreamers</p>
<h3>Our Links</h3>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/services">Services</a></li>
</ul>
<h3>Our Condition</h3>
<ul>
<li><a href="/privacy">Privacy Policy</a></li>
<li><a href="/terms">Terms</a></li>
</ul>
<h3>Follow Us</h3>
<ul>
<li><a href="https://x.com">X</a></li>
<li><a href="https://instagram.com">Instagram</a></li>
<li><a href="https://facebook.com">Facebook</a></li>
</ul>
<p>© 2026</p>
</footer>
</body>
</html>ValuePropsSection?
<MainLayout>
<Hero />
<MissionBand />
<StatsRow />
<ListingsSection />
<ValuePropsSection />
<TrendingSection />
<TestimonialsSection />
<ContactCTA />
</MainLayout>ValuePropsSection<MainLayout>
<Hero />
<MissionBand />
<StatsRow />
<ListingsSection />
<ValuePropsSection />
<TrendingSection />
<TestimonialsSection />
<ContactCTA />
</MainLayout>ValuePropsSection<section>
<h2>Seamless for Simplicity Built Trusted Results</h2>
<ul>
<li>
<strong>35K</strong>
<p>Happy clients</p>
</li>
<li>
<strong>120+</strong>
<p>Partners</p>
</li>
<li>
<strong>97%</strong>
<p>Satisfaction</p>
</li>
</ul>
<img src="v1.jpg" alt="Building detail" />
<img src="v2.jpg" alt="Architecture" />
</section>ValuePropsSection<MainLayout>
<Hero />
<MissionBand />
<StatsRow />
<ListingsSection />
<ValuePropsSection />
<TrendingSection />
<TestimonialsSection />
<ContactCTA />
</MainLayout>.astro<section>
<h2>Seamless for Simplicity Built Trusted Results</h2>
<ul>
<li>
<strong>35K</strong>
<p>Happy clients</p>
</li>
<li>
<strong>120+</strong>
<p>Partners</p>
</li>
<li>
<strong>97%</strong>
<p>Satisfaction</p>
</li>
</ul>
<img src="v1.jpg" alt="Building detail" />
<img src="v2.jpg" alt="Architecture" />
</section>ValuePropsSection<MainLayout>
<Hero />
<MissionBand />
<StatsRow />
<ListingsSection />
<ValuePropsSection />
<TrendingSection />
<TestimonialsSection />
<ContactCTA />
</MainLayout>.astroforstå, hvad Astro er – og hvad det ikke er
forstå, hvilke problemer Astro forsøger at fjerne
forstå, hvad en komponent er
forstå, hvorfor Astro kræver et build-/servermiljø
Viden om
Færdigheder
forstå, hvad Astro er – og hvad det ikke er
forstå, hvilke problemer Astro forsøger at fjerne
forstå, hvad en komponent er
forstå, hvorfor Astro kræver et build-/servermiljø
kunne identificere gentagelser i et UI (komponenter)
kunne opbygge en side af komponenter (ikke copy-paste)
kunne styre simple variationer med props
kunne style komponenter lokalt (scoped styles)
Viden om
forstå, hvad Astro er – og hvad det ikke er
forstå, hvilke problemer Astro forsøger at fjerne
forstå, hvad en komponent er
forstå, hvorfor Astro kræver et build-/servermiljø
Færdigheder
kunne identificere gentagelser i et UI (komponenter)
kunne opbygge en side af komponenter (ikke copy-paste)
kunne styre simple variationer med props
kunne style komponenter lokalt (scoped styles)
Hvordan det føles at bygge noget
Astro
Et framework, der bl.a. handler om DX
Et værktøj, der hjælper med at bygge hurtigere og smartere
(... men ikke flottere...)
Marketing-afdelingen
Astro løser ikke ét stort problem, men fjerner mange små irritationer, du allerede har accepteret som “sådan er webudvikling”.
Genbrug af dele i stedet for copy-paste
Genbrug af dele i stedet for copy-paste
Hvornår copy-paster I kode?
Alt kan være en komponent, men gode komponenter handler om overblik og klarhed; gør koden lettere at læse.
gruppe-øvelse
Kan du og din sidemakker få øje på komponenter?
Top navigation (logo + actions)
Stories bar (Story items)
Feed
Post card
- header, media, actions
- likes, caption, comments mm.
Avatar
Icon
Icon Button
Komponenter
Verified Badge
- timestamp
Komponenter
timestamp
<time datetime={datetime}>
{label}
</time><!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="#">Forside</a></li>
<li><a href="#">Om</a></li>
<li><a href="#">Kontact</a></li>
</ul>
</nav>
</header>
<main>
<section id="hero">
<h2>Dette er et Hero-Image</h2>
<p>Her er noget introduktionstekst om denne side.</p>
<a href="#0">Lær Mere</a>
</section>
<section id="services">
<h2>Vores Services</h2>
<div class="service">
<h3>Service 1</h3>
<p>Beskrivelse af service 1.</p>
</div>
<div class="service">
<h3>Service 2</h3>
<p>Beskrivelse af service 2.</p>
</div>
<div class="service">
<h3>Service 3</h3>
<p>Beskrivelse af service 3.</p>
</div>
</section>
</main>
<footer>
<p>© 2026 Min Side. Alle rettigheder forbeholdes.</p>
</footer>
</body>
</html><header>
<nav>
<ul>
<li><a href="#">Forside</a></li>
<li><a href="#">Om</a></li>
<li><a href="#">Kontact</a></li>
</ul>
</nav>
</header><header>
<nav>
<ul>
<li><a href="#">Forside</a></li>
<li><a href="#">Om</a></li>
<li><a href="#">Kontact</a></li>
</ul>
</nav>
</header>
<main>
<section id="hero">
<h2>Dette er et Hero-Image</h2>
<p>Her er noget introduktionstekst om denne side.</p>
<a href="#0">Lær Mere</a>
</section>
<section id="services">
<h2>Vores Services</h2>
<div class="service">
<h3>Service 1</h3>
<p>Beskrivelse af service 1.</p>
</div>
<div class="service">
<h3>Service 2</h3>
<p>Beskrivelse af service 2.</p>
</div>
<div class="service">
<h3>Service 3</h3>
<p>Beskrivelse af service 3.</p>
</div>
</section>
</main>
<footer>
<p>© 2026 Min Side. Alle rettigheder forbeholdes.</p>
</footer><section id="hero">
<h2>Dette er et Hero-Image</h2>
<p>Her er noget introduktionstekst om denne side.</p>
<button>Lær Mere</button>
</section><div class="service">
<h3>Service 1</h3>
<p>Beskrivelse af service 1.</p>
</div><section id="services">
<h2>Vores Services</h2>
<Service />
<Service />
<Service />
</section><header>
<nav>
<ul>
<li><a href="#">Forside</a></li>
<li><a href="#">Om</a></li>
<li><a href="#">Kontact</a></li>
</ul>
</nav>
</header><header>
<nav>
<ul>
<li><a href="#">Forside</a></li>
<li><a href="#">Om</a></li>
<li><a href="#">Kontact</a></li>
</ul>
</nav>
</header>
<main>
<section id="hero">
<h2>Dette er et Hero-Image</h2>
<p>Her er noget introduktionstekst om denne side.</p>
<a href="#0">Lær Mere</a>
</section>
<section id="services">
<h2>Vores Services</h2>
<div class="service">
<h3>Service 1</h3>
<p>Beskrivelse af service 1.</p>
</div>
<div class="service">
<h3>Service 2</h3>
<p>Beskrivelse af service 2.</p>
</div>
<div class="service">
<h3>Service 3</h3>
<p>Beskrivelse af service 3.</p>
</div>
</section>
</main>
<footer>
<p>© 2026 Min Side. Alle rettigheder forbeholdes.</p>
</footer><section id="hero">
<h2>Dette er et Hero-Image</h2>
<p>Her er noget introduktionstekst om denne side.</p>
<button>Lær Mere</button>
</section><div class="service">
<h3>Service 1</h3>
<p>Beskrivelse af service 1.</p>
</div><section id="services">
<h2>Vores Services</h2>
<ServiceCard />
<ServiceCard />
<ServiceCard />
</section><header>
<h1>Velkommen til Min Side</h1>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
</header><section id="hero">
<h2>Dette er et Hero-Image</h2>
<p>Her er noget introduktionstekst om denne side.</p>
<button>Lær Mere</button>
</section><div class="service">
<h3>Service 1</h3>
<p>Beskrivelse af service 1.</p>
</div><section id="services">
<h2>Vores Services</h2>
<Service />
<Service />
<Service />
</section><!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<Header />
<Hero />
<Services />
<Footer />
</body>
</html><!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<Header />
<Hero />
<Services />
<Footer />
</body>
</html><!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="#">Forside</a></li>
<li><a href="#">Om</a></li>
<li><a href="#">Kontact</a></li>
</ul>
</nav>
</header>
<main>
<section id="hero">
<h2>Dette er et Hero-Image</h2>
<p>Her er noget introduktionstekst om denne side.</p>
<a href="#0">Lær Mere</a>
</section>
<section id="services">
<h2>Vores Services</h2>
<div class="service">
<h3>Service 1</h3>
<p>Beskrivelse af service 1.</p>
</div>
<div class="service">
<h3>Service 2</h3>
<p>Beskrivelse af service 2.</p>
</div>
<div class="service">
<h3>Service 3</h3>
<p>Beskrivelse af service 3.</p>
</div>
</section>
</main>
<footer>
<p>© 2026 Min Side. Alle rettigheder forbeholdes.</p>
</footer>
</body>
</html><MainLayout>
<Hero />
<Services />
</MainLayout><!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<Header />
<Hero />
<Services />
<Footer />
</body>
</html>Demo
Lad os prøve det...
---
import Header from "../components/Header.astro";
import Hero from "../components/Hero.astro";
import ServiceList from "../components/ServiceList.astro";
import Footer from "../components/Footer.astro";
---
<!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<Header />
<main>
<Hero />
<ServiceList />
</main>
<Footer />
</body>
</html>• browseren forstår ikke "import", "<Header />" mm.,
• så koden kører ikke direkte i browseren.
• “Live server” virker ikke her.
• koden skal samles og oversættes først.
Udviklingsmiljø, der kan:
• forstå Astro-filer
• samle komponenter til HTML
• starte en lokal server
• opdatere siden automatisk, når vi gemmer
---
import Header from "../components/Header.astro";
import Hero from "../components/Hero.astro";
import ServiceList from "../components/ServiceList.astro";
import Footer from "../components/Footer.astro";
---
<!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<Header />
<main>
<Hero />
<ServiceList />
</main>
<Footer />
</body>
</html>• browseren forstår ikke "import", "<Header />" mm.,
• så koden kører ikke direkte i browseren.
• “Live server” er ikke nok,
• koden skal samles og oversættes først
Udviklingsmiljø, der kan:
• forstå Astro-filer
• samle komponenter til HTML
• starte en lokal server
• opdatere siden automatisk, når vi gemmer
Det er bare et program på computeren,
der kan køre JavaScript uden for browseren.
Astro bruger det til at bygge hjemmesiden,
før browseren ser den.
---
import Header from "../components/Header.astro";
import Hero from "../components/Hero.astro";
import ServiceList from "../components/ServiceList.astro";
import Footer from "../components/Footer.astro";
---
<!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<Header />
<main>
<Hero />
<ServiceList />
</main>
<Footer />
</body>
</html><!doctype html>
<html lang="da">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Hjem</title>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="#">Forside</a></li>
<li><a href="#">Om</a></li>
<li><a href="#">Kontact</a></li>
</ul>
</nav>
</header>
<main>
<section id="hero">
<h2>Dette er et Hero-Image</h2>
<p>Her er noget introduktionstekst om denne side.</p>
<a href="#0">Lær Mere</a>
</section>
<section id="services">
<h2>Vores Services</h2>
<div class="service">
<h3>Service 1</h3>
<p>Beskrivelse af service 1.</p>
</div>
<div class="service">
<h3>Service 2</h3>
<p>Beskrivelse af service 2.</p>
</div>
<div class="service">
<h3>Service 3</h3>
<p>Beskrivelse af service 3.</p>
</div>
</section>
</main>
<footer>
<p>© 2026 Min Side. Alle rettigheder forbeholdes.</p>
</footer>
</body>
</html>->
Header.astro
Button.astro
Footer.astro
Card.astro
CardSection.astro
Hero.astro
Om lidt er det din tur
Komponenter
---
---
<article>
<h2></h2>
<p></p>
</article>
<style>
article {...}
</style>"Single file component", som betyder, at vi samler al relevant HTML, CSS (og JavaScript) i den enkelte component
---
---
<article>
<h2></h2>
<p></p>
</article>
<style>
article {...}
</style>
<script>
...
</script>"Single file component", som betyder, at vi samler al relevant HTML, CSS (og JavaScript) i den enkelte component
Komponenter
---
---"Frontmatter"
import "../styles/global.css"Komponenter
---
---import "../styles/global.css"import Component from "../components/Component.astro"Importer stylesheet
Komponenter
---
---import "../styles/global.css"import Component from "../components/Component.astro"const { prop } = Astro.props;Importer component
Komponenter
---
---import "../styles/global.css"import Component from "../components/Component.astro"const { prop } = Astro.props;Saml props op
const now = new Date();
const localTime = now.toLocaleTimeString("da-DK");Komponenter
---
---import "../styles/global.css"const { prop } = Astro.props;JavaScript på serveren ("build time")
const now = new Date();
const localTime = now.toLocaleTimeString("da-DK");Komponenter
---
---
<p>Hej, klokken er {localTime}</p>JavaScript på serveren ("build time")
const now = new Date();
const localTime = now.toLocaleTimeString("da-DK");Hvad var klokken, der jeg byggede siden (statisk)
Komponenter
HTML-delen
---
---
<p>Hej, klokken er {localTime}</p>Komponenter
{} bruges til at vise props i HTML
---
---
<article>
<h2>{title}</h2>
<p>{body}</p>
</article>Komponenter
Saml props op
---
const { title, body } = Astro.props;
---
<article>
<h2>{title}</h2>
<p>{body}</p>
</article>Komponenter
Scoped styles
<article>
<h2>{title}</h2>
<p>{body}</p>
</article>
<style>
article {
background: #bada55;
}
h2 {
color: #5000ca;
}
</style>Komponenter
Rammer kun <h2> i komponent
Komponenter
├── src/
└── components/
└── Header.astro
└── Hero.astro
└──
└── ServiceList.astro
└── Footer.astroServiceCard.astro---
const { title, description } = Astro.props;
---
<div class="service">
<h3>{title}</h3>
<p>{description}</p>
</div>ServiceCard.astroKomponenter
---
import ServiceCard from "../components/ ";
---
<ServiceCard />
<ServiceCard />
<ServiceCard />ServiceCard.astroKonvention: Samme navn
Komponenter
Hvert card har nu forskelligt indhold
Komponenter
---
import ServiceCard from "../components/ ";
---
<ServiceCard
title="Service 1"
description="Beskrivelse af service 1." />
<ServiceCard
title="Service 2"
description="Beskrivelse af service 2." />ServiceCard.astroProp =
selvopfunden attribut
---
import ServiceCard from "../components/ ";
---
<ServiceCard
title="Service 1"
description="Beskrivelse af service 1."
/>ServiceCard.astro---
const { title, description } = Astro.props;
---
<div class="service">
<h3>{title}</h3>
<p>{description}</p>
</div>øvelse
<slot /><Box>Get started</Box><div class="box">
<slot />
</div>Get started<Box>Get started</Box><div class="box">
<slot />
</div>Get startedSlot er et hul, hvor markup indsættes.
<Card>
<p>Lorem ipsum...</p>
</Card>vs.
<Card description="Lorem ipsum..." />Hvis komponenten skal kende strukturen
Hvis indholdets struktur varierer
<InfoBox>
<p>Dette er vigtig information.</p>
<p>Læs det grundigt.</p>
</InfoBox>Indholdets struktur kan variere
<FAQItem question="Hvad er Astro?">
<p>Astro er et web-framework.</p>
</FAQItem>Indholdets struktur kan variere
Fast struktur - skal være der
<FAQItem question="Hvad er Astro?">
<p>Astro er et web-framework.</p>
</FAQItem>Indholdets struktur kan variere
---
const { question } = Astro.props;
---
<h3>{question}</h3>
<div>
<slot />
</div>Fast struktur - skal være der
<FAQItem question="Hvad er Astro?">
<p>Astro er et web-framework.</p>
</FAQItem>Scoped styles virker ikke med slots
<h3>{question}</h3>
<div>
<slot /> <!-- ????? -->
</div>
<style>
p {
color: red; /* ????? */
}
</style><ButtonLink>Se mere</ButtonLink>Ingen ekstra markup, bare tekst
Wrappers
<Section title="">
<Card title="" img="" />
<Card title="" img="" />
</Section>Komponenter styrer selv deres styling
Wrappers
---
const { title } = Astro.props;
---
<section class="section">
<h2 class="section__title">{title}</h2>
<div class="section__content">
<slot />
</div>
</section>Wrappers
<Section title="">
<Card title="" img="" />
<Card title="" img="" />
</Section>Card er slotted indhold
<section class="section">
<h2 class="section__title">{title}</h2>
<div class="section__content">
<slot />
</div>
</section>
<style>
.section__content {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
</style><Section> styrer layout af indhold (slot)