Component Framework
Astro
Framework
Hvad er det?
Hvorfor Astro?
- Ligesom i Figma, arbejder vi i Astro med components; små isolerede kode-blokke, der kan stykkes sammen og genbruges.
- ALLE bruger components ude i virkeligheden
Hvorfor Astro?
-
Astro er en static site generator; den spytter statiske sider ud
- som er hurtigere
- mere bæredygtige
- Hvis vi kombinerer fetch med components, så kan vi begynde at være mere produktive og effektive i udviklingen af websites
Hvorfor Astro?
- CSS bliver "nemmere"
Hvorfor Astro?
- Astro er "let" i forhold til andre frameworks
- React
- Vue
- Svelte
- osv.
Hvad er Astro?
Static site generator med værktøjer, der gør kode-processen mere belejlig.
Optimerer fx automatisk kode (HTML, CSS & JavaScript) og billeder for dig.
Hvad er Astro?
Men det betyder også, at vi skriver kode, der ikke virker i browseren 😬
Dvs. at "live server" heller ikke virker, når vi udvikler i Astro
Node.js
- Server-miljø, hvor vi kan automatisere ting og køre JavaScript udenfor browseren
- Kommandoer, der kan køres i terminalen
-
npm install
-
Installerer de pakker, som projektet har brug for.
-
-
npm run dev (ligesom "live server")
-
Starter en lokal server, som viser projektet live i browseren
-
-
npm create astro@latest
-
Starter et nyt Astro-projekt med den nyeste version.
-
-
Fra HTML til Astro
<header>
<h1>Heading</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>
<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>
<footer>
<p>© 2024 Min Side. Alle rettigheder forbeholdes.</p>
</footer>
Fra HTML til Astro
<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>
<header>
<h1>Heading</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>
<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>
<footer>
<p>© 2024 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>
Fra HTML til Astro
<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>
<header>
<h1>Heading</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>
<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>
<footer>
<p>© 2024 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>
Fra HTML til Astro
<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>
<Layout>
<Hero />
<Services />
</Layout>
<header>
<h1>Heading</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>
<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>
<footer>
<p>© 2024 Min Side. Alle rettigheder forbeholdes.</p>
</footer>
Fra HTML til Astro
<Layout>
<Hero />
<Services />
</Layout>
<header>
<h1>Heading</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>
<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>
<footer>
<p>© 2024 Min Side. Alle rettigheder forbeholdes.</p>
</footer>
øvelse
Components
Identificer components sammen med din sidemakker i følgende. Hvor ser I components?

øvelse

Hvornår er noget en component?
- En genbrugelig skabelon, der kan modtage data
- Alt kan gøres til en component (men det vil vi nok ikke)
- Hvis noget html skal copy pastes, så er det nok en component
- Hvis du kan give det et navn (a la footer) så er det nok en component
øvelse
Fra HTML til Astro-components
Lav Astro-components ud fra en eksisterende HTML-fil (se øvelsen på Fronter)


Components

Components
Hvor ser vi components?

Header.astro
Button.astro
Footer.astro
Card.astro
CardSection.astro
Hero.astro
Opbygning
Astro-components
├── src/
└── components/
└── Header.astro
└── CardSection.astro
└──
└── Button.astro
└── Footer.astro
Card.astro
Opbygning
Astro-components
<li>
<h3>Animation</h3>
<p>
Learn the latest animation techniques to create stunning motion
design and captivate your audience.
</p>
<a href="/animation" class="btn" data-variant="ghost">Get started</a>
</li>
Card.astro
Opbygning
Astro-components
---
import Card from "../components/ ";
---
<Card />
<Card />
<Card />
<Card />
<Card />
<Card />
Card.astro
Opbygning
Astro-components
---
---
<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
Opbygning
Astro-components
---
---
<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
Fences
Astro-components og pages
---
---
"Frontmatter"
import "../styles/global.css"
---
---
import "../styles/global.css"
import Component from "../components/Component.astro"
Importer stylesheet
Fences
Astro-components og pages
---
---
import "../styles/global.css"
import Component from "../components/Component.astro"
const { prop } = Astro.props;
Importer component
Fences
Astro-components og pages
---
---
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");
Fences
Astro-components og pages
---
---
import "../styles/global.css"
const { prop } = Astro.props;
JavaScript på serveren ("build time")
const now = new Date();
const localTime = now.toLocaleTimeString("da-DK");
Fences
Astro-components og pages
---
---
<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)
Fences
Astro-components og pages
Components
Props
---
const { title, description } = Astro.props;
---
<article>
<h2>{title}</h2>
<p>{description}</p>
</article>
Saml props op
Components
Props
---
const { title, description } = Astro.props;
---
<article>
<h2>{title}</h2>
<p>{description}</p>
</article>
Saml props op
---
import Card from "../components/Card.astro";
---
<Card title="Jeg er en overskrift"
description="Jeg er en beskrivelse"
/>
Send props til Card-component
Skabelon
Components
Props
---
import Card from "../components/Card.astro";
---
<Card title="Jeg er en overskrift"
description="Jeg er en beskrivelse"
/>
<Card title="Jeg er anderledes"
description="Også mig..."
/>
Components
Scoped styles
---
const { title, description } = Astro.props;
---
<article>
<h2>{title}</h2>
<p>{description}</p>
</article>
<style>
h2 {
color: red;
}
</style>


Ikon
Titel
Knap
Beskrivelse
Ikon
Titel
Knap
Beskrivelse


Components
Brug Card
Ikon
Titel
Knap
Beskrivelse

<ul>
<Card iconName="running-man"
title="Animation"
description="Learn the latest..."
link="/animation"
/>
<!-- ... -->
</ul>
Components
Brug Card

<ul>
<Card iconName="img"
title="Design"
description="Create beautiful, usable..."
link="/design"
/>
<!-- ... -->
</ul>

Components
Styling af Card
<!-- Astro Props & HTML for Card -->
<style>
li {
display: flex;
flex-flow: column;
aspect-ratio: 1;
padding: 2rem;
background: #fff;
border-radius: 0.5rem;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1),
0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
</style>

Components
Styling af Card

<!-- Astro Props & HTML for Card -->
<style>
li {
display: flex;
flex-flow: column;
aspect-ratio: 1;
padding: 2rem;
background: #fff;
border-radius: 0.5rem;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1),
0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
</style>

Påvirker kun `li` i Card, ikke andre
Components
Styling af Card
<!-- Astro Props & HTML for Card -->
<style>
h3 {
color: #000;
font-size: 1.25rem;
margin: 0;
}
</style>

Påvirker kun `h3` i Card, ikke andre



fag-briller

Components
Design Patterns
Grid System
Design Tokens


Hierarki

Components
Design Patterns
Hierarki
Grid System
Design Tokens

Figma
ASTRO
X
Components
Figma
ASTRO
X
Components

<Button>Knap</Button>

npm create astro@latest


Components

npm create astro@latest


Components

figma
npm create astro@latest





HOME
PRODUCTS
ABOUT
npm create astro@latest





HOME
PRODUCTS
ABOUT
<Button variant="secondary">Action</Button>
secondary
primary
secondary
primary
---
const { variant } = Astro.props;
---
<button class={variant}>
<slot />
</button>
<style>
.secondary {
background: red;
}
</style>




dynamisk

skabelon
<Button variant="secondary">Knap</Button>


<Button variant="secondary">Knap</Button>


Prop
s
ertie
<Button variant="secondary">Knap</Button>


Prop
s
ertie
Component
<Button variant="secondary">Send</Button>
<button class="secondary">Send</button>
VS Code
Browser

<Button hasIcon={true}>Send</Button>
<button>
<span>Send</span>
<svg>...</svg>
</button>
VS Code
Browser


<Button link="/send" hasIcon={true}>Send</Button>
<a href="/send">
<span>Send</span>
<svg>...</svg>
</a>
VS Code
Browser


Hvis "link", skift til korrekt HTML-tag
<Button variant="primary"
hasIcon={true}
icon="arrow-right"
link="/send"
>
Send
</Button>
<button>
<span>Send</span>
<svg>...</svg>
</button>
VS Code
Browser

VS Code
Browser
<ul>
<Card title="Animation"
description="Learn the latest..."
link="/animation"
/>
<!-- flere Cards -->
</ul>
<!-- ... -->
<ul>
<li>
<h3>Animation</h3>
<p>
Learn the latest animation techniques.
</p>
<a href="/animation" class="ghost">
Get started
</a>
</li>
<!-- flere Cards -->
</ul>
<!-- ... -->
Button.astro
<li>
<h3>{title}</h3>
<p>
{description}
</p>
<Button variant="ghost">Get started</Button>
</li>
Button.astro
---
import Button from "./components/Button.astro"
---
<li>
<h3>{title}</h3>
<p>
{description}
</p>
<Button variant="ghost">Get started</Button>
</li>

---
import Button from "./components/Button.astro"
---
<li>
<h3>{title}</h3>
<p>
{description}
</p>
<Button variant="ghost">Get started</Button>
</li>

"import"
---
import Button from "./components/Button.astro"
---
<li>
<h3>{title}</h3>
<p>
{description}
</p>
<Button variant="ghost">Get started</Button>
</li>
Nested component

øvelse
Byg Spotify
Brug Astro til at genskabe så meget af open.spotify.com som du kan (se øvelsen på Fronter)

Start nyt projekt


npm create astro@latest .
Start nyt projekt
npm create astro@latest .
Start nyt projekt













Components
PlaylistCard
Shelf
Button
Sidebar
Navigation
Footer

Components
PlaylistCard
Shelf
Button
Sidebar
Navigation
Footer





Button









Primær
Sekundær
Tertiær
variant props
Button
<Button
variant="primary">
Log in
</Button>






MEDIUM
SMALL
size props
Button
<Button
variant="primary"
size="medium">
Log in
</Button>





MEDIUM
SMALL
Button
---
const { variant } = Astro.props;
---
<button class={variant}>
<slot />
</button>
<style>
.primary { ... }
</style>





MEDIUM
SMALL
Button
---
const { variant, size } = Astro.props;
---
<button class={`${variant} ${size}`}>
<slot />
</button>
<style>
.primary { ... }
.medium { ... }
</style>
- Hvis du ikke allerede har en konto på Netlify (netlify.app), så opret en konto vha. din GitHub-konto
- Giv de nødvendige tilladelser til GitHub
- Under Sites i hovedmenuen på Netlify, vælger du Add new site > Import an existing project
- Via GitHub peger du på dit repository
- Klik derefter på Deploy site
- Find linket og verificér, at det virker
Push dit site til Netlify
Øvelse
Astro
By Dannie Vinther
Astro
- 157