Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
70ac1ff
chore(ds): use status tokens for warning and critical callouts (#1)
MP2EZ May 23, 2026
6e9f01b
fix(a11y): add skip-to-content link and main landmark id (#2)
MP2EZ May 23, 2026
00d9d62
chore(test): scaffold vitest and add waitlist route tests (#3)
MP2EZ May 23, 2026
2771b75
test(ab): cover variant assignment, cookie lookup, and conversion log…
MP2EZ May 23, 2026
e87461f
fix(sec): unconditional cookie Secure + site-wide security headers (#6)
MP2EZ May 23, 2026
51d8ad2
chore(ts): enable strict flags + fix ab-testing types (#9)
MP2EZ May 23, 2026
eaeaa70
perf: extract /philosophy accordions into client subcomponent (#11)
MP2EZ May 23, 2026
ea69437
fix(a11y): label expansion, aria-current, decorative-glyph hiding (#7)
MP2EZ May 23, 2026
32d6ec3
fix(perf): move splash redirect to server-side layout (#8)
MP2EZ May 23, 2026
46b24d3
fix(sec): zod body validation on /api/waitlist (#12)
MP2EZ May 23, 2026
4776436
chore(deps): bump @mp2ez/being-design-system from ^1.0.1 to ^1.8.0
MP2EZ May 23, 2026
2023d49
Merge pull request #13 from MP2EZ/chore/bump-design-system-1.8.0
MP2EZ May 23, 2026
c30cc8a
chore(ci): render smoke tests + PR-time CI workflow (#14)
MP2EZ May 23, 2026
6bc524f
chore(ds): migrate .legal-content to DS 1.8 typography + spacing toke…
MP2EZ May 23, 2026
a09915d
chore(ds): migrate rounded-{sm,md,lg,xl,2xl} → DS-aligned names (#17)
MP2EZ May 23, 2026
77a75c9
chore(ci): wrangler dev smoke against /api/waitlist (#18)
MP2EZ May 23, 2026
fa2faeb
chore(ci): typecheck + regulated-content gates + headers smoke (#19)
MP2EZ May 23, 2026
ad27d33
fix(api): malformed waitlist body returns 400 'Invalid JSON' (#20)
MP2EZ May 23, 2026
9fbd0a6
test(middleware): cookie config + A/B variant assignment (#21)
MP2EZ May 23, 2026
23437ba
fix(Button): discriminated union prevents disabled+href + tests (#23)
MP2EZ May 23, 2026
bc61b16
test(ui): client-component coverage for splash, accordions, layout (#22)
MP2EZ May 23, 2026
a208f8b
fix(legal): resolve TBD dates and soften unverified accessibility cla…
MP2EZ May 24, 2026
1d4df45
fix(copy): trial duration 28 days → 1 month for Apple intro-offer ali…
MP2EZ May 24, 2026
ebe58fa
fix(copy): remove HIPAA-level + clinical terminology from marketing (…
MP2EZ May 24, 2026
69f2f92
fix(legal): remove /hipaa page and footer link (#24)
MP2EZ May 24, 2026
0b37284
fix(legal): remove /privacy-practices ghost page (#25)
MP2EZ May 24, 2026
910affb
fix(legal): remove /do-not-sell ghost page (#26)
MP2EZ May 24, 2026
2d6ca6e
fix(legal): remove unlinked /disclaimers route (#30)
MP2EZ May 24, 2026
8addbcb
feat(legal): add /privacy/multi-state route and footer links (#31)
MP2EZ May 25, 2026
487ecc3
feat(privacy): add Sec-GPC server-side detection + cookie policy upda…
MP2EZ May 25, 2026
bd5c648
fix(perf): cache parsed markdown per Worker isolate to avoid Error 11…
MP2EZ May 25, 2026
c742e16
fix(theme): register brand tokens in @theme + migrate v3 opacity synt…
MP2EZ May 25, 2026
516c686
fix(layout): move standalone routes into (main) + audit findings (#35)
MP2EZ May 25, 2026
9cb4a50
feat(launch): repurpose /download as waitlist + expose main site in p…
MP2EZ May 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 166 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
name: CI

on:
pull_request:
branches: [main, preview]

jobs:
test:
runs-on: ubuntu-latest
name: Lint + Tests
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Checkout legal content from being repo
uses: actions/checkout@v4
with:
repository: mp2ez/being
ref: development
token: ${{ secrets.GH_PACKAGES_TOKEN }}
path: .tmp-being
sparse-checkout: |
docs/legal
sparse-checkout-cone-mode: false

- name: Copy legal files to content directory
run: |
mkdir -p content/legal
cp -r .tmp-being/docs/legal/* content/legal/
rm -rf .tmp-being

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Configure npm for GitHub Packages
run: |
echo "//npm.pkg.github.com/:_authToken=${{ secrets.GH_PACKAGES_TOKEN }}" >> .npmrc

- name: Install dependencies
run: npm ci

- name: Lint
run: npm run lint

- name: Typecheck
run: npm run typecheck

- name: Test
run: npm test

wrangler-smoke:
runs-on: ubuntu-latest
name: Wrangler runtime smoke
env:
NOTION_TOKEN: test-token-not-used
NOTION_WAITLIST_DB_ID: test-db-not-used
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Checkout legal content from being repo
uses: actions/checkout@v4
with:
repository: mp2ez/being
ref: development
token: ${{ secrets.GH_PACKAGES_TOKEN }}
path: .tmp-being
sparse-checkout: |
docs/legal
sparse-checkout-cone-mode: false

- name: Copy legal files to content directory
run: |
mkdir -p content/legal
cp -r .tmp-being/docs/legal/* content/legal/
rm -rf .tmp-being

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Configure npm for GitHub Packages
run: |
echo "//npm.pkg.github.com/:_authToken=${{ secrets.GH_PACKAGES_TOKEN }}" >> .npmrc

- name: Install dependencies
run: npm ci

- name: Build worker with OpenNext
run: npx opennextjs-cloudflare build

- name: Start wrangler dev in background
run: |
npx wrangler dev --port 8787 --local > wrangler.log 2>&1 &
echo $! > wrangler.pid

- name: Wait for worker readiness
run: |
for i in {1..30}; do
if curl -sf -o /dev/null http://localhost:8787/; then
echo "Worker ready after ${i} attempt(s)"
exit 0
fi
sleep 2
done
echo "Worker did not start; logs:"
cat wrangler.log
exit 1

- name: Smoke test /api/waitlist
run: |
HTTP_CODE=$(curl -s -o /tmp/body -w "%{http_code}" \
-X POST http://localhost:8787/api/waitlist \
-H "Content-Type: application/json" \
-d '{}')
echo "Response body:"
cat /tmp/body
echo
if [ "$HTTP_CODE" != "400" ]; then
echo "Expected HTTP 400, got $HTTP_CODE"
exit 1
fi
if ! grep -q "Valid email required" /tmp/body; then
echo "Expected 'Valid email required' in response body"
exit 1
fi
echo "Smoke test passed."

- name: GET /crisis renders + security headers present
run: |
curl -s -i -o /tmp/crisis.txt http://localhost:8787/crisis
echo "--- /crisis response headers ---"
head -20 /tmp/crisis.txt
if ! head -1 /tmp/crisis.txt | grep -q " 200 "; then
echo "Expected HTTP 200 on /crisis"
exit 1
fi
if ! grep -qi "988" /tmp/crisis.txt; then
echo "Expected '988' in /crisis body"
exit 1
fi
if ! grep -qi "strict-transport-security" /tmp/crisis.txt; then
echo "Missing Strict-Transport-Security header"
exit 1
fi
if ! grep -qi "content-security-policy" /tmp/crisis.txt; then
echo "Missing Content-Security-Policy header"
exit 1
fi
if ! grep -qi "x-frame-options: DENY" /tmp/crisis.txt; then
echo "Missing X-Frame-Options: DENY header"
exit 1
fi
echo "GET /crisis smoke + headers smoke passed."

- name: Stop wrangler dev
if: always()
run: |
if [ -f wrangler.pid ]; then
kill "$(cat wrangler.pid)" 2>/dev/null || true
fi
6 changes: 5 additions & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@ jobs:
- name: Build with OpenNext
run: npx opennextjs-cloudflare build
env:
NEXT_PUBLIC_SHOW_FULL_SITE: ${{ github.ref_name == 'preview' && 'true' || 'false' }}
# Always serve the full site (both preview and main). The splash at /
# is now unreachable in deployed envs — it stays in the codebase as
# an emergency-fallback option but the runtime redirect carries
# / → /home. /download serves as the pre-launch waitlist page.
NEXT_PUBLIC_SHOW_FULL_SITE: 'true'

- name: Deploy to Cloudflare Workers
uses: cloudflare/wrangler-action@v3
Expand Down
57 changes: 18 additions & 39 deletions app/accessibility/page.tsx → app/(main)/accessibility/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ export default function AccessibilityPage() {
Accessibility Statement
</h1>
<p className="text-gray-700">
<strong>Last Updated:</strong> [DATE - TO BE DETERMINED]
<strong>Last Updated:</strong> May 23, 2026
</p>
</header>

<div className="prose prose-lg max-w-none">
{/* Our Commitment */}
<section className="bg-white p-8 rounded-lg border border-gray-300 mb-8">
<section className="bg-white p-8 rounded-large border border-gray-300 mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Our Commitment to Accessibility
</h2>
Expand All @@ -34,7 +34,7 @@ export default function AccessibilityPage() {
</section>

{/* Accessibility Features */}
<section className="bg-white p-8 rounded-lg border border-gray-300 mb-8">
<section className="bg-white p-8 rounded-large border border-gray-300 mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Accessibility Features
</h2>
Expand Down Expand Up @@ -109,7 +109,7 @@ export default function AccessibilityPage() {
</section>

{/* Known Limitations */}
<section className="bg-white p-8 rounded-lg border border-gray-300 mb-8">
<section className="bg-white p-8 rounded-large border border-gray-300 mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Known Limitations
</h2>
Expand All @@ -129,7 +129,7 @@ export default function AccessibilityPage() {
</section>

{/* Standards We Follow */}
<section className="bg-white p-8 rounded-lg border border-gray-300 mb-8">
<section className="bg-white p-8 rounded-large border border-gray-300 mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Standards We Follow
</h2>
Expand All @@ -138,10 +138,6 @@ export default function AccessibilityPage() {
<span className="text-accent-600 mr-2">•</span>
<span><strong>WCAG 2.1 Level AA:</strong> Web Content Accessibility Guidelines</span>
</li>
<li className="flex items-start">
<span className="text-accent-600 mr-2">•</span>
<span><strong>Section 508:</strong> U.S. federal accessibility requirements</span>
</li>
<li className="flex items-start">
<span className="text-accent-600 mr-2">•</span>
<span><strong>iOS Accessibility:</strong> Apple Human Interface Guidelines</span>
Expand All @@ -153,40 +149,23 @@ export default function AccessibilityPage() {
</ul>
</section>

{/* Testing & Compliance */}
<section className="bg-white p-8 rounded-lg border border-gray-300 mb-8">
{/* Reporting Accessibility Issues */}
<section className="bg-white p-8 rounded-large border border-gray-300 mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Testing & Compliance
Reporting Accessibility Issues
</h2>
<p className="text-gray-700 leading-relaxed mb-4">
We regularly test Being's accessibility through:
<p className="text-gray-700 leading-relaxed">
We design to WCAG 2.1 Level AA standards. If you encounter an
accessibility barrier, please report it to{' '}
<a href="mailto:accessibility@being.fyi" className="text-accent-600 hover:underline">
accessibility@being.fyi
</a>{' '}
and we will work to address it.
</p>
<ul className="space-y-2 text-gray-700">
<li className="flex items-start">
<span className="text-accent-600 mr-2">•</span>
<span>Automated accessibility testing with aXe and Lighthouse</span>
</li>
<li className="flex items-start">
<span className="text-accent-600 mr-2">•</span>
<span>Manual testing with VoiceOver, TalkBack, and NVDA screen readers</span>
</li>
<li className="flex items-start">
<span className="text-accent-600 mr-2">•</span>
<span>Keyboard-only navigation testing</span>
</li>
<li className="flex items-start">
<span className="text-accent-600 mr-2">•</span>
<span>Color contrast validation</span>
</li>
<li className="flex items-start">
<span className="text-accent-600 mr-2">•</span>
<span>User testing with people who rely on assistive technologies</span>
</li>
</ul>
</section>

{/* Feedback & Support */}
<section className="bg-white p-8 rounded-lg border border-gray-300 mb-8">
<section className="bg-white p-8 rounded-large border border-gray-300 mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Feedback & Support
</h2>
Expand All @@ -212,7 +191,7 @@ export default function AccessibilityPage() {
</section>

{/* Third-Party Content */}
<section className="bg-white p-8 rounded-lg border border-gray-300 mb-8">
<section className="bg-white p-8 rounded-large border border-gray-300 mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Third-Party Content
</h2>
Expand All @@ -228,7 +207,7 @@ export default function AccessibilityPage() {
</section>

{/* Continuous Improvement */}
<section className="bg-gray-50 p-8 rounded-lg border-l-4 border-accent-600 mb-8">
<section className="bg-gray-50 p-8 rounded-large border-l-4 border-accent-600 mb-8">
<h2 className="text-2xl font-bold text-gray-900 mb-4">
Our Commitment to Continuous Improvement
</h2>
Expand Down
Loading
Loading