fix(content): reconcile published team roster and assets
This commit is contained in:
11 files changed
+1051
-183
No files matched your search
@@ -1,76 +1,66 @@
|
||||
---
|
||||
import Button from '../Button.astro';
|
||||
import ContactObfuscation from '../ContactObfuscation.astro';
|
||||
const groups = [
|
||||
{
|
||||
title: 'Board Certified Behavioral Analysts & Psychologists',
|
||||
members: [
|
||||
['team-rula-diab.webp', 'Rula Diab, BCBA, LBA, M.Ed', 'Clinical Director'],
|
||||
['team-jennifer-espinoza.webp', 'Jennifer Espinoza, MAOL/ABA', 'Clinical BCBA'],
|
||||
['team-timirah-clay.webp', 'Timirah Clay, M.Psy/ABA', 'Clinical BCBA']
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Clinical Support',
|
||||
members: [
|
||||
['team-carol-harrington.webp', 'Carol Harrington, A.A. Spec. Ed.', 'Clinical Manager'],
|
||||
['team-rachel-crosby.webp', 'Rachel Crosby', 'Clinical Administrator'],
|
||||
['team-jennifer-bonefont.webp', 'Jennifer Bonefont, B.A. Psy', 'Clinical Client Advocate Supervisor']
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Clinical Case Supervisors',
|
||||
members: [['team-rachael-sanchez.webp', 'Rachael Sanchez, BS, M Psy/ABA', 'Clinical Supervisor']]
|
||||
},
|
||||
{
|
||||
title: 'Clinical Education Specialists',
|
||||
members: [['team-mahima-bedi.webp', 'Mahima Bedi', 'Clinical Instructor']]
|
||||
},
|
||||
{
|
||||
title: 'ABA Clinic Management',
|
||||
tagline: 'Applied Behavior Analysis "(ABA) at your service"',
|
||||
tinted: true,
|
||||
members: [
|
||||
['team-mariah-marley.webp', 'Mariah Marley', 'Claims Billing'],
|
||||
['team-eney-garcia.webp', 'Eney Garcia, BA', 'Accounts Billing'],
|
||||
['team-ayah-shahbander.webp', 'Ayah Shahbander', 'Human Resources'],
|
||||
['team-barbara-samanich.webp', 'Barbara Samanich, BFA', 'Creative Marketing Developer']
|
||||
]
|
||||
}
|
||||
];
|
||||
import type { TeamPageContent } from '../../types/team-page';
|
||||
|
||||
interface Props { content: TeamPageContent }
|
||||
const { content } = Astro.props;
|
||||
const obfuscatedEmail = content.careers.email
|
||||
.replace('@', ' [at] ')
|
||||
.replaceAll('.', ' [dot] ');
|
||||
---
|
||||
<article class="team-page">
|
||||
<section class="team-intro container-narrow">
|
||||
<h2>Our Clinical Team</h2>
|
||||
<p class="eyebrow">Arizona Institute for Autism<br />Scottsdale, Arizona</p>
|
||||
<p>AIA's clinical team consists of experienced professionals and paraprofessionals as well as Board Certified Behavior Analysts (BCBA) and Psychologists who have diverse experience and expertise.</p>
|
||||
</section>
|
||||
{groups.map((group) => (
|
||||
<section class:list={['team-group', { 'section-tint': group.tinted }]}>
|
||||
<div class="container">
|
||||
<h2>{group.title}</h2>
|
||||
{group.tagline && <p class="team-group__tagline"><em>{group.tagline}</em></p>}
|
||||
<div class="team-grid">
|
||||
{group.members.map(([image, name, role]) => (
|
||||
<article class="team-member">
|
||||
<div class="team-thumb">
|
||||
<img src={`/assets/images/${image}`} alt={name} loading="lazy" />
|
||||
</div>
|
||||
<h3>{name}</h3>
|
||||
<p>{role}</p>
|
||||
</article>
|
||||
))}
|
||||
<section class="team-clinical" aria-labelledby="clinical-team-heading">
|
||||
<div class="team-intro container-narrow">
|
||||
<h2 id="clinical-team-heading">{content.intro.heading}</h2>
|
||||
<p class="eyebrow">{content.intro.organization}<br />{content.intro.location}</p>
|
||||
<p>{content.intro.body}</p>
|
||||
</div>
|
||||
{content.clinicalGroups.map((group, groupIndex) => (
|
||||
<section class="team-group" aria-labelledby={`clinical-group-${groupIndex}`}>
|
||||
<div class="container">
|
||||
<h3 id={`clinical-group-${groupIndex}`}>{group.heading}</h3>
|
||||
<div class="team-grid">
|
||||
{group.members.map(({ image, imageAlt, name, role }) => (
|
||||
<article class="team-member">
|
||||
<div class="team-thumb">
|
||||
<img src={`/assets/images/${image}`} alt={imageAlt} width="342" height="456" loading="lazy" />
|
||||
</div>
|
||||
<h4>{name}</h4>
|
||||
<p>{role}</p>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
))}
|
||||
</section>
|
||||
<section class="team-care section-tint" aria-labelledby="care-team-heading">
|
||||
<div class="container">
|
||||
<h2 id="care-team-heading">{content.careTeam.heading}</h2>
|
||||
<h3>{content.careTeam.groupHeading}</h3>
|
||||
<p class="team-group__tagline"><em>{content.careTeam.tagline}</em></p>
|
||||
<div class="team-grid">
|
||||
{content.careTeam.members.map(({ image, imageAlt, name, role }) => (
|
||||
<article class="team-member">
|
||||
<div class="team-thumb">
|
||||
<img src={`/assets/images/${image}`} alt={imageAlt} width="342" height="456" loading="lazy" />
|
||||
</div>
|
||||
<h4>{name}</h4>
|
||||
<p>{role}</p>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
))}
|
||||
<p class="team-closing">{content.careTeam.closingStatement}</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="team-careers">
|
||||
<div class="container-narrow">
|
||||
<p class="eyebrow">Join the AIA Team!</p>
|
||||
<h2>Employment Opportunities</h2>
|
||||
<p>Apply online to join the AIA team! At the Arizona Institute for Autism (AIA) we are on a mission to improve special education and strengthen communities throughout Arizona.</p>
|
||||
<p>Our talented and passionate employees are a critical piece to the high-quality ABA therapy we provide along with our commitment to behavioral health, school solutions, and community outreach. For questions regarding open positions, please contact us at <ContactObfuscation email="hr@azinstitute4autism.com" obfuscatedText="hr [at] abaclinicaz [dot] com" class="team-email" />.</p>
|
||||
<Button href="/careers">View Open Positions</Button>
|
||||
<p class="eyebrow">{content.careers.eyebrow}</p>
|
||||
<h2>{content.careers.heading}</h2>
|
||||
<p>{content.careers.intro}</p>
|
||||
<p>{content.careers.contactText} <ContactObfuscation email={content.careers.email} obfuscatedText={obfuscatedEmail} class="team-email" id="team-careers-email" />.</p>
|
||||
<Button href={content.careers.cta.href}>{content.careers.cta.label}</Button>
|
||||
</div>
|
||||
</section>
|
||||
</article>
|
||||
@@ -78,16 +68,17 @@ const groups = [
|
||||
<style>
|
||||
.team-intro { padding-block: 4rem; text-align: center; }
|
||||
.team-intro .eyebrow { font-size: 1.8rem; }
|
||||
.team-group { padding-block: 2rem 4rem; text-align: center; }
|
||||
.team-group h2 { margin: 0 auto 1rem; max-width: 760px; }
|
||||
.team-group, .team-care { padding-block: 2rem 4rem; text-align: center; }
|
||||
.team-group h3, .team-care h2, .team-care h3 { margin: 0 auto 1rem; max-width: 760px; }
|
||||
.team-group__tagline { font-size: 1.125rem; margin: 0 auto 2rem; }
|
||||
.team-grid { display: flex; flex-wrap: wrap; gap: 2rem 1.5rem; justify-content: center; }
|
||||
.team-member { flex: 0 0 227px; }
|
||||
.team-thumb { border-radius: 4px; overflow: hidden; }
|
||||
.team-thumb img { display: block; object-fit: cover; transform: scale(1.1); transition: transform .5s; width: 100%; }
|
||||
.team-thumb img:hover { transform: scale(1.05); }
|
||||
.team-member h3 { font-family: var(--font-body); font-size: .8rem; margin-bottom: 0; }
|
||||
.team-member h4 { font-family: var(--font-body); font-size: .8rem; margin-bottom: 0; }
|
||||
.team-member p { font-size: .85rem; margin: 0; }
|
||||
.team-closing { font-weight: 700; margin: 3rem auto 0; text-align: center; }
|
||||
.team-careers { padding-block: 5rem; }
|
||||
.team-careers :global(.content-button) { margin-left: 50%; margin-top: 4rem; translate: -50%; }
|
||||
.team-email { font-weight: 700; }
|
||||
|
||||
@@ -2,6 +2,7 @@ import { defineCollection } from 'astro:content';
|
||||
import { glob } from 'astro/loaders';
|
||||
import { z } from 'astro/zod';
|
||||
import { homePageSchema, homeSectionsSchema } from './types/home-sections';
|
||||
import { teamPageSchema } from './types/team-page';
|
||||
|
||||
const language = z.enum(['en', 'ar', 'es']);
|
||||
const translationKey = z.string().min(1).refine((value) => value === value.trim(), {
|
||||
@@ -22,7 +23,8 @@ const shared = {
|
||||
draft: z.boolean().default(false),
|
||||
noindex: z.boolean().default(false),
|
||||
home: homePageSchema.optional(),
|
||||
sections: homeSectionsSchema.optional()
|
||||
sections: homeSectionsSchema.optional(),
|
||||
team: teamPageSchema.optional()
|
||||
};
|
||||
|
||||
const pages = defineCollection({
|
||||
|
||||
@@ -3,120 +3,76 @@ title: "Meet Our Dedicated Autism Support Team | Arizona Institute for Autism"
|
||||
description: "Meet the all-star team of compassionate, experienced professionals transforming personalized autism therapy and education at Arizona Institute for Autism."
|
||||
slug: "team"
|
||||
canonical: "https://www.azinstitute4autism.com/team"
|
||||
featuredImage: "/assets/images/AIALanding_BG_V2.jpg"
|
||||
alt: "learn more about arizona institute for autism"
|
||||
lang: "en"
|
||||
translationKey: "team"
|
||||
draft: false
|
||||
team:
|
||||
intro:
|
||||
heading: Our Clinical Team
|
||||
organization: Arizona Institute for Autism
|
||||
location: Scottsdale, Arizona
|
||||
body: AIA's clinical team consists of experienced professionals and paraprofessionals as well as Board Certified Behavior Analysts (BCBA) and Psychologists who have diverse experience and expertise.
|
||||
clinicalGroups:
|
||||
- heading: Board Certified Behavioral Analysts & Psychologists
|
||||
members:
|
||||
- name: Rula Diab, BCBA, LBA, M.Ed
|
||||
role: Clinical Director
|
||||
image: team-rula-diab.webp
|
||||
imageAlt: Rula Diab
|
||||
- name: Jennifer Espinoza, MAOL/ABA
|
||||
role: Clinical BCBA
|
||||
image: team-jennifer-espinoza.webp
|
||||
imageAlt: Jennifer Espinoza
|
||||
- heading: Clinical Support
|
||||
members:
|
||||
- name: Jennifer Bonefont, B.A. Psy
|
||||
role: Clinical Client Advocate Supervisor
|
||||
image: team-jennifer-bonefont.webp
|
||||
imageAlt: Jennifer Bonefont
|
||||
- heading: Clinical Case Supervisors
|
||||
members:
|
||||
- name: Rachael Sanchez, BS, M Psy/ABA
|
||||
role: Clinical Supervisor
|
||||
image: team-rachael-sanchez.webp
|
||||
imageAlt: Rachael Sanchez
|
||||
- heading: Clinical Education Specialists
|
||||
members:
|
||||
- name: Mahima Bedi
|
||||
role: Clinical Instructor
|
||||
image: team-mahima-bedi.webp
|
||||
imageAlt: Mahima Bedi
|
||||
careTeam:
|
||||
heading: Our ABA Care Team
|
||||
groupHeading: ABA Clinic Management
|
||||
tagline: Applied Behavior Analysis "(ABA) at your service"
|
||||
members:
|
||||
- name: Mariah Marley
|
||||
role: Claims Billing
|
||||
image: team-mariah-marley.webp
|
||||
imageAlt: Mariah Marley
|
||||
- name: Eney Garcia, BA
|
||||
role: Accounts Billing
|
||||
image: team-eney-garcia.webp
|
||||
imageAlt: Eney Garcia
|
||||
- name: Ayah Shahbander
|
||||
role: Human Resources
|
||||
image: team-ayah-shahbander.webp
|
||||
imageAlt: Ayah Shahbander
|
||||
- name: Barbara Samanich, BFA
|
||||
role: Creative Marketing Developer
|
||||
image: team-barbara-samanich.webp
|
||||
imageAlt: Barbara Samanich
|
||||
closingStatement: ABA's leading experts in special education and clinical care.
|
||||
careers:
|
||||
eyebrow: Join the AIA Team!
|
||||
heading: Employment Opportunities
|
||||
intro: Apply online to join the AIA team! At the Arizona Institute for Autism (AIA) we are on a mission to improve special education and strengthen communities throughout Arizona.
|
||||
contactText: Our talented and passionate employees are a critical piece to the high-quality ABA therapy we provide along with our commitment to behavioral health, school solutions, and community outreach. For questions regarding open positions, please contact us at
|
||||
email: hr@azinstitute4autism.com
|
||||
cta:
|
||||
label: View Open Positions
|
||||
href: /careers
|
||||
---
|
||||
## Our Clinical Team
|
||||
|
||||
### Arizona Institute for Autism Scottsdale, Arizona
|
||||
|
||||
AIA's clinical team consists of experienced professionals and paraprofessionals as well as Board Certified Behavior Analysts (BCBA) and Psychologists who have diverse experience and expertise.
|
||||
|
||||
### Board Certified Behavioral Analysts & Psychologists
|
||||
|
||||
##
|
||||
|
||||

|
||||
|
||||
### Rula Diab, BCBA, LBA, M.Ed
|
||||
|
||||
Clinical Director
|
||||
|
||||

|
||||
|
||||
### Jennifer Espinoza, MAOL/ABA
|
||||
|
||||
Clinical BCBA
|
||||
|
||||

|
||||
|
||||
### Timirah Clay, M.Psy/ABA
|
||||
|
||||
Clinical BCBA
|
||||
|
||||
### Clinical Support
|
||||
|
||||
## Our Creative Team
|
||||
|
||||

|
||||
|
||||
### Carol Harrington, A.A. Spec. Ed.
|
||||
|
||||
Clinical Manger
|
||||
|
||||

|
||||
|
||||
### Rachel Crosby
|
||||
|
||||
Clinical Administrator
|
||||
|
||||

|
||||
|
||||
### Jennifer Bonefont, B.A. Psy
|
||||
|
||||
Clinical Client Advocate Supervisor
|
||||
|
||||
### Clinical Case Supervisors
|
||||
|
||||
## Our Creative Team
|
||||
|
||||

|
||||
|
||||
### Rachael Sanchez, BS, M Psy/ABA
|
||||
|
||||
Clinical Supervisor
|
||||
|
||||
### Clinical Education Specialists
|
||||
|
||||
## Our Creative Team
|
||||
|
||||

|
||||
|
||||
### Mahima Bedi
|
||||
|
||||
Clinical Instructor
|
||||
|
||||
## Our ABA Care Team
|
||||
|
||||
### ABA Clinic Management
|
||||
|
||||
Applied Behavior Analysis "(ABA) at your service"
|
||||
|
||||
## Our Creative Team
|
||||
|
||||

|
||||
|
||||
### Mariah Marley
|
||||
|
||||
Claims Billing
|
||||
|
||||

|
||||
|
||||
### Eney Garcia, BA
|
||||
|
||||
Accounts Billing
|
||||
|
||||

|
||||
|
||||
### Ayah Shahbander
|
||||
|
||||
Human Resources
|
||||
|
||||

|
||||
|
||||
### Barbara Samanich, BFA
|
||||
|
||||
Creative Marketing Developer
|
||||
|
||||
ABA's leading experts in special education and clinical care.
|
||||
|
||||
Join the AIA Team!
|
||||
|
||||
## Employment Opportunities
|
||||
|
||||
Apply online to join the AIA team! At the Arizona Institute for Autism (AIA) we are on a mission to improve special education and strengthen communities throughout Arizona.
|
||||
|
||||
Our talented and passionate employees are a critical piece to the high-quality ABA therapy we provide along with our commitment to behavioral health, school solutions, and community outreach. For questions regarding open positions, please contact us at hr [at] abaclinicaz [dot] com .
|
||||
|
||||
View Open Positions
|
||||
<!-- Team content is maintained in the validated `team:` frontmatter above and rendered by TeamPage.astro. -->
|
||||
@@ -54,12 +54,15 @@ const pageTitles: Record<string, Record<string, string>> = {
|
||||
const bannerTitle = serviceTitles[entry.data.lang]?.[entry.data.slug] || pageTitles[entry.data.lang]?.[entry.data.slug] || entry.data.title.split('|')[0].trim();
|
||||
const isService = Boolean(serviceTitles[entry.data.lang]?.[entry.data.slug]);
|
||||
const heroImage = pageHeroImages[entry.data.slug];
|
||||
if (entry.data.slug === 'team' && entry.data.lang === 'en' && !entry.data.team) {
|
||||
throw new Error('The English Team page requires structured team frontmatter.');
|
||||
}
|
||||
---
|
||||
<BaseLayout title={entry.data.title} description={entry.data.description} image={entry.data.featuredImage || heroImage} lang={entry.data.lang}>
|
||||
{entry.data.slug === 'contact' && <Fragment slot="head"><link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" /></Fragment>}
|
||||
<PageHero title={entry.data.displayH1 ?? bannerTitle} subtitle={entry.data.slug === 'faqs' ? 'FAQs' : undefined} image={heroImage} constrain />
|
||||
{entry.data.slug === 'team' && entry.data.lang === 'en'
|
||||
? <TeamPage />
|
||||
? <TeamPage content={entry.data.team!} />
|
||||
: entry.data.slug === 'about' && entry.data.lang === 'en'
|
||||
? <AboutPage />
|
||||
: entry.data.slug === 'services' && entry.data.lang === 'en'
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
import { z } from 'astro/zod';
|
||||
|
||||
const requiredText = z.string().refine((value) => value.trim().length > 0, {
|
||||
message: 'Team content must not be empty or whitespace-only'
|
||||
});
|
||||
|
||||
const teamMemberSchema = z.object({
|
||||
name: requiredText,
|
||||
role: requiredText,
|
||||
image: requiredText,
|
||||
imageAlt: requiredText
|
||||
});
|
||||
|
||||
const teamGroupSchema = z.object({
|
||||
heading: requiredText,
|
||||
members: z.array(teamMemberSchema).min(1)
|
||||
});
|
||||
|
||||
export const teamPageSchema = z.object({
|
||||
intro: z.object({
|
||||
heading: requiredText,
|
||||
organization: requiredText,
|
||||
location: requiredText,
|
||||
body: requiredText
|
||||
}),
|
||||
clinicalGroups: z.array(teamGroupSchema).min(1),
|
||||
careTeam: z.object({
|
||||
heading: requiredText,
|
||||
groupHeading: requiredText,
|
||||
tagline: requiredText,
|
||||
members: z.array(teamMemberSchema).min(1),
|
||||
closingStatement: requiredText
|
||||
}),
|
||||
careers: z.object({
|
||||
eyebrow: requiredText,
|
||||
heading: requiredText,
|
||||
intro: requiredText,
|
||||
contactText: requiredText,
|
||||
email: z.email(),
|
||||
cta: z.object({
|
||||
label: requiredText,
|
||||
href: z.string().regex(/^\/(?!\/)/, 'Team CTA must use a root-relative local path')
|
||||
})
|
||||
})
|
||||
}).superRefine((content, context) => {
|
||||
const members = [
|
||||
...content.clinicalGroups.flatMap((group) => group.members),
|
||||
...content.careTeam.members
|
||||
];
|
||||
const seen = new Set<string>();
|
||||
for (const member of members) {
|
||||
const key = member.name.trim().toLocaleLowerCase('en-US');
|
||||
if (seen.has(key)) {
|
||||
context.addIssue({ code: 'custom', message: `Duplicate Team member: ${member.name}` });
|
||||
}
|
||||
seen.add(key);
|
||||
}
|
||||
});
|
||||
|
||||
export type TeamPageContent = z.infer<typeof teamPageSchema>;
|
||||
Reference in new issue
Block a user