Commit graph

21 commits

Author SHA1 Message Date
381f6b6dce feat(seo): BreadcrumbList on interior pages + richer LocalBusiness
Add a breadcrumb-ld partial (rendered from breadcrumbName/breadcrumbParent
front-matter) emitting BreadcrumbList JSON-LD on all 11 interior pages
(3-level on the job pages). Enrich homepage LocalBusiness with geo,
areaServed (US), and hasMap. NOTE: geo coords are approximate (Ronkonkoma
ZIP) — set precisely from the Google Business Profile; openingHours and
sameAs omitted pending real hours + non-placeholder social URLs.
2026-06-12 17:23:11 -04:00
Adam Moussa
5ee640074c
Migrate to thin Eleventy build + a11y/SEO/perf/CI hardening (#20)
* chore(build): add Eleventy scaffold

Thin Eleventy build (v3.1.6, pinned) — passthrough-copies assets/,
robots.txt, sitemap.xml; outputs flat HTML to _site/. _data/site.json
holds site-wide constants; _data/images.json maps image keys to
src+width+height for the {% image %} shortcode (CLS fix). Output stays
flat HTML served from the same S3 bucket + CloudFront.

* refactor(templates): base layout, partials, shared JS, CSS extraction

- _includes/base.njk + nav/mobile-menu/footer partials reproduce the
  shared chrome once (was hand-duplicated across 13 pages). Adds a
  skip-link and <main> landmark (WCAG 2.4.1), aria-expanded/role=dialog
  hooks on the menu, and a {% year %} shortcode replacing document.write.
- assets/js/nav.js: extracted sticky-nav + accessible mobile-menu dialog
  (focus trap, Escape, focus return) + rAF-throttled hero parallax.
- assets/js/form.js: Basin AJAX submit with an accessible status region.
- assets/css/*.css: per-page inline <style> extracted into page CSS files
  (home/about/services/careers/jobs/contact/social/legal/404); skip-link
  + :focus-visible added to main.css.
- index.njk: homepage converted as the reference page.

* fix(css): make hero-bg url root-relative after extraction

Inline CSS used a document-relative url('assets/...') that resolves
correctly from / but breaks once moved into /assets/css/home.css.
Rewrite to /assets/images/.

* refactor(pages): convert 12 pages to Eleventy templates

Convert about, services, careers (listing + 3 jobs), contact, social-
accountability, privacy-policy, terms-of-service, eula, and 404 from
standalone HTML to .njk against base.njk. Each page now carries only
front-matter (title/description/SEO) + its <main> content; shared head/
nav/footer/scripts come from the layout. JobPosting + LocalBusiness
JSON-LD preserved. Images use the {% image %} shortcode (width/height).
Contact gets an accessible #form-status region. form.js generalized to
wire BOTH the contact form and the .apply-form job application forms
(was contact-only), preserving each submit button's own label.

* fix(a11y): footer contrast to WCAG AA + scope services .form-group

Raise footer text colors (footer-bottom/col/brand/social/contact) and
darken --text-muted so muted text clears 4.5:1 on the dark footer and
warm-gray surfaces. Scope services' flex .form-group override to
.contact-form .form-group so it can't leak to the global rule.

* perf(seo): og-cover image, webp logos, hero preload

Add a real 1200x630 og-cover.jpg (was a 153x49 favicon) wired site-wide
via base.njk og:image/twitter:image. Convert nav/footer logos to webp
(nav 58KB->22KB); PNGs kept as passthrough so old URLs still resolve.
Preload the LCP hero image on the homepage (fetchpriority=high). All
<img> carry width/height via the image shortcode (CLS).

* ci(deploy): build-then-sync, cache headers, safe concurrency

Rename main.yml -> deploy.yaml (org convention). Build with Eleventy
(npm ci && npm run build) and sync _site/ instead of the repo root, so
only built output ships (no source/templates/node_modules). Split
Cache-Control (1-day assets, no-cache HTML) and keep /* invalidation
since filenames are not yet fingerprinted. concurrency cancel-in-progress
false so a deploy is never cut mid sync. ci.yaml validates _site/ via
ci-static build mode.

* docs: README for the Eleventy build and structure

* fix(security): wire services form, guard build, harden deploy

Fable build-review findings:
- BLOCK: services puts .contact-form on the <form> itself (contact uses a
  wrapper div), so form.js selector '.contact-form form' never matched it
  — the services lead form submitted natively with an empty reCAPTCHA
  token. Selector now also matches form.contact-form.
- Guard the build before the --delete S3 sync: require index/contact/404
  and >=40 files, so a silently-empty build can never wipe the live bucket.
- npm ci --ignore-scripts on deploy (build verified to pass) to shrink the
  supply-chain window on the OIDC-credentialed runner.
- Escape quotes in the image shortcode alt text.
2026-06-12 17:02:06 -04:00
Adam Moussa
a7d347b7d7 Update hardcoded copyright year in footer with document.write(new Date()... on all page footers 2026-04-30 12:21:09 -04:00
Adam Moussa
1906f10891 Update sitewide nav and footer links from /career/ to /careers/ 2026-04-30 11:59:10 -04:00
Adam Moussa
0345c1ed18 Extract shared CSS into central main.css stylesheet
Move ~2,600 lines of duplicated CSS (reset, tokens, typography, nav,
footer, buttons, mobile menu, page hero, CTA, form base styles, and
shared responsive breakpoints) into /assets/css/main.css. Each page
now only contains page-specific styles inline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 15:11:10 -04:00
Adam Moussa
a208794404 Add 404 page, font preloading, JSON-LD schema, and reCAPTCHA badge fix
- Add custom 404.html page with branded design
- Preload Google Fonts stylesheet on all 9 pages for faster rendering
- Add LocalBusiness JSON-LD structured data on homepage for SEO
- Hide reCAPTCHA v3 floating badge on form pages and add required
  Google attribution text in footer

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 14:49:39 -04:00
Adam Moussa
9a6fdff2f8 Rewrite all interior pages as clean static HTML
Strip all WordPress/Elementor markup from 8 interior pages and rebuild
with clean semantic HTML, inline CSS design system, always-white nav,
Basin form backends with AJAX submission, and canonical/OG meta tags.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 14:40:55 -04:00
Adam Moussa
d2e8839fcc Strip WordPress version strings from stylesheet URLs
Removed ver=6.8.1 query parameters from Google Fonts and block-library
CSS URLs to avoid cache-busting on WP version changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 19:23:36 -04:00
Adam Moussa
a2818678d1 Remove metform CSS references and plugin files
Removed 4 metform stylesheet link tags (cute-alert, text-editor,
metform-ui, metform-style) from all pages and deleted the metform
plugin directory since the form now uses Basin.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 19:23:04 -04:00
Adam Moussa
17b9ade9bb Convert all images to WebP format for faster page loads
Converted 50+ JPG/PNG images to WebP using cwebp, updated all HTML
references, and removed original files. Favicon PNGs preserved for
browser compatibility. Orphan unreferenced images also removed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 19:21:51 -04:00
Adam Moussa
e1f7e05bfb Fix broken footer layout caused by orphaned metform div tags
The earlier metform cleanup removed inner divs but left the parent
529865a2 container and its closing tags, breaking the DOM nesting
of the footer. Removed the entire dead newsletter/metform section
from all pages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 19:15:16 -04:00
Adam Moussa
80bed32ad1 Wire contact form to Basin and remove dead metform artifacts
- Updated contact page form to submit to Basin endpoint
- Cleaned up field names (first_name, last_name, phone, etc.)
- Removed hidden WordPress fields (post_id, form_id, nonces)
- Removed dead metform widget divs from all 9 pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 19:05:02 -04:00
Adam Moussa
ccbc29c06b Standardize meta tags: add og:image and update robots directive
Added og:image meta tag to all 9 pages and updated robots from
just max-image-preview to include explicit index,follow directive.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:51:20 -04:00
Adam Moussa
c1407df2d5 Add descriptive alt text to all images for accessibility
Added meaningful alt attributes to all 54+ images across the site
including logos, service icons, project photos, and team images.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:47:41 -04:00
Adam Moussa
622837c65e Remove WordPress and Elementor generator meta tags
Strip version-revealing generator tags that expose the tech stack.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:46:22 -04:00
Adam Moussa
561583ef9f Remove WordPress API, feed, and oEmbed links from all pages
Strip RSS/Atom feed links, wp-json API endpoints, EditURI/xmlrpc,
shortlink, and oEmbed discovery links that serve no purpose on
a static site and expose the old WordPress stack.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:45:49 -04:00
Adam Moussa
fc3ae4ad14 Replace placeholder contact info with real company details
Updated address, phone, and email across all 9 pages from dummy
values to actual Sea Haven Industries contact information.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:43:59 -04:00
Adam Moussa
a252b49cff Fix: Wording in ToS for clarity 2026-04-04 18:38:02 -04:00
Adam Moussa
4fec76677d Fix Terms of Service page missing hero banner styling
Align body classes and Elementor wrapper to use elementor-572 selectors
so the shared post-572.css banner styles (background image, overlay,
padding) apply correctly, matching the Privacy Policy page layout.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:34:18 -04:00
Adam Moussa
ae4431dec8 Consolidate CSS: remove unused stylesheets and combine widget/animation CSS
Remove 6 WordPress editor stylesheets (269KB) never needed on frontend,
unused widget-image-box CSS, SJB plugin CSS from non-job pages, duplicate
Font Awesome, and FA v4 shims from pages without v4 icons. Consolidate
10 widget CSS files and 4 animation CSS files into inlined combined blocks.
Reduces stylesheet links from ~40+ to ~20 per page.

Also adds CSS-only nav dropdown fix with arrow indicator for the About >
Social Accountability submenu that was missing from the static export.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:26:03 -04:00
Adam Moussa
2e6a771cf8 Add Privacy Policy and Terms of Service pages
Create placeholder privacy policy and terms of service pages using
the existing site template. Link footer text on all pages to the new
URLs and add both to the sitemap.

These are informational templates and do not constitute legal advice.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 17:53:56 -04:00