Compare commits

...
3 Commits
Author SHA1 Message Date
DeCentN2Madness aebd53639a feat(brand): add and switch to cog favicon 2026-07-01 13:54:03 -07:00
DeCentN2Madness bf3d39a643 chore(docs): remove local mirror references, use live site only
Deleted the www.azinstitute4autism.com mirror directory and scrubbed all
references to it from AGENTS.md, MIGRATION_BRIEF.md, www/README.md, and
www/original/README.md. The live public site is now the sole source of
truth with no local mirror fallback.
2026-06-30 20:52:03 -07:00
DeCentN2Madness 664d749439 feat(component): add email obfuscation component 2026-06-30 20:21:33 -07:00
10 changed files with 98 additions and 152 deletions
+8 -32
View File
@@ -13,42 +13,20 @@ content only after verifying it against the live public site.
## Project
This repository contains a mirrored copy of the Arizona Institute for Autism website.
Raw mirror source:
```txt
./www.azinstitute4autism.com
```
New Astro site target:
```txt
./www
```
The mirror was created with:
```sh
wget --mirror --page-requisites --adjust-extension --convert-links --no-parent https://www.azinstitute4autism.com
```
Do not modify, move, rename, or delete `./www.azinstitute4autism.com`.
Treat the mirror as read-only raw source material.
The live public website is the single source of truth:
```txt
https://www.azinstitute4autism.com
```
Use the mirror as a convenient local extraction and inspection aid only. The
mirror may contain stale, missing, rewritten, or incorrectly downloaded
content and assets. Verify content, design, URLs, metadata, assets, and
responsive behavior against the live public site before treating them as
authoritative. When the live site and mirror disagree, follow the live site and
document material discrepancies.
Verify content, design, URLs, metadata, assets, and responsive behavior against
the live public site before treating them as authoritative.
## Primary goal
@@ -221,10 +199,9 @@ Favor:
Before implementing a page family or shared component:
1. Inspect the live page and its HTML, CSS, assets, and responsive behavior.
2. Use the mirror to accelerate local extraction and inspection.
3. Resolve any discrepancy in favor of the live public site.
4. Record the source structure and important visual details.
5. Identify which patterns are truly shared and which are page-specific.
2. Resolve any discrepancy in favor of the live public site.
3. Record the source structure and important visual details.
4. Identify which patterns are truly shared and which are page-specific.
After implementation, compare the Astro output with the live public site at
representative desktop and mobile viewport widths. Check the full page, not
@@ -365,10 +342,9 @@ reports/migration-summary.md
Before large filesystem changes:
1. Inspect the live public site.
2. Inspect the mirror and identify relevant discrepancies.
3. Inspect the relevant source HTML, CSS, and assets in detail.
4. Summarize the implementation and visual-validation plan.
5. Proceed methodically.
2. Inspect the relevant source HTML, CSS, and assets in detail.
3. Summarize the implementation and visual-validation plan.
4. Proceed methodically.
At the end of a task, summarize:
+19 -54
View File
@@ -7,21 +7,15 @@ brief provides detailed implementation guidance. If any wording here appears
to conflict with `AGENTS.md`, follow `AGENTS.md` and correct this brief before
continuing.
This is a fidelity-first migration, not a redesign. The raw mirror is a
convenient local extraction and inspection aid, but the live public site is the
This is a fidelity-first migration, not a redesign. The live public site is the
single content and visual source of truth. The `migration-foundation` branch
may be consulted for nonvisual tooling and recovered content, but it must not
be used as the visual baseline.
## Task
Migrate the public Arizona Institute for Autism website from a mirrored HubSpot-generated static copy into a clean, maintainable Astro + TypeScript site.
Raw mirrored source:
```txt
./www.azinstitute4autism.com
```
Migrate the public Arizona Institute for Autism website into a clean,
maintainable Astro + TypeScript site.
New Astro project target:
@@ -29,12 +23,6 @@ New Astro project target:
./www
```
The raw mirror was created with:
```sh
wget --mirror --page-requisites --adjust-extension --convert-links --no-parent https://www.azinstitute4autism.com
```
There is no HubSpot export, no HubSpot CLI access, and no HubSpot API access.
Use the live public website as the single source of truth:
@@ -43,15 +31,9 @@ Use the live public website as the single source of truth:
https://www.azinstitute4autism.com
```
Use the local mirror as a convenient extraction and inspection aid. It may
contain stale, missing, rewritten, or incorrectly downloaded content and
assets. Verify content, design, URLs, metadata, assets, and responsive behavior
against the live site. When the live site and mirror disagree, follow the live
site and document material discrepancies.
If the live site is temporarily unavailable, work that depends on its authority
must remain explicitly unverified rather than silently treating the mirror as
authoritative.
Verify content, design, URLs, metadata, assets, and responsive behavior against
the live site. If the live site is temporarily unavailable, work that depends
on its authority must remain explicitly unverified.
## High-level goal
@@ -76,10 +58,6 @@ Create a new Astro site in `./www` that is:
Do not modify or delete:
```txt
./www.azinstitute4autism.com
```
Do not depend on:
- HubSpot CLI
@@ -283,13 +261,12 @@ Do not use Tailwind.
For each page family or shared component:
1. Inspect the live page, HTML, CSS, assets, and responsive behavior.
2. Use the mirror to accelerate local extraction and inspection.
3. Resolve discrepancies in favor of the live public site.
4. Record important visual details and identify genuine shared patterns.
5. Implement the page or component in maintainable Astro code.
6. Compare the complete rendered page with the live public site at representative
2. Resolve discrepancies in favor of the live public site.
3. Record important visual details and identify genuine shared patterns.
4. Implement the page or component in maintainable Astro code.
5. Compare the complete rendered page with the live public site at representative
desktop and mobile viewport widths.
7. Fix material visual differences before marking it complete.
6. Fix material visual differences before marking it complete.
Document intentional visual deviations and their reasons in
`reports/migration-summary.md`.
@@ -412,9 +389,6 @@ www/
generate-redirects.mjs
generate-sitemap.mjs
original/
README.md
reports/
url-inventory.csv
asset-inventory.csv
@@ -427,17 +401,10 @@ www/
migration-summary.md
```
The `original/README.md` file should explain that the raw source mirror lives outside the Astro project at:
```txt
../www.azinstitute4autism.com
```
Do not duplicate the entire raw mirror inside `./www` unless there is a specific reason.
## Initial inspection
Before creating or modifying files, inspect the mirror.
Before creating or modifying files, inspect the live public site and current
project sources.
Look for:
@@ -687,9 +654,8 @@ src/styles/rtl.css
src/styles/global.css
```
Extract the current site's visual language from the live public site, using the
mirrored CSS and HTML as a convenient local aid after checking for discrepancies.
Tokens must encode source values; they must not introduce a replacement visual
Extract the current site's visual language from the live public site. Tokens
must encode source values; they must not introduce a replacement visual
system.
Use design tokens such as:
@@ -837,7 +803,7 @@ It should support:
- hreflang links where translation relationships are known
- JSON-LD/schema when extracted
Preserve metadata from the mirror wherever possible.
Preserve metadata from the live site wherever possible.
Generate:
@@ -906,7 +872,7 @@ tools/generate-sitemap.mjs
This script should:
- scan the mirror
- scan the available source and generated output
- identify HTML files
- infer URL paths
- identify page type
@@ -929,7 +895,7 @@ This script should:
- attempt to crawl the live site if internet is available
- discover URLs from sitemap and internal links
- compare discovered URLs against the mirror
- compare discovered URLs against the current site source and generated output
- document missing URLs/assets
- avoid aggressive crawling
- respect the scope of `www.azinstitute4autism.com`
@@ -1165,7 +1131,6 @@ www/README.md
It should explain:
- what the project is
- where the raw mirror lives
- how the migration was performed
- how to install dependencies
- how to run local dev
@@ -1241,7 +1206,7 @@ Proceed methodically:
2. Read `CLAUDE.md`, if using Claude Code.
3. Read this `MIGRATION_BRIEF.md`.
4. Inspect the live public site.
5. Inspect `./www.azinstitute4autism.com` and identify relevant discrepancies.
5. Inspect the relevant live public site pages and identify discrepancies.
6. Summarize a concise implementation plan.
7. Scaffold Astro in `./www`.
8. Build extraction/reporting scripts.
+1 -50
View File
@@ -1,8 +1,7 @@
# Arizona Institute for Autism Astro Site
Static Astro + TypeScript migration of the public Arizona Institute for Autism
website. The read-only source mirror is located at
`../www.azinstitute4autism.com`.
website.
## Quick Start
@@ -23,9 +22,6 @@ http://localhost:4321
The development server watches source files and refreshes the browser after
edits. Stop it with `Ctrl+C`.
Do **not** run `npm run extract` during normal editing. Extraction regenerates
migrated Markdown from the raw mirror and can overwrite editorial changes.
## Environment Setup
Requirements:
@@ -322,51 +318,6 @@ Edit the component's `label`, `heading`, and `items` data in the post. Keep
answer. Shared FAQ markup, styling, interaction, and schema generation live in
`src/components/FAQAccordion.astro`.
## Mirror Extraction Workflow
The mirror is read-only source material. Never modify:
```txt
../www.azinstitute4autism.com
```
Only rerun extraction when intentionally refreshing migrated content from the
mirror. Commit or back up editorial changes first.
Dependency-free extraction:
```sh
npm run extract
```
Full Cheerio/Turndown extraction:
```sh
npm run extract:full
```
After extraction:
```sh
npm run extract:blog-footers
npm run generate:sitemap
npm run generate:redirects
npm run build
npm run audit:links
npm run audit:images
npm run audit:blog
```
Extraction regenerates content files, copied assets, and inventories. Review
the complete Git diff before accepting it. Extraction may recreate FAQ-bearing
posts and CTA-bearing pages as Markdown; restore their `FAQAccordion` and
`Button` MDX blocks before accepting the result. `npm run audit:blog` reports
plain Markdown FAQ sections.
`npm run extract:blog-footers` preserves the extracted previous/next and
similar-post relationships in `src/data/blog-footers.json`, then removes those
footer fragments from article prose so `BlogPostFooter.astro` can render them.
## Reports And Utilities
Migration reports are stored in `reports/`.
-10
View File
@@ -1,10 +0,0 @@
# Raw Source Mirror
The read-only wget mirror used for this migration lives outside this Astro
project at:
```txt
../www.azinstitute4autism.com
```
Run `npm run extract` to regenerate content and inventories from that source.
+28
View File
@@ -0,0 +1,28 @@
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 100 100"
width="420" height="420">
<defs>
<g id="tooth" transform="translate(50,50)" fill="#ff914d">
<path d="m0 50 h1 q8 0 8 -6 q0 -8 8 -10 h-20"/>
<path d="m0 50 h1 q8 0 8 -6 q0 -8 8 -10 h-20" transform="scale(-1,1)"/>
</g>
</defs>
<g id="gear">
<circle cx="50" cy="50" r="32" stroke="#ff914d" stroke-width="10" fill="none"/>
<g id="teeth">
<use xlink:href="#tooth" transform="rotate( -10 50 50 )"/>
<use xlink:href="#tooth" transform="rotate( 35 50 50 )"/>
<use xlink:href="#tooth" transform="rotate( 80 50 50 )"/>
<use xlink:href="#tooth" transform="rotate( 125 50 50 )"/>
<use xlink:href="#tooth" transform="rotate( 170 50 50 )"/>
<use xlink:href="#tooth" transform="rotate( 215 50 50 )"/>
<use xlink:href="#tooth" transform="rotate( 260 50 50 )"/>
<use xlink:href="#tooth" transform="rotate( 305 50 50 )"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+32
View File
@@ -0,0 +1,32 @@
---
interface Props {
email: string;
obfuscatedText?: string;
class?: string;
id?: string;
}
const {
email,
obfuscatedText = email,
class: className,
id
} = Astro.props;
const spanId = id ?? `email-obfuscation-${Math.random().toString(36).slice(2, 10)}`;
---
<span id={spanId} class={className}>{obfuscatedText}</span><script type="text/javascript" define:vars={{ email, spanId }}>
(() => {
const emailSpan = document.getElementById(spanId);
if (!emailSpan) return;
const link = document.createElement('a');
link.href = `mailto:${email}`;
link.textContent = email;
emailSpan.textContent = '';
emailSpan.appendChild(link);
})();
</script>
+3 -1
View File
@@ -1,5 +1,6 @@
---
import Button from '../Button.astro';
import EmailObfuscation from '../EmailObfuscation.astro';
const groups = [
{
title: 'Board Certified Behavioral Analysts & Psychologists',
@@ -68,7 +69,7 @@ const groups = [
<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 <a href="mailto:hr@azinstitute4autism.com">hr@azinstitute4autism.com</a>.</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 <EmailObfuscation email="hr@azinstitute4autism.com" obfuscatedText="hr [at] abaclinicaz [dot] com" class="team-email" />.</p>
<Button href="/careers">View Open Positions</Button>
</div>
</section>
@@ -89,6 +90,7 @@ const groups = [
.team-member p { font-size: .85rem; margin: 0; }
.team-careers { padding-block: 5rem; }
.team-careers :global(.content-button) { margin-left: 50%; margin-top: 4rem; translate: -50%; }
.team-email { font-weight: 700; }
@media (max-width: 950px) {
.team-member { flex-basis: min(100%, 227px); }
}
@@ -9,6 +9,7 @@ draft: false
---
import Button from '../../../components/Button.astro';
import EmailObfuscation from '../../../components/EmailObfuscation.astro';
## Learner Social Club
@@ -39,7 +40,7 @@ To ensure the best experience for your learner, please keep the following in min
![stem-sped-social-learners](/assets/images/stem-sped-social-learners.webp)
The Learner Social Club currently serves youth learners aged 817 years . Our flexible scheduling options currently include:
The Learner Social Club currently serves youth learners aged 817 years. Our flexible scheduling options currently include:
- 2 days/week (Monday, Wednesday): 4:00 PM 6:00 PM
- 1 day/week (Wednesday only): 4:00 PM 6:00 PM
@@ -50,6 +51,6 @@ The Learner Social Club currently serves youth learners aged 817 years . Our
Interested in Trying Out Our Program?
Get a 1-Day Trial Pass by emailing us at info [at] azinstitute4autism [dot] com .
Get a 1-Day Trial Pass by emailing us at <EmailObfuscation email="info@azinstitute4autism.com" obfuscatedText="info [at] azinstitute4autism [dot] com" />.
<Button href="https://form.jotform.com/231638510219149" target="_blank" center>Enroll Now</Button>
@@ -9,6 +9,7 @@ draft: false
---
import Button from '../../../components/Button.astro';
import EmailObfuscation from '../../../components/EmailObfuscation.astro';
## Learner Social Club
@@ -46,7 +47,7 @@ Para garantizar la mejor experiencia para su hijo/a, tenga en cuenta lo siguient
![estudiantes participando en actividades sociales y STEM](/assets/images/stem-sped-social-learners.webp)
Learner Social Club actualmente atiende a jóvenes de 8 a 17 años . Nuestras opciones de horario flexible actualmente incluyen:
Learner Social Club actualmente atiende a jóvenes de 8 a 17 años. Nuestras opciones de horario flexible actualmente incluyen:
- 2 días/semana (lunes y miércoles): 4:00 p. m. 6:00 p. m.
@@ -58,6 +59,6 @@ Learner Social Club actualmente atiende a jóvenes de 8 a 17 años . Nuestras op
¿Le interesa probar nuestro programa?
Obtenga un pase de prueba de 1 día enviándonos un correo electrónico a info [at] azinstitute4autism [dot] com .
Obtenga un pase de prueba de 1 día enviándonos un correo electrónico a <EmailObfuscation email="info@azinstitute4autism.com" obfuscatedText="info [at] azinstitute4autism [dot] com" />.
<Button href="https://form.jotform.com/231638510219149" target="_blank">Enroll Now</Button>
+1 -1
View File
@@ -30,7 +30,7 @@ const organizationSchema = {
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" href="/assets/images/aia-logo.svg" />
<link rel="icon" href="/assets/images/favicon.svg" />
<Seo title={title} description={description} canonical={canonical} image={image} lang={lang} type={type} />
<script type="application/ld+json" set:html={JSON.stringify(organizationSchema)} />
</head>