Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
5 changes: 5 additions & 0 deletions .changeset/clean-taxes-check.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@clerk/clerk-js': minor
---

Update SocialButtons to show "Continue with" prefix for last auth strategy, and improve mobile layout consistency.
40 changes: 23 additions & 17 deletions packages/clerk-js/src/ui/elements/SocialButtons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { distributeStrategiesIntoRows } from './utils';

const SOCIAL_BUTTON_BLOCK_THRESHOLD = 2;
const SOCIAL_BUTTON_PRE_TEXT_THRESHOLD = 1;
const MAX_STRATEGIES_PER_ROW = 6;
const MAX_STRATEGIES_PER_ROW = 5;

export type SocialButtonsProps = React.PropsWithChildren<{
enableOAuthProviders: boolean;
Expand Down Expand Up @@ -100,7 +100,9 @@ export const SocialButtons = React.memo((props: SocialButtonsRootProps) => {
MAX_STRATEGIES_PER_ROW,
lastAuthenticationStrategy,
);
const strategiesCount = lastAuthenticationStrategyPresent ? strategies.length - 1 : strategies.length;
const strategyRowOneLength = strategyRows.at(lastAuthenticationStrategyPresent ? 1 : 0)?.length ?? 0;
const shouldForceSingleColumnOnMobile = !lastAuthenticationStrategyPresent && strategies.length === 2;

const preferBlockButtons =
socialButtonsVariant === 'blockButton'
Expand Down Expand Up @@ -151,34 +153,38 @@ export const SocialButtons = React.memo((props: SocialButtonsRootProps) => {
sx={t => ({
justifyContent: 'center',
[mqu.sm]: {
gridTemplateColumns: 'repeat(1, 1fr)',
// Force single-column on mobile when 2 strategies are present (without last auth) to prevent
// label overflow. When last auth is present, only 1 strategy remains here, so overflow isn't a concern.
gridTemplateColumns: shouldForceSingleColumnOnMobile ? 'repeat(1, minmax(0, 1fr))' : undefined,
},
gridTemplateColumns:
strategies.length < 1
? `repeat(1, 1fr)`
? `repeat(1, minmax(0, 1fr))`
Copy link
Member Author

Choose a reason for hiding this comment

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

minmax usage fixes a bug that prevented truncation from working correctly

BEFORE AFTER
Image Image

: `repeat(${row.length}, ${
rowIndex === 0
? `1fr`
? `minmax(0, 1fr)`
: // Calculate the width of each button based on the width of the buttons within the first row.
// t.sizes.$2 is used here to represent the gap defined on the Grid component.
`calc((100% - (${strategyRowOneLength} - 1) * ${t.sizes.$2}) / ${strategyRowOneLength})`
`minmax(0, calc((100% - (${strategyRowOneLength} - 1) * ${t.sizes.$2}) / ${strategyRowOneLength}))`
})`,
})}
>
{row.map(strategy => {
const label =
strategies.length === SOCIAL_BUTTON_PRE_TEXT_THRESHOLD
? `Continue with ${strategyToDisplayData[strategy].name}`
: strategyToDisplayData[strategy].name;
const shouldShowPreText =
strategiesCount === SOCIAL_BUTTON_PRE_TEXT_THRESHOLD ||
(strategy === lastAuthenticationStrategy && row.length === 1);

const localizedText =
strategies.length === SOCIAL_BUTTON_PRE_TEXT_THRESHOLD
? localizationKeys('socialButtonsBlockButton', {
provider: strategyToDisplayData[strategy].name,
})
: localizationKeys('socialButtonsBlockButtonManyInView', {
provider: strategyToDisplayData[strategy].name,
});
const label = shouldShowPreText
? `Continue with ${strategyToDisplayData[strategy].name}`
: strategyToDisplayData[strategy].name;

const localizedText = shouldShowPreText
? localizationKeys('socialButtonsBlockButton', {
provider: strategyToDisplayData[strategy].name,
})
: localizationKeys('socialButtonsBlockButtonManyInView', {
provider: strategyToDisplayData[strategy].name,
});

const imageOrInitial = strategyToDisplayData[strategy].iconUrl ? (
<Image
Expand Down
Loading