diff --git a/.changeset/sharp-terms-boil.md b/.changeset/sharp-terms-boil.md new file mode 100644 index 00000000000..b6f1405c609 --- /dev/null +++ b/.changeset/sharp-terms-boil.md @@ -0,0 +1,5 @@ +--- +'@clerk/ui': patch +--- + +Add mobile support for `` navbar to display application name, logo and organization name diff --git a/.changeset/snapi-bump-version.md b/.changeset/snapi-bump-version.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/snapi-bump-version.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.github/workflows/api-changes.yml b/.github/workflows/api-changes.yml index 8d838b8ccdf..471f9a7727c 100644 --- a/.github/workflows/api-changes.yml +++ b/.github/workflows/api-changes.yml @@ -30,7 +30,7 @@ concurrency: cancel-in-progress: ${{ github.event_name == 'pull_request' }} env: - SNAPI_PACKAGE: https://pkg.pr.new/clerk/snapi/@clerk/snapi@d42ed8b7857f9254bbb2a6e9ead44d5e7b1aa60c + SNAPI_PACKAGE: https://pkg.pr.new/clerk/snapi/@clerk/snapi@763ad1bb1da1da52fd8525a038405bb6ee1b7347 SNAPI_FILTERS: >- --filter=@clerk/backend --filter=@clerk/clerk-js diff --git a/packages/ui/src/components/ConfigureSSO/ConfigureSSO.tsx b/packages/ui/src/components/ConfigureSSO/ConfigureSSO.tsx index 678f1212793..70095ea44bd 100644 --- a/packages/ui/src/components/ConfigureSSO/ConfigureSSO.tsx +++ b/packages/ui/src/components/ConfigureSSO/ConfigureSSO.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { useProtect } from '@/common'; import { withCoreUserGuard } from '@/contexts'; -import { Col, descriptors, Flex, Flow, Heading, Icon, localizationKeys, Text } from '@/customizables'; +import { Col, Flex, Flow, Heading, Icon, localizationKeys, Text } from '@/customizables'; import { useCardState, withCardStateProvider } from '@/elements/contexts'; import { ProfileCard } from '@/elements/ProfileCard'; import { ExclamationTriangle } from '@/icons'; @@ -43,23 +43,7 @@ const AuthenticatedContent = withCoreUserGuard(() => { sx={t => ({ display: 'grid', gridTemplateColumns: '1fr 3fr', height: t.sizes.$176, overflow: 'hidden' })} > - ({ - backgroundColor: t.colors.$colorBackground, - position: 'relative', - borderRadius: t.radii.$lg, - width: '100%', - overflow: 'hidden', - borderWidth: t.borderWidths.$normal, - borderStyle: t.borderStyles.$solid, - borderColor: t.colors.$borderAlpha150, - flex: 1, - })} - > - - + ); diff --git a/packages/ui/src/components/ConfigureSSO/ConfigureSSONavbar.tsx b/packages/ui/src/components/ConfigureSSO/ConfigureSSONavbar.tsx index e45f1d871b2..28fffea2d2d 100644 --- a/packages/ui/src/components/ConfigureSSO/ConfigureSSONavbar.tsx +++ b/packages/ui/src/components/ConfigureSSO/ConfigureSSONavbar.tsx @@ -1,11 +1,12 @@ -import { useOrganization } from '@clerk/shared/react/index'; +import { __internal_useOrganizationBase } from '@clerk/shared/react/index'; import React from 'react'; import { useEnvironment } from '@/contexts'; -import { Box, Col, Flex, Icon, localizationKeys, Text, useAppearance } from '@/customizables'; +import { Box, Col, descriptors, Flex, Heading, Icon, localizationKeys, Text, useAppearance } from '@/customizables'; import { ApplicationLogo } from '@/elements/ApplicationLogo'; import { NavBar, NavbarContextProvider } from '@/elements/Navbar'; import { BoxIcon } from '@/icons'; +import { mqu } from '@/styledSystem'; type ConfigureSSONavbarProps = React.PropsWithChildren<{ contentRef: React.RefObject; @@ -73,18 +74,118 @@ export const ConfigureSSONavbar = ({ children, contentRef }: ConfigureSSONavbarP > {applicationName} - {organizationSettings.enabled && } + {organizationSettings.enabled && } } /> - {children} + ({ + backgroundColor: t.colors.$colorBackground, + position: 'relative', + borderRadius: t.radii.$lg, + width: '100%', + overflow: 'hidden', + borderWidth: t.borderWidths.$normal, + borderStyle: t.borderStyles.$solid, + borderColor: t.colors.$borderAlpha150, + flex: 1, + })} + > + + {children} + ); }; -const OrganizationSidebarSubtitle = (): JSX.Element | null => { - const { organization } = useOrganization(); +const ConfigureSSOMobileNavbar = () => { + const { parsedOptions } = useAppearance(); + const { + organizationSettings, + displayConfig: { applicationName, logoImageUrl }, + } = useEnvironment(); + + const hasLogo = Boolean(parsedOptions.logoImageUrl || logoImageUrl); + + return ( + ({ + display: 'none', + [mqu.md]: { + display: 'flex', + }, + gap: t.space.$4, + padding: t.space.$5, + borderBottomWidth: t.borderWidths.$normal, + borderBottomStyle: t.borderStyles.$solid, + borderBottomColor: t.colors.$borderAlpha100, + })} + > + ({ + gap: t.space.$2, + maxWidth: '100%', + })} + > + {hasLogo ? ( + ({ + width: t.space.$9, + height: t.space.$9, + borderRadius: t.radii.$md, + overflow: 'hidden', + })} + /> + ) : ( + ({ + width: t.space.$9, + height: t.space.$9, + flexShrink: 0, + borderRadius: t.radii.$md, + backgroundColor: t.colors.$primary500, + color: t.colors.$colorPrimaryForeground, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + })} + aria-hidden + > + ({ width: t.sizes.$4, height: t.sizes.$4 })} + /> + + )} + + + + {applicationName} + + {organizationSettings.enabled && } + + + + ({ fontSize: t.fontSizes.$lg })} + /> + + ); +}; + +const OrganizationSubtitle = (): JSX.Element | null => { + const organization = __internal_useOrganizationBase(); if (!organization) { return null; diff --git a/packages/ui/src/customizables/elementDescriptors.ts b/packages/ui/src/customizables/elementDescriptors.ts index 40600bfd2fd..688e0728bc5 100644 --- a/packages/ui/src/customizables/elementDescriptors.ts +++ b/packages/ui/src/customizables/elementDescriptors.ts @@ -538,6 +538,7 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([ 'enterpriseConnectionButtonText', 'configureSSOHeader', + 'configureSSOMobileNavbar', 'configureSSOStepper', 'configureSSOStepperItem', 'configureSSOStepperItemBullet', diff --git a/packages/ui/src/internal/appearance.ts b/packages/ui/src/internal/appearance.ts index fbdd5e1fefa..daade5167bc 100644 --- a/packages/ui/src/internal/appearance.ts +++ b/packages/ui/src/internal/appearance.ts @@ -674,6 +674,7 @@ export type ElementsConfig = { enterpriseConnectionButtonText: WithOptions; configureSSOHeader: WithOptions; + configureSSOMobileNavbar: WithOptions; configureSSOStepper: WithOptions; configureSSOStepperItem: WithOptions; configureSSOStepperItemBullet: WithOptions;