') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); feat(ui,shared,localizations): Allow changing provider in self-serve SSO by LauraBeatris · Pull Request #8881 · clerk/javascript · GitHub
Skip to content

feat(ui,shared,localizations): Allow changing provider in self-serve SSO - #8881

Merged
iagodahlem merged 11 commits into
mainfrom
laura/orgs-1632-sdk-update-select-provider-to-be-part-of-configure-step
Jun 19, 2026
Merged

feat(ui,shared,localizations): Allow changing provider in self-serve SSO#8881
iagodahlem merged 11 commits into
mainfrom
laura/orgs-1632-sdk-update-select-provider-to-be-part-of-configure-step

Conversation

@LauraBeatris

@LauraBeatrisLauraBeatris commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Description

This PR introduces the ability to change the provider on the self-serve SSO flow, which creates a new enterprise connection.

It allows going back from configure to the select provider step, as well as navigating from the domains step to the select provider again.

CleanShot.2026-06-18.at.11.59.03.mp4

Other changes

  • Update the copy of all steps to align with current state of Figma prototype.
  • Fix size of segment controls for Identity Provider Metadata steps
  • Introduce alert on Identity Provider Metadata step, when connection is already active but user comes back to change metadata

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:

Summary by CodeRabbit

  • New Features
    • Added a “change provider” confirmation dialog to enterprise SSO setup.
    • Added a dismissible warning alert when an active enterprise connection already exists.
  • Improvements
    • Refreshed SSO/SAML guidance copy across providers, including updated “Sign on URL” and “test URL” terminology.
    • Improved SAML attribute-mapping UX, including Microsoft claim-name truncation with copy interaction and updated mapping table labels.
  • Bug Fixes
    • Improved wizard resume behavior to skip provider selection when an in-progress connection is already present.
  • Chores
    • Patch version updates for related packages.

@changeset-bot

changeset-botBot commented Jun 16, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6838daf

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

This PR includes changesets to release 22 packages
NameType
@clerk/localizationsPatch
@clerk/clerk-jsPatch
@clerk/sharedPatch
@clerk/uiPatch
@clerk/reactPatch
@clerk/chrome-extensionPatch
@clerk/expoPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/headlessPatch
@clerk/honoPatch
@clerk/mswPatch
@clerk/nextjsPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch
@clerk/testingPatch
@clerk/vuePatch
@clerk/swingsetPatch

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

vercelBot commented Jun 16, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 19, 2026 6:28pm
swingsetReadyReadyPreview, CommentJun 19, 2026 6:28pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Pro

Run ID: 344a9d3d-4c0a-402f-8642-a00cbb595b21

📥 Commits

Reviewing files that changed from the base of the PR and between f663a82 and 6838daf.

📒 Files selected for processing (24)
  • .changeset/nine-lies-eat.md
  • packages/localizations/src/en-US.ts
  • packages/shared/src/types/localization.ts
  • packages/ui/src/components/ConfigureSSO/ChangeProviderDialog.tsx
  • packages/ui/src/components/ConfigureSSO/ConfigureSSOWizard.tsx
  • packages/ui/src/components/ConfigureSSO/__tests__/ConfigureSSO.navigation.test.tsx
  • packages/ui/src/components/ConfigureSSO/hooks/useOrganizationEnterpriseConnection.ts
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlGoogleConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlMicrosoftConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlOktaConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/__tests__/SamlConfigureSteps.test.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/ActiveConnectionAlert.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationForm.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationModes.tsx
  • packages/ui/src/components/ConfigureSSO/steps/SelectProviderStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/TestConfigurationStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/__tests__/SelectProviderStep.test.tsx
  • packages/ui/src/components/ConfigureSSO/types.ts
  • packages/ui/src/components/OrganizationProfile/__tests__/OrganizationSecurityPage.test.tsx
  • packages/ui/src/customizables/elementDescriptors.ts
  • packages/ui/src/elements/Alert.tsx
  • packages/ui/src/internal/appearance.ts
💤 Files with no reviewable changes (22)
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/ActiveConnectionAlert.tsx
  • packages/ui/src/internal/appearance.ts
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/tests/SamlConfigureSteps.test.tsx
  • packages/ui/src/components/OrganizationProfile/tests/OrganizationSecurityPage.test.tsx
  • packages/ui/src/components/ConfigureSSO/types.ts
  • packages/ui/src/components/ConfigureSSO/hooks/useOrganizationEnterpriseConnection.ts
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationForm.tsx
  • packages/ui/src/components/ConfigureSSO/ChangeProviderDialog.tsx
  • packages/ui/src/elements/Alert.tsx
  • packages/ui/src/customizables/elementDescriptors.ts
  • packages/ui/src/components/ConfigureSSO/steps/TestConfigurationStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/SelectProviderStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/tests/SelectProviderStep.test.tsx
  • packages/ui/src/components/ConfigureSSO/tests/ConfigureSSO.navigation.test.tsx
  • packages/ui/src/components/ConfigureSSO/ConfigureSSOWizard.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlOktaConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationModes.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlGoogleConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlMicrosoftConfigureSteps.tsx
  • packages/shared/src/types/localization.ts
✅ Files skipped from review due to trivial changes (1)
  • .changeset/nine-lies-eat.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/localizations/src/en-US.ts

📝 Walkthrough

Walkthrough

Adds the ability to switch an enterprise SSO connection provider mid-wizard via a new ChangeProviderDialog confirmation modal. Introduces a changeProvider mutation that deletes the existing connection and creates a new one. Moves SelectProviderStep into a sub-wizard inside ConfigureStep with a connection-based guard. Revises SAML step UI copy and attribute-mapping schemas across Okta, Custom, Google, and Microsoft providers. Extends Alert component with optional dismiss button support.

Changes

SSO Provider Change Flow and SAML UI Revamp

Layer / File(s)Summary
Type contracts and localization schema updates
packages/ui/src/components/ConfigureSSO/types.ts, packages/shared/src/types/localization.ts, packages/ui/src/internal/appearance.ts, packages/ui/src/customizables/elementDescriptors.ts
Adds configure-provider to WizardStepId union; extends LocalizationResource schema with changeProviderDialog (title, subtitle, confirmButton, cancelButton) and activeConnectionWarning.title; removes step5/title fields from SAML Okta and Google flows; restructures custom SAML attribute-mapping from name/expression to attributeName/userAttribute; adds copyClaimName/copyClaimNameCopied to Microsoft attribute-mapping; removes paragraph1/step6 from Microsoft assign-users; extends ElementsConfig and APPEARANCE_KEYS with three change-provider-dialog selectors.
Localization copy updates across SSO and SAML flows
packages/localizations/src/en-US.ts
Updates selectProviderStep.subtitle, adds changeProviderDialog strings, revises testConfigurationStep and testResults copy (s/test SSO URL/test URL/), and rewrites SAML create-app/assign-users/identityProviderMetadata/attributeMapping instruction text for Okta Workforce, Custom SAML IdP, Google Workspace, and Microsoft Entra, including new copyClaimName UI strings and terminology refinements (e.g., "Sign on URL", "Reply URL (ACS URL)").
changeProvider mutation in useOrganizationEnterpriseConnection
packages/ui/src/components/ConfigureSSO/hooks/useOrganizationEnterpriseConnection.ts
Adds changeProvider(provider) to EnterpriseConnectionMutations interface; implements it as a delete-then-create async mutation using the current connection's domains (or organization domains as fallback); updates memo dependencies to include enterpriseConnection.
ChangeProviderDialog component
packages/ui/src/components/ConfigureSSO/ChangeProviderDialog.tsx
New component that returns null when closed; otherwise renders a Modal with canCloseModal=false and a Card containing localized title/subtitle derived from next/current provider labels, with Cancel/Confirm buttons controlled by isSubmitting state.
SelectProviderStep provider-switching logic and ProviderCard UI
packages/ui/src/components/ConfigureSSO/steps/SelectProviderStep.tsx
Refactors SelectProviderStep to detect provider changes and open ChangeProviderDialog instead of advancing immediately; adds providerLabel helper to derive localized labels; adds handleConfirmChangeProvider that calls changeProvider mutation; updates ProviderCard to use isSelected/onSelect props with revised explicit button styling; adds radiogroup aria-label.
ConfigureStep sub-wizard and ConfigureSSOWizard guard changes
packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx, packages/ui/src/components/ConfigureSSO/ConfigureSSOWizard.tsx
Rewrites ConfigureStep to always return JSX (non-nullable); constructs step config via useMemo with configure-provider guard based on hasConnection; sets initialStepId only when direction === 1. Updates ConfigureSSOWizard configure step guard to accept existing connection OR verified domains; removes top-level select-providerWizard.Match and SelectProviderStep import.
SAML provider step UI revisions (Okta, Custom, Google, and SegmentedControl)
packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlOktaConfigureSteps.tsx, packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx, packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlGoogleConfigureSteps.tsx, packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationModes.tsx
Removes Heading elements from create-app/assign-users/modes instruction sections across Okta and Custom flows; updates Okta create-app to use step4 instead of step5; updates Custom attribute-mapping table to attributeName/userAttribute keys with redistributed monospace styling; replaces Google create-app Heading with secondary-styled Text; removes Google step5 list item; adds size='lg' to SegmentedControl.
SAML Microsoft advanced UI refactoring with clipboard controls
packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlMicrosoftConfigureSteps.tsx
Introduces MicrosoftClaimNameCell subcomponent that truncates claim URIs, shows full value in tooltip, and provides copy button via useClipboard; removes assign-users paragraph1 and final list item; restructures service-provider step with inline ClipboardInput fields for spEntityId/acsUrl; changes attribute-mapping instruction title from Heading to Text with decimal list styling; repositions table between instruction segments; updates Step.Section layout props.
Alert dismiss support and SAML configuration panel
packages/ui/src/elements/Alert.tsx, packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/ActiveConnectionAlert.tsx, packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationForm.tsx
Extends Alert with optional onDismiss and dismissLabel props; conditionally renders close Button with Close icon when onDismiss provided. Introduces ActiveConnectionAlert that renders a warning when an active enterprise connection exists. Refactors IdentityProviderConfigurationForm to render ConfigurationPanel (with mode-specific logic) and ActiveConnectionAlert together.
Tests, navigation assertions, and changeset
.changeset/nine-lies-eat.md, packages/ui/src/components/ConfigureSSO/__tests__/ConfigureSSO.navigation.test.tsx, packages/ui/src/components/ConfigureSSO/steps/__tests__/SelectProviderStep.test.tsx, packages/ui/src/components/OrganizationProfile/__tests__/OrganizationSecurityPage.test.tsx, packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/__tests__/SamlConfigureSteps.test.tsx
Adds ConfigureSSO navigation test for existing connections skipping SelectProviderStep; expands SelectProviderStep coverage with changeProvider mock, same-provider advance, dialog open/confirm/cancel scenarios; updates OrganizationSecurityPage test to assert SelectProviderStep heading absent; updates SamlConfigureSteps test to use findByText regex; adds changeset documenting provider-switching feature.

Sequence Diagram(s)

sequenceDiagram
participant User
participant SelectProviderStep
participant ChangeProviderDialog
participant handleConfirmChangeProvider
participant changeProvider
participant ClerkAPI as Clerk API
User->>SelectProviderStep: selects different provider
SelectProviderStep->>SelectProviderStep: handleContinue detects provider change
SelectProviderStep->>ChangeProviderDialog: open dialog with provider labels
User->>ChangeProviderDialog: clicks Confirm
ChangeProviderDialog->>handleConfirmChangeProvider: invoke callback
handleConfirmChangeProvider->>changeProvider: changeProvider(newProvider)
changeProvider->>ClerkAPI: deleteEnterpriseConnection()
changeProvider->>ClerkAPI: createEnterpriseConnection(newProvider, domains)
ClerkAPI-->>changeProvider: new connection resource
changeProvider-->>handleConfirmChangeProvider: resolved
handleConfirmChangeProvider->>SelectProviderStep: advance to configure-provider
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • clerk/javascript#8715: Refactors the guard-based ConfigureSSO wizard navigation and step wiring in ConfigureSSOWizard and ConfigureStep that this PR reorganizes with the provider-change flow.
  • clerk/javascript#8799: Updates the ConfigureSSO wizard step graph wiring in ConfigureSSOWizard.tsx (step guards and match branches) alongside similar structural changes in this PR.
  • clerk/javascript#8864: Adjusts the ConfigureSSO wizard's step entry and resume behavior from the Security page, with overlapping changes to wizard step matching/guards and OrganizationSecurityPage test assertions.

🐰 Hop, hop, the provider can switch!
A dialog confirms with a magical click.
Delete and create, then onward we soar—
New copy and copy-buttons flutter galore!
Microsoft, Okta, Google too—
The wizard advances with fresh SSO! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main feature addition: enabling users to change their SSO provider during self-serve setup, which aligns directly with the PR's primary objective of provider-switching functionality.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

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

@pkg-pr-new

pkg-pr-newBot commented Jun 16, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/eslint-plugin

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

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

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: 6838daf

@LauraBeatris
LauraBeatrisforce-pushed the laura/orgs-1632-sdk-update-select-provider-to-be-part-of-configure-step branch from 32a5d20 to 3b7f05fCompareJune 16, 2026 17:36
@LauraBeatris
LauraBeatrisforce-pushed the laura/orgs-1632-sdk-update-select-provider-to-be-part-of-configure-step branch from 3b7f05f to ee5629aCompareJune 16, 2026 17:40
@LauraBeatris
LauraBeatrisforce-pushed the laura/orgs-1632-sdk-update-select-provider-to-be-part-of-configure-step branch from ee5629a to cbacb27CompareJune 16, 2026 17:41
@LauraBeatrisLauraBeatris self-assigned this Jun 16, 2026
@LauraBeatrisLauraBeatris changed the title feat(ui,shared): Allow changing provider in self-serve SSOfeat(ui,shared,localizations): Allow changing provider in self-serve SSOJun 16, 2026
@LauraBeatris
LauraBeatrisforce-pushed the laura/orgs-1632-sdk-update-select-provider-to-be-part-of-configure-step branch from 9115a35 to be00b3dCompareJune 16, 2026 20:38
@LauraBeatris
LauraBeatris marked this pull request as ready for review June 16, 2026 20:39
@LauraBeatris
LauraBeatrisforce-pushed the laura/orgs-1623-sdk-add-support-for-removing-domains branch from 1a593c1 to 09df811CompareJune 16, 2026 22:10
@LauraBeatris
LauraBeatrisforce-pushed the laura/orgs-1632-sdk-update-select-provider-to-be-part-of-configure-step branch from a6dcad8 to 52a1916CompareJune 16, 2026 22:11
@github-actions

github-actionsBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-19T18:31:18.165Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

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


@clerk/shared

Current version: 4.19.1
Recommended bump: MINOR → 4.20.0

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: __internal_LocalizationResource
Diff (before: 1943 lines, after: 1942 lines). Click to expand.
// ... 1277 unchanged lines elided ...
};
warning: LocalizationValue;
};
+ changeProviderDialog: {+ title: LocalizationValue<'provider'>;+ subtitle: LocalizationValue<'provider' | 'currentProvider'>;+ cancelButton: LocalizationValue;+ confirmButton: LocalizationValue;+ };
organizationDomainsStep: {
title: LocalizationValue;
subtitle: LocalizationValue;
formFieldLabel__domain: LocalizationValue;
formFieldInputPlaceholder__domain: LocalizationValue;
formButtonPrimary__add: LocalizationValue;
domainSuggestion: {
messageLabel: LocalizationValue<'domain'>;
formButtonPrimary__add: LocalizationValue<'domain'>;
};
domainCard: {
badge__verified: LocalizationValue;
badge__unverified: LocalizationValue;
verifiedAtLabel: LocalizationValue<'date'>;
removeButtonTooltip__lastVerifiedDomain: LocalizationValue;
removeButtonTooltip__lastVerifiedDomainActive: LocalizationValue;
txtRecord: {
instructions: LocalizationValue;
typeLabel: LocalizationValue;
hostLabel: LocalizationValue;
valueLabel: LocalizationValue;
};
};
removeDomainDialog: {
title: LocalizationValue;
subtitle__active: LocalizationValue<'domain'>;
subtitle__inactive: LocalizationValue<'domain'>;
cancelButton: LocalizationValue;
removeButton: LocalizationValue;
};
};
testConfigurationStep: {
title: LocalizationValue;
subtitle: LocalizationValue;
error__noSuccessfulTestRun: LocalizationValue;
testUrl: {
actionLabel__open: LocalizationValue;
};
testResults: {
title: LocalizationValue;
actionLabel__refresh: LocalizationValue;
polling: LocalizationValue;
status__success: LocalizationValue;
status__failed: LocalizationValue;
status__pending: LocalizationValue;
empty: {
title: LocalizationValue;
subtitle: LocalizationValue;
};
};
testRunDetails: {
title: LocalizationValue;
runDetails: {
sectionTitle: LocalizationValue;
timestamp: LocalizationValue;
status: LocalizationValue;
errorCode: LocalizationValue;
fullMessage: LocalizationValue;
actionLabel__copy: LocalizationValue;
actionLabel__copied: LocalizationValue;
};
parsedUserInfo: {
sectionTitle: LocalizationValue;
email: LocalizationValue;
firstName: LocalizationValue;
};
howToFix: {
sectionTitle: LocalizationValue;
actionLabel__viewDocumentation: LocalizationValue;
saml_user_attribute_missing: {
intro: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
step3: LocalizationValue;
};
saml_response_relaystate_missing: {
description: LocalizationValue;
};
saml_email_address_domain_mismatch: {
description: LocalizationValue;
};
oauth_access_denied: {
description: LocalizationValue;
};
oauth_token_exchange_error: {
description: LocalizationValue;
};
oauth_fetch_user_error: {
intro: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
};
};
};
};
configureStep: {
attributeMappingTable: {
badges: {
required: LocalizationValue;
optional: LocalizationValue;
};
+ };+ activeConnectionWarning: {+ title: LocalizationValue;+ dismiss: LocalizationValue;
};
samlOkta: {
mainHeaderTitle: LocalizationValue;
createAppStep: {
headerSubtitle: LocalizationValue;
createAppInstructions: {
title: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
step3: LocalizationValue;
step4: LocalizationValue;
- step5: LocalizationValue;
};
serviceProviderInstructions: {
title: LocalizationValue;
paragraph1: LocalizationValue;
paragraph2: LocalizationValue;
serviceProviderFields: {
acsUrl: {
label: LocalizationValue;
};
spEntityId: {
label: LocalizationValue;
};
};
};
completeSamlIntegrationInstructions: {
title: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
};
};
attributeMappingStep: {
headerSubtitle: LocalizationValue;
paragraph: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
attributeMappingTable: {
columns: {
name: LocalizationValue;
expression: LocalizationValue;
};
rows: {
email: {
name: LocalizationValue;
expression: LocalizationValue;
};
firstName: {
name: LocalizationValue;
expression: LocalizationValue;
};
lastName: {
name: LocalizationValue;
expression: LocalizationValue;
};
};
};
};
assignUsersStep: {
headerSubtitle: LocalizationValue;
assignUsersInstructions: {
- title: LocalizationValue;
paragraph: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
step3: LocalizationValue;
step4: LocalizationValue;
step5: LocalizationValue;
};
};
identityProviderMetadataStep: {
headerSubtitle: LocalizationValue;
modes: {
- title: LocalizationValue;
ariaLabel: LocalizationValue;
metadataUrl: LocalizationValue;
manual: LocalizationValue;
};
metadataUrl: {
label: LocalizationValue;
placeholder: LocalizationValue;
description: LocalizationValue;
};
manual: {
description: LocalizationValue;
signOnUrl: {
label: LocalizationValue;
placeholder: LocalizationValue;
};
issuer: {
label: LocalizationValue;
placeholder: LocalizationValue;
};
signingCertificate: {
label: LocalizationValue;
uploadFile: LocalizationValue;
replaceFile: LocalizationValue;
removeFile: LocalizationValue;
fileUploaded: LocalizationValue;
};
};
};
};
samlCustom: {
mainHeaderTitle: LocalizationValue;
createAppStep: {
headerSubtitle: LocalizationValue;
createAppInstructions: {
- title: LocalizationValue;
paragraph: LocalizationValue;
};
serviceProviderFields: {
acsUrl: {
label: LocalizationValue;
};
spEntityId: {
label: LocalizationValue;
};
};
};
attributeMappingStep: {
headerSubtitle: LocalizationValue;
paragraph: LocalizationValue;
attributeMappingTable: {
title: LocalizationValue;
columns: {
- userProfile: LocalizationValue;
attributeName: LocalizationValue;
+ userAttribute: LocalizationValue;
};
rows: {
email: {
- userProfile: LocalizationValue;
attributeName: LocalizationValue;
+ userAttribute: LocalizationValue;
};
firstName: {
- userProfile: LocalizationValue;
attributeName: LocalizationValue;
+ userAttribute: LocalizationValue;
};
lastName: {
- userProfile: LocalizationValue;
attributeName: LocalizationValue;
+ userAttribute: LocalizationValue;
};
};
};
};
assignUsersStep: {
headerSubtitle: LocalizationValue;
- title: LocalizationValue;
paragraph: LocalizationValue;
};
identityProviderMetadataStep: {
headerSubtitle: LocalizationValue;
modes: {
- title: LocalizationValue;
ariaLabel: LocalizationValue;
metadataUrl: LocalizationValue;
manual: LocalizationValue;
};
metadataUrl: {
label: LocalizationValue;
placeholder: LocalizationValue;
description: LocalizationValue;
};
manual: {
description: LocalizationValue;
signOnUrl: {
label: LocalizationValue;
placeholder: LocalizationValue;
};
issuer: {
label: LocalizationValue;
placeholder: LocalizationValue;
};
signingCertificate: {
label: LocalizationValue;
uploadFile: LocalizationValue;
replaceFile: LocalizationValue;
removeFile: LocalizationValue;
fileUploaded: LocalizationValue;
};
};
};
};
samlGoogle: {
mainHeaderTitle: LocalizationValue;
createAppStep: {
headerSubtitle: LocalizationValue;
createAppInstructions: {
title: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
step3: LocalizationValue;
step4: LocalizationValue;
- step5: LocalizationValue;
};
};
identityProviderMetadataStep: {
headerSubtitle: LocalizationValue;
modes: {
- title: LocalizationValue;
ariaLabel: LocalizationValue;
metadataFile: LocalizationValue;
manual: LocalizationValue;
};
metadataFile: {
label: LocalizationValue;
description: LocalizationValue;
uploadFile: LocalizationValue;
replaceFile: LocalizationValue;
removeFile: LocalizationValue;
fileUploaded: LocalizationValue;
};
manual: {
description: LocalizationValue;
signOnUrl: {
label: LocalizationValue;
placeholder: LocalizationValue;
};
issuer: {
label: LocalizationValue;
placeholder: LocalizationValue;
};
signingCertificate: {
label: LocalizationValue;
uploadFile: LocalizationValue;
replaceFile: LocalizationValue;
removeFile: LocalizationValue;
fileUploaded: LocalizationValue;
};
};
};
serviceProviderStep: {
headerSubtitle: LocalizationValue;
title: LocalizationValue;
paragraph: LocalizationValue;
serviceProviderFields: {
acsUrl: {
label: LocalizationValue;
};
spEntityId: {
label: LocalizationValue;
};
};
nameIdInstructions: {
step1: LocalizationValue;
step2: LocalizationValue;
};
};
attributeMappingStep: {
headerSubtitle: LocalizationValue;
paragraph: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
attributeMappingTable: {
columns: {
googleAttribute: LocalizationValue;
appAttribute: LocalizationValue;
};
rows: {
email: {
googleAttribute: LocalizationValue;
appAttribute: LocalizationValue;
};
firstName: {
googleAttribute: LocalizationValue;
appAttribute: LocalizationValue;
};
lastName: {
googleAttribute: LocalizationValue;
appAttribute: LocalizationValue;
};
};
};
};
configureUserAccess: {
headerSubtitle: LocalizationValue;
assignUsersInstructions: {
paragraph1: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
step3: LocalizationValue;
paragraph2: LocalizationValue;
};
};
};
samlMicrosoft: {
mainHeaderTitle: LocalizationValue;
createAppStep: {
headerSubtitle: LocalizationValue;
createAppInstructions: {
title: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
step3: LocalizationValue;
step4: {
label: LocalizationValue;
subSteps: {
appName: LocalizationValue;
nonGallery: LocalizationValue;
create: LocalizationValue;
};
};
};
assignUsersInstructions: {
title: LocalizationValue;
- paragraph1: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
step3: LocalizationValue;
step4: LocalizationValue;
step5: LocalizationValue;
- step6: LocalizationValue;
};
};
serviceProviderStep: {
headerSubtitle: LocalizationValue;
title: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
step3: LocalizationValue;
step4: LocalizationValue;
step5: LocalizationValue;
step6: LocalizationValue;
serviceProviderFields: {
spEntityId: {
label: LocalizationValue;
};
acsUrl: {
label: LocalizationValue;
};
};
};
identityProviderMetadataStep: {
headerSubtitle: LocalizationValue;
modes: {
- title: LocalizationValue;
ariaLabel: LocalizationValue;
metadataUrl: LocalizationValue;
manual: LocalizationValue;
};
metadataUrl: {
label: LocalizationValue;
placeholder: LocalizationValue;
description: LocalizationValue;
};
manual: {
description: LocalizationValue;
signOnUrl: {
label: LocalizationValue;
placeholder: LocalizationValue;
};
issuer: {
label: LocalizationValue;
placeholder: LocalizationValue;
};
signingCertificate: {
label: LocalizationValue;
uploadFile: LocalizationValue;
replaceFile: LocalizationValue;
removeFile: LocalizationValue;
fileUploaded: LocalizationValue;
};
};
};
attributeMappingStep: {
headerSubtitle: LocalizationValue;
title: LocalizationValue;
- paragraph: LocalizationValue;
step1: LocalizationValue;
step2: LocalizationValue;
- step3: LocalizationValue;
attributeMappingTable: {
columns: {
attribute: LocalizationValue;
claimName: LocalizationValue;
value: LocalizationValue;
};
+ copyClaimName: LocalizationValue;+ copyClaimNameCopied: LocalizationValue;
rows: {
email: {
attribute: LocalizationValue;
// ... 182 unchanged lines elided ...

Static analyzer: Breaking change in type alias __internal_LocalizationResource: Type changed: {locale:string;maintenanceMode:import("@clerk/shared").LocalizationValue;roles:{[r:string]:import("@clerk/shared").Loca…{locale:string;maintenanceMode:import("@clerk/shared").LocalizationValue;roles:{[r:string]:import("@clerk/shared").Loca…

🤖 AI review (reclassified as non-breaking) (55%): The before and after snippets are structurally identical except for '1863 lines elided' vs '1862 lines elided', indicating one property was removed or renamed somewhere in the elided body; however, __internal_LocalizationResource is only used as the source type for LocalizationResource which extends DeepPartial<DeepLocalizationWithoutObjects<__internal_LocalizationResource>> — an output/read shape — so consumers only read optional fields derived from it and are not required to construct a full __internal_LocalizationResource value, making any removed property non-breaking for consumers. Without visibility into which specific property changed in the elided lines, confidence is moderate.


@clerk/ui

Current version: 1.19.0
Recommended bump: MINOR → 1.20.0

Subpath ./internal

🟡 Non-breaking Changes (1)

Modified: ElementsConfig
// ... 533 unchanged lines elided ...
configureSSOResetConnectionDialogCancelButton: WithOptions;
configureSSOResetConnectionDialogConfirmationInput: WithOptions;
configureSSOResetConnectionDialogSubmitButton: WithOptions;
+ configureSSOChangeProviderDialog: WithOptions;+ configureSSOChangeProviderDialogCancelButton: WithOptions;+ configureSSOChangeProviderDialogConfirmButton: WithOptions;
configureSSORemoveDomainDialog: WithOptions;
configureSSORemoveDomainDialogCancelButton: WithOptions;
configureSSORemoveDomainDialogSubmitButton: WithOptions;
// ... 10 unchanged lines elided ...

Static analyzer: Breaking change in type alias ElementsConfig: Type changed: {button:import("@clerk/ui").~WithOptions<string>;input:import("@clerk/ui").~WithOptions;checkbox:import("@clerk/ui").~W…{button:import("@clerk/ui").~WithOptions<string>;input:import("@clerk/ui").~WithOptions;checkbox:import("@clerk/ui").~W…

🤖 AI review (reclassified as non-breaking) (85%): The diff adds new keys (configureSSOChangeProviderDialog, configureSSOChangeProviderDialogCancelButton, configureSSOChangeProviderDialogConfirmButton) to ElementsConfig; ElementsConfig is only used as the source for the output type Elements (a mapped type consumers read), so adding new keys to an output object type is non-breaking for existing consumers.


Report generated by Break Check

Last ran on 6838daf.

@LauraBeatris
LauraBeatris requested a review from a teamJune 18, 2026 15:08

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx (1)

202-272: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Critical: Table column headers and cell data are mismatched.

The table header order is attributeName (first column), userAttribute (second column), but the cell data order is reversed: the first <Td> renders rows.${row.id}.userAttribute (line 243) and the second <Td> renders rows.${row.id}.attributeName (line 264). This means the column headers do not match the data displayed beneath them, which will confuse users and display incorrect information.

🔧 Proposed fix: Swap the cell localization keys to match header order
 <Td>
<Flex
as='span'
align='center'
sx={theme => ({ gap: theme.space.$2 })}
>
<Text
as='span'
colorScheme='secondary'
- sx={{ fontFamily: 'monospace' }}
localizationKey={localizationKeys(
- `configureSSO.configureStep.samlCustom.attributeMappingStep.attributeMappingTable.rows.${row.id}.userAttribute`,+ `configureSSO.configureStep.samlCustom.attributeMappingStep.attributeMappingTable.rows.${row.id}.attributeName`,
)}
/>
<Badge
...
/>
</Flex>
</Td>
<Td>
<Text
as='span'
+ sx={{ fontFamily: 'monospace' }}
localizationKey={localizationKeys(
- `configureSSO.configureStep.samlCustom.attributeMappingStep.attributeMappingTable.rows.${row.id}.attributeName`,+ `configureSSO.configureStep.samlCustom.attributeMappingStep.attributeMappingTable.rows.${row.id}.userAttribute`,
)}
/>
</Td>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx`
around lines 202 - 272, The CustomAttributeMappingTable component has mismatched
column headers and cell data. The headers are ordered as attributeName (first)
and userAttribute (second), but the first Td element renders userAttribute and
the second Td renders attributeName, which is reversed. Swap the localization
keys in the two Td elements so the first Td renders the attributeName
localization key and the second Td renders the userAttribute localization key to
align with the header order defined in the Thead section.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/localizations/src/en-US.ts`:
- Around line 553-556: Fix the grammatical error in the step2 property of the
Google Workspace SAML setup instructions. The phrase "In Select <bold>Add
app</bold>" reads incorrectly because of the leading "In ". Remove the "In "
prefix from the beginning of the step2 string so it reads "Select <bold>Add
app</bold>, then <bold>Add custom SAML app.</bold>" instead.
In
`@packages/ui/src/components/ConfigureSSO/hooks/useOrganizationEnterpriseConnection.ts`:
- Around line 230-240: The changeProvider function is recreating the enterprise
connection with all organizationDomains instead of preserving the domains from
the current enterpriseConnection, which can silently expand the domain scope
when switching providers. Before deleting the existing enterpriseConnection in
the changeProvider method, capture its current domains list, then pass those
preserved domains to the createEnterpriseConnection call instead of using
organizationDomains map.
---
Outside diff comments:
In
`@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx`:
- Around line 202-272: The CustomAttributeMappingTable component has mismatched
column headers and cell data. The headers are ordered as attributeName (first)
and userAttribute (second), but the first Td element renders userAttribute and
the second Td renders attributeName, which is reversed. Swap the localization
keys in the two Td elements so the first Td renders the attributeName
localization key and the second Td renders the userAttribute localization key to
align with the header order defined in the Thead section.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Pro

Run ID: 2ffef148-c7b7-430d-bd57-464c37edcec5

📥 Commits

Reviewing files that changed from the base of the PR and between e51e22a and 1c7b3ce.

📒 Files selected for processing (21)
  • .changeset/nine-lies-eat.md
  • packages/localizations/src/en-US.ts
  • packages/shared/src/types/localization.ts
  • packages/ui/src/components/ConfigureSSO/ChangeProviderDialog.tsx
  • packages/ui/src/components/ConfigureSSO/ConfigureSSOWizard.tsx
  • packages/ui/src/components/ConfigureSSO/__tests__/ConfigureSSO.navigation.test.tsx
  • packages/ui/src/components/ConfigureSSO/hooks/useOrganizationEnterpriseConnection.ts
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlGoogleConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlMicrosoftConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlOktaConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/__tests__/SamlConfigureSteps.test.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationModes.tsx
  • packages/ui/src/components/ConfigureSSO/steps/SelectProviderStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/TestConfigurationStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/__tests__/SelectProviderStep.test.tsx
  • packages/ui/src/components/ConfigureSSO/types.ts
  • packages/ui/src/components/OrganizationProfile/__tests__/OrganizationSecurityPage.test.tsx
  • packages/ui/src/customizables/elementDescriptors.ts
  • packages/ui/src/internal/appearance.ts
💤 Files with no reviewable changes (1)
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlOktaConfigureSteps.tsx

Comment threadpackages/localizations/src/en-US.ts Outdated

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/ui/src/elements/Alert.tsx`:
- Around line 19-20: The Alert component props interface allows onDismiss to be
provided without a corresponding dismissLabel, which causes the dismiss button
at line 82 to have an undefined aria-label. Refactor the props type definition
to enforce that dismissLabel is required whenever onDismiss is provided. Use
TypeScript type constraints or a discriminated union pattern to ensure the two
props are coupled together, so that either both are provided or neither is
provided, guaranteeing the dismiss button always has an accessible label when
present.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Pro

Run ID: 870ca114-5326-41f0-a5d3-68aab441d52a

📥 Commits

Reviewing files that changed from the base of the PR and between 994314c and 907723e.

📒 Files selected for processing (6)
  • packages/localizations/src/en-US.ts
  • packages/shared/src/types/localization.ts
  • packages/ui/src/components/ConfigureSSO/hooks/useOrganizationEnterpriseConnection.ts
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/ActiveConnectionAlert.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationForm.tsx
  • packages/ui/src/elements/Alert.tsx
🚧 Files skipped from review as they are similar to previous changes (5)
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/ActiveConnectionAlert.tsx
  • packages/ui/src/components/ConfigureSSO/hooks/useOrganizationEnterpriseConnection.ts
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationForm.tsx
  • packages/shared/src/types/localization.ts
  • packages/localizations/src/en-US.ts

Comment threadpackages/ui/src/elements/Alert.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@LauraBeatris@iagodahlem