Astro
Projektstruktur
Mac
node
Øvelse
- Sæt jer sammen med sidekammeraten
- Brug 10 min. på at vise hinanden, hvordan I har løst opgaven
- Én af jer (eller begge to) skal navigere til GitHub-repo (Fronter)
- Klon det ned lokalt
- Kør npm install og npm run dev i terminalen
- Sammenlign og diskutér evt., hvad I ser i /src
Hvordan løste I den?
20-25 min.
Vi samler op sammen bagefter...
Hvordan løste vi den?










Components
PlaylistCard
Shelf
Button
Nav
Topbar
Footer
Icon





Components
PlaylistCard
Shelf
Button
Nav
Topbar
Footer
Icon





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, size } = Astro.props;
---
<button class={variant + " " + size}>
<slot />
</button>
<style>
.primary { ... }
.medium { ... }
</style>





MEDIUM
SMALL
Button
---
const { variant, size } = Astro.props;
---
<button class:list={[ variant, size ]} />
<slot />
</button>
<style>
.primary { ... }
.medium { ... }
</style>
medium hvad?





MEDIUM
SMALL
Button
---
const { variant, size } = Astro.props;
---
<button data-variant={variant} data-size={size}>
<slot />
</button>
<style>
[data-variant="primary"] { ... }
[data-size="medium"] { ... }
</style>

I dag
-
Pages & layouts
-
Conditionals
-
Deployment
Mål
-
Omorganisering af kode
-
Bruge betinget HTML / styling
-
Læg sitet på Netlify
Pages

speciel mappe
Pages

- I /pages-mappen findes diverse (under)sider
- Filer, der ender på .astro eller endda .html
- Sider i /pages begynder altid med små bogstaver, selvom de har endelsen .astro (til forskel fra components)
- Der kan linkes imellem siderne med et normalt a-tag:
<nav>
<a href="/">Home</a> <!-- index.astro -->
<a href="/search">Search</a> <!-- search.astro -->
</nav>

Genbrugelige sideskabeloner
Layout-components
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>Search</title>
</head>
<body>
<h1>Search</h1>
</body>
</html>
point of interest
Genbrugelige sideskabeloner
Layout-components
---
import MainLayout from '../layouts/MainLayout.astro';
---
<MainLayout title="Search">
<h1>Search</h1>
</MainLayout>
point of interest
skabelon med prop
Genbrugelige sideskabeloner
Layout-components
---
const { title } = Astro.props;
---
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
</head>
<body>
<slot />
</body>
</html>
prop
---
import MainLayout from '../layouts/MainLayout.astro';
---
<MainLayout title="Search">
<h1>Search</h1>
</MainLayout>
Genbrugelige sideskabeloner
Layout-components
---
const { title } = Astro.props;
---
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
</head>
<body>
<slot />
</body>
</html>
---
import MainLayout from '../layouts/MainLayout.astro';
---
<MainLayout title="Search">
<h1>Search</h1>
</MainLayout>
sideindhold her
Genbrugelige sideskabeloner
Layout-components
We conventionally use the term “layout” for Astro components that provide common UI elements shared across pages such as headers, navigation bars, and footers.

Layout-components
---
const { title } = Astro.props;
---
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
</head>
<body>
<Nav />
<Topbar />
<slot />
<Footer />
</body>
</html>
Layout-components
Øvelse
Lav undersiden Search med layout og pages.
- Opret en layouts-mappe med MainLayout.astro
- Flyt de relevante ting fra index.astro
- Importer og brug MainLayout på index.astro og search.astro
Byg Spotify Search




Conditionals


betinget HTML
Conditionals



betinget HTML
Conditionals

Conditionals
<article>
<h2>...</h2>
<p class="badge">New</p>
<img />
</article>
Conditionals
<article>
<h2>...</h2>
<img />
</article>
Astro can conditionally display HTML
<p class="badge">New</p>
---
const visible = true;
---
<article>
<h2>...</h2>
<img />
</article>
Conditionals
Astro can conditionally display HTML
<p class="badge">New</p>
{
}
&&
visible
---
const visible = true;
---
<article>
<h2>...</h2>
<img />
</article>
Conditionals
Astro can conditionally display HTML
<p class="badge">New</p>
{
}
&&
visible
---
const visible = true;
---
<article>
<h2>...</h2>
<img />
</article>
Conditionals
Astro can conditionally display HTML
<p class="badge">New</p>
{
}
&&
visible
hvis visible er sand
---
const visible = true;
---
<article>
<h2>...</h2>
<img />
</article>
Conditionals
Astro can conditionally display HTML
<p class="badge">New</p>
{
}
&&
visible
vis HTML
---
const { newBadge } = Astro.props;
---
<article>
<h2>...</h2>
{newBadge && <p class="badge">New</p>}
<img />
</article>
<CategoryCard
newBadge={true}
...
/>
Conditionals
Astro can conditionally display HTML
{
}
&&
---
const { newBadge } = Astro.props;
---
<article>
<h2>...</h2>
{newBadge && <p class="badge">New</p>}
<img />
</article>
<CategoryCard
newBadge={true}
...
/>
<CategoryCard
newBadge={false}
...
/>
boolean prop
Conditionals
Astro can conditionally display HTML
Conditionals
Dynamiske klasser
<Component
isActive={true}
...
/>
---
const { isActive } = Astro.props;
---
<div class={isActive && "active"}>
...
</div>
Conditionals
Dynamiske klasser
hvis isActive er sand -> "active"
active
Conditionals
Dynamiske klasser

Developer Tools
---
const { isActive } = Astro.props;
---
<div class={isActive && "active"}>
...
</div>
active
Conditionals
Dynamiske klasser

Developer Tools
---
const { isActive } = Astro.props;
---
<div class={isActive && "active"}>
...
</div>
active
Kode, der ikke virker?
Astro
npm run build
Laver koden om til almindelig HTML, CSS og JavaScript
Netlify gør det hele for os
- 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 - Pages & Layouts
By Dannie Vinther
Astro - Pages & Layouts
Astro pages og layouts
- 106