Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
37 changes: 37 additions & 0 deletions __tests__/components/build/Auth-copy.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// @vitest-environment jsdom
import { describe, it, expect, beforeAll, afterEach } from 'vitest'
import React from 'react'
import { createRoot, type Root } from 'react-dom/client'
import { act } from 'react'

beforeAll(() => {
;(globalThis as any).React = React
;(globalThis as any).IS_REACT_ACT_ENVIRONMENT = true
})

import { BrandPanel } from '@/components/build/screens/Auth'

let host: HTMLElement
let root: Root
function render(node: React.ReactElement) {
host = document.createElement('div')
document.body.appendChild(host)
root = createRoot(host)
act(() => { root.render(node) })
}
afterEach(() => {
act(() => { root?.unmount() })
host?.remove()
})

describe('Auth.tsx BrandPanel — plain language (#BLD-11)', () => {
it('does not say "primitives" or "building blocks"', () => {
render(React.createElement(BrandPanel))
expect(host.textContent).not.toMatch(/primitives|building blocks/i)
})

it('names a concrete outcome (website, plan, or customers)', () => {
render(React.createElement(BrandPanel))
expect(host.textContent).toMatch(/website|plan|customers/i)
})
})
41 changes: 41 additions & 0 deletions __tests__/components/build/Landing-what-you-get.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// @vitest-environment jsdom
import { describe, it, expect, vi, beforeAll, afterEach } from 'vitest'
import React from 'react'
import { createRoot, type Root } from 'react-dom/client'
import { act } from 'react'

beforeAll(() => {
;(globalThis as any).React = React
;(globalThis as any).IS_REACT_ACT_ENVIRONMENT = true
})

vi.mock('@/contexts/build-context', () => ({ useBuild: () => ({ dispatch: vi.fn() }) }))
vi.mock('next-auth/react', () => ({ useSession: () => ({ data: null, status: 'unauthenticated' }) }))

import { Landing } from '@/components/build/screens/Landing'

let host: HTMLElement
let root: Root
function render(node: React.ReactElement) {
host = document.createElement('div')
document.body.appendChild(host)
root = createRoot(host)
act(() => { root.render(node) })
}
afterEach(() => {
act(() => { root?.unmount() })
host?.remove()
vi.clearAllMocks()
})

describe('Landing — what you get + physical business framing (#BLD-11)', () => {
it('names a concrete software-track deliverable (an app)', () => {
render(React.createElement(Landing))
expect(host.textContent).toMatch(/app/i)
})

it('explicitly names a physical/local business example', () => {
render(React.createElement(Landing))
expect(host.textContent).toMatch(/bakery|gym|landscaping|local business/i)
})
})
6 changes: 3 additions & 3 deletions components/build/screens/Auth.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { decideLimitAction } from '@/lib/build/value-moment'
import { toE164 } from '@/lib/build/phone'
import { TurnstileWidget } from '@/components/turnstile-widget'

function BrandPanel() {
export function BrandPanel() {
return (
// #940-follow-up (accessibility audit, 2026-10-05): this tagline is
// decorative/supplementary brand copy, not a document-outline heading —
Expand All @@ -25,8 +25,8 @@ function BrandPanel() {
// itself changed, since nothing here introduces a real page section.
<aside className="m-auth-brand">
<span className="m-eyebrow" style={{ color: '#fff' }}>AINATIVE BUILDER</span>
<p className="m-artifact m-auth-statement">Compose intelligent products and AI-native companies.</p>
<p className="m-auth-subhead">Your idea is the input. AINative primitives are the building blocks. Cody builds the rest.</p>
<p className="m-artifact m-auth-statement">Describe your idea.</p>
<p className="m-auth-subhead">Cody builds the website, the plan, and your first customers.</p>
<span className="m-mono m-auth-domain">builder.ainative.studio</span>
</aside>
)
Expand Down
16 changes: 16 additions & 0 deletions components/build/screens/Landing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,22 @@ export function Landing() {
</div>
</main>

{/* #BLD-11 — "what you get", in normal document flow (not part of the
pinned-scroll beat animation above, which is tuned to a fixed
4-beat sequence — see seg()'s hard-coded breakpoints). Names
concrete outcomes for both tracks, including physical/local
businesses, which the hero beats above never mention. */}
<section className="m-land-beat" aria-label="What you get" style={{ position: 'relative', padding: '64px 8vw' }}>
<h2 className="m-land-title" style={{ fontSize: 'clamp(28px,4vw,44px)', margin: '0 0 20px' }}>What you actually get</h2>
<p style={{ fontSize: 18, lineHeight: 1.5, maxWidth: '60ch' }}>
Building software? You get a real, running app — not a mockup.
Running a bakery, a gym, a landscaping company, or any other local
business? Cody builds the website, the customer intake forms, and
the first-customer outreach plan — no code, no software background
needed either way.
</p>
</section>

{/* footer */}
<footer className="m-land-foot">
<a href="/showcase">Showcase</a>
Expand Down
Loading