36 Commits

Author SHA1 Message Date
DeCentN2Madness 7ef8b3a585 docs(migration): document homepage content model and refresh reports
- document the homepage frontmatter workflow in README.md
- note the new section-oriented homepage structure in migration-summary.md
- update cleanup and link reports to match the current implementation
- keep the repo docs aligned with the content-driven homepage model
2026-06-11 13:17:32 -07:00
DeCentN2Madness 1be3ad0410 refactor(homepage): drive homepage from structured frontmatter
- replace the flat homepage sections array with a named home: block
- validate homepage sections with typed Zod schemas
- make HomePage.astro render the structured content file data
- keep English and Spanish homepage copy easier to scan and edit
2026-06-11 13:16:36 -07:00
DeCentN2Madness 36f82a9a76 feat(layout): add reusable page hero and services page shells
- replace bespoke page and library banners with PageHero.astro
- add ServicesPage.astro for the live-style English services landing page
- restyle shared hero/container measurements for the new layout shell
- add self-hosted services card images
2026-06-11 13:15:05 -07:00
DeCentN2Madness 0db10a04d8 fix(home): equalize process cards after fonts load
- deferred height-equalization script in `HomeProcess.astro` to `document.fonts.ready`
- card heights now measured with correct web fonts in all environments, not just Vite dev server
2026-06-10 01:54:40 -07:00
DeCentN2Madness 3003a68e39 feat(dev): add ai coding tools python3 and fd 2026-06-10 01:27:23 -07:00
DeCentN2Madness 266137ff5f feat(nav): center top header nav menu 2026-06-10 00:18:51 -07:00
DeCentN2Madness cd5a3c6868 fix(services): remove erroneous breadcrumbs 2026-06-10 00:05:41 -07:00
DeCentN2Madness 785c2ccaf7 feat(about): replace prose article with sectioned AboutPage component
- break the /about page out of the generic prose layout into a dedicated AboutPage.astro component
- three separate <section> elements matching the live site's alternating white/cream backgrounds
— Our Story (white), Our Mission (var(--color-tint)), Our Commitment (white)
— format the commitment list with bolded value names and accent left-border styling
2026-06-09 21:14:02 -07:00
DeCentN2Madness 6c4ac504da feat(footer): restyle site footer contact and social sections
- replace plain contact text with icon-backed contact rows
- swap social glyphs for SVG social icons with external links
- tighten footer spacing and hover states to match the live design
2026-06-09 18:23:01 -07:00
DeCentN2Madness 26db9e76e1 fix(style): add transition to .button hover state
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 17:20:03 -07:00
DeCentN2Madness 796bc223af feat(header): replace flat language links with globe-icon dropdown
Rewrites LanguageSwitcher to match the live site: a trigger showing the
active language code and a Bootstrap Icons globe SVG reveals a hover/
focus-within dropdown with full language names (English, Español, عربي).
Fixes hover gap by moving visual spacing into menu padding-top so the
hover zone is continuous from trigger to menu items.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 17:10:20 -07:00
DeCentN2Madness 626f1b7f37 refactor(styles): move component-specific CSS into Astro component style blocks
Relocates HomeHero, HomeServicesIntro, HomeBenefits, HomeSkills,
HomeInsurance, HomeEsa, and HomeDirector styles from the global
components.css into each component's own <style> block. Removes the
now-empty 480px media query and trims the 760px media query to only
global rules. Build verified at 97 pages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 16:56:41 -07:00
DeCentN2Madness 1eeb5a6820 feat(testimonials): replace static quote with 11-item Swiper carousel
Installs swiper, rewrites HomeTestimonials with loop, 6400ms autoplay,
clickable pagination bullets, and prev/next navigation. Extracts all 11
testimonials from the live site into both EN and ES content files. Styles
bullets and arrows with accent colour tokens to match the live site.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 16:32:00 -07:00
DeCentN2Madness 5f4fbd5e05 fix(director): align layout and typography with live site
Narrows the photo column to match the live site's ~1:3.6 split,
stacks photo above name as an h3, italicises the quote, and styles
the name line with body font at caption scale.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 15:14:22 -07:00
DeCentN2Madness 1bc0224f76 feat(process): equal-height cards with hover scale effect
Equalizes all six process cards to the tallest card's height via a
resize-aware script. Adds scale(1.05) hover transition matching the
live site. Adjusts card padding and icon sizing; shortens two step
labels for better card balance.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 14:47:36 -07:00
DeCentN2Madness ce5e53c71f feat(video): add YouTube lightbox to benefits section
Replaces static video link with a self-contained VideoCard component
that opens a native <dialog> lightbox with autoplay on open and
iframe src teardown on close. Includes pulsing ring animation on the
play button and a rounded-triangle SVG icon.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 14:16:00 -07:00
DeCentN2Madness 615412c880 fix(home): match live site skills grid layout and icon sizing
Changes skills grid from 6 columns to 3 (desktop), 2 (≤760px), and 1
(≤480px). Scales skill icons with vw units so they fill each column
proportionally across breakpoints. Adjusts logo-row spacing to match
live site.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 12:53:44 -07:00
DeCentN2Madness c2b49e66d9 refactor(home): move page content into per-language YAML sections
All visible text, lists, image refs, and CTAs for the home page now live
in en/index.md and es/index.md as a typed `sections:` frontmatter array.
HomePage.astro is reduced to a thin router; each section type is rendered
by a dedicated component in src/components/home/. Adds .no-balance utility
class to suppress text-wrap: balance on the commitments heading.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 12:06:23 -07:00
DeCentN2Madness ef13d4a6e6 fix(style): normalize lists to live site style 2026-06-09 00:43:18 -07:00
DeCentN2Madness 1ec59b0c07 fix: align article byline elements 2026-06-09 00:15:54 -07:00
DeCentN2Madness e1023b5d50 fix(blog): restore source-faithful article emphasis
- synchronize bold and italic formatting across multilingual blog articles
- restore emphasized headings, list labels, links, quotes, and table content
- fix malformed nested emphasis around Markdown links
- match rendered emphasis counts across all 63 indexed live articles
2026-06-09 00:03:41 -07:00
DeCentN2Madness 4bbd58b361 fix(layout): reverse library blog listing and aside order to match live site 2026-06-08 23:34:06 -07:00
DeCentN2Madness 5a66284bb5 fix(design): remove circular frames from images 2026-06-08 23:31:49 -07:00
DeCentN2Madness 0b276e7b32 feat(blog): recreate article footer navigation and related posts
- add reusable live-site-faithful blog footer component
- extract previous, next, and related post data from article content
- remove duplicated footer fragments from multilingual articles
- document the repeatable footer extraction workflow
2026-06-08 20:08:21 -07:00
DeCentN2Madness e51f2133ef fix(content): distinguish prose links from CTA buttons
- add reusable Link and Button MDX components
- convert source-verified page CTAs to explicit buttons
- match live-site prose link styling and CTA destinations
- document link, button, and extraction authoring rules
2026-06-08 19:50:07 -07:00
DeCentN2Madness 4b23bff789 fix(blog): restore live-site tables in migrated articles
- restore semantic table markup across English, Spanish, and Arabic posts
- match live-site table styling and caption formatting
- preserve tables and normalize contained links and assets during extraction
2026-06-08 19:25:00 -07:00
DeCentN2Madness e44b95db2e fix(blog): change blog headings color 2026-06-08 16:41:36 -07:00
DeCentN2Madness bb4cee97a8 fix(blog): restore live blockquote styling and quote-mark SVG
- restores the migrated blog blockquotes to the live site’s visual treatment
- adds the self-hosted quote-mark SVG and matches its live positioning
- updates the extractor, audit scripts, and migration reports to reflect the blockquote work
2026-06-08 16:23:35 -07:00
DeCentN2Madness 826d5e8c7d feat: migrate blog FAQs to reusable MDX accordion
- add Astro MDX support and convert FAQ-bearing posts to MDX
- centralize FAQ markup, scoped styling, behavior, and JSON-LD
- preserve FAQ content and links across English and Spanish posts
- extend blog audits and document the MDX editing workflow
- remove obsolete global FAQ styles
- ignore Front Matter CMS generated state
2026-06-08 15:46:20 -07:00
DeCentN2Madness 9678fc9a3c chore: add .frontmatter to .gitignore 2026-06-08 15:43:18 -07:00
DeCentN2Madness e4e6f15e9a fix: remove duplicated headers from blog post bodies
- remove extracted title, byline, date, avatar, and featured image preambles
- prevent both extraction scripts from recreating duplicated headers
- add blog content duplication auditing
- update migration documentation
2026-06-08 13:26:00 -07:00
DeCentN2Madness bfed3bee15 fix: restore missing live-site page imagery
- recover and self-host HubSpot-injected page hero assets
- map source heroes to page and library layouts
- restore the consultation form background
- add page imagery auditing
- update asset inventory and migration documentation
2026-06-08 13:17:27 -07:00
DeCentN2Madness 96edc6e538 fix: point front matter cms at content directories 2026-06-08 11:24:47 -07:00
DeCentN2Madness 33e78ff8a5 feat: convert site to astro via codex 2026-06-08 11:17:39 -07:00
DeCentN2Madness f3d3562cec chore: enable autonomous MCP tool execution 2026-06-07 10:45:10 -07:00
DeCentN2Madness d8a0016dba docs: require fidelity-first Astro migration 2026-06-07 10:16:35 -07:00
405 changed files with 23355 additions and 47 deletions
+6
View File
@@ -38,6 +38,7 @@ temp/
# Editor and IDE state # Editor and IDE state
.idea/ .idea/
.vscode/ .vscode/
.frontmatter/
*.code-workspace *.code-workspace
# Local AI-agent state # Local AI-agent state
@@ -47,6 +48,11 @@ temp/
.cursor/ .cursor/
.continue/ .continue/
.windsurf/ .windsurf/
/.playwright-mcp/
# Local visual-comparison captures
/live-*.png
/live-*-snapshot.md
# Operating-system metadata # Operating-system metadata
.DS_Store .DS_Store
+83 -8
View File
@@ -1,5 +1,16 @@
# AGENTS.md # AGENTS.md
## Instruction precedence
This file is the authoritative project policy for all editors and AI agents.
`MIGRATION_BRIEF.md` supplies detailed implementation guidance and must be read
with this file. If the two files appear to conflict, follow `AGENTS.md` and
update the conflicting documentation before continuing.
The `migration-foundation` branch is a reference and recovery point only. It is
not the visual or architectural source of truth. Reuse its nonvisual tooling or
content only after verifying it against the live public site.
## Project ## Project
This repository contains a mirrored copy of the Arizona Institute for Autism website. This repository contains a mirrored copy of the Arizona Institute for Autism website.
@@ -26,9 +37,29 @@ Do not modify, move, rename, or delete `./www.azinstitute4autism.com`.
Treat the mirror as read-only raw source material. 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.
## Primary goal ## Primary goal
Create a clean, maintainable Astro + TypeScript site in `./www` that reproduces the current public site as faithfully as practical while replacing HubSpot-generated structure with a future-friendly static site architecture. Create a clean, maintainable Astro + TypeScript site in `./www` that faithfully
reproduces the current public site's content, visual design, page structure, and
responsive behavior while replacing HubSpot-generated implementation details
with a future-friendly static site architecture.
This is a fidelity-first migration, not a redesign. The live public site is the
source of truth for both content and presentation. Maintainability must improve
the implementation without materially changing what visitors see.
The new site should be suitable for: The new site should be suitable for:
@@ -149,13 +180,31 @@ Do not invent large Arabic or Spanish translations unless source content is avai
## Design rules ## Design rules
The new design should be mostly faithful to the current site while becoming more maintainable. The new site must remain visually faithful to the live public site. Do not
reinterpret, modernize, simplify, or genericize the design unless a specific
change is required for accessibility or reliable responsive behavior.
Preserve each source page's:
- section order and visible content
- typography, font weights, and text hierarchy
- colors, backgrounds, and decorative treatments
- container widths, spacing, alignment, and proportions
- imagery, crops, icons, borders, radii, and shadows
- header, navigation, footer, calls to action, and forms
- desktop and mobile responsive behavior
Reuse exact source assets and locally available fonts wherever practical.
Do not replace distinctive source sections with generic cards, generic heroes,
or a new site-wide layout merely to make component reuse easier.
Use plain CSS with design tokens. Use plain CSS with design tokens.
Create reusable Astro components for repeated layout sections. Create reusable Astro components for repeated layout sections.
Do not create a messy page-by-page clone of HubSpot output. Component boundaries must follow genuinely repeated source patterns. Distinctive
pages and sections may retain page-specific markup and CSS when abstraction
would reduce fidelity. Do not copy HubSpot's generated DOM or CSS wholesale.
Favor: Favor:
@@ -163,10 +212,31 @@ Favor:
- reusable components - reusable components
- organized CSS - organized CSS
- clear data files - clear data files
- consistent spacing - source-faithful spacing
- accessible markup - accessible markup
- predictable file structure - predictable file structure
### Visual validation
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.
After implementation, compare the Astro output with the live public site at
representative desktop and mobile viewport widths. Check the full page, not
only the header or first viewport. Fix material differences before treating the
page as complete.
Document intentional visual deviations and their reasons in:
```txt
reports/migration-summary.md
```
## URL and SEO rules ## URL and SEO rules
Preserve existing public URL paths whenever possible. Preserve existing public URL paths whenever possible.
@@ -294,9 +364,11 @@ reports/migration-summary.md
Before large filesystem changes: Before large filesystem changes:
1. Inspect the mirror. 1. Inspect the live public site.
2. Summarize the implementation plan. 2. Inspect the mirror and identify relevant discrepancies.
3. Proceed methodically. 3. Inspect the relevant source HTML, CSS, and assets in detail.
4. Summarize the implementation and visual-validation plan.
5. Proceed methodically.
At the end of a task, summarize: At the end of a task, summarize:
@@ -307,4 +379,7 @@ At the end of a task, summarize:
- audit results - audit results
- unresolved issues - unresolved issues
Prioritize a clean, maintainable foundation over a pixel-perfect but messy clone. Prioritize visual fidelity and content correctness while implementing them with
clean, maintainable Astro code. Do not trade away visible source design for a
generic foundation, and do not copy HubSpot-generated implementation merely to
obtain fidelity.
+28
View File
@@ -23,6 +23,7 @@ workspace even when Codex cannot discover its Git metadata.
The profile: The profile:
- never pauses for approval - never pauses for approval
- automatically permits configured Playwright and OpenAI documentation MCP tools
- limits filesystem access to minimal runtime files plus this project - limits filesystem access to minimal runtime files plus this project
- allows writes in this project - allows writes in this project
- keeps `.codex` and `www.azinstitute4autism.com` read-only - keeps `.codex` and `www.azinstitute4autism.com` read-only
@@ -42,6 +43,27 @@ The profile is stored outside the workspace at:
Do not add `--sandbox`; legacy sandbox flags override the custom permission Do not add `--sandbox`; legacy sandbox flags override the custom permission
profile. Do not use `--dangerously-bypass-approvals-and-sandbox`. profile. Do not use `--dangerously-bypass-approvals-and-sandbox`.
The launcher also applies these session overrides:
```txt
approval_policy="never"
mcp_servers.playwright.default_tools_approval_mode="approve"
mcp_servers.playwright.tool_timeout_sec=300
mcp_servers.openaiDeveloperDocs.default_tools_approval_mode="approve"
mcp_servers.openaiDeveloperDocs.tool_timeout_sec=300
```
The server-level `approve` settings pre-approve MCP tools without writing
incompatible per-tool approval tables into the profile. These settings allow
MCP tools to run without approval prompts and give
long-running browser operations up to five minutes. An MCP server may still
fail or time out. MCP elicitations that inherently require user input are
rejected rather than shown as unattended prompts.
Do not persist an individual MCP tool approval when prompted by an older or
misconfigured session. Codex CLI 0.133.0 may write a per-tool table that the
profile-v2 parser rejects on the next launch.
## Verification ## Verification
The nested setup smoke test confirmed that the project is readable and The nested setup smoke test confirmed that the project is readable and
@@ -79,3 +101,9 @@ Check the startup banner before assigning work. It should report:
approval: never approval: never
sandbox: workspace-write ... (network access enabled) sandbox: workspace-write ... (network access enabled)
``` ```
Then check the MCP configuration:
```txt
/mcp verbose
```
+28 -14
View File
@@ -36,19 +36,24 @@ For the migration task:
1. Read `AGENTS.md`. 1. Read `AGENTS.md`.
2. Read `MIGRATION_BRIEF.md`. 2. Read `MIGRATION_BRIEF.md`.
3. Inspect the local mirror. 3. Inspect the live public site as the single source of truth.
4. Provide a concise implementation plan. 4. Inspect the local mirror as a convenient extraction aid and identify
5. Scaffold or update the Astro project in `./www`. relevant discrepancies.
6. Build extraction, crawl, audit, sitemap, and redirect tools. 5. Inspect the relevant live HTML, CSS, assets, and responsive behavior.
7. Extract content, media, metadata, navigation, and forms. 6. Provide a concise implementation and visual-validation plan.
8. Refactor into reusable Astro components. 7. Scaffold or update the Astro project in `./www`.
9. Configure Astro content collections and Front Matter CMS. 8. Build extraction, crawl, audit, sitemap, and redirect tools.
10. Add English, Arabic, and Spanish structure. 9. Extract content, media, metadata, navigation, and forms.
11. Add RTL CSS for Arabic. 10. Refactor genuinely repeated patterns into reusable Astro components.
12. Add SEO, sitemap, robots, redirects, and reports. 11. Compare rendered pages with the live site at desktop and mobile widths.
13. Run build and audits. 12. Configure Astro content collections and Front Matter CMS.
14. Fix practical errors. 13. Add English, Arabic, and Spanish structure.
15. Document incomplete items in `reports/migration-summary.md`. 14. Add RTL CSS for Arabic.
15. Add SEO, sitemap, robots, redirects, and reports.
16. Run build and audits.
17. Fix practical errors.
18. Document incomplete items and intentional visual deviations in
`reports/migration-summary.md`.
## Important Claude-specific behavior ## Important Claude-specific behavior
@@ -60,6 +65,15 @@ When asked to begin migration, first read the relevant project files, then work
Treat `./www.azinstitute4autism.com` as read-only source material. Treat `./www.azinstitute4autism.com` as read-only source material.
Treat the live public site as the single content and visual source of truth.
Use the mirror only as a convenient local extraction and inspection aid. When
the live site and mirror disagree, follow the live site and document material
discrepancies. This migration is not a redesign. Do not substitute a generic
visual system for the live design.
Treat the `migration-foundation` branch as reference-only. Do not use it as the
visual baseline.
Do not delete or overwrite raw source assets. Do not delete or overwrite raw source assets.
Do not remove files unless you are certain they are generated output in `./www`. Do not remove files unless you are certain they are generated output in `./www`.
@@ -105,4 +119,4 @@ When finished, report:
- redirect status - redirect status
- build status - build status
- audit status - audit status
- manual review items - manual review items
+76 -23
View File
@@ -1,5 +1,18 @@
# MIGRATION_BRIEF.md # MIGRATION_BRIEF.md
## Authority and interpretation
Read and follow `AGENTS.md` first. It is the authoritative project policy; this
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
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 ## Task
Migrate the public Arizona Institute for Autism website from a mirrored HubSpot-generated static copy into a clean, maintainable Astro + TypeScript site. Migrate the public Arizona Institute for Autism website from a mirrored HubSpot-generated static copy into a clean, maintainable Astro + TypeScript site.
@@ -24,15 +37,21 @@ wget --mirror --page-requisites --adjust-extension --convert-links --no-parent h
There is no HubSpot export, no HubSpot CLI access, and no HubSpot API access. There is no HubSpot export, no HubSpot CLI access, and no HubSpot API access.
Use the local mirror as the primary source. Use the live public website as the single source of truth:
If internet access is available, also crawl the live public website to catch missing URLs or assets:
```txt ```txt
https://www.azinstitute4autism.com https://www.azinstitute4autism.com
``` ```
The live crawl is only for comparison and gap-filling. The local mirror remains the source of truth. 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.
## High-level goal ## High-level goal
@@ -49,7 +68,7 @@ Create a new Astro site in `./www` that is:
- SEO-conscious - SEO-conscious
- accessible - accessible
- maintainable - maintainable
- mostly faithful to the current design - faithful to the current design, layout, and responsive behavior
- free of unnecessary HubSpot-generated structure - free of unnecessary HubSpot-generated structure
- prepared for future development and publishing - prepared for future development and publishing
@@ -238,11 +257,20 @@ Do not invent extensive translations.
### Design direction ### Design direction
The new site should be more maintainable while remaining mostly faithful to the current design. The new site must faithfully reproduce the live public site's visible design,
layout, content hierarchy, and responsive behavior. Do not redesign,
reinterpret, modernize, simplify, or genericize source pages.
Do not create a messy clone of HubSpot output. Preserve typography, colors, backgrounds, spacing, proportions, imagery,
section order, decorative treatments, navigation, calls to action, forms, and
page-specific distinctions. Reuse exact source assets and fonts wherever
practical.
Refactor repeated sections into reusable components. Do not copy HubSpot-generated DOM or CSS wholesale.
Refactor genuinely repeated sections into reusable components. Do not force
distinctive source sections into generic components when doing so changes their
appearance or structure.
Use semantic markup. Use semantic markup.
@@ -250,6 +278,22 @@ Use plain CSS with design tokens.
Do not use Tailwind. Do not use Tailwind.
### Fidelity workflow
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
desktop and mobile viewport widths.
7. Fix material visual differences before marking it complete.
Document intentional visual deviations and their reasons in
`reports/migration-summary.md`.
## Required target structure ## Required target structure
Create this project structure in `./www`: Create this project structure in `./www`:
@@ -643,7 +687,10 @@ src/styles/rtl.css
src/styles/global.css src/styles/global.css
``` ```
Infer the current sites visual language from the mirrored CSS and HTML. 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
system.
Use design tokens such as: Use design tokens such as:
@@ -1168,6 +1215,8 @@ The migration is successful when:
- `./www` contains a working Astro project - `./www` contains a working Astro project
- `npm run build` succeeds or unresolved build issues are clearly documented - `npm run build` succeeds or unresolved build issues are clearly documented
- main public pages render locally - main public pages render locally
- main public pages have been compared with the live site at desktop and mobile
widths and have no undocumented material visual differences
- blog posts are migrated into file-based Markdown where feasible - blog posts are migrated into file-based Markdown where feasible
- Markdown files work with Front Matter CMS - Markdown files work with Front Matter CMS
- MDX is available but not overused - MDX is available but not overused
@@ -1191,18 +1240,22 @@ Proceed methodically:
1. Read `AGENTS.md`. 1. Read `AGENTS.md`.
2. Read `CLAUDE.md`, if using Claude Code. 2. Read `CLAUDE.md`, if using Claude Code.
3. Read this `MIGRATION_BRIEF.md`. 3. Read this `MIGRATION_BRIEF.md`.
4. Inspect `./www.azinstitute4autism.com`. 4. Inspect the live public site.
5. Summarize a concise implementation plan. 5. Inspect `./www.azinstitute4autism.com` and identify relevant discrepancies.
6. Scaffold Astro in `./www`. 6. Summarize a concise implementation plan.
7. Build extraction/reporting scripts. 7. Scaffold Astro in `./www`.
8. Extract pages, blog posts, assets, metadata, navigation, and forms. 8. Build extraction/reporting scripts.
9. Refactor repeated sections into Astro components. 9. Extract pages, blog posts, assets, metadata, navigation, and forms.
10. Configure content collections and Front Matter CMS. 10. Refactor repeated sections into Astro components.
11. Add multilingual structure. 11. Configure content collections and Front Matter CMS.
12. Add SEO, sitemap, robots, and redirects. 12. Add multilingual structure.
13. Add reports. 13. Add SEO, sitemap, robots, and redirects.
14. Run build and audits. 14. Add reports.
15. Fix errors. 15. Run build and audits.
16. Summarize what changed and what still needs manual review. 16. Fix errors.
17. Summarize what changed and what still needs manual review.
Prioritize a clean, maintainable foundation over a messy pixel-perfect clone. Prioritize visual fidelity and content correctness while implementing them with
clean, maintainable Astro code. Do not trade away visible source design for a
generic foundation, and do not copy HubSpot-generated implementation merely to
obtain fidelity.
+5
View File
@@ -11,5 +11,10 @@ fi
exec codex \ exec codex \
--profile-v2 azi4a2-autonomous \ --profile-v2 azi4a2-autonomous \
--strict-config \ --strict-config \
--config 'approval_policy="never"' \
--config 'mcp_servers.playwright.default_tools_approval_mode="approve"' \
--config 'mcp_servers.playwright.tool_timeout_sec=300' \
--config 'mcp_servers.openaiDeveloperDocs.default_tools_approval_mode="approve"' \
--config 'mcp_servers.openaiDeveloperDocs.tool_timeout_sec=300' \
--cd "$repo_root" \ --cd "$repo_root" \
"$@" "$@"
+6 -2
View File
@@ -12,13 +12,17 @@
in in
{ {
overlays.default = final: prev: rec { overlays.default = final: prev: rec {
nodejs = prev.nodejs; nodejs = prev.nodejs_22;
yarn = (prev.yarn.override { inherit nodejs; }); yarn = (prev.yarn.override { inherit nodejs; });
}; };
devShells = forEachSupportedSystem ({ pkgs }: { devShells = forEachSupportedSystem ({ pkgs }: {
default = pkgs.mkShell { default = pkgs.mkShell {
packages = with pkgs; [ node2nix nodejs nodePackages.pnpm yarn ]; packages = with pkgs; [
node2nix nodejs nodePackages.pnpm yarn
python3
fd
];
}; };
}); });
}; };
+1
View File
@@ -0,0 +1 @@
PUBLIC_AIA_API_BASE=https://api.azinstitute4autism.com
+8
View File
@@ -0,0 +1,8 @@
node_modules/
dist/
.astro/
.env
.env.*
!.env.example
reports/live-crawl.json
reports/*.png
+436
View File
@@ -0,0 +1,436 @@
# 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`.
## Quick Start
Run commands from this directory:
```sh
cd www
npm install
npm run dev
```
Astro prints the local development URL, normally:
```txt
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:
- Node.js 20.19 or newer; the Nix shell currently supplies Node.js 22
- npm
This repository also has a Nix development shell at the repository root:
```sh
cd ..
nix --extra-experimental-features "nix-command flakes" develop
cd www
npm install
```
Copy the example environment file when testing the like/view counter:
```sh
cp .env.example .env
```
The default value is:
```txt
PUBLIC_AIA_API_BASE=https://api.azinstitute4autism.com
```
The site still renders when that API is unavailable.
## View And Build
### Development Server
Use this while editing:
```sh
npm run dev
```
Useful development URLs include:
```txt
/
/aba-therapy
/autism-evaluations
/learner-social-club
/client-consultation
/library
/es
/es/library
/ar
/ar/library
```
### Production Build
Generate the static production site:
```sh
npm run build
```
The autonomous Codex sandbox denies `/etc/hosts`, so its Node runtime cannot
resolve `localhost`. Use this equivalent validation command only inside that
sandbox:
```sh
npm run build:sandbox
```
Build output is written to:
```txt
dist/
```
### Preview Production Output
After a successful build:
```sh
npm run preview
```
Astro prints the preview URL, normally `http://localhost:4321`.
### Validate Before Committing
```sh
npm run build
npm run audit:links
npm run audit:images
npm run audit:blog
```
The link audit reads `dist/` after a successful build. If rendered output is
unavailable, it audits generated source routes, relative and root-relative
Markdown links, and public assets instead. It writes:
```txt
reports/broken-links.md
```
## Editing Content
Normal content editing happens in Markdown:
```txt
src/content/pages/en
src/content/pages/es
src/content/pages/ar
src/content/blog/en
src/content/blog/es
src/content/blog/ar
src/content/authors/en
src/content/authors/es
src/content/authors/ar
```
Page and post frontmatter is validated by `src/content.config.ts`.
Example:
```md
---
title: "Example Article"
description: "Short search and social description."
slug: "example-article"
canonical: "https://www.azinstitute4autism.com/library/example-article"
lang: "en"
translationKey: "example-article"
featuredImage: "/assets/images/example.webp"
alt: "Descriptive image alt text"
date: "2026-06-07"
author: "rula-diab"
category: "Library"
tags:
- ABA Therapy
draft: false
---
Article content goes here.
```
Set `draft: true` while preparing unpublished content.
### Links And Buttons
Use normal Markdown links for links within prose:
```md
Read the [ABA therapy guide](/aba-therapy) for more information.
```
Prose links render as the live site's orange inline links. Do not place an
ordinary Markdown link on its own line merely to make it look like a button.
Use `.mdx` and the `Button` component only for a source-verified call to action:
```mdx
import Button from '../../../components/Button.astro';
<Button href="/client-consultation">Request an Appointment</Button>
<Button href="/services" variant="outlined">Explore Services</Button>
<Button href="https://example.com" target="_blank">External Action</Button>
```
Available `Button` variants are `filled` (default), `outlined`, and `light`.
Available sizes are `default` and `small`. A `_blank` target automatically adds
`rel="noopener noreferrer"`.
Use the optional `Link` component only when an inline link needs an explicit
variant or target:
```mdx
import Link from '../../../components/Link.astro';
<Link href="/library" variant="strong">Browse the library</Link>
```
Normal Markdown links remain preferred for ordinary page and article content.
### Front Matter CMS
The project includes `frontmatter.json` for the Front Matter CMS VS Code
extension. Open the `www` folder as the editor workspace so its content folders
and media paths resolve correctly.
### Edit The Homepage
The English and Spanish homepages are driven from the structured `home:`
frontmatter block in:
```txt
src/content/pages/en/index.md
src/content/pages/es/index.md
```
`HomePage.astro` renders those named sections in order. Use the section names
as the editing surface:
```txt
hero
servicesIntro
benefits
skills
insurance
esa
financialHelp
process
director
testimonials
```
Keep homepage copy in those named blocks so the page remains easy to scan in
Front Matter CMS and VS Code. `src/content.config.ts` validates the structure.
### Images And Downloads
Store content-referenced assets in:
```txt
public/assets/images
public/assets/downloads
public/assets/media
```
Reference public assets from Markdown using root-relative paths:
```md
![Descriptive alt text](/assets/images/example.webp)
```
Use `src/assets/images` for images imported directly by Astro components and
processed by Astro.
### Components And Styling
Reusable page sections are in:
```txt
src/components
src/layouts
```
Global styles and design tokens are in:
```txt
src/styles/variables.css
src/styles/global.css
src/styles/rtl.css
```
Navigation, services, redirects, and site details are in:
```txt
src/data
```
## Adding Content
### Add An English Blog Post
1. Create `src/content/blog/en/post-slug.md`.
2. Add valid frontmatter and article Markdown.
3. Place referenced images in `public/assets/images`.
4. Run `npm run dev` and view `/library/post-slug`.
5. Run the production validation commands before committing.
### Add A Translation
Use the same `translationKey` across translated entries:
```txt
src/content/blog/en/post-slug.md
src/content/blog/es/post-slug.md
src/content/blog/ar/post-slug.md
```
The URLs become:
```txt
/library/post-slug
/es/library/post-slug
/ar/library/post-slug
```
Arabic routes automatically render with `lang="ar"` and `dir="rtl"`.
Do not publish unreviewed machine translations. Clearly mark placeholders.
### Edit A Blog FAQ
Posts with live-style FAQ sections use `.mdx` and import:
```mdx
import FAQAccordion from '../../../components/FAQAccordion.astro';
```
Edit the component's `label`, `heading`, and `items` data in the post. Keep
`answer` as plain text for JSON-LD and `answerHtml` as the matching visible
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/`.
Useful commands:
```sh
npm run crawl:live
npm run generate:sitemap
npm run generate:redirects
npm run audit:links
```
The live crawl is optional and may fail in restricted network environments.
## Forms
Forms are intentionally static and do not submit anywhere. Before production:
1. Select a form backend.
2. Connect the forms.
3. Add spam protection.
4. Test validation, confirmation, and failure states.
## Troubleshooting
### `astro: command not found`
Dependencies are not installed:
```sh
npm install
```
### npm TLS or certificate errors
Do not disable npm certificate verification. Run `npm install` from a normal
host terminal or trusted development environment with working CA certificates.
### Link audit says build output is unavailable
Build first:
```sh
npm run build
npm run audit:links
npm run audit:images
npm run audit:blog
```
### A content page is missing
Check:
- its Markdown file is in the correct language/content folder
- `draft` is `false`
- `slug` is unique within that language and content type
- frontmatter satisfies `src/content.config.ts`
+11
View File
@@ -0,0 +1,11 @@
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
export default defineConfig({
site: 'https://www.azinstitute4autism.com',
trailingSlash: 'never',
integrations: [mdx()],
markdown: {
shikiConfig: { theme: 'github-light' }
}
});
+58
View File
@@ -0,0 +1,58 @@
{
"$schema": "https://frontmatter.codes/frontmatter.schema.json",
"frontMatter.framework.id": "astro",
"frontMatter.content.publicFolder": "public",
"frontMatter.content.pageFolders": [
{ "title": "Pages", "path": "[[workspace]]/www/src/content/pages" },
{ "title": "Blog", "path": "[[workspace]]/www/src/content/blog" },
{ "title": "Authors", "path": "[[workspace]]/www/src/content/authors" }
],
"frontMatter.taxonomy.contentTypes": [
{
"name": "page",
"pageBundle": false,
"fields": [
{ "title": "Title", "name": "title", "type": "string", "required": true },
{ "title": "Description", "name": "description", "type": "string" },
{ "title": "Slug", "name": "slug", "type": "string", "required": true },
{ "title": "Language", "name": "lang", "type": "choice", "choices": ["en", "ar", "es"] },
{ "title": "Canonical", "name": "canonical", "type": "string" },
{ "title": "Featured image", "name": "featuredImage", "type": "image" },
{ "title": "Alt text", "name": "alt", "type": "string" },
{ "title": "Translation key", "name": "translationKey", "type": "string" },
{ "title": "Draft", "name": "draft", "type": "boolean", "default": false }
]
},
{
"name": "blog",
"pageBundle": false,
"fields": [
{ "title": "Title", "name": "title", "type": "string", "required": true },
{ "title": "Description", "name": "description", "type": "string" },
{ "title": "Slug", "name": "slug", "type": "string", "required": true },
{ "title": "Date", "name": "date", "type": "datetime", "required": true },
{ "title": "Author", "name": "author", "type": "string", "default": "rula-diab" },
{ "title": "Category", "name": "category", "type": "string" },
{ "title": "Tags", "name": "tags", "type": "tags" },
{ "title": "Language", "name": "lang", "type": "choice", "choices": ["en", "ar", "es"] },
{ "title": "Featured image", "name": "featuredImage", "type": "image" },
{ "title": "Alt text", "name": "alt", "type": "string" },
{ "title": "Canonical", "name": "canonical", "type": "string" },
{ "title": "Translation key", "name": "translationKey", "type": "string" },
{ "title": "Draft", "name": "draft", "type": "boolean", "default": false }
]
},
{
"name": "author",
"pageBundle": false,
"fields": [
{ "title": "Name", "name": "name", "type": "string", "required": true },
{ "title": "Slug", "name": "slug", "type": "string", "required": true },
{ "title": "Description", "name": "description", "type": "string" },
{ "title": "Avatar", "name": "avatar", "type": "image" },
{ "title": "Language", "name": "lang", "type": "choice", "choices": ["en", "ar", "es"] },
{ "title": "Translation key", "name": "translationKey", "type": "string" }
]
}
]
}
+10
View File
@@ -0,0 +1,10 @@
# 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.
+6744
View File
File diff suppressed because it is too large Load Diff
+33
View File
@@ -0,0 +1,33 @@
{
"name": "arizona-institute-for-autism",
"private": true,
"type": "module",
"engines": {
"node": ">=20.19.0"
},
"scripts": {
"dev": "astro dev",
"build": "astro build",
"build:sandbox": "NODE_OPTIONS=--require=./tools/localhost-dns.cjs astro build",
"preview": "astro preview",
"extract": "node tools/extract-fallback.mjs",
"extract:full": "node tools/extract-site.mjs",
"extract:blog-footers": "node tools/extract-blog-footers.mjs",
"crawl:live": "node tools/crawl-live-site.mjs",
"audit:links": "node tools/audit-links.mjs",
"audit:images": "node tools/audit-page-imagery.mjs",
"audit:blog": "node tools/audit-blog-content.mjs",
"generate:sitemap": "node tools/generate-sitemap.mjs",
"generate:redirects": "node tools/generate-redirects.mjs"
},
"dependencies": {
"@astrojs/mdx": "^4.3.14",
"astro": "^5.10.0",
"cheerio": "^1.1.0",
"fast-glob": "^3.3.3",
"gray-matter": "^4.0.3",
"swiper": "^12.2.0",
"turndown": "^7.2.0",
"zod": "^3.25.0"
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

+9
View File
@@ -0,0 +1,9 @@
<svg width="50" height="41" viewBox="0 0 50 41" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="50" height="41" fill="url(#pattern0)"/>
<defs>
<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_209_11128" transform="scale(0.02 0.0243902)"/>
</pattern>
<image id="image0_209_11128" width="50" height="41" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAApCAYAAAB3LnrpAAAFbElEQVRogbWYa4hUZRjHf887O+rO7pn1QqZdtMQgAxWlm11ISaICa/vQZmnu7rClZRQlRhTYgpmVQQgiLa0zu2vktkbB5gWtyAzdksqIhG4oaJjketmZ3RHXmfP0YTZ3Z+fM5cye+X86PJf//3l4z3nf8z4wAmhzcLqGgx9r2KofCU9BWpHK+Rq2Dmpb5Qwnf1lRpB2UEw++iurLwChgNhAZQZ3ZtbYGJpMoew/0MQRIyiqgYXic60Y0UjGTPtMOetOA6Rxirxxhvc5ardYjJGgGHT9gOoLPrHOKFVfELcFlqDYBYwayuxH7Xqnt+2VEFQ/X6cBH3NqA8uKgUQ4zWu6VJT3nnHIKakQVIRJci+hrQ8xRTHK+1MYPj6zsYVptV1aQiG9HeGCI+Qj9zJflse5seXlfLVWEluBmRFcMNSM86XkTTeOqsOM7EO4aYj5DUqpleTRrEwAmL3tLcBOkNQHCW1IX6yyq2izQpqsC+BO70bQmFKVOGqJ/5cvP2YhGrFdAn003ymECscbiys2i04EPf2wbwrx0Bx9IKLajEI6sjWjYehh4c7gZeEZq6HdbbE70WesRHhpmPcUo/+pCKRwb0XDVNIQ2MjYD6ZBQ9Hu3deaCRqxqILNg1UZZejZaKE9GI9pIGWJ/BAQzopP2G+7KzA1tLb8aaHZw/UNlr6sDNnNFrrNeAm5ziN0nDb2/uiHPi2TZZmBCpkOb3L6+aY1o89ipqL7uGKmyxQ1xPmjEqnb4LlLw+drc8qWviC+xDiTgEHcJMQXtHoVAGykD3nH2ys+yrOeYW87LjWhrxSyQx5255RupP3/eLXlWTK1sAG7I4v28GMrBFUmaVWTdju1viyF3gjZiEFmVPcDeVwyvAdC2yokIi7NG2XqwGHJHTLEeRJmexZvkQvmhYmhTK5AwNaTuFc4Q39Matho0Yt1YjEg6lyzN4U1QcWG9tlTW6NbAZFe0ABqx9gN3F5hzCvgC4RMCsZ1SQ7JQMe2gnL7K7iwbihN+B92NmvZ8B7FoZOxYSHYDvkILGoKjiGwkEH2/kH1fI8H7QXcXoQNKFz42SG3sMye3QZP3UFwTANNQ3Uif9YNGgrfkL0YXFKkDwjxsPtWI1TnwR5AGg8icoskHMRP0QN4hhJG5Hmgtwi77SVuDt6ZRg872gBzAj7BFW4JLskaozvJIayK27k2dfSkY0CkekQMIqmFtDWSsskYYA0z0UKsK23Tqh+ODAAbkGg/JAUZh+zZnmoPXeqwDMJX+S2sgdY6MLoHA7RquWJhuSo4pgQ4IKzRceYUBqkojYIbd803m/cYbVCA8ahB6SySwUBuH/LuJHSuRDiD3GbRkjVRx/bjB70/L+kqkA8hcA5wonUBy0uXHaM/fgF0aHZ1kgCOlIQdU/f8/yvNcRDhaIiW/AfV0KpIG5cwwy3clUjpjMP5dpOZV3kJI0G8dT7Op7vRcJ4WjRmrPHUcp6laWE8qPsvxkPM3WH+wEvLsyD2rtT22PIu96To60Z1hSjTmc+iOETzoMgNRHd4Hu8ZD6X+KjnQZv4Pe/DZz0TEnkS6mNHho8sDT5FELO0X3h0Odk5WnH80mWno2iEsKLrVjoRXQlDJmaSOjCCaAaNJ41sTD2tVLfuz1nRCi6B5UXRqZDP8oTUhv7A4aNf6QudgAjC0ndy91BSKCslvromoLCQ9FNKCHgomstOIuYRVIfuzwDy5hjSW2si35mAlsQEgXRKl2o3CGhmKtNQ0KxCEm9GeSrAlNsRLdhErOkrmdvGlfO+lrHTUETi1EWADNIXYzKgdPAMdCDGOmQ2liXmwactQJzsH01wJ2kppATEATlNMpviH4Npl3qo3865f8Hlv/IWRfm5IAAAAAASUVORK5CYII="/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

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

@@ -0,0 +1 @@
<svg viewBox="10 19.5 180 165" height="200" width="200" xmlns="http://www.w3.org/2000/svg" role="presentation" aria-hidden="true" aria-label="" fill="#254080"><path d="M10 184.5h38.7V48.2H10v136.3zM25.8 119c-3.8-1.4-7.7-3.5-7.7-9.4A11.2 11.2 0 0 1 28 98v-6h4.5v6c3.1.1 6.2 1 9 2.7l-3.7 7c-1.7-1.4-4-2.3-6.2-2.4-2.2 0-4.1.9-4.1 2.7 0 2.3 3 3.2 4.7 3.9 5.6 1.8 10.6 3.8 10.6 10.6s-4 10.4-10.3 11.9v6H28v-5.7a20.7 20.7 0 0 1-12.1-4.4l4-7.4c2.3 2.4 5.5 3.8 8.8 4.2 2 0 4.6-1.2 4.6-3.6.1-2.7-3.8-3.1-7.5-4.6zm125.5 8.1v57.4H190v-57.4h-38.7zm-46.8 57.4h38.7V111h-38.7v73.5zm-47.7 0h38.7V86.8H56.8v97.7zM93.5 65.8a346.8 346.8 0 0 0 93.8 47l1.8-5.4c-33-10.6-64-26.2-92.2-46.2a336.3 336.3 0 0 1-35-28.7l6.6-6.7-23.7-6.3 6.4 23.7 6.7-6.7a348.5 348.5 0 0 0 35.6 29.3z"/></svg>

After

Width:  |  Height:  |  Size: 765 B

@@ -0,0 +1 @@
<svg viewBox="34.5 28 130.999 144" height="200" width="200" xmlns="http://www.w3.org/2000/svg" role="presentation" aria-hidden="true" aria-label="" fill="#254080"><path d="M129.8 85h-6v-3.7c0-6.6-15.4-11.3-23.8-11.3s-23.8 4.7-23.8 11.3V85h-6v-3.7C70.2 69 91.2 64 100 64s29.8 5 29.8 17.3V85z"/><path d="M93.5 172H80.3a3 3 0 0 1-2.8-2l-8.9-28H51.7c-9.5 0-17.2-7.8-17.2-17.4v-36c0-7 5.6-12.6 12.5-12.6h.4c6.6 0 13 2.8 17.5 7.6L74.5 94H91a3 3 0 0 1 3 3.3c-.5 5-4.2 14.7-15 14.7H63.7a3 3 0 0 1-2-.9l-.3-.2v7.1h11.9a15 15 0 0 1 14 10.4l9.2 40a3 3 0 0 1-.6 2.5 3 3 0 0 1-2.3 1.1zm-11-6h7.3l-8.3-36a9 9 0 0 0-8.3-6H58.3a3 3 0 0 1-3-3v-16.2L47 96l4.2-4.2L65 106h14.3c5 0 7.1-3.3 8.1-6H73.2a3 3 0 0 1-2.2-1L60.5 87.8a17.9 17.9 0 0 0-13-5.7H47c-3.6 0-6.5 3-6.5 6.6v36c0 6.3 5 11.4 11.2 11.4h19a3 3 0 0 1 3 2l8.8 28zM55.3 73c-8 0-14.8-6.9-14.8-15v-3c0-8.1 6.8-15 14.8-15s15 6.9 15 15v3a15 15 0 0 1-15 15zm0-27a9 9 0 0 0-8.9 9v3c0 4.9 4.1 9 9 9s8.9-4.1 8.9-9v-3a9 9 0 0 0-9-9zm63.8 126H106a3 3 0 0 1-2.4-1.1 3 3 0 0 1-.5-2.6l9-40 .1-.2a15 15 0 0 1 14-10h12.5v-7.8l-.8.8a3 3 0 0 1-2.1 1h-15c-10.7 0-14.4-9.7-14.8-14.8a3 3 0 0 1 .7-2.3 3 3 0 0 1 2.2-1h16l9.7-10.4A23.8 23.8 0 0 1 152 76h.4a13 13 0 0 1 13.1 12.6v36c0 9.4-8.2 17.4-17.8 17.4h-16.9l-8.8 28a3 3 0 0 1-2.9 2zm-9.4-6h7.3l8.8-28a3 3 0 0 1 2.9-2h19c6.4 0 11.8-5.2 11.8-11.4v-36c0-3.5-3.3-6.6-7-6.6h-.5a17.9 17.9 0 0 0-13 5.7l-10.5 11.4a3 3 0 0 1-2.2 1h-13.6c1 2.6 3.2 6 8.1 6h13.8l14-14.2 4.1 4.2-8 8.2V121a3 3 0 0 1-3 3h-15.4a9 9 0 0 0-8.4 6l-8.2 36zm35-93c-8.1 0-15-6.9-15-15v-3c0-8.1 6.9-15 15-15s14.8 6.9 14.8 15v3c0 8.1-6.8 15-14.8 15zm0-27a9 9 0 0 0-9 9v3c0 4.9 4.1 9 9 9s8.9-4.1 8.9-9v-3a9 9 0 0 0-9-9z"/><path d="M141.7 106v6H58.3v-6h83.4zM100 61c-8 0-14.9-6.9-14.9-15v-3c0-8.1 6.8-15 14.9-15 8 0 14.9 6.9 14.9 15v3c0 8.1-6.8 15-14.9 15zm0-27a9 9 0 0 0-9 9v3c0 4.9 4.2 9 9 9s9-4.1 9-9v-3c0-4.9-4.2-9-9-9z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,6 @@
<svg viewBox="10 25 180 150" height="200" width="200" xmlns="http://www.w3.org/2000/svg" role="presentation" aria-hidden="true" aria-label="" fill="#254080">
<path d="M142.2 44.2a82 82 0 0 1 5.5 8.4 60.8 60.8 0 0 1-39.3 114.5 91.5 91.5 0 0 1-9.5 3.3 66.8 66.8 0 0 0 24.4 4.6 66.8 66.8 0 0 0 19-130.8z"/>
<path d="M173.8 108.2c0-16-7.5-30.3-19.1-39.6a80.8 80.8 0 0 1 3.6 23.9 81 81 0 0 1-34.6 66.2c27.7-.2 50-22.7 50-50.5z"/>
<path d="M144.8 92.5a67.5 67.5 0 1 0-135 0 67.5 67.5 0 0 0 135 0zm-67.4 61.3A61.4 61.4 0 1 1 77.6 31a61.4 61.4 0 0 1-.2 122.8z"/>
<path d="M77.4 41.5a51 51 0 1 0 0 102 51 51 0 0 0 0-102zM90.1 112c-2.2 2.7-5 4.5-8.6 5.5v6.8h-5.8v-6.6a17 17 0 0 1-9.4-4.3 20.4 20.4 0 0 1-4.8-10.1l7-1.5a17 17 0 0 0 3.5 7c1.5 1.3 3.4 2 5.8 2a8 8 0 0 0 5.8-2.3 7.6 7.6 0 0 0 2.3-5.8c0-2-.6-3.8-1.9-5-.7-.7-1.6-1.4-2.9-2.2l-5-2.5a24 24 0 0 1-8-5 12 12 0 0 1-3.2-8.4c0-1.5.3-3 .8-4.2s1.2-2.5 2-3.6 2.2-2 3.5-2.8c1.4-.8 3-1.4 5-1.9V61h4.9v6c2.8.4 4.8 1.3 6.4 2.5s3.1 3.2 4.6 5.8l-6.2 3.5c-1.9-3.4-4.3-5.1-7.3-5.1-1.9 0-3.5.5-4.7 1.6s-1.8 2.5-1.8 4.2c0 1.5.5 2.7 1.5 3.8 1 1 3 2 5.9 3.4 2.6 1.2 4.7 2.3 6.4 3.3s3 2 3.8 3c2.4 2.6 3.6 5.7 3.6 9.4 0 3.6-1 6.8-3.2 9.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="21.843 32.157 156.313 135.686" role="presentation" aria-hidden="true" aria-label="" fill="#254080"><path d="M137.3 99.4a50 50 0 0 0-33.8 11.3V105c0-14.6-18-26-40.8-26s-40.9 11.4-40.9 26v39.8l10.7 1a291.7 291.7 0 0 0 30 1.6c9.9 0 19.6-.5 29.4-1.5l4.6-.4v19.7l10.6 1a291.8 291.8 0 0 0 30.1 1.6c9.8 0 19.6-.4 29.3-1.4l11.7-1.2v-39.7c0-14.6-18-26-40.9-26zm-40.8 39-5.3.6-7 .6v-26h-2.5v26.1a285.2 285.2 0 0 1-38 0v-26H41v25.9a284.2 284.2 0 0 1-7.9-.7l-4.4-.5V105c0-10.3 15.5-19 33.9-19s33.8 8.7 33.8 19v33.4zm74.7 20.5-5.4.5-6.9.6v-26.2h-2.5v26.4a285.3 285.3 0 0 1-38.1 0v-26.4h-2.6V160a280.5 280.5 0 0 1-7.8-.7l-4.4-.4v-33.4c0-10.3 15.5-19 33.8-19s33.9 8.7 33.9 19v33.4zM137.3 94a20.8 20.8 0 1 0 0-41.6 20.8 20.8 0 0 0 0 41.6zm0-34.5a13.8 13.8 0 1 1 0 27.5 13.8 13.8 0 0 1 0-27.5zM62.7 73.7a20.8 20.8 0 1 0 0-41.6 20.8 20.8 0 0 0 0 41.6zm0-34.5a13.8 13.8 0 1 1 0 27.5 13.8 13.8 0 0 1 0-27.5z"/></svg>

After

Width:  |  Height:  |  Size: 970 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 KiB

@@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21 5.25L12 13.5L3 5.25" stroke="#2B4EFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 5.25H21V18C21 18.1989 20.921 18.3897 20.7803 18.5303C20.6397 18.671 20.4489 18.75 20.25 18.75H3.75C3.55109 18.75 3.36032 18.671 3.21967 18.5303C3.07902 18.3897 3 18.1989 3 18V5.25Z" stroke="#2B4EFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10.3636 12L3.23126 18.538" stroke="#2B4EFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M20.7688 18.5381L13.6363 12" stroke="#2B4EFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

@@ -0,0 +1 @@
<svg viewBox="19.999 19.938 160.002 160.063" height="200" width="200" xmlns="http://www.w3.org/2000/svg" role="presentation" aria-hidden="true" aria-label="" fill="#254080"><path d="M176.2 169.8a3.8 3.8 0 0 1-3.8-3.8V43H27.6v123a3.8 3.8 0 1 1-7.6 0V39a3.8 3.8 0 0 1 3.8-3.8h152.4A3.8 3.8 0 0 1 180 39v127a3.8 3.8 0 0 1-3.8 3.8z"/><path d="M176.2 78.4H23.8a3.8 3.8 0 1 1 0-7.6h152.4a3.8 3.8 0 1 1 0 7.6zM100 58a3.8 3.8 0 0 1-3.8-3.7V23.8a3.8 3.8 0 1 1 7.6 0v30.5A3.8 3.8 0 0 1 100 58zm-25.4 0a3.8 3.8 0 0 1-3.8-3.7V23.8a3.8 3.8 0 1 1 7.6 0v30.5a3.8 3.8 0 0 1-3.8 3.8zm50.8 0a3.8 3.8 0 0 1-3.8-3.7V23.8a3.8 3.8 0 1 1 7.6 0v30.5a3.8 3.8 0 0 1-3.8 3.8zm-76.2 0a3.8 3.8 0 0 1-3.8-3.7V23.8a3.8 3.8 0 1 1 7.6 0v30.5a3.8 3.8 0 0 1-3.8 3.8zm101.6 0a3.8 3.8 0 0 1-3.8-3.7V23.8a3.8 3.8 0 1 1 7.6 0v30.5a3.8 3.8 0 0 1-3.8 3.8zM34 180a14 14 0 0 1-14-14 3.8 3.8 0 1 1 7.6 0 6.4 6.4 0 0 0 6.4 6.4 3.8 3.8 0 1 1 0 7.6zm132 0a3.8 3.8 0 1 1 0-7.6 6.4 6.4 0 0 0 6.4-6.4 3.8 3.8 0 1 1 7.6 0 14 14 0 0 1-14 14z"/><path d="M166 180H34a3.8 3.8 0 1 1 0-7.6h132a3.8 3.8 0 1 1 0 7.6zM49.2 119a3.8 3.8 0 0 1-3.8-3.8V95a3.8 3.8 0 1 1 7.6 0v20.3a3.8 3.8 0 0 1-3.8 3.8zm20.3 0a3.8 3.8 0 0 1-3.8-3.8V95a3.8 3.8 0 1 1 7.6 0v20.3a3.8 3.8 0 0 1-3.8 3.8z"/><path d="M69.5 98.7H49.2a3.8 3.8 0 1 1 0-7.6h20.3a3.8 3.8 0 0 1 0 7.6zm0 20.3H49.2a3.8 3.8 0 1 1 0-7.6h20.3a3.8 3.8 0 0 1 0 7.6zm-20.3 40.7a3.8 3.8 0 0 1-3.8-3.8v-20.3a3.8 3.8 0 1 1 7.6 0v20.3a3.8 3.8 0 0 1-3.8 3.8zm20.3 0a3.8 3.8 0 0 1-3.8-3.8v-20.3a3.8 3.8 0 1 1 7.6 0v20.3a3.8 3.8 0 0 1-3.8 3.8z"/><path d="M69.5 139.4H49.2a3.8 3.8 0 1 1 0-7.7h20.3a3.8 3.8 0 0 1 0 7.7zm0 20.3H49.2a3.8 3.8 0 1 1 0-7.6h20.3a3.8 3.8 0 0 1 0 7.6zM89.8 119a3.8 3.8 0 0 1-3.8-3.8V95a3.8 3.8 0 1 1 7.7 0v20.3a3.8 3.8 0 0 1-3.9 3.8zm20.4 0a3.8 3.8 0 0 1-3.9-3.8V95a3.8 3.8 0 1 1 7.7 0v20.3a3.8 3.8 0 0 1-3.8 3.8z"/><path d="M110.2 98.7H89.8a3.8 3.8 0 1 1 0-7.6h20.4a3.8 3.8 0 1 1 0 7.6zm0 20.3H89.8a3.8 3.8 0 1 1 0-7.6h20.4a3.8 3.8 0 1 1 0 7.6zm-20.4 40.7a3.8 3.8 0 0 1-3.8-3.8v-20.3a3.8 3.8 0 1 1 7.7 0v20.3a3.8 3.8 0 0 1-3.9 3.8zm20.4 0a3.8 3.8 0 0 1-3.9-3.8v-20.3a3.8 3.8 0 1 1 7.7 0v20.3a3.8 3.8 0 0 1-3.8 3.8z"/><path d="M110.2 139.4H89.8a3.8 3.8 0 1 1 0-7.7h20.4a3.8 3.8 0 1 1 0 7.7zm0 20.3H89.8a3.8 3.8 0 1 1 0-7.6h20.4a3.8 3.8 0 1 1 0 7.6zm20.3-40.7a3.8 3.8 0 0 1-3.8-3.8V95a3.8 3.8 0 1 1 7.6 0v20.3a3.8 3.8 0 0 1-3.8 3.8zm20.3 0a3.8 3.8 0 0 1-3.8-3.8V95a3.8 3.8 0 1 1 7.6 0v20.3a3.8 3.8 0 0 1-3.8 3.8z"/><path d="M150.8 98.7h-20.3a3.8 3.8 0 1 1 0-7.6h20.3a3.8 3.8 0 1 1 0 7.6zm0 20.3h-20.3a3.8 3.8 0 1 1 0-7.6h20.3a3.8 3.8 0 1 1 0 7.6zm-20.3 40.7a3.8 3.8 0 0 1-3.8-3.8v-20.3a3.8 3.8 0 1 1 7.6 0v20.3a3.8 3.8 0 0 1-3.8 3.8zm20.3 0a3.8 3.8 0 0 1-3.8-3.8v-20.3a3.8 3.8 0 1 1 7.6 0v20.3a3.8 3.8 0 0 1-3.8 3.8z"/><path d="M150.8 139.4h-20.3a3.8 3.8 0 1 1 0-7.7h20.3a3.8 3.8 0 1 1 0 7.7zm0 20.3h-20.3a3.8 3.8 0 1 1 0-7.6h20.3a3.8 3.8 0 1 1 0 7.6z"/></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Some files were not shown because too many files have changed in this diff Show More