aboutsummaryrefslogtreecommitdiff
path: root/examples/portfolio/src/pages/index.astro
diff options
context:
space:
mode:
Diffstat (limited to 'examples/portfolio/src/pages/index.astro')
-rw-r--r--examples/portfolio/src/pages/index.astro252
1 files changed, 252 insertions, 0 deletions
diff --git a/examples/portfolio/src/pages/index.astro b/examples/portfolio/src/pages/index.astro
new file mode 100644
index 000000000..5f67e3860
--- /dev/null
+++ b/examples/portfolio/src/pages/index.astro
@@ -0,0 +1,252 @@
+---
+import { getCollection } from 'astro:content';
+
+// Layout import — provides basic page elements: <head>, <nav>, <footer> etc.
+import BaseLayout from '../layouts/BaseLayout.astro';
+
+// Component Imports
+import CallToAction from '../components/CallToAction.astro';
+import Grid from '../components/Grid.astro';
+import Hero from '../components/Hero.astro';
+import Icon from '../components/Icon.astro';
+import Pill from '../components/Pill.astro';
+import PortfolioPreview from '../components/PortfolioPreview.astro';
+
+// Page section components
+import ContactCTA from '../components/ContactCTA.astro';
+import Skills from '../components/Skills.astro';
+
+// Content Fetching: List four most recent work projects
+const projects = (await getCollection('work'))
+ .sort((a, b) => b.data.publishDate.valueOf() - a.data.publishDate.valueOf())
+ .slice(0, 4);
+
+// Full Astro Component Syntax:
+// https://docs.astro.build/basics/astro-components/
+---
+
+<BaseLayout>
+ <div class="stack gap-20 lg:gap-48">
+ <div class="wrapper stack gap-8 lg:gap-20">
+ <header class="hero">
+ <Hero
+ title="Hello, my name is Jeanine White"
+ tagline="I am a Creative Developer who is currently based in Portland, Oregon."
+ align="start"
+ >
+ <div class="roles">
+ <Pill><Icon icon="code" size="1.33em" /> Developer</Pill>
+ <Pill><Icon icon="microphone-stage" size="1.33em" /> Speaker</Pill>
+ <Pill><Icon icon="pencil-line" size="1.33em" /> Writer</Pill>
+ </div>
+ </Hero>
+
+ <img
+ alt="Jeanine White smiling in a red plaid shirt and tortoise shell glasses"
+ width="480"
+ height="620"
+ src="/assets/portrait.jpg"
+ />
+ </header>
+
+ <Skills />
+ </div>
+
+ <main class="wrapper stack gap-20 lg:gap-48">
+ <section class="section with-background with-cta">
+ <header class="section-header stack gap-2 lg:gap-4">
+ <h3>Selected Work</h3>
+ <p>Take a look below at some of my featured work for clients from the past few years.</p>
+ </header>
+
+ <div class="gallery">
+ <Grid variant="offset">
+ {
+ projects.map((project) => (
+ <li>
+ <PortfolioPreview project={project} />
+ </li>
+ ))
+ }
+ </Grid>
+ </div>
+
+ <div class="cta">
+ <CallToAction href="/work/">
+ View All
+ <Icon icon="arrow-right" size="1.2em" />
+ </CallToAction>
+ </div>
+ </section>
+
+ <section class="section with-background bg-variant">
+ <header class="section-header stack gap-2 lg:gap-4">
+ <h3>Mentions</h3>
+ <p>
+ I have been fortunate enough to receive praise for my work in several publications. Take
+ a look below to learn more.
+ </p>
+ </header>
+
+ <div class="gallery">
+ <Grid variant="small">
+ {
+ ['Medium', 'BuzzFeed', 'The Next Web', 'awwwards.', 'TechCrunch'].map((brand) => (
+ <li class="mention-card">
+ <p>{brand}</p>
+ </li>
+ ))
+ }
+ </Grid>
+ </div>
+ </section>
+ </main>
+
+ <ContactCTA />
+ </div>
+</BaseLayout>
+
+<style>
+ .hero {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2rem;
+ }
+
+ .roles {
+ display: none;
+ }
+
+ .hero img {
+ aspect-ratio: 5 / 4;
+ object-fit: cover;
+ object-position: top;
+ border-radius: 1.5rem;
+ box-shadow: var(--shadow-md);
+ }
+
+ @media (min-width: 50em) {
+ .hero {
+ display: grid;
+ grid-template-columns: 6fr 4fr;
+ padding-inline: 2.5rem;
+ gap: 3.75rem;
+ }
+
+ .roles {
+ margin-top: 0.5rem;
+ display: flex;
+ gap: 0.5rem;
+ }
+
+ .hero img {
+ aspect-ratio: 3 / 4;
+ border-radius: 4.5rem;
+ object-fit: cover;
+ }
+ }
+
+ /* ====================================================== */
+
+ .section {
+ display: grid;
+ gap: 2rem;
+ }
+
+ .with-background {
+ position: relative;
+ }
+
+ .with-background::before {
+ --hero-bg: var(--bg-image-subtle-2);
+
+ content: '';
+ position: absolute;
+ pointer-events: none;
+ left: 50%;
+ width: 100vw;
+ aspect-ratio: calc(2.25 / var(--bg-scale));
+ top: 0;
+ transform: translateY(-75%) translateX(-50%);
+ background:
+ url('/assets/backgrounds/noise.png') top center/220px repeat,
+ var(--hero-bg) center center / var(--bg-gradient-size) no-repeat,
+ var(--gray-999);
+ background-blend-mode: overlay, normal, normal, normal;
+ mix-blend-mode: var(--bg-blend-mode);
+ z-index: -1;
+ }
+
+ .with-background.bg-variant::before {
+ --hero-bg: var(--bg-image-subtle-1);
+ }
+
+ .section-header {
+ justify-self: center;
+ text-align: center;
+ max-width: 50ch;
+ font-size: var(--text-md);
+ color: var(--gray-300);
+ }
+
+ .section-header h3 {
+ font-size: var(--text-2xl);
+ }
+
+ @media (min-width: 50em) {
+ .section {
+ grid-template-columns: repeat(4, 1fr);
+ grid-template-areas: 'header header header header' 'gallery gallery gallery gallery';
+ gap: 5rem;
+ }
+
+ .section.with-cta {
+ grid-template-areas: 'header header header cta' 'gallery gallery gallery gallery';
+ }
+
+ .section-header {
+ grid-area: header;
+ font-size: var(--text-lg);
+ }
+
+ .section-header h3 {
+ font-size: var(--text-4xl);
+ }
+
+ .with-cta .section-header {
+ justify-self: flex-start;
+ text-align: left;
+ }
+
+ .gallery {
+ grid-area: gallery;
+ }
+
+ .cta {
+ grid-area: cta;
+ }
+ }
+
+ /* ====================================================== */
+
+ .mention-card {
+ display: flex;
+ height: 7rem;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+ border: 1px solid var(--gray-800);
+ border-radius: 1.5rem;
+ color: var(--gray-300);
+ background: var(--gradient-subtle);
+ box-shadow: var(--shadow-sm);
+ }
+
+ @media (min-width: 50em) {
+ .mention-card {
+ border-radius: 1.5rem;
+ height: 9.5rem;
+ }
+ }
+</style>