Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
87a333b
ci: add Azure Static Web Apps workflow file
3innielee Sep 16, 2026
77adece
ci: configure Azure Static Web Apps staging deployment
3innielee Sep 16, 2026
0768443
Remove contact page from header
3innielee Sep 17, 2026
53c913a
ci: protect staging with Entra authentication
3innielee Sep 17, 2026
0b66235
test: remove auth redirect for staging diagnosis
3innielee Sep 17, 2026
f84b41e
feat: add site logo and favicon
3innielee Sep 18, 2026
e86e6a7
fix: correct Entra client secret setting reference
3innielee Sep 18, 2026
247e25b
fix: restore responseOverrides
3innielee Sep 18, 2026
c0d1805
test: AZURE_CLIENT_SECRET
3innielee Sep 18, 2026
844cc1a
test: Entra login
3innielee Sep 18, 2026
b48bf5d
test: Entra login
3innielee Sep 18, 2026
f7f2e06
feat: remove contact link in footer
3innielee Sep 18, 2026
d17f2cd
refactor: refine reusable page components (#25)
3innielee Oct 6, 2026
d85bf11
feat: establish Astro content collections architecture (#27)
3innielee Oct 6, 2026
8f0552b
feat: migrate competitions to content collections (#29)
3innielee Oct 6, 2026
92fb4e1
feat: migrate meetings to content collections (#31)
3innielee Oct 6, 2026
1774656
feat: migrate board members to content collections (#33)
3innielee Oct 6, 2026
78817ed
refactor: consolidate shared date time utilities (#35)
3innielee Oct 6, 2026
228ec9a
feat: prepare layouts for board bios and event photos (#37)
3innielee Oct 6, 2026
a28d806
content: integrate final home page content (#39)
3innielee Oct 22, 2026
0a4b20f
content: integrate final board member information (#41)
3innielee Oct 22, 2026
eef79e0
content: integrate final events content (#43)
3innielee Oct 26, 2026
698e2e9
feat: integrate competitions article content and photo gallery (#45)
3innielee Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Azure Static Web Apps CI/CD

on:
push:
branches:
- staging
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- staging

jobs:
build_and_deploy_job:
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
runs-on: ubuntu-latest
name: Build and Deploy Job

steps:
- name: Checkout repository
uses: actions/checkout@v5
with:
submodules: true
lfs: false

- name: Set up Node.js
uses: actions/setup-node@v5
with:
node-version-file: .nvmrc
cache: npm

- name: Build and Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_COAST_0C7656E10 }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
action: "upload"
app_location: "/"
api_location: ""
output_location: "dist"

close_pull_request_job:
if: github.event_name == 'pull_request' && github.event.action == 'closed'
runs-on: ubuntu-latest
name: Close Pull Request

steps:
- name: Close Pull Request
id: closepullrequest
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_COAST_0C7656E10 }}
action: "close"
Binary file modified public/favicon.ico
Binary file not shown.
12 changes: 3 additions & 9 deletions public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/bmdib-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/diana-ly.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/emily-ho.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/jack-zhao.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/jeff-tang.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/khanh-vuong.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/lingkai-zuo.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/nhu-y-nguyen.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/winnie-lee.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/board/yongwang-lei.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/competitions/photo-1.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/competitions/photo-2.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/competitions/photo-3.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 12 additions & 12 deletions src/components/BoardMemberCard.astro
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@
interface Props {
name: string;
role: string;
image?: string | null;
bio: string;
image?: string;
}

const { name, role, image, bio } = Astro.props;
const { name, role, image } = Astro.props;
---

<article class="board-member-card">
<div class="board-member-image">
{image ? (
<img src={image} alt={`Headshot of ${name}`} loading="lazy" />
) : (
<div class="board-member-image-placeholder" aria-hidden="true">
<span>Headshot</span>
{
image && (
<div class="board-member-image">
<img src={image} alt={`Portrait of ${name}`} />
</div>
)}
</div>
)
}

<div class="board-member-content">
<h2>{name}</h2>
<p class="board-member-role">{role}</p>
<p>{bio}</p>

<div class="board-member-bio">
<slot />
</div>
</div>
</article>
88 changes: 84 additions & 4 deletions src/components/CompetitionCard.astro
Original file line number Diff line number Diff line change
@@ -1,22 +1,102 @@
---
import { formatDate, formatTime } from "../utils/dateTime";

interface Image {
src: string;
alt: string;
}

interface Props {
title: string;
date: string;
description: string;
time: string;
location?: string;
images?: Image[];
}

const { title, date, description, location } = Astro.props;
const { title, date, time, location, images = [] } = Astro.props;

const formattedDate = formatDate(date);
const formattedTime = formatTime(time);

const carouselId = `competition-carousel-${date}-${title}`
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-|-$/g, "");
---

<article class="competition-card">
{
images.length === 1 && (
<img
src={images[0].src}
alt={images[0].alt}
class="competition-card-image"
/>
)
}

{
images.length > 1 && (
<div id={carouselId} class="carousel slide">
<div class="carousel-inner">
{images.map((image, index) => (
<div
class:list={[
"carousel-item",
{ active: index === 0 },
]}
>
<img
src={image.src}
alt={image.alt}
class="d-block w-100 competition-card-image"
/>
</div>
))}
</div>

<button
class="carousel-control-prev"
type="button"
data-bs-target={`#${carouselId}`}
data-bs-slide="prev"
>
<span
class="carousel-control-prev-icon"
aria-hidden="true"
></span>
<span class="visually-hidden">Previous</span>
</button>

<button
class="carousel-control-next"
type="button"
data-bs-target={`#${carouselId}`}
data-bs-slide="next"
>
<span
class="carousel-control-next-icon"
aria-hidden="true"
></span>
<span class="visually-hidden">Next</span>
</button>
</div>
)
}
<div class="competition-card-content">
<p class="competition-card-date">{date}</p>
<p class="competition-card-date">
<time datetime={`${date}T${time}`}>
{formattedDate} · {formattedTime}
</time>
</p>

<h2>{title}</h2>

{location && <p class="competition-card-location">{location}</p>}

<p>{description}</p>
<div class="competition-card-description">
<slot />
</div>
</div>
</article>
88 changes: 84 additions & 4 deletions src/components/EventCard.astro
Original file line number Diff line number Diff line change
@@ -1,22 +1,102 @@
---
import { formatDate, formatTime } from "../utils/dateTime";

interface Image {
src: string;
alt: string;
}

interface Props {
title: string;
date: string;
description: string;
time?: string;
location?: string;
images?: Image[];
}

const { title, date, description, location } = Astro.props;
const { title, date, time, location, images = [] } = Astro.props;

const formattedDate = formatDate(date);
const formattedTime = time ? formatTime(time) : null;

const carouselId = `event-carousel-${date}-${title}`
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-|-$/g, "");
---

<article class="event-card">
{
images.length === 1 && (
<img
src={images[0].src}
alt={images[0].alt}
class="event-card-image"
/>
)
}

{
images.length > 1 && (
<div id={carouselId} class="carousel slide">
<div class="carousel-inner">
{images.map((image, index) => (
<div
class:list={[
"carousel-item",
{ active: index === 0 },
]}
>
<img
src={image.src}
alt={image.alt}
class="d-block w-100 event-card-image"
/>
</div>
))}
</div>

<button
class="carousel-control-prev"
type="button"
data-bs-target={`#${carouselId}`}
data-bs-slide="prev"
>
<span
class="carousel-control-prev-icon"
aria-hidden="true"
></span>
<span class="visually-hidden">Previous</span>
</button>

<button
class="carousel-control-next"
type="button"
data-bs-target={`#${carouselId}`}
data-bs-slide="next"
>
<span
class="carousel-control-next-icon"
aria-hidden="true"
></span>
<span class="visually-hidden">Next</span>
</button>
</div>
)
}
<div class="event-card-content">
<p class="event-card-date">{date}</p>
<p class="event-card-date">
<time datetime={time ? `${date}T${time}` : date}>
{formattedDate}{formattedTime && ` · ${formattedTime}`}
</time>
</p>

<h2>{title}</h2>

{location && <p class="event-card-location">{location}</p>}

<p>{description}</p>
<div class="event-card-description">
<slot />
</div>
</div>
</article>
25 changes: 7 additions & 18 deletions src/components/Footer.astro
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,13 @@
<div class="col-md-6">
<nav aria-label="Footer navigation">
<ul class="footer-nav list-unstyled mb-0">
<li>
<a href="/">Home</a>
</li>
<li>
<a href="/about">About</a>
</li>
<li>
<a href="/programs">Programs</a>
</li>
<li>
<a href="/get-involved">Get Involved</a>
</li>
<li>
<a href="/resources">Resources</a>
</li>
<li>
<a href="/contact">Contact</a>
</li>
<li><a href="/">Home</a></li>
<li><a href="/board">The Board</a></li>
<li><a href="/events">Events</a></li>
<li><a href="/competitions">Competitions</a></li>
<li><a href="/meetings">General Meetings</a></li>
<li><a href="/fundraising">Fundraising</a></li>
<li><a href="/resources">Resources</a></li>
</ul>
</nav>
</div>
Expand Down
Loading
Loading