React's injectInternals() calls hook.inject(renderer) before it will ever
invoke onCommitFiberRoot. When inject is missing, React's try/catch silently
bails and injectedHook stays null — our handler is never reached regardless
of how correctly onCommitFiberRoot is set up.
Fix: define inject() on the hook we create (returns a renderer ID and stores
the renderer in hook.renderers, matching the React DevTools spec). Also
patches inject onto any existing stub hook that lacks it, so third-party
minimal hooks don't silently block registration.
This is the root cause of the 'Static HTML page' false positive on apps
that don't have the React DevTools browser extension installed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Next.js 13+ App Router calls hydrateRoot on <html> or <body> directly
(not on a #__next div), so __reactFiber$ annotations land on
document.documentElement or document.body.
Changes:
- Add document.documentElement to the candidate list (covers App Router)
- Extract getFiber() helper to remove repeated key-scan loop
- Add DOM-wide fallback scan (querySelectorAll('*')) so any React app
is found regardless of its root container convention
- Remove the early !tree bail-out — post FIBER_TREE_UPDATE even with a
sparse tree, matching onCommitFiberRoot's behaviour
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Three related fixes for the canvas live-render panel:
1. captureExistingTree() in fiber-hook — retroactively walks the already-
mounted React fiber tree via __reactFiber$ DOM annotations. Called
immediately on READY (handles post-hydration race) and again at 2 s
(handles deferred hydration / Suspense). Prevents the 'Static HTML page'
false positive on React apps that mounted before the hook script ran.
2. Static-page timer bumped from 4 s → 8 s in LiveArtboard to give the
2-second captureExistingTree safety-net enough headroom before the
no-React verdict fires.
3. Route discovery same-origin fix applied to both renderer/fiber-hook.ts
and live-sdk/hook.ts — root-relative hrefs (starting with '/') are now
accepted regardless of origin so CLI-proxied pages (where links still
point to the original domain) expose their navigation routes correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the plain body background on auth pages with the product's canvas
aesthetic — the same canvasBg colour and radial dot-grid used by the
canvas editor, toggling correctly between dark and light themes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
EmptyArtboardContent.save() accepted any string as renderUrl — a relative
path or the Originmain app URL would cause the artboard iframe to resolve
against the Originmain origin, loading the app inside itself.
- Added URL validation (same as UrlOnboardingOverlay) with inline error UI
- toCanvasArtboard now validates renderUrl at read time so stale bad data
already in the DB is also guarded against
- CanvasArtboard now carries artboard_type, isolation_component,
isolation_file, isolation_props so phase-3 isolation artboards render
correctly; previously these fields were silently dropped by the hook
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Next.js only statically inlines NEXT_PUBLIC_* variables when accessed via
dot notation (process.env.NEXT_PUBLIC_SUPABASE_URL). The generic requireEnv
helper used bracket notation (process.env[name]) which Next.js cannot
replace at build time, causing the browser bundle to always see undefined
regardless of what is set in the Vercel dashboard.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
One userId reference survived the rename to email in WorkspaceSettingsForm,
causing a TypeScript build failure on Vercel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
InsertIntentDiff.author_id was renamed to author_email in the email
identity migration. useDiffs.ts still referenced the old field name in
its Omit<> types, causing the Next.js build to fail on Vercel and Render.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace all mismatched SVG icons in integrations.html (both the card grid
and the status section) with the exact paths from page.tsx:
- GitHub: correct octocat path (M12 2C6.477, not M12 0C5.37)
- Figma: 24×24 5-segment logo (was stretched 38×57 viewBox)
- Linear: official brand mark fill=#5e6ad2 (was 100×100 white diagonal)
- Cursor: actual prism brand logo (was a generic hexagon outline)
- TypeScript: clean T+S letterform on #3178c6 bg (was noisy stripe overlay)
- React: centred atom cx/cy=12 with r=2 dot (was off-centre cy=11)
- Status section: same fixes applied to the second logo set
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
.mkt-root a { color: inherit } had higher specificity than .mkt-btn-primary
{ color: var(--bg) }, causing all Link-based buttons to inherit body text
color (#0A0A0A in light mode) instead of the intended inverted color.
- Split anchor reset: text-decoration applies to all <a>, color:inherit only
to non-.mkt-btn anchors via :not(.mkt-btn) selector
- Switch .mkt-btn-primary text color to var(--fg-inv) which is always
guaranteed to contrast against a var(--fg) background in both themes
(rgba(255,255,255,0.92) in light, #09090B in dark)
- Fix CSS token violations: nav background, shadows, border-radius, mono font
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Canvas.tsx: removed the `e.target === e.currentTarget` guard on the
artboard-creation click handler. The canvas has a full-size
position:absolute transform layer that intercepts all events, making
`e.target` never equal to `e.currentTarget`. Artboard creation was
silently broken for every click.
Artboard.tsx: added `onMouseDown` stopPropagation to the artboard root
div so clicks on an existing artboard don't bubble up and trigger the
creation path now that the guard is gone.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@originmain/renderer was added as a devDependency during the CLI refactor
but pnpm-lock.yaml was not regenerated, causing Vercel frozen-lockfile CI failures.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>