Skip to content

fix(ui): pass boolean inert for interactive captcha - #9935

Merged
wobsoriano merged 5 commits into
mainfrom
carp/fix-ui-captcha-inert-boolean
Sep 25, 2026
Merged

wobsoriano merged 5 commits into
mainfrom
carp/fix-ui-captcha-inert-boolean

Conversation

@alexcarpenter

Copy link
Copy Markdown
Member

Description

Sign-in and sign-up start screens passed inert="" when the captcha became interactive. React 19 treats inert as a boolean, so that empty string warns and does not inert the form.

This wires those screens through inertProps() from @clerk/shared/inert, which already landed in #8820 for React 18/19.

Supersedes #9835 (original author @ArjunCodess, credited as co-author).

Fixes #9611

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring / dependency upgrade / documentation
  • other:

Co-authored-by: Arjun Vijay Prakash <arjunv.prakash12345@gmail.com>
@changeset-bot

changeset-bot Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: cb3336b

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
Name Type
@clerk/ui Patch
@clerk/chrome-extension Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercel Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
clerk-js-sandbox Ready Ready Preview Sep 25, 2026 8:46pm UTC
swingset Ready Ready Preview Sep 25, 2026 8:46pm UTC

Request Review

@coderabbitai

coderabbitai Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Team

Run ID: ddda9390-afd9-4e59-8faa-07429a0e8f24

📥 Commits

Reviewing files that changed from the base of the PR and between fd9aa80 and cb3336b.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Team

Run ID: cb8296f7-4379-416e-b17f-1d7419ce9b2e

📥 Commits

Reviewing files that changed from the base of the PR and between 0ee4ee2 and 99f7f4d.

📒 Files selected for processing (5)
  • .changeset/fix-ui-captcha-inert-boolean.md
  • packages/ui/src/components/SignIn/SignInStart.tsx
  • packages/ui/src/components/SignIn/__tests__/SignInStart.test.tsx
  • packages/ui/src/components/SignUp/SignUpStart.tsx
  • packages/ui/src/components/SignUp/__tests__/SignUpStart.test.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go (manual)
  • clerk/dashboard (manual)
  • clerk/accounts (manual)
  • clerk/backoffice (manual)
  • clerk/clerk (manual)
  • clerk/clerk-docs (manual)
  • clerk/cloudflare-workers (manual)
  • clerk/cli (auto-detected)
  • clerk/clerk-ios (auto-detected)
  • clerk/clerk-android (auto-detected)

Included review availability: 2 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 6 reviews per hour.


📝 Walkthrough

Walkthrough

Sign-in and sign-up now use inertProps(captchaIsInteractive) on their main columns instead of inline inert attributes. Both flows retain their existing conditional display: none behavior. Their CAPTCHA spotlight tests now check for the inert attribute on an ancestor. A patch changeset records the change.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~8 minutes

Severity of issue fixed: Low

Suggested reviewers: wobsoriano

Merge Risk: ⚪ Minimal · up to c0ddf

The CAPTCHA flows now use the boolean inert helper, and both tests check the interactive state. No actionable merge risk is evident in the supplied changes.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 4 files. (1 skipped: 1 … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the UI bug fix: passing a boolean inert value for interactive CAPTCHA behavior. It is concise and matches the main changes.
Description check ✅ Passed The description explains the React 19 warning, the inertProps() implementation, the affected sign-in and sign-up screens, and the linked issue. It is directly related to the changeset.
Linked Issues check ✅ Passed The PR satisfies [#9611]. SignInStart.tsx and SignUpStart.tsx replace inert={captchaIsInteractive ? '' : undefined} with inertProps(captchaIsInteractive). This removes the empty-string value a…
Out of Scope Changes check ✅ Passed The changes stay within [#9611]. They update the two affected start components, add focused assertions for both CAPTCHA flows, and add a package changeset that documents the React 19-safe fix. No unre…
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 4 files. (1 skipped: 1 unsupported.)


Comment @coderabbitai help to get the list of available commands.

@pkg-pr-new

pkg-pr-new Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9935

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9935

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9935

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9935

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9935

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9935

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9935

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9935

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9935

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9935

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9935

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9935

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9935

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9935

@clerk/mosaic

npm i https://pkg.pr.new/@clerk/mosaic@9935

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9935

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9935

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9935

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9935

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9935

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9935

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9935

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9935

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9935

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9935

commit: cb3336b

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-09-25T20:47:03.465Z

Summary

Metric Count
Packages analyzed 19
Packages with changes 1
🔴 Breaking changes 1
🟡 Non-breaking changes 0
🟢 Additions 0

Warning
1 breaking change(s) detected - Major version bump required

🤖 This report was reviewed by claude-sonnet-4-6.

🔴 Breaking changes index (1)

Every breaking change, up front. Full diffs are in the package sections below.

Package Subpath Change
@clerk/ui ./themes/experimental createTheme

@clerk/ui

Current version: 1.36.0
Recommended bump: MAJOR → 2.0.0

Subpath ./themes/experimental

🔴 Breaking Changes (1)

Changed: createTheme
// ... 4 unchanged lines elided ...
      theme: InternalTheme;
    }) => Elements);
    theme?: (BaseTheme | BaseTheme[]) | undefined;
-   options?: Options | undefined;
-   variables?: Variables | undefined;
-   captcha?: CaptchaAppearanceOptions | undefined;
+   options?: import("@clerk/ui/internal").Options | undefined;
+   variables?: import("@clerk/ui/internal").Variables | undefined;
+   captcha?: import("@clerk/ui/internal").CaptchaAppearanceOptions | undefined;
    cssLayerName?: string | undefined;
  }

Static analyzer: Breaking change in function createTheme: Return type changed: {__type:"prebuilt_appearance";name?:string;elements?:((params:{theme:import("@clerk/ui").~InternalTheme;})=>import("@clerk/ui").~Elements)|import("@clerk/ui").~Elements;theme?:(import("@clerk/ui").~BaseTheme|import("@clerk/ui").~BaseTheme[])|undefined;options?:import("@clerk/ui").~Options|undefined;variables?:import("@clerk/ui").~Variables|undefined;captcha?:import("@clerk/ui").~CaptchaAppearanceOptions|undefined;cssLayerName?:string|undefined;} → {__type:"prebuilt_appearance";name?:string;elements?:!unknown|((params:{theme:import("@clerk/ui").~InternalTheme;})=>!unknown);theme?:(!unknown|!unknown[])|undefined;options?:import("@clerk/ui/internal").Options|undefined;variables?:import("@clerk/ui/internal").Variables|undefined;captcha?:import("@clerk/ui/internal").CaptchaAppearanceOptions|undefined;cssLayerName?:string|undefined;}

🤖 AI review (confirmed) (72%): The options, variables, and captcha fields of the return type now reference @clerk/ui/internal, which has "unknown" resolution status (package not found), meaning consumers cannot resolve these types — per rule 12, structural equivalence does not rescue a non-resolvable specifier.

Migration: If your code reads or types against options, variables, or captcha on the createTheme return value, update your imports to match whatever entry point @clerk/ui now exports those types from, or use ReturnType<typeof createTheme> to infer the type structurally.


Report generated by Break Check

Last ran on cb3336b.

@wobsoriano
wobsoriano merged commit 485eba4 into main Sep 25, 2026
51 checks passed
@wobsoriano
wobsoriano deleted the carp/fix-ui-captcha-inert-boolean branch September 25, 2026 22:43

This branch was successfully deployed

2 active deployments
Preview – swingset — cb3336b9 Deployed Sep 25, 2026 by vercel[bot]
Preview – clerk-js-sandbox — cb3336b9 Deployed Sep 25, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

@clerk/ui: SignIn/SignUp captcha flow passes inert="" instead of boolean true, triggering React 19 console warning

2 participants