I går

Astro

Hvor er vi?

  • Hvad er en component i Astro?
  • Hvad er props?
  • Hvad er et <slot />?
  • Hvad er scoped styles?
  • Hvordan starter man en dev-server (live server)?
    • Hvordan stopper man dev-serveren?
  • Er Astro smart (eller har det i det mindste potentiale)?

Opbygning

Astro-components

├── src/
    └── components/
    	└── Header.astro
    	└── CardSection.astro
    	└── Card.astro
    	└── Button.astro
    	└── Footer.astro

Opbygning

Astro-components

<!-- Card.astro -->
<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>

Opbygning

Astro-components

---
import Card from "../components/Card.astro";
---

<Card />
<Card />
<Card />
<Card />
<Card />
<Card />

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

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>
---
const { variant } = Astro.props;
---

<button class={variant}>
  <slot />
</button>

<style>
  .secondary {
    background: red;
  }
</style>

dynamisk

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

øvelse

Spotify i Astro

Sæt dig sammen med sidemakkeren og kig på min løsning (se mere på Fronter).

Giver min tilgang mening?

øvelse

Push dit site til Netlify

Opret en gratis konto på Netlify.app og læg dit site live

Layouts & Conditionals

Astro

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

---
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.

Genbrugelige sideskabeloner

Layout-components

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>
    <Header />
    <Sidebar />
    <main>
   	  <slot />
    </main>
    <Footer />
  </body>
</html>

Layout-components

Conditional rendering

Vis eller skjul indhold baseret på bestemte betingelser

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>
{
}
&&
visible
<p class="badge">New</p>

Conditionals

---
const visible = true;
---
<article>
  <h2>...</h2>
  
  
  
  <img />
</article>
<p class="badge">New</p>
{
}
&&
visible

Conditionals

---
const visible = true;
---
<article>
  <h2>...</h2>
  
  
  
  <img />
</article>
<p class="badge">New</p>
{
}
&&
visible

hvis visible er sand

Conditionals

---
const visible = true;
---
<article>
  <h2>...</h2>
  
  
  
  <img />
</article>

vis HTML

<p class="badge">New</p>
{
}
&&
visible

Conditionals

---
const { newBadge } = Astro.props;
---
<article>
  <h2>...</h2>
  
  {newBadge && <p class="badge">New</p>}
  
  <img />
</article>
<CategoryCard
  newBadge={true}
  ...
/>

Conditionals

---
const { newBadge } = Astro.props;
---
<article>
  <h2>...</h2>
  
  {newBadge && <p class="badge">New</p>}
  
  <img />
</article>
<CategoryCard
  newBadge={true}
  ...
/>

<CategoryCard
  ...
/>

Conditionals

---
const { title } = Astro.props;
---
<article>  
  {title && <h2>{title}</h2>}
  
  <img />
</article>
<Card
  title="Card Heading"
  description="Lorem..."
/>

<Card
  description="Lorem..."
/>

Conditionals

Conditionals

Dynamiske klasser

<Component
  isActive={true}
  ...
/>
---
const { isActive } = Astro.props;
---
<div class={isActive && "active"}>
  ...
</div>

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

Conditionals

Dynamiske klasser

Tema-opgaven

Kom i gang

Den færdige løsning

  • En landingpage
  • En oversigt over koncerter eller kunstnere ('liste view')
  • 'Single view' visninger af koncerter eller kunstnere

Tekniske krav

  • <META NAME="robots" CONTENT="noindex,nofollow">
  • Git og branches skal bruges (så I får noget erfaring)
  • Sitet skal være responsivt
  • Hostes på Netlify

Mandag

I morgen

Resten af dagen

Projektarbejde

  • Installér Astro
  • Lav en layoutfil
  • Opret pages
  • Planlæg components
  • Skriv den grundlæggende, generelle CSS
  • Læg en plan, hvem tager hvad
  • Læg det på GitHub og tilføj “collaborators”
  • Klon GitHub repo til gruppens øvrige medlemmer og
  • kør npm install, når der er klonet (ellers virker det ikke!)

Én af jer opretter et projekt, og de andre kloner og kører npm install

GitHub-organization?

Astro (part 2)

By Dannie Vinther

Astro (part 2)

  • 85